aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorHante Meuleman <meuleman@broadcom.com>2014-02-25 14:30:26 -0500
committerJohn W. Linville <linville@tuxdriver.com>2014-02-28 14:33:17 -0500
commit68ca395f94e932a2d9a775f2c103c5bce257e795 (patch)
treea20d280d4d815ab4cd5a452765eff0315712420f /drivers/net
parent6da2f4ad9d125a81ce53af9c522856039f62718b (diff)
brcmfmac: Make firmeware roaming a module param.
Internal firmware roaming is enabled by default. This patch makes it possible to disable internal firmware roaming by specifying roamoff=1 as module param. Reviewed-by: Arend Van Spriel <arend@broadcom.com> Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com> Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com> Reviewed-by: Daniel (Deognyoun) Kim <dekim@broadcom.com> Signed-off-by: Hante Meuleman <meuleman@broadcom.com> Signed-off-by: Arend van Spriel <arend@broadcom.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c38
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h1
2 files changed, 25 insertions, 14 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
index a54db9185747..474df2ce6e3b 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
@@ -18,6 +18,7 @@
18 18
19#include <linux/kernel.h> 19#include <linux/kernel.h>
20#include <linux/etherdevice.h> 20#include <linux/etherdevice.h>
21#include <linux/module.h>
21#include <net/cfg80211.h> 22#include <net/cfg80211.h>
22#include <net/netlink.h> 23#include <net/netlink.h>
23 24
@@ -251,6 +252,10 @@ struct parsed_vndr_ies {
251 struct parsed_vndr_ie_info ie_info[VNDR_IE_PARSE_LIMIT]; 252 struct parsed_vndr_ie_info ie_info[VNDR_IE_PARSE_LIMIT];
252}; 253};
253 254
255static int brcmf_roamoff;
256module_param_named(roamoff, brcmf_roamoff, int, S_IRUSR);
257MODULE_PARM_DESC(roamoff, "do not use internal roaming engine");
258
254/* Quarter dBm units to mW 259/* Quarter dBm units to mW
255 * Table starts at QDBM_OFFSET, so the first entry is mW for qdBm=153 260 * Table starts at QDBM_OFFSET, so the first entry is mW for qdBm=153
256 * Table is offset so the last entry is largest mW value that fits in 261 * Table is offset so the last entry is largest mW value that fits in
@@ -4444,7 +4449,9 @@ static bool brcmf_is_linkdown(const struct brcmf_event_msg *e)
4444 u32 event = e->event_code; 4449 u32 event = e->event_code;
4445 u16 flags = e->flags; 4450 u16 flags = e->flags;
4446 4451
4447 if (event == BRCMF_E_LINK && (!(flags & BRCMF_EVENT_MSG_LINK))) { 4452 if ((event == BRCMF_E_DEAUTH) || (event == BRCMF_E_DEAUTH_IND) ||
4453 (event == BRCMF_E_DISASSOC_IND) ||
4454 ((event == BRCMF_E_LINK) && (!(flags & BRCMF_EVENT_MSG_LINK)))) {
4448 brcmf_dbg(CONN, "Processing link down\n"); 4455 brcmf_dbg(CONN, "Processing link down\n");
4449 return true; 4456 return true;
4450 } 4457 }
@@ -4688,6 +4695,7 @@ brcmf_notify_connect_status(struct brcmf_if *ifp,
4688 struct brcmf_cfg80211_profile *profile = &ifp->vif->profile; 4695 struct brcmf_cfg80211_profile *profile = &ifp->vif->profile;
4689 struct ieee80211_channel *chan; 4696 struct ieee80211_channel *chan;
4690 s32 err = 0; 4697 s32 err = 0;
4698 u16 reason;
4691 4699
4692 if (ifp->vif->mode == WL_MODE_AP) { 4700 if (ifp->vif->mode == WL_MODE_AP) {
4693 err = brcmf_notify_connect_status_ap(cfg, ndev, e, data); 4701 err = brcmf_notify_connect_status_ap(cfg, ndev, e, data);
@@ -4709,9 +4717,15 @@ brcmf_notify_connect_status(struct brcmf_if *ifp,
4709 if (!brcmf_is_ibssmode(ifp->vif)) { 4717 if (!brcmf_is_ibssmode(ifp->vif)) {
4710 brcmf_bss_connect_done(cfg, ndev, e, false); 4718 brcmf_bss_connect_done(cfg, ndev, e, false);
4711 if (test_and_clear_bit(BRCMF_VIF_STATUS_CONNECTED, 4719 if (test_and_clear_bit(BRCMF_VIF_STATUS_CONNECTED,
4712 &ifp->vif->sme_state)) 4720 &ifp->vif->sme_state)) {
4713 cfg80211_disconnected(ndev, 0, NULL, 0, 4721 reason = 0;
4722 if (((e->event_code == BRCMF_E_DEAUTH_IND) ||
4723 (e->event_code == BRCMF_E_DISASSOC_IND)) &&
4724 (e->reason != WLAN_REASON_UNSPECIFIED))
4725 reason = e->reason;
4726 cfg80211_disconnected(ndev, reason, NULL, 0,
4714 GFP_KERNEL); 4727 GFP_KERNEL);
4728 }
4715 } 4729 }
4716 brcmf_link_down(ifp->vif); 4730 brcmf_link_down(ifp->vif);
4717 brcmf_init_prof(ndev_to_prof(ndev)); 4731 brcmf_init_prof(ndev_to_prof(ndev));
@@ -4905,11 +4919,8 @@ static s32 wl_init_priv(struct brcmf_cfg80211_info *cfg)
4905 4919
4906 cfg->scan_request = NULL; 4920 cfg->scan_request = NULL;
4907 cfg->pwr_save = true; 4921 cfg->pwr_save = true;
4908 cfg->roam_on = true; /* roam on & off switch. 4922 cfg->active_scan = true; /* we do active scan per default */
4909 we enable roam per default */ 4923 cfg->dongle_up = false; /* dongle is not up yet */
4910 cfg->active_scan = true; /* we do active scan for
4911 specific scan per default */
4912 cfg->dongle_up = false; /* dongle is not up yet */
4913 err = brcmf_init_priv_mem(cfg); 4924 err = brcmf_init_priv_mem(cfg);
4914 if (err) 4925 if (err)
4915 return err; 4926 return err;
@@ -5029,7 +5040,7 @@ void brcmf_cfg80211_detach(struct brcmf_cfg80211_info *cfg)
5029} 5040}
5030 5041
5031static s32 5042static s32
5032brcmf_dongle_roam(struct brcmf_if *ifp, u32 roamvar, u32 bcn_timeout) 5043brcmf_dongle_roam(struct brcmf_if *ifp, u32 bcn_timeout)
5033{ 5044{
5034 s32 err = 0; 5045 s32 err = 0;
5035 __le32 roamtrigger[2]; 5046 __le32 roamtrigger[2];
@@ -5039,7 +5050,7 @@ brcmf_dongle_roam(struct brcmf_if *ifp, u32 roamvar, u32 bcn_timeout)
5039 * Setup timeout if Beacons are lost and roam is 5050 * Setup timeout if Beacons are lost and roam is
5040 * off to report link down 5051 * off to report link down
5041 */ 5052 */
5042 if (roamvar) { 5053 if (brcmf_roamoff) {
5043 err = brcmf_fil_iovar_int_set(ifp, "bcn_timeout", bcn_timeout); 5054 err = brcmf_fil_iovar_int_set(ifp, "bcn_timeout", bcn_timeout);
5044 if (err) { 5055 if (err) {
5045 brcmf_err("bcn_timeout error (%d)\n", err); 5056 brcmf_err("bcn_timeout error (%d)\n", err);
@@ -5051,8 +5062,9 @@ brcmf_dongle_roam(struct brcmf_if *ifp, u32 roamvar, u32 bcn_timeout)
5051 * Enable/Disable built-in roaming to allow supplicant 5062 * Enable/Disable built-in roaming to allow supplicant
5052 * to take care of roaming 5063 * to take care of roaming
5053 */ 5064 */
5054 brcmf_dbg(INFO, "Internal Roaming = %s\n", roamvar ? "Off" : "On"); 5065 brcmf_dbg(INFO, "Internal Roaming = %s\n",
5055 err = brcmf_fil_iovar_int_set(ifp, "roam_off", roamvar); 5066 brcmf_roamoff ? "Off" : "On");
5067 err = brcmf_fil_iovar_int_set(ifp, "roam_off", !!(brcmf_roamoff));
5056 if (err) { 5068 if (err) {
5057 brcmf_err("roam_off error (%d)\n", err); 5069 brcmf_err("roam_off error (%d)\n", err);
5058 goto dongle_rom_out; 5070 goto dongle_rom_out;
@@ -5408,7 +5420,7 @@ static s32 brcmf_config_dongle(struct brcmf_cfg80211_info *cfg)
5408 brcmf_dbg(INFO, "power save set to %s\n", 5420 brcmf_dbg(INFO, "power save set to %s\n",
5409 (power_mode ? "enabled" : "disabled")); 5421 (power_mode ? "enabled" : "disabled"));
5410 5422
5411 err = brcmf_dongle_roam(ifp, (cfg->roam_on ? 0 : 1), WL_BEACON_TIMEOUT); 5423 err = brcmf_dongle_roam(ifp, WL_BEACON_TIMEOUT);
5412 if (err) 5424 if (err)
5413 goto default_conf_out; 5425 goto default_conf_out;
5414 err = brcmf_cfg80211_change_iface(wdev->wiphy, ndev, wdev->iftype, 5426 err = brcmf_cfg80211_change_iface(wdev->wiphy, ndev, wdev->iftype,
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h
index 254feed2860e..5715bb0708cf 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h
@@ -402,7 +402,6 @@ struct brcmf_cfg80211_info {
402 bool ibss_starter; 402 bool ibss_starter;
403 bool pwr_save; 403 bool pwr_save;
404 bool dongle_up; 404 bool dongle_up;
405 bool roam_on;
406 bool scan_tried; 405 bool scan_tried;
407 u8 *dcmd_buf; 406 u8 *dcmd_buf;
408 u8 *extra_buf; 407 u8 *extra_buf;