ath11k: add full monitor mode support for QCN9074
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
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
@@ -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
@@ -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
@@ -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
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_paramfull_monitor_modeto enable full monitor support for QCN9074.HTT_H2T_MSG_TYPE_RX_FULL_MONITOR_MODEcmd 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
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_paramfull_monitor_modeto enable full monitor support for QCN9074.HTT_H2T_MSG_TYPE_RX_FULL_MONITOR_MODEcmd 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
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_paramfull_monitor_modeto enable full monitor support for
QCN9074.HTT_H2T_MSG_TYPE_RX_FULL_MONITOR_MODEcmd 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 frommon_dst_ringis 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
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_paramfull_monitor_modeto enable full monitor support for
QCN9074.HTT_H2T_MSG_TYPE_RX_FULL_MONITOR_MODEcmd 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 frommon_dst_ringis 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.
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_paramfull_monitor_modeto enable full monitor support for
QCN9074.HTT_H2T_MSG_TYPE_RX_FULL_MONITOR_MODEcmd 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 frommon_dst_ringis 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 eachPPDU_DONEstatus, 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.
Re: [PATCH 1/3] ath11k: add htt cmd to enable full monitor mode
In reply to Jouni MalinenQuoted 47 lines · Jouni Malinen
From: Anilkumar Kolli <[email protected]>
Add a new
hw_paramfull_monitor_modeto enable full monitor support for QCN9074.HTT_H2T_MSG_TYPE_RX_FULL_MONITOR_MODEcmd 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
Signed-off-by Anilkumar Kolli <[email protected]>Signed-off-by Jouni Malinen <[email protected]>--- 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@@ -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
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_paramfull_monitor_modeto enable full monitor support for QCN9074.HTT_H2T_MSG_TYPE_RX_FULL_MONITOR_MODEcmd 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
Signed-off-by Anilkumar Kolli <[email protected]>Signed-off-by Jouni Malinen <[email protected]>--- 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@@ -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
-0BIT (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
PATCH 2/3 ath11k: add software monitor ring descriptor for full monitor
In reply to Jouni MalinenFrom: 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
@@ -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
@@ -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
PATCH 3/3 ath11k: process full monitor mode rx support
In reply to Jouni MalinenFrom: 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
@@ -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
@@ -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
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_ringhas 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 themon_dst_ring. The advantage with full monitor mode is hardware has status buffers available for all the MPDUs inmon_dst_ring.
Quoted 4 lines
Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.4.0.1-01734-QCAHKSWPL_SILICONZ-1
Signed-off-by Anilkumar Kolli <[email protected]>Signed-off-by Jouni Malinen <[email protected]>
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
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_ringhas 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 themon_dst_ring. The advantage with full monitor mode is hardware has status buffers available for all the MPDUs inmon_dst_ring.Quoted 4 lines
Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.4.0.1-01734-QCAHKSWPL_SILICONZ-1
Signed-off-by Anilkumar Kolli <[email protected]>Signed-off-by Jouni Malinen <[email protected]>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_ringhas 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 themon_dst_ring.The advantage with full monitor mode is hardware has status
buffers available
for all the MPDUs inmon_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-1But 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