Sfoglia il codice sorgente

qcacmn: add DP API to support RX peer meta data version update

add DP API to support RX peer meta data version update.

Change-Id: I010cd64d5d60e5f2313fa3c4387968e85ce96157
CRs-Fixed: 3469143
Jinwei Chen 2 anni fa
parent
commit
a7d358d70a
4 ha cambiato i file con 98 aggiunte e 8 eliminazioni
  1. 11 0
      dp/inc/cdp_txrx_cmn_struct.h
  2. 15 8
      dp/wifi3.0/be/dp_be_rx.h
  3. 62 0
      dp/wifi3.0/dp_main.c
  4. 10 0
      dp/wifi3.0/dp_types.h

+ 11 - 0
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

+ 15 - 8
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

+ 62 - 0
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;
 	}

+ 10 - 0
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