|
|
@@ -0,0 +1,90 @@
|
|
|
+From 47dd82e3d25e85a7c7c4e4b0eac9d297d1e5e2d4 Mon Sep 17 00:00:00 2001
|
|
|
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <[email protected]>
|
|
|
+Date: Sun, 28 Apr 2019 23:38:26 +0200
|
|
|
+Subject: [PATCH] brcmfmac: print firmware messages after a firmware crash
|
|
|
+MIME-Version: 1.0
|
|
|
+Content-Type: text/plain; charset=UTF-8
|
|
|
+Content-Transfer-Encoding: 8bit
|
|
|
+
|
|
|
+Normally firmware messages are printed with debugging enabled only. It's
|
|
|
+a good idea as firmware may print a lot of messages that normal users
|
|
|
+don't need to care about.
|
|
|
+
|
|
|
+However, on firmware crash, it may be very helpful to log all recent
|
|
|
+messages. There is almost always a backtrace available as well as rought
|
|
|
+info on the latest actions/state.
|
|
|
+
|
|
|
+Signed-off-by: Rafał Miłecki <[email protected]>
|
|
|
+Reviewed-by: Arend van Spriel <[email protected]>
|
|
|
+Signed-off-by: Kalle Valo <[email protected]>
|
|
|
+---
|
|
|
+ .../broadcom/brcm80211/brcmfmac/pcie.c | 24 ++++++++++++++-----
|
|
|
+ 1 file changed, 18 insertions(+), 6 deletions(-)
|
|
|
+
|
|
|
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
|
|
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
|
|
+@@ -764,15 +764,22 @@ static void brcmf_pcie_bus_console_init(
|
|
|
+ console->base_addr, console->buf_addr, console->bufsize);
|
|
|
+ }
|
|
|
+
|
|
|
+-
|
|
|
+-static void brcmf_pcie_bus_console_read(struct brcmf_pciedev_info *devinfo)
|
|
|
++/**
|
|
|
++ * brcmf_pcie_bus_console_read - reads firmware messages
|
|
|
++ *
|
|
|
++ * @error: specifies if error has occurred (prints messages unconditionally)
|
|
|
++ */
|
|
|
++static void brcmf_pcie_bus_console_read(struct brcmf_pciedev_info *devinfo,
|
|
|
++ bool error)
|
|
|
+ {
|
|
|
++ struct pci_dev *pdev = devinfo->pdev;
|
|
|
++ struct brcmf_bus *bus = dev_get_drvdata(&pdev->dev);
|
|
|
+ struct brcmf_pcie_console *console;
|
|
|
+ u32 addr;
|
|
|
+ u8 ch;
|
|
|
+ u32 newidx;
|
|
|
+
|
|
|
+- if (!BRCMF_FWCON_ON())
|
|
|
++ if (!error && !BRCMF_FWCON_ON())
|
|
|
+ return;
|
|
|
+
|
|
|
+ console = &devinfo->shared.console;
|
|
|
+@@ -796,7 +803,10 @@ static void brcmf_pcie_bus_console_read(
|
|
|
+ }
|
|
|
+ if (ch == '\n') {
|
|
|
+ console->log_str[console->log_idx] = 0;
|
|
|
+- pr_debug("CONSOLE: %s", console->log_str);
|
|
|
++ if (error)
|
|
|
++ brcmf_err(bus, "CONSOLE: %s", console->log_str);
|
|
|
++ else
|
|
|
++ pr_debug("CONSOLE: %s", console->log_str);
|
|
|
+ console->log_idx = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+@@ -857,7 +867,7 @@ static irqreturn_t brcmf_pcie_isr_thread
|
|
|
+ &devinfo->pdev->dev);
|
|
|
+ }
|
|
|
+ }
|
|
|
+- brcmf_pcie_bus_console_read(devinfo);
|
|
|
++ brcmf_pcie_bus_console_read(devinfo, false);
|
|
|
+ if (devinfo->state == BRCMFMAC_PCIE_STATE_UP)
|
|
|
+ brcmf_pcie_intr_enable(devinfo);
|
|
|
+ devinfo->in_irq = false;
|
|
|
+@@ -1426,6 +1436,8 @@ static int brcmf_pcie_reset(struct devic
|
|
|
+ struct brcmf_fw_request *fwreq;
|
|
|
+ int err;
|
|
|
+
|
|
|
++ brcmf_pcie_bus_console_read(devinfo, true);
|
|
|
++
|
|
|
+ brcmf_detach(dev);
|
|
|
+
|
|
|
+ brcmf_pcie_release_irq(devinfo);
|
|
|
+@@ -1818,7 +1830,7 @@ static void brcmf_pcie_setup(struct devi
|
|
|
+ if (brcmf_attach(&devinfo->pdev->dev, devinfo->settings) == 0)
|
|
|
+ return;
|
|
|
+
|
|
|
+- brcmf_pcie_bus_console_read(devinfo);
|
|
|
++ brcmf_pcie_bus_console_read(devinfo, false);
|
|
|
+
|
|
|
+ fail:
|
|
|
+ device_release_driver(dev);
|