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:

committed by
Madan Koyyalamudi

parent
779e407465
commit
50819e81b2
@@ -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
|
||||
|
@@ -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;
|
||||
|
@@ -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
|
||||
};
|
||||
|
||||
/**
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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,
|
||||
|
@@ -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;
|
||||
|
@@ -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
|
||||
|
@@ -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,
|
||||
|
Reference in New Issue
Block a user