From d7908ff22a3f76478d934d7e48e7948c3bf0ef09 Mon Sep 17 00:00:00 2001 From: Pavankumar Nandeshwar Date: Thu, 28 Oct 2021 02:55:59 -0700 Subject: [PATCH] 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 --- dp/wifi3.0/dp_internal.h | 5 +- dp/wifi3.0/dp_main.c | 103 +++++++++++++++++++++++++++++++++------ dp/wifi3.0/dp_peer.c | 49 ++++++++++++++++--- dp/wifi3.0/dp_peer.h | 34 ++++++++++++- dp/wifi3.0/dp_types.h | 70 +++++++++++++++----------- 5 files changed, 209 insertions(+), 52 deletions(-) diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index 35e073414d..89f10012bb 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -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, diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 8052111306..437f9a5bd6 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -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) { diff --git a/dp/wifi3.0/dp_peer.c b/dp/wifi3.0/dp_peer.c index 34b96af108..576da973cb 100644 --- a/dp/wifi3.0/dp_peer.c +++ b/dp/wifi3.0/dp_peer.c @@ -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_monitor_peer_tid_peer_id_update(soc, peer, + peer->peer_id); dp_peer_update_state(soc, peer, DP_PEER_STATE_ACTIVE); return peer; diff --git a/dp/wifi3.0/dp_peer.h b/dp/wifi3.0/dp_peer.h index 8d2a38832a..b2ee1e1025 100644 --- a/dp/wifi3.0/dp_peer.h +++ b/dp/wifi3.0/dp_peer.h @@ -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 diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 635a93e29b..90b25cc35c 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -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;