brcmfmac: throughput enhancement for flow control mode
v2 cover brcmfmac: throughput enhancement for flow control mode
The patches are for throughput enhancement with flow control mode enabled and introduce a new module parameter to enhance TX throughput as well.
Changes since v1:
Remove the patch "calling skb_orphan before sending skb to SDIO bus" Revise the patch "brcmfmac: add credit numbers updating support"
Wright Feng (2):
brcmfmac: add credit numbers updating support
brcmfmac: make firmware frameburst mode a module parameter
.../broadcom/brcm80211/brcmfmac/cfg80211.c | 7 ++++++ .../broadcom/brcm80211/brcmfmac/common.c | 5 ++++ .../broadcom/brcm80211/brcmfmac/common.h | 2 ++ .../broadcom/brcm80211/brcmfmac/fwil.h | 1 + .../broadcom/brcm80211/brcmfmac/fwsignal.c | 23 ++++++++++++------- 5 files changed, 30 insertions(+), 8 deletions(-)
Signature · 1 line
2.19.1
PATCH v2 1/2 brcmfmac: add credit numbers updating support
The credit numbers are static and tunable per chip in firmware side. However the credit number may be changed that is based on packet pool length and will send BRCMF_E_FIFO_CREDIT_MAP event to notify host driver updates the credit numbers during interface up.
The purpose of this patch is making host driver has ability of updating the credit numbers when receiving the BRCMF_E_FIFO_CREDIT_MAP event.
---
v2: replace brcmf_err with WARN_ONCE
--- .../broadcom/brcm80211/brcmfmac/fwsignal.c | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-)
drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c +15 -8
@@ -511,6 +511,7 @@ struct brcmf_fws_info {struct work_struct fws_dequeue_work;u32 fifo_enqpkt[BRCMF_FWS_FIFO_COUNT ];int fifo_credit[BRCMF_FWS_FIFO_COUNT ]; +int init_fifo_credit[BRCMF_FWS_FIFO_COUNT ];int credits_borrowed[BRCMF_FWS_FIFO_AC_VO +1 ];int deq_node_pos[BRCMF_FWS_FIFO_COUNT ];u32 fifo_credit_map;
@@ -1237,6 +1238,9 @@ static void brcmf_fws_return_credits(struct brcmf_fws_info *fws, } fws->fifo_credit[fifo] += credits; +if (fws->fifo_credit[fifo] > fws->init_fifo_credit[fifo]) + fws->fifo_credit[fifo] = fws->init_fifo_credit[fifo]; + }static void brcmf_fws_schedule_deq (struct brcmf_fws_info *fws)
@@ -1595,19 +1599,21 @@ static int brcmf_fws_notify_credit_map(struct brcmf_if *ifp,brcmf_err ("event payload too small (%d)\n" , e->datalen);return -EINVAL ; } -if (fws->creditmap_received) -return 0 ; fws->creditmap_received = true;brcmf_dbg (TRACE ,"enter: credits %pM\n" , credits);brcmf_fws_lock (fws);for (i =0 ; i <ARRAY_SIZE (fws->fifo_credit); i++) { -if (*credits) + fws->fifo_credit[i] += credits[i] - fws->init_fifo_credit[i]; + fws->init_fifo_credit[i] = credits[i]; +if (fws->fifo_credit[i] >0 ) fws->fifo_credit_map |=1 << i;else fws->fifo_credit_map &= ~(1 << i); - fws->fifo_credit[i] = *credits++; +WARN_ONCE (fws->fifo_credit[i] <0 , +"fifo_credit[%d] is negative(%d)\n" , i, + fws->fifo_credit[i]); }brcmf_fws_schedule_deq (fws);brcmf_fws_unlock (fws);
@@ -2013,7 +2019,7 @@ static int brcmf_fws_borrow_credit(struct brcmf_fws_info *fws) }for (lender_ac =0 ; lender_ac <=BRCMF_FWS_FIFO_AC_VO ; lender_ac++) { -if (fws->fifo_credit[lender_ac]) { +if (fws->fifo_credit[lender_ac] >0 ) { fws->credits_borrowed[lender_ac]++; fws->fifo_credit[lender_ac]--;if (fws->fifo_credit[lender_ac] ==0 )
@@ -2210,8 +2216,9 @@ static void brcmf_fws_dequeue_worker(struct work_struct *worker) }continue ; } -while ((fws->fifo_credit[fifo]) || ((!fws->bcmc_credit_check) && - (fifo ==BRCMF_FWS_FIFO_BCMC ))) { +while ((fws->fifo_credit[fifo] >0 ) || + ((!fws->bcmc_credit_check) && + (fifo ==BRCMF_FWS_FIFO_BCMC ))) { skb =brcmf_fws_deq (fws, fifo);if (!skb)break ;
@@ -2222,7 +2229,7 @@ static void brcmf_fws_dequeue_worker(struct work_struct *worker)break ; }if ((fifo ==BRCMF_FWS_FIFO_AC_BE ) && - (fws->fifo_credit[fifo] ==0 ) && + (fws->fifo_credit[fifo] <=0 ) && (!fws->bus_flow_blocked)) {while (brcmf_fws_borrow_credit (fws) ==0 ) { skb =brcmf_fws_deq (fws, fifo);
Signature · 1 line
2.19.1
PATCH v2 2/2 brcmfmac: make firmware frameburst mode a module parameter
In reply to Wright FengThis patch is for adding a new module parameter "frameburst". With setting "frameburst=1" in module parameters, firmware frameburst mode will be enabled. The feature can enable per-packet framebursting in firmware side and get higher TX throughput in High Throughput(HT) mode.
--- .../net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 7 +++++++ drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c | 5 +++++ drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h | 2 ++ drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h | 1 + 4 files changed, 15 insertions(+)
drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +7 -0
@@ -6638,6 +6638,13 @@ static s32 brcmf_config_dongle(struct brcmf_cfg80211_info *cfg)brcmf_configure_arp_nd_offload (ifp, true); +if (ifp->drvr->settings->frameburst) { + err =brcmf_fil_cmd_int_set (ifp,BRCMF_C_SET_FAKEFRAG ,1 ); +if (err) +brcmf_info ("setting frameburst mode failed\n" ); +brcmf_dbg (INFO ,"frameburst mode enabled\n" ); + } + cfg->dongle_up = true; default_conf_out:
drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c +5 -0
@@ -78,6 +78,10 @@ static int brcmf_iapp_enable;module_param_named (iapp, brcmf_iapp_enable, int,0 );MODULE_PARM_DESC (iapp,"Enable partial support for the obsoleted Inter-Access Point Protocol" ); +static int brcmf_frameburst; +module_param_named (frameburst, brcmf_frameburst, int,0 ); +MODULE_PARM_DESC (frameburst,"Enable firmware frameburst feature" ); +#ifdef DEBUG /* always succeed brcmf_bus_started() */ static int brcmf_ignore_probe_fail;
@@ -419,6 +423,7 @@ struct brcmf_mp_device *brcmf_get_module_param(struct device *dev, settings->fcmode = brcmf_fcmode; settings->roamoff = !!brcmf_roamoff; settings->iapp = !!brcmf_iapp_enable; + settings->frameburst = !!brcmf_frameburst;#ifdef DEBUG settings->ignore_probe_fail = !!brcmf_ignore_probe_fail;#endif
drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h +2 -0
@@ -47,6 +47,7 @@ extern struct brcmf_mp_global_t brcmf_mp_global;* @feature_disable: Feature_disable bitmask. * @fcmode: FWS flow control. * @roamoff: Firmware roaming off? +* @frameburst: Firmware frame burst mode. * @ignore_probe_fail: Ignore probe failure. * @country_codes: If available, pointer to struct for translating country codes * @bus: Bus specific platform data. Only SDIO at the mmoment.
@@ -57,6 +58,7 @@ struct brcmf_mp_device {int fcmode;bool roamoff;bool iapp; +bool frameburst;bool ignore_probe_fail;struct brcmfmac_pd_cc *country_codes;union {
drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h +1 -0
@@ -80,6 +80,7 @@#define BRCMF_C_SCB_DEAUTHENTICATE_FOR_REASON 201#define BRCMF_C_SET_ASSOC_PREFER 205#define BRCMF_C_GET_VALID_CHANNELS 217 +#define BRCMF_C_SET_FAKEFRAG 219#define BRCMF_C_GET_KEY_PRIMARY 235#define BRCMF_C_SET_KEY_PRIMARY 236#define BRCMF_C_SET_SCAN_PASSIVE_TIME 258
Signature · 1 line
2.19.1
Arend van Spriel
maintainerRe: [PATCH v2 2/2] brcmfmac: make firmware frameburst mode a module parameter
Quoted 4 lines · Wright Feng
This patch is for adding a new module parameter "frameburst". With setting "frameburst=1" in module parameters, firmware frameburst mode will be enabled. The feature can enable per-packet framebursting in firmware side and get higher TX throughput in High Throughput(HT) mode.
So why not always enable it in firmware as it seems to be the default in recent firmware anyway.
Regards,
Arend
Quoted 82 lines
Signed-off-by Wright Feng <[email protected]>--- .../net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 7 +++++++ drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c | 5 +++++ drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h | 2 ++ drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h | 1 + 4 files changed, 15 insertions(+)drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +7
-0@@ -6638,6 +6638,13 @@ static s32 brcmf_config_dongle(struct brcmf_cfg80211_info *cfg)brcmf_configure_arp_nd_offload (ifp, true); +if (ifp->drvr->settings->frameburst) { + err =brcmf_fil_cmd_int_set (ifp,BRCMF_C_SET_FAKEFRAG ,1 ); +if (err) +brcmf_info ("setting frameburst mode failed\n" ); +brcmf_dbg (INFO ,"frameburst mode enabled\n" ); + } + cfg->dongle_up = true; default_conf_out:drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c +5
-0@@ -78,6 +78,10 @@ static int brcmf_iapp_enable;module_param_named (iapp, brcmf_iapp_enable, int,0 );MODULE_PARM_DESC (iapp,"Enable partial support for the obsoleted Inter-Access Point Protocol" ); +static int brcmf_frameburst; +module_param_named (frameburst, brcmf_frameburst, int,0 ); +MODULE_PARM_DESC (frameburst,"Enable firmware frameburst feature" ); +#ifdef DEBUG /* always succeed brcmf_bus_started() */ static int brcmf_ignore_probe_fail;@@ -419,6 +423,7 @@ struct brcmf_mp_device *brcmf_get_module_param(struct device *dev, settings->fcmode = brcmf_fcmode; settings->roamoff = !!brcmf_roamoff; settings->iapp = !!brcmf_iapp_enable; + settings->frameburst = !!brcmf_frameburst;#ifdef DEBUG settings->ignore_probe_fail = !!brcmf_ignore_probe_fail;#endif drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h +2
-0@@ -47,6 +47,7 @@ extern struct brcmf_mp_global_t brcmf_mp_global;* @feature_disable: Feature_disable bitmask. * @fcmode: FWS flow control. * @roamoff: Firmware roaming off? +* @frameburst: Firmware frame burst mode. * @ignore_probe_fail: Ignore probe failure. * @country_codes: If available, pointer to struct for translating country codes * @bus: Bus specific platform data. Only SDIO at the mmoment. @@ -57,6 +58,7 @@ struct brcmf_mp_device {int fcmode;bool roamoff;bool iapp; +bool frameburst;bool ignore_probe_fail;struct brcmfmac_pd_cc *country_codes;union {drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h +1
-0@@ -80,6 +80,7 @@#define BRCMF_C_SCB_DEAUTHENTICATE_FOR_REASON 201#define BRCMF_C_SET_ASSOC_PREFER 205#define BRCMF_C_GET_VALID_CHANNELS 217 +#define BRCMF_C_SET_FAKEFRAG 219#define BRCMF_C_GET_KEY_PRIMARY 235#define BRCMF_C_SET_KEY_PRIMARY 236#define BRCMF_C_SET_SCAN_PASSIVE_TIME 258
Re: [PATCH v2 2/2] brcmfmac: make firmware frameburst mode a module parameter
Arend van Spriel 於 11/2/2018 8:31 PM 寫道:
Quoted 7 lines · Wright Feng
Quoted 5 lines
This patch is for adding a new module parameter "frameburst". With setting "frameburst=1" in module parameters, firmware frameburst mode
will be enabled. The feature can enable per-packet framebursting in firmware side and get higher TX throughput in High Throughput(HT) mode.
Quoted 5 lines
So why not always enable it in firmware as it seems to be the default in recent firmware anyway.
Regards,
Arend
We don't have all the chips(some are not belong to Cypress) to do modification and verify them in our internal test, so the frameburst feature will not benefit to all firmwares.
How about removing module parameter and setting frameburst to be default in host driver side? It will be good to all Linux supported chips and users.
-Wright
Quoted 93 lines
Quoted 92 lines
Signed-off-by Wright Feng <[email protected]>---
.../net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 7 +++++++ drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c | 5 +++++ drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h | 2 ++ drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h | 1 +4 files changed, 15 insertions(+)(quoted diff) +0
-0
a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.cb/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.cindex230a378c26fc..4a05d3f50cff100644drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +7
-0@@ -6638,6 +6638,13 @@ static s32 brcmf_config_dongle(struct brcmf_cfg80211_info *cfg) brcmf_configure_arp_nd_offload(ifp, true); + if (ifp->drvr->settings->frameburst) { + err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_FAKEFRAG, 1); + if (err) + brcmf_info("setting frameburst mode failed\n"); + brcmf_dbg(INFO, "frameburst mode enabled\n"); + } + cfg->dongle_up = true;default_conf_out:
drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c +0
-0@@ -78,6 +78,10 @@ static int brcmf_iapp_enable; module_param_named(iapp, brcmf_iapp_enable, int, 0);MODULE_PARM_DESC(iapp, "Enable partial support for the obsoleted Inter-Access Point Protocol");
drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c +4
-0+static int brcmf_frameburst; +module_param_named (frameburst, brcmf_frameburst, int,0 ); +MODULE_PARM_DESC (frameburst,"Enable firmware frameburst feature" ); +#ifdef DEBUG
/* always succeedbrcmf_bus_started()*/
static intbrcmf_ignore_probe_fail;drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c +1
-0@@ -419,6 +423,7 @@ struct brcmf_mp_device *brcmf_get_module_param(struct device *dev, settings->fcmode = brcmf_fcmode; settings->roamoff = !!brcmf_roamoff; settings->iapp = !!brcmf_iapp_enable; + settings->frameburst = !!brcmf_frameburst; #ifdef DEBUG settings->ignore_probe_fail = !!brcmf_ignore_probe_fail;#endif
drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h +1
-0@@ -47,6 +47,7 @@ extern struct brcmf_mp_global_t brcmf_mp_global; * @feature_disable: Feature_disable bitmask. * @fcmode: FWS flow control. * @roamoff: Firmware roaming off? + * @frameburst: Firmware frame burst mode. * @ignore_probe_fail: Ignore probe failure. * @country_codes: If available, pointer to struct for translatingcountry codes
* @bus: Bus specific platform data. Only SDIO at the mmoment.drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h +1
-0@@ -57,6 +58,7 @@ struct brcmf_mp_device { int fcmode; bool roamoff; bool iapp; + bool frameburst; bool ignore_probe_fail; struct brcmfmac_pd_cc *country_codes; union {drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.h +1
-0@@ -80,6 +80,7 @@ #define BRCMF_C_SCB_DEAUTHENTICATE_FOR_REASON 201 #define BRCMF_C_SET_ASSOC_PREFER 205 #define BRCMF_C_GET_VALID_CHANNELS 217 +#define BRCMF_C_SET_FAKEFRAG 219 #define BRCMF_C_GET_KEY_PRIMARY 235 #define BRCMF_C_SET_KEY_PRIMARY 236 #define BRCMF_C_SET_SCAN_PASSIVE_TIME 258
Arend van Spriel
maintainerQuoted 6 lines · Wright Feng
The patches are for throughput enhancement with flow control mode enabled and introduce a new module parameter to enhance TX throughput as well.
Changes since v1:
Remove the patch "callingskb_orphanbefore sending skb to SDIO bus" Revise the patch "brcmfmac: add credit numbers updating support"
I also saw a patch Chi-Hsien Lin regarding fwsignal support. It would be good if that patch was part of this patch series as they seem dependent or at least related.
Regards,
Arend
Quoted 11 lines
Wright Feng (2):
brcmfmac: add credit numbers updating support
brcmfmac: make firmware frameburst mode a module parameter.../broadcom/brcm80211/brcmfmac/cfg80211.c | 7 ++++++ .../broadcom/brcm80211/brcmfmac/common.c | 5 ++++ .../broadcom/brcm80211/brcmfmac/common.h | 2 ++ .../broadcom/brcm80211/brcmfmac/fwil.h | 1 + .../broadcom/brcm80211/brcmfmac/fwsignal.c | 23 ++++++++++++------- 5 files changed, 30 insertions(+), 8 deletions(-)