scsi: lpfc: Stop adapter if pci errors detected
authorJames Smart <jsmart2021@gmail.com>
Tue, 12 Mar 2019 23:30:13 +0000 (16:30 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 19 Mar 2019 16:57:02 +0000 (12:57 -0400)
In a couple of cases, the driver detected a pci error (via pci device state
or via failed register reads) but didn't take any action to disable the
device.  Additionally, the driver is ignoring the status of pci
configuration space reads.

Having the driver take the adapter offline whenever the pci error is
detected.  Pay attention to pci_config_space_read status and return failure
if an error is seen.

Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <jsmart2021@gmail.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc_init.c
drivers/scsi/lpfc/lpfc_sli.c

index 291ad3b10d563997e796b3c6c8a10a5d895433b3..4644cea2e5ce4ecfdc3ec9652f59ddb0c290feee 100644 (file)
@@ -1844,8 +1844,12 @@ lpfc_handle_eratt_s4(struct lpfc_hba *phba)
        /* If the pci channel is offline, ignore possible errors, since
         * we cannot communicate with the pci card anyway.
         */
-       if (pci_channel_offline(phba->pcidev))
+       if (pci_channel_offline(phba->pcidev)) {
+               lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
+                               "3166 pci channel is offline\n");
+               lpfc_sli4_offline_eratt(phba);
                return;
+       }
 
        memset(&portsmphr_reg, 0, sizeof(portsmphr_reg));
        if_type = bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf);
@@ -1922,6 +1926,7 @@ lpfc_handle_eratt_s4(struct lpfc_hba *phba)
                        lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
                                "3151 PCI bus read access failure: x%x\n",
                                readl(phba->sli4_hba.u.if_type2.STATUSregaddr));
+                       lpfc_sli4_offline_eratt(phba);
                        return;
                }
                reg_err1 = readl(phba->sli4_hba.u.if_type2.ERR1regaddr);
index c82304c11ef2584e164a72aa278210deb7a8e8d0..32ded3e9b32e15e50420736a39ad55ff763986b4 100644 (file)
@@ -4487,7 +4487,9 @@ lpfc_sli_brdreset(struct lpfc_hba *phba)
        }
 
        /* Turn off parity checking and serr during the physical reset */
-       pci_read_config_word(phba->pcidev, PCI_COMMAND, &cfg_value);
+       if (pci_read_config_word(phba->pcidev, PCI_COMMAND, &cfg_value))
+               return -EIO;
+
        pci_write_config_word(phba->pcidev, PCI_COMMAND,
                              (cfg_value &
                               ~(PCI_COMMAND_PARITY | PCI_COMMAND_SERR)));
@@ -4564,7 +4566,12 @@ lpfc_sli4_brdreset(struct lpfc_hba *phba)
                        "0389 Performing PCI function reset!\n");
 
        /* Turn off parity checking and serr during the physical reset */
-       pci_read_config_word(phba->pcidev, PCI_COMMAND, &cfg_value);
+       if (pci_read_config_word(phba->pcidev, PCI_COMMAND, &cfg_value)) {
+               lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
+                               "3205 PCI read Config failed\n");
+               return -EIO;
+       }
+
        pci_write_config_word(phba->pcidev, PCI_COMMAND, (cfg_value &
                              ~(PCI_COMMAND_PARITY | PCI_COMMAND_SERR)));