|
@@ -1282,6 +1282,24 @@ static bool nvme_should_reset(struct nvme_dev *dev, u32 csts)
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void nvme_warn_reset(struct nvme_dev *dev, u32 csts)
|
|
|
|
+{
|
|
|
|
+ /* Read a config register to help see what died. */
|
|
|
|
+ u16 pci_status;
|
|
|
|
+ int result;
|
|
|
|
+
|
|
|
|
+ result = pci_read_config_word(to_pci_dev(dev->dev), PCI_STATUS,
|
|
|
|
+ &pci_status);
|
|
|
|
+ if (result == PCIBIOS_SUCCESSFUL)
|
|
|
|
+ dev_warn(dev->dev,
|
|
|
|
+ "controller is down; will reset: CSTS=0x%x, PCI_STATUS=0x%hx\n",
|
|
|
|
+ csts, pci_status);
|
|
|
|
+ else
|
|
|
|
+ dev_warn(dev->dev,
|
|
|
|
+ "controller is down; will reset: CSTS=0x%x, PCI_STATUS read failed (%d)\n",
|
|
|
|
+ csts, result);
|
|
|
|
+}
|
|
|
|
+
|
|
static void nvme_watchdog_timer(unsigned long data)
|
|
static void nvme_watchdog_timer(unsigned long data)
|
|
{
|
|
{
|
|
struct nvme_dev *dev = (struct nvme_dev *)data;
|
|
struct nvme_dev *dev = (struct nvme_dev *)data;
|
|
@@ -1290,9 +1308,7 @@ static void nvme_watchdog_timer(unsigned long data)
|
|
/* Skip controllers under certain specific conditions. */
|
|
/* Skip controllers under certain specific conditions. */
|
|
if (nvme_should_reset(dev, csts)) {
|
|
if (nvme_should_reset(dev, csts)) {
|
|
if (!nvme_reset(dev))
|
|
if (!nvme_reset(dev))
|
|
- dev_warn(dev->dev,
|
|
|
|
- "Failed status: 0x%x, reset controller.\n",
|
|
|
|
- csts);
|
|
|
|
|
|
+ nvme_warn_reset(dev, csts);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|