]> www.infradead.org Git - users/hch/configfs.git/commitdiff
wifi: wl18xx: make wl18xx_tx_immediate_complete() more efficient
authorRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Tue, 28 May 2024 09:17:47 +0000 (10:17 +0100)
committerKalle Valo <kvalo@kernel.org>
Tue, 18 Jun 2024 10:22:10 +0000 (13:22 +0300)
wl18xx_tx_immediate_complete() iterates through the completed transmit
descriptors in a circular fashion, and in doing so uses a modulus
operation that is not a power of two. This leads to inefficient code
generation, which can be easily solved by providing a helper to
increment to the next descriptor. Use this more efficient solution.

Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://msgid.link/E1sBsxn-00E8vW-9h@rmk-PC.armlinux.org.uk
drivers/net/wireless/ti/wl18xx/tx.c

index 55d9b0861c53859eb3c6c5ce866e3e91afcd3a20..beef393853efb5d65d86844686780b3b929efeb3 100644 (file)
@@ -129,6 +129,14 @@ static void wl18xx_tx_complete_packet(struct wl1271 *wl, u8 tx_stat_byte)
        wl1271_free_tx_id(wl, id);
 }
 
+static u8 wl18xx_next_tx_idx(u8 idx)
+{
+       if (++idx >= WL18XX_FW_MAX_TX_STATUS_DESC)
+               idx = 0;
+
+       return idx;
+}
+
 void wl18xx_tx_immediate_complete(struct wl1271 *wl)
 {
        struct wl18xx_fw_status_priv *status_priv =
@@ -161,9 +169,8 @@ void wl18xx_tx_immediate_complete(struct wl1271 *wl)
                return;
        }
 
-       for (i = priv->last_fw_rls_idx;
-            i != status_priv->fw_release_idx;
-            i = (i + 1) % WL18XX_FW_MAX_TX_STATUS_DESC) {
+       for (i = priv->last_fw_rls_idx; i != status_priv->fw_release_idx;
+            i = wl18xx_next_tx_idx(i)) {
                wl18xx_tx_complete_packet(wl,
                        status_priv->released_tx_desc[i]);