pci_ers_result_t result = PCI_ERS_RESULT_DISCONNECT;
        struct net_device *netdev = pci_get_drvdata(pdev);
        struct bnxt *bp = netdev_priv(netdev);
-       int err = 0, off;
+       int retry = 0;
+       int err = 0;
+       int off;
 
        netdev_info(bp->dev, "PCI Slot Reset\n");
 
                pci_restore_state(pdev);
                pci_save_state(pdev);
 
+               bnxt_inv_fw_health_reg(bp);
+               bnxt_try_map_fw_health_reg(bp);
+
+               /* In some PCIe AER scenarios, firmware may take up to
+                * 10 seconds to become ready in the worst case.
+                */
+               do {
+                       err = bnxt_try_recover_fw(bp);
+                       if (!err)
+                               break;
+                       retry++;
+               } while (retry < BNXT_FW_SLOT_RESET_RETRY);
+
+               if (err) {
+                       dev_err(&pdev->dev, "Firmware not ready\n");
+                       goto reset_exit;
+               }
+
                err = bnxt_hwrm_func_reset(bp);
                if (!err)
                        result = PCI_ERS_RESULT_RECOVERED;
+
+               bnxt_ulp_irq_stop(bp);
+               bnxt_clear_int_mode(bp);
+               err = bnxt_init_int_mode(bp);
+               bnxt_ulp_irq_restart(bp, err);
        }
 
+reset_exit:
+       bnxt_clear_reservations(bp, true);
        rtnl_unlock();
 
        return result;
 
                memset(ctx->resp, 0, PAGE_SIZE);
 
        req_type = le16_to_cpu(ctx->req->req_type);
-       if (BNXT_NO_FW_ACCESS(bp) && req_type != HWRM_FUNC_RESET) {
+       if (BNXT_NO_FW_ACCESS(bp) &&
+           (req_type != HWRM_FUNC_RESET && req_type != HWRM_VER_GET)) {
                netdev_dbg(bp->dev, "hwrm req_type 0x%x skipped, FW channel down\n",
                           req_type);
                goto exit;