mwifiex: update cfg80211 with correct reason code when connection is lost
authorAmitkumar Karwar <akarwar@marvell.com>
Sat, 6 Oct 2012 03:21:43 +0000 (20:21 -0700)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 8 Oct 2012 19:06:03 +0000 (15:06 -0400)
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>
Signed-off-by: John W. Linville <linville@tuxdriver.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 82e63cee1e9770bf100a11e8e76b68531741df8d..7b0858af8f5d804d05ae6c8ebd4bc20990a6ffed 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 bfb3fa69805c8d34d5d25586ec014c7d71728c9a..c2d0ab146af545431b8fe5f3d04916756ef3b782 100644 (file)
@@ -847,7 +847,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 e380171c4c5dd08918669863d4a756894e46a2e9..09e6a267f5666fd0bf868bd537635726239e4680 100644 (file)
@@ -545,7 +545,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;
 }
@@ -558,7 +558,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 aafde30e714aa97e40ecbbedc86a39fb08b26866..8132119e1a211a41c887a0bda77f433af41a8bcd 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,7 +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 ctrl;
+       u16 ctrl, reason_code;
 
        switch (eventcause) {
        case EVENT_DUMMY_HOST_WAKEUP_SIGNAL:
@@ -204,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: