sr.c (afdb094380889222583df9ef803587f6b8a82c8d) sr.c (96eefad2d9e5a0d988cdfee85193b6154c0ae1d2)
1/*
2 * sr.c Copyright (C) 1992 David Giller
3 * Copyright (C) 1993, 1994, 1995, 1999 Eric Youngdale
4 *
5 * adapted from:
6 * sd.c Copyright (C) 1992 Drew Eckhardt
7 * Linux scsi disk driver by
8 * Drew Eckhardt <drew@colorado.edu>

--- 278 unchanged lines hidden (view full) ---

287
288 if (cd->ignore_get_event)
289 return events;
290
291 /* check whether GET_EVENT is reporting spurious MEDIA_CHANGE */
292 if (!cd->tur_changed) {
293 if (cd->get_event_changed) {
294 if (cd->tur_mismatch++ > 8) {
1/*
2 * sr.c Copyright (C) 1992 David Giller
3 * Copyright (C) 1993, 1994, 1995, 1999 Eric Youngdale
4 *
5 * adapted from:
6 * sd.c Copyright (C) 1992 Drew Eckhardt
7 * Linux scsi disk driver by
8 * Drew Eckhardt <drew@colorado.edu>

--- 278 unchanged lines hidden (view full) ---

287
288 if (cd->ignore_get_event)
289 return events;
290
291 /* check whether GET_EVENT is reporting spurious MEDIA_CHANGE */
292 if (!cd->tur_changed) {
293 if (cd->get_event_changed) {
294 if (cd->tur_mismatch++ > 8) {
295 sdev_printk(KERN_WARNING, cd->device,
296 "GET_EVENT and TUR disagree continuously, suppress GET_EVENT events\n");
295 sr_printk(KERN_WARNING, cd,
296 "GET_EVENT and TUR disagree continuously, suppress GET_EVENT events\n");
297 cd->ignore_get_event = true;
298 }
299 } else {
300 cd->tur_mismatch = 0;
301 }
302 }
303 cd->tur_changed = false;
304 cd->get_event_changed = false;

--- 12 unchanged lines hidden (view full) ---

317 int result = SCpnt->result;
318 int this_count = scsi_bufflen(SCpnt);
319 int good_bytes = (result == 0 ? this_count : 0);
320 int block_sectors = 0;
321 long error_sector;
322 struct scsi_cd *cd = scsi_cd(SCpnt->request->rq_disk);
323
324#ifdef DEBUG
297 cd->ignore_get_event = true;
298 }
299 } else {
300 cd->tur_mismatch = 0;
301 }
302 }
303 cd->tur_changed = false;
304 cd->get_event_changed = false;

--- 12 unchanged lines hidden (view full) ---

317 int result = SCpnt->result;
318 int this_count = scsi_bufflen(SCpnt);
319 int good_bytes = (result == 0 ? this_count : 0);
320 int block_sectors = 0;
321 long error_sector;
322 struct scsi_cd *cd = scsi_cd(SCpnt->request->rq_disk);
323
324#ifdef DEBUG
325 printk("sr.c done: %x\n", result);
325 scmd_printk(KERN_INFO, SCpnt, "done: %x\n", result);
326#endif
327
328 /*
329 * Handle MEDIUM ERRORs or VOLUME OVERFLOWs that indicate partial
330 * success. Since this is a relatively rare error condition, no
331 * care is taken to avoid unnecessary additional work such as
332 * memcpy's that could be avoided.
333 */

--- 59 unchanged lines hidden (view full) ---

393 goto out;
394 SCpnt = rq->special;
395 cd = scsi_cd(rq->rq_disk);
396
397 /* from here on until we're complete, any goto out
398 * is used for a killable error condition */
399 ret = BLKPREP_KILL;
400
326#endif
327
328 /*
329 * Handle MEDIUM ERRORs or VOLUME OVERFLOWs that indicate partial
330 * success. Since this is a relatively rare error condition, no
331 * care is taken to avoid unnecessary additional work such as
332 * memcpy's that could be avoided.
333 */

--- 59 unchanged lines hidden (view full) ---

