Subject: kern/9577: fix for problems with Qlogic Ultra3 SCSI bus resets
To: None <gnats-bugs@gnats.netbsd.org>
From: Matthew Jacob <mjacob@feral.com>
List: netbsd-bugs
Date: 03/08/2000 11:57:44
>Number:         9577
>Category:       kern
>Synopsis:       fix for problems with Qlogic Ultra3 SCSI bus resets
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    kern-bug-people (Kernel Bug People)
>State:          open
>Class:          change-request
>Submitter-Id:   net
>Arrival-Date:   Wed Mar  8 11:57:01 2000
>Last-Modified:
>Originator:     
>Organization:
	Recovering Ex-NetBSD developers
>Release:        03072000
>Environment:
	
System: NetBSD nobble 1.4U NetBSD 1.4U (ALPHA) #0: Sun Mar 5 16:15:02 PST 2000 mjacob@nobble:/space/syssrc/sys/arch/alpha/compile/ALPHA alpha


>Description:

During booting, the SCSI bus resets issued for the first time by the
driver for the Qlogic 12160 Ultra3 card seems to then report several
commands sent *after* this as having been destroyed by the SCSI bus
reset. Bad for probing.

>How-To-Repeat:
Boot a system with a Qlogic 12160 in it.

>Fix:

Skip resets for the Ultra3 card.

Index: isp_netbsd.c
===================================================================
RCS file: /cvsroot/syssrc/sys/dev/ic/isp_netbsd.c,v
retrieving revision 1.23
diff -u -r1.23 isp_netbsd.c
--- isp_netbsd.c	2000/02/12 02:25:28	1.23
+++ isp_netbsd.c	2000/03/08 19:53:18
@@ -102,9 +102,12 @@
 
 	/*
 	 * Send a SCSI Bus Reset (used to be done as part of attach,
-	 * but now left to the OS outer layers).
+	 * but now left to the OS outer layers). Don't do this for
+	 * Ultra3 cards- there seems to be some kind of residual
+	 * problem that causes the next several commands to be nuked
+	 * by the Qlogic f/w (bad for consistent probing).
 	 */
-	if (IS_SCSI(isp)) {
+	if (IS_SCSI(isp) && !IS_ULTRA3(isp)) {
 		int bus = 0;
 		(void) isp_control(isp, ISPCTL_RESET_BUS, &bus);
 		if (IS_DUALBUS(isp)) {
@@ -112,7 +115,7 @@
 			(void) isp_control(isp, ISPCTL_RESET_BUS, &bus);
 		}
 		SYS_DELAY(2*1000000);
-	} else {
+	} else if (IS_FC(isp)) {
 		int i, j;
 		fcparam *fcp = isp->isp_param;
 		delay(2 * 1000000);
>Audit-Trail:
>Unformatted: