Commit 8c23cd74 authored by Mark Haverkamp's avatar Mark Haverkamp Committed by James Bottomley

[SCSI] aacraid: Restart adapter on firmware assert (Update 2)

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: default avatarMark Haverkamp <markh@osdl.org>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent c8f7b073
...@@ -1670,6 +1670,7 @@ extern struct aac_common aac_config; ...@@ -1670,6 +1670,7 @@ extern struct aac_common aac_config;
#define RCV_TEMP_READINGS 0x00000025 #define RCV_TEMP_READINGS 0x00000025
#define GET_COMM_PREFERRED_SETTINGS 0x00000026 #define GET_COMM_PREFERRED_SETTINGS 0x00000026
#define IOP_RESET 0x00001000 #define IOP_RESET 0x00001000
#define IOP_RESET_ALWAYS 0x00001001
#define RE_INIT_ADAPTER 0x000000ee #define RE_INIT_ADAPTER 0x000000ee
/* /*
......
...@@ -395,6 +395,25 @@ static int aac_rkt_send(struct fib * fib) ...@@ -395,6 +395,25 @@ static int aac_rkt_send(struct fib * fib)
return 0; 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 * aac_rkt_init - initialize an i960 based AAC card
* @dev: device to configure * @dev: device to configure
...@@ -417,6 +436,9 @@ int aac_rkt_init(struct aac_dev *dev) ...@@ -417,6 +436,9 @@ int aac_rkt_init(struct aac_dev *dev)
/* /*
* Check to see if the board panic'd while booting. * 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. * Check to see if the board failed any self tests.
*/ */
...@@ -431,13 +453,6 @@ int aac_rkt_init(struct aac_dev *dev) ...@@ -431,13 +453,6 @@ int aac_rkt_init(struct aac_dev *dev)
printk(KERN_ERR "%s%d: adapter monitor panic.\n", dev->name, instance); printk(KERN_ERR "%s%d: adapter monitor panic.\n", dev->name, instance);
goto error_iounmap; 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; start = jiffies;
/* /*
* Wait for the adapter to be up and running. Wait up to 3 minutes * Wait for the adapter to be up and running. Wait up to 3 minutes
......
...@@ -394,6 +394,25 @@ static int aac_rx_send(struct fib * fib) ...@@ -394,6 +394,25 @@ static int aac_rx_send(struct fib * fib)
return 0; 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 * aac_rx_init - initialize an i960 based AAC card
* @dev: device to configure * @dev: device to configure
...@@ -416,6 +435,9 @@ int aac_rx_init(struct aac_dev *dev) ...@@ -416,6 +435,9 @@ int aac_rx_init(struct aac_dev *dev)
/* /*
* Check to see if the board panic'd while booting. * 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. * Check to see if the board failed any self tests.
*/ */
...@@ -423,13 +445,6 @@ int aac_rx_init(struct aac_dev *dev) ...@@ -423,13 +445,6 @@ int aac_rx_init(struct aac_dev *dev)
printk(KERN_ERR "%s%d: adapter self-test failed.\n", dev->name, instance); printk(KERN_ERR "%s%d: adapter self-test failed.\n", dev->name, instance);
goto error_iounmap; 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. * Check to see if the monitor panic'd while booting.
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment