qcacmn: Add per peer PPE routing support

Add the per peer routing support for PPE-DS feature

Change-Id: I71666fc2f29b9497fd4ec9f5d50af1cb05d91fe2
CRs-Fixed: 3306766
This commit is contained in:
Manish Verma
2022-05-26 11:00:38 +05:30
committed by Madan Koyyalamudi
parent 779e407465
commit 50819e81b2
8 changed files with 200 additions and 0 deletions

View File

@@ -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

View File

@@ -32,6 +32,7 @@
#include <hal_be_api.h>
#ifdef WLAN_SUPPORT_PPEDS
#include "be/dp_ppeds.h"
#include <ppe_vp_public.h>
#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;

View File

@@ -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
};
/**

View File

@@ -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);

View File

@@ -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,

View File

@@ -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;

View File

@@ -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

View File

@@ -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(&param, sizeof(param));
qdf_mem_copy(&param.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, &param);
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,