Re: aic7xxx regression occuring after 2.6.12 final

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sat, 2005-07-02 at 16:42 +0100, Tony Vroon wrote:
> target0:0:0: asynchronous
>   Vendor: FUJITSU   Model: MAP3367NP         Rev: 0106
>   Type:   Direct-Access                      ANSI SCSI revision: 03
> scsi0:A:0:0: Tagged Queuing enabled.  Depth 32
>  target0:0:0: Beginning Domain Validation
>  target0:0:0: wide asynchronous
> (scsi0:A:0): refuses tagged commands. Performing non-tagged I/O
>  target0:0:0: asynchronous
> [The PC hangs at this point]

Well, my best guess is that this is a double bug.  I think the
aic7xxx_core is processing the reject wrongly and the device is
rejecting a QAS or IU negotiation attempt.

So, see if the attached patch helps.

Thanks,

James

diff --git a/drivers/scsi/scsi_transport_spi.c b/drivers/scsi/scsi_transport_spi.c
--- a/drivers/scsi/scsi_transport_spi.c
+++ b/drivers/scsi/scsi_transport_spi.c
@@ -787,7 +787,8 @@ spi_dv_device_internal(struct scsi_devic
 	}
 
 	/* 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(sdev, buffer,
@@ -803,14 +804,14 @@ spi_dv_device_internal(struct scsi_devic
 		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(sdev, buffer);
 
  retry:
@@ -820,9 +821,11 @@ spi_dv_device_internal(struct scsi_devic
 	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 */


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]
  Powered by Linux