public inbox for linux-scsi@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] scsi_transport_spi: fix domain validation failure from incorrect width setting
@ 2007-09-22 13:40 James Bottomley
  2007-09-24 12:10 ` Stefan Boresch
  0 siblings, 1 reply; 3+ messages in thread
From: James Bottomley @ 2007-09-22 13:40 UTC (permalink / raw)
  To: linux-scsi; +Cc: Stefan Boresch

The previous patch was a bit non-standard because it actually adjusted
the user setting max_width.  This would mean that if the user replaced
the cable and then re-ran domain validation, it still wouldn't try wide
transfers, which is wrong.

The attached patch fixes the problem by physically nailing the wide
setting to what it deduces it should be for the whole of Domain
Validation.

James

diff --git a/drivers/scsi/scsi_transport_spi.c b/drivers/scsi/scsi_transport_spi.c
index 6f56f87..bb8a726 100644
--- a/drivers/scsi/scsi_transport_spi.c
+++ b/drivers/scsi/scsi_transport_spi.c
@@ -787,10 +787,12 @@ spi_dv_device_internal(struct scsi_device *sdev, u8 *buffer)
 	struct scsi_target *starget = sdev->sdev_target;
 	struct Scsi_Host *shost = sdev->host;
 	int len = sdev->inquiry_len;
+	int min_period = spi_min_period(starget);
+	int max_width = spi_max_width(starget);
 	/* first set us up for narrow async */
 	DV_SET(offset, 0);
 	DV_SET(width, 0);
-	
+
 	if (spi_dv_device_compare_inquiry(sdev, buffer, buffer, DV_LOOPS)
 	    != SPI_COMPARE_SUCCESS) {
 		starget_printk(KERN_ERR, starget, "Domain Validation Initial Inquiry Failed\n");
@@ -798,9 +800,13 @@ spi_dv_device_internal(struct scsi_device *sdev, u8 *buffer)
 		return;
 	}
 
+	if (!scsi_device_wide(sdev)) {
+		spi_max_width(starget) = 0;
+		max_width = 0;
+	}
+	
 	/* test width */
-	if (i->f->set_width && spi_max_width(starget) &&
-	    scsi_device_wide(sdev)) {
+	if (i->f->set_width && max_width) {
 		i->f->set_width(starget, 1);
 
 		if (spi_dv_device_compare_inquiry(sdev, buffer,
@@ -809,6 +815,11 @@ spi_dv_device_internal(struct scsi_device *sdev, u8 *buffer)
 		    != SPI_COMPARE_SUCCESS) {
 			starget_printk(KERN_ERR, starget, "Wide Transfers Fail\n");
 			i->f->set_width(starget, 0);
+			/* Make sure we don't force wide back on by asking
+			 * for a transfer period that requires it */
+			max_width = 0;
+			if (min_period < 10)
+				min_period = 10;
 		}
 	}
 
@@ -828,7 +839,8 @@ spi_dv_device_internal(struct scsi_device *sdev, u8 *buffer)
 
 	/* now set up to the maximum */
 	DV_SET(offset, spi_max_offset(starget));
-	DV_SET(period, spi_min_period(starget));
+	DV_SET(period, min_period);
+
 	/* try QAS requests; this should be harmless to set if the
 	 * target supports it */
 	if (scsi_device_qas(sdev)) {
@@ -837,14 +849,14 @@ spi_dv_device_internal(struct scsi_device *sdev, u8 *buffer)
 		DV_SET(qas, 0);
 	}
 
-	if (scsi_device_ius(sdev) && spi_min_period(starget) < 9) {
+	if (scsi_device_ius(sdev) && min_period < 9) {
 		/* This u320 (or u640). Set IU transfers */
 		DV_SET(iu, 1);
 		/* Then set the optional parameters */
 		DV_SET(rd_strm, 1);
 		DV_SET(wr_flow, 1);
 		DV_SET(rti, 1);
-		if (spi_min_period(starget) == 8)
+		if (min_period == 8)
 			DV_SET(pcomp_en, 1);
 	} else {
 		DV_SET(iu, 0);
@@ -862,6 +874,10 @@ spi_dv_device_internal(struct scsi_device *sdev, u8 *buffer)
 	} else {
 		DV_SET(dt, 1);
 	}
+	/* set width last because it will pull all the other
+	 * parameters down to required values */
+	DV_SET(width, max_width);
+
 	/* Do the read only INQUIRY tests */
 	spi_dv_retrain(sdev, buffer, buffer + sdev->inquiry_len,
 		       spi_dv_device_compare_inquiry);



^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] scsi_transport_spi: fix domain validation failure from incorrect width setting
  2007-09-22 13:40 [PATCH] scsi_transport_spi: fix domain validation failure from incorrect width setting James Bottomley
@ 2007-09-24 12:10 ` Stefan Boresch
  2007-09-24 13:50   ` James Bottomley
  0 siblings, 1 reply; 3+ messages in thread
From: Stefan Boresch @ 2007-09-24 12:10 UTC (permalink / raw)
  To: James Bottomley; +Cc: linux-scsi


Dear James!

Sorry for replying so late!

On Sat, Sep 22, 2007 at 08:40:09AM -0500, James Bottomley wrote:
> The previous patch was a bit non-standard because it actually adjusted
> the user setting max_width.  This would mean that if the user replaced
> the cable and then re-ran domain validation, it still wouldn't try wide
> transfers, which is wrong.
> 
> The attached patch fixes the problem by physically nailing the wide
> setting to what it deduces it should be for the whole of Domain
> Validation.
> 
> James
> 
> diff --git a/drivers/scsi/scsi_transport_spi.c b/drivers/scsi/scsi_transport_spi.c
[snip]

A self-compiled kernel based on the Ubuntu "gutsy" kernel sources
(linux-source-2.6.22_2.6.22-12.36_all.deb, for whatever that is worth) boots
successfully, after applying your patch (which applied cleanly)

Thanks so much for your help,

Stefan Boresch

PS: BTW, your original post (diagnosis of hardware issues) has also
convinced my vendor to do some work to honor his warranty. So, my next
job is to dig into the big box which just arrived by fed-ex containing
all possible replacements (including a new motherboard ..). Maybe,
I'll eventually get U320 running on this machine ;-)

-- 
Stefan Boresch
Institute for Computational Biological Chemistry
University of Vienna, Waehringerstr. 17       A-1090 Vienna, Austria
Phone: -43-1-427752715                        Fax:   -43-1-427752790

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] scsi_transport_spi: fix domain validation failure from incorrect width setting
  2007-09-24 12:10 ` Stefan Boresch
