diff options
author | Ganapathi Bhat <gbhat@marvell.com> | 2018-03-09 23:45:26 +0530 |
---|---|---|
committer | Kalle Valo <kvalo@codeaurora.org> | 2018-03-13 18:53:47 +0200 |
commit | 28bf8312a983a7873997bf3faf4c2b4e62e4abc0 (patch) | |
tree | 67a491c7e42bf05bc32c5b81df0041ff878c733e /drivers/net/wireless/marvell/mwifiex/cfg80211.c | |
parent | 77423fa739274a4c7b0e7ad90ca52ef22bdbe84e (diff) |
mwifiex: get_channel from firmware
At present driver gets chan_type by referring to
IEEE80211_HT_PARAM_CHA_SEC_OFFSET, in ASSOC response. Sometimes
AP shows IEEE80211_HT_PARAM_CHA_SEC_OFFSET as above/below in
assoc response, even if the association is done on HT20 channel
only. So, it will be accurate to get econdary channel offset from
firmware.
Signed-off-by: Cathy Luo <cluo@marvell.com>
Signed-off-by: Ganapathi Bhat <gbhat@marvell.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Diffstat (limited to 'drivers/net/wireless/marvell/mwifiex/cfg80211.c')
-rw-r--r-- | drivers/net/wireless/marvell/mwifiex/cfg80211.c | 40 |
1 files changed, 25 insertions, 15 deletions
diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c index ce4432c535f0..7f7e9de2db1c 100644 --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c @@ -95,18 +95,32 @@ u8 mwifiex_chan_type_to_sec_chan_offset(enum nl80211_channel_type chan_type) /* This function maps IEEE HT secondary channel type to NL80211 channel type */ -u8 mwifiex_sec_chan_offset_to_chan_type(u8 second_chan_offset) +u8 mwifiex_get_chan_type(struct mwifiex_private *priv) { - switch (second_chan_offset) { - case IEEE80211_HT_PARAM_CHA_SEC_NONE: - return NL80211_CHAN_HT20; - case IEEE80211_HT_PARAM_CHA_SEC_ABOVE: - return NL80211_CHAN_HT40PLUS; - case IEEE80211_HT_PARAM_CHA_SEC_BELOW: - return NL80211_CHAN_HT40MINUS; - default: - return NL80211_CHAN_HT20; + struct mwifiex_channel_band channel_band; + int ret; + + ret = mwifiex_get_chan_info(priv, &channel_band); + + if (!ret) { + switch (channel_band.band_config.chan_width) { + case CHAN_BW_20MHZ: + if (IS_11N_ENABLED(priv)) + return NL80211_CHAN_HT20; + else + return NL80211_CHAN_NO_HT; + case CHAN_BW_40MHZ: + if (channel_band.band_config.chan2_offset == + SEC_CHAN_ABOVE) + return NL80211_CHAN_HT40PLUS; + else + return NL80211_CHAN_HT40MINUS; + default: + return NL80211_CHAN_HT20; + } } + + return NL80211_CHAN_HT20; } /* @@ -3937,7 +3951,6 @@ static int mwifiex_cfg80211_get_channel(struct wiphy *wiphy, struct mwifiex_private *priv = mwifiex_netdev_get_priv(wdev->netdev); struct mwifiex_bssdescriptor *curr_bss; struct ieee80211_channel *chan; - u8 second_chan_offset; enum nl80211_channel_type chan_type; enum nl80211_band band; int freq; @@ -3954,10 +3967,7 @@ static int mwifiex_cfg80211_get_channel(struct wiphy *wiphy, chan = ieee80211_get_channel(wiphy, freq); if (priv->ht_param_present) { - second_chan_offset = priv->assoc_resp_ht_param & - IEEE80211_HT_PARAM_CHA_SEC_OFFSET; - chan_type = mwifiex_sec_chan_offset_to_chan_type - (second_chan_offset); + chan_type = mwifiex_get_chan_type(priv); cfg80211_chandef_create(chandef, chan, chan_type); } else { cfg80211_chandef_create(chandef, chan, |