diff mbox

ath9k: Support 4.9Ghz channels on AR9580 adapter.

Message ID 1463092857-18503-1-git-send-email-greearb@candelatech.com (mailing list archive)
State Rejected
Delegated to: Kalle Valo
Headers show

Commit Message

Ben Greear May 12, 2016, 10:40 p.m. UTC
From: Ben Greear <greearb@candelatech.com>

NOTE:  These channels must not be used in most regulatory
domains unless you have a license from the FCC or similar!

A proper regulatory database is also required to actually use
these channels.

Signed-off-by: Ben Greear <greearb@candelatech.com>
---
 drivers/net/wireless/ath/ath9k/ath9k.h       |  2 +-
 drivers/net/wireless/ath/ath9k/common-init.c | 42 ++++++++++++++++++++++------
 drivers/net/wireless/ath/ath9k/hw.h          |  4 +--
 3 files changed, 37 insertions(+), 11 deletions(-)

Comments

Kalle Valo June 20, 2016, 8:34 p.m. UTC | #1
Ben Greear <greearb@candelatech.com> wrote:
> From: Ben Greear <greearb@candelatech.com>
> 
> NOTE:  These channels must not be used in most regulatory
> domains unless you have a license from the FCC or similar!
> 
> A proper regulatory database is also required to actually use
> these channels.
> 
> Signed-off-by: Ben Greear <greearb@candelatech.com>

I feel that the license is a problem and this doesn't belong to the kernel.
The patch has been dropped.
Ben Greear June 20, 2016, 8:41 p.m. UTC | #2
On 06/20/2016 01:34 PM, Kalle Valo wrote:
> Ben Greear <greearb@candelatech.com> wrote:
>> From: Ben Greear <greearb@candelatech.com>
>>
>> NOTE:  These channels must not be used in most regulatory
>> domains unless you have a license from the FCC or similar!
>>
>> A proper regulatory database is also required to actually use
>> these channels.
>>
>> Signed-off-by: Ben Greear <greearb@candelatech.com>
>
> I feel that the license is a problem and this doesn't belong to the kernel.
> The patch has been dropped.

It's not a lot different from having to be in normal FCC regulations w/regard to
DFS channels, tx power, and such, but maybe having driver support is considered to make it
too easy for users to hack around restrictions?

Another part of this is that Cisco APs, at least, use fractional center
frequencies (4942.5, for instance) when using 5Mhz bandwidths on 4.9Ghz
channels, and that requires more patches that I don't think I even bothered
to post.

I'll keep this in my trees, someone needing it can just clone it and/or borrow
patches as needed.

Thanks,
Ben
Julian Calaby June 20, 2016, 11:53 p.m. UTC | #3
Hi Ben,

On Tue, Jun 21, 2016 at 6:41 AM, Ben Greear <greearb@candelatech.com> wrote:
> On 06/20/2016 01:34 PM, Kalle Valo wrote:
>>
>> Ben Greear <greearb@candelatech.com> wrote:
>>>
>>> From: Ben Greear <greearb@candelatech.com>
>>>
>>> NOTE:  These channels must not be used in most regulatory
>>> domains unless you have a license from the FCC or similar!
>>>
>>> A proper regulatory database is also required to actually use
>>> these channels.
>>>
>>> Signed-off-by: Ben Greear <greearb@candelatech.com>
>>
>>
>> I feel that the license is a problem and this doesn't belong to the
>> kernel.
>> The patch has been dropped.
>
>
> It's not a lot different from having to be in normal FCC regulations
> w/regard to
> DFS channels, tx power, and such, but maybe having driver support is
> considered to make it
> too easy for users to hack around restrictions?

Maybe hide this behind CFG80211_CERTIFICATION_ONUS or equivalent?
(Maybe a new symbol CFG80211_LICENSE_REQUIRED with big scary
feds-will-come-knocking warnings in the help text?)

Thanks,
Ben Greear June 21, 2016, midnight UTC | #4
On 06/20/2016 04:53 PM, Julian Calaby wrote:
> Hi Ben,
>
> On Tue, Jun 21, 2016 at 6:41 AM, Ben Greear <greearb@candelatech.com> wrote:
>> On 06/20/2016 01:34 PM, Kalle Valo wrote:
>>>
>>> Ben Greear <greearb@candelatech.com> wrote:
>>>>
>>>> From: Ben Greear <greearb@candelatech.com>
>>>>
>>>> NOTE:  These channels must not be used in most regulatory
>>>> domains unless you have a license from the FCC or similar!
>>>>
>>>> A proper regulatory database is also required to actually use
>>>> these channels.
>>>>
>>>> Signed-off-by: Ben Greear <greearb@candelatech.com>
>>>
>>>
>>> I feel that the license is a problem and this doesn't belong to the
>>> kernel.
>>> The patch has been dropped.
>>
>>
>> It's not a lot different from having to be in normal FCC regulations
>> w/regard to
>> DFS channels, tx power, and such, but maybe having driver support is
>> considered to make it
>> too easy for users to hack around restrictions?
>
> Maybe hide this behind CFG80211_CERTIFICATION_ONUS or equivalent?
> (Maybe a new symbol CFG80211_LICENSE_REQUIRED with big scary
> feds-will-come-knocking warnings in the help text?)

That would be fine with me.  As I said though, there are more patches
than this one needed for full features and interoperability.
The person that sent me the mac80211/wireless patches,
and hostapd for that matter, may be able to put something together for upstream,
but I am not sure if they will have time.

I don't currently feel motivated enough to try to clean it all up and
try to push it upstream myself.

Thanks,
Ben
diff mbox

Patch

diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h
index d78bb10..0429bd5 100644
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
@@ -958,7 +958,7 @@  struct ath_softc {
 	struct device *dev;
 
 	struct survey_info *cur_survey;
-	struct survey_info survey[ATH9K_NUM_CHANNELS];
+	struct survey_info survey[ATH9K_MAX_NUM_CHANNELS];
 
 	struct tasklet_struct intr_tq;
 	struct tasklet_struct bcon_tasklet;
diff --git a/drivers/net/wireless/ath/ath9k/common-init.c b/drivers/net/wireless/ath/ath9k/common-init.c
index a006c14..2bff831 100644
--- a/drivers/net/wireless/ath/ath9k/common-init.c
+++ b/drivers/net/wireless/ath/ath9k/common-init.c
@@ -86,6 +86,20 @@  static const struct ieee80211_channel ath9k_5ghz_chantable[] = {
 	CHAN5G(5785, 35), /* Channel 157 */
 	CHAN5G(5805, 36), /* Channel 161 */
 	CHAN5G(5825, 37), /* Channel 165 */
+
+	/* 4.9Ghz channels, public safety channels, license is required in US
+	 * and most other regulatory domains!
+	 */
+	CHAN5G(4915, 38), /* Channel 183 */
+	CHAN5G(4920, 39), /* Channel 184 */
+	CHAN5G(4925, 40), /* Channel 185 */
+	CHAN5G(4935, 41), /* Channel 187 */
+	CHAN5G(4940, 42), /* Channel 188 */
+	CHAN5G(4945, 43), /* Channel 189 */
+	CHAN5G(4960, 44), /* Channel 192 */
+	CHAN5G(4970, 45), /* Channel 194 */
+	CHAN5G(4980, 46), /* Channel 196 */
+#define ATH9K_NUM_49GHZ_CHANNELS 9
 };
 
 /* Atheros hardware rate code addition for short premble */
@@ -122,14 +136,28 @@  static struct ieee80211_rate ath9k_legacy_rates[] = {
 			 IEEE80211_RATE_SUPPORTS_10MHZ)),
 };
 
+static bool ath9k_49ghz_capable(struct ath_hw* ah)
+{
+	/* Seems AR9580 supports 4.9ghz, at least. */
+	switch (ah->hw_version.devid) {
+	case AR9300_DEVID_AR9580:
+		return true;
+	}
+	return false;
+}
+
+
 int ath9k_cmn_init_channels_rates(struct ath_common *common)
 {
 	struct ath_hw *ah = (struct ath_hw *)common->ah;
 	void *channels;
+	int num_5ghz_chan = ARRAY_SIZE(ath9k_5ghz_chantable);
+	if (!ath9k_49ghz_capable(ah))
+		num_5ghz_chan -= ATH9K_NUM_49GHZ_CHANNELS;
 
 	BUILD_BUG_ON(ARRAY_SIZE(ath9k_2ghz_chantable) +
-		     ARRAY_SIZE(ath9k_5ghz_chantable) !=
-		     ATH9K_NUM_CHANNELS);
+		     ARRAY_SIZE(ath9k_5ghz_chantable) >
+		     ATH9K_MAX_NUM_CHANNELS);
 
 	if (ah->caps.hw_caps & ATH9K_HW_CAP_2GHZ) {
 		channels = devm_kzalloc(ah->dev,
@@ -149,17 +177,15 @@  int ath9k_cmn_init_channels_rates(struct ath_common *common)
 	}
 
 	if (ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ) {
-		channels = devm_kzalloc(ah->dev,
-			sizeof(ath9k_5ghz_chantable), GFP_KERNEL);
+		int ch_sz = num_5ghz_chan * sizeof(ath9k_5ghz_chantable[0]);
+		channels = devm_kzalloc(ah->dev, ch_sz, GFP_KERNEL);
 		if (!channels)
 			return -ENOMEM;
 
-		memcpy(channels, ath9k_5ghz_chantable,
-		       sizeof(ath9k_5ghz_chantable));
+		memcpy(channels, ath9k_5ghz_chantable, ch_sz);
 		common->sbands[IEEE80211_BAND_5GHZ].channels = channels;
 		common->sbands[IEEE80211_BAND_5GHZ].band = IEEE80211_BAND_5GHZ;
-		common->sbands[IEEE80211_BAND_5GHZ].n_channels =
-			ARRAY_SIZE(ath9k_5ghz_chantable);
+		common->sbands[IEEE80211_BAND_5GHZ].n_channels = num_5ghz_chan;
 		common->sbands[IEEE80211_BAND_5GHZ].bitrates =
 			ath9k_legacy_rates + 4;
 		common->sbands[IEEE80211_BAND_5GHZ].n_bitrates =
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h
index 831a544..eaf8d2d 100644
--- a/drivers/net/wireless/ath/ath9k/hw.h
+++ b/drivers/net/wireless/ath/ath9k/hw.h
@@ -73,7 +73,7 @@ 
 
 #define ATH9K_RSSI_BAD			-128
 
-#define ATH9K_NUM_CHANNELS	38
+#define ATH9K_MAX_NUM_CHANNELS	47
 
 /* Register read/write primitives */
 #define REG_WRITE(_ah, _reg, _val) \
@@ -776,7 +776,7 @@  struct ath_hw {
 	struct ath9k_hw_version hw_version;
 	struct ath9k_ops_config config;
 	struct ath9k_hw_capabilities caps;
-	struct ath9k_channel channels[ATH9K_NUM_CHANNELS];
+	struct ath9k_channel channels[ATH9K_MAX_NUM_CHANNELS];
 	struct ath9k_channel *curchan;
 
 	union {