lkml.org 
[lkml]   [2012]   [Jan]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH] mpt2sas: fix non-x86 crash on shutdown
    From
    Date
    From: "nagalakshmi.nandigama@lsi.com" <nagalakshmi.nandigama@lsi.com>

    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>

    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 */



    \
     
     \ /
      Last update: 2012-01-04 16:27    [W:0.028 / U:0.116 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site