@ 2007-09-24 13:50   ` James Bottomley
  0 siblings, 0 replies; 3+ messages in thread
From: James Bottomley @ 2007-09-24 13:50 UTC (permalink / raw)
  To: Stefan Boresch; +Cc: linux-scsi

On Mon, 2007-09-24 at 14:10 +0200, Stefan Boresch wrote:
> Dear James!
> 
> Sorry for replying so late!
> 
> On Sat, Sep 22, 2007 at 08:40:09AM -0500, James Bottomley wrote:
> > The previous patch was a bit non-standard because it actually adjusted
> > the user setting max_width.  This would mean that if the user replaced
> > the cable and then re-ran domain validation, it still wouldn't try wide
> > transfers, which is wrong.
> > 
> > The attached patch fixes the problem by physically nailing the wide
> > setting to what it deduces it should be for the whole of Domain
> > Validation.
> > 
> > James
> > 
> > diff --git a/drivers/scsi/scsi_transport_spi.c b/drivers/scsi/scsi_transport_spi.c
> [snip]
> 
> A self-compiled kernel based on the Ubuntu "gutsy" kernel sources
> (linux-source-2.6.22_2.6.22-12.36_all.deb, for whatever that is worth) boots
> successfully, after applying your patch (which applied cleanly)
> 
> Thanks so much for your help,

You're very welcome.

> Stefan Boresch
> 
> PS: BTW, your original post (diagnosis of hardware issues) has also
> convinced my vendor to do some work to honor his warranty. So, my next
> job is to dig into the big box which just arrived by fed-ex containing
> all possible replacements (including a new motherboard ..). Maybe,
> I'll eventually get U320 running on this machine ;-)

OK ... I'd replace the cable first ... and check for bent pins in the
connector.  What Domain Validation is saying is that there's something
wrong with the upper 8 bits of the wide bus.  Those are the last few
wires on the 68 wire ribbon cable (wire one is usually marked in a
different colour).

James



^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2007-09-24 13:50 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-09-22 13:40 [PATCH] scsi_transport_spi: fix domain validation failure from incorrect width setting James Bottomley
2007-09-24 12:10 ` Stefan Boresch
2007-09-24 13:50   ` James Bottomley

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox