]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
ionic: no fw read when PCI reset failed
authorShannon Nelson <shannon.nelson@amd.com>
Mon, 11 Dec 2023 18:58:01 +0000 (10:58 -0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 13 Dec 2023 12:35:55 +0000 (12:35 +0000)
If there was a failed attempt to reset the PCI connection,
don't later try to read from PCI as the space is unmapped
and will cause a paging request crash.  When clearing the PCI
setup we can clear the dev_info register pointer, and check
it before using it in the fw_running test.

Signed-off-by: Shannon Nelson <shannon.nelson@amd.com>
Reviewed-by: Brett Creeley <brett.creeley@amd.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/pensando/ionic/ionic_bus_pci.c
drivers/net/ethernet/pensando/ionic/ionic_dev.c

index da951dc7becb275617600628b53d8c0dd5ef0694..311d9f4ef0e247a750bc60e63e261512efd1c14f 100644 (file)
@@ -215,6 +215,11 @@ out:
 
 static void ionic_clear_pci(struct ionic *ionic)
 {
+       ionic->idev.dev_info_regs = NULL;
+       ionic->idev.dev_cmd_regs = NULL;
+       ionic->idev.intr_status = NULL;
+       ionic->idev.intr_ctrl = NULL;
+
        ionic_unmap_bars(ionic);
        pci_release_regions(ionic->pdev);
 
index c0b347dd6bae45e1b3f6519d79657fc736118fc9..1e7c71f7f081b159e83271eeeb47eb35ac401d69 100644 (file)
@@ -165,9 +165,19 @@ void ionic_dev_teardown(struct ionic *ionic)
 }
 
 /* Devcmd Interface */
-bool ionic_is_fw_running(struct ionic_dev *idev)
+static bool __ionic_is_fw_running(struct ionic_dev *idev, u8 *status_ptr)
 {
-       u8 fw_status = ioread8(&idev->dev_info_regs->fw_status);
+       u8 fw_status;
+
+       if (!idev->dev_info_regs) {
+               if (status_ptr)
+                       *status_ptr = 0xff;
+               return false;
+       }
+
+       fw_status = ioread8(&idev->dev_info_regs->fw_status);
+       if (status_ptr)
+               *status_ptr = fw_status;
 
        /* firmware is useful only if the running bit is set and
         * fw_status != 0xff (bad PCI read)
@@ -175,6 +185,11 @@ bool ionic_is_fw_running(struct ionic_dev *idev)
        return (fw_status != 0xff) && (fw_status & IONIC_FW_STS_F_RUNNING);
 }
 
+bool ionic_is_fw_running(struct ionic_dev *idev)
+{
+       return __ionic_is_fw_running(idev, NULL);
+}
+
 int ionic_heartbeat_check(struct ionic *ionic)
 {
        unsigned long check_time, last_check_time;
@@ -199,10 +214,8 @@ do_check_time:
                goto do_check_time;
        }
 
-       fw_status = ioread8(&idev->dev_info_regs->fw_status);
-
        /* If fw_status is not ready don't bother with the generation */
-       if (!ionic_is_fw_running(idev)) {
+       if (!__ionic_is_fw_running(idev, &fw_status)) {
                fw_status_ready = false;
        } else {
                fw_generation = fw_status & IONIC_FW_STS_F_GENERATION;