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,
|
void (*peer_send_wds_disconnect)(struct cdp_ctrl_objmgr_psoc *psoc,
|
||||||
uint8_t *mac_addr, uint8_t vdev_id);
|
uint8_t *mac_addr, uint8_t vdev_id);
|
||||||
#endif
|
#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
|
#ifdef DP_PEER_EXTENDED_API
|
||||||
|
@@ -32,6 +32,7 @@
|
|||||||
#include <hal_be_api.h>
|
#include <hal_be_api.h>
|
||||||
#ifdef WLAN_SUPPORT_PPEDS
|
#ifdef WLAN_SUPPORT_PPEDS
|
||||||
#include "be/dp_ppeds.h"
|
#include "be/dp_ppeds.h"
|
||||||
|
#include <ppe_vp_public.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Generic AST entry aging timer value */
|
/* 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;
|
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
|
#else
|
||||||
static QDF_STATUS dp_ppeds_init_soc_be(struct dp_soc *soc)
|
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;
|
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 */
|
#endif /* WLAN_SUPPORT_PPEDS */
|
||||||
|
|
||||||
static QDF_STATUS dp_soc_detach_be(struct dp_soc *soc)
|
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;
|
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)
|
qdf_size_t dp_get_soc_context_size_be(void)
|
||||||
{
|
{
|
||||||
return sizeof(struct dp_soc_be);
|
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_pdev_detach = dp_pdev_detach_be;
|
||||||
arch_ops->txrx_vdev_attach = dp_vdev_attach_be;
|
arch_ops->txrx_vdev_attach = dp_vdev_attach_be;
|
||||||
arch_ops->txrx_vdev_detach = dp_vdev_detach_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_attach = dp_peer_map_attach_be;
|
||||||
arch_ops->txrx_peer_map_detach = dp_peer_map_detach_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;
|
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 */
|
/* Offset of ppeds tx descripotor pool */
|
||||||
#define DP_TX_PPEDS_DESC_CMEM_OFFSET 0
|
#define DP_TX_PPEDS_DESC_CMEM_OFFSET 0
|
||||||
|
|
||||||
|
#define PEER_ROUTING_USE_PPE 1
|
||||||
|
#define PEER_ROUTING_ENABLED 1
|
||||||
#else
|
#else
|
||||||
#define DP_TX_PPEDS_DESC_CMEM_OFFSET 0
|
#define DP_TX_PPEDS_DESC_CMEM_OFFSET 0
|
||||||
#define DP_TX_PPEDS_DESC_POOL_CMEM_SIZE 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_be {
|
||||||
struct dp_peer peer;
|
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;
|
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
|
#else
|
||||||
static inline
|
static inline
|
||||||
QDF_STATUS dp_soc_target_ppe_rxole_rxdma_cfg(struct dp_soc *soc)
|
QDF_STATUS dp_soc_target_ppe_rxole_rxdma_cfg(struct dp_soc *soc)
|
||||||
{
|
{
|
||||||
return QDF_STATUS_SUCCESS;
|
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 */
|
#endif /* WLAN_SUPPORT_PPEDS */
|
||||||
|
|
||||||
#ifdef DP_UMAC_HW_RESET_SUPPORT
|
#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))
|
if (!IS_MLO_DP_MLD_PEER(peer))
|
||||||
dp_peer_ppdu_delayed_ba_init(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);
|
void (*txrx_peer_map_detach)(struct dp_soc *soc);
|
||||||
QDF_STATUS (*dp_rxdma_ring_sel_cfg)(struct dp_soc *soc);
|
QDF_STATUS (*dp_rxdma_ring_sel_cfg)(struct dp_soc *soc);
|
||||||
void (*soc_cfg_attach)(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,
|
void (*peer_get_reo_hash)(struct dp_vdev *vdev,
|
||||||
struct cdp_peer_setup_info *setup_info,
|
struct cdp_peer_setup_info *setup_info,
|
||||||
enum cdp_host_reo_dest_ring *reo_dest,
|
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
|
#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)
|
qdf_size_t dp_get_soc_context_size_li(void)
|
||||||
{
|
{
|
||||||
return sizeof(struct dp_soc);
|
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_attach = dp_peer_map_attach_li;
|
||||||
arch_ops->txrx_peer_map_detach = dp_peer_map_detach_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->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 =
|
arch_ops->dp_rx_desc_cookie_2_va =
|
||||||
dp_rx_desc_cookie_2_va_li;
|
dp_rx_desc_cookie_2_va_li;
|
||||||
arch_ops->dp_rx_intrabss_handle_nawds = dp_rx_intrabss_handle_nawds_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,
|
target_if_lro_hash_config(struct cdp_ctrl_objmgr_psoc *psoc, uint8_t pdev_id,
|
||||||
struct cdp_lro_hash_config *lro_hash_cfg);
|
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
|
#ifdef WDS_CONV_TARGET_IF_OPS_ENABLE
|
||||||
/**
|
/**
|
||||||
* target_if_add_wds_entry() - send wds peer add command to fw
|
* 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;
|
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
|
#ifdef WDS_CONV_TARGET_IF_OPS_ENABLE
|
||||||
QDF_STATUS
|
QDF_STATUS
|
||||||
target_if_add_wds_entry(struct cdp_ctrl_objmgr_psoc *soc, uint8_t vdev_id,
|
target_if_add_wds_entry(struct cdp_ctrl_objmgr_psoc *soc, uint8_t vdev_id,
|
||||||
|
Reference in New Issue
Block a user