brcmfmac: Update msgbuf read pointer quicker.
authorHante Meuleman <meuleman@broadcom.com>
Mon, 8 Jun 2015 12:38:32 +0000 (14:38 +0200)
committerKalle Valo <kvalo@codeaurora.org>
Mon, 15 Jun 2015 09:42:25 +0000 (12:42 +0300)
On device to host data using msgbuf the read pointer gets updated
once all data is processed. Updating this pointer more frequently
allows the firmware to add more data quicker. This will result in
slightly higher and more stable throughput on CPU bounded host
processors.

Reviewed-by: Arend Van Spriel <arend@broadcom.com>
Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/brcm80211/brcmfmac/commonring.c
drivers/net/wireless/brcm80211/brcmfmac/commonring.h
drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c

index 26c65872dae3b1b7184d377277a7fe86e125d5eb..7b0e52195a85668e91a32163130df5aea55499ee 100644 (file)
@@ -223,8 +223,6 @@ void brcmf_commonring_write_cancel(struct brcmf_commonring *commonring,
 void *brcmf_commonring_get_read_ptr(struct brcmf_commonring *commonring,
                                    u16 *n_items)
 {
-       void *ret_addr;
-
        if (commonring->cr_update_wptr)
                commonring->cr_update_wptr(commonring->cr_ctx);
 
@@ -235,19 +233,18 @@ void *brcmf_commonring_get_read_ptr(struct brcmf_commonring *commonring,
        if (*n_items == 0)
                return NULL;
 
-       ret_addr = commonring->buf_addr +
-                  (commonring->r_ptr * commonring->item_len);
-
-       commonring->r_ptr += *n_items;
-       if (commonring->r_ptr == commonring->depth)
-               commonring->r_ptr = 0;
-
-       return ret_addr;
+       return commonring->buf_addr +
+              (commonring->r_ptr * commonring->item_len);
 }
 
 
-int brcmf_commonring_read_complete(struct brcmf_commonring *commonring)
+int brcmf_commonring_read_complete(struct brcmf_commonring *commonring,
+                                  u16 n_items)
 {
+       commonring->r_ptr += n_items;
+       if (commonring->r_ptr == commonring->depth)
+               commonring->r_ptr = 0;
+
        if (commonring->cr_write_rptr)
                return commonring->cr_write_rptr(commonring->cr_ctx);
 
index 3d404016a92eb9e5cdcbcf49c9872d0e5a2966bf..b85033611c8d1d156d39cc2d20d4c7dc10b9f32e 100644 (file)
@@ -62,7 +62,8 @@ void brcmf_commonring_write_cancel(struct brcmf_commonring *commonring,
                                   u16 n_items);
 void *brcmf_commonring_get_read_ptr(struct brcmf_commonring *commonring,
                                    u16 *n_items);
-int brcmf_commonring_read_complete(struct brcmf_commonring *commonring);
+int brcmf_commonring_read_complete(struct brcmf_commonring *commonring,
+                                  u16 n_items);
 
 #define brcmf_commonring_n_items(commonring) (commonring->depth)
 #define brcmf_commonring_len_item(commonring) (commonring->item_len)
index 1b47de067d25cbb4b194ca8eae02986a3f196092..898c3801e65874647694d281614e146379da8822 100644 (file)
@@ -75,6 +75,8 @@
 
 #define BRCMF_MSGBUF_DELAY_TXWORKER_THRS       96
 #define BRCMF_MSGBUF_TRICKLE_TXWORKER_THRS     32
+#define BRCMF_MSGBUF_UPDATE_RX_PTR_THRS                48
+
 
 struct msgbuf_common_hdr {
        u8                              msgtype;
@@ -1257,19 +1259,27 @@ static void brcmf_msgbuf_process_rx(struct brcmf_msgbuf *msgbuf,
 {
        void *buf;
        u16 count;
+       u16 processed;
 
 again:
        buf = brcmf_commonring_get_read_ptr(commonring, &count);
        if (buf == NULL)
                return;
 
+       processed = 0;
        while (count) {
                brcmf_msgbuf_process_msgtype(msgbuf,
                                             buf + msgbuf->rx_dataoffset);
                buf += brcmf_commonring_len_item(commonring);
+               processed++;
+               if (processed == BRCMF_MSGBUF_UPDATE_RX_PTR_THRS) {
+                       brcmf_commonring_read_complete(commonring, processed);
+                       processed = 0;
+               }
                count--;
        }
-       brcmf_commonring_read_complete(commonring);
+       if (processed)
+               brcmf_commonring_read_complete(commonring, processed);
 
        if (commonring->r_ptr == 0)
                goto again;