diff options
author | Hauke Mehrtens <hauke@hauke-m.de> | 2013-03-23 20:46:02 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2013-03-27 13:37:36 -0400 |
commit | 492b71e8d468102372969705b65845f5e57038c5 (patch) | |
tree | 0dc2aa74e894cf810bcbaf1523acc92f652d1270 | |
parent | 04d2e422df4ae6bc4f0f193be020429000dd7556 (diff) |
brcmsmac: activate AP support
This activates the AP mode support.
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c | 13 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmsmac/main.c | 15 | ||||
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmsmac/pub.h | 2 |
3 files changed, 26 insertions, 4 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c index 13c284e73586..1c4f98686e49 100644 --- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c +++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c | |||
@@ -357,10 +357,11 @@ brcms_ops_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif) | |||
357 | { | 357 | { |
358 | struct brcms_info *wl = hw->priv; | 358 | struct brcms_info *wl = hw->priv; |
359 | 359 | ||
360 | /* Just STA for now */ | 360 | /* Just STA and AP for now */ |
361 | if (vif->type != NL80211_IFTYPE_STATION) { | 361 | if (vif->type != NL80211_IFTYPE_STATION && |
362 | vif->type != NL80211_IFTYPE_AP) { | ||
362 | brcms_err(wl->wlc->hw->d11core, | 363 | brcms_err(wl->wlc->hw->d11core, |
363 | "%s: Attempt to add type %d, only STA for now\n", | 364 | "%s: Attempt to add type %d, only STA and AP for now\n", |
364 | __func__, vif->type); | 365 | __func__, vif->type); |
365 | return -EOPNOTSUPP; | 366 | return -EOPNOTSUPP; |
366 | } | 367 | } |
@@ -370,6 +371,9 @@ brcms_ops_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif) | |||
370 | brcms_c_mute(wl->wlc, false); | 371 | brcms_c_mute(wl->wlc, false); |
371 | if (vif->type == NL80211_IFTYPE_STATION) | 372 | if (vif->type == NL80211_IFTYPE_STATION) |
372 | brcms_c_start_station(wl->wlc, vif->addr); | 373 | brcms_c_start_station(wl->wlc, vif->addr); |
374 | else if (vif->type == NL80211_IFTYPE_AP) | ||
375 | brcms_c_start_ap(wl->wlc, vif->addr, vif->bss_conf.bssid, | ||
376 | vif->bss_conf.ssid, vif->bss_conf.ssid_len); | ||
373 | spin_unlock_bh(&wl->lock); | 377 | spin_unlock_bh(&wl->lock); |
374 | 378 | ||
375 | return 0; | 379 | return 0; |
@@ -1051,7 +1055,8 @@ static int ieee_hw_init(struct ieee80211_hw *hw) | |||
1051 | 1055 | ||
1052 | /* channel change time is dependent on chip and band */ | 1056 | /* channel change time is dependent on chip and band */ |
1053 | hw->channel_change_time = 7 * 1000; | 1057 | hw->channel_change_time = 7 * 1000; |
1054 | hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION); | 1058 | hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | |
1059 | BIT(NL80211_IFTYPE_AP); | ||
1055 | 1060 | ||
1056 | /* | 1061 | /* |
1057 | * deactivate sending probe responses by ucude, because this will | 1062 | * deactivate sending probe responses by ucude, because this will |
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c b/drivers/net/wireless/brcm80211/brcmsmac/main.c index 63fb9fd6ef6d..7825202259c7 100644 --- a/drivers/net/wireless/brcm80211/brcmsmac/main.c +++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c | |||
@@ -2174,6 +2174,18 @@ void brcms_c_start_station(struct brcms_c_info *wlc, u8 *addr) | |||
2174 | wlc->bsscfg->type = BRCMS_TYPE_STATION; | 2174 | wlc->bsscfg->type = BRCMS_TYPE_STATION; |
2175 | } | 2175 | } |
2176 | 2176 | ||
2177 | void brcms_c_start_ap(struct brcms_c_info *wlc, u8 *addr, const u8 *bssid, | ||
2178 | u8 *ssid, size_t ssid_len) | ||
2179 | { | ||
2180 | brcms_c_set_ssid(wlc, ssid, ssid_len); | ||
2181 | |||
2182 | memcpy(wlc->pub->cur_etheraddr, addr, sizeof(wlc->pub->cur_etheraddr)); | ||
2183 | memcpy(wlc->bsscfg->BSSID, bssid, sizeof(wlc->bsscfg->BSSID)); | ||
2184 | wlc->bsscfg->type = BRCMS_TYPE_AP; | ||
2185 | |||
2186 | brcms_b_mctrl(wlc->hw, MCTL_AP | MCTL_INFRA, MCTL_AP | MCTL_INFRA); | ||
2187 | } | ||
2188 | |||
2177 | /* Initialize GPIOs that are controlled by D11 core */ | 2189 | /* Initialize GPIOs that are controlled by D11 core */ |
2178 | static void brcms_c_gpio_init(struct brcms_c_info *wlc) | 2190 | static void brcms_c_gpio_init(struct brcms_c_info *wlc) |
2179 | { | 2191 | { |
@@ -3062,6 +3074,9 @@ static bool brcms_c_ps_allowed(struct brcms_c_info *wlc) | |||
3062 | if (wlc->filter_flags & FIF_PROMISC_IN_BSS) | 3074 | if (wlc->filter_flags & FIF_PROMISC_IN_BSS) |
3063 | return false; | 3075 | return false; |
3064 | 3076 | ||
3077 | if (wlc->bsscfg->type == BRCMS_TYPE_AP) | ||
3078 | return false; | ||
3079 | |||
3065 | return true; | 3080 | return true; |
3066 | } | 3081 | } |
3067 | 3082 | ||
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/pub.h b/drivers/net/wireless/brcm80211/brcmsmac/pub.h index 6fa746e6117d..e3bdccf629aa 100644 --- a/drivers/net/wireless/brcm80211/brcmsmac/pub.h +++ b/drivers/net/wireless/brcm80211/brcmsmac/pub.h | |||
@@ -332,6 +332,8 @@ extern bool brcms_c_check_radio_disabled(struct brcms_c_info *wlc); | |||
332 | extern void brcms_c_mute(struct brcms_c_info *wlc, bool on); | 332 | extern void brcms_c_mute(struct brcms_c_info *wlc, bool on); |
333 | extern bool brcms_c_tx_flush_completed(struct brcms_c_info *wlc); | 333 | extern bool brcms_c_tx_flush_completed(struct brcms_c_info *wlc); |
334 | extern void brcms_c_start_station(struct brcms_c_info *wlc, u8 *addr); | 334 | extern void brcms_c_start_station(struct brcms_c_info *wlc, u8 *addr); |
335 | extern void brcms_c_start_ap(struct brcms_c_info *wlc, u8 *addr, | ||
336 | const u8 *bssid, u8 *ssid, size_t ssid_len); | ||
335 | extern void brcms_c_update_beacon(struct brcms_c_info *wlc); | 337 | extern void brcms_c_update_beacon(struct brcms_c_info *wlc); |
336 | extern void brcms_c_set_new_beacon(struct brcms_c_info *wlc, | 338 | extern void brcms_c_set_new_beacon(struct brcms_c_info *wlc, |
337 | struct sk_buff *beacon, u16 tim_offset, | 339 | struct sk_buff *beacon, u16 tim_offset, |