Libertas: fix WARN_ON issues in cfg80211 support
PATCH 2/3 Libertas: fix WARN_ON issues in cfg80211 support
In following scenarios WARN_ON() in cfg80211 code was triggered.
a) Driver unload or card removal.
b) Disconnect from infra network
c) Adhoc start/join
d) Adhoc stop
Added following fixes to avoid WARN_ON() in cfg80211 code.
a) Ensured that cfg80211_disconnected() function defined in cfg80211 code will be called only in infra mode.
b) Solved timing issue by moving cfg80211_disconnected() call inside lbs_cfg_disconnect().
c) Updated "wdev->ssid" in driver code after Adhoc join/start
d) Removed unnecessory cfg80211_disconnected() call in lbs_remove_card.
Signed-off-by Amitkumar Karwar <[email protected]>
Signed-off-by Kiran Divekar <[email protected]>
--- drivers/net/wireless/libertas/cfg.c | 37 ++++++++++--------------------- drivers/net/wireless/libertas/cmdresp.c | 4 ++- drivers/net/wireless/libertas/main.c | 2 - 3 files changed, 15 insertions(+), 28 deletions(-)
drivers/net/wireless/libertas/cfg.c +12 -25
@@ -1238,28 +1238,6 @@ static int lbs_cfg_connect(struct wiphy *wiphy, struct net_device *dev,return ret; } - - - -/* callback from lbs_cfg_disconnect() */ -static int lbs_cfg_ret_disconnect (struct lbs_private *priv,unsigned long dummy, -struct cmd_header *resp) -{ -lbs_deb_enter (LBS_DEB_CFG80211 ); - -cfg80211_disconnected (priv->dev, - priv->disassoc_reason, -NULL ,0 ,/* TODO? */ -GFP_KERNEL ); - -/* TODO: get rid of priv->connect_status */ - priv->connect_status =LBS_CONNECTED ; - -lbs_deb_leave (LBS_DEB_CFG80211 ); -return 0 ; -} - -static int lbs_cfg_disconnect (struct wiphy *wiphy,struct net_device *dev,u16 reason_code) {
@@ -1277,9 +1255,14 @@ static int lbs_cfg_disconnect(struct wiphy *wiphy, struct net_device *dev,memcpy (cmd.macaddr, &priv->assoc_bss,ETH_ALEN ); cmd.reasoncode =cpu_to_le16 (reason_code); -__lbs_cmd_async (priv,CMD_802_11_DEAUTHENTICATE , - &cmd.hdr,sizeof (cmd), - lbs_cfg_ret_disconnect,0 ); +if (lbs_cmd_with_response (priv,CMD_802_11_DEAUTHENTICATE , &cmd)) +return -EFAULT ; + +cfg80211_disconnected (priv->dev, + priv->disassoc_reason, +NULL ,0 , +GFP_KERNEL ); + priv->connect_status =LBS_DISCONNECTED ;return 0 ; }
@@ -1673,6 +1656,10 @@ static void lbs_join_post(struct lbs_private *priv, params->beacon_interval, fake_ie, fake - fake_ie, 0, GFP_KERNEL); + +memcpy (priv->wdev->ssid, params->ssid, params->ssid_len); + priv->wdev->ssid_len = params->ssid_len; +cfg80211_ibss_joined (priv->dev, bssid,GFP_KERNEL );/* TODO: consider doing this at MACREG_INT_CODE_LINK_SENSED time */
drivers/net/wireless/libertas/cmdresp.c +3 -1
@@ -31,7 +31,9 @@ void lbs_mac_event_disconnected(struct lbs_private *priv)* It causes problem in the Supplicant */ msleep_interruptible (1000 ); -lbs_send_disconnect_notification (priv); + +if (priv->wdev->iftype ==NL80211_IFTYPE_STATION ) +lbs_send_disconnect_notification (priv);/* report disconnect to upper layer */ netif_stop_queue (priv->dev);
drivers/net/wireless/libertas/main.c +0 -2
@@ -932,8 +932,6 @@ void lbs_remove_card(struct lbs_private *priv)lbs_ps_wakeup (priv,CMD_OPTION_WAITFORRSP ); } -lbs_send_disconnect_notification (priv); -if (priv->is_deep_sleep) { priv->is_deep_sleep =0 ;wake_up_interruptible (&priv->ds_awake_q);
Signature · 1 line
1.7.1