From: John Crispin <john@phrozen.org>
To: Kalle Valo <kvalo@codeaurora.org>
Cc: Shashidhar Lakkavalli <slakkavalli@datto.com>,
linux-wireless@vger.kernel.org, ath11k@lists.infradead.org,
John Crispin <john@phrozen.org>
Subject: [PATCH V5 3/8] ath11k: move phymode selection from function to array lookup
Date: Mon, 20 May 2019 10:55:03 +0200 [thread overview]
Message-ID: <20190520085508.5888-4-john@phrozen.org> (raw)
In-Reply-To: <20190520085508.5888-1-john@phrozen.org>
With HE support getting added, the approach of using functions will quickly
get convoluted. Change the code to use an array lookup function instead.
Signed-off-by: Shashidhar Lakkavalli <slakkavalli@datto.com>
Signed-off-by: John Crispin <john@phrozen.org>
---
drivers/net/wireless/ath/ath11k/mac.c | 117 ++++++++++++--------------
include/uapi/linux/nl80211.h | 4 +
2 files changed, 57 insertions(+), 64 deletions(-)
diff --git a/drivers/net/wireless/ath/ath11k/mac.c b/drivers/net/wireless/ath/ath11k/mac.c
index cb0de8e2aa60..c5a55fb893ae 100644
--- a/drivers/net/wireless/ath/ath11k/mac.c
+++ b/drivers/net/wireless/ath/ath11k/mac.c
@@ -105,6 +105,52 @@ static struct ieee80211_rate ath11k_legacy_rates[] = {
{ .bitrate = 540, .hw_value = ATH11K_HW_RATE_OFDM_54M },
};
+static const int
+ath11k_phymodes[NUM_NL80211_BANDS][2][__NL80211_CHAN_WIDTH_NUM] = {
+ [NL80211_BAND_2GHZ] = {
+ {
+ [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
+ [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
+ [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11G,
+ [NL80211_CHAN_WIDTH_20] = MODE_11NG_HT20,
+ [NL80211_CHAN_WIDTH_40] = MODE_11NG_HT40,
+ [NL80211_CHAN_WIDTH_80] = MODE_UNKNOWN,
+ [NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN,
+ [NL80211_CHAN_WIDTH_160] = MODE_UNKNOWN,
+ }, {
+ [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
+ [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
+ [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11G,
+ [NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20_2G,
+ [NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40_2G,
+ [NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80_2G,
+ [NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN,
+ [NL80211_CHAN_WIDTH_160] = MODE_UNKNOWN,
+ },
+ },
+ [NL80211_BAND_5GHZ] = {
+ {
+ [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
+ [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
+ [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11A,
+ [NL80211_CHAN_WIDTH_20] = MODE_11AC_VHT20,
+ [NL80211_CHAN_WIDTH_40] = MODE_11AC_VHT40,
+ [NL80211_CHAN_WIDTH_80] = MODE_11AC_VHT80,
+ [NL80211_CHAN_WIDTH_160] = MODE_11AC_VHT160,
+ [NL80211_CHAN_WIDTH_80P80] = MODE_11AC_VHT80_80,
+ }, {
+ [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
+ [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
+ [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11A,
+ [NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20,
+ [NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40,
+ [NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80,
+ [NL80211_CHAN_WIDTH_160] = MODE_11AX_HE160,
+ [NL80211_CHAN_WIDTH_80P80] = MODE_11AX_HE80_80,
+ },
+ },
+};
+
#define ATH11K_MAC_FIRST_OFDM_RATE_IDX 4
#define ath11k_g_rates ath11k_legacy_rates
#define ath11k_g_rates_size (ARRAY_SIZE(ath11k_legacy_rates))
@@ -151,69 +197,6 @@ static int get_num_chains(u32 mask)
return num_chains;
}
-static inline enum wmi_phy_mode
-chan_to_phymode(const struct cfg80211_chan_def *chandef)
-{
- enum wmi_phy_mode phymode = MODE_UNKNOWN;
-
- switch (chandef->chan->band) {
- case NL80211_BAND_2GHZ:
- switch (chandef->width) {
- case NL80211_CHAN_WIDTH_20_NOHT:
- if (chandef->chan->flags & IEEE80211_CHAN_NO_OFDM)
- phymode = MODE_11B;
- else
- phymode = MODE_11G;
- break;
- case NL80211_CHAN_WIDTH_20:
- phymode = MODE_11NG_HT20;
- break;
- case NL80211_CHAN_WIDTH_40:
- phymode = MODE_11NG_HT40;
- break;
- case NL80211_CHAN_WIDTH_5:
- case NL80211_CHAN_WIDTH_10:
- case NL80211_CHAN_WIDTH_80:
- case NL80211_CHAN_WIDTH_80P80:
- case NL80211_CHAN_WIDTH_160:
- phymode = MODE_UNKNOWN;
- break;
- }
- break;
- case NL80211_BAND_5GHZ:
- switch (chandef->width) {
- case NL80211_CHAN_WIDTH_20_NOHT:
- phymode = MODE_11A;
- break;
- case NL80211_CHAN_WIDTH_20:
- phymode = MODE_11AC_VHT20;
- break;
- case NL80211_CHAN_WIDTH_40:
- phymode = MODE_11AC_VHT40;
- break;
- case NL80211_CHAN_WIDTH_80:
- phymode = MODE_11AC_VHT80;
- break;
- case NL80211_CHAN_WIDTH_160:
- phymode = MODE_11AC_VHT160;
- break;
- case NL80211_CHAN_WIDTH_80P80:
- phymode = MODE_11AC_VHT80_80;
- break;
- case NL80211_CHAN_WIDTH_5:
- case NL80211_CHAN_WIDTH_10:
- phymode = MODE_UNKNOWN;
- break;
- }
- break;
- default:
- break;
- }
-
- WARN_ON(phymode == MODE_UNKNOWN);
- return phymode;
-}
-
u8 ath11k_mac_bitrate_to_idx(const struct ieee80211_supported_band *sband,
u32 bitrate)
{
@@ -3881,6 +3864,7 @@ ath11k_mac_vdev_start_restart(struct ath11k_vif *arvif,
struct ath11k_base *ab = ar->ab;
struct wmi_vdev_start_req_arg arg = {};
int ret = 0;
+ int he_support = arvif->vif->bss_conf.he_support;
lockdep_assert_held(&ar->conf_mutex);
@@ -3893,7 +3877,12 @@ ath11k_mac_vdev_start_restart(struct ath11k_vif *arvif,
arg.channel.freq = chandef->chan->center_freq;
arg.channel.band_center_freq1 = chandef->center_freq1;
arg.channel.band_center_freq2 = chandef->center_freq2;
- arg.channel.mode = chan_to_phymode(chandef);
+ arg.channel.mode =
+ ath11k_phymodes[chandef->chan->band][he_support][chandef->width];
+ if (arg.channel.mode == MODE_11G &&
+ chandef->chan->flags & IEEE80211_CHAN_NO_OFDM)
+ arg.channel.mode = MODE_11B;
+ WARN_ON(arg.channel.mode == MODE_UNKNOWN);
arg.channel.min_power = 0;
arg.channel.max_power = chandef->chan->max_power * 2;
diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
index dd4f86ee286e..b6e29161ec8b 100644
--- a/include/uapi/linux/nl80211.h
+++ b/include/uapi/linux/nl80211.h
@@ -4162,6 +4162,10 @@ enum nl80211_chan_width {
NL80211_CHAN_WIDTH_160,
NL80211_CHAN_WIDTH_5,
NL80211_CHAN_WIDTH_10,
+
+ /* keep last */
+ __NL80211_CHAN_WIDTH_NUM,
+ NL80211_CHAN_WIDTH_MAX = __NL80211_CHAN_WIDTH_NUM - 1,
};
/**
--
2.20.1
_______________________________________________
ath11k mailing list
ath11k@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/ath11k
WARNING: multiple messages have this Message-ID (diff)
From: John Crispin <john@phrozen.org>
To: Kalle Valo <kvalo@codeaurora.org>
Cc: ath11k@lists.infradead.org, linux-wireless@vger.kernel.org,
John Crispin <john@phrozen.org>,
Shashidhar Lakkavalli <slakkavalli@datto.com>
Subject: [PATCH V5 3/8] ath11k: move phymode selection from function to array lookup
Date: Mon, 20 May 2019 10:55:03 +0200 [thread overview]
Message-ID: <20190520085508.5888-4-john@phrozen.org> (raw)
In-Reply-To: <20190520085508.5888-1-john@phrozen.org>
With HE support getting added, the approach of using functions will quickly
get convoluted. Change the code to use an array lookup function instead.
Signed-off-by: Shashidhar Lakkavalli <slakkavalli@datto.com>
Signed-off-by: John Crispin <john@phrozen.org>
---
drivers/net/wireless/ath/ath11k/mac.c | 117 ++++++++++++--------------
include/uapi/linux/nl80211.h | 4 +
2 files changed, 57 insertions(+), 64 deletions(-)
diff --git a/drivers/net/wireless/ath/ath11k/mac.c b/drivers/net/wireless/ath/ath11k/mac.c
index cb0de8e2aa60..c5a55fb893ae 100644
--- a/drivers/net/wireless/ath/ath11k/mac.c
+++ b/drivers/net/wireless/ath/ath11k/mac.c
@@ -105,6 +105,52 @@ static struct ieee80211_rate ath11k_legacy_rates[] = {
{ .bitrate = 540, .hw_value = ATH11K_HW_RATE_OFDM_54M },
};
+static const int
+ath11k_phymodes[NUM_NL80211_BANDS][2][__NL80211_CHAN_WIDTH_NUM] = {
+ [NL80211_BAND_2GHZ] = {
+ {
+ [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
+ [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
+ [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11G,
+ [NL80211_CHAN_WIDTH_20] = MODE_11NG_HT20,
+ [NL80211_CHAN_WIDTH_40] = MODE_11NG_HT40,
+ [NL80211_CHAN_WIDTH_80] = MODE_UNKNOWN,
+ [NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN,
+ [NL80211_CHAN_WIDTH_160] = MODE_UNKNOWN,
+ }, {
+ [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
+ [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
+ [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11G,
+ [NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20_2G,
+ [NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40_2G,
+ [NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80_2G,
+ [NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN,
+ [NL80211_CHAN_WIDTH_160] = MODE_UNKNOWN,
+ },
+ },
+ [NL80211_BAND_5GHZ] = {
+ {
+ [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
+ [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
+ [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11A,
+ [NL80211_CHAN_WIDTH_20] = MODE_11AC_VHT20,
+ [NL80211_CHAN_WIDTH_40] = MODE_11AC_VHT40,
+ [NL80211_CHAN_WIDTH_80] = MODE_11AC_VHT80,
+ [NL80211_CHAN_WIDTH_160] = MODE_11AC_VHT160,
+ [NL80211_CHAN_WIDTH_80P80] = MODE_11AC_VHT80_80,
+ }, {
+ [NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
+ [NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
+ [NL80211_CHAN_WIDTH_20_NOHT] = MODE_11A,
+ [NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20,
+ [NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40,
+ [NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80,
+ [NL80211_CHAN_WIDTH_160] = MODE_11AX_HE160,
+ [NL80211_CHAN_WIDTH_80P80] = MODE_11AX_HE80_80,
+ },
+ },
+};
+
#define ATH11K_MAC_FIRST_OFDM_RATE_IDX 4
#define ath11k_g_rates ath11k_legacy_rates
#define ath11k_g_rates_size (ARRAY_SIZE(ath11k_legacy_rates))
@@ -151,69 +197,6 @@ static int get_num_chains(u32 mask)
return num_chains;
}
-static inline enum wmi_phy_mode
-chan_to_phymode(const struct cfg80211_chan_def *chandef)
-{
- enum wmi_phy_mode phymode = MODE_UNKNOWN;
-
- switch (chandef->chan->band) {
- case NL80211_BAND_2GHZ:
- switch (chandef->width) {
- case NL80211_CHAN_WIDTH_20_NOHT:
- if (chandef->chan->flags & IEEE80211_CHAN_NO_OFDM)
- phymode = MODE_11B;
- else
- phymode = MODE_11G;
- break;
- case NL80211_CHAN_WIDTH_20:
- phymode = MODE_11NG_HT20;
- break;
- case NL80211_CHAN_WIDTH_40:
- phymode = MODE_11NG_HT40;
- break;
- case NL80211_CHAN_WIDTH_5:
- case NL80211_CHAN_WIDTH_10:
- case NL80211_CHAN_WIDTH_80:
- case NL80211_CHAN_WIDTH_80P80:
- case NL80211_CHAN_WIDTH_160:
- phymode = MODE_UNKNOWN;
- break;
- }
- break;
- case NL80211_BAND_5GHZ:
- switch (chandef->width) {
- case NL80211_CHAN_WIDTH_20_NOHT:
- phymode = MODE_11A;
- break;
- case NL80211_CHAN_WIDTH_20:
- phymode = MODE_11AC_VHT20;
- break;
- case NL80211_CHAN_WIDTH_40:
- phymode = MODE_11AC_VHT40;
- break;
- case NL80211_CHAN_WIDTH_80:
- phymode = MODE_11AC_VHT80;
- break;
- case NL80211_CHAN_WIDTH_160:
- phymode = MODE_11AC_VHT160;
- break;
- case NL80211_CHAN_WIDTH_80P80:
- phymode = MODE_11AC_VHT80_80;
- break;
- case NL80211_CHAN_WIDTH_5:
- case NL80211_CHAN_WIDTH_10:
- phymode = MODE_UNKNOWN;
- break;
- }
- break;
- default:
- break;
- }
-
- WARN_ON(phymode == MODE_UNKNOWN);
- return phymode;
-}
-
u8 ath11k_mac_bitrate_to_idx(const struct ieee80211_supported_band *sband,
u32 bitrate)
{
@@ -3881,6 +3864,7 @@ ath11k_mac_vdev_start_restart(struct ath11k_vif *arvif,
struct ath11k_base *ab = ar->ab;
struct wmi_vdev_start_req_arg arg = {};
int ret = 0;
+ int he_support = arvif->vif->bss_conf.he_support;
lockdep_assert_held(&ar->conf_mutex);
@@ -3893,7 +3877,12 @@ ath11k_mac_vdev_start_restart(struct ath11k_vif *arvif,
arg.channel.freq = chandef->chan->center_freq;
arg.channel.band_center_freq1 = chandef->center_freq1;
arg.channel.band_center_freq2 = chandef->center_freq2;
- arg.channel.mode = chan_to_phymode(chandef);
+ arg.channel.mode =
+ ath11k_phymodes[chandef->chan->band][he_support][chandef->width];
+ if (arg.channel.mode == MODE_11G &&
+ chandef->chan->flags & IEEE80211_CHAN_NO_OFDM)
+ arg.channel.mode = MODE_11B;
+ WARN_ON(arg.channel.mode == MODE_UNKNOWN);
arg.channel.min_power = 0;
arg.channel.max_power = chandef->chan->max_power * 2;
diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
index dd4f86ee286e..b6e29161ec8b 100644
--- a/include/uapi/linux/nl80211.h
+++ b/include/uapi/linux/nl80211.h
@@ -4162,6 +4162,10 @@ enum nl80211_chan_width {
NL80211_CHAN_WIDTH_160,
NL80211_CHAN_WIDTH_5,
NL80211_CHAN_WIDTH_10,
+
+ /* keep last */
+ __NL80211_CHAN_WIDTH_NUM,
+ NL80211_CHAN_WIDTH_MAX = __NL80211_CHAN_WIDTH_NUM - 1,
};
/**
--
2.20.1
next prev parent reply other threads:[~2019-05-20 8:55 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-20 8:55 [PATCH V5 0/8] ath11k: add HE support John Crispin
2019-05-20 8:55 ` John Crispin
2019-05-20 8:55 ` [PATCH V5 1/8] mac80211: propagate HE operation info into ieee80211_sta John Crispin
2019-05-20 8:55 ` John Crispin
2019-05-23 10:40 ` Kalle Valo
2019-05-23 10:41 ` John Crispin
2019-05-20 8:55 ` [PATCH V5 2/8] ath11k: fix some whitespace errors John Crispin
2019-05-20 8:55 ` John Crispin
2019-05-20 8:55 ` John Crispin [this message]
2019-05-20 8:55 ` [PATCH V5 3/8] ath11k: move phymode selection from function to array lookup John Crispin
2019-05-20 8:55 ` [PATCH V5 4/8] ath11k: add HE handling to the debug code John Crispin
2019-05-20 8:55 ` John Crispin
2019-05-20 8:55 ` [PATCH V5 5/8] ath11k: extend reading of FW capabilities John Crispin
2019-05-20 8:55 ` John Crispin
2019-05-20 8:55 ` [PATCH V5 6/8] ath11k: add defines for max MCS rates per phymode John Crispin
2019-05-20 8:55 ` John Crispin
2019-05-20 8:55 ` [PATCH V5 7/8] ath11k: handle rx status for HE frames John Crispin
2019-05-20 8:55 ` John Crispin
2019-05-20 8:55 ` [PATCH V5 8/8] ath11k: add HE support John Crispin
2019-05-20 8:55 ` John Crispin
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=20190520085508.5888-4-john@phrozen.org \
--to=john@phrozen.org \
--cc=ath11k@lists.infradead.org \
--cc=kvalo@codeaurora.org \
--cc=linux-wireless@vger.kernel.org \
--cc=slakkavalli@datto.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.