UPSTREAM: mwifiex: use country ie of requested AP while associating
authorBing Zhao <bzhao@marvell.com>
Tue, 11 Sep 2012 01:33:27 +0000 (18:33 -0700)
committerGerrit <chrome-bot@google.com>
Wed, 12 Sep 2012 21:46:45 +0000 (14:46 -0700)
AP's country ie is parsed and 11d information is updated in firmware
while associating. Previous mwifiex_send_domain_info_cmd_fw() call in
association path is not necessary now. Hence it is removed in this
patch.

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>
BUG=chrome-os-partner:12711
TEST=Enabled dynamic debug to dump the cmd 0x5b being sent to f/w
and verified the cmd body contains the country ie for the AP we are
associating.

Change-Id: Ia3d764433daf22bd8d3b90a3cfc49d2904189870
Reviewed-on: https://gerrit.chromium.org/gerrit/33099
Reviewed-by: Sam Leffler <sleffler@chromium.org>
Reviewed-by: Gary Morain <gmorain@chromium.org>
Commit-Ready: Bing Zhao <bzhao@marvell.com>
Tested-by: Bing Zhao <bzhao@marvell.com>
drivers/net/wireless/mwifiex/cfg80211.c
drivers/net/wireless/mwifiex/sta_ioctl.c

index b1f84fb..1bf7801 100644 (file)
@@ -345,8 +345,6 @@ mwifiex_set_rf_channel(struct mwifiex_private *priv,
                        mwifiex_cfg80211_channel_type_to_sec_chan_offset
                        (channel_type);
                adapter->channel_type = channel_type;
-
-               mwifiex_send_domain_info_cmd_fw(wiphy);
        }
 
        wiphy_dbg(wiphy, "info: setting band %d, chan offset %d, mode %d\n",
index b991de3..7dabd5a 100644 (file)
@@ -192,6 +192,44 @@ int mwifiex_fill_new_bss_desc(struct mwifiex_private *priv,
        return ret;
 }
 
+static int mwifiex_process_country_ie(struct mwifiex_private *priv,
+                                     struct cfg80211_bss *bss)
+{
+       u8 *country_ie, country_ie_len;
+       struct mwifiex_802_11d_domain_reg *domain_info =
+                                       &priv->adapter->domain_reg;
+
+       country_ie = (u8 *)ieee80211_bss_get_ie(bss, WLAN_EID_COUNTRY);
+
+       if (!country_ie)
+               return 0;
+
+       country_ie_len = country_ie[1];
+       if (country_ie_len < IEEE80211_COUNTRY_IE_MIN_LEN)
+               return 0;
+
+       domain_info->country_code[0] = country_ie[2];
+       domain_info->country_code[1] = country_ie[3];
+       domain_info->country_code[2] = ' ';
+
+       country_ie_len -= IEEE80211_COUNTRY_STRING_LEN;
+
+       domain_info->no_of_triplet =
+               country_ie_len / sizeof(struct ieee80211_country_ie_triplet);
+
+       memcpy((u8 *)domain_info->triplet,
+              &country_ie[2] + IEEE80211_COUNTRY_STRING_LEN, country_ie_len);
+
+       if (mwifiex_send_cmd_async(priv, HostCmd_CMD_802_11D_DOMAIN_INFO,
+                                  HostCmd_ACT_GEN_SET, 0, NULL)) {
+               wiphy_err(priv->wdev->wiphy,
+                         "11D: setting domain info in FW\n");
+               return -1;
+       }
+
+       return 0;
+}
+
 /*
  * In Ad-Hoc mode, the IBSS is created if not found in scan list.
  * In both Ad-Hoc and infra mode, an deauthentication is performed
@@ -207,6 +245,8 @@ int mwifiex_bss_start(struct mwifiex_private *priv, struct cfg80211_bss *bss,
        priv->scan_block = false;
 
        if (bss) {
+               mwifiex_process_country_ie(priv, bss);
+
                /* Allocate and fill new bss descriptor */
                bss_desc = kzalloc(sizeof(struct mwifiex_bssdescriptor),
                                GFP_KERNEL);