linux-scsi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 2/4] aacraid: Restart adapter on firmware assert
@ 2006-08-03 15:02 Mark Haverkamp
  2006-08-04 15:24 ` Christoph Hellwig
  0 siblings, 1 reply; 6+ messages in thread
From: Mark Haverkamp @ 2006-08-03 15:02 UTC (permalink / raw)
  To: James Bottomley; +Cc: Mark Salyzyn, linux-scsi

Received from Mark Salyzyn

If the adapter should be in a blinkled (Firmware Assert) state when the
driver loads, we will perform a warm restart of the Adapter Firmware to
see if we can rescue the adapter. Possible causes of a blinkled can
occur on some early release motherboard BIOSes, transitory PCI bus
problems on embedded systems or non-x86 based architectures, transitory
startup failures of early release drives or transitory hardware
failures; some of which can bite the adapter later at runtime. Future
enhancements will include recovery during runtime.

Signed-off-by: Mark Haverkamp <markh@osdl.org>
---

--- scsi-misc-aac.orig/drivers/scsi/aacraid/aacraid.h	2006-07-31 14:33:25.000000000 -0700
+++ scsi-misc-aac/drivers/scsi/aacraid/aacraid.h	2006-07-31 14:33:47.000000000 -0700
@@ -1670,6 +1670,7 @@
 #define RCV_TEMP_READINGS		0x00000025
 #define GET_COMM_PREFERRED_SETTINGS	0x00000026
 #define IOP_RESET			0x00001000
+#define IOP_RESET_ALWAYS		0x00001001
 #define RE_INIT_ADAPTER			0x000000ee
 
 /*
--- scsi-misc-aac.orig/drivers/scsi/aacraid/rkt.c	2006-07-31 14:33:25.000000000 -0700
+++ scsi-misc-aac/drivers/scsi/aacraid/rkt.c	2006-07-31 14:33:47.000000000 -0700
@@ -417,6 +417,17 @@
 	/*
 	 *	Check to see if the board panic'd while booting.
 	 */
+	if (rkt_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC) {
+		u32 var;
+		printk(KERN_ERR "%s%d: adapter kernel panic'd.\n", dev->name, instance);
+		var = 0;
+		if ((aac_rkt_check_health(dev) <= 0)
+		 || rkt_sync_cmd(dev, IOP_RESET, 0, 0, 0, 0, 0, 0,
+		  &var, NULL, NULL, NULL, NULL)
+		 || (var != 0x00000001)
+		 || (rkt_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC))
+			goto error_iounmap;
+	}
 	/*
 	 *	Check to see if the board failed any self tests.
 	 */
@@ -431,13 +442,6 @@
 		printk(KERN_ERR "%s%d: adapter monitor panic.\n", dev->name, instance);
 		goto error_iounmap;
 	}
-	/*
-	 *	Check to see if the board panic'd while booting.
-	 */
-	if (rkt_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC) {
-		printk(KERN_ERR "%s%d: adapter kernel panic'd.\n", dev->name, instance);
-		goto error_iounmap;
-	}
 	start = jiffies;
 	/*
 	 *	Wait for the adapter to be up and running. Wait up to 3 minutes
--- scsi-misc-aac.orig/drivers/scsi/aacraid/rx.c	2006-07-31 14:33:25.000000000 -0700
+++ scsi-misc-aac/drivers/scsi/aacraid/rx.c	2006-07-31 14:33:47.000000000 -0700
@@ -416,6 +416,17 @@
 	/*
 	 *	Check to see if the board panic'd while booting.
 	 */
+	if (rx_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC) {
+		u32 var;
+		printk(KERN_ERR "%s%d: adapter kernel panic.\n", dev->name, instance);
+		var = 0;
+		if ((aac_rx_check_health(dev) <= 0)
+		 || rx_sync_cmd(dev, IOP_RESET, 0, 0, 0, 0, 0, 0,
+		  &var, NULL, NULL, NULL, NULL)
+		 || (var != 0x00000001)
+		 || (rx_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC))
+			goto error_iounmap;
+	}
 	/*
 	 *	Check to see if the board failed any self tests.
 	 */
@@ -424,13 +435,6 @@
 		goto error_iounmap;
 	}
 	/*
-	 *	Check to see if the board panic'd while booting.
-	 */
-	if (rx_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC) {
-		printk(KERN_ERR "%s%d: adapter kernel panic.\n", dev->name, instance);
-		goto error_iounmap;
-	}
-	/*
 	 *	Check to see if the monitor panic'd while booting.
 	 */
 	if (rx_readl(dev, MUnit.OMRx[0]) & MONITOR_PANIC) {

-- 
Mark Haverkamp <markh@osdl.org>


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

* Re: [PATCH 2/4] aacraid: Restart adapter on firmware assert
  2006-08-03 15:02 [PATCH 2/4] aacraid: Restart adapter on firmware assert Mark Haverkamp
@ 2006-08-04 15:24 ` Christoph Hellwig
  2006-08-04 15:41   ` Mark Haverkamp
  2006-08-07 14:34   ` [PATCH 2/4] aacraid: Restart adapter on firmware assert (Update) Mark Haverkamp
  0 siblings, 2 replies; 6+ messages in thread
