UPSTREAM: mwifiex: update cfg80211 with correct reason code when connection is lost
authorBing Zhao <bzhao@marvell.com>
Sat, 6 Oct 2012 03:18:46 +0000 (20:18 -0700)
committerGerrit <chrome-bot@google.com>
Sat, 6 Oct 2012 21:29:05 +0000 (14:29 -0700)
Driver gets LINK_LOST, DEAUTHENTICATED and DISASSOCIATED events
from firmware when connection is lost in different scenarios.
Currently we are using common code WLAN_REASON_DEAUTH_LEAVING
for these cases.

This patch adds support to parse an actual reason code from
firmware event body and send it to cfg80211.
WLAN_REASON_DEAUTH_LEAVING code is used if deauth is initiated
by our device.

Signed-off-by: Amitkumar Karwar <akarwar@marvell.com>
Signed-off-by: Bing Zhao <bzhao@marvell.com>
BUG=chrome-os-partner:14966
TEST=check driver/wpa_supplicant logs and confirm that application
is informed with correct reason codes in various scenarios.

Change-Id: I18d2dd312576f19d59d7b916e93ca03daf584130
Reviewed-on: https://gerrit.chromium.org/gerrit/34848
Reviewed-by: Paul Stewart <pstew@chromium.org>
Commit-Ready: Bing Zhao <bzhao@marvell.com>
Tested-by: Bing Zhao <bzhao@marvell.com>
drivers/net/wireless/mwifiex/join.c
drivers/net/wireless/mwifiex/main.h
drivers/net/wireless/mwifiex/sta_cmdresp.c
drivers/net/wireless/mwifiex/sta_event.c

index c1ac42b..2e36541 100644 (file)
@@ -1180,16 +1180,18 @@ int mwifiex_ret_802_11_ad_hoc(struct mwifiex_private *priv,
        struct mwifiex_adapter *adapter = priv->adapter;
        struct host_cmd_ds_802_11_ad_hoc_result *adhoc_result;
        struct mwifiex_bssdescriptor *bss_desc;
+       u16 reason_code;
 
        adhoc_result = &resp->params.adhoc_result;
 
        bss_desc = priv->attempted_bss_desc;
 
        /* Join result code 0 --> SUCCESS */
-       if (le16_to_cpu(resp->result)) {
+       reason_code = le16_to_cpu(resp->result);
+       if (reason_code) {
                dev_err(priv->adapter->dev, "ADHOC_RESP: failed\n");
                if (priv->media_connected)
-                       mwifiex_reset_connect_state(priv);
+                       mwifiex_reset_connect_state(priv, reason_code);
 
                memset(&priv->curr_bss_params.bss_descriptor,
                       0x00, sizeof(struct mwifiex_bssdescriptor));
index 1a5006d..687a26a 100644 (file)
@@ -776,7 +776,7 @@ int mwifiex_cmd_802_11_associate(struct mwifiex_private *priv,
                                 struct mwifiex_bssdescriptor *bss_desc);
 int mwifiex_ret_802_11_associate(struct mwifiex_private *priv,
                                 struct host_cmd_ds_command *resp);
-void mwifiex_reset_connect_state(struct mwifiex_private *priv);
+void mwifiex_reset_connect_state(struct mwifiex_private *priv, u16 reason);
 u8 mwifiex_band_to_radio_type(u8 band);
 int mwifiex_deauthenticate(struct mwifiex_private *priv, u8 *mac);
 int mwifiex_adhoc_start(struct mwifiex_private *priv,
index 301fdd6..5caaf34 100644 (file)
@@ -526,7 +526,7 @@ static int mwifiex_ret_802_11_deauthenticate(struct mwifiex_private *priv,
        if (!memcmp(resp->params.deauth.mac_addr,
                    &priv->curr_bss_params.bss_descriptor.mac_address,
                    sizeof(resp->params.deauth.mac_addr)))
-               mwifiex_reset_connect_state(priv);
+               mwifiex_reset_connect_state(priv, WLAN_REASON_DEAUTH_LEAVING);
 
        return 0;
 }
@@ -539,7 +539,7 @@ static int mwifiex_ret_802_11_deauthenticate(struct mwifiex_private *priv,
 static int mwifiex_ret_802_11_ad_hoc_stop(struct mwifiex_private *priv,
                                          struct host_cmd_ds_command *resp)
 {
-       mwifiex_reset_connect_state(priv);
+       mwifiex_reset_connect_state(priv, WLAN_REASON_DEAUTH_LEAVING);
        return 0;
 }
 
index 293d27f..b4b584b 100644 (file)
@@ -41,7 +41,7 @@
  *      - Sends a disconnect event to upper layers/applications.
  */
 void
-mwifiex_reset_connect_state(struct mwifiex_private *priv)
+mwifiex_reset_connect_state(struct mwifiex_private *priv, u16 reason_code)
 {
        struct mwifiex_adapter *adapter = priv->adapter;
 
@@ -117,10 +117,10 @@ mwifiex_reset_connect_state(struct mwifiex_private *priv)
        priv->media_connected = false;
        dev_dbg(adapter->dev,
                "info: successfully disconnected from %pM: reason code %d\n",
-               priv->cfg_bssid, WLAN_REASON_DEAUTH_LEAVING);
+               priv->cfg_bssid, reason_code);
        if (priv->bss_mode == NL80211_IFTYPE_STATION) {
-               cfg80211_disconnected(priv->netdev, WLAN_REASON_DEAUTH_LEAVING,
-                                     NULL, 0, GFP_KERNEL);
+               cfg80211_disconnected(priv->netdev, reason_code, NULL, 0,
+                                     GFP_KERNEL);
        }
        memset(priv->cfg_bssid, 0, ETH_ALEN);
 
@@ -186,6 +186,7 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv)
        struct mwifiex_adapter *adapter = priv->adapter;
        int ret = 0;
        u32 eventcause = adapter->event_cause;
+       u16 reason_code;
 
        switch (eventcause) {
        case EVENT_DUMMY_HOST_WAKEUP_SIGNAL:
@@ -203,22 +204,31 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv)
        case EVENT_DEAUTHENTICATED:
                dev_dbg(adapter->dev, "event: Deauthenticated\n");
                adapter->dbg.num_event_deauth++;
-               if (priv->media_connected)
-                       mwifiex_reset_connect_state(priv);
+               if (priv->media_connected) {
+                       reason_code =
+                               le16_to_cpu(*(__le16 *)adapter->event_body);
+                       mwifiex_reset_connect_state(priv, reason_code);
+               }
                break;
 
        case EVENT_DISASSOCIATED:
                dev_dbg(adapter->dev, "event: Disassociated\n");
                adapter->dbg.num_event_disassoc++;
-               if (priv->media_connected)
-                       mwifiex_reset_connect_state(priv);
+               if (priv->media_connected) {
+                       reason_code =
+                               le16_to_cpu(*(__le16 *)adapter->event_body);
+                       mwifiex_reset_connect_state(priv, reason_code);
+               }
                break;
 
        case EVENT_LINK_LOST:
                dev_dbg(adapter->dev, "event: Link lost\n");
                adapter->dbg.num_event_link_lost++;
-               if (priv->media_connected)
-                       mwifiex_reset_connect_state(priv);
+               if (priv->media_connected) {
+                       reason_code =
+                               le16_to_cpu(*(__le16 *)adapter->event_body);
+                       mwifiex_reset_connect_state(priv, reason_code);
+               }
                break;
 
        case EVENT_PS_SLEEP: