The WBM error path also stores a driver link id in ath12k_skb_rxcb::drv_link_id, previously derived from the source link id via rx_desc_get_msdu_src_link_id(). Like the REO path, the source of this id differs per device. Add a HAL op rx_msdu_desc_get_drv_link_id() to let each device provide its own driver link id on the WBM error path. For QCN9274 keep the existing behavior; for WCN7850/QCC2072 extract the logical link id from the peer metadata via ath12k_wifi7_dp_rx_get_logical_link_id(). This replaces the old rx_desc_get_msdu_src_link_id op, which had no other user and is removed along with its per-device implementations. Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.1.c7-00108-QCAHMTSWPL_V1.0_V2.0_SILICONZ_UPSTREAM-3 Tested-on: QCC2072 hw1.0 PCI WLAN.COL.1.0.c2-00068-QCACOLSWPL_V1_TO_SILICONZ-1 Signed-off-by: Baochen Qiang --- drivers/net/wireless/ath/ath12k/dp_rx.h | 15 +++++++++------ drivers/net/wireless/ath/ath12k/hal.h | 4 +++- drivers/net/wireless/ath/ath12k/wifi7/dp_rx.c | 22 +++++++++++----------- .../net/wireless/ath/ath12k/wifi7/hal_qcc2072.c | 7 +------ .../net/wireless/ath/ath12k/wifi7/hal_qcn9274.c | 7 +++++-- .../net/wireless/ath/ath12k/wifi7/hal_qcn9274.h | 1 - .../net/wireless/ath/ath12k/wifi7/hal_wcn7850.c | 8 +++++--- .../net/wireless/ath/ath12k/wifi7/hal_wcn7850.h | 4 +++- 8 files changed, 37 insertions(+), 31 deletions(-) diff --git a/drivers/net/wireless/ath/ath12k/dp_rx.h b/drivers/net/wireless/ath/ath12k/dp_rx.h index fcad6a7ad6ba..a78efa1d9569 100644 --- a/drivers/net/wireless/ath/ath12k/dp_rx.h +++ b/drivers/net/wireless/ath/ath12k/dp_rx.h @@ -164,12 +164,6 @@ static inline void ath12k_dp_rx_desc_get_crypto_header(struct ath12k_hal *hal, hal->ops->rx_desc_get_crypto_header(desc, crypto_hdr, enctype); } -static inline u8 ath12k_dp_rx_get_msdu_src_link(struct ath12k_hal *hal, - struct hal_rx_desc *desc) -{ - return hal->ops->rx_desc_get_msdu_src_link_id(desc); -} - static inline u8 ath12k_dp_rx_reo_get_drv_link_id(struct ath12k_dp *dp, struct hal_reo_dest_ring *reo_desc) @@ -177,6 +171,15 @@ ath12k_dp_rx_reo_get_drv_link_id(struct ath12k_dp *dp, return dp->hal->ops->rx_reo_desc_get_drv_link_id(dp, reo_desc); } +static inline u8 +ath12k_dp_rx_wbm_get_drv_link_id(struct ath12k_dp *dp, + struct hal_rx_desc *rx_desc, + __le32 peer_metadata) +{ + return dp->hal->ops->rx_msdu_desc_get_drv_link_id(dp, rx_desc, + peer_metadata); +} + static inline void ath12k_dp_clean_up_skb_list(struct sk_buff_head *skb_list) { struct sk_buff *skb; diff --git a/drivers/net/wireless/ath/ath12k/hal.h b/drivers/net/wireless/ath/ath12k/hal.h index c8bb63d92bfd..343e1636b4cc 100644 --- a/drivers/net/wireless/ath/ath12k/hal.h +++ b/drivers/net/wireless/ath/ath12k/hal.h @@ -1378,9 +1378,11 @@ struct hal_ops { enum hal_encrypt_type enctype); void (*rx_desc_copy_end_tlv)(struct hal_rx_desc *fdesc, struct hal_rx_desc *ldesc); - u8 (*rx_desc_get_msdu_src_link_id)(struct hal_rx_desc *desc); u8 (*rx_reo_desc_get_drv_link_id)(struct ath12k_dp *dp, struct hal_reo_dest_ring *reo_desc); + u8 (*rx_msdu_desc_get_drv_link_id)(struct ath12k_dp *dp, + struct hal_rx_desc *rx_desc, + __le32 peer_metadata); void (*extract_rx_desc_data)(struct hal_rx_desc_data *rx_desc_data, struct hal_rx_desc *rx_desc, struct hal_rx_desc *ldesc); diff --git a/drivers/net/wireless/ath/ath12k/wifi7/dp_rx.c b/drivers/net/wireless/ath/ath12k/wifi7/dp_rx.c index 312c7ac74b3b..4132578085cc 100644 --- a/drivers/net/wireless/ath/ath12k/wifi7/dp_rx.c +++ b/drivers/net/wireless/ath/ath12k/wifi7/dp_rx.c @@ -1961,7 +1961,7 @@ int ath12k_wifi7_dp_rx_process_wbm_err(struct ath12k_dp *dp, struct ath12k_rx_desc_info *desc_info; struct ath12k_device_dp_stats *device_stats = &dp->device_stats; struct ath12k_hw_link *hw_links = ag->hw_links; - u8 hw_link_id, device_id; + u8 drv_link_id, device_id; int ret, pdev_idx; struct hal_rx_desc *msdu_data; @@ -2057,9 +2057,9 @@ int ath12k_wifi7_dp_rx_process_wbm_err(struct ath12k_dp *dp, continue; } - hw_link_id = ath12k_dp_rx_get_msdu_src_link(partner_dp->hal, - msdu_data); - if (hw_link_id >= ATH12K_GROUP_MAX_RADIO) { + drv_link_id = ath12k_dp_rx_wbm_get_drv_link_id(partner_dp, msdu_data, + err_info.peer_metadata); + if (drv_link_id >= ATH12K_GROUP_MAX_RADIO) { ath12k_wifi7_dp_rx_wbm_err_free_skb(dp, msdu, WBM_ERR_DROP_INV_HW_ID); @@ -2075,7 +2075,7 @@ int ath12k_wifi7_dp_rx_process_wbm_err(struct ath12k_dp *dp, skb_queue_walk(&scatter_msdu_list, msdu) { rxcb = ATH12K_SKB_RXCB(msdu); - rxcb->drv_link_id = hw_link_id; + rxcb->drv_link_id = drv_link_id; } skb_queue_splice_tail_init(&scatter_msdu_list, @@ -2083,7 +2083,7 @@ int ath12k_wifi7_dp_rx_process_wbm_err(struct ath12k_dp *dp, } rxcb = ATH12K_SKB_RXCB(msdu); - rxcb->drv_link_id = hw_link_id; + rxcb->drv_link_id = drv_link_id; __skb_queue_tail(&msdu_list, msdu); } @@ -2114,21 +2114,21 @@ int ath12k_wifi7_dp_rx_process_wbm_err(struct ath12k_dp *dp, rcu_read_lock(); while ((msdu = __skb_dequeue(&msdu_list))) { rxcb = ATH12K_SKB_RXCB(msdu); - hw_link_id = rxcb->drv_link_id; + drv_link_id = rxcb->drv_link_id; - device_id = ath12k_dp_drv_link_id_to_device_id(ag, hw_link_id); + device_id = ath12k_dp_drv_link_id_to_device_id(ag, drv_link_id); partner_dp = ath12k_dp_hw_grp_to_dp(dp_hw_grp, device_id); if (unlikely(!partner_dp)) { ath12k_dbg(ab, ATH12K_DBG_DATA, - "Unable to process WBM error msdu due to invalid hw link id %d device id %d\n", - hw_link_id, device_id); + "Unable to process WBM error msdu due to invalid drv link id %d device id %d\n", + drv_link_id, device_id); ath12k_wifi7_dp_rx_wbm_err_free_skb(dp, msdu, WBM_ERR_DROP_NULL_PROC_DP); continue; } pdev_idx = ath12k_hw_mac_id_to_pdev_id(partner_dp->hw_params, - hw_links[hw_link_id].pdev_idx); + hw_links[drv_link_id].pdev_idx); dp_pdev = ath12k_dp_to_pdev_dp(partner_dp, pdev_idx); if (!dp_pdev) { diff --git a/drivers/net/wireless/ath/ath12k/wifi7/hal_qcc2072.c b/drivers/net/wireless/ath/ath12k/wifi7/hal_qcc2072.c index edf122fd46b5..bad2b60409d9 100644 --- a/drivers/net/wireless/ath/ath12k/wifi7/hal_qcc2072.c +++ b/drivers/net/wireless/ath/ath12k/wifi7/hal_qcc2072.c @@ -173,11 +173,6 @@ static void ath12k_hal_rx_desc_copy_end_tlv_qcc2072(struct hal_rx_desc *fdesc, sizeof(struct rx_msdu_end_qcn9274)); } -static u8 ath12k_hal_rx_desc_get_msdu_src_link_qcc2072(struct hal_rx_desc *desc) -{ - return 0; -} - static u8 ath12k_hal_rx_desc_get_l3_pad_bytes_qcc2072(struct hal_rx_desc *desc) { return le16_get_bits(desc->u.qcc2072.msdu_end.info5, @@ -471,8 +466,8 @@ const struct hal_ops hal_qcc2072_ops = { .rx_desc_get_dot11_hdr = ath12k_hal_rx_desc_get_dot11_hdr_qcc2072, .rx_desc_get_crypto_header = ath12k_hal_rx_desc_get_crypto_hdr_qcc2072, .rx_desc_copy_end_tlv = ath12k_hal_rx_desc_copy_end_tlv_qcc2072, - .rx_desc_get_msdu_src_link_id = ath12k_hal_rx_desc_get_msdu_src_link_qcc2072, .rx_reo_desc_get_drv_link_id = ath12k_hal_rx_reo_desc_get_drv_link_id_wcn7850, + .rx_msdu_desc_get_drv_link_id = ath12k_hal_rx_msdu_desc_get_drv_link_id_wcn7850, .extract_rx_desc_data = ath12k_hal_extract_rx_desc_data_qcc2072, .rx_desc_get_l3_pad_bytes = ath12k_hal_rx_desc_get_l3_pad_bytes_qcc2072, .rx_desc_get_mpdu_start_tag = ath12k_hal_rx_desc_get_mpdu_start_tag_qcc2072, diff --git a/drivers/net/wireless/ath/ath12k/wifi7/hal_qcn9274.c b/drivers/net/wireless/ath/ath12k/wifi7/hal_qcn9274.c index 7bcde08f0d76..a5be431046d9 100644 --- a/drivers/net/wireless/ath/ath12k/wifi7/hal_qcn9274.c +++ b/drivers/net/wireless/ath/ath12k/wifi7/hal_qcn9274.c @@ -807,7 +807,10 @@ u32 ath12k_hal_get_rx_desc_size_qcn9274(void) return sizeof(struct hal_rx_desc_qcn9274_compact); } -u8 ath12k_hal_rx_desc_get_msdu_src_link_qcn9274(struct hal_rx_desc *desc) +static u8 +ath12k_hal_rx_msdu_desc_get_drv_link_id_qcn9274(struct ath12k_dp *dp, + struct hal_rx_desc *desc, + __le32 peer_metadata) { return le64_get_bits(desc->u.qcn9274_compact.msdu_end.msdu_end_tag, RX_MSDU_END_64_TLV_SRC_LINK_ID); @@ -1121,8 +1124,8 @@ const struct hal_ops hal_qcn9274_ops = { .rx_desc_get_dot11_hdr = ath12k_hal_rx_desc_get_dot11_hdr_qcn9274, .rx_desc_get_crypto_header = ath12k_hal_rx_desc_get_crypto_hdr_qcn9274, .rx_desc_copy_end_tlv = ath12k_hal_rx_desc_copy_end_tlv_qcn9274, - .rx_desc_get_msdu_src_link_id = ath12k_hal_rx_desc_get_msdu_src_link_qcn9274, .rx_reo_desc_get_drv_link_id = ath12k_hal_rx_reo_desc_get_drv_link_id_qcn9274, + .rx_msdu_desc_get_drv_link_id = ath12k_hal_rx_msdu_desc_get_drv_link_id_qcn9274, .extract_rx_desc_data = ath12k_hal_extract_rx_desc_data_qcn9274, .rx_desc_get_l3_pad_bytes = ath12k_hal_rx_desc_get_l3_pad_bytes_qcn9274, .rx_desc_get_mpdu_ppdu_id = ath12k_hal_rx_desc_get_mpdu_ppdu_id_qcn9274, diff --git a/drivers/net/wireless/ath/ath12k/wifi7/hal_qcn9274.h b/drivers/net/wireless/ath/ath12k/wifi7/hal_qcn9274.h index 03cf3792d523..c5d1e431d015 100644 --- a/drivers/net/wireless/ath/ath12k/wifi7/hal_qcn9274.h +++ b/drivers/net/wireless/ath/ath12k/wifi7/hal_qcn9274.h @@ -32,7 +32,6 @@ u8 *ath12k_hal_rx_desc_get_msdu_payload_qcn9274(struct hal_rx_desc *desc); u32 ath12k_hal_rx_desc_get_mpdu_start_offset_qcn9274(void); u32 ath12k_hal_rx_desc_get_msdu_end_offset_qcn9274(void); u32 ath12k_hal_get_rx_desc_size_qcn9274(void); -u8 ath12k_hal_rx_desc_get_msdu_src_link_qcn9274(struct hal_rx_desc *desc); u16 ath12k_hal_rx_mpdu_start_wmask_get_qcn9274(void); u32 ath12k_hal_rx_msdu_end_wmask_get_qcn9274(void); void ath12k_hal_rx_desc_get_crypto_hdr_qcn9274(struct hal_rx_desc *desc, diff --git a/drivers/net/wireless/ath/ath12k/wifi7/hal_wcn7850.c b/drivers/net/wireless/ath/ath12k/wifi7/hal_wcn7850.c index fec625a0ea0b..2d66d71d1b9b 100644 --- a/drivers/net/wireless/ath/ath12k/wifi7/hal_wcn7850.c +++ b/drivers/net/wireless/ath/ath12k/wifi7/hal_wcn7850.c @@ -505,9 +505,11 @@ u32 ath12k_hal_get_rx_desc_size_wcn7850(void) return sizeof(struct hal_rx_desc_wcn7850); } -u8 ath12k_hal_rx_desc_get_msdu_src_link_wcn7850(struct hal_rx_desc *desc) +u8 ath12k_hal_rx_msdu_desc_get_drv_link_id_wcn7850(struct ath12k_dp *dp, + struct hal_rx_desc *desc, + __le32 peer_metadata) { - return 0; + return ath12k_wifi7_dp_rx_get_logical_link_id(dp, peer_metadata); } u8 ath12k_hal_rx_reo_desc_get_drv_link_id_wcn7850(struct ath12k_dp *dp, @@ -803,8 +805,8 @@ const struct hal_ops hal_wcn7850_ops = { .rx_desc_get_dot11_hdr = ath12k_hal_rx_desc_get_dot11_hdr_wcn7850, .rx_desc_get_crypto_header = ath12k_hal_rx_desc_get_crypto_hdr_wcn7850, .rx_desc_copy_end_tlv = ath12k_hal_rx_desc_copy_end_tlv_wcn7850, - .rx_desc_get_msdu_src_link_id = ath12k_hal_rx_desc_get_msdu_src_link_wcn7850, .rx_reo_desc_get_drv_link_id = ath12k_hal_rx_reo_desc_get_drv_link_id_wcn7850, + .rx_msdu_desc_get_drv_link_id = ath12k_hal_rx_msdu_desc_get_drv_link_id_wcn7850, .extract_rx_desc_data = ath12k_hal_extract_rx_desc_data_wcn7850, .rx_desc_get_l3_pad_bytes = ath12k_hal_rx_desc_get_l3_pad_bytes_wcn7850, .rx_desc_get_mpdu_start_tag = ath12k_hal_rx_desc_get_mpdu_start_tag_wcn7850, diff --git a/drivers/net/wireless/ath/ath12k/wifi7/hal_wcn7850.h b/drivers/net/wireless/ath/ath12k/wifi7/hal_wcn7850.h index c7e1fba9bb4b..3fa919352686 100644 --- a/drivers/net/wireless/ath/ath12k/wifi7/hal_wcn7850.h +++ b/drivers/net/wireless/ath/ath12k/wifi7/hal_wcn7850.h @@ -27,9 +27,11 @@ u8 *ath12k_hal_rx_desc_get_msdu_payload_wcn7850(struct hal_rx_desc *desc); u32 ath12k_hal_rx_desc_get_mpdu_start_offset_wcn7850(void); u32 ath12k_hal_rx_desc_get_msdu_end_offset_wcn7850(void); u32 ath12k_hal_get_rx_desc_size_wcn7850(void); -u8 ath12k_hal_rx_desc_get_msdu_src_link_wcn7850(struct hal_rx_desc *desc); u8 ath12k_hal_rx_reo_desc_get_drv_link_id_wcn7850(struct ath12k_dp *dp, struct hal_reo_dest_ring *reo_desc); +u8 ath12k_hal_rx_msdu_desc_get_drv_link_id_wcn7850(struct ath12k_dp *dp, + struct hal_rx_desc *desc, + __le32 peer_metadata); void ath12k_hal_rx_desc_get_crypto_hdr_wcn7850(struct hal_rx_desc *desc, u8 *crypto_hdr, enum hal_encrypt_type enctype); -- 2.25.1