From: Christoph Hellwig @ 2006-08-04 15:24 UTC (permalink / raw)
  To: Mark Haverkamp; +Cc: James Bottomley, Mark Salyzyn, linux-scsi

> +	if (rkt_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC) {
> +		u32 var;
> +		printk(KERN_ERR "%s%d: adapter kernel panic'd.\n", dev->name, instance);
> +		var = 0;
> +		if ((aac_rkt_check_health(dev) <= 0)
> +		 || rkt_sync_cmd(dev, IOP_RESET, 0, 0, 0, 0, 0, 0,
> +		  &var, NULL, NULL, NULL, NULL)
> +		 || (var != 0x00000001)
> +		 || (rkt_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC))
> +			goto error_iounmap;
> +	}

I know you guys hate me for all that nitpicking, but can we write the
if condition in normal kernel style?  Even better untangle it a little
and put it into a helper function:

static int aac_rkt_restart(<args>)
{
	u32 var;

	printk(KERN_ERR "%s%d: adapter kernel panic'd.\n",
		dev->name, instance);
	if (aac_rkt_check_health(dev) <= 0)
		return 1;
	if (rkt_sync_cmd(dev, IOP_RESET, 0, 0, 0, 0, 0, 0,
			&var, NULL, NULL, NULL, NULL)
		return 1;
	if (var != 0x00000001)
		return 1;
	if (rkt_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC)
		return 1;
	return 0;
}

> +	if (rx_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC) {
> +		u32 var;
> +		printk(KERN_ERR "%s%d: adapter kernel panic.\n", dev->name, instance);
> +		var = 0;
> +		if ((aac_rx_check_health(dev) <= 0)
> +		 || rx_sync_cmd(dev, IOP_RESET, 0, 0, 0, 0, 0, 0,
> +		  &var, NULL, NULL, NULL, NULL)
> +		 || (var != 0x00000001)
> +		 || (rx_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC))
> +			goto error_iounmap;
> +	}

dito


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

* Re: [PATCH 2/4] aacraid: Restart adapter on firmware assert
  2006-08-04 15:24 ` Christoph Hellwig
@ 2006-08-04 15:41   ` Mark Haverkamp
  2006-08-07 14:34   ` [PATCH 2/4] aacraid: Restart adapter on firmware assert (Update) Mark Haverkamp
  1 sibling, 0 replies; 6+ messages in thread
From: Mark Haverkamp @ 2006-08-04 15:41 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: James Bottomley, Mark Salyzyn, linux-scsi

On Fri, 2006-08-04 at 16:24 +0100, Christoph Hellwig wrote:
> > +	if (rkt_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC) {
> > +		u32 var;
> > +		printk(KERN_ERR "%s%d: adapter kernel panic'd.\n", dev->name, instance);
> > +		var = 0;
> > +		if ((aac_rkt_check_health(dev) <= 0)
> > +		 || rkt_sync_cmd(dev, IOP_RESET, 0, 0, 0, 0, 0, 0,
> > +		  &var, NULL, NULL, NULL, NULL)
> > +		 || (var != 0x00000001)
> > +		 || (rkt_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC))
> > +			goto error_iounmap;
> > +	}
> 
> I know you guys hate me for all that nitpicking, but can we write the
> if condition in normal kernel style?  Even better untangle it a little
> and put it into a helper function:

I do check for these things when looking over the patches.  I guess I
missed some this time.  I'll fix it.


-- 
Mark Haverkamp <markh@osdl.org>


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

* Re: [PATCH 2/4] aacraid: Restart adapter on firmware assert (Update)
  2006-08-04 15:24 ` Christoph Hellwig
  2006-08-04 15:41   ` Mark Haverkamp
@ 2006-08-07 14:34   ` Mark Haverkamp
  2006-08-08 15:27     ` Christoph Hellwig
  1 sibling, 1 reply; 6+ messages in thread
From: Mark Haverkamp @ 2006-08-07 14:34 UTC (permalink / raw)
  To: James Bottomley; +Cc: Christoph Hellwig, Mark Salyzyn, linux-scsi

Received from Mark Salyzyn

If the adapter should be in a blinkled (Firmware Assert) state when the
driver loads, we will perform a warm restart of the Adapter Firmware to
see if we can rescue the adapter. Possible causes of a blinkled can
occur on some early release motherboard BIOSes, transitory PCI bus
problems on embedded systems or non-x86 based architectures, transitory
startup failures of early release drives or transitory hardware
failures; some of which can bite the adapter later at runtime. Future
enhancements will include recovery during runtime.

Signed-off-by: Mark Haverkamp <markh@osdl.org>
---

Updated with changes suggested by Christoph.

--- scsi-misc-aac.orig/drivers/scsi/aacraid/aacraid.h	2006-07-31 14:33:25.000000000 -0700
+++ scsi-misc-aac/drivers/scsi/aacraid/aacraid.h	2006-08-04 08:51:06.000000000 -0700
@@ -1670,6 +1670,7 @@
 #define RCV_TEMP_READINGS		0x00000025
 #define GET_COMM_PREFERRED_SETTINGS	0x00000026
 #define IOP_RESET			0x00001000
+#define IOP_RESET_ALWAYS		0x00001001
 #define RE_INIT_ADAPTER			0x000000ee
 
 /*
--- scsi-misc-aac.orig/drivers/scsi/aacraid/rkt.c	2006-07-31 14:33:25.000000000 -0700
+++ scsi-misc-aac/drivers/scsi/aacraid/rkt.c	2006-08-04 09:12:52.000000000 -0700
@@ -395,6 +395,25 @@
 	return 0;
 }
 
+static int aac_rkt_restart_adapter(struct aac_dev *dev)
+{
+	u32 var;
+
+	printk(KERN_ERR "%s%d: adapter kernel panic'd.\n",
+			dev->name, dev->id);
+
+	if (aac_rkt_check_health(dev) <= 0)
+		return 1;
+	 if (rkt_sync_cmd(dev, IOP_RESET, 0, 0, 0, 0, 0, 0,
+			&var, NULL, NULL, NULL, NULL))
+		return 1;
+	 if (var != 0x00000001)
+		 return 1;
+	 if (rkt_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC)
+		return 1;
+	 return 0;
+}
+
 /**
  *	aac_rkt_init	-	initialize an i960 based AAC card
  *	@dev: device to configure
@@ -417,6 +436,9 @@
 	/*
 	 *	Check to see if the board panic'd while booting.
 	 */
+	if (rkt_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC)
+		if (aac_rkt_restart_adapter(dev))
+			goto error_iounmap;
 	/*
 	 *	Check to see if the board failed any self tests.
 	 */
@@ -431,13 +453,6 @@
 		printk(KERN_ERR "%s%d: adapter monitor panic.\n", dev->name, instance);
 		goto error_iounmap;
 	}
-	/*
-	 *	Check to see if the board panic'd while booting.
-	 */
-	if (rkt_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC) {
-		printk(KERN_ERR "%s%d: adapter kernel panic'd.\n", dev->name, instance);
-		goto error_iounmap;
-	}
 	start = jiffies;
 	/*
 	 *	Wait for the adapter to be up and running. Wait up to 3 minutes
--- scsi-misc-aac.orig/drivers/scsi/aacraid/rx.c	2006-07-31 14:33:25.000000000 -0700
+++ scsi-misc-aac/drivers/scsi/aacraid/rx.c	2006-08-04 09:12:46.000000000 -0700
@@ -394,6 +394,25 @@
 	return 0;
 }
 
+static int aac_rx_restart_adapter(struct aac_dev *dev)
+{
+	u32 var;
+
+	printk(KERN_ERR "%s%d: adapter kernel panic'd.\n",
+			dev->name, dev->id);
+
+	if (aac_rx_check_health(dev) <= 0)
+		return 1;
+	 if (rx_sync_cmd(dev, IOP_RESET, 0, 0, 0, 0, 0, 0,
+			&var, NULL, NULL, NULL, NULL))
+		return 1;
+	 if (var != 0x00000001)
+		 return 1;
+	 if (rx_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC)
+		return 1;
+	 return 0;
+}
+
 /**
  *	aac_rx_init	-	initialize an i960 based AAC card
  *	@dev: device to configure
@@ -416,6 +435,9 @@
 	/*
 	 *	Check to see if the board panic'd while booting.
 	 */
+	if (rx_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC)
+		if (aac_rx_restart_adapter(dev))
+			goto error_iounmap;
 	/*
 	 *	Check to see if the board failed any self tests.
 	 */
@@ -424,13 +446,6 @@
 		goto error_iounmap;
 	}
 	/*
-	 *	Check to see if the board panic'd while booting.
-	 */
-	if (rx_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC) {
-		printk(KERN_ERR "%s%d: adapter kernel panic.\n", dev->name, instance);
-		goto error_iounmap;
-	}
-	/*
 	 *	Check to see if the monitor panic'd while booting.
 	 */
 	if (rx_readl(dev, MUnit.OMRx[0]) & MONITOR_PANIC) {





-- 
Mark Haverkamp <markh@osdl.org>


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

* Re: [PATCH 2/4] aacraid: Restart adapter on firmware assert (Update)
  2006-08-07 14:34   ` [PATCH 2/4] aacraid: Restart adapter on firmware assert (Update) Mark Haverkamp
@ 2006-08-08 15:27     ` Christoph Hellwig
  2006-08-08 15:52       ` [PATCH 2/4] aacraid: Restart adapter on firmware assert (Update 2) Mark Haverkamp
  0 siblings, 1 reply; 6+ messages in thread
From: Christoph Hellwig @ 2006-08-08 15:27 UTC (permalink / raw)
  To: Mark Haverkamp
  Cc: James Bottomley, Christoph Hellwig, Mark Salyzyn, linux-scsi

On Mon, Aug 07, 2006 at 07:34:59AM -0700, Mark Haverkamp wrote:
> Received from Mark Salyzyn
> 
> If the adapter should be in a blinkled (Firmware Assert) state when the
> driver loads, we will perform a warm restart of the Adapter Firmware to
> see if we can rescue the adapter. Possible causes of a blinkled can
> occur on some early release motherboard BIOSes, transitory PCI bus
> problems on embedded systems or non-x86 based architectures, transitory
> startup failures of early release drives or transitory hardware
> failures; some of which can bite the adapter later at runtime. Future
> enhancements will include recovery during runtime.

Looks good to me.  (except for some whitespace-damage..)

> 
> Signed-off-by: Mark Haverkamp <markh@osdl.org>
> ---
> 
> Updated with changes suggested by Christoph.
> 
> --- scsi-misc-aac.orig/drivers/scsi/aacraid/aacraid.h	2006-07-31 14:33:25.000000000 -0700
> +++ scsi-misc-aac/drivers/scsi/aacraid/aacraid.h	2006-08-04 08:51:06.000000000 -0700
> @@ -1670,6 +1670,7 @@
>  #define RCV_TEMP_READINGS		0x00000025
>  #define GET_COMM_PREFERRED_SETTINGS	0x00000026
>  #define IOP_RESET			0x00001000
> +#define IOP_RESET_ALWAYS		0x00001001
>  #define RE_INIT_ADAPTER			0x000000ee
>  
>  /*
> --- scsi-misc-aac.orig/drivers/scsi/aacraid/rkt.c	2006-07-31 14:33:25.000000000 -0700
> +++ scsi-misc-aac/drivers/scsi/aacraid/rkt.c	2006-08-04 09:12:52.000000000 -0700
> @@ -395,6 +395,25 @@
>  	return 0;
>  }
>  
> +static int aac_rkt_restart_adapter(struct aac_dev *dev)
> +{
> +	u32 var;
> +
> +	printk(KERN_ERR "%s%d: adapter kernel panic'd.\n",
> +			dev->name, dev->id);
> +
> +	if (aac_rkt_check_health(dev) <= 0)
> +		return 1;
> +	 if (rkt_sync_cmd(dev, IOP_RESET, 0, 0, 0, 0, 0, 0,
> +			&var, NULL, NULL, NULL, NULL))
> +		return 1;
> +	 if (var != 0x00000001)
> +		 return 1;
> +	 if (rkt_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC)
> +		return 1;
> +	 return 0;
> +}
> +
>  /**
>   *	aac_rkt_init	-	initialize an i960 based AAC card
>   *	@dev: device to configure
> @@ -417,6 +436,9 @@
>  	/*
>  	 *	Check to see if the board panic'd while booting.
>  	 */
> +	if (rkt_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC)
> +		if (aac_rkt_restart_adapter(dev))
> +			goto error_iounmap;
>  	/*
>  	 *	Check to see if the board failed any self tests.
>  	 */
> @@ -431,13 +453,6 @@
>  		printk(KERN_ERR "%s%d: adapter monitor panic.\n", dev->name, instance);
>  		goto error_iounmap;
>  	}
> -	/*
> -	 *	Check to see if the board panic'd while booting.
> -	 */
> -	if (rkt_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC) {
> -		printk(KERN_ERR "%s%d: adapter kernel panic'd.\n", dev->name, instance);
> -		goto error_iounmap;
> -	}
>  	start = jiffies;
>  	/*
>  	 *	Wait for the adapter to be up and running. Wait up to 3 minutes
> --- scsi-misc-aac.orig/drivers/scsi/aacraid/rx.c	2006-07-31 14:33:25.000000000 -0700
> +++ scsi-misc-aac/drivers/scsi/aacraid/rx.c	2006-08-04 09:12:46.000000000 -0700
> @@ -394,6 +394,25 @@
>  	return 0;
>  }
>  
> +static int aac_rx_restart_adapter(struct aac_dev *dev)
> +{
> +	u32 var;
> +
> +	printk(KERN_ERR "%s%d: adapter kernel panic'd.\n",
> +			dev->name, dev->id);
> +
> +	if (aac_rx_check_health(dev) <= 0)
> +		return 1;
> +	 if (rx_sync_cmd(dev, IOP_RESET, 0, 0, 0, 0, 0, 0,
> +			&var, NULL, NULL, NULL, NULL))
> +		return 1;
> +	 if (var != 0x00000001)
> +		 return 1;
> +	 if (rx_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC)
> +		return 1;
> +	 return 0;
> +}
> +
>  /**
>   *	aac_rx_init	-	initialize an i960 based AAC card
>   *	@dev: device to configure
> @@ -416,6 +435,9 @@
>  	/*
>  	 *	Check to see if the board panic'd while booting.
>  	 */
> +	if (rx_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC)
> +		if (aac_rx_restart_adapter(dev))
> +			goto error_iounmap;
>  	/*
>  	 *	Check to see if the board failed any self tests.
>  	 */
> @@ -424,13 +446,6 @@
>  		goto error_iounmap;
>  	}
>  	/*
> -	 *	Check to see if the board panic'd while booting.
> -	 */
> -	if (rx_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC) {
> -		printk(KERN_ERR "%s%d: adapter kernel panic.\n", dev->name, instance);
> -		goto error_iounmap;
> -	}
> -	/*
>  	 *	Check to see if the monitor panic'd while booting.
>  	 */
>  	if (rx_readl(dev, MUnit.OMRx[0]) & MONITOR_PANIC) {
> 
> 
> 
> 
> 
> -- 
> Mark Haverkamp <markh@osdl.org>
> 
---end quoted text---

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

* [PATCH 2/4] aacraid: Restart adapter on firmware assert (Update 2)
  2006-08-08 15:27     ` Christoph Hellwig
@ 2006-08-08 15:52       ` Mark Haverkamp
  0 siblings, 0 replies; 6+ messages in thread
From: Mark Haverkamp @ 2006-08-08 15:52 UTC (permalink / raw)
  To: Christoph Hellwig, James Bottomley; +Cc: Mark Salyzyn, linux-scsi

Received from Mark Salyzyn

If the adapter should be in a blinkled (Firmware Assert) state when the
driver loads, we will perform a warm restart of the Adapter Firmware to
see if we can rescue the adapter. Possible causes of a blinkled can
occur on some early release motherboard BIOSes, transitory PCI bus
problems on embedded systems or non-x86 based architectures, transitory
startup failures of early release drives or transitory hardware
failures; some of which can bite the adapter later at runtime. Future
enhancements will include recovery during runtime.

Fixed extra whitespace space issue.

Signed-off-by: Mark Haverkamp <markh@osdl.org>
---

--- scsi-misc-aac.orig/drivers/scsi/aacraid/aacraid.h	2006-07-31 14:33:25.000000000 -0700
+++ scsi-misc-aac/drivers/scsi/aacraid/aacraid.h	2006-08-08 08:44:04.000000000 -0700
@@ -1670,6 +1670,7 @@
 #define RCV_TEMP_READINGS		0x00000025
 #define GET_COMM_PREFERRED_SETTINGS	0x00000026
 #define IOP_RESET			0x00001000
+#define IOP_RESET_ALWAYS		0x00001001
 #define RE_INIT_ADAPTER			0x000000ee
 
 /*
--- scsi-misc-aac.orig/drivers/scsi/aacraid/rkt.c	2006-07-31 14:33:25.000000000 -0700
+++ scsi-misc-aac/drivers/scsi/aacraid/rkt.c	2006-08-08 08:46:50.000000000 -0700
@@ -395,6 +395,25 @@
 	return 0;
 }
 
+static int aac_rkt_restart_adapter(struct aac_dev *dev)
+{
+	u32 var;
+
+	printk(KERN_ERR "%s%d: adapter kernel panic'd.\n",
+			dev->name, dev->id);
+
+	if (aac_rkt_check_health(dev) <= 0)
+		return 1;
+	if (rkt_sync_cmd(dev, IOP_RESET, 0, 0, 0, 0, 0, 0,
+			&var, NULL, NULL, NULL, NULL))
+		return 1;
+	if (var != 0x00000001)
+		 return 1;
+	if (rkt_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC)
+		return 1;
+	return 0;
+}
+
 /**
  *	aac_rkt_init	-	initialize an i960 based AAC card
  *	@dev: device to configure
@@ -417,6 +436,9 @@
 	/*
 	 *	Check to see if the board panic'd while booting.
 	 */
+	if (rkt_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC)
+		if (aac_rkt_restart_adapter(dev))
+			goto error_iounmap;
 	/*
 	 *	Check to see if the board failed any self tests.
 	 */
@@ -431,13 +453,6 @@
 		printk(KERN_ERR "%s%d: adapter monitor panic.\n", dev->name, instance);
 		goto error_iounmap;
 	}
