提交 1208bab5 编写于 作者: S Salyzyn, Mark 提交者: James Bottomley

[SCSI] aacraid: apply commit config for reset_devices flag

Under some conditions associated with the unclean transition to kdump,
the aacraid adapters will view the array as foreign and not export it to
prevent access and data manipulation. The solution is to submit a commit
configuration to export the devices since this is a expected behavior
when transitioning to a kdump kernel.

This patch adds the aacraid.reset_devices flag and when either this or
the global reset_devices flag is set, ensures that a commit config is
issued and extends the startup_timeout if it is set less than 5 minutes.
Signed-off-by: NMark Salyzyn <aacraid@adaptec.com>
Signed-off-by: NJames Bottomley <James.Bottomley@SteelEye.com>
上级 09ff92fe
...@@ -146,7 +146,7 @@ static char *aac_get_status_string(u32 status); ...@@ -146,7 +146,7 @@ static char *aac_get_status_string(u32 status);
static int nondasd = -1; static int nondasd = -1;
static int dacmode = -1; static int dacmode = -1;
static int commit = -1; int aac_commit = -1;
int startup_timeout = 180; int startup_timeout = 180;
int aif_timeout = 120; int aif_timeout = 120;
...@@ -154,7 +154,7 @@ module_param(nondasd, int, S_IRUGO|S_IWUSR); ...@@ -154,7 +154,7 @@ module_param(nondasd, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(nondasd, "Control scanning of hba for nondasd devices. 0=off, 1=on"); MODULE_PARM_DESC(nondasd, "Control scanning of hba for nondasd devices. 0=off, 1=on");
module_param(dacmode, int, S_IRUGO|S_IWUSR); module_param(dacmode, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(dacmode, "Control whether dma addressing is using 64 bit DAC. 0=off, 1=on"); MODULE_PARM_DESC(dacmode, "Control whether dma addressing is using 64 bit DAC. 0=off, 1=on");
module_param(commit, int, S_IRUGO|S_IWUSR); module_param_named(commit, aac_commit, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(commit, "Control whether a COMMIT_CONFIG is issued to the adapter for foreign arrays.\nThis is typically needed in systems that do not have a BIOS. 0=off, 1=on"); MODULE_PARM_DESC(commit, "Control whether a COMMIT_CONFIG is issued to the adapter for foreign arrays.\nThis is typically needed in systems that do not have a BIOS. 0=off, 1=on");
module_param(startup_timeout, int, S_IRUGO|S_IWUSR); module_param(startup_timeout, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(startup_timeout, "The duration of time in seconds to wait for adapter to have it's kernel up and\nrunning. This is typically adjusted for large systems that do not have a BIOS."); MODULE_PARM_DESC(startup_timeout, "The duration of time in seconds to wait for adapter to have it's kernel up and\nrunning. This is typically adjusted for large systems that do not have a BIOS.");
...@@ -173,6 +173,9 @@ int expose_physicals = -1; ...@@ -173,6 +173,9 @@ int expose_physicals = -1;
module_param(expose_physicals, int, S_IRUGO|S_IWUSR); module_param(expose_physicals, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(expose_physicals, "Expose physical components of the arrays. -1=protect 0=off, 1=on"); MODULE_PARM_DESC(expose_physicals, "Expose physical components of the arrays. -1=protect 0=off, 1=on");
int aac_reset_devices = 0;
module_param_named(reset_devices, aac_reset_devices, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(reset_devices, "Force an adapter reset at initialization.");
static inline int aac_valid_context(struct scsi_cmnd *scsicmd, static inline int aac_valid_context(struct scsi_cmnd *scsicmd,
struct fib *fibptr) { struct fib *fibptr) {
...@@ -246,7 +249,7 @@ int aac_get_config_status(struct aac_dev *dev, int commit_flag) ...@@ -246,7 +249,7 @@ int aac_get_config_status(struct aac_dev *dev, int commit_flag)
aac_fib_complete(fibptr); aac_fib_complete(fibptr);
/* Send a CT_COMMIT_CONFIG to enable discovery of devices */ /* Send a CT_COMMIT_CONFIG to enable discovery of devices */
if (status >= 0) { if (status >= 0) {
if ((commit == 1) || commit_flag) { if ((aac_commit == 1) || commit_flag) {
struct aac_commit_config * dinfo; struct aac_commit_config * dinfo;
aac_fib_init(fibptr); aac_fib_init(fibptr);
dinfo = (struct aac_commit_config *) fib_data(fibptr); dinfo = (struct aac_commit_config *) fib_data(fibptr);
...@@ -261,7 +264,7 @@ int aac_get_config_status(struct aac_dev *dev, int commit_flag) ...@@ -261,7 +264,7 @@ int aac_get_config_status(struct aac_dev *dev, int commit_flag)
1, 1, 1, 1,
NULL, NULL); NULL, NULL);
aac_fib_complete(fibptr); aac_fib_complete(fibptr);
} else if (commit == 0) { } else if (aac_commit == 0) {
printk(KERN_WARNING printk(KERN_WARNING
"aac_get_config_status: Foreign device configurations are being ignored\n"); "aac_get_config_status: Foreign device configurations are being ignored\n");
} }
......
...@@ -1830,3 +1830,5 @@ extern char aac_driver_version[]; ...@@ -1830,3 +1830,5 @@ extern char aac_driver_version[];
extern int startup_timeout; extern int startup_timeout;
extern int aif_timeout; extern int aif_timeout;
extern int expose_physicals; extern int expose_physicals;
extern int aac_reset_devices;
extern int aac_commit;
...@@ -488,6 +488,8 @@ static int aac_rx_restart_adapter(struct aac_dev *dev, int bled) ...@@ -488,6 +488,8 @@ static int aac_rx_restart_adapter(struct aac_dev *dev, int bled)
return -EINVAL; return -EINVAL;
if (rx_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC) if (rx_readl(dev, MUnit.OMRx[0]) & KERNEL_PANIC)
return -ENODEV; return -ENODEV;
if (startup_timeout < 300)
startup_timeout = 300;
return 0; return 0;
} }
...@@ -542,7 +544,7 @@ int _aac_rx_init(struct aac_dev *dev) ...@@ -542,7 +544,7 @@ int _aac_rx_init(struct aac_dev *dev)
dev->a_ops.adapter_sync_cmd = rx_sync_cmd; dev->a_ops.adapter_sync_cmd = rx_sync_cmd;
dev->a_ops.adapter_enable_int = aac_rx_disable_interrupt; dev->a_ops.adapter_enable_int = aac_rx_disable_interrupt;
dev->OIMR = status = rx_readb (dev, MUnit.OIMR); dev->OIMR = status = rx_readb (dev, MUnit.OIMR);
if ((((status & 0x0c) != 0x0c) || reset_devices) && if ((((status & 0x0c) != 0x0c) || aac_reset_devices || reset_devices) &&
!aac_rx_restart_adapter(dev, 0)) !aac_rx_restart_adapter(dev, 0))
++restart; ++restart;
/* /*
...@@ -594,6 +596,8 @@ int _aac_rx_init(struct aac_dev *dev) ...@@ -594,6 +596,8 @@ int _aac_rx_init(struct aac_dev *dev)
} }
msleep(1); msleep(1);
} }
if (restart)
aac_commit = 1;
/* /*
* Fill in the common function dispatch table. * Fill in the common function dispatch table.
*/ */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册