diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index 860a230653..3d02e1f39c 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/dp/inc/cdp_txrx_ops.h @@ -1493,6 +1493,16 @@ struct ol_if_ops { void (*peer_send_wds_disconnect)(struct cdp_ctrl_objmgr_psoc *psoc, uint8_t *mac_addr, uint8_t vdev_id); #endif +#ifdef WLAN_SUPPORT_PPEDS + QDF_STATUS + (*peer_set_ppe_default_routing)(struct cdp_ctrl_objmgr_psoc *psoc, + uint8_t *peer_macaddr, + uint16_t service_code, + uint8_t priority_valid, + uint16_t src_info, + uint8_t vdev_id, uint8_t use_ppe, + uint8_t routing_enabled); +#endif /* WLAN_SUPPORT_PPEDS */ }; #ifdef DP_PEER_EXTENDED_API diff --git a/dp/wifi3.0/be/dp_be.c b/dp/wifi3.0/be/dp_be.c index 9278eeeeff..57eef324d3 100644 --- a/dp/wifi3.0/be/dp_be.c +++ b/dp/wifi3.0/be/dp_be.c @@ -32,6 +32,7 @@ #include #ifdef WLAN_SUPPORT_PPEDS #include "be/dp_ppeds.h" +#include #endif /* Generic AST entry aging timer value */ @@ -502,6 +503,44 @@ static QDF_STATUS dp_soc_ppe_detach_be(struct dp_soc *soc) return QDF_STATUS_SUCCESS; } + +static QDF_STATUS dp_peer_setup_ppe_be(struct dp_soc *soc, + struct dp_peer_be *be_peer, + struct dp_vdev_be *be_vdev) +{ + uint16_t service_code; + uint8_t priority_valid; + struct dp_ppe_vp_profile *ppe_vp_profile = &be_vdev->ppe_vp_profile; + uint16_t src_info = ppe_vp_profile->vp_num; + uint8_t vdev_id = be_vdev->vdev.vdev_id; + uint8_t use_ppe = PEER_ROUTING_USE_PPE; + uint8_t peer_routing_enabled = PEER_ROUTING_ENABLED; + QDF_STATUS status = QDF_STATUS_SUCCESS; + + /* + * Get these Values from INIT + */ + service_code = 0; + priority_valid = be_peer->priority_valid; + + if (soc->cdp_soc.ol_ops->peer_set_ppe_default_routing) { + status = + soc->cdp_soc.ol_ops->peer_set_ppe_default_routing + (soc->ctrl_psoc, + be_peer->peer.mac_addr.raw, + service_code, priority_valid, + src_info, vdev_id, use_ppe, + peer_routing_enabled); + if (status != QDF_STATUS_SUCCESS) { + qdf_err("vdev_id: %d, PPE peer routing mac:" + QDF_MAC_ADDR_FMT, vdev_id, + QDF_MAC_ADDR_REF(be_peer->peer.mac_addr.raw)); + return QDF_STATUS_E_FAILURE; + } + } + + return QDF_STATUS_SUCCESS; +} #else static QDF_STATUS dp_ppeds_init_soc_be(struct dp_soc *soc) { @@ -522,6 +561,14 @@ static inline QDF_STATUS dp_soc_ppe_detach_be(struct dp_soc *soc) { return QDF_STATUS_SUCCESS; } + +static inline +QDF_STATUS dp_peer_setup_ppe_be(struct dp_soc *soc, + struct dp_peer_be *be_peer, + struct dp_vdev_be *be_vdev) +{ + return QDF_STATUS_SUCCESS; +} #endif /* WLAN_SUPPORT_PPEDS */ static QDF_STATUS dp_soc_detach_be(struct dp_soc *soc) @@ -826,6 +873,39 @@ static QDF_STATUS dp_vdev_detach_be(struct dp_soc *soc, struct dp_vdev *vdev) return QDF_STATUS_SUCCESS; } +#ifdef WLAN_SUPPORT_PPEDS +static QDF_STATUS dp_peer_setup_be(struct dp_soc *soc, struct dp_peer *peer) +{ + struct dp_peer_be *be_peer = dp_get_be_peer_from_dp_peer(peer); + struct dp_vdev_be *be_vdev; + QDF_STATUS qdf_status = QDF_STATUS_SUCCESS; + + if (!be_peer) { + qdf_err("BE peer is null"); + return QDF_STATUS_E_NULL_VALUE; + } + + be_vdev = dp_get_be_vdev_from_dp_vdev(peer->vdev); + if (!be_vdev) { + qdf_err("BE vap is null"); + return QDF_STATUS_E_NULL_VALUE; + } + + /* + * Check if PPE routing is enabled on the associated vap. + */ + if (be_vdev->ppe_vp_enabled == PPE_VP_USER_TYPE_DS) + qdf_status = dp_peer_setup_ppe_be(soc, be_peer, be_vdev); + + return qdf_status; +} +#else +static QDF_STATUS dp_peer_setup_be(struct dp_soc *soc, struct dp_peer *peer) +{ + return QDF_STATUS_SUCCESS; +} +#endif + qdf_size_t dp_get_soc_context_size_be(void) { return sizeof(struct dp_soc_be); @@ -2127,6 +2207,7 @@ void dp_initialize_arch_ops_be(struct dp_arch_ops *arch_ops) arch_ops->txrx_pdev_detach = dp_pdev_detach_be; arch_ops->txrx_vdev_attach = dp_vdev_attach_be; arch_ops->txrx_vdev_detach = dp_vdev_detach_be; + arch_ops->txrx_peer_setup = dp_peer_setup_be; arch_ops->txrx_peer_map_attach = dp_peer_map_attach_be; arch_ops->txrx_peer_map_detach = dp_peer_map_detach_be; arch_ops->dp_rxdma_ring_sel_cfg = dp_rxdma_ring_sel_cfg_be; diff --git a/dp/wifi3.0/be/dp_be.h b/dp/wifi3.0/be/dp_be.h index 97946ca908..6045fe7541 100644 --- a/dp/wifi3.0/be/dp_be.h +++ b/dp/wifi3.0/be/dp_be.h @@ -110,6 +110,9 @@ enum CMEM_MEM_CLIENTS { /* Offset of ppeds tx descripotor pool */ #define DP_TX_PPEDS_DESC_CMEM_OFFSET 0 + +#define PEER_ROUTING_USE_PPE 1 +#define PEER_ROUTING_ENABLED 1 #else #define DP_TX_PPEDS_DESC_CMEM_OFFSET 0 #define DP_TX_PPEDS_DESC_POOL_CMEM_SIZE 0 @@ -376,6 +379,9 @@ struct dp_vdev_be { */ struct dp_peer_be { struct dp_peer peer; +#ifdef WLAN_SUPPORT_PPEDS + uint8_t priority_valid; +#endif }; /** diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 550a0f4c7a..5af4948fbf 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -6672,12 +6672,32 @@ QDF_STATUS dp_soc_target_ppe_rxole_rxdma_cfg(struct dp_soc *soc) return status; } + +static inline +void dp_soc_txrx_peer_setup(enum wlan_op_mode vdev_opmode, struct dp_soc *soc, + struct dp_peer *peer) +{ + /* TODO: Need to check with STA mode */ + if (vdev_opmode == wlan_op_mode_ap && soc->arch_ops.txrx_peer_setup) { + if (soc->arch_ops.txrx_peer_setup(soc, peer) + != QDF_STATUS_SUCCESS) { + dp_err("unable to setup target peer features"); + qdf_assert_always(0); + } + } +} #else static inline QDF_STATUS dp_soc_target_ppe_rxole_rxdma_cfg(struct dp_soc *soc) { return QDF_STATUS_SUCCESS; } + +static inline +void dp_soc_txrx_peer_setup(enum wlan_op_mode vdev_opmode, struct dp_soc *soc, + struct dp_peer *peer) +{ +} #endif /* WLAN_SUPPORT_PPEDS */ #ifdef DP_UMAC_HW_RESET_SUPPORT @@ -8363,6 +8383,8 @@ dp_peer_setup_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, } } + dp_soc_txrx_peer_setup(vdev_opmode, soc, peer); + if (!IS_MLO_DP_MLD_PEER(peer)) dp_peer_ppdu_delayed_ba_init(peer); diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index fbd804afef..0faf073db8 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -1857,6 +1857,8 @@ struct dp_arch_ops { void (*txrx_peer_map_detach)(struct dp_soc *soc); QDF_STATUS (*dp_rxdma_ring_sel_cfg)(struct dp_soc *soc); void (*soc_cfg_attach)(struct dp_soc *soc); + QDF_STATUS (*txrx_peer_setup)(struct dp_soc *soc, + struct dp_peer *peer); void (*peer_get_reo_hash)(struct dp_vdev *vdev, struct cdp_peer_setup_info *setup_info, enum cdp_host_reo_dest_ring *reo_dest, diff --git a/dp/wifi3.0/li/dp_li.c b/dp/wifi3.0/li/dp_li.c index b539fdbae9..91418ffc75 100644 --- a/dp/wifi3.0/li/dp_li.c +++ b/dp/wifi3.0/li/dp_li.c @@ -194,6 +194,11 @@ static QDF_STATUS dp_peer_map_attach_li(struct dp_soc *soc) } #endif +static QDF_STATUS dp_peer_setup_li(struct dp_soc *soc, struct dp_peer *peer) +{ + return QDF_STATUS_SUCCESS; +} + qdf_size_t dp_get_soc_context_size_li(void) { return sizeof(struct dp_soc); @@ -619,6 +624,7 @@ void dp_initialize_arch_ops_li(struct dp_arch_ops *arch_ops) arch_ops->txrx_peer_map_attach = dp_peer_map_attach_li; arch_ops->txrx_peer_map_detach = dp_peer_map_detach_li; arch_ops->get_rx_hash_key = dp_get_rx_hash_key_li; + arch_ops->txrx_peer_setup = dp_peer_setup_li; arch_ops->dp_rx_desc_cookie_2_va = dp_rx_desc_cookie_2_va_li; arch_ops->dp_rx_intrabss_handle_nawds = dp_rx_intrabss_handle_nawds_li; diff --git a/target_if/dp/inc/target_if_dp.h b/target_if/dp/inc/target_if_dp.h index bd7328eed3..cc996044c5 100644 --- a/target_if/dp/inc/target_if_dp.h +++ b/target_if/dp/inc/target_if_dp.h @@ -137,6 +137,32 @@ QDF_STATUS target_if_lro_hash_config(struct cdp_ctrl_objmgr_psoc *psoc, uint8_t pdev_id, struct cdp_lro_hash_config *lro_hash_cfg); +#ifdef WLAN_SUPPORT_PPEDS +/** + * target_if_peer_set_ppe_default_routing() - Set PPE routing API + * @psoc: psoc handle pointer + * @peer_macaddr: Peer MAC address + * @service_code: Service code + * @priority_valid: Priority valid field + * @src_info: Source information + * @vdev_id: VDEV ID + * @use_ppe: use ppe field value + * @ppe_routing_enabled: PPE routing enabled + * + * This API is used for setting PPE default routing configuration + * + * return: QDF_STATUS_SUCCESS for success or error code + */ +QDF_STATUS +target_if_peer_set_ppe_default_routing(struct cdp_ctrl_objmgr_psoc *psoc, + uint8_t *peer_macaddr, + uint16_t service_code, + uint8_t priority_valid, + uint16_t src_info, + uint8_t vdev_id, uint8_t use_ppe, + uint8_t ppe_routing_enabled); +#endif + #ifdef WDS_CONV_TARGET_IF_OPS_ENABLE /** * target_if_add_wds_entry() - send wds peer add command to fw diff --git a/target_if/dp/src/target_if_dp.c b/target_if/dp/src/target_if_dp.c index efc6b2ea9b..5a47f2db1b 100644 --- a/target_if/dp/src/target_if_dp.c +++ b/target_if/dp/src/target_if_dp.c @@ -318,6 +318,53 @@ target_if_lro_hash_config(struct cdp_ctrl_objmgr_psoc *psoc, uint8_t pdev_id, return status; } +#ifdef WLAN_SUPPORT_PPEDS +QDF_STATUS +target_if_peer_set_ppe_default_routing(struct cdp_ctrl_objmgr_psoc *psoc, + uint8_t *peer_macaddr, + uint16_t service_code, + uint8_t priority_valid, + uint16_t src_info, + uint8_t vdev_id, uint8_t use_ppe, + uint8_t ppe_routing_enabled) +{ + struct wmi_unified *wmi_handle; + struct peer_ppe_ds_param param; + QDF_STATUS qdf_status = QDF_STATUS_SUCCESS; + + if (!psoc) { + target_if_err("PSOC is NULL!"); + return QDF_STATUS_E_NULL_VALUE; + } + + wmi_handle = + get_wmi_unified_hdl_from_psoc((struct wlan_objmgr_psoc *)psoc); + if (!wmi_handle) { + target_if_err("wmi_handle is null"); + return QDF_STATUS_E_INVAL; + } + + qdf_mem_zero(¶m, sizeof(param)); + + qdf_mem_copy(¶m.peer_macaddr[0], peer_macaddr, QDF_MAC_ADDR_SIZE); + param.ppe_routing_enabled = ppe_routing_enabled; + param.service_code = service_code; + param.priority_valid = priority_valid; + param.src_info = src_info; + param.vdev_id = vdev_id; + param.use_ppe = use_ppe; + + qdf_status = wmi_unified_peer_ppe_ds_param_send(wmi_handle, ¶m); + if (qdf_status != QDF_STATUS_SUCCESS) { + target_if_err("Unable to set PPE default routing for peer " + QDF_MAC_ADDR_FMT, + QDF_MAC_ADDR_REF(peer_macaddr)); + } + + return qdf_status; +} +#endif /* WLAN_SUPPORT_PPEDS */ + #ifdef WDS_CONV_TARGET_IF_OPS_ENABLE QDF_STATUS target_if_add_wds_entry(struct cdp_ctrl_objmgr_psoc *soc, uint8_t vdev_id,