-	/*
-	 *	Check to see if the board panic'd while booting.
-	 */
-	if (rkt_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC) {
-		printk(KERN_ERR "%s%d: adapter kernel panic'd.\n", dev->name, instance);
-		goto error_iounmap;
-	}
 	start = jiffies;
 	/*
 	 *	Wait for the adapter to be up and running. Wait up to 3 minutes
--- scsi-misc-aac.orig/drivers/scsi/aacraid/rx.c	2006-07-31 14:33:25.000000000 -0700
+++ scsi-misc-aac/drivers/scsi/aacraid/rx.c	2006-08-08 08:46:16.000000000 -0700
@@ -394,6 +394,25 @@
 	return 0;
 }
 
+static int aac_rx_restart_adapter(struct aac_dev *dev)
+{
+	u32 var;
+
+	printk(KERN_ERR "%s%d: adapter kernel panic'd.\n",
+			dev->name, dev->id);
+
+	if (aac_rx_check_health(dev) <= 0)
+		return 1;
+	if (rx_sync_cmd(dev, IOP_RESET, 0, 0, 0, 0, 0, 0,
+			&var, NULL, NULL, NULL, NULL))
+		return 1;
+	if (var != 0x00000001)
+		 return 1;
+	if (rx_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC)
+		return 1;
+	return 0;
+}
+
 /**
  *	aac_rx_init	-	initialize an i960 based AAC card
  *	@dev: device to configure
@@ -416,6 +435,9 @@
 	/*
 	 *	Check to see if the board panic'd while booting.
 	 */
