From: Johannes Berg <johannes@sipsolutions.net>
To: linux-wireless@vger.kernel.org
Cc: Michal Kazior <michal.kazior@tieto.com>
Subject: [RFC 06/20] mac80211: refactor set_channel_type
Date: Fri, 27 Jul 2012 13:16:42 +0200 [thread overview]
Message-ID: <1343387816-9414-7-git-send-email-johannes@sipsolutions.net> (raw)
In-Reply-To: <1343387816-9414-1-git-send-email-johannes@sipsolutions.net>
From: Michal Kazior <michal.kazior@tieto.com>
Split functionality for further reuse.
Will prevent code duplication when channel context
channel_type merging is introduced.
Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
net/mac80211/chan.c | 67 ++++++++++++++++++++++++++++++++++++---------------
1 file changed, 48 insertions(+), 19 deletions(-)
diff --git a/net/mac80211/chan.c b/net/mac80211/chan.c
index 8d77ad13..90fef15 100644
--- a/net/mac80211/chan.c
+++ b/net/mac80211/chan.c
@@ -69,16 +69,14 @@ ieee80211_get_channel_mode(struct ieee80211_local *local,
return mode;
}
-bool ieee80211_set_channel_type(struct ieee80211_local *local,
- struct ieee80211_sub_if_data *sdata,
- enum nl80211_channel_type chantype)
+static enum nl80211_channel_type
+ieee80211_get_superchan(struct ieee80211_local *local,
+ struct ieee80211_sub_if_data *sdata)
{
- struct ieee80211_sub_if_data *tmp;
enum nl80211_channel_type superchan = NL80211_CHAN_NO_HT;
- bool result;
+ struct ieee80211_sub_if_data *tmp;
mutex_lock(&local->iflist_mtx);
-
list_for_each_entry(tmp, &local->interfaces, list) {
if (tmp == sdata)
continue;
@@ -104,41 +102,72 @@ bool ieee80211_set_channel_type(struct ieee80211_local *local,
break;
}
}
+ mutex_unlock(&local->iflist_mtx);
+
+ return superchan;
+}
- switch (superchan) {
+static bool
+ieee80211_channel_types_are_compatible(enum nl80211_channel_type chantype1,
+ enum nl80211_channel_type chantype2,
+ enum nl80211_channel_type *compat)
+{
+ /*
+ * start out with chantype1 being the result,
+ * overwriting later if needed
+ */
+ if (compat)
+ *compat = chantype1;
+
+ switch (chantype1) {
case NL80211_CHAN_NO_HT:
+ if (compat)
+ *compat = chantype2;
+ break;
case NL80211_CHAN_HT20:
/*
* allow any change that doesn't go to no-HT
* (if it already is no-HT no change is needed)
*/
- if (chantype == NL80211_CHAN_NO_HT)
+ if (chantype2 == NL80211_CHAN_NO_HT)
break;
- superchan = chantype;
+ if (compat)
+ *compat = chantype2;
break;
case NL80211_CHAN_HT40PLUS:
case NL80211_CHAN_HT40MINUS:
/* allow smaller bandwidth and same */
- if (chantype == NL80211_CHAN_NO_HT)
+ if (chantype2 == NL80211_CHAN_NO_HT)
break;
- if (chantype == NL80211_CHAN_HT20)
+ if (chantype2 == NL80211_CHAN_HT20)
break;
- if (superchan == chantype)
+ if (chantype2 == chantype1)
break;
- result = false;
- goto out;
+ return false;
}
- local->_oper_channel_type = superchan;
+ return true;
+}
+
+bool ieee80211_set_channel_type(struct ieee80211_local *local,
+ struct ieee80211_sub_if_data *sdata,
+ enum nl80211_channel_type chantype)
+{
+ enum nl80211_channel_type superchan;
+ enum nl80211_channel_type compatchan = NL80211_CHAN_NO_HT;
+
+ superchan = ieee80211_get_superchan(local, sdata);
+ if (!ieee80211_channel_types_are_compatible(superchan, chantype,
+ &compatchan))
+ return false;
+
+ local->_oper_channel_type = compatchan;
if (sdata)
sdata->vif.bss_conf.channel_type = chantype;
- result = true;
- out:
- mutex_unlock(&local->iflist_mtx);
+ return true;
- return result;
}
static struct ieee80211_chanctx *
--
1.7.10.4
next prev parent reply other threads:[~2012-07-27 11:17 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-07-27 11:16 [RFC 00/20] mac80211: multi-channel work Johannes Berg
2012-07-27 11:16 ` [RFC 01/20] mac80211: introduce channel context skeleton code Johannes Berg
2012-07-27 11:16 ` [RFC 02/20] mac80211: introduce new ieee80211_ops Johannes Berg
2012-07-27 11:16 ` [RFC 03/20] mac80211: add drv_* wrappers for channel contexts Johannes Berg
2012-07-27 18:08 ` Joe Perches
2012-07-27 21:03 ` Johannes Berg
2012-07-27 11:16 ` [RFC 04/20] mac80211: add chanctx tracing Johannes Berg
2012-07-27 11:16 ` [RFC 05/20] mac80211: use channel context notifications Johannes Berg
2012-07-27 11:16 ` Johannes Berg [this message]
2012-07-29 9:03 ` [RFC 06/20] mac80211: refactor set_channel_type Eliad Peller
2012-07-27 11:16 ` [RFC 07/20] mac80211: reuse channels for channel contexts Johannes Berg
2012-07-27 11:16 ` [RFC 08/20] mac80211: mesh: don't use global channel type Johannes Berg
2012-07-27 11:16 ` [RFC 09/20] mac80211: remove almost unused local variable Johannes Berg
2012-07-27 11:16 ` [RFC 10/20] mac80211: remove freq/chantype from debugfs Johannes Berg
2012-07-27 11:16 ` [RFC 11/20] mac80211: use oper_channel in rate init Johannes Berg
2012-07-27 11:16 ` [RFC 12/20] mac80211: don't assume channel is set in tracing Johannes Berg
2012-07-27 11:16 ` [RFC 13/20] mac80211: use RX status band instead of current band Johannes Berg
2012-07-27 11:16 ` [RFC 14/20] mac80211: check operating channel in scan Johannes Berg
2012-07-27 11:16 ` [RFC 15/20] mac80211: convert ops checks to WARN_ON Johannes Berg
2012-07-27 11:16 ` [RFC 16/20] mac80211: check channel context methods Johannes Berg
2012-07-27 11:16 ` [RFC 17/20] mac80211: track whether to use channel contexts Johannes Berg
2012-07-27 11:16 ` [RFC 18/20] mac80211: allow drv_add_chanctx to fail Johannes Berg
2012-07-27 11:42 ` Michal Kazior
2012-07-27 11:42 ` Johannes Berg
2012-07-27 11:45 ` Michal Kazior
2012-07-27 11:16 ` [RFC 19/20] mac80211: return error code from ieee80211_vif_use_channel Johannes Berg
2012-07-27 11:16 ` [RFC 20/20] mac80211: use channel contexts Johannes Berg
2012-07-27 11:46 ` Michal Kazior
2012-07-27 11:55 ` Johannes Berg
2012-08-06 15:21 ` Arik Nemtsov
2012-08-06 15:26 ` Johannes Berg
2012-07-27 12:31 ` [RFC 00/20] mac80211: multi-channel work Johannes Berg
2012-08-24 9:29 ` Johannes Berg
2012-08-26 7:58 ` Eliad Peller
2012-08-26 8:10 ` Johannes Berg
2012-08-26 8:28 ` Eliad Peller
2012-08-26 8:30 ` Johannes Berg
2012-08-26 8:36 ` Eliad Peller
2012-09-05 14:03 ` Johannes Berg
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1343387816-9414-7-git-send-email-johannes@sipsolutions.net \
--to=johannes@sipsolutions.net \
--cc=linux-wireless@vger.kernel.org \
--cc=michal.kazior@tieto.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).