[SCSI] lpfc 8.3.9: PCI Changes to lpfc driver
authorJames Smart <james.smart@emulex.com>
Fri, 12 Feb 2010 19:40:50 +0000 (14:40 -0500)
committerJames Bottomley <James.Bottomley@suse.de>
Wed, 17 Feb 2010 23:40:08 +0000 (17:40 -0600)
- Call pci_save_state() after pci_restore_state() call to cope
  with kernel change.
- Add support for PCI BAR region 0 if BAR0 is a 64 bit register.

Signed-off-by: James Smart <james.smart@emulex.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
drivers/scsi/lpfc/lpfc_hw4.h
drivers/scsi/lpfc/lpfc_init.c

index c2bec6e6222fb05e771e4543f97e9407dd6d5513..ae0c53dba8455c4345b748b2c98e119d4113b9f7 100644 (file)
@@ -77,10 +77,6 @@ struct lpfc_sli_intf {
 #define LPFC_SLI_INTF_VALID            6
 };
 
-#define LPFC_SLI4_BAR0         1
-#define LPFC_SLI4_BAR1         2
-#define LPFC_SLI4_BAR2         4
-
 #define LPFC_SLI4_MBX_EMBED    true
 #define LPFC_SLI4_MBX_NEMBED   false
 
index 52fc758b8f7788fe3f0fe4a668574664f3d86f32..25a97dfd4ea7a2aefa379284b28e677eac80adda 100644 (file)
@@ -6079,16 +6079,20 @@ lpfc_sli4_pci_mem_setup(struct lpfc_hba *phba)
 
        /* Get the bus address of SLI4 device Bar0, Bar1, and Bar2 and the
         * number of bytes required by each mapping. They are actually
-        * mapping to the PCI BAR regions 1, 2, and 4 by the SLI4 device.
+        * mapping to the PCI BAR regions 0 or 1, 2, and 4 by the SLI4 device.
         */
-       phba->pci_bar0_map = pci_resource_start(pdev, LPFC_SLI4_BAR0);
-       bar0map_len = pci_resource_len(pdev, LPFC_SLI4_BAR0);
-
-       phba->pci_bar1_map = pci_resource_start(pdev, LPFC_SLI4_BAR1);
-       bar1map_len = pci_resource_len(pdev, LPFC_SLI4_BAR1);
+       if (pci_resource_start(pdev, 0)) {
+               phba->pci_bar0_map = pci_resource_start(pdev, 0);
+               bar0map_len = pci_resource_len(pdev, 0);
+       } else {
+               phba->pci_bar0_map = pci_resource_start(pdev, 1);
+               bar0map_len = pci_resource_len(pdev, 1);
+       }
+       phba->pci_bar1_map = pci_resource_start(pdev, 2);
+       bar1map_len = pci_resource_len(pdev, 2);
 
-       phba->pci_bar2_map = pci_resource_start(pdev, LPFC_SLI4_BAR2);
-       bar2map_len = pci_resource_len(pdev, LPFC_SLI4_BAR2);
+       phba->pci_bar2_map = pci_resource_start(pdev, 4);
+       bar2map_len = pci_resource_len(pdev, 4);
 
        /* Map SLI4 PCI Config Space Register base to a kernel virtual addr */
        phba->sli4_hba.conf_regs_memmap_p =
@@ -7174,6 +7178,12 @@ lpfc_pci_resume_one_s3(struct pci_dev *pdev)
        pci_set_power_state(pdev, PCI_D0);
        pci_restore_state(pdev);
 
+       /*
+        * As the new kernel behavior of pci_restore_state() API call clears
+        * device saved_state flag, need to save the restored state again.
+        */
+       pci_save_state(pdev);
+
        if (pdev->is_busmaster)
                pci_set_master(pdev);
 
@@ -7357,6 +7367,13 @@ lpfc_io_slot_reset_s3(struct pci_dev *pdev)
        }
 
        pci_restore_state(pdev);
+
+       /*
+        * As the new kernel behavior of pci_restore_state() API call clears
+        * device saved_state flag, need to save the restored state again.
+        */
+       pci_save_state(pdev);
+
        if (pdev->is_busmaster)
                pci_set_master(pdev);
 
@@ -7766,6 +7783,13 @@ lpfc_pci_resume_one_s4(struct pci_dev *pdev)
        /* Restore device state from PCI config space */
        pci_set_power_state(pdev, PCI_D0);
        pci_restore_state(pdev);
+
+       /*
+        * As the new kernel behavior of pci_restore_state() API call clears
+        * device saved_state flag, need to save the restored state again.
+        */
+       pci_save_state(pdev);
+
        if (pdev->is_busmaster)
                pci_set_master(pdev);