g***@candelatech.com
2016-05-12 22:40:57 UTC
From: Ben Greear <***@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 <***@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(-)
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 {
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 <***@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(-)
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 {
--
1.9.3
1.9.3