public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@kernel.org
Cc: Justin Forbes <jmforbes@linuxtx.org>,
	Zwane Mwaikambo <zwane@arm.linux.org.uk>,
	"Theodore Ts'o" <tytso@mit.edu>,
	Randy Dunlap <rdunlap@xenotime.net>,
	Dave Jones <davej@redhat.com>,
	Chuck Wolber <chuckw@quantumlinux.com>,
	Chris Wedgwood <reviews@ml.cw.f00f.org>,
	Michael Krufky <mkrufky@linuxtv.org>,
	Chuck Ebbert <cebbert@redhat.com>,
	Domenico Andreoli <cavokz@gmail.com>,
	torvalds@linux-foundation.org, akpm@linux-foundation.org,
	alan@lxorguk.ukuu.org.uk,
	James Bottomley <James.Bottomley@SteelEye.com>
Subject: [patch 01/12] scsi_transport_spi: fix domain validation failure from incorrect width setting
Date: Mon, 8 Oct 2007 11:06:04 -0700	[thread overview]
Message-ID: <20071008180604.GB7627@kroah.com> (raw)
In-Reply-To: <20071008180551.GA7627@kroah.com>

[-- Attachment #1: scsi_transport_spi-fix-domain-validation-failure-from-incorrect-width-setting.patch --]
[-- Type: text/plain, Size: 3531 bytes --]

From: James Bottomley <James.Bottomley@SteelEye.com>

commit 2302827c95fe0f441025acd5133e532d2eef322b from upstream

Domain Validation in the SPI transport class is failing on boxes with
damaged cables (and failing to the extent that the box hangs).  The
problem is that the first test it does is a cable integrity test for
wide transfers and if this fails, it turns the wide bit off.  The
problem is that the next set of tests it does turns wide back on
again, with the result that it runs through the entirety of DV with a
known bad setting and then hangs the system.

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.

Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

---
 drivers/scsi/scsi_transport_spi.c |   28 ++++++++++++++++++++++------
 1 file changed, 22 insertions(+), 6 deletions(-)

--- a/drivers/scsi/scsi_transport_spi.c
+++ b/drivers/scsi/scsi_transport_spi.c
@@ -787,10 +787,12 @@ spi_dv_device_internal(struct scsi_devic
 	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_devic
 		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_devic
 		    != 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_devic
 
 	/* 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_devic
 		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_devic
 	} 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);

-- 

  reply	other threads:[~2007-10-08 18:08 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20071008180406.052382073@mini.kroah.org>
2007-10-08 18:05 ` [patch 00/12] 2.6.22.10 -stable review Greg KH
2007-10-08 18:06   ` Greg KH [this message]
2007-10-08 18:06   ` [patch 02/12] sky2: reduce impact of watchdog timer Greg KH
2007-10-08 18:06   ` [patch 03/12] sky2: fix VLAN receive processing Greg KH
2007-10-08 18:06   ` [patch 04/12] sky2: fix transmit state on resume Greg KH
2007-10-08 18:06   ` [patch 05/12] libata: update drive blacklists Greg KH
2007-10-08 18:06   ` [patch 06/12] Fix ppp_mppe kernel stack usage Greg KH
2007-10-08 18:06   ` [patch 07/12] i2c-algo-bit: Read block data bugfix Greg KH
2007-10-08 18:06   ` [patch 08/12] NLM: Fix a circular lock dependency in lockd Greg KH
2007-10-08 20:01     ` Roel Kluin
2007-10-09 15:00       ` Trond Myklebust
2007-10-09 15:13         ` Greg KH
2007-10-09 15:27           ` Trond Myklebust
2007-10-09 20:41             ` [stable] " Greg KH
2007-10-08 18:06   ` [patch 09/12] Fix SMP poweroff hangs Greg KH
2007-10-09 15:17     ` Olof Johansson
2007-10-09 22:20       ` [stable] " Greg KH
2007-10-09 23:21         ` Thomas Gleixner
2007-10-09 23:27           ` Linus Torvalds
2007-10-09 23:35             ` Thomas Gleixner
2007-10-10  5:29               ` Linus Torvalds
     [not found]                 ` <200710092359.47144.spaceman__spiff@cox.net>
2007-10-10 14:57                   ` ARPM shutdown oops (Re: [stable] [patch 09/12] Fix SMP poweroff hangs) Linus Torvalds
2007-10-10 16:31                     ` H. Peter Anvin
2007-10-11  3:05                     ` Kevin
2007-10-11 15:31                       ` Linus Torvalds
2007-10-11 18:42                         ` Jeff Garzik
2007-10-11 19:19                           ` Dave Jones
2007-10-11 20:55                           ` Rafael J. Wysocki
2007-10-11 23:27                           ` APM " Adrian Bunk
2007-10-12 12:05                             ` Rafael J. Wysocki
2007-10-10  0:03             ` [stable] [patch 09/12] Fix SMP poweroff hangs Olof Johansson
2007-10-10  0:08             ` [PATCH] powerpc: don't enable cpu hotplug on mpic-based pseries Olof Johansson
2007-10-10  0:18               ` Stephen Rothwell
2007-10-10  0:38                 ` [PATCH v2] " Olof Johansson
2007-10-10 10:08                   ` Milton Miller
2007-10-10 16:43                     ` Olof Johansson
2007-10-11  5:52                   ` Paul Mackerras
2007-10-11  5:59                     ` Olof Johansson
2007-10-11  0:24             ` [stable] [patch 09/12] Fix SMP poweroff hangs Paul Mackerras
2007-10-09 23:28           ` Greg KH
     [not found]           ` <alpine.LFD.0.999.0710091625520.3838@woody.linux%foundation.org>
2007-10-10 10:06             ` Milton Miller
2007-10-10 11:35               ` Rafael J. Wysocki
2007-10-08 18:06   ` [patch 10/12] Fix timer_stats printout of events/sec Greg KH
2007-10-08 18:06   ` [patch 11/12] SELinux: clear parent death signal on SID transitions Greg KH
2007-10-08 18:06   ` [patch 12/12] i386: Use global flag to disable broken local apic timer on AMD CPUs Greg KH
2007-10-08 18:09   ` [patch 00/12] 2.6.22.10 -stable review Greg KH

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20071008180604.GB7627@kroah.com \
    --to=gregkh@suse.de \
    --cc=James.Bottomley@SteelEye.com \
    --cc=akpm@linux-foundation.org \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=cavokz@gmail.com \
    --cc=cebbert@redhat.com \
    --cc=chuckw@quantumlinux.com \
    --cc=davej@redhat.com \
    --cc=jmforbes@linuxtx.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mkrufky@linuxtv.org \
    --cc=rdunlap@xenotime.net \
    --cc=reviews@ml.cw.f00f.org \
    --cc=stable@kernel.org \
    --cc=torvalds@linux-foundation.org \
    --cc=tytso@mit.edu \
    --cc=zwane@arm.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox