ath10k-firmware: remove dependency on kmod-ath10k so that it can be selected instead
[15.05/openwrt.git] / package / kernel / mac80211 / patches / 357-0001-brcmfmac-Update-msgbuf-read-pointer-quicker.patch
1 From: Hante Meuleman <meuleman@broadcom.com>
2 Date: Mon, 8 Jun 2015 14:38:32 +0200
3 Subject: [PATCH] brcmfmac: Update msgbuf read pointer quicker.
4
5 On device to host data using msgbuf the read pointer gets updated
6 once all data is processed. Updating this pointer more frequently
7 allows the firmware to add more data quicker. This will result in
8 slightly higher and more stable throughput on CPU bounded host
9 processors.
10
11 Reviewed-by: Arend Van Spriel <arend@broadcom.com>
12 Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
13 Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
14 Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
15 Signed-off-by: Arend van Spriel <arend@broadcom.com>
16 Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
17 ---
18
19 --- a/drivers/net/wireless/brcm80211/brcmfmac/commonring.c
20 +++ b/drivers/net/wireless/brcm80211/brcmfmac/commonring.c
21 @@ -223,8 +223,6 @@ void brcmf_commonring_write_cancel(struc
22  void *brcmf_commonring_get_read_ptr(struct brcmf_commonring *commonring,
23                                     u16 *n_items)
24  {
25 -       void *ret_addr;
26 -
27         if (commonring->cr_update_wptr)
28                 commonring->cr_update_wptr(commonring->cr_ctx);
29  
30 @@ -235,19 +233,18 @@ void *brcmf_commonring_get_read_ptr(stru
31         if (*n_items == 0)
32                 return NULL;
33  
34 -       ret_addr = commonring->buf_addr +
35 -                  (commonring->r_ptr * commonring->item_len);
36 -
37 -       commonring->r_ptr += *n_items;
38 -       if (commonring->r_ptr == commonring->depth)
39 -               commonring->r_ptr = 0;
40 -
41 -       return ret_addr;
42 +       return commonring->buf_addr +
43 +              (commonring->r_ptr * commonring->item_len);
44  }
45  
46  
47 -int brcmf_commonring_read_complete(struct brcmf_commonring *commonring)
48 +int brcmf_commonring_read_complete(struct brcmf_commonring *commonring,
49 +                                  u16 n_items)
50  {
51 +       commonring->r_ptr += n_items;
52 +       if (commonring->r_ptr == commonring->depth)
53 +               commonring->r_ptr = 0;
54 +
55         if (commonring->cr_write_rptr)
56                 return commonring->cr_write_rptr(commonring->cr_ctx);
57  
58 --- a/drivers/net/wireless/brcm80211/brcmfmac/commonring.h
59 +++ b/drivers/net/wireless/brcm80211/brcmfmac/commonring.h
60 @@ -62,7 +62,8 @@ void brcmf_commonring_write_cancel(struc
61                                    u16 n_items);
62  void *brcmf_commonring_get_read_ptr(struct brcmf_commonring *commonring,
63                                     u16 *n_items);
64 -int brcmf_commonring_read_complete(struct brcmf_commonring *commonring);
65 +int brcmf_commonring_read_complete(struct brcmf_commonring *commonring,
66 +                                  u16 n_items);
67  
68  #define brcmf_commonring_n_items(commonring) (commonring->depth)
69  #define brcmf_commonring_len_item(commonring) (commonring->item_len)
70 --- a/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
71 +++ b/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
72 @@ -75,6 +75,8 @@
73  
74  #define BRCMF_MSGBUF_DELAY_TXWORKER_THRS       96
75  #define BRCMF_MSGBUF_TRICKLE_TXWORKER_THRS     32
76 +#define BRCMF_MSGBUF_UPDATE_RX_PTR_THRS                48
77 +
78  
79  struct msgbuf_common_hdr {
80         u8                              msgtype;
81 @@ -1257,19 +1259,27 @@ static void brcmf_msgbuf_process_rx(stru
82  {
83         void *buf;
84         u16 count;
85 +       u16 processed;
86  
87  again:
88         buf = brcmf_commonring_get_read_ptr(commonring, &count);
89         if (buf == NULL)
90                 return;
91  
92 +       processed = 0;
93         while (count) {
94                 brcmf_msgbuf_process_msgtype(msgbuf,
95                                              buf + msgbuf->rx_dataoffset);
96                 buf += brcmf_commonring_len_item(commonring);
97 +               processed++;
98 +               if (processed == BRCMF_MSGBUF_UPDATE_RX_PTR_THRS) {
99 +                       brcmf_commonring_read_complete(commonring, processed);
100 +                       processed = 0;
101 +               }
102                 count--;
103         }
104 -       brcmf_commonring_read_complete(commonring);
105 +       if (processed)
106 +               brcmf_commonring_read_complete(commonring, processed);
107  
108         if (commonring->r_ptr == 0)
109                 goto again;