Skip to content

Commit a715c7d

Browse files
Vladimir Kondratievlinvjw
authored andcommitted
wil6210: improve debug for WMI receive
Print message if no events received. This should not happen. If it is, it points to the problem in firmware. Track also cases when multiple events processed in one IRQ Print information as soon as possible - mbox pointers and event header right after reading it. This helps to identify potential problem with memory allocation for the event buffer. Signed-off-by: Vladimir Kondratiev <[email protected]> Signed-off-by: John W. Linville <[email protected]>
1 parent 8f1e5d3 commit a715c7d

File tree

1 file changed

+17
-7
lines changed
  • drivers/net/wireless/ath/wil6210

1 file changed

+17
-7
lines changed

drivers/net/wireless/ath/wil6210/wmi.c

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -659,35 +659,46 @@ void wmi_recv_cmd(struct wil6210_priv *wil)
659659
u8 *cmd;
660660
void __iomem *src;
661661
ulong flags;
662+
unsigned n;
662663

663664
if (!test_bit(wil_status_reset_done, &wil->status)) {
664665
wil_err(wil, "Reset not completed\n");
665666
return;
666667
}
667668

668-
for (;;) {
669+
for (n = 0;; n++) {
669670
u16 len;
670671

671672
r->head = ioread32(wil->csr + HOST_MBOX +
672673
offsetof(struct wil6210_mbox_ctl, rx.head));
673-
if (r->tail == r->head)
674+
if (r->tail == r->head) {
675+
if (n == 0)
676+
wil_dbg_wmi(wil, "No events?\n");
674677
return;
678+
}
675679

676-
/* read cmd from tail */
680+
wil_dbg_wmi(wil, "Mbox head %08x tail %08x\n",
681+
r->head, r->tail);
682+
/* read cmd descriptor from tail */
677683
wil_memcpy_fromio_32(&d_tail, wil->csr + HOSTADDR(r->tail),
678684
sizeof(struct wil6210_mbox_ring_desc));
679685
if (d_tail.sync == 0) {
680686
wil_err(wil, "Mbox evt not owned by FW?\n");
681687
return;
682688
}
683689

690+
/* read cmd header from descriptor */
684691
if (0 != wmi_read_hdr(wil, d_tail.addr, &hdr)) {
685692
wil_err(wil, "Mbox evt at 0x%08x?\n",
686693
le32_to_cpu(d_tail.addr));
687694
return;
688695
}
689-
690696
len = le16_to_cpu(hdr.len);
697+
wil_dbg_wmi(wil, "Mbox evt %04x %04x %04x %02x\n",
698+
le16_to_cpu(hdr.seq), len, le16_to_cpu(hdr.type),
699+
hdr.flags);
700+
701+
/* read cmd buffer from descriptor */
691702
src = wmi_buffer(wil, d_tail.addr) +
692703
sizeof(struct wil6210_mbox_hdr);
693704
evt = kmalloc(ALIGN(offsetof(struct pending_wmi_event,
@@ -703,9 +714,6 @@ void wmi_recv_cmd(struct wil6210_priv *wil)
703714
iowrite32(0, wil->csr + HOSTADDR(r->tail) +
704715
offsetof(struct wil6210_mbox_ring_desc, sync));
705716
/* indicate */
706-
wil_dbg_wmi(wil, "Mbox evt %04x %04x %04x %02x\n",
707-
le16_to_cpu(hdr.seq), len, le16_to_cpu(hdr.type),
708-
hdr.flags);
709717
if ((hdr.type == WIL_MBOX_HDR_TYPE_WMI) &&
710718
(len >= sizeof(struct wil6210_mbox_hdr_wmi))) {
711719
struct wil6210_mbox_hdr_wmi *wmi = &evt->event.wmi;
@@ -735,6 +743,8 @@ void wmi_recv_cmd(struct wil6210_priv *wil)
735743
wil_dbg_wmi(wil, "queue_work -> %d\n", q);
736744
}
737745
}
746+
if (n > 1)
747+
wil_dbg_wmi(wil, "%s -> %d events processed\n", __func__, n);
738748
}
739749

740750
int wmi_call(struct wil6210_priv *wil, u16 cmdid, void *buf, u16 len,

0 commit comments

Comments
 (0)