From: Ben Greear <[email protected]>

I believe the CE tx buffer reaping logic may be able to fall
behind in certain cases (lots of serial console logging, lots
of WMI messages).

Dropping WMI messages is a very serious problem, so it is worth
waiting a bit in hopes the tx buffers become available again.

Signed-off-by: Ben Greear <[email protected]>
---

Probably the ath10k_err should be made dbg or rate-limited before
this goes upstream..in meantime, it might help shed some light on
this problem.

 drivers/net/wireless/ath/ath10k/wmi.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ath/ath10k/wmi.c 
b/drivers/net/wireless/ath/ath10k/wmi.c
index f042711..43d23fc 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.c
+++ b/drivers/net/wireless/ath/ath10k/wmi.c
@@ -1819,6 +1819,7 @@ static void ath10k_wmi_op_ep_tx_credits(struct ath10k *ar)
 int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id)
 {
        int ret = -EOPNOTSUPP;
+       int retry = 1000;
 
        might_sleep();
 
@@ -1832,7 +1833,19 @@ int ath10k_wmi_cmd_send(struct ath10k *ar, struct 
sk_buff *skb, u32 cmd_id)
                /* try to send pending beacons first. they take priority */
                ath10k_wmi_tx_beacons_nowait(ar);
 
-               ret = ath10k_wmi_cmd_send_nowait(ar, skb, cmd_id);
+               while (--retry) {
+                       ret = ath10k_wmi_cmd_send_nowait(ar, skb, cmd_id);
+                       if ((ret == -ENOBUFS) &&
+                           !test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags)) 
{
+                               /* CE transport logic is full, maybe we cannot 
reap entries fast
+                                * enough?
+                                */
+                               ath10k_err(ar, "CE transport is full, sleeping 
for 1ms\n");
+                               msleep(1);
+                               continue;
+                       }
+                       break;
+               }
 
                if (ret && test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags))
                        ret = -ESHUTDOWN;
-- 
2.4.3


_______________________________________________
ath10k mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/ath10k

Reply via email to