Browse Source

qcacmn: Set addr_search flags according to vdev opmode

Add support to set addr_search flags in WLAN Tx Descriptor
as per vdev operational mode

Change-Id: I25fcd4bf450982f8aecc6e91236211c17d5f3f22
CRs-Fixed: 2004658
Pamidipati, Vijay 8 năm trước cách đây
mục cha
commit
c9a13a52c8
5 tập tin đã thay đổi với 45 bổ sung13 xóa
  1. 2 0
      dp/inc/cdp_txrx_cmn_struct.h
  2. 9 0
      dp/wifi3.0/dp_main.c
  3. 27 13
      dp/wifi3.0/dp_tx.c
  4. 1 0
      dp/wifi3.0/dp_tx.h
  5. 6 0
      dp/wifi3.0/dp_types.h

+ 2 - 0
dp/inc/cdp_txrx_cmn_struct.h

@@ -444,6 +444,8 @@ struct cdp_soc_t {
 enum cdp_vdev_param_type {
 	CDP_ENABLE_NAWDS,
 	CDP_ENABLE_MCAST_EN,
+	CDP_ENABLE_WDS,
+	CDP_ENABLE_PROXYSTA,
 };
 
 #define TXRX_FW_STATS_TXSTATS                     1

+ 9 - 0
dp/wifi3.0/dp_main.c

@@ -3082,13 +3082,22 @@ static void dp_set_vdev_param(struct cdp_vdev *vdev_handle,
 	struct dp_vdev *vdev = (struct dp_vdev *)vdev_handle;
 
 	switch (param) {
+	case CDP_ENABLE_WDS:
+		vdev->wds_enabled = val;
+		break;
 	case CDP_ENABLE_NAWDS:
 		vdev->nawds_enabled = val;
 	case CDP_ENABLE_MCAST_EN:
 		vdev->mcast_enhancement_en = val;
+		break;
+	case CDP_ENABLE_PROXYSTA:
+		vdev->proxysta_vdev = val;
+		break;
 	default:
 		break;
 	}
+
+	dp_tx_vdev_update_search_flags(vdev);
 }
 
 /**

+ 27 - 13
dp/wifi3.0/dp_tx.c

@@ -678,18 +678,8 @@ static QDF_STATUS dp_tx_hw_enqueue(struct dp_soc *soc, struct dp_vdev *vdev,
 	if (tx_desc->flags & DP_TX_DESC_FLAG_TO_FW)
 		hal_tx_desc_set_to_fw(hal_tx_desc_cached, 1);
 
-	/*
-	 * TODO
-	 * For AP mode, enable AddrX flag only
-	 * For all other modes, enable both AddrX and AddrY
-	 * flags for now
-	 */
-	if (vdev->opmode == wlan_op_mode_ap)
-		hal_tx_desc_set_addr_search_flags(hal_tx_desc_cached,
-			HAL_TX_DESC_ADDRX_EN);
-	else
-		hal_tx_desc_set_addr_search_flags(hal_tx_desc_cached,
-			HAL_TX_DESC_ADDRX_EN | HAL_TX_DESC_ADDRY_EN);
+	hal_tx_desc_set_addr_search_flags(hal_tx_desc_cached,
+			vdev->hal_desc_addr_search_flags);
 
 	if ((qdf_nbuf_get_tx_cksum(tx_desc->nbuf) == QDF_NBUF_TX_CKSUM_TCP_UDP)
 		|| qdf_nbuf_is_tso(tx_desc->nbuf))  {
@@ -1973,7 +1963,6 @@ uint32_t dp_tx_comp_handler(struct dp_soc *soc, uint32_t ring_id,
  */
 QDF_STATUS dp_tx_vdev_attach(struct dp_vdev *vdev)
 {
-
 	/*
 	 * Fill HTT TCL Metadata with Vdev ID and MAC ID
 	 */
@@ -1991,9 +1980,34 @@ QDF_STATUS dp_tx_vdev_attach(struct dp_vdev *vdev)
 	 */
 	HTT_TX_TCL_METADATA_VALID_HTT_SET(vdev->htt_tcl_metadata, 0);
 
+	dp_tx_vdev_update_search_flags(vdev);
+
 	return QDF_STATUS_SUCCESS;
 }
 
+/**
+ * dp_tx_vdev_update_search_flags() - Update vdev flags as per opmode
+ * @vdev: virtual device instance
+ *
+ * Return: void
+ *
+ */
+void dp_tx_vdev_update_search_flags(struct dp_vdev *vdev)
+{
+	/*
+	 * Enable AddrY (SA based search) only for non-WDS STA and
+	 * ProxySTA VAP modes.
+	 *
+	 * In all other VAP modes, only DA based search should be
+	 * enabled
+	 */
+	if ((vdev->opmode == wlan_op_mode_sta &&
+				(!vdev->wds_enabled || vdev->proxysta_vdev)))
+		vdev->hal_desc_addr_search_flags = HAL_TX_DESC_ADDRY_EN;
+	else
+		vdev->hal_desc_addr_search_flags = HAL_TX_DESC_ADDRX_EN;
+}
+
 /**
  * dp_tx_vdev_detach() - detach vdev from dp tx
  * @vdev: virtual device instance

+ 1 - 0
dp/wifi3.0/dp_tx.h

@@ -143,6 +143,7 @@ struct dp_tx_msdu_info_s {
 
 QDF_STATUS dp_tx_vdev_attach(struct dp_vdev *vdev);
 QDF_STATUS dp_tx_vdev_detach(struct dp_vdev *vdev);
+void dp_tx_vdev_update_search_flags(struct dp_vdev *vdev);
 
 QDF_STATUS dp_tx_soc_attach(struct dp_soc *soc);
 QDF_STATUS dp_tx_soc_detach(struct dp_soc *soc);

+ 6 - 0
dp/wifi3.0/dp_types.h

@@ -928,6 +928,12 @@ struct dp_vdev {
 	/* VDEV Stats */
 	struct cdp_vdev_stats stats;
 	bool lro_enable;
+
+	/* Is this a proxySTA VAP */
+	bool proxysta_vdev;
+
+	/* Address search flags to be configured in HAL descriptor */
+	uint8_t hal_desc_addr_search_flags;
 };