1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * sr.c Copyright (C) 1992 David Giller
4*4882a593Smuzhiyun * Copyright (C) 1993, 1994, 1995, 1999 Eric Youngdale
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * adapted from:
7*4882a593Smuzhiyun * sd.c Copyright (C) 1992 Drew Eckhardt
8*4882a593Smuzhiyun * Linux scsi disk driver by
9*4882a593Smuzhiyun * Drew Eckhardt <drew@colorado.edu>
10*4882a593Smuzhiyun *
11*4882a593Smuzhiyun * Modified by Eric Youngdale ericy@andante.org to
12*4882a593Smuzhiyun * add scatter-gather, multiple outstanding request, and other
13*4882a593Smuzhiyun * enhancements.
14*4882a593Smuzhiyun *
15*4882a593Smuzhiyun * Modified by Eric Youngdale eric@andante.org to support loadable
16*4882a593Smuzhiyun * low-level scsi drivers.
17*4882a593Smuzhiyun *
18*4882a593Smuzhiyun * Modified by Thomas Quinot thomas@melchior.cuivre.fdn.fr to
19*4882a593Smuzhiyun * provide auto-eject.
20*4882a593Smuzhiyun *
21*4882a593Smuzhiyun * Modified by Gerd Knorr <kraxel@cs.tu-berlin.de> to support the
22*4882a593Smuzhiyun * generic cdrom interface
23*4882a593Smuzhiyun *
24*4882a593Smuzhiyun * Modified by Jens Axboe <axboe@suse.de> - Uniform sr_packet()
25*4882a593Smuzhiyun * interface, capabilities probe additions, ioctl cleanups, etc.
26*4882a593Smuzhiyun *
27*4882a593Smuzhiyun * Modified by Richard Gooch <rgooch@atnf.csiro.au> to support devfs
28*4882a593Smuzhiyun *
29*4882a593Smuzhiyun * Modified by Jens Axboe <axboe@suse.de> - support DVD-RAM
30*4882a593Smuzhiyun * transparently and lose the GHOST hack
31*4882a593Smuzhiyun *
32*4882a593Smuzhiyun * Modified by Arnaldo Carvalho de Melo <acme@conectiva.com.br>
33*4882a593Smuzhiyun * check resource allocation in sr_init and some cleanups
34*4882a593Smuzhiyun */
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun #include <linux/module.h>
37*4882a593Smuzhiyun #include <linux/fs.h>
38*4882a593Smuzhiyun #include <linux/kernel.h>
39*4882a593Smuzhiyun #include <linux/mm.h>
40*4882a593Smuzhiyun #include <linux/bio.h>
41*4882a593Smuzhiyun #include <linux/compat.h>
42*4882a593Smuzhiyun #include <linux/string.h>
43*4882a593Smuzhiyun #include <linux/errno.h>
44*4882a593Smuzhiyun #include <linux/cdrom.h>
45*4882a593Smuzhiyun #include <linux/interrupt.h>
46*4882a593Smuzhiyun #include <linux/init.h>
47*4882a593Smuzhiyun #include <linux/blkdev.h>
48*4882a593Smuzhiyun #include <linux/blk-pm.h>
49*4882a593Smuzhiyun #include <linux/mutex.h>
50*4882a593Smuzhiyun #include <linux/slab.h>
51*4882a593Smuzhiyun #include <linux/pm_runtime.h>
52*4882a593Smuzhiyun #include <linux/uaccess.h>
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun #include <asm/unaligned.h>
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun #include <scsi/scsi.h>
57*4882a593Smuzhiyun #include <scsi/scsi_dbg.h>
58*4882a593Smuzhiyun #include <scsi/scsi_device.h>
59*4882a593Smuzhiyun #include <scsi/scsi_driver.h>
60*4882a593Smuzhiyun #include <scsi/scsi_cmnd.h>
61*4882a593Smuzhiyun #include <scsi/scsi_eh.h>
62*4882a593Smuzhiyun #include <scsi/scsi_host.h>
63*4882a593Smuzhiyun #include <scsi/scsi_ioctl.h> /* For the door lock/unlock commands */
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun #include "scsi_logging.h"
66*4882a593Smuzhiyun #include "sr.h"
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun MODULE_DESCRIPTION("SCSI cdrom (sr) driver");
70*4882a593Smuzhiyun MODULE_LICENSE("GPL");
71*4882a593Smuzhiyun MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_CDROM_MAJOR);
72*4882a593Smuzhiyun MODULE_ALIAS_SCSI_DEVICE(TYPE_ROM);
73*4882a593Smuzhiyun MODULE_ALIAS_SCSI_DEVICE(TYPE_WORM);
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun #define SR_DISKS 256
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun #define SR_CAPABILITIES \
78*4882a593Smuzhiyun (CDC_CLOSE_TRAY|CDC_OPEN_TRAY|CDC_LOCK|CDC_SELECT_SPEED| \
79*4882a593Smuzhiyun CDC_SELECT_DISC|CDC_MULTI_SESSION|CDC_MCN|CDC_MEDIA_CHANGED| \
80*4882a593Smuzhiyun CDC_PLAY_AUDIO|CDC_RESET|CDC_DRIVE_STATUS| \
81*4882a593Smuzhiyun CDC_CD_R|CDC_CD_RW|CDC_DVD|CDC_DVD_R|CDC_DVD_RAM|CDC_GENERIC_PACKET| \
82*4882a593Smuzhiyun CDC_MRW|CDC_MRW_W|CDC_RAM)
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun static int sr_probe(struct device *);
85*4882a593Smuzhiyun static int sr_remove(struct device *);
86*4882a593Smuzhiyun static blk_status_t sr_init_command(struct scsi_cmnd *SCpnt);
87*4882a593Smuzhiyun static int sr_done(struct scsi_cmnd *);
88*4882a593Smuzhiyun static int sr_runtime_suspend(struct device *dev);
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun static const struct dev_pm_ops sr_pm_ops = {
91*4882a593Smuzhiyun .runtime_suspend = sr_runtime_suspend,
92*4882a593Smuzhiyun };
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun static struct scsi_driver sr_template = {
95*4882a593Smuzhiyun .gendrv = {
96*4882a593Smuzhiyun .name = "sr",
97*4882a593Smuzhiyun .owner = THIS_MODULE,
98*4882a593Smuzhiyun .probe = sr_probe,
99*4882a593Smuzhiyun .remove = sr_remove,
100*4882a593Smuzhiyun .pm = &sr_pm_ops,
101*4882a593Smuzhiyun },
102*4882a593Smuzhiyun .init_command = sr_init_command,
103*4882a593Smuzhiyun .done = sr_done,
104*4882a593Smuzhiyun };
105*4882a593Smuzhiyun
106*4882a593Smuzhiyun static unsigned long sr_index_bits[SR_DISKS / BITS_PER_LONG];
107*4882a593Smuzhiyun static DEFINE_SPINLOCK(sr_index_lock);
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun /* This semaphore is used to mediate the 0->1 reference get in the
110*4882a593Smuzhiyun * face of object destruction (i.e. we can't allow a get on an
111*4882a593Smuzhiyun * object after last put) */
112*4882a593Smuzhiyun static DEFINE_MUTEX(sr_ref_mutex);
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun static int sr_open(struct cdrom_device_info *, int);
115*4882a593Smuzhiyun static void sr_release(struct cdrom_device_info *);
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun static void get_sectorsize(struct scsi_cd *);
118*4882a593Smuzhiyun static void get_capabilities(struct scsi_cd *);
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun static unsigned int sr_check_events(struct cdrom_device_info *cdi,
121*4882a593Smuzhiyun unsigned int clearing, int slot);
122*4882a593Smuzhiyun static int sr_packet(struct cdrom_device_info *, struct packet_command *);
123*4882a593Smuzhiyun
124*4882a593Smuzhiyun static const struct cdrom_device_ops sr_dops = {
125*4882a593Smuzhiyun .open = sr_open,
126*4882a593Smuzhiyun .release = sr_release,
127*4882a593Smuzhiyun .drive_status = sr_drive_status,
128*4882a593Smuzhiyun .check_events = sr_check_events,
129*4882a593Smuzhiyun .tray_move = sr_tray_move,
130*4882a593Smuzhiyun .lock_door = sr_lock_door,
131*4882a593Smuzhiyun .select_speed = sr_select_speed,
132*4882a593Smuzhiyun .get_last_session = sr_get_last_session,
133*4882a593Smuzhiyun .get_mcn = sr_get_mcn,
134*4882a593Smuzhiyun .reset = sr_reset,
135*4882a593Smuzhiyun .audio_ioctl = sr_audio_ioctl,
136*4882a593Smuzhiyun .capability = SR_CAPABILITIES,
137*4882a593Smuzhiyun .generic_packet = sr_packet,
138*4882a593Smuzhiyun };
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun static void sr_kref_release(struct kref *kref);
141*4882a593Smuzhiyun
scsi_cd(struct gendisk * disk)142*4882a593Smuzhiyun static inline struct scsi_cd *scsi_cd(struct gendisk *disk)
143*4882a593Smuzhiyun {
144*4882a593Smuzhiyun return container_of(disk->private_data, struct scsi_cd, driver);
145*4882a593Smuzhiyun }
146*4882a593Smuzhiyun
sr_runtime_suspend(struct device * dev)147*4882a593Smuzhiyun static int sr_runtime_suspend(struct device *dev)
148*4882a593Smuzhiyun {
149*4882a593Smuzhiyun struct scsi_cd *cd = dev_get_drvdata(dev);
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun if (!cd) /* E.g.: runtime suspend following sr_remove() */
152*4882a593Smuzhiyun return 0;
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun if (cd->media_present)
155*4882a593Smuzhiyun return -EBUSY;
156*4882a593Smuzhiyun else
157*4882a593Smuzhiyun return 0;
158*4882a593Smuzhiyun }
159*4882a593Smuzhiyun
160*4882a593Smuzhiyun /*
161*4882a593Smuzhiyun * The get and put routines for the struct scsi_cd. Note this entity
162*4882a593Smuzhiyun * has a scsi_device pointer and owns a reference to this.
163*4882a593Smuzhiyun */
scsi_cd_get(struct gendisk * disk)164*4882a593Smuzhiyun static inline struct scsi_cd *scsi_cd_get(struct gendisk *disk)
165*4882a593Smuzhiyun {
166*4882a593Smuzhiyun struct scsi_cd *cd = NULL;
167*4882a593Smuzhiyun
168*4882a593Smuzhiyun mutex_lock(&sr_ref_mutex);
169*4882a593Smuzhiyun if (disk->private_data == NULL)
170*4882a593Smuzhiyun goto out;
171*4882a593Smuzhiyun cd = scsi_cd(disk);
172*4882a593Smuzhiyun kref_get(&cd->kref);
173*4882a593Smuzhiyun if (scsi_device_get(cd->device)) {
174*4882a593Smuzhiyun kref_put(&cd->kref, sr_kref_release);
175*4882a593Smuzhiyun cd = NULL;
176*4882a593Smuzhiyun }
177*4882a593Smuzhiyun out:
178*4882a593Smuzhiyun mutex_unlock(&sr_ref_mutex);
179*4882a593Smuzhiyun return cd;
180*4882a593Smuzhiyun }
181*4882a593Smuzhiyun
scsi_cd_put(struct scsi_cd * cd)182*4882a593Smuzhiyun static void scsi_cd_put(struct scsi_cd *cd)
183*4882a593Smuzhiyun {
184*4882a593Smuzhiyun struct scsi_device *sdev = cd->device;
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun mutex_lock(&sr_ref_mutex);
187*4882a593Smuzhiyun kref_put(&cd->kref, sr_kref_release);
188*4882a593Smuzhiyun scsi_device_put(sdev);
189*4882a593Smuzhiyun mutex_unlock(&sr_ref_mutex);
190*4882a593Smuzhiyun }
191*4882a593Smuzhiyun
sr_get_events(struct scsi_device * sdev)192*4882a593Smuzhiyun static unsigned int sr_get_events(struct scsi_device *sdev)
193*4882a593Smuzhiyun {
194*4882a593Smuzhiyun u8 buf[8];
195*4882a593Smuzhiyun u8 cmd[] = { GET_EVENT_STATUS_NOTIFICATION,
196*4882a593Smuzhiyun 1, /* polled */
197*4882a593Smuzhiyun 0, 0, /* reserved */
198*4882a593Smuzhiyun 1 << 4, /* notification class: media */
199*4882a593Smuzhiyun 0, 0, /* reserved */
200*4882a593Smuzhiyun 0, sizeof(buf), /* allocation length */
201*4882a593Smuzhiyun 0, /* control */
202*4882a593Smuzhiyun };
203*4882a593Smuzhiyun struct event_header *eh = (void *)buf;
204*4882a593Smuzhiyun struct media_event_desc *med = (void *)(buf + 4);
205*4882a593Smuzhiyun struct scsi_sense_hdr sshdr;
206*4882a593Smuzhiyun int result;
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun result = scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, buf, sizeof(buf),
209*4882a593Smuzhiyun &sshdr, SR_TIMEOUT, MAX_RETRIES, NULL);
210*4882a593Smuzhiyun if (scsi_sense_valid(&sshdr) && sshdr.sense_key == UNIT_ATTENTION)
211*4882a593Smuzhiyun return DISK_EVENT_MEDIA_CHANGE;
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun if (result || be16_to_cpu(eh->data_len) < sizeof(*med))
214*4882a593Smuzhiyun return 0;
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun if (eh->nea || eh->notification_class != 0x4)
217*4882a593Smuzhiyun return 0;
218*4882a593Smuzhiyun
219*4882a593Smuzhiyun if (med->media_event_code == 1)
220*4882a593Smuzhiyun return DISK_EVENT_EJECT_REQUEST;
221*4882a593Smuzhiyun else if (med->media_event_code == 2)
222*4882a593Smuzhiyun return DISK_EVENT_MEDIA_CHANGE;
223*4882a593Smuzhiyun else if (med->media_event_code == 3)
224*4882a593Smuzhiyun return DISK_EVENT_MEDIA_CHANGE;
225*4882a593Smuzhiyun return 0;
226*4882a593Smuzhiyun }
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun /*
229*4882a593Smuzhiyun * This function checks to see if the media has been changed or eject
230*4882a593Smuzhiyun * button has been pressed. It is possible that we have already
231*4882a593Smuzhiyun * sensed a change, or the drive may have sensed one and not yet
232*4882a593Smuzhiyun * reported it. The past events are accumulated in sdev->changed and
233*4882a593Smuzhiyun * returned together with the current state.
234*4882a593Smuzhiyun */
sr_check_events(struct cdrom_device_info * cdi,unsigned int clearing,int slot)235*4882a593Smuzhiyun static unsigned int sr_check_events(struct cdrom_device_info *cdi,
236*4882a593Smuzhiyun unsigned int clearing, int slot)
237*4882a593Smuzhiyun {
238*4882a593Smuzhiyun struct scsi_cd *cd = cdi->handle;
239*4882a593Smuzhiyun bool last_present;
240*4882a593Smuzhiyun struct scsi_sense_hdr sshdr;
241*4882a593Smuzhiyun unsigned int events;
242*4882a593Smuzhiyun int ret;
243*4882a593Smuzhiyun
244*4882a593Smuzhiyun /* no changer support */
245*4882a593Smuzhiyun if (CDSL_CURRENT != slot)
246*4882a593Smuzhiyun return 0;
247*4882a593Smuzhiyun
248*4882a593Smuzhiyun events = sr_get_events(cd->device);
249*4882a593Smuzhiyun cd->get_event_changed |= events & DISK_EVENT_MEDIA_CHANGE;
250*4882a593Smuzhiyun
251*4882a593Smuzhiyun /*
252*4882a593Smuzhiyun * If earlier GET_EVENT_STATUS_NOTIFICATION and TUR did not agree
253*4882a593Smuzhiyun * for several times in a row. We rely on TUR only for this likely
254*4882a593Smuzhiyun * broken device, to prevent generating incorrect media changed
255*4882a593Smuzhiyun * events for every open().
256*4882a593Smuzhiyun */
257*4882a593Smuzhiyun if (cd->ignore_get_event) {
258*4882a593Smuzhiyun events &= ~DISK_EVENT_MEDIA_CHANGE;
259*4882a593Smuzhiyun goto do_tur;
260*4882a593Smuzhiyun }
261*4882a593Smuzhiyun
262*4882a593Smuzhiyun /*
263*4882a593Smuzhiyun * GET_EVENT_STATUS_NOTIFICATION is enough unless MEDIA_CHANGE
264*4882a593Smuzhiyun * is being cleared. Note that there are devices which hang
265*4882a593Smuzhiyun * if asked to execute TUR repeatedly.
266*4882a593Smuzhiyun */
267*4882a593Smuzhiyun if (cd->device->changed) {
268*4882a593Smuzhiyun events |= DISK_EVENT_MEDIA_CHANGE;
269*4882a593Smuzhiyun cd->device->changed = 0;
270*4882a593Smuzhiyun cd->tur_changed = true;
271*4882a593Smuzhiyun }
272*4882a593Smuzhiyun
273*4882a593Smuzhiyun if (!(clearing & DISK_EVENT_MEDIA_CHANGE))
274*4882a593Smuzhiyun return events;
275*4882a593Smuzhiyun do_tur:
276*4882a593Smuzhiyun /* let's see whether the media is there with TUR */
277*4882a593Smuzhiyun last_present = cd->media_present;
278*4882a593Smuzhiyun ret = scsi_test_unit_ready(cd->device, SR_TIMEOUT, MAX_RETRIES, &sshdr);
279*4882a593Smuzhiyun
280*4882a593Smuzhiyun /*
281*4882a593Smuzhiyun * Media is considered to be present if TUR succeeds or fails with
282*4882a593Smuzhiyun * sense data indicating something other than media-not-present
283*4882a593Smuzhiyun * (ASC 0x3a).
284*4882a593Smuzhiyun */
285*4882a593Smuzhiyun cd->media_present = scsi_status_is_good(ret) ||
286*4882a593Smuzhiyun (scsi_sense_valid(&sshdr) && sshdr.asc != 0x3a);
287*4882a593Smuzhiyun
288*4882a593Smuzhiyun if (last_present != cd->media_present)
289*4882a593Smuzhiyun cd->device->changed = 1;
290*4882a593Smuzhiyun
291*4882a593Smuzhiyun if (cd->device->changed) {
292*4882a593Smuzhiyun events |= DISK_EVENT_MEDIA_CHANGE;
293*4882a593Smuzhiyun cd->device->changed = 0;
294*4882a593Smuzhiyun cd->tur_changed = true;
295*4882a593Smuzhiyun }
296*4882a593Smuzhiyun
297*4882a593Smuzhiyun if (cd->ignore_get_event)
298*4882a593Smuzhiyun return events;
299*4882a593Smuzhiyun
300*4882a593Smuzhiyun /* check whether GET_EVENT is reporting spurious MEDIA_CHANGE */
301*4882a593Smuzhiyun if (!cd->tur_changed) {
302*4882a593Smuzhiyun if (cd->get_event_changed) {
303*4882a593Smuzhiyun if (cd->tur_mismatch++ > 8) {
304*4882a593Smuzhiyun sr_printk(KERN_WARNING, cd,
305*4882a593Smuzhiyun "GET_EVENT and TUR disagree continuously, suppress GET_EVENT events\n");
306*4882a593Smuzhiyun cd->ignore_get_event = true;
307*4882a593Smuzhiyun }
308*4882a593Smuzhiyun } else {
309*4882a593Smuzhiyun cd->tur_mismatch = 0;
310*4882a593Smuzhiyun }
311*4882a593Smuzhiyun }
312*4882a593Smuzhiyun cd->tur_changed = false;
313*4882a593Smuzhiyun cd->get_event_changed = false;
314*4882a593Smuzhiyun
315*4882a593Smuzhiyun return events;
316*4882a593Smuzhiyun }
317*4882a593Smuzhiyun
318*4882a593Smuzhiyun /*
319*4882a593Smuzhiyun * sr_done is the interrupt routine for the device driver.
320*4882a593Smuzhiyun *
321*4882a593Smuzhiyun * It will be notified on the end of a SCSI read / write, and will take one
322*4882a593Smuzhiyun * of several actions based on success or failure.
323*4882a593Smuzhiyun */
sr_done(struct scsi_cmnd * SCpnt)324*4882a593Smuzhiyun static int sr_done(struct scsi_cmnd *SCpnt)
325*4882a593Smuzhiyun {
326*4882a593Smuzhiyun int result = SCpnt->result;
327*4882a593Smuzhiyun int this_count = scsi_bufflen(SCpnt);
328*4882a593Smuzhiyun int good_bytes = (result == 0 ? this_count : 0);
329*4882a593Smuzhiyun int block_sectors = 0;
330*4882a593Smuzhiyun long error_sector;
331*4882a593Smuzhiyun struct scsi_cd *cd = scsi_cd(SCpnt->request->rq_disk);
332*4882a593Smuzhiyun
333*4882a593Smuzhiyun #ifdef DEBUG
334*4882a593Smuzhiyun scmd_printk(KERN_INFO, SCpnt, "done: %x\n", result);
335*4882a593Smuzhiyun #endif
336*4882a593Smuzhiyun
337*4882a593Smuzhiyun /*
338*4882a593Smuzhiyun * Handle MEDIUM ERRORs or VOLUME OVERFLOWs that indicate partial
339*4882a593Smuzhiyun * success. Since this is a relatively rare error condition, no
340*4882a593Smuzhiyun * care is taken to avoid unnecessary additional work such as
341*4882a593Smuzhiyun * memcpy's that could be avoided.
342*4882a593Smuzhiyun */
343*4882a593Smuzhiyun if (driver_byte(result) != 0 && /* An error occurred */
344*4882a593Smuzhiyun (SCpnt->sense_buffer[0] & 0x7f) == 0x70) { /* Sense current */
345*4882a593Smuzhiyun switch (SCpnt->sense_buffer[2]) {
346*4882a593Smuzhiyun case MEDIUM_ERROR:
347*4882a593Smuzhiyun case VOLUME_OVERFLOW:
348*4882a593Smuzhiyun case ILLEGAL_REQUEST:
349*4882a593Smuzhiyun if (!(SCpnt->sense_buffer[0] & 0x90))
350*4882a593Smuzhiyun break;
351*4882a593Smuzhiyun error_sector =
352*4882a593Smuzhiyun get_unaligned_be32(&SCpnt->sense_buffer[3]);
353*4882a593Smuzhiyun if (SCpnt->request->bio != NULL)
354*4882a593Smuzhiyun block_sectors =
355*4882a593Smuzhiyun bio_sectors(SCpnt->request->bio);
356*4882a593Smuzhiyun if (block_sectors < 4)
357*4882a593Smuzhiyun block_sectors = 4;
358*4882a593Smuzhiyun if (cd->device->sector_size == 2048)
359*4882a593Smuzhiyun error_sector <<= 2;
360*4882a593Smuzhiyun error_sector &= ~(block_sectors - 1);
361*4882a593Smuzhiyun good_bytes = (error_sector -
362*4882a593Smuzhiyun blk_rq_pos(SCpnt->request)) << 9;
363*4882a593Smuzhiyun if (good_bytes < 0 || good_bytes >= this_count)
364*4882a593Smuzhiyun good_bytes = 0;
365*4882a593Smuzhiyun /*
366*4882a593Smuzhiyun * The SCSI specification allows for the value
367*4882a593Smuzhiyun * returned by READ CAPACITY to be up to 75 2K
368*4882a593Smuzhiyun * sectors past the last readable block.
369*4882a593Smuzhiyun * Therefore, if we hit a medium error within the
370*4882a593Smuzhiyun * last 75 2K sectors, we decrease the saved size
371*4882a593Smuzhiyun * value.
372*4882a593Smuzhiyun */
373*4882a593Smuzhiyun if (error_sector < get_capacity(cd->disk) &&
374*4882a593Smuzhiyun cd->capacity - error_sector < 4 * 75)
375*4882a593Smuzhiyun set_capacity(cd->disk, error_sector);
376*4882a593Smuzhiyun break;
377*4882a593Smuzhiyun
378*4882a593Smuzhiyun case RECOVERED_ERROR:
379*4882a593Smuzhiyun good_bytes = this_count;
380*4882a593Smuzhiyun break;
381*4882a593Smuzhiyun
382*4882a593Smuzhiyun default:
383*4882a593Smuzhiyun break;
384*4882a593Smuzhiyun }
385*4882a593Smuzhiyun }
386*4882a593Smuzhiyun
387*4882a593Smuzhiyun return good_bytes;
388*4882a593Smuzhiyun }
389*4882a593Smuzhiyun
sr_init_command(struct scsi_cmnd * SCpnt)390*4882a593Smuzhiyun static blk_status_t sr_init_command(struct scsi_cmnd *SCpnt)
391*4882a593Smuzhiyun {
392*4882a593Smuzhiyun int block = 0, this_count, s_size;
393*4882a593Smuzhiyun struct scsi_cd *cd;
394*4882a593Smuzhiyun struct request *rq = SCpnt->request;
395*4882a593Smuzhiyun blk_status_t ret;
396*4882a593Smuzhiyun
397*4882a593Smuzhiyun ret = scsi_alloc_sgtables(SCpnt);
398*4882a593Smuzhiyun if (ret != BLK_STS_OK)
399*4882a593Smuzhiyun return ret;
400*4882a593Smuzhiyun cd = scsi_cd(rq->rq_disk);
401*4882a593Smuzhiyun
402*4882a593Smuzhiyun SCSI_LOG_HLQUEUE(1, scmd_printk(KERN_INFO, SCpnt,
403*4882a593Smuzhiyun "Doing sr request, block = %d\n", block));
404*4882a593Smuzhiyun
405*4882a593Smuzhiyun if (!cd->device || !scsi_device_online(cd->device)) {
406*4882a593Smuzhiyun SCSI_LOG_HLQUEUE(2, scmd_printk(KERN_INFO, SCpnt,
407*4882a593Smuzhiyun "Finishing %u sectors\n", blk_rq_sectors(rq)));
408*4882a593Smuzhiyun SCSI_LOG_HLQUEUE(2, scmd_printk(KERN_INFO, SCpnt,
409*4882a593Smuzhiyun "Retry with 0x%p\n", SCpnt));
410*4882a593Smuzhiyun goto out;
411*4882a593Smuzhiyun }
412*4882a593Smuzhiyun
413*4882a593Smuzhiyun if (cd->device->changed) {
414*4882a593Smuzhiyun /*
415*4882a593Smuzhiyun * quietly refuse to do anything to a changed disc until the
416*4882a593Smuzhiyun * changed bit has been reset
417*4882a593Smuzhiyun */
418*4882a593Smuzhiyun goto out;
419*4882a593Smuzhiyun }
420*4882a593Smuzhiyun
421*4882a593Smuzhiyun /*
422*4882a593Smuzhiyun * we do lazy blocksize switching (when reading XA sectors,
423*4882a593Smuzhiyun * see CDROMREADMODE2 ioctl)
424*4882a593Smuzhiyun */
425*4882a593Smuzhiyun s_size = cd->device->sector_size;
426*4882a593Smuzhiyun if (s_size > 2048) {
427*4882a593Smuzhiyun if (!in_interrupt())
428*4882a593Smuzhiyun sr_set_blocklength(cd, 2048);
429*4882a593Smuzhiyun else
430*4882a593Smuzhiyun scmd_printk(KERN_INFO, SCpnt,
431*4882a593Smuzhiyun "can't switch blocksize: in interrupt\n");
432*4882a593Smuzhiyun }
433*4882a593Smuzhiyun
434*4882a593Smuzhiyun if (s_size != 512 && s_size != 1024 && s_size != 2048) {
435*4882a593Smuzhiyun scmd_printk(KERN_ERR, SCpnt, "bad sector size %d\n", s_size);
436*4882a593Smuzhiyun goto out;
437*4882a593Smuzhiyun }
438*4882a593Smuzhiyun
439*4882a593Smuzhiyun switch (req_op(rq)) {
440*4882a593Smuzhiyun case REQ_OP_WRITE:
441*4882a593Smuzhiyun if (!cd->writeable)
442*4882a593Smuzhiyun goto out;
443*4882a593Smuzhiyun SCpnt->cmnd[0] = WRITE_10;
444*4882a593Smuzhiyun cd->cdi.media_written = 1;
445*4882a593Smuzhiyun break;
446*4882a593Smuzhiyun case REQ_OP_READ:
447*4882a593Smuzhiyun SCpnt->cmnd[0] = READ_10;
448*4882a593Smuzhiyun break;
449*4882a593Smuzhiyun default:
450*4882a593Smuzhiyun blk_dump_rq_flags(rq, "Unknown sr command");
451*4882a593Smuzhiyun goto out;
452*4882a593Smuzhiyun }
453*4882a593Smuzhiyun
454*4882a593Smuzhiyun {
455*4882a593Smuzhiyun struct scatterlist *sg;
456*4882a593Smuzhiyun int i, size = 0, sg_count = scsi_sg_count(SCpnt);
457*4882a593Smuzhiyun
458*4882a593Smuzhiyun scsi_for_each_sg(SCpnt, sg, sg_count, i)
459*4882a593Smuzhiyun size += sg->length;
460*4882a593Smuzhiyun
461*4882a593Smuzhiyun if (size != scsi_bufflen(SCpnt)) {
462*4882a593Smuzhiyun scmd_printk(KERN_ERR, SCpnt,
463*4882a593Smuzhiyun "mismatch count %d, bytes %d\n",
464*4882a593Smuzhiyun size, scsi_bufflen(SCpnt));
465*4882a593Smuzhiyun if (scsi_bufflen(SCpnt) > size)
466*4882a593Smuzhiyun SCpnt->sdb.length = size;
467*4882a593Smuzhiyun }
468*4882a593Smuzhiyun }
469*4882a593Smuzhiyun
470*4882a593Smuzhiyun /*
471*4882a593Smuzhiyun * request doesn't start on hw block boundary, add scatter pads
472*4882a593Smuzhiyun */
473*4882a593Smuzhiyun if (((unsigned int)blk_rq_pos(rq) % (s_size >> 9)) ||
474*4882a593Smuzhiyun (scsi_bufflen(SCpnt) % s_size)) {
475*4882a593Smuzhiyun scmd_printk(KERN_NOTICE, SCpnt, "unaligned transfer\n");
476*4882a593Smuzhiyun goto out;
477*4882a593Smuzhiyun }
478*4882a593Smuzhiyun
479*4882a593Smuzhiyun this_count = (scsi_bufflen(SCpnt) >> 9) / (s_size >> 9);
480*4882a593Smuzhiyun
481*4882a593Smuzhiyun
482*4882a593Smuzhiyun SCSI_LOG_HLQUEUE(2, scmd_printk(KERN_INFO, SCpnt,
483*4882a593Smuzhiyun "%s %d/%u 512 byte blocks.\n",
484*4882a593Smuzhiyun (rq_data_dir(rq) == WRITE) ?
485*4882a593Smuzhiyun "writing" : "reading",
486*4882a593Smuzhiyun this_count, blk_rq_sectors(rq)));
487*4882a593Smuzhiyun
488*4882a593Smuzhiyun SCpnt->cmnd[1] = 0;
489*4882a593Smuzhiyun block = (unsigned int)blk_rq_pos(rq) / (s_size >> 9);
490*4882a593Smuzhiyun
491*4882a593Smuzhiyun if (this_count > 0xffff) {
492*4882a593Smuzhiyun this_count = 0xffff;
493*4882a593Smuzhiyun SCpnt->sdb.length = this_count * s_size;
494*4882a593Smuzhiyun }
495*4882a593Smuzhiyun
496*4882a593Smuzhiyun put_unaligned_be32(block, &SCpnt->cmnd[2]);
497*4882a593Smuzhiyun SCpnt->cmnd[6] = SCpnt->cmnd[9] = 0;
498*4882a593Smuzhiyun put_unaligned_be16(this_count, &SCpnt->cmnd[7]);
499*4882a593Smuzhiyun
500*4882a593Smuzhiyun /*
501*4882a593Smuzhiyun * We shouldn't disconnect in the middle of a sector, so with a dumb
502*4882a593Smuzhiyun * host adapter, it's safe to assume that we can at least transfer
503*4882a593Smuzhiyun * this many bytes between each connect / disconnect.
504*4882a593Smuzhiyun */
505*4882a593Smuzhiyun SCpnt->transfersize = cd->device->sector_size;
506*4882a593Smuzhiyun SCpnt->underflow = this_count << 9;
507*4882a593Smuzhiyun SCpnt->allowed = MAX_RETRIES;
508*4882a593Smuzhiyun SCpnt->cmd_len = 10;
509*4882a593Smuzhiyun
510*4882a593Smuzhiyun /*
511*4882a593Smuzhiyun * This indicates that the command is ready from our end to be queued.
512*4882a593Smuzhiyun */
513*4882a593Smuzhiyun return BLK_STS_OK;
514*4882a593Smuzhiyun out:
515*4882a593Smuzhiyun scsi_free_sgtables(SCpnt);
516*4882a593Smuzhiyun return BLK_STS_IOERR;
517*4882a593Smuzhiyun }
518*4882a593Smuzhiyun
sr_revalidate_disk(struct scsi_cd * cd)519*4882a593Smuzhiyun static void sr_revalidate_disk(struct scsi_cd *cd)
520*4882a593Smuzhiyun {
521*4882a593Smuzhiyun struct scsi_sense_hdr sshdr;
522*4882a593Smuzhiyun
523*4882a593Smuzhiyun /* if the unit is not ready, nothing more to do */
524*4882a593Smuzhiyun if (scsi_test_unit_ready(cd->device, SR_TIMEOUT, MAX_RETRIES, &sshdr))
525*4882a593Smuzhiyun return;
526*4882a593Smuzhiyun sr_cd_check(&cd->cdi);
527*4882a593Smuzhiyun get_sectorsize(cd);
528*4882a593Smuzhiyun }
529*4882a593Smuzhiyun
sr_block_open(struct block_device * bdev,fmode_t mode)530*4882a593Smuzhiyun static int sr_block_open(struct block_device *bdev, fmode_t mode)
531*4882a593Smuzhiyun {
532*4882a593Smuzhiyun struct scsi_cd *cd;
533*4882a593Smuzhiyun struct scsi_device *sdev;
534*4882a593Smuzhiyun int ret = -ENXIO;
535*4882a593Smuzhiyun
536*4882a593Smuzhiyun cd = scsi_cd_get(bdev->bd_disk);
537*4882a593Smuzhiyun if (!cd)
538*4882a593Smuzhiyun goto out;
539*4882a593Smuzhiyun
540*4882a593Smuzhiyun sdev = cd->device;
541*4882a593Smuzhiyun scsi_autopm_get_device(sdev);
542*4882a593Smuzhiyun if (bdev_check_media_change(bdev))
543*4882a593Smuzhiyun sr_revalidate_disk(cd);
544*4882a593Smuzhiyun
545*4882a593Smuzhiyun mutex_lock(&cd->lock);
546*4882a593Smuzhiyun ret = cdrom_open(&cd->cdi, bdev, mode);
547*4882a593Smuzhiyun mutex_unlock(&cd->lock);
548*4882a593Smuzhiyun
549*4882a593Smuzhiyun scsi_autopm_put_device(sdev);
550*4882a593Smuzhiyun if (ret)
551*4882a593Smuzhiyun scsi_cd_put(cd);
552*4882a593Smuzhiyun
553*4882a593Smuzhiyun out:
554*4882a593Smuzhiyun return ret;
555*4882a593Smuzhiyun }
556*4882a593Smuzhiyun
sr_block_release(struct gendisk * disk,fmode_t mode)557*4882a593Smuzhiyun static void sr_block_release(struct gendisk *disk, fmode_t mode)
558*4882a593Smuzhiyun {
559*4882a593Smuzhiyun struct scsi_cd *cd = scsi_cd(disk);
560*4882a593Smuzhiyun
561*4882a593Smuzhiyun mutex_lock(&cd->lock);
562*4882a593Smuzhiyun cdrom_release(&cd->cdi, mode);
563*4882a593Smuzhiyun mutex_unlock(&cd->lock);
564*4882a593Smuzhiyun
565*4882a593Smuzhiyun scsi_cd_put(cd);
566*4882a593Smuzhiyun }
567*4882a593Smuzhiyun
sr_block_ioctl(struct block_device * bdev,fmode_t mode,unsigned cmd,unsigned long arg)568*4882a593Smuzhiyun static int sr_block_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd,
569*4882a593Smuzhiyun unsigned long arg)
570*4882a593Smuzhiyun {
571*4882a593Smuzhiyun struct scsi_cd *cd = scsi_cd(bdev->bd_disk);
572*4882a593Smuzhiyun struct scsi_device *sdev = cd->device;
573*4882a593Smuzhiyun void __user *argp = (void __user *)arg;
574*4882a593Smuzhiyun int ret;
575*4882a593Smuzhiyun
576*4882a593Smuzhiyun mutex_lock(&cd->lock);
577*4882a593Smuzhiyun
578*4882a593Smuzhiyun ret = scsi_ioctl_block_when_processing_errors(sdev, cmd,
579*4882a593Smuzhiyun (mode & FMODE_NDELAY) != 0);
580*4882a593Smuzhiyun if (ret)
581*4882a593Smuzhiyun goto out;
582*4882a593Smuzhiyun
583*4882a593Smuzhiyun scsi_autopm_get_device(sdev);
584*4882a593Smuzhiyun
585*4882a593Smuzhiyun /*
586*4882a593Smuzhiyun * Send SCSI addressing ioctls directly to mid level, send other
587*4882a593Smuzhiyun * ioctls to cdrom/block level.
588*4882a593Smuzhiyun */
589*4882a593Smuzhiyun switch (cmd) {
590*4882a593Smuzhiyun case SCSI_IOCTL_GET_IDLUN:
591*4882a593Smuzhiyun case SCSI_IOCTL_GET_BUS_NUMBER:
592*4882a593Smuzhiyun ret = scsi_ioctl(sdev, cmd, argp);
593*4882a593Smuzhiyun goto put;
594*4882a593Smuzhiyun }
595*4882a593Smuzhiyun
596*4882a593Smuzhiyun ret = cdrom_ioctl(&cd->cdi, bdev, mode, cmd, arg);
597*4882a593Smuzhiyun if (ret != -ENOSYS)
598*4882a593Smuzhiyun goto put;
599*4882a593Smuzhiyun
600*4882a593Smuzhiyun ret = scsi_ioctl(sdev, cmd, argp);
601*4882a593Smuzhiyun
602*4882a593Smuzhiyun put:
603*4882a593Smuzhiyun scsi_autopm_put_device(sdev);
604*4882a593Smuzhiyun
605*4882a593Smuzhiyun out:
606*4882a593Smuzhiyun mutex_unlock(&cd->lock);
607*4882a593Smuzhiyun return ret;
608*4882a593Smuzhiyun }
609*4882a593Smuzhiyun
610*4882a593Smuzhiyun #ifdef CONFIG_COMPAT
sr_block_compat_ioctl(struct block_device * bdev,fmode_t mode,unsigned cmd,unsigned long arg)611*4882a593Smuzhiyun static int sr_block_compat_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd,
612*4882a593Smuzhiyun unsigned long arg)
613*4882a593Smuzhiyun {
614*4882a593Smuzhiyun struct scsi_cd *cd = scsi_cd(bdev->bd_disk);
615*4882a593Smuzhiyun struct scsi_device *sdev = cd->device;
616*4882a593Smuzhiyun void __user *argp = compat_ptr(arg);
617*4882a593Smuzhiyun int ret;
618*4882a593Smuzhiyun
619*4882a593Smuzhiyun mutex_lock(&cd->lock);
620*4882a593Smuzhiyun
621*4882a593Smuzhiyun ret = scsi_ioctl_block_when_processing_errors(sdev, cmd,
622*4882a593Smuzhiyun (mode & FMODE_NDELAY) != 0);
623*4882a593Smuzhiyun if (ret)
624*4882a593Smuzhiyun goto out;
625*4882a593Smuzhiyun
626*4882a593Smuzhiyun scsi_autopm_get_device(sdev);
627*4882a593Smuzhiyun
628*4882a593Smuzhiyun /*
629*4882a593Smuzhiyun * Send SCSI addressing ioctls directly to mid level, send other
630*4882a593Smuzhiyun * ioctls to cdrom/block level.
631*4882a593Smuzhiyun */
632*4882a593Smuzhiyun switch (cmd) {
633*4882a593Smuzhiyun case SCSI_IOCTL_GET_IDLUN:
634*4882a593Smuzhiyun case SCSI_IOCTL_GET_BUS_NUMBER:
635*4882a593Smuzhiyun ret = scsi_compat_ioctl(sdev, cmd, argp);
636*4882a593Smuzhiyun goto put;
637*4882a593Smuzhiyun }
638*4882a593Smuzhiyun
639*4882a593Smuzhiyun ret = cdrom_ioctl(&cd->cdi, bdev, mode, cmd, (unsigned long)argp);
640*4882a593Smuzhiyun if (ret != -ENOSYS)
641*4882a593Smuzhiyun goto put;
642*4882a593Smuzhiyun
643*4882a593Smuzhiyun ret = scsi_compat_ioctl(sdev, cmd, argp);
644*4882a593Smuzhiyun
645*4882a593Smuzhiyun put:
646*4882a593Smuzhiyun scsi_autopm_put_device(sdev);
647*4882a593Smuzhiyun
648*4882a593Smuzhiyun out:
649*4882a593Smuzhiyun mutex_unlock(&cd->lock);
650*4882a593Smuzhiyun return ret;
651*4882a593Smuzhiyun
652*4882a593Smuzhiyun }
653*4882a593Smuzhiyun #endif
654*4882a593Smuzhiyun
sr_block_check_events(struct gendisk * disk,unsigned int clearing)655*4882a593Smuzhiyun static unsigned int sr_block_check_events(struct gendisk *disk,
656*4882a593Smuzhiyun unsigned int clearing)
657*4882a593Smuzhiyun {
658*4882a593Smuzhiyun unsigned int ret = 0;
659*4882a593Smuzhiyun struct scsi_cd *cd;
660*4882a593Smuzhiyun
661*4882a593Smuzhiyun cd = scsi_cd_get(disk);
662*4882a593Smuzhiyun if (!cd)
663*4882a593Smuzhiyun return 0;
664*4882a593Smuzhiyun
665*4882a593Smuzhiyun if (!atomic_read(&cd->device->disk_events_disable_depth))
666*4882a593Smuzhiyun ret = cdrom_check_events(&cd->cdi, clearing);
667*4882a593Smuzhiyun
668*4882a593Smuzhiyun scsi_cd_put(cd);
669*4882a593Smuzhiyun return ret;
670*4882a593Smuzhiyun }
671*4882a593Smuzhiyun
672*4882a593Smuzhiyun static const struct block_device_operations sr_bdops =
673*4882a593Smuzhiyun {
674*4882a593Smuzhiyun .owner = THIS_MODULE,
675*4882a593Smuzhiyun .open = sr_block_open,
676*4882a593Smuzhiyun .release = sr_block_release,
677*4882a593Smuzhiyun .ioctl = sr_block_ioctl,
678*4882a593Smuzhiyun #ifdef CONFIG_COMPAT
679*4882a593Smuzhiyun .compat_ioctl = sr_block_compat_ioctl,
680*4882a593Smuzhiyun #endif
681*4882a593Smuzhiyun .check_events = sr_block_check_events,
682*4882a593Smuzhiyun };
683*4882a593Smuzhiyun
sr_open(struct cdrom_device_info * cdi,int purpose)684*4882a593Smuzhiyun static int sr_open(struct cdrom_device_info *cdi, int purpose)
685*4882a593Smuzhiyun {
686*4882a593Smuzhiyun struct scsi_cd *cd = cdi->handle;
687*4882a593Smuzhiyun struct scsi_device *sdev = cd->device;
688*4882a593Smuzhiyun int retval;
689*4882a593Smuzhiyun
690*4882a593Smuzhiyun /*
691*4882a593Smuzhiyun * If the device is in error recovery, wait until it is done.
692*4882a593Smuzhiyun * If the device is offline, then disallow any access to it.
693*4882a593Smuzhiyun */
694*4882a593Smuzhiyun retval = -ENXIO;
695*4882a593Smuzhiyun if (!scsi_block_when_processing_errors(sdev))
696*4882a593Smuzhiyun goto error_out;
697*4882a593Smuzhiyun
698*4882a593Smuzhiyun return 0;
699*4882a593Smuzhiyun
700*4882a593Smuzhiyun error_out:
701*4882a593Smuzhiyun return retval;
702*4882a593Smuzhiyun }
703*4882a593Smuzhiyun
sr_release(struct cdrom_device_info * cdi)704*4882a593Smuzhiyun static void sr_release(struct cdrom_device_info *cdi)
705*4882a593Smuzhiyun {
706*4882a593Smuzhiyun struct scsi_cd *cd = cdi->handle;
707*4882a593Smuzhiyun
708*4882a593Smuzhiyun if (cd->device->sector_size > 2048)
709*4882a593Smuzhiyun sr_set_blocklength(cd, 2048);
710*4882a593Smuzhiyun
711*4882a593Smuzhiyun }
712*4882a593Smuzhiyun
sr_probe(struct device * dev)713*4882a593Smuzhiyun static int sr_probe(struct device *dev)
714*4882a593Smuzhiyun {
715*4882a593Smuzhiyun struct scsi_device *sdev = to_scsi_device(dev);
716*4882a593Smuzhiyun struct gendisk *disk;
717*4882a593Smuzhiyun struct scsi_cd *cd;
718*4882a593Smuzhiyun int minor, error;
719*4882a593Smuzhiyun
720*4882a593Smuzhiyun scsi_autopm_get_device(sdev);
721*4882a593Smuzhiyun error = -ENODEV;
722*4882a593Smuzhiyun if (sdev->type != TYPE_ROM && sdev->type != TYPE_WORM)
723*4882a593Smuzhiyun goto fail;
724*4882a593Smuzhiyun
725*4882a593Smuzhiyun error = -ENOMEM;
726*4882a593Smuzhiyun cd = kzalloc(sizeof(*cd), GFP_KERNEL);
727*4882a593Smuzhiyun if (!cd)
728*4882a593Smuzhiyun goto fail;
729*4882a593Smuzhiyun
730*4882a593Smuzhiyun kref_init(&cd->kref);
731*4882a593Smuzhiyun
732*4882a593Smuzhiyun disk = alloc_disk(1);
733*4882a593Smuzhiyun if (!disk)
734*4882a593Smuzhiyun goto fail_free;
735*4882a593Smuzhiyun mutex_init(&cd->lock);
736*4882a593Smuzhiyun
737*4882a593Smuzhiyun spin_lock(&sr_index_lock);
738*4882a593Smuzhiyun minor = find_first_zero_bit(sr_index_bits, SR_DISKS);
739*4882a593Smuzhiyun if (minor == SR_DISKS) {
740*4882a593Smuzhiyun spin_unlock(&sr_index_lock);
741*4882a593Smuzhiyun error = -EBUSY;
742*4882a593Smuzhiyun goto fail_put;
743*4882a593Smuzhiyun }
744*4882a593Smuzhiyun __set_bit(minor, sr_index_bits);
745*4882a593Smuzhiyun spin_unlock(&sr_index_lock);
746*4882a593Smuzhiyun
747*4882a593Smuzhiyun disk->major = SCSI_CDROM_MAJOR;
748*4882a593Smuzhiyun disk->first_minor = minor;
749*4882a593Smuzhiyun sprintf(disk->disk_name, "sr%d", minor);
750*4882a593Smuzhiyun disk->fops = &sr_bdops;
751*4882a593Smuzhiyun disk->flags = GENHD_FL_CD | GENHD_FL_BLOCK_EVENTS_ON_EXCL_WRITE;
752*4882a593Smuzhiyun disk->events = DISK_EVENT_MEDIA_CHANGE | DISK_EVENT_EJECT_REQUEST;
753*4882a593Smuzhiyun disk->event_flags = DISK_EVENT_FLAG_POLL | DISK_EVENT_FLAG_UEVENT;
754*4882a593Smuzhiyun
755*4882a593Smuzhiyun blk_queue_rq_timeout(sdev->request_queue, SR_TIMEOUT);
756*4882a593Smuzhiyun
757*4882a593Smuzhiyun cd->device = sdev;
758*4882a593Smuzhiyun cd->disk = disk;
759*4882a593Smuzhiyun cd->driver = &sr_template;
760*4882a593Smuzhiyun cd->disk = disk;
761*4882a593Smuzhiyun cd->capacity = 0x1fffff;
762*4882a593Smuzhiyun cd->device->changed = 1; /* force recheck CD type */
763*4882a593Smuzhiyun cd->media_present = 1;
764*4882a593Smuzhiyun cd->use = 1;
765*4882a593Smuzhiyun cd->readcd_known = 0;
766*4882a593Smuzhiyun cd->readcd_cdda = 0;
767*4882a593Smuzhiyun
768*4882a593Smuzhiyun cd->cdi.ops = &sr_dops;
769*4882a593Smuzhiyun cd->cdi.handle = cd;
770*4882a593Smuzhiyun cd->cdi.mask = 0;
771*4882a593Smuzhiyun cd->cdi.capacity = 1;
772*4882a593Smuzhiyun sprintf(cd->cdi.name, "sr%d", minor);
773*4882a593Smuzhiyun
774*4882a593Smuzhiyun sdev->sector_size = 2048; /* A guess, just in case */
775*4882a593Smuzhiyun
776*4882a593Smuzhiyun /* FIXME: need to handle a get_capabilities failure properly ?? */
777*4882a593Smuzhiyun get_capabilities(cd);
778*4882a593Smuzhiyun sr_vendor_init(cd);
779*4882a593Smuzhiyun
780*4882a593Smuzhiyun set_capacity(disk, cd->capacity);
781*4882a593Smuzhiyun disk->private_data = &cd->driver;
782*4882a593Smuzhiyun disk->queue = sdev->request_queue;
783*4882a593Smuzhiyun
784*4882a593Smuzhiyun if (register_cdrom(disk, &cd->cdi))
785*4882a593Smuzhiyun goto fail_minor;
786*4882a593Smuzhiyun
787*4882a593Smuzhiyun /*
788*4882a593Smuzhiyun * Initialize block layer runtime PM stuffs before the
789*4882a593Smuzhiyun * periodic event checking request gets started in add_disk.
790*4882a593Smuzhiyun */
791*4882a593Smuzhiyun blk_pm_runtime_init(sdev->request_queue, dev);
792*4882a593Smuzhiyun
793*4882a593Smuzhiyun dev_set_drvdata(dev, cd);
794*4882a593Smuzhiyun disk->flags |= GENHD_FL_REMOVABLE;
795*4882a593Smuzhiyun sr_revalidate_disk(cd);
796*4882a593Smuzhiyun device_add_disk(&sdev->sdev_gendev, disk, NULL);
797*4882a593Smuzhiyun
798*4882a593Smuzhiyun sdev_printk(KERN_DEBUG, sdev,
799*4882a593Smuzhiyun "Attached scsi CD-ROM %s\n", cd->cdi.name);
800*4882a593Smuzhiyun scsi_autopm_put_device(cd->device);
801*4882a593Smuzhiyun
802*4882a593Smuzhiyun return 0;
803*4882a593Smuzhiyun
804*4882a593Smuzhiyun fail_minor:
805*4882a593Smuzhiyun spin_lock(&sr_index_lock);
806*4882a593Smuzhiyun clear_bit(minor, sr_index_bits);
807*4882a593Smuzhiyun spin_unlock(&sr_index_lock);
808*4882a593Smuzhiyun fail_put:
809*4882a593Smuzhiyun put_disk(disk);
810*4882a593Smuzhiyun mutex_destroy(&cd->lock);
811*4882a593Smuzhiyun fail_free:
812*4882a593Smuzhiyun kfree(cd);
813*4882a593Smuzhiyun fail:
814*4882a593Smuzhiyun scsi_autopm_put_device(sdev);
815*4882a593Smuzhiyun return error;
816*4882a593Smuzhiyun }
817*4882a593Smuzhiyun
818*4882a593Smuzhiyun
get_sectorsize(struct scsi_cd * cd)819*4882a593Smuzhiyun static void get_sectorsize(struct scsi_cd *cd)
820*4882a593Smuzhiyun {
821*4882a593Smuzhiyun unsigned char cmd[10];
822*4882a593Smuzhiyun unsigned char buffer[8];
823*4882a593Smuzhiyun int the_result, retries = 3;
824*4882a593Smuzhiyun int sector_size;
825*4882a593Smuzhiyun struct request_queue *queue;
826*4882a593Smuzhiyun
827*4882a593Smuzhiyun do {
828*4882a593Smuzhiyun cmd[0] = READ_CAPACITY;
829*4882a593Smuzhiyun memset((void *) &cmd[1], 0, 9);
830*4882a593Smuzhiyun memset(buffer, 0, sizeof(buffer));
831*4882a593Smuzhiyun
832*4882a593Smuzhiyun /* Do the command and wait.. */
833*4882a593Smuzhiyun the_result = scsi_execute_req(cd->device, cmd, DMA_FROM_DEVICE,
834*4882a593Smuzhiyun buffer, sizeof(buffer), NULL,
835*4882a593Smuzhiyun SR_TIMEOUT, MAX_RETRIES, NULL);
836*4882a593Smuzhiyun
837*4882a593Smuzhiyun retries--;
838*4882a593Smuzhiyun
839*4882a593Smuzhiyun } while (the_result && retries);
840*4882a593Smuzhiyun
841*4882a593Smuzhiyun
842*4882a593Smuzhiyun if (the_result) {
843*4882a593Smuzhiyun cd->capacity = 0x1fffff;
844*4882a593Smuzhiyun sector_size = 2048; /* A guess, just in case */
845*4882a593Smuzhiyun } else {
846*4882a593Smuzhiyun long last_written;
847*4882a593Smuzhiyun
848*4882a593Smuzhiyun cd->capacity = 1 + get_unaligned_be32(&buffer[0]);
849*4882a593Smuzhiyun /*
850*4882a593Smuzhiyun * READ_CAPACITY doesn't return the correct size on
851*4882a593Smuzhiyun * certain UDF media. If last_written is larger, use
852*4882a593Smuzhiyun * it instead.
853*4882a593Smuzhiyun *
854*4882a593Smuzhiyun * http://bugzilla.kernel.org/show_bug.cgi?id=9668
855*4882a593Smuzhiyun */
856*4882a593Smuzhiyun if (!cdrom_get_last_written(&cd->cdi, &last_written))
857*4882a593Smuzhiyun cd->capacity = max_t(long, cd->capacity, last_written);
858*4882a593Smuzhiyun
859*4882a593Smuzhiyun sector_size = get_unaligned_be32(&buffer[4]);
860*4882a593Smuzhiyun switch (sector_size) {
861*4882a593Smuzhiyun /*
862*4882a593Smuzhiyun * HP 4020i CD-Recorder reports 2340 byte sectors
863*4882a593Smuzhiyun * Philips CD-Writers report 2352 byte sectors
864*4882a593Smuzhiyun *
865*4882a593Smuzhiyun * Use 2k sectors for them..
866*4882a593Smuzhiyun */
867*4882a593Smuzhiyun case 0:
868*4882a593Smuzhiyun case 2340:
869*4882a593Smuzhiyun case 2352:
870*4882a593Smuzhiyun sector_size = 2048;
871*4882a593Smuzhiyun fallthrough;
872*4882a593Smuzhiyun case 2048:
873*4882a593Smuzhiyun cd->capacity *= 4;
874*4882a593Smuzhiyun fallthrough;
875*4882a593Smuzhiyun case 512:
876*4882a593Smuzhiyun break;
877*4882a593Smuzhiyun default:
878*4882a593Smuzhiyun sr_printk(KERN_INFO, cd,
879*4882a593Smuzhiyun "unsupported sector size %d.", sector_size);
880*4882a593Smuzhiyun cd->capacity = 0;
881*4882a593Smuzhiyun }
882*4882a593Smuzhiyun
883*4882a593Smuzhiyun cd->device->sector_size = sector_size;
884*4882a593Smuzhiyun
885*4882a593Smuzhiyun /*
886*4882a593Smuzhiyun * Add this so that we have the ability to correctly gauge
887*4882a593Smuzhiyun * what the device is capable of.
888*4882a593Smuzhiyun */
889*4882a593Smuzhiyun set_capacity(cd->disk, cd->capacity);
890*4882a593Smuzhiyun }
891*4882a593Smuzhiyun
892*4882a593Smuzhiyun queue = cd->device->request_queue;
893*4882a593Smuzhiyun blk_queue_logical_block_size(queue, sector_size);
894*4882a593Smuzhiyun
895*4882a593Smuzhiyun return;
896*4882a593Smuzhiyun }
897*4882a593Smuzhiyun
get_capabilities(struct scsi_cd * cd)898*4882a593Smuzhiyun static void get_capabilities(struct scsi_cd *cd)
899*4882a593Smuzhiyun {
900*4882a593Smuzhiyun unsigned char *buffer;
901*4882a593Smuzhiyun struct scsi_mode_data data;
902*4882a593Smuzhiyun struct scsi_sense_hdr sshdr;
903*4882a593Smuzhiyun unsigned int ms_len = 128;
904*4882a593Smuzhiyun int rc, n;
905*4882a593Smuzhiyun
906*4882a593Smuzhiyun static const char *loadmech[] =
907*4882a593Smuzhiyun {
908*4882a593Smuzhiyun "caddy",
909*4882a593Smuzhiyun "tray",
910*4882a593Smuzhiyun "pop-up",
911*4882a593Smuzhiyun "",
912*4882a593Smuzhiyun "changer",
913*4882a593Smuzhiyun "cartridge changer",
914*4882a593Smuzhiyun "",
915*4882a593Smuzhiyun ""
916*4882a593Smuzhiyun };
917*4882a593Smuzhiyun
918*4882a593Smuzhiyun
919*4882a593Smuzhiyun /* allocate transfer buffer */
920*4882a593Smuzhiyun buffer = kmalloc(512, GFP_KERNEL);
921*4882a593Smuzhiyun if (!buffer) {
922*4882a593Smuzhiyun sr_printk(KERN_ERR, cd, "out of memory.\n");
923*4882a593Smuzhiyun return;
924*4882a593Smuzhiyun }
925*4882a593Smuzhiyun
926*4882a593Smuzhiyun /* eat unit attentions */
927*4882a593Smuzhiyun scsi_test_unit_ready(cd->device, SR_TIMEOUT, MAX_RETRIES, &sshdr);
928*4882a593Smuzhiyun
929*4882a593Smuzhiyun /* ask for mode page 0x2a */
930*4882a593Smuzhiyun rc = scsi_mode_sense(cd->device, 0, 0x2a, buffer, ms_len,
931*4882a593Smuzhiyun SR_TIMEOUT, 3, &data, NULL);
932*4882a593Smuzhiyun
933*4882a593Smuzhiyun if (rc < 0 || data.length > ms_len ||
934*4882a593Smuzhiyun data.header_length + data.block_descriptor_length > data.length) {
935*4882a593Smuzhiyun /* failed, drive doesn't have capabilities mode page */
936*4882a593Smuzhiyun cd->cdi.speed = 1;
937*4882a593Smuzhiyun cd->cdi.mask |= (CDC_CD_R | CDC_CD_RW | CDC_DVD_R |
938*4882a593Smuzhiyun CDC_DVD | CDC_DVD_RAM |
939*4882a593Smuzhiyun CDC_SELECT_DISC | CDC_SELECT_SPEED |
940*4882a593Smuzhiyun CDC_MRW | CDC_MRW_W | CDC_RAM);
941*4882a593Smuzhiyun kfree(buffer);
942*4882a593Smuzhiyun sr_printk(KERN_INFO, cd, "scsi-1 drive");
943*4882a593Smuzhiyun return;
944*4882a593Smuzhiyun }
945*4882a593Smuzhiyun
946*4882a593Smuzhiyun n = data.header_length + data.block_descriptor_length;
947*4882a593Smuzhiyun cd->cdi.speed = get_unaligned_be16(&buffer[n + 8]) / 176;
948*4882a593Smuzhiyun cd->readcd_known = 1;
949*4882a593Smuzhiyun cd->readcd_cdda = buffer[n + 5] & 0x01;
950*4882a593Smuzhiyun /* print some capability bits */
951*4882a593Smuzhiyun sr_printk(KERN_INFO, cd,
952*4882a593Smuzhiyun "scsi3-mmc drive: %dx/%dx %s%s%s%s%s%s\n",
953*4882a593Smuzhiyun get_unaligned_be16(&buffer[n + 14]) / 176,
954*4882a593Smuzhiyun cd->cdi.speed,
955*4882a593Smuzhiyun buffer[n + 3] & 0x01 ? "writer " : "", /* CD Writer */
956*4882a593Smuzhiyun buffer[n + 3] & 0x20 ? "dvd-ram " : "",
957*4882a593Smuzhiyun buffer[n + 2] & 0x02 ? "cd/rw " : "", /* can read rewriteable */
958*4882a593Smuzhiyun buffer[n + 4] & 0x20 ? "xa/form2 " : "", /* can read xa/from2 */
959*4882a593Smuzhiyun buffer[n + 5] & 0x01 ? "cdda " : "", /* can read audio data */
960*4882a593Smuzhiyun loadmech[buffer[n + 6] >> 5]);
961*4882a593Smuzhiyun if ((buffer[n + 6] >> 5) == 0)
962*4882a593Smuzhiyun /* caddy drives can't close tray... */
963*4882a593Smuzhiyun cd->cdi.mask |= CDC_CLOSE_TRAY;
964*4882a593Smuzhiyun if ((buffer[n + 2] & 0x8) == 0)
965*4882a593Smuzhiyun /* not a DVD drive */
966*4882a593Smuzhiyun cd->cdi.mask |= CDC_DVD;
967*4882a593Smuzhiyun if ((buffer[n + 3] & 0x20) == 0)
968*4882a593Smuzhiyun /* can't write DVD-RAM media */
969*4882a593Smuzhiyun cd->cdi.mask |= CDC_DVD_RAM;
970*4882a593Smuzhiyun if ((buffer[n + 3] & 0x10) == 0)
971*4882a593Smuzhiyun /* can't write DVD-R media */
972*4882a593Smuzhiyun cd->cdi.mask |= CDC_DVD_R;
973*4882a593Smuzhiyun if ((buffer[n + 3] & 0x2) == 0)
974*4882a593Smuzhiyun /* can't write CD-RW media */
975*4882a593Smuzhiyun cd->cdi.mask |= CDC_CD_RW;
976*4882a593Smuzhiyun if ((buffer[n + 3] & 0x1) == 0)
977*4882a593Smuzhiyun /* can't write CD-R media */
978*4882a593Smuzhiyun cd->cdi.mask |= CDC_CD_R;
979*4882a593Smuzhiyun if ((buffer[n + 6] & 0x8) == 0)
980*4882a593Smuzhiyun /* can't eject */
981*4882a593Smuzhiyun cd->cdi.mask |= CDC_OPEN_TRAY;
982*4882a593Smuzhiyun
983*4882a593Smuzhiyun if ((buffer[n + 6] >> 5) == mechtype_individual_changer ||
984*4882a593Smuzhiyun (buffer[n + 6] >> 5) == mechtype_cartridge_changer)
985*4882a593Smuzhiyun cd->cdi.capacity =
986*4882a593Smuzhiyun cdrom_number_of_slots(&cd->cdi);
987*4882a593Smuzhiyun if (cd->cdi.capacity <= 1)
988*4882a593Smuzhiyun /* not a changer */
989*4882a593Smuzhiyun cd->cdi.mask |= CDC_SELECT_DISC;
990*4882a593Smuzhiyun /*else I don't think it can close its tray
991*4882a593Smuzhiyun cd->cdi.mask |= CDC_CLOSE_TRAY; */
992*4882a593Smuzhiyun
993*4882a593Smuzhiyun /*
994*4882a593Smuzhiyun * if DVD-RAM, MRW-W or CD-RW, we are randomly writable
995*4882a593Smuzhiyun */
996*4882a593Smuzhiyun if ((cd->cdi.mask & (CDC_DVD_RAM | CDC_MRW_W | CDC_RAM | CDC_CD_RW)) !=
997*4882a593Smuzhiyun (CDC_DVD_RAM | CDC_MRW_W | CDC_RAM | CDC_CD_RW)) {
998*4882a593Smuzhiyun cd->writeable = 1;
999*4882a593Smuzhiyun }
1000*4882a593Smuzhiyun
1001*4882a593Smuzhiyun kfree(buffer);
1002*4882a593Smuzhiyun }
1003*4882a593Smuzhiyun
1004*4882a593Smuzhiyun /*
1005*4882a593Smuzhiyun * sr_packet() is the entry point for the generic commands generated
1006*4882a593Smuzhiyun * by the Uniform CD-ROM layer.
1007*4882a593Smuzhiyun */
sr_packet(struct cdrom_device_info * cdi,struct packet_command * cgc)1008*4882a593Smuzhiyun static int sr_packet(struct cdrom_device_info *cdi,
1009*4882a593Smuzhiyun struct packet_command *cgc)
1010*4882a593Smuzhiyun {
1011*4882a593Smuzhiyun struct scsi_cd *cd = cdi->handle;
1012*4882a593Smuzhiyun struct scsi_device *sdev = cd->device;
1013*4882a593Smuzhiyun
1014*4882a593Smuzhiyun if (cgc->cmd[0] == GPCMD_READ_DISC_INFO && sdev->no_read_disc_info)
1015*4882a593Smuzhiyun return -EDRIVE_CANT_DO_THIS;
1016*4882a593Smuzhiyun
1017*4882a593Smuzhiyun if (cgc->timeout <= 0)
1018*4882a593Smuzhiyun cgc->timeout = IOCTL_TIMEOUT;
1019*4882a593Smuzhiyun
1020*4882a593Smuzhiyun sr_do_ioctl(cd, cgc);
1021*4882a593Smuzhiyun
1022*4882a593Smuzhiyun return cgc->stat;
1023*4882a593Smuzhiyun }
1024*4882a593Smuzhiyun
1025*4882a593Smuzhiyun /**
1026*4882a593Smuzhiyun * sr_kref_release - Called to free the scsi_cd structure
1027*4882a593Smuzhiyun * @kref: pointer to embedded kref
1028*4882a593Smuzhiyun *
1029*4882a593Smuzhiyun * sr_ref_mutex must be held entering this routine. Because it is
1030*4882a593Smuzhiyun * called on last put, you should always use the scsi_cd_get()
1031*4882a593Smuzhiyun * scsi_cd_put() helpers which manipulate the semaphore directly
1032*4882a593Smuzhiyun * and never do a direct kref_put().
1033*4882a593Smuzhiyun **/
sr_kref_release(struct kref * kref)1034*4882a593Smuzhiyun static void sr_kref_release(struct kref *kref)
1035*4882a593Smuzhiyun {
1036*4882a593Smuzhiyun struct scsi_cd *cd = container_of(kref, struct scsi_cd, kref);
1037*4882a593Smuzhiyun struct gendisk *disk = cd->disk;
1038*4882a593Smuzhiyun
1039*4882a593Smuzhiyun spin_lock(&sr_index_lock);
1040*4882a593Smuzhiyun clear_bit(MINOR(disk_devt(disk)), sr_index_bits);
1041*4882a593Smuzhiyun spin_unlock(&sr_index_lock);
1042*4882a593Smuzhiyun
1043*4882a593Smuzhiyun unregister_cdrom(&cd->cdi);
1044*4882a593Smuzhiyun
1045*4882a593Smuzhiyun disk->private_data = NULL;
1046*4882a593Smuzhiyun
1047*4882a593Smuzhiyun put_disk(disk);
1048*4882a593Smuzhiyun
1049*4882a593Smuzhiyun mutex_destroy(&cd->lock);
1050*4882a593Smuzhiyun
1051*4882a593Smuzhiyun kfree(cd);
1052*4882a593Smuzhiyun }
1053*4882a593Smuzhiyun
sr_remove(struct device * dev)1054*4882a593Smuzhiyun static int sr_remove(struct device *dev)
1055*4882a593Smuzhiyun {
1056*4882a593Smuzhiyun struct scsi_cd *cd = dev_get_drvdata(dev);
1057*4882a593Smuzhiyun
1058*4882a593Smuzhiyun scsi_autopm_get_device(cd->device);
1059*4882a593Smuzhiyun
1060*4882a593Smuzhiyun del_gendisk(cd->disk);
1061*4882a593Smuzhiyun dev_set_drvdata(dev, NULL);
1062*4882a593Smuzhiyun
1063*4882a593Smuzhiyun mutex_lock(&sr_ref_mutex);
1064*4882a593Smuzhiyun kref_put(&cd->kref, sr_kref_release);
1065*4882a593Smuzhiyun mutex_unlock(&sr_ref_mutex);
1066*4882a593Smuzhiyun
1067*4882a593Smuzhiyun return 0;
1068*4882a593Smuzhiyun }
1069*4882a593Smuzhiyun
init_sr(void)1070*4882a593Smuzhiyun static int __init init_sr(void)
1071*4882a593Smuzhiyun {
1072*4882a593Smuzhiyun int rc;
1073*4882a593Smuzhiyun
1074*4882a593Smuzhiyun rc = register_blkdev(SCSI_CDROM_MAJOR, "sr");
1075*4882a593Smuzhiyun if (rc)
1076*4882a593Smuzhiyun return rc;
1077*4882a593Smuzhiyun rc = scsi_register_driver(&sr_template.gendrv);
1078*4882a593Smuzhiyun if (rc)
1079*4882a593Smuzhiyun unregister_blkdev(SCSI_CDROM_MAJOR, "sr");
1080*4882a593Smuzhiyun
1081*4882a593Smuzhiyun return rc;
1082*4882a593Smuzhiyun }
1083*4882a593Smuzhiyun
exit_sr(void)1084*4882a593Smuzhiyun static void __exit exit_sr(void)
1085*4882a593Smuzhiyun {
1086*4882a593Smuzhiyun scsi_unregister_driver(&sr_template.gendrv);
1087*4882a593Smuzhiyun unregister_blkdev(SCSI_CDROM_MAJOR, "sr");
1088*4882a593Smuzhiyun }
1089*4882a593Smuzhiyun
1090*4882a593Smuzhiyun module_init(init_sr);
1091*4882a593Smuzhiyun module_exit(exit_sr);
1092*4882a593Smuzhiyun MODULE_LICENSE("GPL");
1093