mwifiex: handle auto authentication mode correctly
authorAmitkumar Karwar <akarwar@marvell.com>
Sat, 25 Feb 2012 05:36:05 +0000 (21:36 -0800)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 5 Mar 2012 20:20:47 +0000 (15:20 -0500)
When authentication type is configured to NL80211_AUTHTYPE_AUTOMATIC,
driver tries to connect using open mode. The association is failed
if AP is configured in shared mode.

This patch adds code to try association using shared mode as well if
open mode association fails.

Now since we returned exact error code in association response handler
(instead of -1), corresponding changes are done in
mwifiex_process_cmdresp().

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/cfg80211.c
drivers/net/wireless/mwifiex/cmdevt.c
drivers/net/wireless/mwifiex/join.c
drivers/net/wireless/mwifiex/main.h
drivers/net/wireless/mwifiex/sta_ioctl.c

index a460fb0cc5032b965615ff13d9a0b6e1613a6be1..6a81101bab44eea27f2dd943fc0d9acc45c71e37 100644 (file)
@@ -873,6 +873,7 @@ mwifiex_cfg80211_assoc(struct mwifiex_private *priv, size_t ssid_len, u8 *ssid,
        priv->sec_info.wpa2_enabled = false;
        priv->wep_key_curr_index = 0;
        priv->sec_info.encryption_mode = 0;
+       priv->sec_info.is_authtype_auto = 0;
        ret = mwifiex_set_encode(priv, NULL, 0, 0, 1);
 
        if (mode == NL80211_IFTYPE_ADHOC) {
@@ -894,11 +895,12 @@ mwifiex_cfg80211_assoc(struct mwifiex_private *priv, size_t ssid_len, u8 *ssid,
        }
 
        /* Now handle infra mode. "sme" is valid for infra mode only */
-       if (sme->auth_type == NL80211_AUTHTYPE_AUTOMATIC
-                       || sme->auth_type == NL80211_AUTHTYPE_OPEN_SYSTEM)
+       if (sme->auth_type == NL80211_AUTHTYPE_AUTOMATIC) {
                auth_type = NL80211_AUTHTYPE_OPEN_SYSTEM;
-       else if (sme->auth_type == NL80211_AUTHTYPE_SHARED_KEY)
-               auth_type = NL80211_AUTHTYPE_SHARED_KEY;
+               priv->sec_info.is_authtype_auto = 1;
+       } else {
+               auth_type = sme->auth_type;
+       }
 
        if (sme->crypto.n_ciphers_pairwise) {
                priv->sec_info.encryption_mode =
index 6623db69e1571693df899ccd6e26d03c8b92620b..c82eb7ff2fa26bb381626ec8059a3b550a450fe0 100644 (file)
@@ -771,7 +771,7 @@ int mwifiex_process_cmdresp(struct mwifiex_adapter *adapter)
 
        /* Check init command response */
        if (adapter->hw_status == MWIFIEX_HW_STATUS_INITIALIZING) {
-               if (ret == -1) {
+               if (ret) {
                        dev_err(adapter->dev, "%s: cmd %#x failed during "
                                "initialization\n", __func__, cmdresp_no);
                        mwifiex_init_fw_complete(adapter);
@@ -781,10 +781,8 @@ int mwifiex_process_cmdresp(struct mwifiex_adapter *adapter)
        }
 
        if (adapter->curr_cmd) {
-               if (adapter->curr_cmd->wait_q_enabled && (!ret))
-                       adapter->cmd_wait_q.status = 0;
-               else if (adapter->curr_cmd->wait_q_enabled && (ret == -1))
-                       adapter->cmd_wait_q.status = -1;
+               if (adapter->curr_cmd->wait_q_enabled)
+                       adapter->cmd_wait_q.status = ret;
 
                /* Clean up and put current command back to cmd_free_q */
                mwifiex_insert_cmd_to_free_q(adapter, adapter->curr_cmd);
index ee439fc2f4f361eb0ee233351c26f8309468b40e..5c95e48390047664106898779c39591edfb63e9e 100644 (file)
@@ -585,7 +585,7 @@ int mwifiex_ret_802_11_associate(struct mwifiex_private *priv,
                       le16_to_cpu(assoc_rsp->cap_info_bitmap),
                       le16_to_cpu(assoc_rsp->a_id));
 
-               ret = -1;
+               ret = le16_to_cpu(assoc_rsp->status_code);
                goto done;
        }
 
index 4c862170627836faafa9452a65977c8da5e1d0f6..dddb5563398a51735ad4c1845c26dd4edafff8ec 100644 (file)
@@ -219,6 +219,7 @@ struct mwifiex_802_11_security {
        u8 wapi_key_on;
        u8 wep_enabled;
        u32 authentication_mode;
+       u8 is_authtype_auto;
        u32 encryption_mode;
 };
 
index 866026ecca4410644eecff26c13bc61e139cea51..e10161f5894c6122dbbf6b7901ba22c868d4835c 100644 (file)
@@ -249,6 +249,17 @@ int mwifiex_bss_start(struct mwifiex_private *priv, struct cfg80211_bss *bss,
                 * application retrieval */
                priv->assoc_rsp_size = 0;
                ret = mwifiex_associate(priv, bss_desc);
+
+               /* If auth type is auto and association fails using open mode,
+                * try to connect using shared mode */
+               if (ret == WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG &&
+                   priv->sec_info.is_authtype_auto &&
+                   priv->sec_info.wep_enabled) {
+                       priv->sec_info.authentication_mode =
+                                               NL80211_AUTHTYPE_SHARED_KEY;
+                       ret = mwifiex_associate(priv, bss_desc);
+               }
+
                if (bss)
                        cfg80211_put_bss(bss);
        } else {