aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorDmitry Shmidt <dimitrysh@google.com>2012-07-09 11:14:42 -0700
committerDmitry Shmidt <dimitrysh@google.com>2012-07-12 10:45:49 -0700
commitdf06df7bfc792ee9b7ca69276d0081b2a9d0ef76 (patch)
tree01bf4d0ee049e402f2c33a3dc2a18e4259124800 /drivers/net
parent230efa68694bf978725fe155b4e81b1c8a9a565c (diff)
downloadkernel_samsung_crespo-df06df7bfc792ee9b7ca69276d0081b2a9d0ef76.zip
kernel_samsung_crespo-df06df7bfc792ee9b7ca69276d0081b2a9d0ef76.tar.gz
kernel_samsung_crespo-df06df7bfc792ee9b7ca69276d0081b2a9d0ef76.tar.bz2
net: wireless: bcmdhd: Update wiphy bands on band change
Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/wireless/bcmdhd/dhd_linux.c13
-rw-r--r--drivers/net/wireless/bcmdhd/wl_cfg80211.c23
-rw-r--r--drivers/net/wireless/bcmdhd/wl_cfg80211.h3
-rw-r--r--drivers/net/wireless/bcmdhd/wldev_common.c2
-rw-r--r--drivers/net/wireless/bcmdhd/wldev_common.h1
5 files changed, 38 insertions, 4 deletions
diff --git a/drivers/net/wireless/bcmdhd/dhd_linux.c b/drivers/net/wireless/bcmdhd/dhd_linux.c
index 1cee01d..4d763c9 100644
--- a/drivers/net/wireless/bcmdhd/dhd_linux.c
+++ b/drivers/net/wireless/bcmdhd/dhd_linux.c
@@ -4536,7 +4536,18 @@ void dhd_bus_country_set(struct net_device *dev, wl_country_t *cspec)
if (dhd && dhd->pub.up) {
memcpy(&dhd->pub.dhd_cspec, cspec, sizeof(wl_country_t));
#ifdef WL_CFG80211
- wl_update_wiphybands(NULL);
+ wl_update_wiphybands(NULL, cspec->ccode);
+#endif
+ }
+}
+
+void dhd_bus_band_set(struct net_device *dev, uint band)
+{
+ dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev);
+
+ if (dhd && dhd->pub.up) {
+#ifdef WL_CFG80211
+ wl_update_wiphybands(NULL, NULL);
#endif
}
}
diff --git a/drivers/net/wireless/bcmdhd/wl_cfg80211.c b/drivers/net/wireless/bcmdhd/wl_cfg80211.c
index 121f3bb..5e61aa4 100644
--- a/drivers/net/wireless/bcmdhd/wl_cfg80211.c
+++ b/drivers/net/wireless/bcmdhd/wl_cfg80211.c
@@ -7138,7 +7138,7 @@ static int wl_construct_reginfo(struct wl_priv *wl, s32 bw_cap)
return err;
}
-s32 wl_update_wiphybands(struct wl_priv *wl)
+s32 wl_update_wiphybands(struct wl_priv *wl, char *country_code)
{
struct wiphy *wiphy;
struct net_device *dev;
@@ -7149,6 +7149,7 @@ s32 wl_update_wiphybands(struct wl_priv *wl)
int nmode = 0;
int bw_cap = 0;
int index = 0;
+ struct regulatory_request *new_request;
bool rollback_lock = false;
WL_DBG(("Entry"));
@@ -7216,6 +7217,24 @@ s32 wl_update_wiphybands(struct wl_priv *wl)
}
wiphy_apply_custom_regulatory(wiphy, &brcm_regdom);
+
+ if (country_code != NULL) {
+ WL_DBG(("country_code[0]=%c, country_code[1]=%c\n", country_code[0], country_code[1]));
+ /* Allocate a requlatory request to update cfg80211 for the supported channels */
+ new_request = kzalloc(sizeof(struct regulatory_request),
+ GFP_KERNEL);
+ if (!new_request) {
+ WL_ERR(("error Memory alloc for requlatory request failed\n"));
+ err = -ENOMEM;
+ } else {
+ new_request->alpha2[0] = country_code[0];
+ new_request->alpha2[1] = country_code[1];
+ WL_DBG(("Send an event to cfg80211 to update supplicant to take the new channel list"));
+ nl80211_send_reg_change_event(new_request);
+ kfree(new_request);
+ }
+ }
+
end_bands:
if (rollback_lock)
mutex_unlock(&wl->usr_sync);
@@ -7238,7 +7257,7 @@ static s32 __wl_cfg80211_up(struct wl_priv *wl)
if (unlikely(err && err != -EINPROGRESS)) {
WL_ERR(("wl_config_ifmode failed\n"));
}
- err = wl_update_wiphybands(wl);
+ err = wl_update_wiphybands(wl, NULL);
if (unlikely(err)) {
WL_ERR(("wl_update_wiphybands failed\n"));
}
diff --git a/drivers/net/wireless/bcmdhd/wl_cfg80211.h b/drivers/net/wireless/bcmdhd/wl_cfg80211.h
index 49bed70..c3281ec 100644
--- a/drivers/net/wireless/bcmdhd/wl_cfg80211.h
+++ b/drivers/net/wireless/bcmdhd/wl_cfg80211.h
@@ -669,6 +669,7 @@ extern int wl_cfg80211_hang(struct net_device *dev, u16 reason);
extern s32 wl_mode_to_nl80211_iftype(s32 mode);
int wl_cfg80211_do_driver_init(struct net_device *net);
void wl_cfg80211_enable_trace(int level);
-extern s32 wl_update_wiphybands(struct wl_priv *wl);
+extern s32 wl_update_wiphybands(struct wl_priv *wl, char *country_code);
extern s32 wl_cfg80211_if_is_group_owner(void);
+extern void nl80211_send_reg_change_event(struct regulatory_request *request);
#endif /* _wl_cfg80211_h_ */
diff --git a/drivers/net/wireless/bcmdhd/wldev_common.c b/drivers/net/wireless/bcmdhd/wldev_common.c
index a1156ff..51a8064 100644
--- a/drivers/net/wireless/bcmdhd/wldev_common.c
+++ b/drivers/net/wireless/bcmdhd/wldev_common.c
@@ -320,6 +320,8 @@ int wldev_set_band(
if ((band == WLC_BAND_AUTO) || (band == WLC_BAND_5G) || (band == WLC_BAND_2G)) {
error = wldev_ioctl(dev, WLC_SET_BAND, &band, sizeof(band), 1);
+ if (!error)
+ dhd_bus_band_set(dev, band);
}
return error;
}
diff --git a/drivers/net/wireless/bcmdhd/wldev_common.h b/drivers/net/wireless/bcmdhd/wldev_common.h
index f586609..dd3c899 100644
--- a/drivers/net/wireless/bcmdhd/wldev_common.h
+++ b/drivers/net/wireless/bcmdhd/wldev_common.h
@@ -85,6 +85,7 @@ s32 wldev_iovar_setint_bsscfg(
extern void get_customized_country_code(char *country_iso_code, wl_country_t *cspec);
extern void dhd_bus_country_set(struct net_device *dev, wl_country_t *cspec);
+extern void dhd_bus_band_set(struct net_device *dev, uint band);
extern int wldev_set_country(struct net_device *dev, char *country_code);
extern int net_os_wake_lock(struct net_device *dev);
extern int net_os_wake_unlock(struct net_device *dev);