mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-17 18:56:24 +00:00
mpt2sas: fix non-x86 crash on shutdown
Upstrem commit: 911ae9434f83e7355d343f6c2be3ef5b00ea7aed There's a bug in the MSIX backup and restore routines that cause a crash on non-x86 (direct access to PCI space not via read/write). These routines are unnecessary and were removed by the above commit, so also remove them from stable to fix the crash. Signed-off-by: Nagalakshmi Nandigama <nagalakshmi.nandigama@lsi.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
43dc85715b
commit
ec89dadb52
@ -1081,41 +1081,6 @@ _base_config_dma_addressing(struct MPT2SAS_ADAPTER *ioc, struct pci_dev *pdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* _base_save_msix_table - backup msix vector table
|
||||
* @ioc: per adapter object
|
||||
*
|
||||
* This address an errata where diag reset clears out the table
|
||||
*/
|
||||
static void
|
||||
_base_save_msix_table(struct MPT2SAS_ADAPTER *ioc)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!ioc->msix_enable || ioc->msix_table_backup == NULL)
|
||||
return;
|
||||
|
||||
for (i = 0; i < ioc->msix_vector_count; i++)
|
||||
ioc->msix_table_backup[i] = ioc->msix_table[i];
|
||||
}
|
||||
|
||||
/**
|
||||
* _base_restore_msix_table - this restores the msix vector table
|
||||
* @ioc: per adapter object
|
||||
*
|
||||
*/
|
||||
static void
|
||||
_base_restore_msix_table(struct MPT2SAS_ADAPTER *ioc)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!ioc->msix_enable || ioc->msix_table_backup == NULL)
|
||||
return;
|
||||
|
||||
for (i = 0; i < ioc->msix_vector_count; i++)
|
||||
ioc->msix_table[i] = ioc->msix_table_backup[i];
|
||||
}
|
||||
|
||||
/**
|
||||
* _base_check_enable_msix - checks MSIX capabable.
|
||||
* @ioc: per adapter object
|
||||
@ -1128,7 +1093,7 @@ _base_check_enable_msix(struct MPT2SAS_ADAPTER *ioc)
|
||||
{
|
||||
int base;
|
||||
u16 message_control;
|
||||
u32 msix_table_offset;
|
||||
|
||||
|
||||
base = pci_find_capability(ioc->pdev, PCI_CAP_ID_MSIX);
|
||||
if (!base) {
|
||||
@ -1141,14 +1106,8 @@ _base_check_enable_msix(struct MPT2SAS_ADAPTER *ioc)
|
||||
pci_read_config_word(ioc->pdev, base + 2, &message_control);
|
||||
ioc->msix_vector_count = (message_control & 0x3FF) + 1;
|
||||
|
||||
/* get msix table */
|
||||
pci_read_config_dword(ioc->pdev, base + 4, &msix_table_offset);
|
||||
msix_table_offset &= 0xFFFFFFF8;
|
||||
ioc->msix_table = (u32 *)((void *)ioc->chip + msix_table_offset);
|
||||
|
||||
dinitprintk(ioc, printk(MPT2SAS_INFO_FMT "msix is supported, "
|
||||
"vector_count(%d), table_offset(0x%08x), table(%p)\n", ioc->name,
|
||||
ioc->msix_vector_count, msix_table_offset, ioc->msix_table));
|
||||
"vector_count(%d)\n", ioc->name, ioc->msix_vector_count));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1162,8 +1121,6 @@ _base_disable_msix(struct MPT2SAS_ADAPTER *ioc)
|
||||
{
|
||||
if (ioc->msix_enable) {
|
||||
pci_disable_msix(ioc->pdev);
|
||||
kfree(ioc->msix_table_backup);
|
||||
ioc->msix_table_backup = NULL;
|
||||
ioc->msix_enable = 0;
|
||||
}
|
||||
}
|
||||
@ -1189,14 +1146,6 @@ _base_enable_msix(struct MPT2SAS_ADAPTER *ioc)
|
||||
if (_base_check_enable_msix(ioc) != 0)
|
||||
goto try_ioapic;
|
||||
|
||||
ioc->msix_table_backup = kcalloc(ioc->msix_vector_count,
|
||||
sizeof(u32), GFP_KERNEL);
|
||||
if (!ioc->msix_table_backup) {
|
||||
dfailprintk(ioc, printk(MPT2SAS_INFO_FMT "allocation for "
|
||||
"msix_table_backup failed!!!\n", ioc->name));
|
||||
goto try_ioapic;
|
||||
}
|
||||
|
||||
memset(&entries, 0, sizeof(struct msix_entry));
|
||||
r = pci_enable_msix(ioc->pdev, &entries, 1);
|
||||
if (r) {
|
||||
@ -3513,9 +3462,6 @@ _base_diag_reset(struct MPT2SAS_ADAPTER *ioc, int sleep_flag)
|
||||
u32 hcb_size;
|
||||
|
||||
printk(MPT2SAS_INFO_FMT "sending diag reset !!\n", ioc->name);
|
||||
|
||||
_base_save_msix_table(ioc);
|
||||
|
||||
drsprintk(ioc, printk(MPT2SAS_INFO_FMT "clear interrupts\n",
|
||||
ioc->name));
|
||||
|
||||
@ -3611,7 +3557,6 @@ _base_diag_reset(struct MPT2SAS_ADAPTER *ioc, int sleep_flag)
|
||||
goto out;
|
||||
}
|
||||
|
||||
_base_restore_msix_table(ioc);
|
||||
printk(MPT2SAS_INFO_FMT "diag reset: SUCCESS\n", ioc->name);
|
||||
return 0;
|
||||
|
||||
|
@ -636,8 +636,6 @@ enum mutex_type {
|
||||
* @wait_for_port_enable_to_complete:
|
||||
* @msix_enable: flag indicating msix is enabled
|
||||
* @msix_vector_count: number msix vectors
|
||||
* @msix_table: virt address to the msix table
|
||||
* @msix_table_backup: backup msix table
|
||||
* @scsi_io_cb_idx: shost generated commands
|
||||
* @tm_cb_idx: task management commands
|
||||
* @scsih_cb_idx: scsih internal commands
|
||||
@ -779,8 +777,6 @@ struct MPT2SAS_ADAPTER {
|
||||
|
||||
u8 msix_enable;
|
||||
u16 msix_vector_count;
|
||||
u32 *msix_table;
|
||||
u32 *msix_table_backup;
|
||||
u32 ioc_reset_count;
|
||||
|
||||
/* internal commands, callback index */
|
||||
|
Loading…
x
Reference in New Issue
Block a user