On Wed, Jan 04, 2012 at 09:25:13AM -0600, James Bottomley wrote: > From: "nagalakshmi.nandigama@xxxxxxx" <nagalakshmi.nandigama@xxxxxxx> That's not a correct "from" line, sorry. That would create a mess of the log. Oh, I see Linus's tree is already a mess here, ugh. Please be more careful when accepting patches, otherwise stuff like this causes me to have to hand-edit the kernel git logs when I run the "who does what" statistic reports... David, any objection for me taking this patch (left below) instead of your original one for the stable tree? thanks, greg k-h > 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@xxxxxxx> > Signed-off-by: James Bottomley <JBottomley@xxxxxxxxxxxxx> > > diff --git a/drivers/scsi/mpt2sas/mpt2sas_base.c b/drivers/scsi/mpt2sas/mpt2sas_base.c > index 83035bd..39e81cd 100644 > --- a/drivers/scsi/mpt2sas/mpt2sas_base.c > +++ b/drivers/scsi/mpt2sas/mpt2sas_base.c > @@ -1082,41 +1082,6 @@ _base_config_dma_addressing(struct MPT2SAS_ADAPTER *ioc, struct pci_dev *pdev) > } > > /** > - * _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; > > diff --git a/drivers/scsi/mpt2sas/mpt2sas_base.h b/drivers/scsi/mpt2sas/mpt2sas_base.h > index 8d5be21..7df640f 100644 > --- a/drivers/scsi/mpt2sas/mpt2sas_base.h > +++ b/drivers/scsi/mpt2sas/mpt2sas_base.h > @@ -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 */ > > > -- > To unsubscribe from this list: send the line "unsubscribe stable" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html