All of lore.kernel.org
 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 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.