]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
wil6210: increase the frequency of status ring hw tail update
authorAhmad Masri <amasri@codeaurora.org>
Sun, 16 Jun 2019 07:25:59 +0000 (10:25 +0300)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 27 Jun 2019 17:49:52 +0000 (20:49 +0300)
The driver updates Tx status ring HW tail only after it finishes
processing the whole status ring, while the HW is still transmitting
from other transmit rings. This can cause back-pressure on HW if
no status entries are available.

Update HW tail of Tx status ring without waiting for the end of the
processing to help feeding back the HW with status entries and to allow
additional packet transmission.

Signed-off-by: Ahmad Masri <amasri@codeaurora.org>
Signed-off-by: Maya Erez <merez@codeaurora.org>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/ath/wil6210/txrx_edma.c

index 6140db5960c36a00f6d6c824d8cdcf9c72553ef0..dc040cd4ab064ed4915ff7b733484824c6d35cae 100644 (file)
 #include "txrx.h"
 #include "trace.h"
 
+/* Max number of entries (packets to complete) to update the hwtail of tx
+ * status ring. Should be power of 2
+ */
+#define WIL_EDMA_TX_SRING_UPDATE_HW_TAIL 128
 #define WIL_EDMA_MAX_DATA_OFFSET (2)
 /* RX buffer size must be aligned to 4 bytes */
 #define WIL_EDMA_RX_BUF_LEN_DEFAULT (2048)
@@ -1155,7 +1159,7 @@ int wil_tx_sring_handler(struct wil6210_priv *wil,
        struct wil_net_stats *stats;
        struct wil_tx_enhanced_desc *_d;
        unsigned int ring_id;
-       unsigned int num_descs;
+       unsigned int num_descs, num_statuses = 0;
        int i;
        u8 dr_bit; /* Descriptor Ready bit */
        struct wil_ring_tx_status msg;
@@ -1276,6 +1280,11 @@ int wil_tx_sring_handler(struct wil6210_priv *wil,
                }
 
 again:
+               num_statuses++;
+               if (num_statuses % WIL_EDMA_TX_SRING_UPDATE_HW_TAIL == 0)
+                       /* update HW tail to allow HW to push new statuses */
+                       wil_w(wil, sring->hwtail, sring->swhead);
+
                wil_sring_advance_swhead(sring);
 
                wil_get_next_tx_status_msg(sring, &msg);
@@ -1286,8 +1295,9 @@ int wil_tx_sring_handler(struct wil6210_priv *wil,
        if (desc_cnt)
                wil_update_net_queues(wil, vif, NULL, false);
 
-       /* Update the HW tail ptr (RD ptr) */
-       wil_w(wil, sring->hwtail, (sring->swhead - 1) % sring->size);
+       if (num_statuses % WIL_EDMA_TX_SRING_UPDATE_HW_TAIL != 0)
+               /* Update the HW tail ptr (RD ptr) */
+               wil_w(wil, sring->hwtail, (sring->swhead - 1) % sring->size);
 
        return desc_cnt;
 }