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 which takes
4 seconds as it transitions from disabled->listening->learning->forwarding.
During this time the bridge drops all traffic, and the EAPOL handshake
times out after 3 seconds, preventing stations from joining.
Follow the example of mac80211 and start the carrier in start_ap and
disable it in stop_ap. This has a nice side benefit of allowing the first
station connection times to be reduced by up to 75%.
Fixes b/20833713.
Change-Id: Iccf04a0d4c90c0763f3399bf915e6d0e8f3314e5
diff --git a/drivers/net/wireless/mwifiex/cfg80211.c b/drivers/net/wireless/mwifiex/cfg80211.c
index 495621f..699a833 100644
--- a/drivers/net/wireless/mwifiex/cfg80211.c
+++ b/drivers/net/wireless/mwifiex/cfg80211.c
@@ -1765,6 +1765,13 @@
return -1;
}
+ priv->media_connected = false;
+ if (!netif_carrier_ok(priv->netdev))
+ netif_carrier_off(priv->netdev);
+ mwifiex_stop_net_dev_queue(priv->netdev, priv->adapter);
+ mwifiex_clean_txrx(priv);
+ mwifiex_del_all_sta_list(priv);
+
return 0;
}
@@ -1863,6 +1870,11 @@
if (mwifiex_set_mgmt_ies(priv, ¶ms->beacon))
return -1;
+ priv->media_connected = true;
+ if (!netif_carrier_ok(priv->netdev))
+ netif_carrier_on(priv->netdev);
+ mwifiex_wake_up_net_dev_queue(priv->netdev, priv->adapter);
+
memcpy(&priv->bss_cfg, bss_cfg, sizeof(priv->bss_cfg));
kfree(bss_cfg);
return 0;
diff --git a/drivers/net/wireless/mwifiex/uap_event.c b/drivers/net/wireless/mwifiex/uap_event.c
index f4794cd..c5bb6ee 100644
--- a/drivers/net/wireless/mwifiex/uap_event.c
+++ b/drivers/net/wireless/mwifiex/uap_event.c
@@ -113,19 +113,8 @@
mwifiex_del_sta_entry(priv, deauth_mac);
break;
case EVENT_UAP_BSS_IDLE:
- priv->media_connected = false;
- if (netif_carrier_ok(priv->netdev))
- netif_carrier_off(priv->netdev);
- mwifiex_stop_net_dev_queue(priv->netdev, adapter);
-
- mwifiex_clean_txrx(priv);
- mwifiex_del_all_sta_list(priv);
break;
case EVENT_UAP_BSS_ACTIVE:
- priv->media_connected = true;
- if (!netif_carrier_ok(priv->netdev))
- netif_carrier_on(priv->netdev);
- mwifiex_wake_up_net_dev_queue(priv->netdev, adapter);
break;
case EVENT_UAP_BSS_START:
dev_dbg(adapter->dev, "AP EVENT: event id: %#x\n", eventcause);