Skip to contentSkip to conversation

ath11k: add full monitor mode support for QCN9074

PATCH In review Jouni Malinen 3 participants 13 messages Jul 21, 2021 – Dec 8, 2021 Qualcomm Atheros ATH11K wireless driver

lore
Share & tools
lore
#0 lore raw

cover ath11k: add full monitor mode support for QCN9074

From: Anilkumar Kolli <[email protected]>

QCN9074 hardware supports full monitor mode. The advantage with full monitor mode is hardware has status buffers available for all the MPDUs in mon_dst_ring.

HTT_H2T_MSG_TYPE_RX_FULL_MONITOR_MODE cmd is sent to firmware to enable the full monitor mode.

A new hw_param full_monitor_mode is added to enable full monitor support for QCN9074.

In full monitor mode, monitor destination ring is read in software monitor ring descriptor format instead of reo_entrance_ring format. Add new sw_mon_ring descriptor.

In full monitor mode, monitor destination ring is read before monitor status ring. mon_dst_ring has PPDU id, reap till the end of PPDU. Add all the MPDUs to a list. Start processing the status ring, if PPDU id in status ring is lagging behind, reap the status ring, once the PPDU ID matches, deliver the MSDU to upper layer. If status PPDU id leading, reap the mon_dst_ring.

Anilkumar Kolli (3):
ath11k: Add htt cmd to enable full monitor mode
ath11k: add software monitor ring descriptor for full monitor
ath11k: Process full monitor mode rx support

---
Depends-On: "ath11k: monitor mode clean up to use separate APIs"
Depends-On: "ath11k: add separate APIs for monitor mode"
Depends-On: "ath11k: move static function ath11k_mac_vdev_setup_sync to top"

 drivers/net/wireless/ath/ath11k/core.c     |   4 +
 drivers/net/wireless/ath/ath11k/dp.c       |   1 +
 drivers/net/wireless/ath/ath11k/dp.h       | 100 ++++++-
 drivers/net/wireless/ath/ath11k/dp_rx.c    | 413 ++++++++++++++++++++++++++++-
 drivers/net/wireless/ath/ath11k/dp_tx.c    |  48 ++++
 drivers/net/wireless/ath/ath11k/dp_tx.h    |   2 +
 drivers/net/wireless/ath/ath11k/hal_desc.h |  19 ++
 drivers/net/wireless/ath/ath11k/hal_rx.c   |  44 +++
 drivers/net/wireless/ath/ath11k/hal_rx.h   |  17 ++
 drivers/net/wireless/ath/ath11k/hw.h       |   1 +
 10 files changed, 645 insertions(+), 4 deletions(-)
Signature · 1 line
2.7.4
#1 lore raw

PATCH 1/3 ath11k: add htt cmd to enable full monitor mode

From: Anilkumar Kolli <[email protected]>

Add a new hw_param full_monitor_mode to enable full monitor support for QCN9074. HTT_H2T_MSG_TYPE_RX_FULL_MONITOR_MODE cmd is sent to the firmware to enable the full monitor mode.

Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.4.0.1-01734-QCAHKSWPL_SILICONZ-1

---
 drivers/net/wireless/ath/ath11k/core.c  |  4 ++
 drivers/net/wireless/ath/ath11k/dp.h    | 74 +++++++++++++++++++++++++
 drivers/net/wireless/ath/ath11k/dp_tx.c | 48 ++++++++++++++++
 drivers/net/wireless/ath/ath11k/dp_tx.h |  2 +
 drivers/net/wireless/ath/ath11k/hw.h    |  1 +
 5 files changed, 129 insertions(+)
drivers/net/wireless/ath/ath11k/core.c +4 -0
index 969bf1a590d9..3179495cb3c9 100644
@@ -65,6 +65,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
 					BIT(NL80211_IFTYPE_AP) |
 					BIT(NL80211_IFTYPE_MESH_POINT),
 		.supports_monitor = true,
+		.full_monitor_mode = false,
 		.supports_shadow_regs = false,
 		.idle_ps = false,
 		.cold_boot_calib = true,
@@ -106,6 +107,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
 					BIT(NL80211_IFTYPE_AP) |
 					BIT(NL80211_IFTYPE_MESH_POINT),
 		.supports_monitor = true,
+		.full_monitor_mode = false,
 		.supports_shadow_regs = false,
 		.idle_ps = false,
 		.cold_boot_calib = true,
@@ -146,6 +148,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
 		.interface_modes = BIT(NL80211_IFTYPE_STATION) |
 					BIT(NL80211_IFTYPE_AP),
 		.supports_monitor = false,
+		.full_monitor_mode = false,
 		.supports_shadow_regs = true,
 		.idle_ps = true,
 		.cold_boot_calib = false,
@@ -184,6 +187,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
 					BIT(NL80211_IFTYPE_AP) |
 					BIT(NL80211_IFTYPE_MESH_POINT),
 		.supports_monitor = true,
+		.full_monitor_mode = true,
 		.supports_shadow_regs = false,
 		.idle_ps = false,
 		.cold_boot_calib = false,
drivers/net/wireless/ath/ath11k/dp.h +74 -0

86 lines not on this page · raw message

drivers/net/wireless/ath/ath11k/dp_tx.c +48 -0

57 lines not on this page · raw message

drivers/net/wireless/ath/ath11k/dp_tx.h +2 -0
index 698b907b878d..e373dbccf417 100644
@@ -37,4 +37,6 @@ int ath11k_dp_tx_htt_rx_filter_setup(struct ath11k_base *ab, u32 ring_id,
 				     int rx_buf_size,
 				     struct htt_rx_ring_tlv_filter *tlv_filter);
 
+int ath11k_dp_tx_htt_rx_full_mon_setup(struct ath11k_base *ab, int mac_id,
+				       bool config);
 #endif
drivers/net/wireless/ath/ath11k/hw.h +1 -0
index 62f5978b3005..5b7ce4c7e489 100644
@@ -157,6 +157,7 @@ struct ath11k_hw_params {
 
 	u16 interface_modes;
 	bool supports_monitor;
+	bool full_monitor_mode;
 	bool supports_shadow_regs;
 	bool idle_ps;
 	bool cold_boot_calib;
Signature · 1 line
2.25.1
#2 lore raw

Re: [PATCH 1/3] ath11k: add htt cmd to enable full monitor mode

Quoted 5 lines · Jouni Malinen

From: Anilkumar Kolli <[email protected]>

Add a new hw_param full_monitor_mode to enable full monitor support for QCN9074. HTT_H2T_MSG_TYPE_RX_FULL_MONITOR_MODE cmd is sent to the firmware to enable the full monitor mode.

Nowhere it's explained what "full monitor mode" means from an user's point of view. Can someone give a high level summary what advantages this feature has? For example, more frames delivered to user space or what?

Signature · 8 lines
https://patchwork.kernel.org/project/linux-wireless/list/

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

-- 
ath11k mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/ath11k
#3 lore raw

Re: [PATCH 1/3] ath11k: add htt cmd to enable full monitor mode

Quoted 4 lines · Kalle Valo
Quoted 2 lines · Jouni Malinen

From: Anilkumar Kolli <[email protected]>

Quoted 8 lines
Quoted 3 lines

Add a new hw_param full_monitor_mode to enable full monitor support for QCN9074. HTT_H2T_MSG_TYPE_RX_FULL_MONITOR_MODE cmd is sent to the firmware to enable the full monitor mode.

Nowhere it's explained what "full monitor mode" means from an user's point of view. Can someone give a high level summary what advantages this feature has? For example, more frames delivered to user space or what?

Yes, more frames delivered with full monitor mode. The advantage with full monitor mode is, hardware has status buffers available for all the MPDUs in mon_dst_ring. Both status buffer and MPDUs from mon_dst_ring is used to build the frame.

Patch "ath11k: Process full monitor mode rx support" has the commit message.

In full monitor mode, monitor destination ring is read before monitor status ring. mon_dst_ring has ppdu id, reap till the end of PPDU. Add all the MPDUs to list. Start processing the status ring, if PPDU id in status ring is lagging behind, reap the status ring, once the PPDU ID matches, deliver the MSDU to upper layer. If status PPDU id leading, reap the mon_dst_ring. The advantage with full monitor mode is hardware has status buffers available for all the MPDUs in mon_dst_ring.

- Anil.

Signature · 3 lines
ath11k mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/ath11k
#4 lore raw

Re: [PATCH 1/3] ath11k: add htt cmd to enable full monitor mode

Quoted 15 lines · [email protected] writes:
Quoted 9 lines · Kalle Valo
Quoted 6 lines · Jouni Malinen

From: Anilkumar Kolli <[email protected]>

Add a new hw_param full_monitor_mode to enable full monitor support for
QCN9074. HTT_H2T_MSG_TYPE_RX_FULL_MONITOR_MODE cmd is sent to the firmware to enable the full monitor mode.

Quoted 4 lines

Nowhere it's explained what "full monitor mode" means from an user's point of view. Can someone give a high level summary what advantages this feature has? For example, more frames delivered to user space or what?

Quoted 4 lines

Yes, more frames delivered with full monitor mode. The advantage with full monitor mode is, hardware has status buffers available for all the MPDUs in mon_dst_ring. Both status buffer and MPDUs from mon_dst_ring is used to build the frame.

Users, and developers outside of the wireless domain, have no clue what "MPDUs in mon_dst_ring" means, just as an example. Can you give a higher level summary of this feature and what benefit it brings, please? I'll then add that to the commit log.

For example, what kind of frames are we now able to deliver to the user space (which we before couldn't) and are there still some types of frames which we are not delivering?

In other words, instead of technical low level jargon I'm looking for a summary in plain english which is understandable by everyone.

Signature · 3 lines
https://patchwork.kernel.org/project/linux-wireless/list/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
#5 lore raw

Re: [PATCH 1/3] ath11k: add htt cmd to enable full monitor mode

Quoted 27 lines · Kalle Valo
Quoted 15 lines · [email protected] writes:
Quoted 9 lines · Kalle Valo
Quoted 6 lines · Jouni Malinen

From: Anilkumar Kolli <[email protected]>

Add a new hw_param full_monitor_mode to enable full monitor support for
QCN9074. HTT_H2T_MSG_TYPE_RX_FULL_MONITOR_MODE cmd is sent to the firmware to enable the full monitor mode.

Quoted 4 lines

Nowhere it's explained what "full monitor mode" means from an user's point of view. Can someone give a high level summary what advantages this feature has? For example, more frames delivered to user space or what?

Quoted 4 lines

Yes, more frames delivered with full monitor mode. The advantage with full monitor mode is, hardware has status buffers available for all the MPDUs in mon_dst_ring. Both status buffer and MPDUs from mon_dst_ring is used to build the frame.

Users, and developers outside of the wireless domain, have no clue what "MPDUs in mon_dst_ring" means, just as an example. Can you give a higher level summary of this feature and what benefit it brings, please? I'll then add that to the commit log.

Quoted 6 lines

For example, what kind of frames are we now able to deliver to the user space (which we before couldn't) and are there still some types of frames which we are not delivering?

In other words, instead of technical low level jargon I'm looking for a summary in plain english which is understandable by everyone.

Full monitor mode is hardware enhancement for QCN9074. With this more frames are delivered to mac80211.

In earlier hardware like IPQ8074, on each interrupt, reap complete monitor status ring. For each PPDU_DONE status, reap monitor destination ring, this needs more processing on driver.

With full monitor, on Interrupt, there is no need to reap the complete monitor status ring. Instead only one PPDU is reap from monitor destination ring and corresponding PPDU status is reaped.

In older approach, in noisy environments status buffers are missing for few PPDU, even in that case Host reaps monitor destination ring, which is not needed and these frames are dropped.

In full monitor mode, for all MPDUs in a PPDU, status is guaranteed, this is achieved in hardware using lock-stepping. So more frames delivered to mac80211 and more fames seen in sniffer. "

- Anil.

#6 lore raw

Re: [PATCH 1/3] ath11k: add htt cmd to enable full monitor mode

Quoted 48 lines · Anilkumar Kolli
Quoted 27 lines · Kalle Valo
Quoted 15 lines · [email protected] writes:
Quoted 9 lines · Kalle Valo
Quoted 6 lines · Jouni Malinen

From: Anilkumar Kolli <[email protected]>

Add a new hw_param full_monitor_mode to enable full monitor support for
QCN9074. HTT_H2T_MSG_TYPE_RX_FULL_MONITOR_MODE cmd is sent to the firmware to enable the full monitor mode.

Quoted 4 lines

Nowhere it's explained what "full monitor mode" means from an user's point of view. Can someone give a high level summary what advantages this feature has? For example, more frames delivered to user space or what?

Quoted 4 lines

Yes, more frames delivered with full monitor mode. The advantage with full monitor mode is, hardware has status buffers available for all the MPDUs in mon_dst_ring. Both status buffer and MPDUs from mon_dst_ring is used to build the frame.

Users, and developers outside of the wireless domain, have no clue what "MPDUs in mon_dst_ring" means, just as an example. Can you give a higher level summary of this feature and what benefit it brings, please? I'll then add that to the commit log.

Quoted 6 lines

For example, what kind of frames are we now able to deliver to the user space (which we before couldn't) and are there still some types of frames which we are not delivering?

In other words, instead of technical low level jargon I'm looking for a summary in plain english which is understandable by everyone.

Full monitor mode is hardware enhancement for QCN9074. With this more frames are delivered to mac80211.

In earlier hardware like IPQ8074, on each interrupt, reap complete monitor status ring.
For each PPDU_DONE status, reap monitor destination ring, this needs more processing on driver.

With full monitor, on Interrupt, there is no need to reap the complete monitor status ring.
Instead only one PPDU is reap from monitor destination ring and corresponding PPDU status is reaped.

Quoted 5 lines

In older approach, in noisy environments status buffers are missing for few PPDU, even in that case
Host reaps monitor destination ring, which is not needed and these frames are dropped.

Radiotap header is constructed from monitor status buffer tlvs. Since there is no update of status buffer for few PPDU, complete 80211 frame is not formed and is dropped in ath11k.

Quoted 4 lines

In full monitor mode, for all MPDUs in a PPDU, status is guaranteed, this is achieved in hardware using lock-stepping.
So more frames delivered to mac80211 and more fames seen in sniffer. "

- Anil.

#7 lore raw

Re: [PATCH 1/3] ath11k: add htt cmd to enable full monitor mode

In reply to Jouni Malinen
Quoted 47 lines · Jouni Malinen

From: Anilkumar Kolli <[email protected]>

Add a new hw_param full_monitor_mode to enable full monitor support for QCN9074. HTT_H2T_MSG_TYPE_RX_FULL_MONITOR_MODE cmd is sent to the firmware to enable the full monitor mode.

Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.4.0.1-01734-QCAHKSWPL_SILICONZ-1

---
 drivers/net/wireless/ath/ath11k/core.c  |  4 ++
 drivers/net/wireless/ath/ath11k/dp.h    | 74 +++++++++++++++++++++++++
 drivers/net/wireless/ath/ath11k/dp_tx.c | 48 ++++++++++++++++
 drivers/net/wireless/ath/ath11k/dp_tx.h |  2 +
 drivers/net/wireless/ath/ath11k/hw.h    |  1 +
 5 files changed, 129 insertions(+)
drivers/net/wireless/ath/ath11k/core.c +3 -0
index 969bf1a590d9..3179495cb3c9 100644
@@ -65,6 +65,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
 					BIT(NL80211_IFTYPE_AP) |
 					BIT(NL80211_IFTYPE_MESH_POINT),
 		.supports_monitor = true,
+		.full_monitor_mode = false,
 		.supports_shadow_regs = false,
 		.idle_ps = false,
 		.cold_boot_calib = true,
@@ -106,6 +107,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
 					BIT(NL80211_IFTYPE_AP) |
 					BIT(NL80211_IFTYPE_MESH_POINT),
 		.supports_monitor = true,
+		.full_monitor_mode = false,
 		.supports_shadow_regs = false,
 		.idle_ps = false,
 		.cold_boot_calib = true,
@@ -146,6 +148,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
 		.interface_modes = BIT(NL80211_IFTYPE_STATION) |
 					BIT(NL80211_IFTYPE_AP),
 		.supports_monitor = false,
+		.full_monitor_mode = false,
 		.supports_shadow_regs = true,
 		.idle_ps = true,
 		.cold_boot_calib = false,

drivers/net/wireless/ath/ath11k/core.c static const struct ath11k_hw_params ath11k_hw_params[] = { · line 193

Quoted 7 lines
drivers/net/wireless/ath/ath11k/core.c +1 -0
@@ -184,6 +187,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
 					BIT(NL80211_IFTYPE_AP) |
 					BIT(NL80211_IFTYPE_MESH_POINT),
 		.supports_monitor = true,
+		.full_monitor_mode = true,
 		.supports_shadow_regs = false,
 		.idle_ps = false,
 		.cold_boot_calib = false,

wcn6855 was not updated, I added that.

drivers/net/wireless/ath/ath11k/dp_tx.c int ath11k_dp_tx_htt_monitor_mode_ring_config(struct ath11k *ar, bool reset) · line 1041

Quoted 11 lines
drivers/net/wireless/ath/ath11k/dp_tx.c +5 -0
@@ -1034,6 +1034,15 @@ int ath11k_dp_tx_htt_monitor_mode_ring_config(struct ath11k *ar, bool reset)
 	struct htt_rx_ring_tlv_filter tlv_filter = {0};
 	int ret = 0, ring_id = 0, i;
 
+	if (ab->hw_params.full_monitor_mode) {
+		ret = ath11k_dp_tx_htt_rx_full_mon_setup(ab,
+							 dp->mac_id, !reset);
+		if (ret < 0) {
+			ath11k_err(ab, "failed to setup full monitor %d\n", ret);

I changed this to:

		if (ret) {
			ath11k_warn(ab, "failed to setup full monitor: %d\n", ret);
			return ret;
		}
Signature · 3 lines
https://patchwork.kernel.org/project/linux-wireless/list/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
#8 lore raw

Re: [PATCH 1/3] ath11k: add htt cmd to enable full monitor mode

Quoted 55 lines · Kalle Valo
Quoted 53 lines · Jouni Malinen

From: Anilkumar Kolli <[email protected]>

Add a new hw_param full_monitor_mode to enable full monitor support for QCN9074. HTT_H2T_MSG_TYPE_RX_FULL_MONITOR_MODE cmd is sent to the firmware to enable the full monitor mode.

Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.4.0.1-01734-QCAHKSWPL_SILICONZ-1

---
 drivers/net/wireless/ath/ath11k/core.c  |  4 ++
 drivers/net/wireless/ath/ath11k/dp.h    | 74 
+++++++++++++++++++++++++
 drivers/net/wireless/ath/ath11k/dp_tx.c | 48 ++++++++++++++++
 drivers/net/wireless/ath/ath11k/dp_tx.h |  2 +
 drivers/net/wireless/ath/ath11k/hw.h    |  1 +
 5 files changed, 129 insertions(+)
drivers/net/wireless/ath/ath11k/core.c +1 -0
index 969bf1a590d9..3179495cb3c9 100644
@@ -65,6 +65,7 @@ static const struct ath11k_hw_params 
 ath11k_hw_params[] = {
 					BIT(NL80211_IFTYPE_AP) |
 					BIT(NL80211_IFTYPE_MESH_POINT),
 		.supports_monitor = true,
+		.full_monitor_mode = false,
 		.supports_shadow_regs = false,
 		.idle_ps = false,
drivers/net/wireless/ath/ath11k/core.c +1 -0
 		.cold_boot_calib = true,
@@ -106,6 +107,7 @@ static const struct ath11k_hw_params 
 ath11k_hw_params[] = {
 					BIT(NL80211_IFTYPE_AP) |
 					BIT(NL80211_IFTYPE_MESH_POINT),
 		.supports_monitor = true,
+		.full_monitor_mode = false,
 		.supports_shadow_regs = false,
 		.idle_ps = false,
drivers/net/wireless/ath/ath11k/core.c +1 -0
 		.cold_boot_calib = true,
@@ -146,6 +148,7 @@ static const struct ath11k_hw_params 
 ath11k_hw_params[] = {
 		.interface_modes = BIT(NL80211_IFTYPE_STATION) |
 					BIT(NL80211_IFTYPE_AP),
 		.supports_monitor = false,
+		.full_monitor_mode = false,
 		.supports_shadow_regs = true,
 		.idle_ps = true,
drivers/net/wireless/ath/ath11k/core.c +0 -0
 		.cold_boot_calib = false,
@@ -184,6 +187,7 @@ static const struct ath11k_hw_params 
 ath11k_hw_params[] = {
 					BIT(NL80211_IFTYPE_AP) |
Quoted 9 lines
Quoted 6 lines
drivers/net/wireless/ath/ath11k/core.c +1 -0
 					BIT(NL80211_IFTYPE_MESH_POINT),
 		.supports_monitor = true,
+		.full_monitor_mode = true,
 		.supports_shadow_regs = false,
 		.idle_ps = false,

.cold_boot_calib = false,

wcn6855 was not updated, I added that.

Thanks. 'full_monitor_mode = false' to be added.

Quoted 15 lines

drivers/net/wireless/ath/ath11k/dp_tx.c int · line 1042

Quoted 12 lines
drivers/net/wireless/ath/ath11k/dp_tx.c +5 -0
@@ -1034,6 +1034,15 @@ int 
 ath11k_dp_tx_htt_monitor_mode_ring_config(struct ath11k *ar, bool reset)
 	struct htt_rx_ring_tlv_filter tlv_filter = {0};
 	int ret = 0, ring_id = 0, i;
 
+	if (ab->hw_params.full_monitor_mode) {
+		ret = ath11k_dp_tx_htt_rx_full_mon_setup(ab,
+							 dp->mac_id, !reset);
+		if (ret < 0) {
+			ath11k_err(ab, "failed to setup full monitor %d\n", ret);

I changed this to:

Quoted 4 lines
		if (ret) {
			ath11k_warn(ab, "failed to setup full monitor: %d\n", ret);
			return ret;
		}

Thanks.

Signature · 6 lines
- Anil.

-- 
ath11k mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/ath11k
#9 lore raw

PATCH 2/3 ath11k: add software monitor ring descriptor for full monitor

In reply to Jouni Malinen

From: Anilkumar Kolli <[email protected]>

In full monitor mode, monitor destination ring is read in software monitor ring descriptor format instead of reo_entrance_ring format. Add new sw_mon_ring descriptor.

Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.4.0.1-01734-QCAHKSWPL_SILICONZ-1

---
 drivers/net/wireless/ath/ath11k/hal_desc.h | 19 ++++++++++
 drivers/net/wireless/ath/ath11k/hal_rx.c   | 44 ++++++++++++++++++++++
 drivers/net/wireless/ath/ath11k/hal_rx.h   | 17 +++++++++
 3 files changed, 80 insertions(+)
drivers/net/wireless/ath/ath11k/hal_desc.h +19 -0
index d54ec6aa6281..0be0e8939783 100644
@@ -856,6 +856,25 @@ struct hal_reo_entrance_ring {
  *		this ring has looped around the ring.
  */
 
+#define HAL_SW_MON_RING_INFO0_RXDMA_PUSH_REASON	GENMASK(1, 0)
+#define HAL_SW_MON_RING_INFO0_RXDMA_ERROR_CODE	GENMASK(6, 2)
+#define HAL_SW_MON_RING_INFO0_MPDU_FRAG_NUMBER	GENMASK(10, 7)
+#define HAL_SW_MON_RING_INFO0_FRAMELESS_BAR	BIT(11)
+#define HAL_SW_MON_RING_INFO0_STATUS_BUF_CNT	GENMASK(15, 12)
+#define HAL_SW_MON_RING_INFO0_END_OF_PPDU	BIT(16)
+
+#define HAL_SW_MON_RING_INFO1_PHY_PPDU_ID	GENMASK(15, 0)
+#define HAL_SW_MON_RING_INFO1_RING_ID		GENMASK(27, 20)
+#define HAL_SW_MON_RING_INFO1_LOOPING_COUNT	GENMASK(31, 28)
+
+struct hal_sw_monitor_ring {
+	struct ath11k_buffer_addr buf_addr_info;
+	struct rx_mpdu_desc rx_mpdu_info;
+	struct ath11k_buffer_addr status_buf_addr_info;
+	u32 info0;
+	u32 info1;
+} __packed;
+
 #define HAL_REO_CMD_HDR_INFO0_CMD_NUMBER	GENMASK(15, 0)
 #define HAL_REO_CMD_HDR_INFO0_STATUS_REQUIRED	BIT(16)
 
drivers/net/wireless/ath/ath11k/hal_rx.c +44 -0

47 lines not on this page · raw message

drivers/net/wireless/ath/ath11k/hal_rx.h +17 -0
index 0f1f04b812b9..8db420ef6351 100644
@@ -77,6 +77,20 @@ enum hal_rx_mon_status {
 	HAL_RX_MON_STATUS_BUF_DONE,
 };
 
+struct hal_sw_mon_ring_entries {
+	dma_addr_t mon_dst_paddr;
+	dma_addr_t mon_status_paddr;
+	u32 mon_dst_sw_cookie;
+	u32 mon_status_sw_cookie;
+	void *dst_buf_addr_info;
+	void *status_buf_addr_info;
+	u16 ppdu_id;
+	u8 status_buf_count;
+	u8 msdu_cnt;
+	bool end_of_ppdu;
+	bool drop_ppdu;
+};
+
 struct hal_rx_mon_ppdu_info {
 	u32 ppdu_id;
 	u32 ppdu_ts;
@@ -331,6 +345,9 @@ void ath11k_hal_rx_reo_ent_buf_paddr_get(void *rx_desc,
 					 dma_addr_t *paddr, u32 *sw_cookie,
 					 void **pp_buf_addr_info, u8 *rbm,
 					 u32 *msdu_cnt);
+void
+ath11k_hal_rx_sw_mon_ring_buf_paddr_get(void *rx_desc,
+					struct hal_sw_mon_ring_entries *sw_mon_ent);
 enum hal_rx_mon_status
 ath11k_hal_rx_parse_mon_status(struct ath11k_base *ab,
 			       struct hal_rx_mon_ppdu_info *ppdu_info,
Signature · 1 line
2.25.1
#10 lore raw

PATCH 3/3 ath11k: process full monitor mode rx support

In reply to Jouni Malinen

From: Anilkumar Kolli <[email protected]>

In full monitor mode, monitor destination ring is read before monitor status ring. mon_dst_ring has ppdu id, reap till the end of PPDU. Add all the MPDUs to list. Start processing the status ring, if PPDU id in status ring is lagging behind, reap the status ring, once the PPDU ID matches, deliver the MSDU to upper layer. If status PPDU id leading, reap the mon_dst_ring. The advantage with full monitor mode is hardware has status buffers available for all the MPDUs in mon_dst_ring.

Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.4.0.1-01734-QCAHKSWPL_SILICONZ-1

---
 drivers/net/wireless/ath/ath11k/dp.c    |   1 +
 drivers/net/wireless/ath/ath11k/dp.h    |  26 +-
 drivers/net/wireless/ath/ath11k/dp_rx.c | 413 +++++++++++++++++++++++-
 3 files changed, 436 insertions(+), 4 deletions(-)
drivers/net/wireless/ath/ath11k/dp.c +1 -0
index b0c8f6290099..dd69ba8f7d80 100644
@@ -1021,6 +1021,7 @@ int ath11k_dp_alloc(struct ath11k_base *ab)
 
 	INIT_LIST_HEAD(&dp->reo_cmd_list);
 	INIT_LIST_HEAD(&dp->reo_cmd_cache_flush_list);
+	INIT_LIST_HEAD(&dp->dp_full_mon_mpdu_list);
 	spin_lock_init(&dp->reo_cmd_lock);
 
 	dp->reo_cmd_cache_flush_count = 0;
drivers/net/wireless/ath/ath11k/dp.h +25 -1
index b39a6652d631..69b75bc3312f 100644
@@ -88,6 +88,19 @@ struct dp_tx_ring {
 	int tx_status_tail;
 };
 
+enum dp_mon_status_buf_state {
+	/* PPDU id matches in dst ring and status ring */
+	DP_MON_STATUS_MATCH,
+	/* status ring dma is not done */
+	DP_MON_STATUS_NO_DMA,
+	/* status ring is lagging, reap status ring */
+	DP_MON_STATUS_LAG,
+	/* status ring is leading, reap dst ring and drop */
+	DP_MON_STATUS_LEAD,
+	/* replinish monitor status ring */
+	DP_MON_STATUS_REPLINISH,
+};
+
 struct ath11k_pdev_mon_stats {
 	u32 status_ppdu_state;
 	u32 status_ppdu_start;
@@ -103,6 +116,12 @@ struct ath11k_pdev_mon_stats {
 	u32 dup_mon_buf_cnt;
 };
 
+struct dp_full_mon_mpdu {
+	struct list_head list;
+	struct sk_buff *head;
+	struct sk_buff *tail;
+};
+
 struct dp_link_desc_bank {
 	void *vaddr_unaligned;
 	void *vaddr;
@@ -134,7 +153,11 @@ struct ath11k_mon_data {
 	u32 mon_last_buf_cookie;
 	u64 mon_last_linkdesc_paddr;
 	u16 chan_noise_floor;
-
+	bool hold_mon_dst_ring;
+	enum dp_mon_status_buf_state buf_state;
+	dma_addr_t mon_status_paddr;
+	struct dp_full_mon_mpdu *mon_mpdu;
+	struct hal_sw_mon_ring_entries sw_mon_entries;
 	struct ath11k_pdev_mon_stats rx_mon_stats;
 	/* lock for monitor data */
 	spinlock_t mon_lock;
@@ -242,6 +265,7 @@ struct ath11k_dp {
 	struct hal_wbm_idle_scatter_list scatter_list[DP_IDLE_SCATTER_BUFS_MAX];
 	struct list_head reo_cmd_list;
 	struct list_head reo_cmd_cache_flush_list;
+	struct list_head dp_full_mon_mpdu_list;
 	u32 reo_cmd_cache_flush_count;
 	/**
 	 * protects access to below fields,
drivers/net/wireless/ath/ath11k/dp_rx.c +410 -3

467 lines not on this page · raw message

Signature · 1 line
2.25.1
#11 lore raw

Re: [PATCH 3/3] ath11k: process full monitor mode rx support

Quoted 10 lines · Jouni Malinen

From: Anilkumar Kolli <[email protected]>

In full monitor mode, monitor destination ring is read before monitor status ring. mon_dst_ring has ppdu id, reap till the end of PPDU. Add all the MPDUs to list. Start processing the status ring, if PPDU id in status ring is lagging behind, reap the status ring, once the PPDU ID matches, deliver the MSDU to upper layer. If status PPDU id leading, reap the mon_dst_ring. The advantage with full monitor mode is hardware has status buffers available for all the MPDUs in mon_dst_ring.

Quoted 4 lines

Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.4.0.1-01734-QCAHKSWPL_SILICONZ-1

I changed the commit log to this to better describe how this patch helps:

ath11k: process full monitor mode rx support

In full monitor mode, monitor destination ring is read before monitor status ring. mon_dst_ring has ppdu id, reap till the end of PPDU. Add all the MPDUs to list. Start processing the status ring, if PPDU id in status ring is lagging behind, reap the status ring, once the PPDU ID matches, deliver the MSDU to upper layer. If status PPDU id leading, reap the mon_dst_ring.

The advantage with full monitor mode is hardware has status buffers available for all the MPDUs in mon_dst_ring, which makes it possible to deliver more frames to be seen on sniffer.

Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.4.0.1-01734-QCAHKSWPL_SILICONZ-1

But now I see a new warning with QCA6390 caused by patch 3. Please fix that and submit v2.

[  108.354361] ath11k_pci 0000:06:00.0: chip_id 0x0 chip_family 0xb board_id 0xff soc_id 0xffffffff
[  108.354547] ath11k_pci 0000:06:00.0: fw_version 0x101c06cc fw_build_timestamp 2020-06-24 19:50 fw_build_id 
[  110.995359] INFO: trying to register non-static key.
[  110.995429] The code is fine but needs lockdep annotation, or maybe
[  110.995489] you didn't initialize this object before use?
[  110.995546] turning off the locking correctness validator.
[  110.995604] CPU: 1 PID: 0 Comm: swapper/1 Kdump: loaded Tainted: G        W         5.15.0-wt-ath+ #522
[  110.995664] Hardware name: Intel(R) Client Systems NUC8i7HVK/NUC8i7HVB, BIOS HNKBLi70.86A.0067.2021.0528.1339 05/28/2021
[  110.995720] Call Trace:
[  110.995774]  <IRQ>
[  110.995828]  dump_stack_lvl+0x57/0x7d
[  110.995887]  register_lock_class+0x1604/0x17e0
[  110.995945]  ? check_prev_add+0x7bb/0x20f0
[  110.996002]  ? is_dynamic_key+0x1a0/0x1a0
[  110.996058]  ? validate_chain+0xac3/0x1b30
[  110.996127]  __lock_acquire+0x96/0x1870
[  110.996196]  ? check_prev_add+0x20f0/0x20f0
[  110.996266]  ? sched_clock_cpu+0x15/0x1b0
[  110.996339]  ? mark_lock+0xd0/0x14a0
[  110.996401]  lock_acquire.part.0+0x117/0x340
[  110.996470]  ? ath11k_dp_rx_mon_dest_process.constprop.0+0x13a/0x6e0 [ath11k]
[  110.996553]  ? rcu_read_unlock+0x40/0x40
[  110.996622]  ? rcu_read_lock_sched_held+0x3a/0x70
[  110.996685]  ? lock_acquire+0x1a8/0x210
[  110.996751]  ? ath11k_dp_rx_mon_dest_process.constprop.0+0x13a/0x6e0 [ath11k]
[  110.996831]  _raw_spin_lock_bh+0x34/0x80
[  110.996892]  ? ath11k_dp_rx_mon_dest_process.constprop.0+0x13a/0x6e0 [ath11k]
[  110.996971]  ath11k_dp_rx_mon_dest_process.constprop.0+0x13a/0x6e0 [ath11k]
[  110.997071]  ? ath11k_dp_rxbufs_replenish+0x7a0/0x7a0 [ath11k]
[  110.997187]  ? mark_held_locks+0xa5/0xe0
[  110.997272]  ? ath11k_hal_rx_parse_mon_status_tlv+0x6d7/0x1880 [ath11k]
[  110.997389]  ? ath11k_hal_rx_parse_mon_status+0xed/0x170 [ath11k]
[  110.997506]  ath11k_dp_rx_process_mon_rings+0x3f9/0x580 [ath11k]
[  110.997600]  ? ath11k_dp_rx_pdev_alloc+0xd50/0xd50 [ath11k]
[  110.997680]  ath11k_dp_service_mon_ring+0x67/0xe0 [ath11k]
[  110.997759]  ? ath11k_dp_rx_process_mon_rings+0x580/0x580 [ath11k]
[  110.997835]  call_timer_fn+0x167/0x4a0
[  110.997903]  ? add_timer_on+0x3b0/0x3b0
[  110.997967]  ? lockdep_hardirqs_on_prepare.part.0+0x18c/0x370
[  110.998031]  __run_timers.part.0+0x539/0x8b0
[  110.998123]  ? ath11k_dp_rx_process_mon_rings+0x580/0x580 [ath11k]
[  110.998228]  ? call_timer_fn+0x4a0/0x4a0
[  110.998314]  ? clockevents_program_event+0xdd/0x280
[  110.998408]  ? recalibrate_cpu_khz+0x10/0x10
[  110.998496]  ? ktime_get+0x119/0x2f0
[  110.998579]  ? hrtimer_interrupt+0x32f/0x770
[  110.998679]  run_timer_softirq+0x97/0x180
[  110.998764]  __do_softirq+0x276/0x86a
[  110.998850]  __irq_exit_rcu+0x11c/0x180
[  110.998934]  irq_exit_rcu+0x5/0x20
[  110.999017]  sysvec_apic_timer_interrupt+0x8e/0xc0
[  110.999100]  </IRQ>
[  110.999181]  <TASK>
[  110.999261]  asm_sysvec_apic_timer_interrupt+0x12/0x20
Signature · 3 lines
https://patchwork.kernel.org/project/linux-wireless/patch/[email protected]/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
#12 lore raw

Re: [PATCH 3/3] ath11k: process full monitor mode rx support

Quoted 95 lines · Kalle Valo
Quoted 10 lines · Jouni Malinen

From: Anilkumar Kolli <[email protected]>

In full monitor mode, monitor destination ring is read before monitor status ring. mon_dst_ring has ppdu id, reap till the end of PPDU. Add all the MPDUs to list. Start processing the status ring, if PPDU id in status ring is lagging behind, reap the status ring, once the PPDU ID matches, deliver the MSDU to upper layer. If status PPDU id leading, reap the mon_dst_ring. The advantage with full monitor mode is hardware has status buffers available for all the MPDUs in mon_dst_ring.

Quoted 4 lines

Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.4.0.1-01734-QCAHKSWPL_SILICONZ-1

I changed the commit log to this to better describe how this patch helps:

ath11k: process full monitor mode rx support

In full monitor mode, monitor destination ring is read before
monitor
status ring. mon_dst_ring has ppdu id, reap till the end of PPDU.
Add
all the MPDUs to list. Start processing the status ring, if PPDU id
in
status ring is lagging behind, reap the status ring, once the PPDU
ID
matches, deliver the MSDU to upper layer. If status PPDU id
leading,
reap the mon_dst_ring.

The advantage with full monitor mode is hardware has status
buffers available
for all the MPDUs in mon_dst_ring, which makes it possible to
deliver more
frames to be seen on sniffer.

Tested-on: QCN9074 hw1.0 PCI
WLAN.HK.2.4.0.1-01734-QCAHKSWPL_SILICONZ-1

But now I see a new warning with QCA6390 caused by patch 3. Please fix that and submit v2.

[  108.354361] ath11k_pci 0000:06:00.0: chip_id 0x0 chip_family 0xb
board_id 0xff soc_id 0xffffffff
[  108.354547] ath11k_pci 0000:06:00.0: fw_version 0x101c06cc
fw_build_timestamp 2020-06-24 19:50 fw_build_id
[  110.995359] INFO: trying to register non-static key.
[  110.995429] The code is fine but needs lockdep annotation, or maybe
[  110.995489] you didn't initialize this object before use?
[  110.995546] turning off the locking correctness validator.
[  110.995604] CPU: 1 PID: 0 Comm: swapper/1 Kdump: loaded Tainted: G
      W         5.15.0-wt-ath+ #522
[  110.995664] Hardware name: Intel(R) Client Systems
NUC8i7HVK/NUC8i7HVB, BIOS HNKBLi70.86A.0067.2021.0528.1339 05/28/2021
[  110.995720] Call Trace:
[  110.995774]  <IRQ>
[  110.995828]  dump_stack_lvl+0x57/0x7d
[  110.995887]  register_lock_class+0x1604/0x17e0
[  110.995945]  ? check_prev_add+0x7bb/0x20f0
[  110.996002]  ? is_dynamic_key+0x1a0/0x1a0
[  110.996058]  ? validate_chain+0xac3/0x1b30
[  110.996127]  __lock_acquire+0x96/0x1870
[  110.996196]  ? check_prev_add+0x20f0/0x20f0
[  110.996266]  ? sched_clock_cpu+0x15/0x1b0
[  110.996339]  ? mark_lock+0xd0/0x14a0
[  110.996401]  lock_acquire.part.0+0x117/0x340
[  110.996470]  ? ath11k_dp_rx_mon_dest_process.constprop.0+0x13a/0x6e0 [ath11k]
[  110.996553]  ? rcu_read_unlock+0x40/0x40
[  110.996622]  ? rcu_read_lock_sched_held+0x3a/0x70
[  110.996685]  ? lock_acquire+0x1a8/0x210
[  110.996751]  ? ath11k_dp_rx_mon_dest_process.constprop.0+0x13a/0x6e0 [ath11k]
[  110.996831]  _raw_spin_lock_bh+0x34/0x80
[  110.996892]  ? ath11k_dp_rx_mon_dest_process.constprop.0+0x13a/0x6e0 [ath11k]
[  110.996971]  ath11k_dp_rx_mon_dest_process.constprop.0+0x13a/0x6e0 [ath11k]
[  110.997071]  ? ath11k_dp_rxbufs_replenish+0x7a0/0x7a0 [ath11k]
[  110.997187]  ? mark_held_locks+0xa5/0xe0
[  110.997272]  ? ath11k_hal_rx_parse_mon_status_tlv+0x6d7/0x1880 [ath11k]
[  110.997389]  ? ath11k_hal_rx_parse_mon_status+0xed/0x170 [ath11k]
[  110.997506]  ath11k_dp_rx_process_mon_rings+0x3f9/0x580 [ath11k]
[  110.997600]  ? ath11k_dp_rx_pdev_alloc+0xd50/0xd50 [ath11k]
[  110.997680]  ath11k_dp_service_mon_ring+0x67/0xe0 [ath11k]
[  110.997759]  ? ath11k_dp_rx_process_mon_rings+0x580/0x580 [ath11k]
[  110.997835]  call_timer_fn+0x167/0x4a0
[  110.997903]  ? add_timer_on+0x3b0/0x3b0
[  110.997967]  ? lockdep_hardirqs_on_prepare.part.0+0x18c/0x370
[  110.998031]  __run_timers.part.0+0x539/0x8b0
[  110.998123]  ? ath11k_dp_rx_process_mon_rings+0x580/0x580 [ath11k]
[  110.998228]  ? call_timer_fn+0x4a0/0x4a0
[  110.998314]  ? clockevents_program_event+0xdd/0x280
[  110.998408]  ? recalibrate_cpu_khz+0x10/0x10
[  110.998496]  ? ktime_get+0x119/0x2f0
[  110.998579]  ? hrtimer_interrupt+0x32f/0x770
Quoted 8 lines
[  110.998679]  run_timer_softirq+0x97/0x180
[  110.998764]  __do_softirq+0x276/0x86a
[  110.998850]  __irq_exit_rcu+0x11c/0x180
[  110.998934]  irq_exit_rcu+0x5/0x20
[  110.999017]  sysvec_apic_timer_interrupt+0x8e/0xc0
[  110.999100]  </IRQ>
[  110.999181]  <TASK>
[  110.999261]  asm_sysvec_apic_timer_interrupt+0x12/0x20

I have posted v2 patch. With v2, I did not see the issue with QCA6390 during the bootup.

Thanks
Anil