linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFC PATCH v2 1/2] mwifiex: refactor mwifiex_parse_htinfo() for reuse
@ 2018-12-07  0:12 Brian Norris
  2018-12-07  0:12 ` [RFC PATCH v2 2/2] mwifiex: add NL80211_STA_INFO_RX_BITRATE support Brian Norris
  2018-12-13 14:55 ` [RFC PATCH v2 1/2] mwifiex: refactor mwifiex_parse_htinfo() for reuse Kalle Valo
  0 siblings, 2 replies; 5+ messages in thread
From: Brian Norris @ 2018-12-07  0:12 UTC (permalink / raw)
  To: Kalle Valo
  Cc: linux-kernel, Amitkumar Karwar, Nishant Sarmukadam,
	Ganapathi Bhat, Xinming Hu, linux-wireless, Brian Norris

This function converts some firmware-specific parameters into cfg80211
'rate_info' structures. It currently assumes it's dealing only with TX
bitrate, but the RX bitrate looks to be the same, so refactor this
function to be reusable.

Signed-off-by: Brian Norris <briannorris@chromium.org>
---
v2:
 * no change - just split unrelated (debugfs) patch to its own series
---
 .../net/wireless/marvell/mwifiex/cfg80211.c   | 36 ++++++++++---------
 1 file changed, 19 insertions(+), 17 deletions(-)

diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
index adc88433faa8..02b80ea232a7 100644
--- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c
+++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
@@ -1275,27 +1275,27 @@ mwifiex_cfg80211_change_virtual_intf(struct wiphy *wiphy,
 }
 
 static void
