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 --- |