diff options
author | Marty Faltesek <mfaltesek@google.com> | 2015-10-26 01:54:01 -0400 |
---|---|---|
committer | Kalle Valo <kvalo@codeaurora.org> | 2015-10-28 15:00:01 -0400 |
commit | 0117e78aec73f1c0869e50d11a255b28aa4db8f0 (patch) | |
tree | b667a7027e03c5aaa62e87105235dd16ae05fb15 | |
parent | 072255241d2e3e9c1e23fc693f0333be72adfe2a (diff) |
mwifiex: toggle carrier state in start_ap/stop_ap.
In uap mode the carrier is not enabled until after the first STA joins.
The carrier triggers the bridge to start its state machine, and if STP
is enabled, it takes 4 seconds as it transitions from disabled to
forwarding. During this time the bridge drops all traffic, and the EAPOL
handshake times out after 3 seconds, preventing stations from joining.
Follow the logic used in mac80211 and start the carrier in start_ap
and disable it in stop_ap. This has a nice benefit of allowing the
first station connection time to be reduced by up to 75% when STP is
in use.
Signed-off-by: Martin Faltesek <mfaltesek@google.com>
Signed-off-by: Amitkumar Karwar <akarwar@marvell.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
-rw-r--r-- | drivers/net/wireless/mwifiex/cfg80211.c | 8 | ||||
-rw-r--r-- | drivers/net/wireless/mwifiex/uap_event.c | 7 |
2 files changed, 8 insertions, 7 deletions
diff --git a/drivers/net/wireless/mwifiex/cfg80211.c b/drivers/net/wireless/mwifiex/cfg80211.c index b7ac45f324d7..4073116e6e9f 100644 --- a/drivers/net/wireless/mwifiex/cfg80211.c +++ b/drivers/net/wireless/mwifiex/cfg80211.c | |||
@@ -1821,6 +1821,10 @@ static int mwifiex_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *dev) | |||
1821 | return -1; | 1821 | return -1; |
1822 | } | 1822 | } |
1823 | 1823 | ||
1824 | if (netif_carrier_ok(priv->netdev)) | ||
1825 | netif_carrier_off(priv->netdev); | ||
1826 | mwifiex_stop_net_dev_queue(priv->netdev, priv->adapter); | ||
1827 | |||
1824 | return 0; | 1828 | return 0; |
1825 | } | 1829 | } |
1826 | 1830 | ||
@@ -1925,6 +1929,10 @@ static int mwifiex_cfg80211_start_ap(struct wiphy *wiphy, | |||
1925 | if (mwifiex_set_mgmt_ies(priv, ¶ms->beacon)) | 1929 | if (mwifiex_set_mgmt_ies(priv, ¶ms->beacon)) |
1926 | return -1; | 1930 | return -1; |
1927 | 1931 | ||
1932 | if (!netif_carrier_ok(priv->netdev)) | ||
1933 | netif_carrier_on(priv->netdev); | ||
1934 | mwifiex_wake_up_net_dev_queue(priv->netdev, priv->adapter); | ||
1935 | |||
1928 | memcpy(&priv->bss_cfg, bss_cfg, sizeof(priv->bss_cfg)); | 1936 | memcpy(&priv->bss_cfg, bss_cfg, sizeof(priv->bss_cfg)); |
1929 | kfree(bss_cfg); | 1937 | kfree(bss_cfg); |
1930 | return 0; | 1938 | return 0; |
diff --git a/drivers/net/wireless/mwifiex/uap_event.c b/drivers/net/wireless/mwifiex/uap_event.c index 078834cf1251..86ff54296f39 100644 --- a/drivers/net/wireless/mwifiex/uap_event.c +++ b/drivers/net/wireless/mwifiex/uap_event.c | |||
@@ -179,19 +179,12 @@ int mwifiex_process_uap_event(struct mwifiex_private *priv) | |||
179 | case EVENT_UAP_BSS_IDLE: | 179 | case EVENT_UAP_BSS_IDLE: |
180 | priv->media_connected = false; | 180 | priv->media_connected = false; |
181 | priv->port_open = false; | 181 | priv->port_open = false; |
182 | if (netif_carrier_ok(priv->netdev)) | ||
183 | netif_carrier_off(priv->netdev); | ||
184 | mwifiex_stop_net_dev_queue(priv->netdev, adapter); | ||
185 | |||
186 | mwifiex_clean_txrx(priv); | 182 | mwifiex_clean_txrx(priv); |
187 | mwifiex_del_all_sta_list(priv); | 183 | mwifiex_del_all_sta_list(priv); |
188 | break; | 184 | break; |
189 | case EVENT_UAP_BSS_ACTIVE: | 185 | case EVENT_UAP_BSS_ACTIVE: |
190 | priv->media_connected = true; | 186 | priv->media_connected = true; |
191 | priv->port_open = true; | 187 | priv->port_open = true; |
192 | if (!netif_carrier_ok(priv->netdev)) | ||
193 | netif_carrier_on(priv->netdev); | ||
194 | mwifiex_wake_up_net_dev_queue(priv->netdev, adapter); | ||
195 | break; | 188 | break; |
196 | case EVENT_UAP_BSS_START: | 189 | case EVENT_UAP_BSS_START: |
197 | mwifiex_dbg(adapter, EVENT, | 190 | mwifiex_dbg(adapter, EVENT, |