summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Bottomley <James.Bottomley@steeleye.com>2005-07-02 12:22:01 -0400
committerJames Bottomley <jejb@titanic.(none)>2005-07-11 17:04:43 -0500
commiteb1dd68bc897d4e5a5133bfffbd4777a0fe16c4c (patch)
treec09328dade56919dbcd838ed5bc51143a04ce67a
parent2a40342e0e72a2ba89aaa9e6c9a9eceb04741b24 (diff)
[SCSI] SPI transport class, don't negotiate options not supported
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>
-rw-r--r--drivers/scsi/scsi_transport_spi.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/drivers/scsi/scsi_transport_spi.c b/drivers/scsi/scsi_transport_spi.c
index 2918b9600db..7670919a087 100644
--- a/drivers/scsi/scsi_transport_spi.c
+++ b/drivers/scsi/scsi_transport_spi.c
@@ -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 */