On Mon, Apr 29, 2002 at 11:47:12AM -0700, Haefliger, Juerg wrote:
> I tried to implement Matt's suggestions but I'm having problems.
> When an invalid logical unit is selected, i.e., there is no memory card
> in that particular slot, the driver terminates any command except
> REQUEST SENSE with CHECK CONDITION and returns NOT READY / MEDIUM NOT
> PRESENT in response to a REQUEST SENSE command. The kernel however
> doesn't seem to understand this and keeps trying to read the capacity of
> the 'non-present' logical unit, so I must do something wrong (see kernel
> output below).
> kernel: usb-storage: Command READ_CAPACITY (10 bytes)
> kernel: usb-storage: 25 20 00 00 00 00 00 00 00 00 01 00
> kernel: usb-storage: ipaq_transport: READ_CAPACITY -> lun = 1
> kernel: usb-storage: -- unexpectedly short transfer
> kernel: usb-storage: Issuing auto-REQUEST_SENSE
> kernel: usb-storage: ipaq_transport: REQUEST_SENSE -> lun = 1
> kernel: usb-storage: -- Result from auto-sense is 0
> kernel: usb-storage: -- code: 0xf0, key: 0x2, ASC: 0x3a, ASCQ: 0x0
> kernel: usb-storage: Not Ready: (unknown ASC/ASCQ)
> kernel: usb-storage: scsi cmd done, result=0x2
> kernel: usb-storage: *** thread sleeping.
> kernel: usb-storage: queuecommand() called
> kernel: usb-storage: *** thread awakened.
> ... (thrice READ_CAPACITY) ...
> kernel: sdc : READ CAPACITY failed.
> kernel: sdc : status = 1, message = 00, host = 0, driver = 08
> kernel: Info fld=0x0, Current sd00:00: sense key Not Ready
> kernel: Additional sense indicates Medium not present
> kernel: sdc : block size assumed to be 512 bytes, disk size 1GB.
> kernel: sdc: I/O error: dev 08:20, sector 0
> kernel: I/O error: dev 08:20, sector 0
> kernel: unable to read partition table
This is a reasonable result, I think. I did precisely the same:
if (srb->cmnd[0] == READ_CAPACITY) {
struct nand_flash_dev *cardinfo;
sddr09_get_wp(us, info); /* read WP bit */
cardinfo = sddr09_get_cardinfo(us, info->flags);
if (!cardinfo) {
/* probably no media */
sensekey = 0x02; /* not ready */
sensecode = 0x3a; /* medium not present */
return USB_STOR_TRANSPORT_FAILED;
}
...
and get precisely the same:
-----
kernel: sddr09: could not read card info
last message repeated 2 times
kernel: sdc : READ CAPACITY failed
sdc : status = 1, message = 00, host = 0, driver = 08
Current sd00:00: sense key Not Ready
Additional sense indicates Medium not present
sdc : block size assumed to be 512 bytes, disk size 1GB.
sdc:end_request: I/O error, dev 08:20, sector 0
end_request: I/O error, dev 08:20, sector 0
unable to read partition table
-----
That things happen three times is caused by the code in scsi/sd.c:
retries = 3;
do {
cmd[0] = READ_CAPACITY;
cmd[1] = (rscsi_disks[i].device->scsi_level <= SCSI_2) ?
((rscsi_disks[i].device->lun << 5) & 0xe0) : 0;
memset((void *) &cmd[2], 0, 8);
memset((void *) buffer, 0, 8);
SRpnt->sr_cmd_len = 0;
SRpnt->sr_sense_buffer[0] = 0;
SRpnt->sr_sense_buffer[2] = 0;
SRpnt->sr_data_direction = SCSI_DATA_READ;
scsi_wait_req(SRpnt, (void *) cmd, (void *) buffer,
8, SD_TIMEOUT, MAX_RETRIES);
the_result = SRpnt->sr_result;
retries--;
} while (the_result && retries);
Andries
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel