GNU Linux-libre 4.19.245-gnu1
[releases.git] / drivers / ide / ide-cd_ioctl.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * cdrom.c IOCTLs handling for ide-cd driver.
4  *
5  * Copyright (C) 1994-1996  Scott Snyder <snyder@fnald0.fnal.gov>
6  * Copyright (C) 1996-1998  Erik Andersen <andersee@debian.org>
7  * Copyright (C) 1998-2000  Jens Axboe <axboe@suse.de>
8  */
9
10 #include <linux/kernel.h>
11 #include <linux/cdrom.h>
12 #include <linux/gfp.h>
13 #include <linux/ide.h>
14 #include <scsi/scsi.h>
15
16 #include "ide-cd.h"
17
18 /****************************************************************************
19  * Other driver requests (open, close, check media change).
20  */
21 int ide_cdrom_open_real(struct cdrom_device_info *cdi, int purpose)
22 {
23         return 0;
24 }
25
26 /*
27  * Close down the device.  Invalidate all cached blocks.
28  */
29 void ide_cdrom_release_real(struct cdrom_device_info *cdi)
30 {
31         ide_drive_t *drive = cdi->handle;
32
33         if (!cdi->use_count)
34                 drive->atapi_flags &= ~IDE_AFLAG_TOC_VALID;
35 }
36
37 /*
38  * add logic to try GET_EVENT command first to check for media and tray
39  * status. this should be supported by newer cd-r/w and all DVD etc
40  * drives
41  */
42 int ide_cdrom_drive_status(struct cdrom_device_info *cdi, int slot_nr)
43 {
44         ide_drive_t *drive = cdi->handle;
45         struct media_event_desc med;
46         struct scsi_sense_hdr sshdr;
47         int stat;
48
49         if (slot_nr != CDSL_CURRENT)
50                 return -EINVAL;
51
52         stat = cdrom_check_status(drive, &sshdr);
53         if (!stat || sshdr.sense_key == UNIT_ATTENTION)
54                 return CDS_DISC_OK;
55
56         if (!cdrom_get_media_event(cdi, &med)) {
57                 if (med.media_present)
58                         return CDS_DISC_OK;
59                 else if (med.door_open)
60                         return CDS_TRAY_OPEN;
61                 else
62                         return CDS_NO_DISC;
63         }
64
65         if (sshdr.sense_key == NOT_READY && sshdr.asc == 0x04
66                         && sshdr.ascq == 0x04)
67                 return CDS_DISC_OK;
68
69         /*
70          * If not using Mt Fuji extended media tray reports,
71          * just return TRAY_OPEN since ATAPI doesn't provide
72          * any other way to detect this...
73          */
74         if (sshdr.sense_key == NOT_READY) {
75                 if (sshdr.asc == 0x3a && sshdr.ascq == 1)
76                         return CDS_NO_DISC;
77                 else
78                         return CDS_TRAY_OPEN;
79         }
80         return CDS_DRIVE_NOT_READY;
81 }
82
83 /*
84  * ide-cd always generates media changed event if media is missing, which
85  * makes it impossible to use for proper event reporting, so disk->events
86  * is cleared to 0 and the following function is used only to trigger
87  * revalidation and never propagated to userland.
88  */
89 unsigned int ide_cdrom_check_events_real(struct cdrom_device_info *cdi,
90                                          unsigned int clearing, int slot_nr)
91 {
92         ide_drive_t *drive = cdi->handle;
93         int retval;
94
95         if (slot_nr == CDSL_CURRENT) {
96                 (void) cdrom_check_status(drive, NULL);
97                 retval = (drive->dev_flags & IDE_DFLAG_MEDIA_CHANGED) ? 1 : 0;
98                 drive->dev_flags &= ~IDE_DFLAG_MEDIA_CHANGED;
99                 return retval ? DISK_EVENT_MEDIA_CHANGE : 0;
100         } else {
101                 return 0;
102         }
103 }
104
105 /* Eject the disk if EJECTFLAG is 0.
106    If EJECTFLAG is 1, try to reload the disk. */
107 static
108 int cdrom_eject(ide_drive_t *drive, int ejectflag)
109 {
110         struct cdrom_info *cd = drive->driver_data;
111         struct cdrom_device_info *cdi = &cd->devinfo;
112         char loej = 0x02;
113         unsigned char cmd[BLK_MAX_CDB];
114
115         if ((drive->atapi_flags & IDE_AFLAG_NO_EJECT) && !ejectflag)
116                 return -EDRIVE_CANT_DO_THIS;
117
118         /* reload fails on some drives, if the tray is locked */
119         if ((drive->atapi_flags & IDE_AFLAG_DOOR_LOCKED) && ejectflag)
120                 return 0;
121
122         /* only tell drive to close tray if open, if it can do that */
123         if (ejectflag && (cdi->mask & CDC_CLOSE_TRAY))
124                 loej = 0;
125
126         memset(cmd, 0, BLK_MAX_CDB);
127
128         cmd[0] = GPCMD_START_STOP_UNIT;
129         cmd[4] = loej | (ejectflag != 0);
130
131         return ide_cd_queue_pc(drive, cmd, 0, NULL, NULL, NULL, 0, 0);
132 }
133
134 /* Lock the door if LOCKFLAG is nonzero; unlock it otherwise. */
135 static
136 int ide_cd_lockdoor(ide_drive_t *drive, int lockflag)
137 {
138         struct scsi_sense_hdr sshdr;
139         int stat;
140
141         /* If the drive cannot lock the door, just pretend. */
142         if ((drive->dev_flags & IDE_DFLAG_DOORLOCKING) == 0) {
143                 stat = 0;
144         } else {
145                 unsigned char cmd[BLK_MAX_CDB];
146
147                 memset(cmd, 0, BLK_MAX_CDB);
148
149                 cmd[0] = GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL;
150                 cmd[4] = lockflag ? 1 : 0;
151
152                 stat = ide_cd_queue_pc(drive, cmd, 0, NULL, NULL,
153                                        &sshdr, 0, 0);
154         }
155
156         /* If we got an illegal field error, the drive
157            probably cannot lock the door. */
158         if (stat != 0 &&
159             sshdr.sense_key == ILLEGAL_REQUEST &&
160             (sshdr.asc == 0x24 || sshdr.asc == 0x20)) {
161                 printk(KERN_ERR "%s: door locking not supported\n",
162                         drive->name);
163                 drive->dev_flags &= ~IDE_DFLAG_DOORLOCKING;
164                 stat = 0;
165         }
166
167         /* no medium, that's alright. */
168         if (stat != 0 && sshdr.sense_key == NOT_READY && sshdr.asc == 0x3a)
169                 stat = 0;
170
171         if (stat == 0) {
172                 if (lockflag)
173                         drive->atapi_flags |= IDE_AFLAG_DOOR_LOCKED;
174                 else
175                         drive->atapi_flags &= ~IDE_AFLAG_DOOR_LOCKED;
176         }
177
178         return stat;
179 }
180
181 int ide_cdrom_tray_move(struct cdrom_device_info *cdi, int position)
182 {
183         ide_drive_t *drive = cdi->handle;
184
185         if (position) {
186                 int stat = ide_cd_lockdoor(drive, 0);
187
188                 if (stat)
189                         return stat;
190         }
191
192         return cdrom_eject(drive, !position);
193 }
194
195 int ide_cdrom_lock_door(struct cdrom_device_info *cdi, int lock)
196 {
197         ide_drive_t *drive = cdi->handle;
198
199         return ide_cd_lockdoor(drive, lock);
200 }
201
202 /*
203  * ATAPI devices are free to select the speed you request or any slower
204  * rate. :-(  Requesting too fast a speed will _not_ produce an error.
205  */
206 int ide_cdrom_select_speed(struct cdrom_device_info *cdi, int speed)
207 {
208         ide_drive_t *drive = cdi->handle;
209         struct cdrom_info *cd = drive->driver_data;
210         u8 buf[ATAPI_CAPABILITIES_PAGE_SIZE];
211         int stat;
212         unsigned char cmd[BLK_MAX_CDB];
213
214         if (speed == 0)
215                 speed = 0xffff; /* set to max */
216         else
217                 speed *= 177;   /* Nx to kbytes/s */
218
219         memset(cmd, 0, BLK_MAX_CDB);
220
221         cmd[0] = GPCMD_SET_SPEED;
222         /* Read Drive speed in kbytes/second MSB/LSB */
223         cmd[2] = (speed >> 8) & 0xff;
224         cmd[3] = speed & 0xff;
225         if ((cdi->mask & (CDC_CD_R | CDC_CD_RW | CDC_DVD_R)) !=
226             (CDC_CD_R | CDC_CD_RW | CDC_DVD_R)) {
227                 /* Write Drive speed in kbytes/second MSB/LSB */
228                 cmd[4] = (speed >> 8) & 0xff;
229                 cmd[5] = speed & 0xff;
230         }
231
232         stat = ide_cd_queue_pc(drive, cmd, 0, NULL, NULL, NULL, 0, 0);
233
234         if (!ide_cdrom_get_capabilities(drive, buf)) {
235                 ide_cdrom_update_speed(drive, buf);
236                 cdi->speed = cd->current_speed;
237         }
238
239         return 0;
240 }
241
242 int ide_cdrom_get_last_session(struct cdrom_device_info *cdi,
243                                struct cdrom_multisession *ms_info)
244 {
245         struct atapi_toc *toc;
246         ide_drive_t *drive = cdi->handle;
247         struct cdrom_info *info = drive->driver_data;
248         int ret;
249
250         if ((drive->atapi_flags & IDE_AFLAG_TOC_VALID) == 0 || !info->toc) {
251                 ret = ide_cd_read_toc(drive);
252                 if (ret)
253                         return ret;
254         }
255
256         toc = info->toc;
257         ms_info->addr.lba = toc->last_session_lba;
258         ms_info->xa_flag = toc->xa_flag;
259
260         return 0;
261 }
262
263 int ide_cdrom_get_mcn(struct cdrom_device_info *cdi,
264                       struct cdrom_mcn *mcn_info)
265 {
266         ide_drive_t *drive = cdi->handle;
267         int stat, mcnlen;
268         char buf[24];
269         unsigned char cmd[BLK_MAX_CDB];
270         unsigned len = sizeof(buf);
271
272         memset(cmd, 0, BLK_MAX_CDB);
273
274         cmd[0] = GPCMD_READ_SUBCHANNEL;
275         cmd[1] = 2;             /* MSF addressing */
276         cmd[2] = 0x40;  /* request subQ data */
277         cmd[3] = 2;             /* format */
278         cmd[8] = len;
279
280         stat = ide_cd_queue_pc(drive, cmd, 0, buf, &len, NULL, 0, 0);
281         if (stat)
282                 return stat;
283
284         mcnlen = sizeof(mcn_info->medium_catalog_number) - 1;
285         memcpy(mcn_info->medium_catalog_number, buf + 9, mcnlen);
286         mcn_info->medium_catalog_number[mcnlen] = '\0';
287
288         return 0;
289 }
290
291 int ide_cdrom_reset(struct cdrom_device_info *cdi)
292 {
293         ide_drive_t *drive = cdi->handle;
294         struct cdrom_info *cd = drive->driver_data;
295         struct request *rq;
296         int ret;
297
298         rq = blk_get_request(drive->queue, REQ_OP_DRV_IN, 0);
299         ide_req(rq)->type = ATA_PRIV_MISC;
300         rq->rq_flags = RQF_QUIET;
301         blk_execute_rq(drive->queue, cd->disk, rq, 0);
302         ret = scsi_req(rq)->result ? -EIO : 0;
303         blk_put_request(rq);
304         /*
305          * A reset will unlock the door. If it was previously locked,
306          * lock it again.
307          */
308         if (drive->atapi_flags & IDE_AFLAG_DOOR_LOCKED)
309                 (void)ide_cd_lockdoor(drive, 1);
310
311         return ret;
312 }
313
314 static int ide_cd_get_toc_entry(ide_drive_t *drive, int track,
315                                 struct atapi_toc_entry **ent)
316 {
317         struct cdrom_info *info = drive->driver_data;
318         struct atapi_toc *toc = info->toc;
319         int ntracks;
320
321         /*
322          * don't serve cached data, if the toc isn't valid
323          */
324         if ((drive->atapi_flags & IDE_AFLAG_TOC_VALID) == 0)
325                 return -EINVAL;
326
327         /* Check validity of requested track number. */
328         ntracks = toc->hdr.last_track - toc->hdr.first_track + 1;
329
330         if (toc->hdr.first_track == CDROM_LEADOUT)
331                 ntracks = 0;
332
333         if (track == CDROM_LEADOUT)
334                 *ent = &toc->ent[ntracks];
335         else if (track < toc->hdr.first_track || track > toc->hdr.last_track)
336                 return -EINVAL;
337         else
338                 *ent = &toc->ent[track - toc->hdr.first_track];
339
340         return 0;
341 }
342
343 static int ide_cd_fake_play_trkind(ide_drive_t *drive, void *arg)
344 {
345         struct cdrom_ti *ti = arg;
346         struct atapi_toc_entry *first_toc, *last_toc;
347         unsigned long lba_start, lba_end;
348         int stat;
349         unsigned char cmd[BLK_MAX_CDB];
350
351         stat = ide_cd_get_toc_entry(drive, ti->cdti_trk0, &first_toc);
352         if (stat)
353                 return stat;
354
355         stat = ide_cd_get_toc_entry(drive, ti->cdti_trk1, &last_toc);
356         if (stat)
357                 return stat;
358
359         if (ti->cdti_trk1 != CDROM_LEADOUT)
360                 ++last_toc;
361         lba_start = first_toc->addr.lba;
362         lba_end   = last_toc->addr.lba;
363
364         if (lba_end <= lba_start)
365                 return -EINVAL;
366
367         memset(cmd, 0, BLK_MAX_CDB);
368
369         cmd[0] = GPCMD_PLAY_AUDIO_MSF;
370         lba_to_msf(lba_start,   &cmd[3], &cmd[4], &cmd[5]);
371         lba_to_msf(lba_end - 1, &cmd[6], &cmd[7], &cmd[8]);
372
373         return ide_cd_queue_pc(drive, cmd, 0, NULL, NULL, NULL, 0, 0);
374 }
375
376 static int ide_cd_read_tochdr(ide_drive_t *drive, void *arg)
377 {
378         struct cdrom_info *cd = drive->driver_data;
379         struct cdrom_tochdr *tochdr = arg;
380         struct atapi_toc *toc;
381         int stat;
382
383         /* Make sure our saved TOC is valid. */
384         stat = ide_cd_read_toc(drive);
385         if (stat)
386                 return stat;
387
388         toc = cd->toc;
389         tochdr->cdth_trk0 = toc->hdr.first_track;
390         tochdr->cdth_trk1 = toc->hdr.last_track;
391
392         return 0;
393 }
394
395 static int ide_cd_read_tocentry(ide_drive_t *drive, void *arg)
396 {
397         struct cdrom_tocentry *tocentry = arg;
398         struct atapi_toc_entry *toce;
399         int stat;
400
401         stat = ide_cd_get_toc_entry(drive, tocentry->cdte_track, &toce);
402         if (stat)
403                 return stat;
404
405         tocentry->cdte_ctrl = toce->control;
406         tocentry->cdte_adr  = toce->adr;
407         if (tocentry->cdte_format == CDROM_MSF) {
408                 lba_to_msf(toce->addr.lba,
409                            &tocentry->cdte_addr.msf.minute,
410                            &tocentry->cdte_addr.msf.second,
411                            &tocentry->cdte_addr.msf.frame);
412         } else
413                 tocentry->cdte_addr.lba = toce->addr.lba;
414
415         return 0;
416 }
417
418 int ide_cdrom_audio_ioctl(struct cdrom_device_info *cdi,
419                           unsigned int cmd, void *arg)
420 {
421         ide_drive_t *drive = cdi->handle;
422
423         switch (cmd) {
424         /*
425          * emulate PLAY_AUDIO_TI command with PLAY_AUDIO_10, since
426          * atapi doesn't support it
427          */
428         case CDROMPLAYTRKIND:
429                 return ide_cd_fake_play_trkind(drive, arg);
430         case CDROMREADTOCHDR:
431                 return ide_cd_read_tochdr(drive, arg);
432         case CDROMREADTOCENTRY:
433                 return ide_cd_read_tocentry(drive, arg);
434         default:
435                 return -EINVAL;
436         }
437 }
438
439 /* the generic packet interface to cdrom.c */
440 int ide_cdrom_packet(struct cdrom_device_info *cdi,
441                             struct packet_command *cgc)
442 {
443         ide_drive_t *drive = cdi->handle;
444         req_flags_t flags = 0;
445         unsigned len = cgc->buflen;
446
447         if (cgc->timeout <= 0)
448                 cgc->timeout = ATAPI_WAIT_PC;
449
450         /* here we queue the commands from the uniform CD-ROM
451            layer. the packet must be complete, as we do not
452            touch it at all. */
453
454         if (cgc->sshdr)
455                 memset(cgc->sshdr, 0, sizeof(*cgc->sshdr));
456
457         if (cgc->quiet)
458                 flags |= RQF_QUIET;
459
460         cgc->stat = ide_cd_queue_pc(drive, cgc->cmd,
461                                     cgc->data_direction == CGC_DATA_WRITE,
462                                     cgc->buffer, &len,
463                                     cgc->sshdr, cgc->timeout, flags);
464         if (!cgc->stat)
465                 cgc->buflen -= len;
466         return cgc->stat;
467 }