393 goto out;
394 SCpnt = rq->special;
395 cd = scsi_cd(rq->rq_disk);
396
397 /* from here on until we're complete, any goto out
398 * is used for a killable error condition */
399 ret = BLKPREP_KILL;
400
401 SCSI_LOG_HLQUEUE(1, printk("Doing sr request, dev = %s, block = %d\n",
402 cd->disk->disk_name, block));
401 SCSI_LOG_HLQUEUE(1, scmd_printk(KERN_INFO, SCpnt,
402 "Doing sr request, block = %d\n", block));
403
404 if (!cd->device || !scsi_device_online(cd->device)) {
403
404 if (!cd->device || !scsi_device_online(cd->device)) {
405 SCSI_LOG_HLQUEUE(2, printk("Finishing %u sectors\n",
406 blk_rq_sectors(rq)));
407 SCSI_LOG_HLQUEUE(2, printk("Retry with 0x%p\n", SCpnt));
405 SCSI_LOG_HLQUEUE(2, scmd_printk(KERN_INFO, SCpnt,
406 "Finishing %u sectors\n", blk_rq_sectors(rq)));
407 SCSI_LOG_HLQUEUE(2, scmd_printk(KERN_INFO, SCpnt,
408 "Retry with 0x%p\n", SCpnt));
408 goto out;
409 }
410
411 if (cd->device->changed) {
412 /*
413 * quietly refuse to do anything to a changed disc until the
414 * changed bit has been reset
415 */

--- 4 unchanged lines hidden (view full) ---

420 * we do lazy blocksize switching (when reading XA sectors,
421 * see CDROMREADMODE2 ioctl)
422 */
423 s_size = cd->device->sector_size;
424 if (s_size > 2048) {
425 if (!in_interrupt())
426 sr_set_blocklength(cd, 2048);
427 else
409 goto out;
410 }
411
412 if (cd->device->changed) {
413 /*
414 * quietly refuse to do anything to a changed disc until the
415 * changed bit has been reset
416 */

--- 4 unchanged lines hidden (view full) ---

421 * we do lazy blocksize switching (when reading XA sectors,
422 * see CDROMREADMODE2 ioctl)
423 */
424 s_size = cd->device->sector_size;
425 if (s_size > 2048) {
426 if (!in_interrupt())
427 sr_set_blocklength(cd, 2048);
428 else
428 printk("sr: can't switch blocksize: in interrupt\n");
429 scmd_printk(KERN_INFO, SCpnt,
430 "can't switch blocksize: in interrupt\n");
429 }
430
431 if (s_size != 512 && s_size != 1024 && s_size != 2048) {
432 scmd_printk(KERN_ERR, SCpnt, "bad sector size %d\n", s_size);
433 goto out;
434 }
435
436 if (rq_data_dir(rq) == WRITE) {
437 if (!cd->device->writeable)
438 goto out;
439 SCpnt->cmnd[0] = WRITE_10;
440 SCpnt->sc_data_direction = DMA_TO_DEVICE;
431 }
432
433 if (s_size != 512 && s_size != 1024 && s_size != 2048) {
434 scmd_printk(KERN_ERR, SCpnt, "bad sector size %d\n", s_size);
435 goto out;
436 }
437
438 if (rq_data_dir(rq) == WRITE) {
439 if (!cd->device->writeable)
440 goto out;
441 SCpnt->cmnd[0] = WRITE_10;
442 SCpnt->sc_data_direction = DMA_TO_DEVICE;
441 cd->cdi.media_written = 1;
443 cd->cdi.media_written = 1;
442 } else if (rq_data_dir(rq) == READ) {
443 SCpnt->cmnd[0] = READ_10;
444 SCpnt->sc_data_direction = DMA_FROM_DEVICE;
445 } else {
446 blk_dump_rq_flags(rq, "Unknown sr command");
447 goto out;
448 }
449

--- 20 unchanged lines hidden (view full) ---

470 (scsi_bufflen(SCpnt) % s_size)) {
471 scmd_printk(KERN_NOTICE, SCpnt, "unaligned transfer\n");
472 goto out;
473 }
474
475 this_count = (scsi_bufflen(SCpnt) >> 9) / (s_size >> 9);
476
477
444 } else if (rq_data_dir(rq) == READ) {
445 SCpnt->cmnd[0] = READ_10;
446 SCpnt->sc_data_direction = DMA_FROM_DEVICE;
447 } else {
448 blk_dump_rq_flags(rq, "Unknown sr command");
449 goto out;
450 }
451

--- 20 unchanged lines hidden (view full) ---

472 (scsi_bufflen(SCpnt) % s_size)) {
473 scmd_printk(KERN_NOTICE, SCpnt, "unaligned transfer\n");
474 goto out;
475 }
476
477 this_count = (scsi_bufflen(SCpnt) >> 9) / (s_size >> 9);
478
479
478 SCSI_LOG_HLQUEUE(2, printk("%s : %s %d/%u 512 byte blocks.\n",
479 cd->cdi.name,
480 (rq_data_dir(rq) == WRITE) ?
480 SCSI_LOG_HLQUEUE(2, scmd_printk(KERN_INFO, SCpnt,
481 "%s %d/%u 512 byte blocks.\n",
482 (rq_data_dir(rq) == WRITE) ?
481 "writing" : "reading",
483 "writing" : "reading",
482 this_count, blk_rq_sectors(rq)));
484 this_count, blk_rq_sectors(rq)));
483
484 SCpnt->cmnd[1] = 0;
485 block = (unsigned int)blk_rq_pos(rq) / (s_size >> 9);
486
487 if (this_count > 0xffff) {
488 this_count = 0xffff;
489 SCpnt->sdb.length = this_count * s_size;
490 }

