提交 0117e78a 编写于 作者: M Marty Faltesek 提交者: Kalle Valo

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: NMartin Faltesek <mfaltesek@google.com>
Signed-off-by: NAmitkumar Karwar <akarwar@marvell.com>
Signed-off-by: NKalle Valo <kvalo@codeaurora.org>
上级 07225524
...@@ -1821,6 +1821,10 @@ static int mwifiex_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *dev) ...@@ -1821,6 +1821,10 @@ static int mwifiex_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *dev)
return -1; return -1;
} }
if (netif_carrier_ok(priv->netdev))
netif_carrier_off(priv->netdev);
mwifiex_stop_net_dev_queue(priv->netdev, priv->adapter);
return 0; return 0;
} }
...@@ -1925,6 +1929,10 @@ static int mwifiex_cfg80211_start_ap(struct wiphy *wiphy, ...@@ -1925,6 +1929,10 @@ static int mwifiex_cfg80211_start_ap(struct wiphy *wiphy,
if (mwifiex_set_mgmt_ies(priv, &params->beacon)) if (mwifiex_set_mgmt_ies(priv, &params->beacon))
return -1; return -1;
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)); memcpy(&priv->bss_cfg, bss_cfg, sizeof(priv->bss_cfg));
kfree(bss_cfg); kfree(bss_cfg);
return 0; return 0;
......
...@@ -179,19 +179,12 @@ int mwifiex_process_uap_event(struct mwifiex_private *priv) ...@@ -179,19 +179,12 @@ int mwifiex_process_uap_event(struct mwifiex_private *priv)
case EVENT_UAP_BSS_IDLE: case EVENT_UAP_BSS_IDLE:
priv->media_connected = false; priv->media_connected = false;
priv->port_open = false; priv->port_open = 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_clean_txrx(priv);
mwifiex_del_all_sta_list(priv); mwifiex_del_all_sta_list(priv);
break; break;
case EVENT_UAP_BSS_ACTIVE: case EVENT_UAP_BSS_ACTIVE:
priv->media_connected = true; priv->media_connected = true;
priv->port_open = true; priv->port_open = true;
if (!netif_carrier_ok(priv->netdev))
netif_carrier_on(priv->netdev);
mwifiex_wake_up_net_dev_queue(priv->netdev, adapter);
break; break;
case EVENT_UAP_BSS_START: case EVENT_UAP_BSS_START:
mwifiex_dbg(adapter, EVENT, mwifiex_dbg(adapter, EVENT,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册