mbox->mapaddr);
 }
 
-static int mlxsw_pci_sw_reset(struct mlxsw_pci *mlxsw_pci,
-                             const struct pci_device_id *id)
+static int mlxsw_pci_sys_ready_wait(struct mlxsw_pci *mlxsw_pci,
+                                   const struct pci_device_id *id,
+                                   u32 *p_sys_status)
 {
        unsigned long end;
-       char mrsr_pl[MLXSW_REG_MRSR_LEN];
-       int err;
+       u32 val;
 
-       mlxsw_reg_mrsr_pack(mrsr_pl);
-       err = mlxsw_reg_write(mlxsw_pci->core, MLXSW_REG(mrsr), mrsr_pl);
-       if (err)
-               return err;
        if (id->device == PCI_DEVICE_ID_MELLANOX_SWITCHX2) {
                msleep(MLXSW_PCI_SW_RESET_TIMEOUT_MSECS);
                return 0;
        }
 
-       /* We must wait for the HW to become responsive once again. */
+       /* We must wait for the HW to become responsive. */
        msleep(MLXSW_PCI_SW_RESET_WAIT_MSECS);
 
        end = jiffies + msecs_to_jiffies(MLXSW_PCI_SW_RESET_TIMEOUT_MSECS);
        do {
-               u32 val = mlxsw_pci_read32(mlxsw_pci, FW_READY);
-
+               val = mlxsw_pci_read32(mlxsw_pci, FW_READY);
                if ((val & MLXSW_PCI_FW_READY_MASK) == MLXSW_PCI_FW_READY_MAGIC)
                        return 0;
                cond_resched();
        } while (time_before(jiffies, end));
+
+       *p_sys_status = val & MLXSW_PCI_FW_READY_MASK;
+
        return -EBUSY;
 }
 
+static int mlxsw_pci_sw_reset(struct mlxsw_pci *mlxsw_pci,
+                             const struct pci_device_id *id)
+{
+       struct pci_dev *pdev = mlxsw_pci->pdev;
+       char mrsr_pl[MLXSW_REG_MRSR_LEN];
+       u32 sys_status;
+       int err;
+
+       err = mlxsw_pci_sys_ready_wait(mlxsw_pci, id, &sys_status);
+       if (err) {
+               dev_err(&pdev->dev, "Failed to reach system ready status before reset. Status is 0x%x\n",
+                       sys_status);
+               return err;
+       }
+
+       mlxsw_reg_mrsr_pack(mrsr_pl);
+       err = mlxsw_reg_write(mlxsw_pci->core, MLXSW_REG(mrsr), mrsr_pl);
+       if (err)
+               return err;
+
+       err = mlxsw_pci_sys_ready_wait(mlxsw_pci, id, &sys_status);
+       if (err) {
+               dev_err(&pdev->dev, "Failed to reach system ready status after reset. Status is 0x%x\n",
+                       sys_status);
+               return err;
+       }
+
+       return 0;
+}
+
 static int mlxsw_pci_alloc_irq_vectors(struct mlxsw_pci *mlxsw_pci)
 {
        int err;