iwlwifi: consider VHT 160MHz while parsing NVM
authorGregory Greenman <gregory.greenman@intel.com>
Sun, 3 Apr 2016 11:06:12 +0000 (14:06 +0300)
committerLuca Coelho <luciano.coelho@intel.com>
Tue, 10 May 2016 19:14:49 +0000 (22:14 +0300)
Devices belonging to 9000 family can support VHT 160MHz channel
width, so need to consider it when configuring VHT capabilities.
However, NVM file doesn't have a single bit specifying that 160MHz
is supported. This patch turns on 160MHz support in VHT capabilities
in case there's at least one channel supporting 160MHz.

Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.h
drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c

index 53f39a3..1f4e502 100644 (file)
@@ -98,6 +98,7 @@ struct iwl_nvm_data {
        s8 max_tx_pwr_half_dbm;
 
        bool lar_enabled;
+       bool vht160_supported;
        struct ieee80211_supported_band bands[NUM_NL80211_BANDS];
        struct ieee80211_channel channels[];
 };
index 14743c3..b13f409 100644 (file)
@@ -288,6 +288,9 @@ static int iwl_init_channel_map(struct device *dev, const struct iwl_cfg *cfg,
                    !data->sku_cap_band_52GHz_enable)
                        continue;
 
+               if (ch_flags & NVM_CHANNEL_160MHZ)
+                       data->vht160_supported = true;
+
                if (!lar_supported && !(ch_flags & NVM_CHANNEL_VALID)) {
                        /*
                         * Channels might become valid later if lar is
@@ -331,17 +334,20 @@ static int iwl_init_channel_map(struct device *dev, const struct iwl_cfg *cfg,
                        channel->flags = 0;
 
                IWL_DEBUG_EEPROM(dev,
-                                "Ch. %d [%sGHz] %s%s%s%s%s%s%s(0x%02x %ddBm): Ad-Hoc %ssupported\n",
+                                "Ch. %d [%sGHz] flags 0x%x %s%s%s%s%s%s%s%s%s%s(%ddBm): Ad-Hoc %ssupported\n",
                                 channel->hw_value,
                                 is_5ghz ? "5.2" : "2.4",
+                                ch_flags,
                                 CHECK_AND_PRINT_I(VALID),
                                 CHECK_AND_PRINT_I(IBSS),
                                 CHECK_AND_PRINT_I(ACTIVE),
                                 CHECK_AND_PRINT_I(RADAR),
-                                CHECK_AND_PRINT_I(WIDE),
                                 CHECK_AND_PRINT_I(INDOOR_ONLY),
                                 CHECK_AND_PRINT_I(GO_CONCURRENT),
-                                ch_flags,
+                                CHECK_AND_PRINT_I(WIDE),
+                                CHECK_AND_PRINT_I(40MHZ),
+                                CHECK_AND_PRINT_I(80MHZ),
+                                CHECK_AND_PRINT_I(160MHZ),
                                 channel->max_power,
                                 ((ch_flags & NVM_CHANNEL_IBSS) &&
                                  !(ch_flags & NVM_CHANNEL_RADAR))
@@ -370,6 +376,10 @@ static void iwl_init_vht_hw_capab(const struct iwl_cfg *cfg,
                       max_ampdu_exponent <<
                       IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
 
+       if (data->vht160_supported)
+               vht_cap->cap |=
+                       IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ;
+
        if (cfg->vht_mu_mimo_supported)
                vht_cap->cap |= IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;