brcmfmac: print firmware messages after a firmware crash
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 <rafal@milecki.pl> Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
This commit is contained in:
parent
2d91c8ad06
commit
47dd82e3d2
@ -764,15 +764,22 @@ static void brcmf_pcie_bus_console_init(struct brcmf_pciedev_info *devinfo)
|
||||
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(struct brcmf_pciedev_info *devinfo)
|
||||
}
|
||||
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(int irq, void *arg)
|
||||
&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 device *dev)
|
||||
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 device *dev, int ret,
|
||||
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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user