Skip to content

Commit

Permalink
mac80211: Be more careful when changing channels.
Browse files Browse the repository at this point in the history
If we cannot set the channel type, set the channel back to the
original.

Don't update the driver hardware if nothing actually changed.

Signed-off-by: Ben Greear <greearb@candelatech.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Ben Greear authored and John W. Linville committed Feb 3, 2011
1 parent 75abde4 commit eeabee7
Showing 1 changed file with 16 additions and 3 deletions.
19 changes: 16 additions & 3 deletions net/mac80211/cfg.c
Original file line number Diff line number Diff line change
Expand Up @@ -1215,6 +1215,9 @@ static int ieee80211_set_channel(struct wiphy *wiphy,
{
struct ieee80211_local *local = wiphy_priv(wiphy);
struct ieee80211_sub_if_data *sdata = NULL;
struct ieee80211_channel *old_oper;
enum nl80211_channel_type old_oper_type;
enum nl80211_channel_type old_vif_oper_type= NL80211_CHAN_NO_HT;

if (netdev)
sdata = IEEE80211_DEV_TO_SUB_IF(netdev);
Expand All @@ -1232,13 +1235,23 @@ static int ieee80211_set_channel(struct wiphy *wiphy,
break;
}

local->oper_channel = chan;
if (sdata)
old_vif_oper_type = sdata->vif.bss_conf.channel_type;
old_oper_type = local->_oper_channel_type;

if (!ieee80211_set_channel_type(local, sdata, channel_type))
return -EBUSY;

ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL);
if (sdata && sdata->vif.type != NL80211_IFTYPE_MONITOR)
old_oper = local->oper_channel;
local->oper_channel = chan;

/* Update driver if changes were actually made. */
if ((old_oper != local->oper_channel) ||
(old_oper_type != local->_oper_channel_type))
ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL);

if ((sdata && sdata->vif.type != NL80211_IFTYPE_MONITOR) &&
old_vif_oper_type != sdata->vif.bss_conf.channel_type)
ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_HT);

return 0;
Expand Down

0 comments on commit eeabee7

Please sign in to comment.