Message ID | 20250422094255.131226-1-nithyanantham.paramasivam@oss.qualcomm.com |
---|---|
State | New |
Headers | show |
Series | [ath-next] wifi: ath12k: Enable AST index based address search in Station Mode | expand |
On 4/22/2025 3:12 PM, Nithyanantham Paramasivam wrote: > From: Thiraviyam Mariyappan <quic_tmariyap@quicinc.com> > > Currently, TCL performs the TX address search for each entry during > transmission, which may lead to packet delays. > > To mitigate this issue, enable AST index-based address search during > transmission in station mode. This AST index-based search is not > enabled in AP mode due to the complexity involved in fetching peer > information. > > Implement changes to retrieve the offset of ast_idx/ast_hash values > from the PEER_MAP3 event, update the vdev search type to ADDRX, and > enable AST lookup in the bank configuration. > > Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1 > Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3 > > Signed-off-by: Thiraviyam Mariyappan <quic_tmariyap@quicinc.com> > Signed-off-by: Nithyanantham Paramasivam <nithyanantham.paramasivam@oss.qualcomm.com> > --- > drivers/net/wireless/ath/ath12k/dp.c | 10 +++++----- > drivers/net/wireless/ath/ath12k/dp.h | 2 ++ > drivers/net/wireless/ath/ath12k/dp_rx.c | 6 +++++- > 3 files changed, 12 insertions(+), 6 deletions(-) > > diff --git a/drivers/net/wireless/ath/ath12k/dp.c b/drivers/net/wireless/ath/ath12k/dp.c > index ad873013e46c..0291fbea6312 100644 > --- a/drivers/net/wireless/ath/ath12k/dp.c > +++ b/drivers/net/wireless/ath/ath12k/dp.c > @@ -354,7 +354,10 @@ u32 ath12k_dp_tx_get_vdev_bank_config(struct ath12k_base *ab, > u32_encode_bits(0, HAL_TX_BANK_CONFIG_EPD); > > /* only valid if idx_lookup_override is not set in tcl_data_cmd */ > - bank_config |= u32_encode_bits(0, HAL_TX_BANK_CONFIG_INDEX_LOOKUP_EN); > + if (ahvif->vdev_type == WMI_VDEV_TYPE_STA) > + bank_config |= u32_encode_bits(1, HAL_TX_BANK_CONFIG_INDEX_LOOKUP_EN); > + else > + bank_config |= u32_encode_bits(0, HAL_TX_BANK_CONFIG_INDEX_LOOKUP_EN); > > bank_config |= u32_encode_bits(arvif->hal_addr_search_flags & HAL_TX_ADDRX_EN, > HAL_TX_BANK_CONFIG_ADDRX_EN) | > @@ -1107,11 +1110,8 @@ static void ath12k_dp_update_vdev_search(struct ath12k_link_vif *arvif) > { > switch (arvif->ahvif->vdev_type) { > case WMI_VDEV_TYPE_STA: > - /* TODO: Verify the search type and flags since ast hash > - * is not part of peer mapv3 > - */ > arvif->hal_addr_search_flags = HAL_TX_ADDRY_EN; > - arvif->search_type = HAL_TX_ADDR_SEARCH_DEFAULT; > + arvif->search_type = HAL_TX_ADDR_SEARCH_INDEX; > break; > case WMI_VDEV_TYPE_AP: > case WMI_VDEV_TYPE_IBSS: > diff --git a/drivers/net/wireless/ath/ath12k/dp.h b/drivers/net/wireless/ath/ath12k/dp.h > index 706d766d8c81..e3923ff02dbd 100644 > --- a/drivers/net/wireless/ath/ath12k/dp.h > +++ b/drivers/net/wireless/ath/ath12k/dp.h > @@ -1330,6 +1330,8 @@ struct htt_t2h_version_conf_msg { > #define HTT_T2H_PEER_MAP_INFO1_MAC_ADDR_H16 GENMASK(15, 0) > #define HTT_T2H_PEER_MAP_INFO1_HW_PEER_ID GENMASK(31, 16) > #define HTT_T2H_PEER_MAP_INFO2_AST_HASH_VAL GENMASK(15, 0) > +#define HTT_T2H_PEER_MAP3_INFO2_HW_PEER_ID GENMASK(15, 0) > +#define HTT_T2H_PEER_MAP3_INFO2_AST_HASH_VAL GENMASK(31, 16) > #define HTT_T2H_PEER_MAP_INFO2_NEXT_HOP_M BIT(16) > #define HTT_T2H_PEER_MAP_INFO2_NEXT_HOP_S 16 > > diff --git a/drivers/net/wireless/ath/ath12k/dp_rx.c b/drivers/net/wireless/ath/ath12k/dp_rx.c > index 1abfbd15f13c..f83e34db83c0 100644 > --- a/drivers/net/wireless/ath/ath12k/dp_rx.c > +++ b/drivers/net/wireless/ath/ath12k/dp_rx.c > @@ -1802,8 +1802,12 @@ void ath12k_dp_htt_htc_t2h_msg_handler(struct ath12k_base *ab, > HTT_T2H_PEER_MAP_INFO1_MAC_ADDR_H16); > ath12k_dp_get_mac_addr(le32_to_cpu(resp->peer_map_ev.mac_addr_l32), > peer_mac_h16, mac_addr); > + ast_hash = le32_get_bits(resp->peer_map_ev.info2, > + HTT_T2H_PEER_MAP3_INFO2_AST_HASH_VAL); > + hw_peer_id = le32_get_bits(resp->peer_map_ev.info2, > + HTT_T2H_PEER_MAP3_INFO2_HW_PEER_ID); > ath12k_peer_map_event(ab, vdev_id, peer_id, mac_addr, ast_hash, > - peer_id); > + hw_peer_id); > break; > case HTT_T2H_MSG_TYPE_PEER_UNMAP: > case HTT_T2H_MSG_TYPE_PEER_UNMAP2: > > base-commit: d33705bb41ff786b537f8ed50a187a474db111c1 Reviewed-by: Mahendran P <quic_mahep@quicinc.com>
diff --git a/drivers/net/wireless/ath/ath12k/dp.c b/drivers/net/wireless/ath/ath12k/dp.c index ad873013e46c..0291fbea6312 100644 --- a/drivers/net/wireless/ath/ath12k/dp.c +++ b/drivers/net/wireless/ath/ath12k/dp.c @@ -354,7 +354,10 @@ u32 ath12k_dp_tx_get_vdev_bank_config(struct ath12k_base *ab, u32_encode_bits(0, HAL_TX_BANK_CONFIG_EPD); /* only valid if idx_lookup_override is not set in tcl_data_cmd */ - bank_config |= u32_encode_bits(0, HAL_TX_BANK_CONFIG_INDEX_LOOKUP_EN); + if (ahvif->vdev_type == WMI_VDEV_TYPE_STA) + bank_config |= u32_encode_bits(1, HAL_TX_BANK_CONFIG_INDEX_LOOKUP_EN); + else + bank_config |= u32_encode_bits(0, HAL_TX_BANK_CONFIG_INDEX_LOOKUP_EN); bank_config |= u32_encode_bits(arvif->hal_addr_search_flags & HAL_TX_ADDRX_EN, HAL_TX_BANK_CONFIG_ADDRX_EN) | @@ -1107,11 +1110,8 @@ static void ath12k_dp_update_vdev_search(struct ath12k_link_vif *arvif) { switch (arvif->ahvif->vdev_type) { case WMI_VDEV_TYPE_STA: - /* TODO: Verify the search type and flags since ast hash - * is not part of peer mapv3 - */ arvif->hal_addr_search_flags = HAL_TX_ADDRY_EN; - arvif->search_type = HAL_TX_ADDR_SEARCH_DEFAULT; + arvif->search_type = HAL_TX_ADDR_SEARCH_INDEX; break; case WMI_VDEV_TYPE_AP: case WMI_VDEV_TYPE_IBSS: diff --git a/drivers/net/wireless/ath/ath12k/dp.h b/drivers/net/wireless/ath/ath12k/dp.h index 706d766d8c81..e3923ff02dbd 100644 --- a/drivers/net/wireless/ath/ath12k/dp.h +++ b/drivers/net/wireless/ath/ath12k/dp.h @@ -1330,6 +1330,8 @@ struct htt_t2h_version_conf_msg { #define HTT_T2H_PEER_MAP_INFO1_MAC_ADDR_H16 GENMASK(15, 0) #define HTT_T2H_PEER_MAP_INFO1_HW_PEER_ID GENMASK(31, 16) #define HTT_T2H_PEER_MAP_INFO2_AST_HASH_VAL GENMASK(15, 0) +#define HTT_T2H_PEER_MAP3_INFO2_HW_PEER_ID GENMASK(15, 0) +#define HTT_T2H_PEER_MAP3_INFO2_AST_HASH_VAL GENMASK(31, 16) #define HTT_T2H_PEER_MAP_INFO2_NEXT_HOP_M BIT(16) #define HTT_T2H_PEER_MAP_INFO2_NEXT_HOP_S 16 diff --git a/drivers/net/wireless/ath/ath12k/dp_rx.c b/drivers/net/wireless/ath/ath12k/dp_rx.c index 1abfbd15f13c..f83e34db83c0 100644 --- a/drivers/net/wireless/ath/ath12k/dp_rx.c +++ b/drivers/net/wireless/ath/ath12k/dp_rx.c @@ -1802,8 +1802,12 @@ void ath12k_dp_htt_htc_t2h_msg_handler(struct ath12k_base *ab, HTT_T2H_PEER_MAP_INFO1_MAC_ADDR_H16); ath12k_dp_get_mac_addr(le32_to_cpu(resp->peer_map_ev.mac_addr_l32), peer_mac_h16, mac_addr); + ast_hash = le32_get_bits(resp->peer_map_ev.info2, + HTT_T2H_PEER_MAP3_INFO2_AST_HASH_VAL); + hw_peer_id = le32_get_bits(resp->peer_map_ev.info2, + HTT_T2H_PEER_MAP3_INFO2_HW_PEER_ID); ath12k_peer_map_event(ab, vdev_id, peer_id, mac_addr, ast_hash, - peer_id); + hw_peer_id); break; case HTT_T2H_MSG_TYPE_PEER_UNMAP: case HTT_T2H_MSG_TYPE_PEER_UNMAP2: