Historical ath9k-devel archives
 help / color / mirror / Atom feed
* [ath9k-devel] [PATCH 0/6] ath10k: vht support
@ 2013-05-20 13:36 Kalle Valo
  2013-05-20 13:36 ` [ath9k-devel] [PATCH 1/6] ath10k: set vht_nss correctly Kalle Valo
                   ` (6 more replies)
  0 siblings, 7 replies; 10+ messages in thread
From: Kalle Valo @ 2013-05-20 13:36 UTC (permalink / raw)
  To: ath9k-devel

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


 drivers/net/wireless/ath/ath10k/debug.h |    3 -
 drivers/net/wireless/ath/ath10k/mac.c   |  140 ++++++++++++++++++++++---------
 drivers/net/wireless/ath/ath10k/txrx.c  |    5 +
 drivers/net/wireless/ath/ath10k/wmi.c   |   30 +++++--
 drivers/net/wireless/ath/ath10k/wmi.h   |   10 ++
 5 files changed, 135 insertions(+), 53 deletions(-)

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

* [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

end of thread, other threads:[~2013-05-21 19:30 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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 ` [ath9k-devel] [PATCH 3/6] ath10k: remove band_center_freq() Kalle Valo
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 ` [ath9k-devel] [PATCH 5/6] ath10k: add ATH10K_DBG_DATA Kalle Valo
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
2013-05-21 19:30 ` [ath9k-devel] [PATCH 0/6] ath10k: vht support Kalle Valo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox