brcmfmac: fix problem connecting to AP without security
authorArend van Spriel <arend@broadcom.com>
Wed, 6 Feb 2013 17:40:47 +0000 (18:40 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 8 Feb 2013 19:51:34 +0000 (14:51 -0500)
The bcm43236 device showed having an issue connection to an AP without
security when auth_type was set to automatic. For this particular device
a workaround is made by selecting open-system. This problem does not
occur when using wpa_supplicant as it will not use auth type automatic.

Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Reviewed-by: Piotr Haber <phaber@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c

index 153924e..d47b274 100644 (file)
@@ -1365,9 +1365,28 @@ brcmf_set_sharedkey(struct net_device *ndev,
        return err;
 }
 
+static
+enum nl80211_auth_type brcmf_war_auth_type(struct brcmf_if *ifp,
+                                          enum nl80211_auth_type type)
+{
+       u32 ci;
+       if (type == NL80211_AUTHTYPE_AUTOMATIC) {
+               /* shift to ignore chip revision */
+               ci = brcmf_get_chip_info(ifp) >> 4;
+               switch (ci) {
+               case 43236:
+                       brcmf_dbg(CONN, "43236 WAR: use OPEN instead of AUTO\n");
+                       return NL80211_AUTHTYPE_OPEN_SYSTEM;
+               default:
+                       break;
+               }
+       }
+       return type;
+}
+
 static s32
 brcmf_cfg80211_connect(struct wiphy *wiphy, struct net_device *ndev,
-                   struct cfg80211_connect_params *sme)
+                      struct cfg80211_connect_params *sme)
 {
        struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
        struct brcmf_if *ifp = netdev_priv(ndev);
@@ -1410,6 +1429,7 @@ brcmf_cfg80211_connect(struct wiphy *wiphy, struct net_device *ndev,
                goto done;
        }
 
+       sme->auth_type = brcmf_war_auth_type(ifp, sme->auth_type);
        err = brcmf_set_auth_type(ndev, sme);
        if (err) {
                brcmf_err("wl_set_auth_type failed (%d)\n", err);