Re: Q: how to send ATA cmds to USB drive?

Herbert Rosmanith
2006-06-12T10:31:48Z

> int scsi_dispatch_cmd(struct scsi_cmnd *cmd)
> ...
> /*
> * If SCSI-2 or lower, store the LUN value in cmnd.
> */
> if (cmd->device->scsi_level <= SCSI_2) {
> cmd->cmnd[1] = (cmd->cmnd[1] & 0x1f) |
> (cmd->device->lun << 5 & 0xe0);
> }
>
> hm. now what .... ? If scsi-2 requires this, and the device is scsi-2.

actually, the scsi-level reported by the device is *not* 2.

it is set to 2 by "slave_configure" from drivers/usb/storage/scsiglue.c:

static int slave_configure(struct scsi_device *sdev)
{
...
/* Set the SCSI level to at least 2. We'll leave it at 3 if that's
* what is originally reported. We need this to avoid confusing
* the SCSI layer with devices that report 0 or 1, but need 10-byte
* commands (ala ATAPI devices behind certain bridges, or devices
^^^^^^^^^^^^^^^

the CY7C68310 is exactly that.

* which simply have broken INQUIRY data).
...

if (sdev->scsi_level < SCSI_2)
sdev->scsi_level = sdev->sdev_target->scsi_level = SCSI_2;

kind regards,
h.rosmanith