-mwifiex_parse_htinfo(struct mwifiex_private *priv, u8 tx_htinfo,
+mwifiex_parse_htinfo(struct mwifiex_private *priv, u8 rateinfo, u8 htinfo,
 		     struct rate_info *rate)
 {
 	struct mwifiex_adapter *adapter = priv->adapter;
 
 	if (adapter->is_hw_11ac_capable) {
 		/* bit[1-0]: 00=LG 01=HT 10=VHT */
-		if (tx_htinfo & BIT(0)) {
+		if (htinfo & BIT(0)) {
 			/* HT */
-			rate->mcs = priv->tx_rate;
+			rate->mcs = rateinfo;
 			rate->flags |= RATE_INFO_FLAGS_MCS;
 		}
-		if (tx_htinfo & BIT(1)) {
+		if (htinfo & BIT(1)) {
 			/* VHT */
-			rate->mcs = priv->tx_rate & 0x0F;
+			rate->mcs = rateinfo & 0x0F;
 			rate->flags |= RATE_INFO_FLAGS_VHT_MCS;
 		}
 
-		if (tx_htinfo & (BIT(1) | BIT(0))) {
+		if (htinfo & (BIT(1) | BIT(0))) {
 			/* HT or VHT */
-			switch (tx_htinfo & (BIT(3) | BIT(2))) {
+			switch (htinfo & (BIT(3) | BIT(2))) {
 			case 0:
 				rate->bw = RATE_INFO_BW_20;
 				break;
@@ -1310,26 +1310,26 @@ mwifiex_parse_htinfo(struct mwifiex_private *priv, u8 tx_htinfo,
 				break;
 			}
 
-			if (tx_htinfo & BIT(4))
+			if (htinfo & BIT(4))
 				rate->flags |= RATE_INFO_FLAGS_SHORT_GI;
 
-			if ((priv->tx_rate >> 4) == 1)
+			if ((rateinfo >> 4) == 1)
 				rate->nss = 2;
 			else
 				rate->nss = 1;
 		}
 	} else {
 		/*
-		 * Bit 0 in tx_htinfo indicates that current Tx rate
-		 * is 11n rate. Valid MCS index values for us are 0 to 15.
+		 * Bit 0 in htinfo indicates that current rate is 11n. Valid
+		 * MCS index values for us are 0 to 15.
 		 */
-		if ((tx_htinfo & BIT(0)) && (priv->tx_rate < 16)) {
-			rate->mcs = priv->tx_rate;
+		if ((htinfo & BIT(0)) && (rateinfo < 16)) {
+			rate->mcs = rateinfo;
 			rate->flags |= RATE_INFO_FLAGS_MCS;
 			rate->bw = RATE_INFO_BW_20;
-			if (tx_htinfo & BIT(1))
+			if (htinfo & BIT(1))
 				rate->bw = RATE_INFO_BW_40;
-			if (tx_htinfo & BIT(2))
+			if (htinfo & BIT(2))
 				rate->flags |= RATE_INFO_FLAGS_SHORT_GI;
 		}
 	}
@@ -1375,7 +1375,8 @@ mwifiex_dump_station_info(struct mwifiex_private *priv,
 		sinfo->tx_packets = node->stats.tx_packets;
 		sinfo->tx_failed = node->stats.tx_failed;
 
-		mwifiex_parse_htinfo(priv, node->stats.last_tx_htinfo,
+		mwifiex_parse_htinfo(priv, priv->tx_rate,
+				     node->stats.last_tx_htinfo,
 				     &sinfo->txrate);
 		sinfo->txrate.legacy = node->stats.last_tx_rate * 5;
 
@@ -1401,7 +1402,8 @@ mwifiex_dump_station_info(struct mwifiex_private *priv,
 			 HostCmd_ACT_GEN_GET, DTIM_PERIOD_I,
 			 &priv->dtim_period, true);
 
-	mwifiex_parse_htinfo(priv, priv->tx_htinfo, &sinfo->txrate);
+	mwifiex_parse_htinfo(priv, priv->tx_rate, priv->tx_htinfo,
+			     &sinfo->txrate);
 
 	sinfo->signal_avg = priv->bcn_rssi_avg;
 	sinfo->rx_bytes = priv->stats.rx_bytes;
-- 
2.20.0.rc2.403.gdbc3b29805-goog


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

* [RFC PATCH v2 2/2] mwifiex: add NL80211_STA_INFO_RX_BITRATE support
  2018-12-07  0:12 [RFC PATCH v2 1/2] mwifiex: refactor mwifiex_parse_htinfo() for reuse Brian Norris
@ 2018-12-07  0:12 ` Brian Norris
  2018-12-07 10:50   ` Kalle Valo
  2018-12-13 14:55 ` [RFC PATCH v2 1/2] mwifiex: refactor mwifiex_parse_htinfo() for reuse Kalle Valo
  1 sibling, 1 reply; 5+ messages in thread
From: Brian Norris @ 2018-12-07  0:12 UTC (permalink / raw)
  To: Kalle Valo
  Cc: linux-kernel, Amitkumar Karwar, Nishant Sarmukadam,
	Ganapathi Bhat, Xinming Hu, linux-wireless, Brian Norris

Comparing the existing TX_BITRATE parsing code (in
mwifiex_parse_htinfo()) with the RX bitrate histograms in debugfs.c, it
appears that the rxpd_rate and rxpd_htinfo fields have the same format.
At least, they give reasonable results when I parse them this way.

So this patch adds support for RX_BITRATE to our station info dump.

Along the way, I add legacy bitrate parsing into the same function,
using the debugfs code (mwifiex_histogram_read() and
mwifiex_adjust_data_rate()) as reference.

Additionally, to satisfy the requirements of
NL80211_STA_INFO_RX_BITRATE, I skip logging the bitrate of multicast
packets. This shouldn't add a lot of overhead to the RX path, as there
are already several similar 802.3 header checks in this same codepath.
We can also bias the branch behavior to favor unicast, as that's the
common performance-sensitive case.

I'd consider this support somewhat experimental, as I have zero
documentation from Marvell. But the existing driver code gives me good
reason to think this is correct.

I've tested this on a few different 802.11{a,b,g,n,ac} networks, and the
reported bitrates look good to me.

Signed-off-by: Brian Norris <briannorris@chromium.org>
---
RFC: I'd appreciate it if someone from Marvell could double check my work
here.

v2:
 * no change - just split unrelated (debugfs) patch to its own series
---
 .../net/wireless/marvell/mwifiex/cfg80211.c   | 26 +++++++++++++++++++
 drivers/net/wireless/marvell/mwifiex/sta_rx.c | 13 ++++++----
 2 files changed, 34 insertions(+), 5 deletions(-)

diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
index 02b80ea232a7..1467af22e394 100644
--- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c
+++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
@@ -1333,6 +1333,28 @@ mwifiex_parse_htinfo(struct mwifiex_private *priv, u8 rateinfo, u8 htinfo,
 				rate->flags |= RATE_INFO_FLAGS_SHORT_GI;
 		}
 	}
+
+	/* Decode legacy rates for non-HT. */
+	if (!(htinfo & (BIT(0) | BIT(1)))) {
+		/* Bitrates in multiples of 100kb/s. */
+		static const int legacy_rates[] = {
+			[0] = 10,
+			[1] = 20,
+			[2] = 55,
+			[3] = 110,
+			[4] = 60, /* MWIFIEX_RATE_INDEX_OFDM0 */
+			[5] = 60,
+			[6] = 90,
+			[7] = 120,
+			[8] = 180,
+			[9] = 240,
+			[10] = 360,
+			[11] = 480,
+			[12] = 540,
+		};
+		if (rateinfo < ARRAY_SIZE(legacy_rates))
+			rate->legacy = legacy_rates[rateinfo];
+	}
 }
 
 /*
@@ -1414,6 +1436,10 @@ mwifiex_dump_station_info(struct mwifiex_private *priv,
 	/* bit rate is in 500 kb/s units. Convert it to 100kb/s units */
 	sinfo->txrate.legacy = rate * 5;
 
+	sinfo->filled |= BIT(NL80211_STA_INFO_RX_BITRATE);
+	mwifiex_parse_htinfo(priv, priv->rxpd_rate, priv->rxpd_htinfo,
+			     &sinfo->rxrate);
+
 	if (priv->bss_mode == NL80211_IFTYPE_STATION) {
 		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_BSS_PARAM);
 		sinfo->bss_param.flags = 0;
diff --git a/drivers/net/wireless/marvell/mwifiex/sta_rx.c b/drivers/net/wireless/marvell/mwifiex/sta_rx.c
index 00fcbda09349..fb28a5c7f441 100644
--- a/drivers/net/wireless/marvell/mwifiex/sta_rx.c
+++ b/drivers/net/wireless/marvell/mwifiex/sta_rx.c
@@ -152,14 +152,17 @@ int mwifiex_process_rx_packet(struct mwifiex_private *priv,
 		mwifiex_process_tdls_action_frame(priv, offset, rx_pkt_len);
 	}
 
-	priv->rxpd_rate = local_rx_pd->rx_rate;
-
-	priv->rxpd_htinfo = local_rx_pd->ht_info;
+	/* Only stash RX bitrate for unicast packets. */
+	if (likely(!is_multicast_ether_addr(rx_pkt_hdr->eth803_hdr.h_dest))) {
+		priv->rxpd_rate = local_rx_pd->rx_rate;
+		priv->rxpd_htinfo = local_rx_pd->ht_info;
+	}
 
 	if (GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_STA ||
 	    GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_UAP) {
-		adj_rx_rate = mwifiex_adjust_data_rate(priv, priv->rxpd_rate,
-						       priv->rxpd_htinfo);
+		adj_rx_rate = mwifiex_adjust_data_rate(priv,
+						       local_rx_pd->rx_rate,
+						       local_rx_pd->ht_info);
 		mwifiex_hist_data_add(priv, adj_rx_rate, local_rx_pd->snr,
 				      local_rx_pd->nf);
 	}
-- 
2.20.0.rc2.403.gdbc3b29805-goog


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

* Re: [RFC PATCH v2 2/2] mwifiex: add NL80211_STA_INFO_RX_BITRATE support
  2018-12-07  0:12 ` [RFC PATCH v2 2/2] mwifiex: add NL80211_STA_INFO_RX_BITRATE support Brian Norris
@ 2018-12-07 10:50   ` Kalle Valo
  2018-12-07 11:55     ` [EXT] " Ganapathi Bhat
  0 siblings, 1 reply; 5+ messages in thread
From: Kalle Valo @ 2018-12-07 10:50 UTC (permalink / raw)
  To: Brian Norris
  Cc: linux-kernel, Amitkumar Karwar, Nishant Sarmukadam,
	Ganapathi Bhat, Xinming Hu, linux-wireless

Brian Norris <briannorris@chromium.org> writes:

> Comparing the existing TX_BITRATE parsing code (in
> mwifiex_parse_htinfo()) with the RX bitrate histograms in debugfs.c, it
> appears that the rxpd_rate and rxpd_htinfo fields have the same format.
> At least, they give reasonable results when I parse them this way.
>
> So this patch adds support for RX_BITRATE to our station info dump.
>
> Along the way, I add legacy bitrate parsing into the same function,
> using the debugfs code (mwifiex_histogram_read() and
> mwifiex_adjust_data_rate()) as reference.
>
> Additionally, to satisfy the requirements of
> NL80211_STA_INFO_RX_BITRATE, I skip logging the bitrate of multicast
> packets. This shouldn't add a lot of overhead to the RX path, as there
> are already several similar 802.3 header checks in this same codepath.
> We can also bias the branch behavior to favor unicast, as that's the
> common performance-sensitive case.
>
> I'd consider this support somewhat experimental, as I have zero
> documentation from Marvell. But the existing driver code gives me good
> reason to think this is correct.
>
> I've tested this on a few different 802.11{a,b,g,n,ac} networks, and the
> reported bitrates look good to me.
>
> Signed-off-by: Brian Norris <briannorris@chromium.org>
> ---
> RFC: I'd appreciate it if someone from Marvell could double check my work
> here.

BTW, if we don't hear anything from Marvell I'm going to apply these
anyway.

-- 
Kalle Valo

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

* Re: [EXT] Re: [RFC PATCH v2 2/2] mwifiex: add NL80211_STA_INFO_RX_BITRATE support
  2018-12-07 10:50   ` Kalle Valo
@ 2018-12-07 11:55     ` Ganapathi Bhat
  0 siblings, 0 replies; 5+ messages in thread
From: Ganapathi Bhat @ 2018-12-07 11:55 UTC (permalink / raw)
  To: Kalle Valo, Brian Norris
  Cc: linux-kernel, Amitkumar Karwar, Nishant Sarmukadam, Xinming Hu,
	linux-wireless

Hi Kalle/Brian,

>> RFC: I'd appreciate it if someone from Marvell could double check my work
>> here.

>BTW, if we don't hear anything from Marvell I'm going to apply these
>anyway.

This patch series looks good to us.

Thanks,
Ganapathi 

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

* Re: [RFC PATCH v2 1/2] mwifiex: refactor mwifiex_parse_htinfo() for reuse
  2018-12-07  0:12 [RFC PATCH v2 1/2] mwifiex: refactor mwifiex_parse_htinfo() for reuse Brian Norris
  2018-12-07  0:12 ` [RFC PATCH v2 2/2] mwifiex: add NL80211_STA_INFO_RX_BITRATE support Brian Norris
@ 2018-12-13 14:55 ` Kalle Valo
  1 sibling, 0 replies; 5+ messages in thread
From: Kalle Valo @ 2018-12-13 14:55 UTC (permalink / raw)
  To: Brian Norris
  Cc: linux-kernel, Amitkumar Karwar, Nishant Sarmukadam,
	Ganapathi Bhat, Xinming Hu, linux-wireless, Brian Norris

Brian Norris <briannorris@chromium.org> wrote:

> This function converts some firmware-specific parameters into cfg80211
> 'rate_info' structures. It currently assumes it's dealing only with TX
> bitrate, but the RX bitrate looks to be the same, so refactor this
> function to be reusable.
> 
> Signed-off-by: Brian Norris <briannorris@chromium.org>

2 patches applied to wireless-drivers-next.git, thanks.

a256707fbd4b mwifiex: refactor mwifiex_parse_htinfo() for reuse
ed0b2b067bad mwifiex: add NL80211_STA_INFO_RX_BITRATE support

-- 
https://patchwork.kernel.org/patch/10717275/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches


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

end of thread, other threads:[~2018-12-13 14:55 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-12-07  0:12 [RFC PATCH v2 1/2] mwifiex: refactor mwifiex_parse_htinfo() for reuse Brian Norris
2018-12-07  0:12 ` [RFC PATCH v2 2/2] mwifiex: add NL80211_STA_INFO_RX_BITRATE support Brian Norris
2018-12-07 10:50   ` Kalle Valo
2018-12-07 11:55     ` [EXT] " Ganapathi Bhat
2018-12-13 14:55 ` [RFC PATCH v2 1/2] mwifiex: refactor mwifiex_parse_htinfo() for reuse Kalle Valo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).