aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichal Kazior <michal.kazior@tieto.com>2012-06-29 06:47:05 -0400
committerJohannes Berg <johannes.berg@intel.com>2012-06-29 07:39:18 -0400
commita69b40a95b121c4bfc52a20cccd28708ae550af1 (patch)
tree372d59aee76bdd212d3d4618f4c2342604c8d128
parentb78e8ceac23655e1e06b30aa95ab11742d1ac7c0 (diff)
cfg80211: set initial monitor channel
Implements behaviour seen in mac80211. A running monitor always has a channel - even before .set_channel. This way we won't break current behaviour. Signed-off-by: Michal Kazior <michal.kazior@tieto.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-rw-r--r--net/wireless/core.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/net/wireless/core.c b/net/wireless/core.c
index 1b5daa73b3a9..580551e9caba 100644
--- a/net/wireless/core.c
+++ b/net/wireless/core.c
@@ -717,6 +717,35 @@ static struct device_type wiphy_type = {
717 .name = "wlan", 717 .name = "wlan",
718}; 718};
719 719
720static struct ieee80211_channel *
721cfg80211_get_any_chan(struct cfg80211_registered_device *rdev)
722{
723 struct ieee80211_supported_band *sband;
724 int i;
725
726 for (i = 0; i < IEEE80211_NUM_BANDS; i++) {
727 sband = rdev->wiphy.bands[i];
728 if (sband && sband->n_channels > 0)
729 return &sband->channels[0];
730 }
731
732 return NULL;
733}
734
735static void cfg80211_init_mon_chan(struct cfg80211_registered_device *rdev)
736{
737 struct ieee80211_channel *chan;
738
739 chan = cfg80211_get_any_chan(rdev);
740 if (WARN_ON(!chan))
741 return;
742
743 mutex_lock(&rdev->devlist_mtx);
744 WARN_ON(cfg80211_set_monitor_channel(rdev, chan->center_freq,
745 NL80211_CHAN_NO_HT));
746 mutex_unlock(&rdev->devlist_mtx);
747}
748
720void cfg80211_update_iface_num(struct cfg80211_registered_device *rdev, 749void cfg80211_update_iface_num(struct cfg80211_registered_device *rdev,
721 enum nl80211_iftype iftype, int num) 750 enum nl80211_iftype iftype, int num)
722{ 751{
@@ -737,6 +766,8 @@ void cfg80211_update_iface_num(struct cfg80211_registered_device *rdev,
737 if (!has_monitors_only_new) { 766 if (!has_monitors_only_new) {
738 rdev->monitor_channel = NULL; 767 rdev->monitor_channel = NULL;
739 rdev->monitor_channel_type = NL80211_CHAN_NO_HT; 768 rdev->monitor_channel_type = NL80211_CHAN_NO_HT;
769 } else {
770 cfg80211_init_mon_chan(rdev);
740 } 771 }
741 } 772 }
742} 773}