mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-04 01:49:36 +00:00
[SCSI] mptspi: reset handler shouldn't be called for other bus protocols
All registered reset callback handlers are called during reset processing. The mptspi modules has its own reset callback handler, just recently added for issuing domain validation after host reset. If either the mptsas or mptfc driver are loaded, this callback could be called. Thus resulting in domain validation being issued for sas or fibre end devices. Fix this by having mptbase.c check the bus type against the driver type and only call the reset handler if they match (or if it's a non-bus specific reset handler). Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
parent
c3d8336855
commit
4ff42a669a
1 changed files with 21 additions and 6 deletions
|
@ -1605,6 +1605,21 @@ mpt_resume(struct pci_dev *pdev)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static int
|
||||||
|
mpt_signal_reset(int index, MPT_ADAPTER *ioc, int reset_phase)
|
||||||
|
{
|
||||||
|
if ((MptDriverClass[index] == MPTSPI_DRIVER &&
|
||||||
|
ioc->bus_type != SPI) ||
|
||||||
|
(MptDriverClass[index] == MPTFC_DRIVER &&
|
||||||
|
ioc->bus_type != FC) ||
|
||||||
|
(MptDriverClass[index] == MPTSAS_DRIVER &&
|
||||||
|
ioc->bus_type != SAS))
|
||||||
|
/* make sure we only call the relevant reset handler
|
||||||
|
* for the bus */
|
||||||
|
return 0;
|
||||||
|
return (MptResetHandlers[index])(ioc, reset_phase);
|
||||||
|
}
|
||||||
|
|
||||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||||
/*
|
/*
|
||||||
* mpt_do_ioc_recovery - Initialize or recover MPT adapter.
|
* mpt_do_ioc_recovery - Initialize or recover MPT adapter.
|
||||||
|
@ -1885,14 +1900,14 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
|
||||||
if ((ret == 0) && MptResetHandlers[ii]) {
|
if ((ret == 0) && MptResetHandlers[ii]) {
|
||||||
dprintk((MYIOC_s_INFO_FMT "Calling IOC post_reset handler #%d\n",
|
dprintk((MYIOC_s_INFO_FMT "Calling IOC post_reset handler #%d\n",
|
||||||
ioc->name, ii));
|
ioc->name, ii));
|
||||||
rc += (*(MptResetHandlers[ii]))(ioc, MPT_IOC_POST_RESET);
|
rc += mpt_signal_reset(ii, ioc, MPT_IOC_POST_RESET);
|
||||||
handlers++;
|
handlers++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (alt_ioc_ready && MptResetHandlers[ii]) {
|
if (alt_ioc_ready && MptResetHandlers[ii]) {
|
||||||
drsprintk((MYIOC_s_INFO_FMT "Calling alt-%s post_reset handler #%d\n",
|
drsprintk((MYIOC_s_INFO_FMT "Calling alt-%s post_reset handler #%d\n",
|
||||||
ioc->name, ioc->alt_ioc->name, ii));
|
ioc->name, ioc->alt_ioc->name, ii));
|
||||||
rc += (*(MptResetHandlers[ii]))(ioc->alt_ioc, MPT_IOC_POST_RESET);
|
rc += mpt_signal_reset(ii, ioc->alt_ioc, MPT_IOC_POST_RESET);
|
||||||
handlers++;
|
handlers++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3267,11 +3282,11 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag)
|
||||||
if (MptResetHandlers[ii]) {
|
if (MptResetHandlers[ii]) {
|
||||||
dprintk((MYIOC_s_INFO_FMT "Calling IOC pre_reset handler #%d\n",
|
dprintk((MYIOC_s_INFO_FMT "Calling IOC pre_reset handler #%d\n",
|
||||||
ioc->name, ii));
|
ioc->name, ii));
|
||||||
r += (*(MptResetHandlers[ii]))(ioc, MPT_IOC_PRE_RESET);
|
r += mpt_signal_reset(ii, ioc, MPT_IOC_PRE_RESET);
|
||||||
if (ioc->alt_ioc) {
|
if (ioc->alt_ioc) {
|
||||||
dprintk((MYIOC_s_INFO_FMT "Calling alt-%s pre_reset handler #%d\n",
|
dprintk((MYIOC_s_INFO_FMT "Calling alt-%s pre_reset handler #%d\n",
|
||||||
ioc->name, ioc->alt_ioc->name, ii));
|
ioc->name, ioc->alt_ioc->name, ii));
|
||||||
r += (*(MptResetHandlers[ii]))(ioc->alt_ioc, MPT_IOC_PRE_RESET);
|
r += mpt_signal_reset(ii, ioc->alt_ioc, MPT_IOC_PRE_RESET);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5706,11 +5721,11 @@ mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag)
|
||||||
if (MptResetHandlers[ii]) {
|
if (MptResetHandlers[ii]) {
|
||||||
dtmprintk((MYIOC_s_INFO_FMT "Calling IOC reset_setup handler #%d\n",
|
dtmprintk((MYIOC_s_INFO_FMT "Calling IOC reset_setup handler #%d\n",
|
||||||
ioc->name, ii));
|
ioc->name, ii));
|
||||||
r += (*(MptResetHandlers[ii]))(ioc, MPT_IOC_SETUP_RESET);
|
r += mpt_signal_reset(ii, ioc, MPT_IOC_SETUP_RESET);
|
||||||
if (ioc->alt_ioc) {
|
if (ioc->alt_ioc) {
|
||||||
dtmprintk((MYIOC_s_INFO_FMT "Calling alt-%s setup reset handler #%d\n",
|
dtmprintk((MYIOC_s_INFO_FMT "Calling alt-%s setup reset handler #%d\n",
|
||||||
ioc->name, ioc->alt_ioc->name, ii));
|
ioc->name, ioc->alt_ioc->name, ii));
|
||||||
r += (*(MptResetHandlers[ii]))(ioc->alt_ioc, MPT_IOC_SETUP_RESET);
|
r += mpt_signal_reset(ii, ioc->alt_ioc, MPT_IOC_SETUP_RESET);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue