linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] cfg80211: don't change the regulatory HT flags in custom regulatory flows
@ 2017-07-07  9:56 Emmanuel Grumbach
  2017-07-07 10:00 ` [PATCH] cfg80211: honor NL80211_RRF_NO_HT40{MINUS,PLUS} Emmanuel Grumbach
  2017-07-07 10:04 ` [PATCH] cfg80211: don't change the regulatory HT flags in custom regulatory flows Emmanuel Grumbach
  0 siblings, 2 replies; 3+ messages in thread
From: Emmanuel Grumbach @ 2017-07-07  9:56 UTC (permalink / raw)
  To: johannes; +Cc: linux-wireless, Emmanuel Grumbach, [4.0+]

When the regulatory is handled by the driver, don't
interact with the flags it sets.
iwlwifi doesn't want to use channel 40 HT40+ for example.

Cc: <stable@vger.kernel.org> [4.0+]
Fixes: b0d7aa59592b ("cfg80211: allow wiphy specific regdomain management")
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
---
 net/wireless/reg.c | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/net/wireless/reg.c b/net/wireless/reg.c
index 5fae296a6a58..29879440626e 100644
--- a/net/wireless/reg.c
+++ b/net/wireless/reg.c
@@ -4,6 +4,7 @@
  * Copyright 2007	Johannes Berg <johannes@sipsolutions.net>
  * Copyright 2008-2011	Luis R. Rodriguez <mcgrof@qca.qualcomm.com>
  * Copyright 2013-2014  Intel Mobile Communications GmbH
+ * Copyright      2017  Intel Deutschland GmbH
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -1483,7 +1484,9 @@ static void reg_process_ht_flags_channel(struct wiphy *wiphy,
 {
 	struct ieee80211_supported_band *sband = wiphy->bands[channel->band];
 	struct ieee80211_channel *channel_before = NULL, *channel_after = NULL;
+	const struct ieee80211_regdomain *regd;
 	unsigned int i;
+	u32 flags;
 
 	if (!is_ht40_allowed(channel)) {
 		channel->flags |= IEEE80211_CHAN_NO_HT40;
@@ -1503,17 +1506,30 @@ static void reg_process_ht_flags_channel(struct wiphy *wiphy,
 			channel_after = c;
 	}
 
+	regd = get_wiphy_regdom(wiphy);
+	if (regd) {
+		const struct ieee80211_reg_rule *reg_rule =
+			freq_reg_info_regd(MHZ_TO_KHZ(channel->center_freq),
+					   regd, MHZ_TO_KHZ(20));
+
+		flags = reg_rule->flags;
+	} else {
+		flags = 0;
+	}
+
 	/*
 	 * Please note that this assumes target bandwidth is 20 MHz,
 	 * if that ever changes we also need to change the below logic
 	 * to include that as well.
 	 */
-	if (!is_ht40_allowed(channel_before))
+	if (!is_ht40_allowed(channel_before) ||
+	    flags & NL80211_RRF_NO_HT40MINUS)
 		channel->flags |= IEEE80211_CHAN_NO_HT40MINUS;
 	else
 		channel->flags &= ~IEEE80211_CHAN_NO_HT40MINUS;
 
-	if (!is_ht40_allowed(channel_after))
+	if (!is_ht40_allowed(channel_after) ||
+	    flags & NL80211_RRF_NO_HT40PLUS)
 		channel->flags |= IEEE80211_CHAN_NO_HT40PLUS;
 	else
 		channel->flags &= ~IEEE80211_CHAN_NO_HT40PLUS;
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH] cfg80211: honor NL80211_RRF_NO_HT40{MINUS,PLUS}
  2017-07-07  9:56 [PATCH] cfg80211: don't change the regulatory HT flags in custom regulatory flows Emmanuel Grumbach
@ 2017-07-07 10:00 ` Emmanuel Grumbach
  2017-07-07 10:04 ` [PATCH] cfg80211: don't change the regulatory HT flags in custom regulatory flows Emmanuel Grumbach
  1 sibling, 0 replies; 3+ messages in thread
From: Emmanuel Grumbach @ 2017-07-07 10:00 UTC (permalink / raw)
  To: johannes; +Cc: linux-wireless, Emmanuel Grumbach

Honor the NL80211_RRF_NO_HT40{MINUS,PLUS} flags in
reg_process_ht_flags_channel. Not doing so leads can lead
to a firmware assert in iwlwifi for example.

Fixes: b0d7aa59592b ("cfg80211: allow wiphy specific regdomain management")
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
---
 net/wireless/reg.c | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/net/wireless/reg.c b/net/wireless/reg.c
index 5fae296a6a58..29879440626e 100644
--- a/net/wireless/reg.c
+++ b/net/wireless/reg.c
@@ -4,6 +4,7 @@
  * Copyright 2007	Johannes Berg <johannes@sipsolutions.net>
  * Copyright 2008-2011	Luis R. Rodriguez <mcgrof@qca.qualcomm.com>
  * Copyright 2013-2014  Intel Mobile Communications GmbH
+ * Copyright      2017  Intel Deutschland GmbH
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -1483,7 +1484,9 @@ static void reg_process_ht_flags_channel(struct wiphy *wiphy,
 {
 	struct ieee80211_supported_band *sband = wiphy->bands[channel->band];
 	struct ieee80211_channel *channel_before = NULL, *channel_after = NULL;
+	const struct ieee80211_regdomain *regd;
 	unsigned int i;
+	u32 flags;
 
 	if (!is_ht40_allowed(channel)) {
 		channel->flags |= IEEE80211_CHAN_NO_HT40;
@@ -1503,17 +1506,30 @@ static void reg_process_ht_flags_channel(struct wiphy *wiphy,
 			channel_after = c;
 	}
 
+	regd = get_wiphy_regdom(wiphy);
+	if (regd) {
+		const struct ieee80211_reg_rule *reg_rule =
+			freq_reg_info_regd(MHZ_TO_KHZ(channel->center_freq),
+					   regd, MHZ_TO_KHZ(20));
+
+		flags = reg_rule->flags;
+	} else {
+		flags = 0;
+	}
+
 	/*
 	 * Please note that this assumes target bandwidth is 20 MHz,
 	 * if that ever changes we also need to change the below logic
 	 * to include that as well.
 	 */
-	if (!is_ht40_allowed(channel_before))
+	if (!is_ht40_allowed(channel_before) ||
+	    flags & NL80211_RRF_NO_HT40MINUS)
 		channel->flags |= IEEE80211_CHAN_NO_HT40MINUS;
 	else
 		channel->flags &= ~IEEE80211_CHAN_NO_HT40MINUS;
 
-	if (!is_ht40_allowed(channel_after))
+	if (!is_ht40_allowed(channel_after) ||
+	    flags & NL80211_RRF_NO_HT40PLUS)
 		channel->flags |= IEEE80211_CHAN_NO_HT40PLUS;
 	else
 		channel->flags &= ~IEEE80211_CHAN_NO_HT40PLUS;
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] cfg80211: don't change the regulatory HT flags in custom regulatory flows
  2017-07-07  9:56 [PATCH] cfg80211: don't change the regulatory HT flags in custom regulatory flows Emmanuel Grumbach
  2017-07-07 10:00 ` [PATCH] cfg80211: honor NL80211_RRF_NO_HT40{MINUS,PLUS} Emmanuel Grumbach
@ 2017-07-07 10:04 ` Emmanuel Grumbach
  1 sibling, 0 replies; 3+ messages in thread
From: Emmanuel Grumbach @ 2017-07-07 10:04 UTC (permalink / raw)
  To: Emmanuel Grumbach; +Cc: Johannes Berg, linux-wireless, [4.0+]

On Fri, Jul 7, 2017 at 12:56 PM, Emmanuel Grumbach
<emmanuel.grumbach@intel.com> wrote:
> When the regulatory is handled by the driver, don't
> interact with the flags it sets.
> iwlwifi doesn't want to use channel 40 HT40+ for example.
>
> Cc: <stable@vger.kernel.org> [4.0+]
> Fixes: b0d7aa59592b ("cfg80211: allow wiphy specific regdomain management")
> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>

I sent a v2 for this, but forgot to change the subject to PATCH v2...
Sorry for the mess.
In the v2, I just changed the commit log.

> ---
>  net/wireless/reg.c | 20 ++++++++++++++++++--
>  1 file changed, 18 insertions(+), 2 deletions(-)
>
> diff --git a/net/wireless/reg.c b/net/wireless/reg.c
> index 5fae296a6a58..29879440626e 100644
> --- a/net/wireless/reg.c
> +++ b/net/wireless/reg.c
> @@ -4,6 +4,7 @@
>   * Copyright 2007      Johannes Berg <johannes@sipsolutions.net>
>   * Copyright 2008-2011 Luis R. Rodriguez <mcgrof@qca.qualcomm.com>
>   * Copyright 2013-2014  Intel Mobile Communications GmbH
> + * Copyright      2017  Intel Deutschland GmbH
>   *
>   * Permission to use, copy, modify, and/or distribute this software for any
>   * purpose with or without fee is hereby granted, provided that the above
> @@ -1483,7 +1484,9 @@ static void reg_process_ht_flags_channel(struct wiphy *wiphy,
>  {
>         struct ieee80211_supported_band *sband = wiphy->bands[channel->band];
>         struct ieee80211_channel *channel_before = NULL, *channel_after = NULL;
> +       const struct ieee80211_regdomain *regd;
>         unsigned int i;
> +       u32 flags;
>
>         if (!is_ht40_allowed(channel)) {
>                 channel->flags |= IEEE80211_CHAN_NO_HT40;
> @@ -1503,17 +1506,30 @@ static void reg_process_ht_flags_channel(struct wiphy *wiphy,
>                         channel_after = c;
>         }
>
> +       regd = get_wiphy_regdom(wiphy);
> +       if (regd) {
> +               const struct ieee80211_reg_rule *reg_rule =
> +                       freq_reg_info_regd(MHZ_TO_KHZ(channel->center_freq),
> +                                          regd, MHZ_TO_KHZ(20));
> +
> +               flags = reg_rule->flags;
> +       } else {
> +               flags = 0;
> +       }
> +
>         /*
>          * Please note that this assumes target bandwidth is 20 MHz,
>          * if that ever changes we also need to change the below logic
>          * to include that as well.
>          */
> -       if (!is_ht40_allowed(channel_before))
> +       if (!is_ht40_allowed(channel_before) ||
> +           flags & NL80211_RRF_NO_HT40MINUS)
>                 channel->flags |= IEEE80211_CHAN_NO_HT40MINUS;
>         else
>                 channel->flags &= ~IEEE80211_CHAN_NO_HT40MINUS;
>
> -       if (!is_ht40_allowed(channel_after))
> +       if (!is_ht40_allowed(channel_after) ||
> +           flags & NL80211_RRF_NO_HT40PLUS)
>                 channel->flags |= IEEE80211_CHAN_NO_HT40PLUS;
>         else
>                 channel->flags &= ~IEEE80211_CHAN_NO_HT40PLUS;
> --
> 2.9.3
>

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2017-07-07 10:05 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-07-07  9:56 [PATCH] cfg80211: don't change the regulatory HT flags in custom regulatory flows Emmanuel Grumbach
2017-07-07 10:00 ` [PATCH] cfg80211: honor NL80211_RRF_NO_HT40{MINUS,PLUS} Emmanuel Grumbach
2017-07-07 10:04 ` [PATCH] cfg80211: don't change the regulatory HT flags in custom regulatory flows Emmanuel Grumbach

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).