diff options
author | Daniel Kim <dekim@broadcom.com> | 2014-05-12 04:47:26 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2014-05-13 15:56:43 -0400 |
commit | e09cc63dc368f26f3636afbbb38aba9c9b99b3a5 (patch) | |
tree | 71420aaf2b972d7cbcb12da9584d7e6b318649a1 | |
parent | 3eb6ed23571b81c14ebacb1735d73a1ab1c41898 (diff) |
brcmfmac: Give priority to 5GHz band in selecting target BSS
When a BSS provides both 2.4GHz and 5GHz bands, in many cases it
makes sense to choose 5GHz. Typically a 5GHz channel is less crowded
and has less interference and therefore its performance will be
better than a crowded 2.4 GHz channel. This patch configures
'join_pref' to induce firmware to preferably select 5GHz BSS.
Reviewed-by: Arend Van Spriel <arend@broadcom.com>
Signed-off-by: Daniel Kim <dekim@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c | 18 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h | 24 |
2 files changed, 42 insertions, 0 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c index 6a8983a1fb9c..ed3e32ce8c23 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c | |||
@@ -32,6 +32,9 @@ | |||
32 | #define BRCMF_DEFAULT_SCAN_UNASSOC_TIME 40 | 32 | #define BRCMF_DEFAULT_SCAN_UNASSOC_TIME 40 |
33 | #define BRCMF_DEFAULT_PACKET_FILTER "100 0 0 0 0x01 0x00" | 33 | #define BRCMF_DEFAULT_PACKET_FILTER "100 0 0 0 0x01 0x00" |
34 | 34 | ||
35 | /* boost value for RSSI_DELTA in preferred join selection */ | ||
36 | #define BRCMF_JOIN_PREF_RSSI_BOOST 8 | ||
37 | |||
35 | 38 | ||
36 | bool brcmf_c_prec_enq(struct device *dev, struct pktq *q, | 39 | bool brcmf_c_prec_enq(struct device *dev, struct pktq *q, |
37 | struct sk_buff *pkt, int prec) | 40 | struct sk_buff *pkt, int prec) |
@@ -246,6 +249,7 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp) | |||
246 | { | 249 | { |
247 | s8 eventmask[BRCMF_EVENTING_MASK_LEN]; | 250 | s8 eventmask[BRCMF_EVENTING_MASK_LEN]; |
248 | u8 buf[BRCMF_DCMD_SMLEN]; | 251 | u8 buf[BRCMF_DCMD_SMLEN]; |
252 | struct brcmf_join_pref_params join_pref_params[2]; | ||
249 | char *ptr; | 253 | char *ptr; |
250 | s32 err; | 254 | s32 err; |
251 | 255 | ||
@@ -298,6 +302,20 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp) | |||
298 | goto done; | 302 | goto done; |
299 | } | 303 | } |
300 | 304 | ||
305 | /* Setup join_pref to select target by RSSI(with boost on 5GHz) */ | ||
306 | join_pref_params[0].type = BRCMF_JOIN_PREF_RSSI_DELTA; | ||
307 | join_pref_params[0].len = 2; | ||
308 | join_pref_params[0].rssi_gain = BRCMF_JOIN_PREF_RSSI_BOOST; | ||
309 | join_pref_params[0].band = WLC_BAND_5G; | ||
310 | join_pref_params[1].type = BRCMF_JOIN_PREF_RSSI; | ||
311 | join_pref_params[1].len = 2; | ||
312 | join_pref_params[1].rssi_gain = 0; | ||
313 | join_pref_params[1].band = 0; | ||
314 | err = brcmf_fil_iovar_data_set(ifp, "join_pref", join_pref_params, | ||
315 | sizeof(join_pref_params)); | ||
316 | if (err) | ||
317 | brcmf_err("Set join_pref error (%d)\n", err); | ||
318 | |||
301 | /* Setup event_msgs, enable E_IF */ | 319 | /* Setup event_msgs, enable E_IF */ |
302 | err = brcmf_fil_iovar_data_get(ifp, "event_msgs", eventmask, | 320 | err = brcmf_fil_iovar_data_get(ifp, "event_msgs", eventmask, |
303 | BRCMF_EVENTING_MASK_LEN); | 321 | BRCMF_EVENTING_MASK_LEN); |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h b/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h index 614e4888504f..2bc68a2137fc 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h +++ b/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h | |||
@@ -53,6 +53,14 @@ | |||
53 | #define BRCMF_OBSS_COEX_OFF 0 | 53 | #define BRCMF_OBSS_COEX_OFF 0 |
54 | #define BRCMF_OBSS_COEX_ON 1 | 54 | #define BRCMF_OBSS_COEX_ON 1 |
55 | 55 | ||
56 | /* join preference types for join_pref iovar */ | ||
57 | enum brcmf_join_pref_types { | ||
58 | BRCMF_JOIN_PREF_RSSI = 1, | ||
59 | BRCMF_JOIN_PREF_WPA, | ||
60 | BRCMF_JOIN_PREF_BAND, | ||
61 | BRCMF_JOIN_PREF_RSSI_DELTA, | ||
62 | }; | ||
63 | |||
56 | enum brcmf_fil_p2p_if_types { | 64 | enum brcmf_fil_p2p_if_types { |
57 | BRCMF_FIL_P2P_IF_CLIENT, | 65 | BRCMF_FIL_P2P_IF_CLIENT, |
58 | BRCMF_FIL_P2P_IF_GO, | 66 | BRCMF_FIL_P2P_IF_GO, |
@@ -282,6 +290,22 @@ struct brcmf_assoc_params_le { | |||
282 | __le16 chanspec_list[1]; | 290 | __le16 chanspec_list[1]; |
283 | }; | 291 | }; |
284 | 292 | ||
293 | /** | ||
294 | * struct join_pref params - parameters for preferred join selection. | ||
295 | * | ||
296 | * @type: preference type (see enum brcmf_join_pref_types). | ||
297 | * @len: length of bytes following (currently always 2). | ||
298 | * @rssi_gain: signal gain for selection (only when @type is RSSI_DELTA). | ||
299 | * @band: band to which selection preference applies. | ||
300 | * This is used if @type is BAND or RSSI_DELTA. | ||
301 | */ | ||
302 | struct brcmf_join_pref_params { | ||
303 | u8 type; | ||
304 | u8 len; | ||
305 | u8 rssi_gain; | ||
306 | u8 band; | ||
307 | }; | ||
308 | |||
285 | /* used for join with or without a specific bssid and channel list */ | 309 | /* used for join with or without a specific bssid and channel list */ |
286 | struct brcmf_join_params { | 310 | struct brcmf_join_params { |
287 | struct brcmf_ssid_le ssid_le; | 311 | struct brcmf_ssid_le ssid_le; |