To: Tomas Berndtsson <tobe@lysator.liu.se>
Cc: Linux-m68k List <linux-m68k@lists.linux-m68k.org>
Subject: Re: L68K: SysRq scsi reset?
References: <yz8ra42xzkb.fsf@sara.lysator.liu.se>
X-Yow: Can you MAIL a BEAN CAKE?
From: Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
Date: 18 Mar 1998 11:03:41 +0100
In-Reply-To: Tomas Berndtsson's message of 16 Mar 1998 19:25:56 +0100
Sender: owner-linux-m68k@phil.uni-sb.de

Tomas Berndtsson <tobe@lysator.liu.se> writes:

|> Recently, I've had some scsi lockups in 2.1.85.

Please note that the SCSI timeout recovery is completely broken in current
kernels.  I'm currently trying to get it work again, but it will take some
time.

For a start, you could try the patch below, but be prepared for kernel
panics due to freeing unused memory.  I haven't yet tracked this down.
Maybe someone can convert our scsi drivers to use the new error recovery.

Andreas.

--- drivers/scsi/scsi_obsolete.c.~1~	Wed Mar 18 11:00:35 1998
+++ drivers/scsi/scsi_obsolete.c	Wed Mar 18 10:59:15 1998
@@ -152,6 +152,7 @@
 
 void scsi_old_times_out (Scsi_Cmnd * SCpnt)
 {
+    SCpnt->serial_number_at_timeout = SCpnt->serial_number;
 
     switch (SCpnt->internal_timeout & (IN_ABORT | IN_RESET | IN_RESET2 | IN_RESET3))
     {
@@ -163,12 +164,12 @@
 	}
 
 	if (!scsi_abort (SCpnt, DID_TIME_OUT))
-	    return;
+	    break;
     case IN_ABORT:
 	printk("SCSI host %d abort (pid %ld) timed out - resetting\n",
 	       SCpnt->host->host_no, SCpnt->pid);
 	if (!scsi_reset (SCpnt, SCSI_RESET_ASYNCHRONOUS))
-	    return;
+	    break;
     case IN_RESET:
     case (IN_ABORT | IN_RESET):
 	/* This might be controversial, but if there is a bus hang,
@@ -182,7 +183,7 @@
 	SCpnt->internal_timeout |= IN_RESET2;
         scsi_reset (SCpnt,
 		    SCSI_RESET_ASYNCHRONOUS | SCSI_RESET_SUGGEST_BUS_RESET);
-        return;
+        break;
     case (IN_ABORT | IN_RESET | IN_RESET2):
 	/* Obviously the bus reset didn't work.
 	 * Let's try even harder and call for an HBA reset.
@@ -194,16 +195,17 @@
 	SCpnt->internal_timeout |= IN_RESET3;
         scsi_reset (SCpnt,
 		    SCSI_RESET_ASYNCHRONOUS | SCSI_RESET_SUGGEST_HOST_RESET);
-	return;
+	break;
 
     default:
 	printk("SCSI host %d reset (pid %ld) timed out again -\n",
 	       SCpnt->host->host_no, SCpnt->pid);
 	printk("probably an unrecoverable SCSI bus or device hang.\n");
-	return;
+	break;
 
     }
 
+    SCpnt->serial_number_at_timeout = 0;
 }
 
 
