UPSTREAM: mwifiex: correction in status codes used for association failure
authorBing Zhao <bzhao@marvell.com>
Fri, 18 Jan 2013 01:58:03 +0000 (17:58 -0800)
committerChromeBot <chrome-bot@google.com>
Fri, 18 Jan 2013 09:47:29 +0000 (01:47 -0800)
When AP responds with appropriate status code, we forward that
code correctly to cfg80211. But sometimes when there is no
response from AP, our firmware uses proprietary status codes.
We will map authentication timeout to WLAN_STATUS_AUTH_TIMEOUT
and other proprietary codes to WLAN_STATUS_UNSPECIFIED_FAILURE.

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 status
code 16 is informed for "status code=2 err=0xfffc a_id=0xffff"
authentication timeout and status code 1 is informed for
"status code=1 err=0xfffc a_id=0xffff" association timeout.

Change-Id: I8892b51073e41fe0f2db908a0f60046a806e1338
Reviewed-on: https://gerrit.chromium.org/gerrit/41611
Reviewed-by: Paul Stewart <pstew@chromium.org>
Commit-Queue: Bing Zhao <bzhao@marvell.com>
Tested-by: Bing Zhao <bzhao@marvell.com>
drivers/net/wireless/mwifiex/fw.h
drivers/net/wireless/mwifiex/join.c

index 0d2f1c9..737f3d8 100644 (file)
@@ -257,6 +257,9 @@ enum ENH_PS_MODES {
 #define HOST_SLEEP_CFG_GPIO_DEF                0xff
 #define HOST_SLEEP_CFG_GAP_DEF         0
 
+#define MWIFIEX_TIMEOUT_FOR_AP_RESP            0xfffc
+#define MWIFIEX_STATUS_CODE_AUTH_TIMEOUT       2
+
 #define CMD_F_HOSTCMD           (1 << 0)
 #define CMD_F_CANCELED          (1 << 1)
 
index c214f76..6b86f14 100644 (file)
@@ -615,23 +615,33 @@ int mwifiex_ret_802_11_associate(struct mwifiex_private *priv,
        struct ieee_types_assoc_rsp *assoc_rsp;
        struct mwifiex_bssdescriptor *bss_desc;
        u8 enable_data = true;
+       u16 cap_info, status_code;
 
        assoc_rsp = (struct ieee_types_assoc_rsp *) &resp->params;
 
+       cap_info = le16_to_cpu(assoc_rsp->cap_info_bitmap);
+       status_code = le16_to_cpu(assoc_rsp->status_code);
+
        priv->assoc_rsp_size = min(le16_to_cpu(resp->size) - S_DS_GEN,
                                   sizeof(priv->assoc_rsp_buf));
 
        memcpy(priv->assoc_rsp_buf, &resp->params, priv->assoc_rsp_size);
 
-       if (le16_to_cpu(assoc_rsp->status_code)) {
+       if (status_code) {
                priv->adapter->dbg.num_cmd_assoc_failure++;
                dev_err(priv->adapter->dev,
                        "ASSOC_RESP: failed, status code=%d err=%#x a_id=%#x\n",
-                       le16_to_cpu(assoc_rsp->status_code),
-                       le16_to_cpu(assoc_rsp->cap_info_bitmap),
-                       le16_to_cpu(assoc_rsp->a_id));
+                       status_code, cap_info, le16_to_cpu(assoc_rsp->a_id));
+
+               if (cap_info == MWIFIEX_TIMEOUT_FOR_AP_RESP) {
+                       if (status_code == MWIFIEX_STATUS_CODE_AUTH_TIMEOUT)
+                               ret = WLAN_STATUS_AUTH_TIMEOUT;
+                       else
+                               ret = WLAN_STATUS_UNSPECIFIED_FAILURE;
+               } else {
+                       ret = status_code;
+               }
 
-               ret = le16_to_cpu(assoc_rsp->status_code);
                goto done;
        }