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

Commit 482b30b6 authored by Oleksij Rempel's avatar Oleksij Rempel Committed by John W. Linville
Browse files

ath9k_htc: catch fw panic pattern



... and print what we get.

Signed-off-by: default avatarOleksij Rempel <linux@rempel-privat.de>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent c8ec0f5c
Loading
Loading
Loading
Loading
+36 −0
Original line number Diff line number Diff line
@@ -358,6 +358,36 @@ void ath9k_htc_txcompletion_cb(struct htc_target *htc_handle,
		kfree_skb(skb);
}

static void ath9k_htc_fw_panic_report(struct htc_target *htc_handle,
				      struct sk_buff *skb)
{
	uint32_t *pattern = (uint32_t *)skb->data;

	switch (*pattern) {
	case 0x33221199:
		{
		struct htc_panic_bad_vaddr *htc_panic;
		htc_panic = (struct htc_panic_bad_vaddr *) skb->data;
		dev_err(htc_handle->dev, "ath: firmware panic! "
			"exccause: 0x%08x; pc: 0x%08x; badvaddr: 0x%08x.\n",
			htc_panic->exccause, htc_panic->pc,
			htc_panic->badvaddr);
		break;
		}
	case 0x33221299:
		{
		struct htc_panic_bad_epid *htc_panic;
		htc_panic = (struct htc_panic_bad_epid *) skb->data;
		dev_err(htc_handle->dev, "ath: firmware panic! "
			"bad epid: 0x%08x\n", htc_panic->epid);
		break;
		}
	default:
		dev_err(htc_handle->dev, "ath: uknown panic pattern!\n");
		break;
	}
}

/*
 * HTC Messages are handled directly here and the obtained SKB
 * is freed.
@@ -379,6 +409,12 @@ void ath9k_htc_rx_msg(struct htc_target *htc_handle,
	htc_hdr = (struct htc_frame_hdr *) skb->data;
	epid = htc_hdr->endpoint_id;

	if (epid == 0x99) {
		ath9k_htc_fw_panic_report(htc_handle, skb);
		kfree_skb(skb);
		return;
	}

	if (epid >= ENDPOINT_MAX) {
		if (pipe_id != USB_REG_IN_PIPE)
			dev_kfree_skb_any(skb);
+12 −0
Original line number Diff line number Diff line
@@ -77,6 +77,18 @@ struct htc_config_pipe_msg {
	u8 credits;
} __packed;

struct htc_panic_bad_vaddr {
	__be32 pattern;
	__be32 exccause;
	__be32 pc;
	__be32 badvaddr;
} __packed;

struct htc_panic_bad_epid {
	__be32 pattern;
	__be32 epid;
} __packed;

struct htc_ep_callbacks {
	void *priv;
	void (*tx) (void *, struct sk_buff *, enum htc_endpoint_id, bool txok);