* [ath9k-devel] [PATCH 1/6] ath10k: set vht_nss correctly
2013-05-20 13:36 [ath9k-devel] [PATCH 0/6] ath10k: vht support Kalle Valo
@ 2013-05-20 13:36 ` Kalle Valo
2013-05-20 13:36 ` [ath9k-devel] [PATCH 2/6] ath10k: change chan_to_phymode() use chandef Kalle Valo
` (5 subsequent siblings)
6 siblings, 0 replies; 10+ messages in thread
From: Kalle Valo @ 2013-05-20 13:36 UTC (permalink / raw)
To: ath9k-devel
mac80211 requires that for VHT rate_idx contains just MCS and vht_nss contains NSS. Otherwise
this triggers a warning in mac80211:
[ 1336.359985] ------------[ cut here ]------------
[ 1336.362103] WARNING: at net/mac80211/rx.c:3279 ieee80211_rx+0x7aa/0x830 [mac80211]()
[ 1336.364520] Hardware name: HP ProBook 6540b
[ 1336.366943] Rate marked as a VHT rate but data is invalid: MCS: 27, NSS: 0
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
---
drivers/net/wireless/ath/ath10k/txrx.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/net/wireless/ath/ath10k/txrx.c b/drivers/net/wireless/ath/ath10k/txrx.c
index a32448c..d9f7075 100644
--- a/drivers/net/wireless/ath/ath10k/txrx.c
+++ b/drivers/net/wireless/ath/ath10k/txrx.c
@@ -211,7 +211,8 @@ static void process_rx_rates(struct ath10k *ar, struct htt_rx_info *info,
bw = info1 & 3;
sgi = info2 & 1;
- status->rate_idx = mcs + (nss * 10);
+ status->rate_idx = mcs;
+ status->vht_nss = nss;
if (sgi)
status->flag |= RX_FLAG_SHORT_GI;
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [ath9k-devel] [PATCH 2/6] ath10k: change chan_to_phymode() use chandef
2013-05-20 13:36 [ath9k-devel] [PATCH 0/6] ath10k: vht support Kalle Valo
2013-05-20 13:36 ` [ath9k-devel] [PATCH 1/6] ath10k: set vht_nss correctly Kalle Valo
@ 2013-05-20 13:36 ` Kalle Valo
2013-05-20 13:36 ` [ath9k-devel] [PATCH 3/6] ath10k: remove band_center_freq() Kalle Valo
` (4 subsequent siblings)
6 siblings, 0 replies; 10+ messages in thread
From: Kalle Valo @ 2013-05-20 13:36 UTC (permalink / raw)
To: ath9k-devel
That's more logical instead of passing chandef fields one at a time.
Also change ath10k_update_channel_list to hardcode the band directly.
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
---
drivers/net/wireless/ath/ath10k/mac.c | 49 +++++++++++++++++++++------------
1 file changed, 31 insertions(+), 18 deletions(-)
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index 974f992..72f4475 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -220,38 +220,46 @@ static int ath10k_clear_vdev_key(struct ath10k_vif *arvif,
/* General utilities */
/*********************/
-static inline enum wmi_phy_mode chan_to_phymode(struct ieee80211_channel *chan,
- enum nl80211_channel_type channel_type)
+static inline enum wmi_phy_mode
+chan_to_phymode(const struct cfg80211_chan_def *chandef)
{
enum wmi_phy_mode phymode = MODE_UNKNOWN;
- switch (chan->band) {
+ switch (chandef->chan->band) {
case IEEE80211_BAND_2GHZ:
- switch (channel_type) {
- case NL80211_CHAN_NO_HT:
+ switch (chandef->width) {
+ case NL80211_CHAN_WIDTH_20_NOHT:
phymode = MODE_11G;
break;
- case NL80211_CHAN_HT20:
+ case NL80211_CHAN_WIDTH_20:
phymode = MODE_11NG_HT20;
break;
- case NL80211_CHAN_HT40PLUS:
- case NL80211_CHAN_HT40MINUS:
+ case NL80211_CHAN_WIDTH_40:
phymode = MODE_11NG_HT40;
break;
+ case NL80211_CHAN_WIDTH_80:
+ case NL80211_CHAN_WIDTH_80P80:
+ case NL80211_CHAN_WIDTH_160:
+ phymode = MODE_UNKNOWN;
+ break;
}
break;
case IEEE80211_BAND_5GHZ:
- switch (channel_type) {
- case NL80211_CHAN_NO_HT:
+ switch (chandef->width) {
+ case NL80211_CHAN_WIDTH_20_NOHT:
phymode = MODE_11A;
break;
- case NL80211_CHAN_HT20:
+ case NL80211_CHAN_WIDTH_20:
phymode = MODE_11NA_HT20;
break;
- case NL80211_CHAN_HT40PLUS:
- case NL80211_CHAN_HT40MINUS:
+ case NL80211_CHAN_WIDTH_40:
phymode = MODE_11NA_HT40;
break;
+ case NL80211_CHAN_WIDTH_80:
+ case NL80211_CHAN_WIDTH_80P80:
+ case NL80211_CHAN_WIDTH_160:
+ phymode = MODE_UNKNOWN;
+ break;
}
break;
default:
@@ -408,9 +416,7 @@ static int ath10k_vdev_start(struct ath10k_vif *arvif)
band_center_freq(channel,
cfg80211_get_chandef_type(&conf->chandef));
- arg.channel.mode =
- chan_to_phymode(channel,
- cfg80211_get_chandef_type(&conf->chandef));
+ arg.channel.mode = chan_to_phymode(&conf->chandef);
arg.channel.min_power = channel->max_power * 3;
arg.channel.max_power = channel->max_power * 4;
@@ -482,7 +488,7 @@ static int ath10k_monitor_start(struct ath10k *ar, int vdev_id)
/* TODO setup this dynamically, what in case we
don't have any vifs? */
- arg.channel.mode = chan_to_phymode(channel, type);
+ arg.channel.mode = chan_to_phymode(&ar->hw->conf.chandef);
arg.channel.min_power = channel->max_power * 3;
arg.channel.max_power = channel->max_power * 4;
@@ -1224,7 +1230,14 @@ static int ath10k_update_channel_list(struct ath10k *ar)
ch->max_reg_power = channel->max_reg_power * 4;
ch->max_antenna_gain = channel->max_antenna_gain;
ch->reg_class_id = 0; /* FIXME */
- ch->mode = chan_to_phymode(channel, NL80211_CHAN_NO_HT);
+
+ /* FIXME: why use only legacy modes, why not any
+ * HT/VHT modes? Would that even make any
+ * difference? */
+ if (channel->band == IEEE80211_BAND_2GHZ)
+ ch->mode = MODE_11G;
+ else
+ ch->mode = MODE_11A;
if (WARN_ON_ONCE(ch->mode == MODE_UNKNOWN))
continue;
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [ath9k-devel] [PATCH 3/6] ath10k: remove band_center_freq()
2013-05-20 13:36 [ath9k-devel] [PATCH 0/6] ath10k: vht support Kalle Valo
2013-05-20 13:36 ` [ath9k-devel] [PATCH 1/6] ath10k: set vht_nss correctly Kalle Valo
2013-05-20 13:36 ` [ath9k-devel] [PATCH 2/6] ath10k: change chan_to_phymode() use chandef Kalle Valo
@ 2013-05-20 13:36 ` Kalle Valo
2013-05-20 13:36 ` [ath9k-devel] [PATCH 4/6] ath10k: include all management frames to ATH10K_DBG_BEACON Kalle Valo
` (3 subsequent siblings)
6 siblings, 0 replies; 10+ messages in thread
From: Kalle Valo @ 2013-05-20 13:36 UTC (permalink / raw)
To: ath9k-devel
We can take the frequency directly from struct
cfg80211_chan_def.
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
---
drivers/net/wireless/ath/ath10k/mac.c | 25 ++-----------------------
1 file changed, 2 insertions(+), 23 deletions(-)
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index 72f4475..3d4e574 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -270,25 +270,6 @@ chan_to_phymode(const struct cfg80211_chan_def *chandef)
return phymode;
}
-static int band_center_freq(struct ieee80211_channel *chan,
- enum nl80211_channel_type channel_type)
-{
- u32 center_freq = chan->center_freq;
-
- switch (channel_type) {
- case NL80211_CHAN_HT40PLUS:
- center_freq = chan->center_freq + 10;
- break;
- case NL80211_CHAN_HT40MINUS:
- center_freq = chan->center_freq - 10;
- break;
- default:
- break;
- }
-
- return center_freq;
-}
-
static u8 ath10k_parse_mpdudensity(u8 mpdudensity)
{
/*
@@ -412,9 +393,7 @@ static int ath10k_vdev_start(struct ath10k_vif *arvif)
arg.channel.freq = channel->center_freq;
- arg.channel.band_center_freq1 =
- band_center_freq(channel,
- cfg80211_get_chandef_type(&conf->chandef));
+ arg.channel.band_center_freq1 = conf->chandef.center_freq1;
arg.channel.mode = chan_to_phymode(&conf->chandef);
@@ -484,7 +463,7 @@ static int ath10k_monitor_start(struct ath10k *ar, int vdev_id)
arg.vdev_id = vdev_id;
arg.channel.freq = channel->center_freq;
- arg.channel.band_center_freq1 = band_center_freq(channel, type);
+ arg.channel.band_center_freq1 = ar->hw->conf.chandef.center_freq1;
/* TODO setup this dynamically, what in case we
don't have any vifs? */
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [ath9k-devel] [PATCH 4/6] ath10k: include all management frames to ATH10K_DBG_BEACON
2013-05-20 13:36 [ath9k-devel] [PATCH 0/6] ath10k: vht support Kalle Valo
` (2 preceding siblings ...)
2013-05-20 13:36 ` [ath9k-devel] [PATCH 3/6] ath10k: remove band_center_freq() Kalle Valo
@ 2013-05-20 13:36 ` Kalle Valo
2013-05-20 13:37 ` [ath9k-devel] [PATCH 5/6] ath10k: add ATH10K_DBG_DATA Kalle Valo
` (2 subsequent siblings)
6 siblings, 0 replies; 10+ messages in thread
From: Kalle Valo @ 2013-05-20 13:36 UTC (permalink / raw)
To: ath9k-devel
Change ATH10K_DBG_BEACON to include all management frame tx
and rx functionality. That way it doesn't spam rest of
wmi debug logs.
Rename the flag to ATH10K_DBG_MGMT to better reflect
the functionality.
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
---
drivers/net/wireless/ath/ath10k/debug.h | 2 +-
drivers/net/wireless/ath/ath10k/wmi.c | 17 +++++++++--------
2 files changed, 10 insertions(+), 9 deletions(-)
diff --git a/drivers/net/wireless/ath/ath10k/debug.h b/drivers/net/wireless/ath/ath10k/debug.h
index e7fb640..46981a7 100644
--- a/drivers/net/wireless/ath/ath10k/debug.h
+++ b/drivers/net/wireless/ath/ath10k/debug.h
@@ -30,7 +30,7 @@ enum ath10k_debug_mask {
ATH10K_DBG_CORE = 0x00000020,
ATH10K_DBG_PCI_DUMP = 0x00000040,
ATH10K_DBG_HTT_DUMP = 0x00000080,
- ATH10K_DBG_BEACON = 0x00000100,
+ ATH10K_DBG_MGMT = 0x00000100,
ATH10K_DBG_ANY = 0xffffffff,
};
diff --git a/drivers/net/wireless/ath/ath10k/wmi.c b/drivers/net/wireless/ath/ath10k/wmi.c
index 0d5070d..31ddd1a 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.c
+++ b/drivers/net/wireless/ath/ath10k/wmi.c
@@ -328,7 +328,8 @@ static int ath10k_wmi_event_mgmt_rx(struct ath10k *ar, struct sk_buff *skb)
memset(status, 0, sizeof(*status));
- ath10k_dbg(ATH10K_DBG_WMI, "event mgmt rx status %08x\n", rx_status);
+ ath10k_dbg(ATH10K_DBG_MGMT,
+ "event mgmt rx status %08x\n", rx_status);
if (rx_status & WMI_RX_STATUS_ERR_DECRYPT) {
dev_kfree_skb(skb);
@@ -362,12 +363,12 @@ static int ath10k_wmi_event_mgmt_rx(struct ath10k *ar, struct sk_buff *skb)
~IEEE80211_FCTL_PROTECTED);
}
- ath10k_dbg(ATH10K_DBG_WMI,
+ ath10k_dbg(ATH10K_DBG_MGMT,
"event mgmt rx skb %p len %d ftype %02x stype %02x\n",
skb, skb->len,
fc & IEEE80211_FCTL_FTYPE, fc & IEEE80211_FCTL_STYPE);
- ath10k_dbg(ATH10K_DBG_WMI,
+ ath10k_dbg(ATH10K_DBG_MGMT,
"event mgmt rx freq %d band %d snr %d, rate_idx %d\n",
status->freq, status->band, status->signal,
status->rate_idx);
@@ -533,7 +534,7 @@ static void ath10k_wmi_update_tim(struct ath10k *ar,
tim->bitmap_ctrl = !!__le32_to_cpu(bcn_info->tim_info.tim_mcast);
memcpy(tim->virtual_map, arvif->u.ap.tim_bitmap, pvm_len);
- ath10k_dbg(ATH10K_DBG_BEACON, "dtim %d/%d mcast %d pvmlen %d\n",
+ ath10k_dbg(ATH10K_DBG_MGMT, "dtim %d/%d mcast %d pvmlen %d\n",
tim->dtim_count, tim->dtim_period,
tim->bitmap_ctrl, pvm_len);
}
@@ -611,7 +612,7 @@ static void ath10k_wmi_update_noa(struct ath10k *ar, struct ath10k_vif *arvif,
if (arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO)
return;
- ath10k_dbg(ATH10K_DBG_BEACON, "noa changed: %d\n", noa->changed);
+ ath10k_dbg(ATH10K_DBG_MGMT, "noa changed: %d\n", noa->changed);
if (noa->changed & WMI_P2P_NOA_CHANGED_BIT) {
new_len = ath10k_p2p_calc_noa_ie_len(noa);
if (!new_len)
@@ -658,12 +659,12 @@ static void ath10k_wmi_event_host_swba(struct ath10k *ar, struct sk_buff *skb)
int vdev_id = 0;
int ret;
- ath10k_dbg(ATH10K_DBG_BEACON, "WMI_HOST_SWBA_EVENTID\n");
+ ath10k_dbg(ATH10K_DBG_MGMT, "WMI_HOST_SWBA_EVENTID\n");
ev = (struct wmi_host_swba_event *)skb->data;
map = __le32_to_cpu(ev->vdev_map);
- ath10k_dbg(ATH10K_DBG_BEACON, "host swba:\n"
+ ath10k_dbg(ATH10K_DBG_MGMT, "host swba:\n"
"-vdev map 0x%x\n",
ev->vdev_map);
@@ -680,7 +681,7 @@ static void ath10k_wmi_event_host_swba(struct ath10k *ar, struct sk_buff *skb)
bcn_info = &ev->bcn_info[i];
- ath10k_dbg(ATH10K_DBG_BEACON,
+ ath10k_dbg(ATH10K_DBG_MGMT,
"-bcn_info[%d]:\n"
"--tim_len %d\n"
"--tim_mcast %d\n"
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [ath9k-devel] [PATCH 5/6] ath10k: add ATH10K_DBG_DATA
2013-05-20 13:36 [ath9k-devel] [PATCH 0/6] ath10k: vht support Kalle Valo
` (3 preceding siblings ...)
2013-05-20 13:36 ` [ath9k-devel] [PATCH 4/6] ath10k: include all management frames to ATH10K_DBG_BEACON Kalle Valo
@ 2013-05-20 13:37 ` Kalle Valo
2013-05-20 13:37 ` [ath9k-devel] [PATCH 6/6] ath10k: preliminary VHT support Kalle Valo
2013-05-21 19:30 ` [ath9k-devel] [PATCH 0/6] ath10k: vht support Kalle Valo
6 siblings, 0 replies; 10+ messages in thread
From: Kalle Valo @ 2013-05-20 13:37 UTC (permalink / raw)
To: ath9k-devel
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
---
drivers/net/wireless/ath/ath10k/debug.h | 1 +
drivers/net/wireless/ath/ath10k/txrx.c | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/net/wireless/ath/ath10k/debug.h b/drivers/net/wireless/ath/ath10k/debug.h
index 46981a7..168140c 100644
--- a/drivers/net/wireless/ath/ath10k/debug.h
+++ b/drivers/net/wireless/ath/ath10k/debug.h
@@ -31,6 +31,7 @@ enum ath10k_debug_mask {
ATH10K_DBG_PCI_DUMP = 0x00000040,
ATH10K_DBG_HTT_DUMP = 0x00000080,
ATH10K_DBG_MGMT = 0x00000100,
+ ATH10K_DBG_DATA = 0x00000200,
ATH10K_DBG_ANY = 0xffffffff,
};
diff --git a/drivers/net/wireless/ath/ath10k/txrx.c b/drivers/net/wireless/ath/ath10k/txrx.c
index d9f7075..a962ddd 100644
--- a/drivers/net/wireless/ath/ath10k/txrx.c
+++ b/drivers/net/wireless/ath/ath10k/txrx.c
@@ -278,7 +278,7 @@ void ath10k_process_rx(struct ath10k *ar, struct htt_rx_info *info)
status->band = ch->band;
status->freq = ch->center_freq;
- ath10k_dbg(ATH10K_DBG_HTT,
+ ath10k_dbg(ATH10K_DBG_DATA,
"rx skb %p len %u %s%s%s%s%s %srate_idx %u vht_nss %u freq %u band %u\n",
info->skb,
info->skb->len,
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [ath9k-devel] [PATCH 6/6] ath10k: preliminary VHT support
2013-05-20 13:36 [ath9k-devel] [PATCH 0/6] ath10k: vht support Kalle Valo
` (4 preceding siblings ...)
2013-05-20 13:37 ` [ath9k-devel] [PATCH 5/6] ath10k: add ATH10K_DBG_DATA Kalle Valo
@ 2013-05-20 13:37 ` Kalle Valo
2013-05-21 11:45 ` Michal Kazior
2013-05-21 19:30 ` [ath9k-devel] [PATCH 0/6] ath10k: vht support Kalle Valo
6 siblings, 1 reply; 10+ messages in thread
From: Kalle Valo @ 2013-05-20 13:37 UTC (permalink / raw)
To: ath9k-devel
Adds preliminary VHT (802.11ac) support to ath10k.
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
---
drivers/net/wireless/ath/ath10k/mac.c | 66 +++++++++++++++++++++++++++++++++
drivers/net/wireless/ath/ath10k/wmi.c | 13 ++++++-
drivers/net/wireless/ath/ath10k/wmi.h | 10 +++++
3 files changed, 88 insertions(+), 1 deletion(-)
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index 3d4e574..ad5a015 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -256,6 +256,8 @@ chan_to_phymode(const struct cfg80211_chan_def *chandef)
phymode = MODE_11NA_HT40;
break;
case NL80211_CHAN_WIDTH_80:
+ phymode = MODE_11AC_VHT80;
+ break;
case NL80211_CHAN_WIDTH_80P80:
case NL80211_CHAN_WIDTH_160:
phymode = MODE_UNKNOWN;
@@ -958,6 +960,34 @@ static void ath10k_peer_assoc_h_qos_sta(struct ath10k *ar,
arg->peer_flags |= WMI_PEER_QOS;
}
+static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
+ struct ieee80211_sta *sta,
+ struct wmi_peer_assoc_complete_arg *arg)
+{
+ const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
+
+ if (!vht_cap->vht_supported)
+ return;
+
+ arg->peer_flags |= WMI_PEER_VHT;
+
+ arg->peer_vht_caps = vht_cap->cap;
+
+ if (sta->bandwidth == IEEE80211_STA_RX_BW_80)
+ arg->peer_flags |= WMI_PEER_80MHZ;
+
+ arg->peer_vht_rates.rx_max_rate =
+ __le16_to_cpu(vht_cap->vht_mcs.rx_highest);
+ arg->peer_vht_rates.rx_mcs_set =
+ __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map);
+ arg->peer_vht_rates.tx_max_rate =
+ __le16_to_cpu(vht_cap->vht_mcs.tx_highest);
+ arg->peer_vht_rates.tx_mcs_set =
+ __le16_to_cpu(vht_cap->vht_mcs.tx_mcs_map);
+
+ ath10k_dbg(ATH10K_DBG_MAC, "mac vht peer\n");
+}
+
static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
struct ath10k_vif *arvif,
struct ieee80211_sta *sta,
@@ -983,6 +1013,8 @@ static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
{
enum wmi_phy_mode phymode = MODE_UNKNOWN;
+ /* FIXME: add VHT */
+
switch (ar->hw->conf.chandef.chan->band) {
case IEEE80211_BAND_2GHZ:
if (sta->ht_cap.ht_supported) {
@@ -1027,6 +1059,7 @@ static int ath10k_peer_assoc(struct ath10k *ar,
ath10k_peer_assoc_h_crypto(ar, arvif, &arg);
ath10k_peer_assoc_h_rates(ar, sta, &arg);
ath10k_peer_assoc_h_ht(ar, sta, &arg);
+ ath10k_peer_assoc_h_vht(ar, sta, &arg);
ath10k_peer_assoc_h_qos(ar, arvif, sta, bss_conf, &arg);
ath10k_peer_assoc_h_phymode(ar, arvif, sta, &arg);
@@ -1194,6 +1227,9 @@ static int ath10k_update_channel_list(struct ath10k *ar)
ch->allow_ht = true;
+ /* FIXME: when should we really allow VHT? */
+ ch->allow_vht = true;
+
ch->allow_ibss =
!(channel->flags & IEEE80211_CHAN_NO_IBSS);
@@ -2741,6 +2777,30 @@ static const struct ieee80211_iface_combination ath10k_if_comb = {
.beacon_int_infra_match = true,
};
+static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
+{
+ struct ieee80211_sta_vht_cap vht_cap = {0};
+ u16 mcs_map;
+
+ vht_cap.vht_supported = 1;
+ vht_cap.cap = ar->vht_cap_info;
+
+ /* FIXME: check dynamically how many streams board supports */
+ mcs_map = IEEE80211_VHT_MCS_SUPPORT_0_9 << 0 |
+ IEEE80211_VHT_MCS_SUPPORT_0_9 << 2 |
+ IEEE80211_VHT_MCS_SUPPORT_0_9 << 4 |
+ IEEE80211_VHT_MCS_NOT_SUPPORTED << 6 |
+ IEEE80211_VHT_MCS_NOT_SUPPORTED << 8 |
+ IEEE80211_VHT_MCS_NOT_SUPPORTED << 10 |
+ IEEE80211_VHT_MCS_NOT_SUPPORTED << 12 |
+ IEEE80211_VHT_MCS_NOT_SUPPORTED << 14;
+
+ vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
+ vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
+
+ return vht_cap;
+}
+
static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
{
int i;
@@ -2839,6 +2899,7 @@ struct ath10k_vif *ath10k_get_arvif(struct ath10k *ar, u32 vdev_id)
int ath10k_mac_register(struct ath10k *ar)
{
struct ieee80211_supported_band *band;
+ struct ieee80211_sta_vht_cap vht_cap;
struct ieee80211_sta_ht_cap ht_cap;
void *channels;
int ret;
@@ -2848,6 +2909,7 @@ int ath10k_mac_register(struct ath10k *ar)
SET_IEEE80211_DEV(ar->hw, ar->dev);
ht_cap = ath10k_get_ht_cap(ar);
+ vht_cap = ath10k_create_vht_cap(ar);
if (ar->phy_capability & WHAL_WLAN_11G_CAPABILITY) {
channels = kmemdup(ath10k_2ghz_channels,
@@ -2862,6 +2924,9 @@ int ath10k_mac_register(struct ath10k *ar)
band->n_bitrates = ath10k_g_rates_size;
band->bitrates = ath10k_g_rates;
band->ht_cap = ht_cap;
+
+ /* vht is not supported in 2.4 GHz */
+
ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = band;
}
@@ -2883,6 +2948,7 @@ int ath10k_mac_register(struct ath10k *ar)
band->n_bitrates = ath10k_a_rates_size;
band->bitrates = ath10k_a_rates;
band->ht_cap = ht_cap;
+ band->vht_cap = vht_cap;
ar->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = band;
}
diff --git a/drivers/net/wireless/ath/ath10k/wmi.c b/drivers/net/wireless/ath/ath10k/wmi.c
index 31ddd1a..adb17fb 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.c
+++ b/drivers/net/wireless/ath/ath10k/wmi.c
@@ -1942,6 +1942,8 @@ int ath10k_wmi_scan_chan_list(struct ath10k *ar,
flags |= WMI_CHAN_FLAG_ADHOC_ALLOWED;
if (ch->allow_ht)
flags |= WMI_CHAN_FLAG_ALLOW_HT;
+ if (ch->allow_vht)
+ flags |= WMI_CHAN_FLAG_ALLOW_VHT;
if (ch->ht40plus)
flags |= WMI_CHAN_FLAG_HT40_PLUS;
@@ -1991,8 +1993,8 @@ int ath10k_wmi_peer_assoc(struct ath10k *ar,
cmd->peer_mpdu_density = __cpu_to_le32(arg->peer_mpdu_density);
cmd->peer_rate_caps = __cpu_to_le32(arg->peer_rate_caps);
cmd->peer_nss = __cpu_to_le32(arg->peer_num_spatial_streams);
+ cmd->peer_vht_caps = __cpu_to_le32(arg->peer_vht_caps);
cmd->peer_phymode = __cpu_to_le32(arg->peer_phymode);
- /* FIXME: we dont touch VHT options */
memcpy(cmd->peer_macaddr.addr, arg->addr, ETH_ALEN);
@@ -2006,6 +2008,15 @@ int ath10k_wmi_peer_assoc(struct ath10k *ar,
memcpy(cmd->peer_ht_rates.rates, arg->peer_ht_rates.rates,
arg->peer_ht_rates.num_rates);
+ cmd->peer_vht_rates.rx_max_rate =
+ __cpu_to_le32(arg->peer_vht_rates.rx_max_rate);
+ cmd->peer_vht_rates.rx_mcs_set =
+ __cpu_to_le32(arg->peer_vht_rates.rx_mcs_set);
+ cmd->peer_vht_rates.tx_max_rate =
+ __cpu_to_le32(arg->peer_vht_rates.tx_max_rate);
+ cmd->peer_vht_rates.tx_mcs_set =
+ __cpu_to_le32(arg->peer_vht_rates.tx_mcs_set);
+
return ath10k_wmi_cmd_send(ar, skb, WMI_PEER_ASSOC_CMDID);
}
diff --git a/drivers/net/wireless/ath/ath10k/wmi.h b/drivers/net/wireless/ath/ath10k/wmi.h
index ccab87e..601a432 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.h
+++ b/drivers/net/wireless/ath/ath10k/wmi.h
@@ -540,6 +540,7 @@ struct wmi_channel_arg {
bool passive;
bool allow_ibss;
bool allow_ht;
+ bool allow_vht;
bool ht40plus;
/* note: power unit is 1/4th of dBm */
u32 min_power;
@@ -2785,6 +2786,13 @@ struct wmi_vht_rate_set {
__le32 tx_mcs_set; /* Negotiated TX VHT rates */
} __packed;
+struct wmi_vht_rate_set_arg {
+ u32 rx_max_rate;
+ u32 rx_mcs_set;
+ u32 tx_max_rate;
+ u32 tx_mcs_set;
+};
+
struct wmi_peer_set_rates_cmd {
/* peer MAC address */
struct wmi_mac_addr peer_macaddr;
@@ -2878,7 +2886,9 @@ struct wmi_peer_assoc_complete_arg {
struct wmi_rate_set_arg peer_legacy_rates;
struct wmi_rate_set_arg peer_ht_rates;
u32 peer_num_spatial_streams;
+ u32 peer_vht_caps;
enum wmi_phy_mode peer_phymode;
+ struct wmi_vht_rate_set_arg peer_vht_rates;
};
struct wmi_peer_add_wds_entry_cmd {
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [ath9k-devel] [PATCH 6/6] ath10k: preliminary VHT support
2013-05-20 13:37 ` [ath9k-devel] [PATCH 6/6] ath10k: preliminary VHT support Kalle Valo
@ 2013-05-21 11:45 ` Michal Kazior
2013-05-21 19:19 ` Kalle Valo
0 siblings, 1 reply; 10+ messages in thread
From: Michal Kazior @ 2013-05-21 11:45 UTC (permalink / raw)
To: ath9k-devel
On 20/05/13 15:37, Kalle Valo wrote:
> Adds preliminary VHT (802.11ac) support to ath10k.
>
> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
> ---
> @@ -983,6 +1013,8 @@ static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
> {
> enum wmi_phy_mode phymode = MODE_UNKNOWN;
>
> + /* FIXME: add VHT */
> +
> switch (ar->hw->conf.chandef.chan->band) {
> case IEEE80211_BAND_2GHZ:
> if (sta->ht_cap.ht_supported) {
Hmm.. so VHT works on the device without setting proper peer phymode?
Adding phymode here should be trivial here I guess anyway.
-- Pozdrawiam / Best regards, Michal Kazior.
^ permalink raw reply [flat|nested] 10+ messages in thread
* [ath9k-devel] [PATCH 6/6] ath10k: preliminary VHT support
2013-05-21 11:45 ` Michal Kazior
@ 2013-05-21 19:19 ` Kalle Valo
0 siblings, 0 replies; 10+ messages in thread
From: Kalle Valo @ 2013-05-21 19:19 UTC (permalink / raw)
To: ath9k-devel
Michal Kazior <michal.kazior@tieto.com> writes:
> On 20/05/13 15:37, Kalle Valo wrote:
>> Adds preliminary VHT (802.11ac) support to ath10k.
>>
>> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
>> ---
>
>> @@ -983,6 +1013,8 @@ static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
>> {
>> enum wmi_phy_mode phymode = MODE_UNKNOWN;
>>
>> + /* FIXME: add VHT */
>> +
>> switch (ar->hw->conf.chandef.chan->band) {
>> case IEEE80211_BAND_2GHZ:
>> if (sta->ht_cap.ht_supported) {
>
> Hmm.. so VHT works on the device without setting proper peer phymode?
Yes. I assumed this is for the AP mode, but I can be wrong.
> Adding phymode here should be trivial here I guess anyway.
Yeah. I'll just apply this now.
--
Kalle Valo
^ permalink raw reply [flat|nested] 10+ messages in thread
* [ath9k-devel] [PATCH 0/6] ath10k: vht support
2013-05-20 13:36 [ath9k-devel] [PATCH 0/6] ath10k: vht support Kalle Valo
` (5 preceding siblings ...)
2013-05-20 13:37 ` [ath9k-devel] [PATCH 6/6] ath10k: preliminary VHT support Kalle Valo
@ 2013-05-21 19:30 ` Kalle Valo
6 siblings, 0 replies; 10+ messages in thread
From: Kalle Valo @ 2013-05-21 19:30 UTC (permalink / raw)
To: ath9k-devel
Kalle Valo <kvalo@qca.qualcomm.com> writes:
> VHT support and small changes I did while working on it.
>
> ---
>
> Kalle Valo (6):
> ath10k: set vht_nss correctly
> ath10k: change chan_to_phymode() use chandef
> ath10k: remove band_center_freq()
> ath10k: include all management frames to ATH10K_DBG_BEACON
> ath10k: add ATH10K_DBG_DATA
> ath10k: preliminary VHT support
Applied.
--
Kalle Valo
^ permalink raw reply [flat|nested] 10+ messages in thread