diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index 167c1408c5..fa30ee525c 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/dp/inc/cdp_txrx_ops.h @@ -521,7 +521,7 @@ struct cdp_wds_ops { void (*txrx_set_wds_rx_policy)(struct cdp_vdev *vdev, u_int32_t val); - + int (*vdev_set_wds)(void *vdev, uint32_t val); }; struct cdp_raw_ops { diff --git a/dp/inc/cdp_txrx_wds.h b/dp/inc/cdp_txrx_wds.h index cd0acbb0de..8b0ed80a5f 100644 --- a/dp/inc/cdp_txrx_wds.h +++ b/dp/inc/cdp_txrx_wds.h @@ -58,4 +58,21 @@ cdp_set_wds_rx_policy(ol_txrx_soc_handle soc, return; } +/** + * cdp_vdev_set_wds() - Set/unset wds_enable flag in vdev + * @soc - data path soc handle + * @vdev - data path vap handle + * @val - value to be set in wds_en flag + * + * This flag enables WDS source port learning feature on a vdev + * + * return 1 on success + */ +static inline int +cdp_vdev_set_wds(ol_txrx_soc_handle soc, void *vdev, uint32_t val) +{ + if (soc->ops->wds_ops->vdev_set_wds) + return soc->ops->wds_ops->vdev_set_wds(vdev, val); + return 0; +} #endif diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index eb239db4ab..0c23692674 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -2116,10 +2116,24 @@ static void dp_peer_delete_wifi3(void *peer_handle) static uint8 *dp_get_vdev_mac_addr_wifi3(struct cdp_vdev *pvdev) { struct dp_vdev *vdev = (struct dp_vdev *)pvdev; - return vdev->mac_addr.raw; } +/* + * dp_vdev_set_wds() - Enable per packet stats + * @vdev_handle: DP VDEV handle + * @val: value + * + * Return: none + */ +static int dp_vdev_set_wds(void *vdev_handle, uint32_t val) +{ + struct dp_vdev *vdev = (struct dp_vdev *)vdev_handle; + + vdev->wds_enabled = val; + return 0; +} + /* * dp_get_vdev_from_vdev_id_wifi3() – Detach txrx peer * @peer_handle: Datapath peer handle @@ -3332,6 +3346,10 @@ static QDF_STATUS dp_txrx_dump_stats(void *psoc, uint16_t value) } +static struct cdp_wds_ops dp_ops_wds = { + .vdev_set_wds = dp_vdev_set_wds, +}; + static struct cdp_cmn_ops dp_ops_cmn = { .txrx_soc_attach_target = dp_soc_attach_target_wifi3, .txrx_vdev_attach = dp_vdev_attach_wifi3, @@ -3400,10 +3418,6 @@ static struct cdp_host_stats_ops dp_ops_host_stats = { /* TODO */ }; -static struct cdp_wds_ops dp_ops_wds = { - /* TODO */ -}; - static struct cdp_raw_ops dp_ops_raw = { /* TODO */ }; diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 95cd11841a..6f338d467b 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -964,10 +964,11 @@ done: #endif /* NAPIER_EMULATION */ /* WDS Source Port Learning */ - if (qdf_likely(vdev->rx_decap_type == - htt_cmn_pkt_type_ethernet)) + if (qdf_likely((vdev->wds_enabled) && + (vdev->rx_decap_type == + htt_cmn_pkt_type_ethernet))) dp_rx_wds_srcport_learn(soc, rx_tlv_hdr, peer, - nbuf); + nbuf); /* Intrabss-fwd */ if (vdev->opmode != wlan_op_mode_sta) diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c index e25283c09d..30dd9e82ce 100644 --- a/dp/wifi3.0/dp_rx_err.c +++ b/dp/wifi3.0/dp_rx_err.c @@ -298,7 +298,8 @@ dp_rx_null_q_desc_handle(struct dp_soc *soc, struct dp_rx_desc *rx_desc, __func__, __LINE__, sgi, rate_mcs, tid); /* WDS Source Port Learning */ - if (qdf_likely(vdev->rx_decap_type == htt_cmn_pkt_type_ethernet)) + if (qdf_likely(vdev->rx_decap_type == htt_cmn_pkt_type_ethernet) && + (vdev->wds_enabled)) dp_rx_wds_srcport_learn(soc, rx_desc->rx_buf_start, peer, nbuf); /* @@ -310,9 +311,6 @@ dp_rx_null_q_desc_handle(struct dp_soc *soc, struct dp_rx_desc *rx_desc, if (l2_hdr_offset) qdf_nbuf_pull_head(nbuf, l2_hdr_offset); - /* WDS Source Port Learning */ - dp_rx_wds_srcport_learn(soc, rx_desc->rx_buf_start, peer, nbuf); - if (hal_rx_mpdu_start_mpdu_qos_control_valid_get( rx_desc->rx_buf_start)) { /* TODO: Assuming that qos_control_valid also indicates diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 6548a26b2e..9d695c80ac 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -896,6 +896,9 @@ struct dp_vdev { /* BSS peer */ struct dp_peer *vap_bss_peer; + /* WDS enabled */ + bool wds_enabled; + /* NAWDS enabled */ bool nawds_enabled;