diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index c3daf0287c83..f32438342823 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/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 diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 0c23692674c7..6a279e8b0ffe 100644 --- a/dp/wifi3.0/dp_main.c +++ b/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); } /** diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index aaf07377860f..f7af96520beb 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/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 diff --git a/dp/wifi3.0/dp_tx.h b/dp/wifi3.0/dp_tx.h index bd4da0f4b861..f55e565521d9 100644 --- a/dp/wifi3.0/dp_tx.h +++ b/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); diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 9d695c80ac4d..67e821e873c5 100644 --- a/dp/wifi3.0/dp_types.h +++ b/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; };