[SCSI] SPI transport class, don't negotiate options not supported
authorJames Bottomley <James.Bottomley@steeleye.com>
Sat, 2 Jul 2005 16:22:01 +0000 (12:22 -0400)
committerJames Bottomley <jejb@titanic.(none)>
Mon, 11 Jul 2005 22:04:43 +0000 (17:04 -0500)
At the moment, the transport class blindly tries to set things like
QAS and IU, even if the drive won't support them.  It's best not to
annoy the devices like this and instead only set what the drive says
is actually supported.

Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
drivers/scsi/scsi_transport_spi.c

index 2918b9600db7af2e2fb0970d518bef6ef32f337b..7670919a087a6e526416419bb0b4035982d136cb 100644 (file)
@@ -795,7 +795,8 @@ spi_dv_device_internal(struct scsi_request *sreq, u8 *buffer)
        }
 
        /* test width */
-       if (i->f->set_width && spi_max_width(starget) && sdev->wdtr) {
+       if (i->f->set_width && spi_max_width(starget) &&
+           scsi_device_wide(sdev)) {
                i->f->set_width(starget, 1);
 
                if (spi_dv_device_compare_inquiry(sreq, buffer,
@@ -811,14 +812,14 @@ spi_dv_device_internal(struct scsi_request *sreq, u8 *buffer)
                return;
 
        /* device can't handle synchronous */
-       if (!sdev->ppr && !sdev->sdtr)
+       if (!scsi_device_sync(sdev) && !scsi_device_dt(sdev))
                return;
 
        /* see if the device has an echo buffer.  If it does we can
         * do the SPI pattern write tests */
 
        len = 0;
-       if (sdev->ppr)
+       if (scsi_device_dt(sdev))
                len = spi_dv_device_get_echo_buffer(sreq, buffer);
 
  retry:
@@ -828,9 +829,11 @@ spi_dv_device_internal(struct scsi_request *sreq, u8 *buffer)
        DV_SET(period, spi_min_period(starget));
        /* try QAS requests; this should be harmless to set if the
         * target supports it */
-       DV_SET(qas, 1);
+       if (scsi_device_qas(sdev))
+               DV_SET(qas, 1);
        /* Also try IU transfers */
-       DV_SET(iu, 1);
+       if (scsi_device_ius(sdev))
+               DV_SET(iu, 1);
        if (spi_min_period(starget) < 9) {
                /* This u320 (or u640). Ignore the coupled parameters
                 * like DT and IU, but set the optional ones */