wifi: ath12k: Enable AST index based address search in Station Mode
authorThiraviyam Mariyappan <quic_tmariyap@quicinc.com>
Tue, 22 Apr 2025 09:42:55 +0000 (15:12 +0530)
committerJeff Johnson <jeff.johnson@oss.qualcomm.com>
Fri, 16 May 2025 19:38:56 +0000 (12:38 -0700)
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>
Reviewed-by: Mahendran P <quic_mahep@quicinc.com>
Link: https://patch.msgid.link/20250422094255.131226-1-nithyanantham.paramasivam@oss.qualcomm.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
drivers/net/wireless/ath/ath12k/dp.c
drivers/net/wireless/ath/ath12k/dp.h
drivers/net/wireless/ath/ath12k/dp_rx.c

index 5ee879cdf9775f96932a64fd824a131830d60111..6317c6d4c043719a2cbcd34c3325b9ecf36b8499 100644 (file)
@@ -361,7 +361,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) |
@@ -1105,11 +1108,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:
index b4a2b27cec32cbb209e41378efc03b07f067212e..9f03f1cbaa7fc57c9471ecf427d97c589cc7c407 100644 (file)
@@ -1353,6 +1353,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
 
index 828ed55f83f55eca3133d5b27c7c6b10f9a67613..d606a29c89ed5d2e80d9462177a65f24b530ef4c 100644 (file)
@@ -1840,8 +1840,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: