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

Reply via email to