+	if (rx_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC)
+		if (aac_rx_restart_adapter(dev))
+			goto error_iounmap;
 	/*
 	 *	Check to see if the board failed any self tests.
 	 */
@@ -424,13 +446,6 @@
 		goto error_iounmap;
 	}
 	/*
-	 *	Check to see if the board panic'd while booting.
-	 */
-	if (rx_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC) {
-		printk(KERN_ERR "%s%d: adapter kernel panic.\n", dev->name, instance);
-		goto error_iounmap;
-	}
-	/*
 	 *	Check to see if the monitor panic'd while booting.
 	 */
 	if (rx_readl(dev, MUnit.OMRx[0]) & MONITOR_PANIC) {

-- 
Mark Haverkamp <markh@osdl.org>


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

end of thread, other threads:[~2006-08-08 15:52 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-08-03 15:02 [PATCH 2/4] aacraid: Restart adapter on firmware assert Mark Haverkamp
2006-08-04 15:24 ` Christoph Hellwig
2006-08-04 15:41   ` Mark Haverkamp
2006-08-07 14:34   ` [PATCH 2/4] aacraid: Restart adapter on firmware assert (Update) Mark Haverkamp
2006-08-08 15:27     ` Christoph Hellwig
2006-08-08 15:52       ` [PATCH 2/4] aacraid: Restart adapter on firmware assert (Update 2) Mark Haverkamp

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).