brcmfmac: dump dongle memory when attaching failed
authorWright Feng <wright.feng@cypress.com>
Thu, 29 Sep 2022 03:10:01 +0000 (22:10 -0500)
committerKalle Valo <kvalo@kernel.org>
Tue, 4 Oct 2022 08:28:28 +0000 (11:28 +0300)
To enhance FW debugging, we add dongle memory dump when hitting attaching
failure with PCIE bus. It can help developer to get more information
about dongle trap reason and root cause.

Signed-off-by: Wright Feng <wright.feng@cypress.com>
Signed-off-by: Chi-hsien Lin <chi-hsien.lin@cypress.com>
Signed-off-by: Ian Lin <ian.lin@infineon.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20220929031001.9962-4-ian.lin@infineon.com
drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c

index 595ae3ae561ef20d69da0388813adfbd963ef560..d354f79fd0ac10684742c034be2b0782520ebb6f 100644 (file)
@@ -1399,7 +1399,8 @@ void brcmf_fw_crashed(struct device *dev)
 
        brcmf_dev_coredump(dev);
 
-       schedule_work(&drvr->bus_reset);
+       if (drvr->bus_reset.func)
+               schedule_work(&drvr->bus_reset);
 }
 
 void brcmf_detach(struct device *dev)
index 1becd50038ab6def53e4c086f2f4390dd9bd5c98..cf564adc612a2841938d3941dcd12a4e27ff71e2 100644 (file)
@@ -2068,13 +2068,14 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
        struct brcmf_commonring **flowrings;
        u32 i, nvram_len;
 
+       bus = dev_get_drvdata(dev);
+       pcie_bus_dev = bus->bus_priv.pcie;
+       devinfo = pcie_bus_dev->devinfo;
+
        /* check firmware loading result */
        if (ret)
                goto fail;
 
-       bus = dev_get_drvdata(dev);
-       pcie_bus_dev = bus->bus_priv.pcie;
-       devinfo = pcie_bus_dev->devinfo;
        brcmf_pcie_attach(devinfo);
 
        fw = fwreq->items[BRCMF_PCIE_FW_CODE].binary;
@@ -2148,6 +2149,9 @@ static void brcmf_pcie_setup(struct device *dev, int ret,
        return;
 
 fail:
+       brcmf_err(bus, "Dongle setup failed\n");
+       brcmf_pcie_bus_console_read(devinfo, true);
+       brcmf_fw_crashed(dev);
        device_release_driver(dev);
 }