[SCSI] megaraid_sas: Fix probe_one to clear MSI-X flags in kdump
authoradam radford <aradford@gmail.com>
Fri, 25 Feb 2011 04:56:28 +0000 (20:56 -0800)
committerJames Bottomley <James.Bottomley@suse.de>
Mon, 28 Feb 2011 17:47:48 +0000 (11:47 -0600)
The following patch for megaraid_sas fixes megasas_probe_one() to
clear MSI-X flags in kdump when the 'reset_devices' kernel parameter
is passed in.

Signed-off-by: Adam Radford <aradford@gmail.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
drivers/scsi/megaraid/megaraid_sas.h
drivers/scsi/megaraid/megaraid_sas_base.c

index 1b5e375..e00ee4a 100644 (file)
@@ -1477,4 +1477,7 @@ struct megasas_mgmt_info {
        int max_index;
 };
 
+#define msi_control_reg(base) (base + PCI_MSI_FLAGS)
+#define PCI_MSIX_FLAGS_ENABLE (1 << 15)
+
 #endif                         /*LSI_MEGARAID_SAS_H */
index 050ec16..a521e1a 100644 (file)
@@ -3901,9 +3901,26 @@ fail_set_dma_mask:
 static int __devinit
 megasas_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
 {
-       int rval;
+       int rval, pos;
        struct Scsi_Host *host;
        struct megasas_instance *instance;
+       u16 control = 0;
+
+       /* Reset MSI-X in the kdump kernel */
+       if (reset_devices) {
+               pos = pci_find_capability(pdev, PCI_CAP_ID_MSIX);
+               if (pos) {
+                       pci_read_config_word(pdev, msi_control_reg(pos),
+                                            &control);
+                       if (control & PCI_MSIX_FLAGS_ENABLE) {
+                               dev_info(&pdev->dev, "resetting MSI-X\n");
+                               pci_write_config_word(pdev,
+                                                     msi_control_reg(pos),
+                                                     control &
+                                                     ~PCI_MSIX_FLAGS_ENABLE);
+                       }
+               }
+       }
 
        /*
         * Announce PCI information