aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHauke Mehrtens <hauke@hauke-m.de>2013-03-23 20:46:02 -0400
committerJohn W. Linville <linville@tuxdriver.com>2013-03-27 13:37:36 -0400
commit492b71e8d468102372969705b65845f5e57038c5 (patch)
tree0dc2aa74e894cf810bcbaf1523acc92f652d1270
parent04d2e422df4ae6bc4f0f193be020429000dd7556 (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.c13
-rw-r--r--drivers/net/wireless/brcm80211/brcmsmac/main.c15
-rw-r--r--drivers/net/wireless/brcm80211/brcmsmac/pub.h2
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
2177void 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 */
2178static void brcms_c_gpio_init(struct brcms_c_info *wlc) 2190static 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);
332extern void brcms_c_mute(struct brcms_c_info *wlc, bool on); 332extern void brcms_c_mute(struct brcms_c_info *wlc, bool on);
333extern bool brcms_c_tx_flush_completed(struct brcms_c_info *wlc); 333extern bool brcms_c_tx_flush_completed(struct brcms_c_info *wlc);
334extern void brcms_c_start_station(struct brcms_c_info *wlc, u8 *addr); 334extern void brcms_c_start_station(struct brcms_c_info *wlc, u8 *addr);
335extern void brcms_c_start_ap(struct brcms_c_info *wlc, u8 *addr,
336 const u8 *bssid, u8 *ssid, size_t ssid_len);
335extern void brcms_c_update_beacon(struct brcms_c_info *wlc); 337extern void brcms_c_update_beacon(struct brcms_c_info *wlc);
336extern void brcms_c_set_new_beacon(struct brcms_c_info *wlc, 338extern 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,