--- 314 unchanged lines hidden (view full) ---

805 sector_size = 2048;
806 /* fall through */
807 case 2048:
808 cd->capacity *= 4;
809 /* fall through */
810 case 512:
811 break;
812 default:
485
486 SCpnt->cmnd[1] = 0;
487 block = (unsigned int)blk_rq_pos(rq) / (s_size >> 9);
488
489 if (this_count > 0xffff) {
490 this_count = 0xffff;
491 SCpnt->sdb.length = this_count * s_size;
492 }

--- 314 unchanged lines hidden (view full) ---

807 sector_size = 2048;
808 /* fall through */
809 case 2048:
810 cd->capacity *= 4;
811 /* fall through */
812 case 512:
813 break;
814 default:
813 printk("%s: unsupported sector size %d.\n",
814 cd->cdi.name, sector_size);
815 sr_printk(KERN_INFO, cd,
816 "unsupported sector size %d.", sector_size);
815 cd->capacity = 0;
816 }
817
818 cd->device->sector_size = sector_size;
819
820 /*
821 * Add this so that we have the ability to correctly gauge
822 * what the device is capable of.

--- 25 unchanged lines hidden (view full) ---

848 "",
849 ""
850 };
851
852
853 /* allocate transfer buffer */
854 buffer = kmalloc(512, GFP_KERNEL | GFP_DMA);
855 if (!buffer) {
817 cd->capacity = 0;
818 }
819
820 cd->device->sector_size = sector_size;
821
822 /*
823 * Add this so that we have the ability to correctly gauge
824 * what the device is capable of.

--- 25 unchanged lines hidden (view full) ---

850 "",
851 ""
852 };
853
854
855 /* allocate transfer buffer */
856 buffer = kmalloc(512, GFP_KERNEL | GFP_DMA);
857 if (!buffer) {
856 printk(KERN_ERR "sr: out of memory.\n");
858 sr_printk(KERN_ERR, cd, "out of memory.\n");
857 return;
858 }
859
860 /* eat unit attentions */
861 scsi_test_unit_ready(cd->device, SR_TIMEOUT, MAX_RETRIES, &sshdr);
862
863 /* ask for mode page 0x2a */
864 rc = scsi_mode_sense(cd->device, 0, 0x2a, buffer, 128,
865 SR_TIMEOUT, 3, &data, NULL);
866
867 if (!scsi_status_is_good(rc)) {
868 /* failed, drive doesn't have capabilities mode page */
869 cd->cdi.speed = 1;
870 cd->cdi.mask |= (CDC_CD_R | CDC_CD_RW | CDC_DVD_R |
871 CDC_DVD | CDC_DVD_RAM |
872 CDC_SELECT_DISC | CDC_SELECT_SPEED |
873 CDC_MRW | CDC_MRW_W | CDC_RAM);
874 kfree(buffer);
859 return;
860 }
861
862 /* eat unit attentions */
863 scsi_test_unit_ready(cd->device, SR_TIMEOUT, MAX_RETRIES, &sshdr);
864
865 /* ask for mode page 0x2a */
866 rc = scsi_mode_sense(cd->device, 0, 0x2a, buffer, 128,
867 SR_TIMEOUT, 3, &data, NULL);
868
869 if (!scsi_status_is_good(rc)) {
870 /* failed, drive doesn't have capabilities mode page */
871 cd->cdi.speed = 1;
872 cd->cdi.mask |= (CDC_CD_R | CDC_CD_RW | CDC_DVD_R |
873 CDC_DVD | CDC_DVD_RAM |
874 CDC_SELECT_DISC | CDC_SELECT_SPEED |
875 CDC_MRW | CDC_MRW_W | CDC_RAM);
876 kfree(buffer);
875 printk("%s: scsi-1 drive\n", cd->cdi.name);
877 sr_printk(KERN_INFO, cd, "scsi-1 drive");
876 return;
877 }
878
879 n = data.header_length + data.block_descriptor_length;
880 cd->cdi.speed = ((buffer[n + 8] << 8) + buffer[n + 9]) / 176;
881 cd->readcd_known = 1;
882 cd->readcd_cdda = buffer[n + 5] & 0x01;
883 /* print some capability bits */
878 return;
879 }
880
881 n = data.header_length + data.block_descriptor_length;
882 cd->cdi.speed = ((buffer[n + 8] << 8) + buffer[n + 9]) / 176;
883 cd->readcd_known = 1;
884 cd->readcd_cdda = buffer[n + 5] & 0x01;
885 /* print some capability bits */
884 printk("%s: scsi3-mmc drive: %dx/%dx %s%s%s%s%s%s\n", cd->cdi.name,
885 ((buffer[n + 14] << 8) + buffer[n + 15]) / 176,
886 cd->cdi.speed,
887 buffer[n + 3] & 0x01 ? "writer " : "", /* CD Writer */
888 buffer[n + 3] & 0x20 ? "dvd-ram " : "",
889 buffer[n + 2] & 0x02 ? "cd/rw " : "", /* can read rewriteable */
890 buffer[n + 4] & 0x20 ? "xa/form2 " : "", /* can read xa/from2 */
891 buffer[n + 5] & 0x01 ? "cdda " : "", /* can read audio data */
892 loadmech[buffer[n + 6] >> 5]);
886 sr_printk(KERN_INFO, cd,
887 "scsi3-mmc drive: %dx/%dx %s%s%s%s%s%s\n",
888 ((buffer[n + 14] << 8) + buffer[n + 15]) / 176,
889 cd->cdi.speed,
890 buffer[n + 3] & 0x01 ? "writer " : "", /* CD Writer */
891 buffer[n + 3] & 0x20 ? "dvd-ram " : "",
892 buffer[n + 2] & 0x02 ? "cd/rw " : "", /* can read rewriteable */
893 buffer[n + 4] & 0x20 ? "xa/form2 " : "", /* can read xa/from2 */
894 buffer[n + 5] & 0x01 ? "cdda " : "", /* can read audio data */
895 loadmech[buffer[n + 6] >> 5]);
893 if ((buffer[n + 6] >> 5) == 0)
894 /* caddy drives can't close tray... */
895 cd->cdi.mask |= CDC_CLOSE_TRAY;
896 if ((buffer[n + 2] & 0x8) == 0)
897 /* not a DVD drive */
898 cd->cdi.mask |= CDC_DVD;
896 if ((buffer[n + 6] >> 5) == 0)
897 /* caddy drives can't close tray... */
898 cd->cdi.mask |= CDC_CLOSE_TRAY;
899 if ((buffer[n + 2] & 0x8) == 0)
900 /* not a DVD drive */
901 cd->cdi.mask |= CDC_DVD;
899 if ((buffer[n + 3] & 0x20) == 0)
902 if ((buffer[n + 3] & 0x20) == 0)
900 /* can't write DVD-RAM media */
901 cd->cdi.mask |= CDC_DVD_RAM;
902 if ((buffer[n + 3] & 0x10) == 0)
903 /* can't write DVD-R media */
904 cd->cdi.mask |= CDC_DVD_R;
905 if ((buffer[n + 3] & 0x2) == 0)
906 /* can't write CD-RW media */
907 cd->cdi.mask |= CDC_CD_RW;

