diff options
author | Michal Kazior <michal.kazior@tieto.com> | 2012-06-29 06:47:05 -0400 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2012-06-29 07:39:18 -0400 |
commit | a69b40a95b121c4bfc52a20cccd28708ae550af1 (patch) | |
tree | 372d59aee76bdd212d3d4618f4c2342604c8d128 /net/wireless | |
parent | b78e8ceac23655e1e06b30aa95ab11742d1ac7c0 (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>
Diffstat (limited to 'net/wireless')
-rw-r--r-- | net/wireless/core.c | 31 |
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 | ||
720 | static struct ieee80211_channel * | ||
721 | cfg80211_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 | |||
735 | static 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 | |||
720 | void cfg80211_update_iface_num(struct cfg80211_registered_device *rdev, | 749 | void 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 | } |