qcacmn: Add txrx_peer in dp peer

Add txrx_peer in dp peer which will be used in
per packet data path.

Change-Id: I91f10b1640430300f4c9f002ca54b3903c556d41
This commit is contained in:
Pavankumar Nandeshwar
2021-10-28 02:55:59 -07:00
committed by Madan Koyyalamudi
parent 951e13a2ea
commit d7908ff22a
5 changed files with 209 additions and 52 deletions

View File

@@ -1,6 +1,6 @@
/*
* Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2021,2022 Qualcomm Innovation Center, Inc. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@@ -1299,6 +1299,9 @@ void dp_peer_vdev_list_remove(struct dp_soc *soc, struct dp_vdev *vdev,
void dp_peer_find_id_to_obj_add(struct dp_soc *soc,
struct dp_peer *peer,
uint16_t peer_id);
void dp_txrx_peer_attach_add(struct dp_soc *soc,
struct dp_peer *peer,
struct dp_txrx_peer *txrx_peer);
void dp_peer_find_id_to_obj_remove(struct dp_soc *soc,
uint16_t peer_id);
void dp_vdev_unref_delete(struct dp_soc *soc, struct dp_vdev *vdev,

View File

@@ -6778,6 +6778,38 @@ void dp_peer_hw_txrx_stats_init(struct dp_soc *soc, struct dp_peer *peer)
peer->hw_txrx_stats_en = 0;
}
#endif
static QDF_STATUS dp_txrx_peer_detach(struct dp_soc *soc, struct dp_peer *peer)
{
struct dp_txrx_peer *txrx_peer;
txrx_peer = peer->txrx_peer;
peer->txrx_peer = NULL;
qdf_mem_free(txrx_peer);
return QDF_STATUS_SUCCESS;
}
static QDF_STATUS dp_txrx_peer_attach(struct dp_soc *soc, struct dp_peer *peer)
{
struct dp_txrx_peer *txrx_peer;
txrx_peer = (struct dp_txrx_peer *)qdf_mem_malloc(sizeof(*txrx_peer));
if (!txrx_peer)
return QDF_STATUS_E_NOMEM; /* failure */
txrx_peer->peer_id = HTT_INVALID_PEER;
/* initialize the peer_id */
txrx_peer->vdev = peer->vdev;
dp_wds_ext_peer_init(peer);
dp_txrx_peer_attach_add(soc, peer, txrx_peer);
return QDF_STATUS_SUCCESS;
}
/*
* dp_peer_create_wifi3() - attach txrx peer
* @soc_hdl: Datapath soc handle
@@ -6890,11 +6922,27 @@ dp_peer_create_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
qdf_mem_zero(peer, sizeof(struct dp_peer));
TAILQ_INIT(&peer->ast_entry_list);
/* store provided params */
peer->vdev = vdev;
/* initialize the peer_id */
peer->peer_id = HTT_INVALID_PEER;
qdf_mem_copy(
&peer->mac_addr.raw[0], peer_mac_addr, QDF_MAC_ADDR_SIZE);
DP_PEER_SET_TYPE(peer, peer_type);
if (IS_MLO_DP_MLD_PEER(peer)) {
dp_mld_peer_init_link_peers_info(peer);
if (dp_txrx_peer_attach(soc, peer) !=
QDF_STATUS_SUCCESS)
goto fail; /* failure */
} else if (dp_monitor_peer_attach(soc, peer) !=
QDF_STATUS_SUCCESS)
dp_warn("peer monitor ctx alloc failed");
TAILQ_INIT(&peer->ast_entry_list);
/* get the vdev reference for new peer */
dp_vdev_get_ref(soc, vdev, DP_MOD_ID_CHILD);
@@ -6910,12 +6958,6 @@ dp_peer_create_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
dp_peer_hw_txrx_stats_init(soc, peer);
dp_peer_rx_bufq_resources_init(peer);
qdf_mem_copy(
&peer->mac_addr.raw[0], peer_mac_addr, QDF_MAC_ADDR_SIZE);
/* initialize the peer_id */
peer->peer_id = HTT_INVALID_PEER;
/* reset the ast index to flowid table */
dp_peer_reset_flowq_map(peer);
@@ -6956,8 +6998,6 @@ dp_peer_create_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
}
dp_peer_rx_tids_create(peer);
if (IS_MLO_DP_MLD_PEER(peer))
dp_mld_peer_init_link_peers_info(peer);
peer->valid = 1;
dp_local_peer_id_alloc(pdev, peer);
@@ -6993,16 +7033,28 @@ dp_peer_create_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
QDF_STATUS_SUCCESS)
dp_warn("peer ext_stats ctx alloc failed");
if (dp_monitor_peer_attach(soc, peer) !=
QDF_STATUS_SUCCESS)
dp_warn("peer monitor ctx alloc failed");
dp_set_peer_isolation(peer, false);
dp_peer_update_state(soc, peer, DP_PEER_STATE_INIT);
dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
return QDF_STATUS_SUCCESS;
fail:
qdf_mem_free(peer);
dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
return QDF_STATUS_E_FAILURE;
}
static QDF_STATUS dp_peer_legacy_setup(struct dp_soc *soc, struct dp_peer *peer)
{
if (dp_txrx_peer_attach(soc, peer) !=
QDF_STATUS_SUCCESS) {
dp_err("peer txrx ctx alloc failed");
return QDF_STATUS_E_FAILURE;
}
return QDF_STATUS_SUCCESS;
}
@@ -7302,6 +7354,12 @@ dp_peer_setup_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
* not setup reo_queues and default route for bss_peer.
*/
dp_monitor_peer_tx_init(pdev, peer);
if (!setup_info)
if (dp_peer_legacy_setup(soc, peer) !=
QDF_STATUS_SUCCESS)
goto fail;
if (peer->bss_peer && vdev->opmode == wlan_op_mode_ap) {
status = QDF_STATUS_E_FAILURE;
goto fail;
@@ -7933,6 +7991,11 @@ void dp_peer_unref_delete(struct dp_peer *peer, enum dp_mod_id mod_id)
dp_monitor_peer_detach(soc, peer);
qdf_spinlock_destroy(&peer->peer_state_lock);
/* dp_txrx_peer exists for mld peer and legacy peer */
if (peer->txrx_peer)
dp_txrx_peer_detach(soc, peer);
qdf_mem_free(peer);
/*
@@ -7944,6 +8007,18 @@ void dp_peer_unref_delete(struct dp_peer *peer, enum dp_mod_id mod_id)
qdf_export_symbol(dp_peer_unref_delete);
/*
* dp_txrx_peer_unref_delete() - unref and delete peer
* @handle: Datapath txrx ref handle
*
*/
void dp_txrx_peer_unref_delete(dp_txrx_ref_handle *handle)
{
dp_peer_unref_delete((struct dp_peer *)handle, DP_MOD_ID_TX_RX);
}
qdf_export_symbol(dp_txrx_peer_unref_delete);
#ifdef PEER_CACHE_RX_PKTS
static inline void dp_peer_rx_bufq_resources_deinit(struct dp_peer *peer)
{

View File

@@ -1,6 +1,6 @@
/*
* Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2021,2022 Qualcomm Innovation Center, Inc. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@@ -702,6 +702,34 @@ void dp_peer_vdev_list_remove(struct dp_soc *soc, struct dp_vdev *vdev,
qdf_spin_unlock_bh(&vdev->peer_list_lock);
}
/*
* dp_txrx_peer_attach_add() - Attach txrx_peer and add it to peer_id table
* @soc: SoC handle
* @peer: peer handle
* @txrx_peer: txrx peer handle
*
* Return: None
*/
void dp_txrx_peer_attach_add(struct dp_soc *soc,
struct dp_peer *peer,
struct dp_txrx_peer *txrx_peer)
{
qdf_spin_lock_bh(&soc->peer_map_lock);
peer->txrx_peer = txrx_peer;
if (peer->peer_id == HTT_INVALID_PEER) {
qdf_spin_unlock_bh(&soc->peer_map_lock);
return;
}
txrx_peer->peer_id = peer->peer_id;
QDF_ASSERT(soc->peer_id_to_obj_map[peer->peer_id]);
qdf_spin_unlock_bh(&soc->peer_map_lock);
}
/*
* dp_peer_find_id_to_obj_add() - Add peer into peer_id table
* @soc: SoC handle
@@ -718,6 +746,8 @@ void dp_peer_find_id_to_obj_add(struct dp_soc *soc,
qdf_spin_lock_bh(&soc->peer_map_lock);
peer->peer_id = peer_id;
if (QDF_IS_STATUS_ERROR(dp_peer_get_ref(soc, peer, DP_MOD_ID_CONFIG))) {
dp_err("unable to get peer ref at MAP mac: "QDF_MAC_ADDR_FMT" peer_id %u",
QDF_MAC_ADDR_REF(peer->mac_addr.raw), peer_id);
@@ -727,6 +757,8 @@ void dp_peer_find_id_to_obj_add(struct dp_soc *soc,
if (!soc->peer_id_to_obj_map[peer_id]) {
soc->peer_id_to_obj_map[peer_id] = peer;
if (peer->txrx_peer)
peer->txrx_peer->peer_id = peer_id;
} else {
/* Peer map event came for peer_id which
* is already mapped, this is not expected
@@ -752,6 +784,9 @@ void dp_peer_find_id_to_obj_remove(struct dp_soc *soc,
qdf_spin_lock_bh(&soc->peer_map_lock);
peer = soc->peer_id_to_obj_map[peer_id];
peer->peer_id = HTT_INVALID_PEER;
if (peer->txrx_peer)
peer->txrx_peer->peer_id = HTT_INVALID_PEER;
soc->peer_id_to_obj_map[peer_id] = NULL;
dp_peer_unref_delete(peer, DP_MOD_ID_CONFIG);
qdf_spin_unlock_bh(&soc->peer_map_lock);
@@ -2487,15 +2522,13 @@ static inline struct dp_peer *dp_peer_find_add_id(struct dp_soc *soc,
vdev_id);
return NULL;
}
QDF_ASSERT(peer->peer_id == HTT_INVALID_PEER);
dp_peer_find_id_to_obj_add(soc, peer, peer_id);
dp_mlo_partner_chips_map(soc, peer, peer_id);
if (peer->peer_id == HTT_INVALID_PEER) {
peer->peer_id = peer_id;
dp_monitor_peer_tid_peer_id_update(soc, peer,
peer->peer_id);
} else {
QDF_ASSERT(0);
}
dp_peer_update_state(soc, peer, DP_PEER_STATE_ACTIVE);
return peer;

View File

@@ -1,6 +1,6 @@
/*
* Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2021,2022 Qualcomm Innovation Center, Inc. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@@ -66,6 +66,7 @@ struct ast_del_ctxt {
typedef void dp_peer_iter_func(struct dp_soc *soc, struct dp_peer *peer,
void *arg);
void dp_peer_unref_delete(struct dp_peer *peer, enum dp_mod_id id);
void dp_txrx_peer_unref_delete(dp_txrx_ref_handle *handle);
struct dp_peer *dp_peer_find_hash_find(struct dp_soc *soc,
uint8_t *peer_mac_addr,
int mac_addr_is_aligned,
@@ -159,6 +160,31 @@ struct dp_peer *dp_peer_get_ref_by_id(struct dp_soc *soc,
return peer;
}
/**
* dp_txrx_peer_get_ref_by_id() - Returns txrx peer object given the peer id
*
* @soc : core DP soc context
* @peer_id : peer id from peer object can be retrieved
* @handle : reference handle
*
* Return: struct dp_txrx_peer*: Pointer to txrx DP peer object
*/
static inline struct dp_txrx_peer *
dp_txrx_peer_get_ref_by_id(struct dp_soc *soc,
uint16_t peer_id,
dp_txrx_ref_handle *handle)
{
struct dp_peer *peer;
peer = dp_peer_get_ref_by_id(soc, peer_id, DP_MOD_ID_TX_RX);
if (!peer)
return NULL;
*handle = (dp_txrx_ref_handle)peer;
return peer->txrx_peer;
}
#ifdef PEER_CACHE_RX_PKTS
/**
* dp_rx_flush_rx_cached() - flush cached rx frames
@@ -1041,6 +1067,10 @@ void dp_peer_delete(struct dp_soc *soc,
/* set peer type */
#define DP_PEER_SET_TYPE(_peer, _type_val) \
((_peer)->peer_type = (_type_val))
/* is legacy peer */
#define IS_DP_LEGACY_PEER(_peer) \
((_peer)->peer_type == CDP_LINK_PEER_TYPE && !((_peer)->mld_peer))
/* is MLO connection link peer */
#define IS_MLO_DP_LINK_PEER(_peer) \
((_peer)->peer_type == CDP_LINK_PEER_TYPE && (_peer)->mld_peer)
@@ -1398,6 +1428,8 @@ QDF_STATUS dp_peer_mlo_setup(
#else
#define DP_PEER_SET_TYPE(_peer, _type_val) /* no op */
/* is legacy peer */
#define IS_DP_LEGACY_PEER(_peer) true
#define IS_MLO_DP_LINK_PEER(_peer) false
#define IS_MLO_DP_MLD_PEER(_peer) false

View File

@@ -1,6 +1,6 @@
/*
* Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2021,2022 Qualcomm Innovation Center, Inc. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@@ -214,30 +214,31 @@ enum dp_peer_state {
* enum for modules ids of
*/
enum dp_mod_id {
DP_MOD_ID_TX_COMP = 0,
DP_MOD_ID_RX = 1,
DP_MOD_ID_HTT_COMP = 2,
DP_MOD_ID_RX_ERR = 3,
DP_MOD_ID_TX_PPDU_STATS = 4,
DP_MOD_ID_RX_PPDU_STATS = 5,
DP_MOD_ID_CDP = 6,
DP_MOD_ID_GENERIC_STATS = 7,
DP_MOD_ID_TX_MULTIPASS = 8,
DP_MOD_ID_TX_CAPTURE = 9,
DP_MOD_ID_NSS_OFFLOAD = 10,
DP_MOD_ID_CONFIG = 11,
DP_MOD_ID_HTT = 12,
DP_MOD_ID_IPA = 13,
DP_MOD_ID_AST = 14,
DP_MOD_ID_MCAST2UCAST = 15,
DP_MOD_ID_CHILD = 16,
DP_MOD_ID_MESH = 17,
DP_MOD_ID_TX_EXCEPTION = 18,
DP_MOD_ID_TDLS = 19,
DP_MOD_ID_MISC = 20,
DP_MOD_ID_MSCS = 21,
DP_MOD_ID_TX = 22,
DP_MOD_ID_MAX = 23,
DP_MOD_ID_TX_RX,
DP_MOD_ID_TX_COMP,
DP_MOD_ID_RX,
DP_MOD_ID_HTT_COMP,
DP_MOD_ID_RX_ERR,
DP_MOD_ID_TX_PPDU_STATS,
DP_MOD_ID_RX_PPDU_STATS,
DP_MOD_ID_CDP,
DP_MOD_ID_GENERIC_STATS,
DP_MOD_ID_TX_MULTIPASS,
DP_MOD_ID_TX_CAPTURE,
DP_MOD_ID_NSS_OFFLOAD,
DP_MOD_ID_CONFIG,
DP_MOD_ID_HTT,
DP_MOD_ID_IPA,
DP_MOD_ID_AST,
DP_MOD_ID_MCAST2UCAST,
DP_MOD_ID_CHILD,
DP_MOD_ID_MESH,
DP_MOD_ID_TX_EXCEPTION,
DP_MOD_ID_TDLS,
DP_MOD_ID_MISC,
DP_MOD_ID_MSCS,
DP_MOD_ID_TX,
DP_MOD_ID_MAX,
};
#define DP_PDEV_ITERATE_VDEV_LIST(_pdev, _vdev) \
@@ -3310,8 +3311,24 @@ struct dp_mld_link_peers {
};
#endif
typedef void *dp_txrx_ref_handle;
struct dp_txrx_peer {
/* Core TxRx Peer */
/* VDEV to which this peer is associated */
struct dp_vdev *vdev;
/* peer ID for this peer */
uint16_t peer_id;
};
/* Peer structure for data path state */
struct dp_peer {
struct dp_txrx_peer *txrx_peer;
#ifdef WIFI_MONITOR_SUPPORT
struct dp_mon_peer *monitor_peer;
#endif
/* VDEV to which this peer is associated */
struct dp_vdev *vdev;
@@ -3440,9 +3457,6 @@ struct dp_peer {
#ifdef WLAN_SUPPORT_MESH_LATENCY
struct dp_peer_mesh_latency_parameter mesh_latency_params[DP_MAX_TIDS];
#endif
#ifdef WIFI_MONITOR_SUPPORT
struct dp_mon_peer *monitor_peer;
#endif
#ifdef WLAN_FEATURE_11BE_MLO
/* peer type */
enum cdp_peer_type peer_type;