Skip to content

Commit

Permalink
mwifiex: fix issues in band configuration code
Browse files Browse the repository at this point in the history
Currently due to following issues in the code even if device is
configured in B only, G only or BG mode using iw bitrates command,
ibss is getting created in BGN mode.

1) mwifiex_channels_to_cfg80211_channel_type() routine gives channel
type as NL80211_CHAN_HT20 for non-HT channel as well, because driver
doesn't store HT information provided by stack for the channel.
This issue is fixed by maintaining channel type information in
'adapter->channel_type'.
2) Band configuration is unnecessarily overwritten with BGN/AN while
setting channel.

This patch makes sure that "adapter->config_bands" correctly gets
modified while setting channel.

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>
  • Loading branch information
Amitkumar Karwar authored and John W. Linville committed Dec 21, 2011
1 parent 21c3ba3 commit 3aebee0
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 30 deletions.
49 changes: 19 additions & 30 deletions drivers/net/wireless/mwifiex/cfg80211.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,30 +47,6 @@ mwifiex_cfg80211_channel_type_to_sec_chan_offset(enum nl80211_channel_type
}
}

/*
* This function maps the driver channel type into nl802.11 channel type.
*
* The mapping is as follows -
* IEEE80211_HT_PARAM_CHA_SEC_NONE -> NL80211_CHAN_HT20
* IEEE80211_HT_PARAM_CHA_SEC_ABOVE -> NL80211_CHAN_HT40PLUS
* IEEE80211_HT_PARAM_CHA_SEC_BELOW -> NL80211_CHAN_HT40MINUS
* Others -> NL80211_CHAN_HT20
*/
static enum nl80211_channel_type
mwifiex_channels_to_cfg80211_channel_type(int channel_type)
{
switch (channel_type) {
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;
}
}

/*
* This function checks whether WEP is set.
*/
Expand Down Expand Up @@ -337,10 +313,22 @@ mwifiex_set_rf_channel(struct mwifiex_private *priv,

if (chan) {
/* Set appropriate bands */
if (chan->band == IEEE80211_BAND_2GHZ)
config_bands = BAND_B | BAND_G | BAND_GN;
else
config_bands = BAND_AN | BAND_A;
if (chan->band == IEEE80211_BAND_2GHZ) {
if (channel_type == NL80211_CHAN_NO_HT)
if (priv->adapter->config_bands == BAND_B ||
priv->adapter->config_bands == BAND_G)
config_bands =
priv->adapter->config_bands;
else
config_bands = BAND_B | BAND_G;
else
config_bands = BAND_B | BAND_G | BAND_GN;
} else {
if (channel_type == NL80211_CHAN_NO_HT)
config_bands = BAND_A;
else
config_bands = BAND_AN | BAND_A;
}

if (!((config_bands | adapter->fw_bands) &
~adapter->fw_bands)) {
Expand All @@ -357,6 +345,7 @@ mwifiex_set_rf_channel(struct mwifiex_private *priv,
adapter->sec_chan_offset =
mwifiex_cfg80211_channel_type_to_sec_chan_offset
(channel_type);
adapter->channel_type = channel_type;

mwifiex_send_domain_info_cmd_fw(wiphy);
}
Expand Down Expand Up @@ -730,6 +719,7 @@ static int mwifiex_cfg80211_set_bitrate_mask(struct wiphy *wiphy,
}
}
adapter->sec_chan_offset = IEEE80211_HT_PARAM_CHA_SEC_NONE;
adapter->channel_type = NL80211_CHAN_NO_HT;

wiphy_debug(wiphy, "info: device configured in 802.11%s%s mode\n",
(mode & BAND_B) ? "b" : "",
Expand Down Expand Up @@ -849,8 +839,7 @@ mwifiex_cfg80211_assoc(struct mwifiex_private *priv, size_t ssid_len, u8 *ssid,

if (channel)
ret = mwifiex_set_rf_channel(priv, channel,
mwifiex_channels_to_cfg80211_channel_type
(priv->adapter->sec_chan_offset));
priv->adapter->channel_type);

ret = mwifiex_set_encode(priv, NULL, 0, 0, 1); /* Disable keys */

Expand Down
1 change: 1 addition & 0 deletions drivers/net/wireless/mwifiex/main.h
Original file line number Diff line number Diff line change
Expand Up @@ -641,6 +641,7 @@ struct mwifiex_adapter {
u8 hw_dev_mcs_support;
u8 adhoc_11n_enabled;
u8 sec_chan_offset;
enum nl80211_channel_type channel_type;
struct mwifiex_dbg dbg;
u8 arp_filter[ARP_FILTER_MAX_BUF_SIZE];
u32 arp_filter_size;
Expand Down

0 comments on commit 3aebee0

Please sign in to comment.