Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 47dd82e3 authored by Rafał Miłecki's avatar Rafał Miłecki Committed by Kalle Valo
Browse files

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: default avatarRafał Miłecki <rafal@milecki.pl>
Reviewed-by: default avatarArend van Spriel <arend.vanspriel@broadcom.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 2d91c8ad
Loading
Loading
Loading
Loading
+18 −6
Original line number Diff line number Diff line
@@ -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,6 +803,9 @@ static void brcmf_pcie_bus_console_read(struct brcmf_pciedev_info *devinfo)
		}
		if (ch == '\n') {
			console->log_str[console->log_idx] = 0;
			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);