35 #include <linux/module.h>
37 #include <linux/kernel.h>
40 #include <linux/string.h>
41 #include <linux/errno.h>
42 #include <linux/cdrom.h>
47 #include <linux/slab.h>
48 #include <asm/uaccess.h>
50 #include <scsi/scsi.h>
71 #define SR_CAPABILITIES \
72 (CDC_CLOSE_TRAY|CDC_OPEN_TRAY|CDC_LOCK|CDC_SELECT_SPEED| \
73 CDC_SELECT_DISC|CDC_MULTI_SESSION|CDC_MCN|CDC_MEDIA_CHANGED| \
74 CDC_PLAY_AUDIO|CDC_RESET|CDC_DRIVE_STATUS| \
75 CDC_CD_R|CDC_CD_RW|CDC_DVD|CDC_DVD_R|CDC_DVD_RAM|CDC_GENERIC_PACKET| \
76 CDC_MRW|CDC_MRW_W|CDC_RAM)
79 static int sr_probe(
struct device *);
80 static int sr_remove(
struct device *);
104 static void get_sectorsize(
struct scsi_cd *);
105 static void get_capabilities(
struct scsi_cd *);
108 unsigned int clearing,
int slot);
113 .release = sr_release,
115 .check_events = sr_check_events,
124 .generic_packet = sr_packet,
127 static void sr_kref_release(
struct kref *
kref);
138 static inline struct scsi_cd *scsi_cd_get(
struct gendisk *
disk)
143 if (disk->private_data ==
NULL)
152 kref_put(&cd->
kref, sr_kref_release);
159 static void scsi_cd_put(
struct scsi_cd *cd)
164 kref_put(&cd->
kref, sr_kref_release);
169 static unsigned int sr_get_events(
struct scsi_device *sdev)
187 if (scsi_sense_valid(&sshdr) && sshdr.sense_key ==
UNIT_ATTENTION)
188 return DISK_EVENT_MEDIA_CHANGE;
193 if (eh->nea || eh->notification_class != 0x4)
196 if (med->media_event_code == 1)
197 return DISK_EVENT_EJECT_REQUEST;
198 else if (med->media_event_code == 2)
199 return DISK_EVENT_MEDIA_CHANGE;
211 unsigned int clearing,
int slot)
223 events = sr_get_events(cd->
device);
233 events &= ~DISK_EVENT_MEDIA_CHANGE;
242 if (cd->
device->changed) {
243 events |= DISK_EVENT_MEDIA_CHANGE;
248 if (!(clearing & DISK_EVENT_MEDIA_CHANGE))
261 (scsi_sense_valid(&sshdr) && sshdr.asc != 0x3a);
266 if (cd->
device->changed) {
267 events |= DISK_EVENT_MEDIA_CHANGE;
280 "GET_EVENT and TUR disagree continuously, suppress GET_EVENT events\n");
299 static int sr_done(
struct scsi_cmnd *SCpnt)
301 int result = SCpnt->
result;
302 int this_count = scsi_bufflen(SCpnt);
303 int good_bytes = (result == 0 ? this_count : 0);
304 int block_sectors = 0;
309 printk(
"sr.c done: %x\n", result);
332 bio_sectors(SCpnt->
request->bio);
333 if (block_sectors < 4)
335 if (cd->
device->sector_size == 2048)
337 error_sector &= ~(block_sectors - 1);
338 good_bytes = (error_sector -
339 blk_rq_pos(SCpnt->
request)) << 9;
340 if (good_bytes < 0 || good_bytes >= this_count)
350 if (error_sector < get_capacity(cd->
disk) &&
351 cd->
capacity - error_sector < 4 * 75)
352 set_capacity(cd->
disk, error_sector);
356 good_bytes = this_count;
375 if (rq->cmd_type == REQ_TYPE_BLOCK_PC) {
378 }
else if (rq->cmd_type != REQ_TYPE_FS) {
383 if (ret != BLKPREP_OK)
393 cd->
disk->disk_name, block));
397 blk_rq_sectors(rq)));
402 if (cd->
device->changed) {
414 s_size = cd->
device->sector_size;
419 printk(
"sr: can't switch blocksize: in interrupt\n");
422 if (s_size != 512 && s_size != 1024 && s_size != 2048) {
427 if (rq_data_dir(rq) ==
WRITE) {
428 if (!cd->
device->writeable)
432 cd->
cdi.media_written = 1;
433 }
else if (rq_data_dir(rq) ==
READ) {
448 if (size != scsi_bufflen(SCpnt)) {
450 "mismatch count %d, bytes %d\n",
451 size, scsi_bufflen(SCpnt));
452 if (scsi_bufflen(SCpnt) > size)
453 SCpnt->sdb.length =
size;
460 if (((
unsigned int)blk_rq_pos(rq) % (s_size >> 9)) ||
461 (scsi_bufflen(SCpnt) % s_size)) {
466 this_count = (scsi_bufflen(SCpnt) >> 9) / (s_size >> 9);
471 (rq_data_dir(rq) ==
WRITE) ?
472 "writing" :
"reading",
473 this_count, blk_rq_sectors(rq)));
476 block = (
unsigned int)blk_rq_pos(rq) / (s_size >> 9);
478 if (this_count > 0xffff) {
480 SCpnt->sdb.length = this_count *
s_size;
483 SCpnt->cmnd[2] = (
unsigned char) (block >> 24) & 0xff;
484 SCpnt->cmnd[3] = (
unsigned char) (block >> 16) & 0xff;
485 SCpnt->cmnd[4] = (
unsigned char) (block >> 8) & 0xff;
486 SCpnt->cmnd[5] = (
unsigned char) block & 0xff;
487 SCpnt->cmnd[6] = SCpnt->cmnd[9] = 0;
488 SCpnt->cmnd[7] = (
unsigned char) (this_count >> 8) & 0xff;
489 SCpnt->cmnd[8] = (
unsigned char) this_count & 0xff;
496 SCpnt->transfersize = cd->
device->sector_size;
497 SCpnt->underflow = this_count << 9;
515 cd = scsi_cd_get(bdev->
bd_disk);
525 static int sr_block_release(
struct gendisk *disk,
fmode_t mode)
577 static unsigned int sr_block_check_events(
struct gendisk *disk,
578 unsigned int clearing)
584 static int sr_block_revalidate_disk(
struct gendisk *disk)
598 static const struct block_device_operations sr_bdops =
601 .open = sr_block_open,
602 .release = sr_block_release,
603 .ioctl = sr_block_ioctl,
604 .check_events = sr_block_check_events,
605 .revalidate_disk = sr_block_revalidate_disk,
636 if (cd->
device->sector_size > 2048)
644 struct gendisk *disk;
657 kref_init(&cd->
kref);
663 spin_lock(&sr_index_lock);
666 spin_unlock(&sr_index_lock);
671 spin_unlock(&sr_index_lock);
674 disk->first_minor = minor;
675 sprintf(disk->disk_name,
"sr%d", minor);
676 disk->fops = &sr_bdops;
677 disk->flags = GENHD_FL_CD | GENHD_FL_BLOCK_EVENTS_ON_EXCL_WRITE;
678 disk->events = DISK_EVENT_MEDIA_CHANGE | DISK_EVENT_EJECT_REQUEST;
684 cd->
driver = &sr_template;
693 cd->
cdi.ops = &sr_dops;
696 cd->
cdi.capacity = 1;
702 get_capabilities(cd);
706 disk->driverfs_dev = &sdev->sdev_gendev;
708 disk->private_data = &cd->
driver;
716 disk->flags |= GENHD_FL_REMOVABLE;
720 "Attached scsi CD-ROM %s\n", cd->
cdi.name);
732 static void get_sectorsize(
struct scsi_cd *cd)
734 unsigned char cmd[10];
742 memset((
void *) &cmd[1], 0, 9);
743 memset(buffer, 0,
sizeof(buffer));
747 buffer,
sizeof(buffer),
NULL,
752 }
while (the_result && retries);
761 cd->
capacity = 1 + ((buffer[0] << 24) | (buffer[1] << 16) |
762 (buffer[2] << 8) | buffer[3]);
773 sector_size = (buffer[4] << 24) |
774 (buffer[5] << 16) | (buffer[6] << 8) | buffer[7];
775 switch (sector_size) {
793 printk(
"%s: unsupported sector size %d.\n",
794 cd->
cdi.name, sector_size);
807 queue = cd->
device->request_queue;
813 static void get_capabilities(
struct scsi_cd *cd)
820 static const char *loadmech[] =
847 if (!scsi_status_is_good(rc)) {
855 printk(
"%s: scsi-1 drive\n", cd->
cdi.name);
859 n =
data.header_length +
data.block_descriptor_length;
860 cd->
cdi.speed = ((buffer[n + 8] << 8) + buffer[n + 9]) / 176;
864 printk(
"%s: scsi3-mmc drive: %dx/%dx %s%s%s%s%s%s\n", cd->
cdi.name,
865 ((buffer[n + 14] << 8) + buffer[n + 15]) / 176,
867 buffer[n + 3] & 0x01 ?
"writer " :
"",
868 buffer[n + 3] & 0x20 ?
"dvd-ram " :
"",
869 buffer[n + 2] & 0x02 ?
"cd/rw " :
"",
870 buffer[n + 4] & 0x20 ?
"xa/form2 " :
"",
871 buffer[n + 5] & 0x01 ?
"cdda " :
"",
872 loadmech[buffer[n + 6] >> 5]);
873 if ((buffer[n + 6] >> 5) == 0)
876 if ((buffer[n + 2] & 0x8) == 0)
879 if ((buffer[n + 3] & 0x20) == 0)
882 if ((buffer[n + 3] & 0x10) == 0)
885 if ((buffer[n + 3] & 0x2) == 0)
888 if ((buffer[n + 3] & 0x1) == 0)
891 if ((buffer[n + 6] & 0x8) == 0)
899 if (cd->
cdi.capacity <= 1)
910 cd->
device->writeable = 1;
946 static void sr_kref_release(
struct kref *
kref)
949 struct gendisk *disk = cd->
disk;
951 spin_lock(&sr_index_lock);
953 spin_unlock(&sr_index_lock);
957 disk->private_data =
NULL;
964 static int sr_remove(
struct device *dev)
972 kref_put(&cd->
kref, sr_kref_release);
978 static int __init init_sr(
void)
992 static void __exit exit_sr(
void)