--- 22 unchanged lines hidden (view full) ---

930 cd->device->writeable = 1;
931 }
932
933 kfree(buffer);
934}
935
936/*
937 * sr_packet() is the entry point for the generic commands generated
903 /* can't write DVD-RAM media */
904 cd->cdi.mask |= CDC_DVD_RAM;
905 if ((buffer[n + 3] & 0x10) == 0)
906 /* can't write DVD-R media */
907 cd->cdi.mask |= CDC_DVD_R;
908 if ((buffer[n + 3] & 0x2) == 0)
909 /* can't write CD-RW media */
910 cd->cdi.mask |= CDC_CD_RW;

--- 22 unchanged lines hidden (view full) ---

933 cd->device->writeable = 1;
934 }
935
936 kfree(buffer);
937}
938
939/*
940 * sr_packet() is the entry point for the generic commands generated
938 * by the Uniform CD-ROM layer.
941 * by the Uniform CD-ROM layer.
939 */
940static int sr_packet(struct cdrom_device_info *cdi,
941 struct packet_command *cgc)
942{
943 struct scsi_cd *cd = cdi->handle;
944 struct scsi_device *sdev = cd->device;
945
946 if (cgc->cmd[0] == GPCMD_READ_DISC_INFO && sdev->no_read_disc_info)

--- 75 unchanged lines hidden ---
942 */
943static int sr_packet(struct cdrom_device_info *cdi,
944 struct packet_command *cgc)
945{
946 struct scsi_cd *cd = cdi->handle;
947 struct scsi_device *sdev = cd->device;
948
949 if (cgc->cmd[0] == GPCMD_READ_DISC_INFO && sdev->no_read_disc_info)

--- 75 unchanged lines hidden ---