diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index f52435f43b..ab95364614 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/dp/inc/cdp_txrx_cmn_struct.h @@ -1443,6 +1443,7 @@ enum cdp_pdev_param_type { * @cdp_skel_enable : Enable/Disable skeleton code for Umac reset debug * @cdp_drop_tx_mcast: Enable/Disable tx mcast drop * @cdp_vdev_tx_to_fw: Set to_fw bit for all tx packets for the vdev + * @cdp_peer_metadata_ver: DP rx peer metadata version configuration */ typedef union cdp_config_param_t { /* peer params */ @@ -1533,6 +1534,7 @@ typedef union cdp_config_param_t { bool cdp_umac_rst_skel; bool cdp_drop_tx_mcast; bool cdp_vdev_tx_to_fw; + uint8_t cdp_peer_metadata_ver; } cdp_config_param_type; /** @@ -1688,6 +1690,7 @@ enum cdp_vdev_param_type { * @CDP_UMAC_RST_SKEL_ENABLE: Enable Umac reset skeleton code for debug * @CDP_SAWF_STATS: set SAWF stats config * @CDP_UMAC_RESET_STATS: UMAC reset stats + * @CDP_CFG_RX_PEER_METADATA_VER: RX peer metadata configuration */ enum cdp_psoc_param_type { CDP_ENABLE_RATE_STATS, @@ -1700,8 +1703,16 @@ enum cdp_psoc_param_type { CDP_UMAC_RST_SKEL_ENABLE, CDP_SAWF_STATS, CDP_UMAC_RESET_STATS, + CDP_CFG_RX_PEER_METADATA_VER, }; +#ifdef CONFIG_AP_PLATFORM +/* RX peer metadata version if v1a_v1b is supported */ +#define CDP_RX_PEER_METADATA_V1_A_B 3 +#else +#define CDP_RX_PEER_METADATA_V1_A_B 2 +#endif + #define TXRX_FW_STATS_TXSTATS 1 #define TXRX_FW_STATS_RXSTATS 2 #define TXRX_FW_STATS_RX_RATE_INFO 3 diff --git a/dp/wifi3.0/be/dp_be_rx.h b/dp/wifi3.0/be/dp_be_rx.h index c3b5047b5e..f1a6fa48b9 100644 --- a/dp/wifi3.0/be/dp_be_rx.h +++ b/dp/wifi3.0/be/dp_be_rx.h @@ -190,18 +190,25 @@ dp_rx_desc_sw_cc_check(struct dp_soc *soc, #define DP_PEER_METADATA_OFFLOAD_GET_BE(_peer_metadata) (0) +#define HTT_RX_PEER_META_DATA_FIELD_GET(_var, _field_s, _field_m) \ + (((_var) & (_field_m)) >> (_field_s)) + #ifdef DP_USE_REDUCED_PEER_ID_FIELD_WIDTH static inline uint16_t dp_rx_peer_metadata_peer_id_get_be(struct dp_soc *soc, uint32_t peer_metadata) { - struct htt_rx_peer_metadata_v1 *metadata = - (struct htt_rx_peer_metadata_v1 *)&peer_metadata; + uint8_t ml_peer_valid; uint16_t peer_id; - peer_id = metadata->peer_id | - (metadata->ml_peer_valid << soc->peer_id_shift); + peer_id = HTT_RX_PEER_META_DATA_FIELD_GET(peer_metadata, + soc->htt_peer_id_s, + soc->htt_peer_id_m); + ml_peer_valid = HTT_RX_PEER_META_DATA_FIELD_GET( + peer_metadata, + soc->htt_mld_peer_valid_s, + soc->htt_mld_peer_valid_m); - return peer_id; + return (peer_id | (ml_peer_valid << soc->peer_id_shift)); } #else /* Combine ml_peer_valid and peer_id field */ @@ -219,10 +226,10 @@ dp_rx_peer_metadata_peer_id_get_be(struct dp_soc *soc, uint32_t peer_metadata) static inline uint16_t dp_rx_peer_metadata_vdev_id_get_be(struct dp_soc *soc, uint32_t peer_metadata) { - struct htt_rx_peer_metadata_v1 *metadata = - (struct htt_rx_peer_metadata_v1 *)&peer_metadata; - return metadata->vdev_id; + return HTT_RX_PEER_META_DATA_FIELD_GET(peer_metadata, + soc->htt_vdev_id_s, + soc->htt_vdev_id_m); } static inline uint8_t diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index adced641cc..5caed3ae58 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -7435,6 +7435,64 @@ dp_set_vdev_param_wrapper(struct cdp_soc_t *cdp_soc, uint8_t vdev_id, } #endif +/** + * dp_rx_peer_metadata_ver_update() - update rx peer metadata version and + * corresponding filed shift and mask + * @soc: Handle to DP Soc structure + * @peer_md_ver: RX peer metadata version value + * + * Return: None + */ +static void +dp_rx_peer_metadata_ver_update(struct dp_soc *soc, uint8_t peer_md_ver) +{ + dp_info("rx_peer_metadata version %d", peer_md_ver); + + switch (peer_md_ver) { + case 0: /* htt_rx_peer_metadata_v0 */ + soc->htt_peer_id_s = HTT_RX_PEER_META_DATA_V0_PEER_ID_S; + soc->htt_peer_id_m = HTT_RX_PEER_META_DATA_V0_PEER_ID_M; + soc->htt_vdev_id_s = HTT_RX_PEER_META_DATA_V0_VDEV_ID_S; + soc->htt_vdev_id_m = HTT_RX_PEER_META_DATA_V0_VDEV_ID_M; + break; + case 1: /* htt_rx_peer_metadata_v1 */ + soc->htt_peer_id_s = HTT_RX_PEER_META_DATA_V1_PEER_ID_S; + soc->htt_peer_id_m = HTT_RX_PEER_META_DATA_V1_PEER_ID_M; + soc->htt_vdev_id_s = HTT_RX_PEER_META_DATA_V1_VDEV_ID_S; + soc->htt_vdev_id_m = HTT_RX_PEER_META_DATA_V1_VDEV_ID_M; + soc->htt_mld_peer_valid_s = + HTT_RX_PEER_META_DATA_V1_ML_PEER_VALID_S; + soc->htt_mld_peer_valid_m = + HTT_RX_PEER_META_DATA_V1_ML_PEER_VALID_M; + break; + case 2: /* htt_rx_peer_metadata_v1a */ + soc->htt_peer_id_s = HTT_RX_PEER_META_DATA_V1A_PEER_ID_S; + soc->htt_peer_id_m = HTT_RX_PEER_META_DATA_V1A_PEER_ID_M; + soc->htt_vdev_id_s = HTT_RX_PEER_META_DATA_V1A_VDEV_ID_S; + soc->htt_vdev_id_m = HTT_RX_PEER_META_DATA_V1A_VDEV_ID_M; + soc->htt_mld_peer_valid_s = + HTT_RX_PEER_META_DATA_V1A_ML_PEER_VALID_S; + soc->htt_mld_peer_valid_m = + HTT_RX_PEER_META_DATA_V1A_ML_PEER_VALID_M; + break; + case 3: /* htt_rx_peer_metadata_v1b */ + soc->htt_peer_id_s = HTT_RX_PEER_META_DATA_V1B_PEER_ID_S; + soc->htt_peer_id_m = HTT_RX_PEER_META_DATA_V1B_PEER_ID_M; + soc->htt_vdev_id_s = HTT_RX_PEER_META_DATA_V1B_VDEV_ID_S; + soc->htt_vdev_id_m = HTT_RX_PEER_META_DATA_V1B_VDEV_ID_M; + soc->htt_mld_peer_valid_s = + HTT_RX_PEER_META_DATA_V1B_ML_PEER_VALID_S; + soc->htt_mld_peer_valid_m = + HTT_RX_PEER_META_DATA_V1B_ML_PEER_VALID_M; + break; + default: + dp_err("invliad rx_peer_metadata version %d", peer_md_ver); + break; + } + + soc->rx_peer_metadata_ver = peer_md_ver; +} + /** * dp_set_psoc_param: function to set parameters in psoc * @cdp_soc: DP soc handle @@ -7506,6 +7564,10 @@ dp_set_psoc_param(struct cdp_soc_t *cdp_soc, wlan_cfg_set_sawf_stats_config(wlan_cfg_ctx, val.cdp_sawf_stats); break; + case CDP_CFG_RX_PEER_METADATA_VER: + dp_rx_peer_metadata_ver_update( + soc, val.cdp_peer_metadata_ver); + break; default: break; } diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 70aae5bc84..c60b4122d7 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -2796,6 +2796,16 @@ struct dp_soc { uint32_t peer_id_mask; #endif + /* rx peer metadata field shift and mask configuration */ + uint8_t htt_peer_id_s; + uint32_t htt_peer_id_m; + uint8_t htt_vdev_id_s; + uint32_t htt_vdev_id_m; + uint8_t htt_mld_peer_valid_s; + uint32_t htt_mld_peer_valid_m; + /* rx peer metadata version */ + uint8_t rx_peer_metadata_ver; + /* SoC level data path statistics */ struct dp_soc_stats stats; #ifdef WLAN_SYSFS_DP_STATS