qcacmn: Update ast entry during PTQM migration

Delete and add ast entry during PTQM migration for current and new primary
peer respectively.

Change-Id: I4a640f84a5778aeff19057e027b3aae9e939487a
CRs-Fixed: 3536670
This commit is contained in:
Neha Bisht
2023-06-21 17:23:49 +05:30
committed by Rahul Choudhary
parent 6646c062ff
commit c9d9e88708
5 changed files with 73 additions and 23 deletions

View File

@@ -2963,6 +2963,9 @@ dp_primary_link_migration(struct dp_soc *soc, void *cb_ctxt,
uint8_t primary_vdev_id; uint8_t primary_vdev_id;
struct cdp_txrx_peer_params_update params = {0}; struct cdp_txrx_peer_params_update params = {0};
uint8_t tid; uint8_t tid;
uint8_t is_wds = 0;
uint16_t hw_peer_id;
uint16_t ast_hash;
pr_soc = dp_mlo_get_soc_ref_by_chip_id(dp_mlo, pr_peer_info->chip_id); pr_soc = dp_mlo_get_soc_ref_by_chip_id(dp_mlo, pr_peer_info->chip_id);
if (!pr_soc) { if (!pr_soc) {
@@ -2973,6 +2976,11 @@ dp_primary_link_migration(struct dp_soc *soc, void *cb_ctxt,
new_primary_peer = pr_soc->peer_id_to_obj_map[ new_primary_peer = pr_soc->peer_id_to_obj_map[
pr_peer_info->primary_peer_id]; pr_peer_info->primary_peer_id];
if (!new_primary_peer) {
dp_htt_err("New primary peer is NULL");
qdf_mem_free(pr_peer_info);
return;
}
mld_peer = DP_GET_MLD_PEER_FROM_PEER(new_primary_peer); mld_peer = DP_GET_MLD_PEER_FROM_PEER(new_primary_peer);
if (!mld_peer) { if (!mld_peer) {
@@ -2983,6 +2991,15 @@ dp_primary_link_migration(struct dp_soc *soc, void *cb_ctxt,
new_primary_peer->primary_link = 1; new_primary_peer->primary_link = 1;
hw_peer_id = pr_peer_info->hw_peer_id;
ast_hash = pr_peer_info->ast_hash;
/* Add ast enteries for new primary peer */
if (pr_soc->ast_offload_support && pr_soc->host_ast_db_enable) {
dp_peer_host_add_map_ast(pr_soc, mld_peer->peer_id, mld_peer->mac_addr.raw,
hw_peer_id, new_primary_peer->vdev->vdev_id,
ast_hash, is_wds);
}
/* /*
* Check if reo_qref_table_en is set and if * Check if reo_qref_table_en is set and if
* rx_tid qdesc for tid 0 is already setup and perform * rx_tid qdesc for tid 0 is already setup and perform
@@ -3031,8 +3048,7 @@ dp_primary_link_migration(struct dp_soc *soc, void *cb_ctxt,
} }
#ifdef WLAN_SUPPORT_PPEDS #ifdef WLAN_SUPPORT_PPEDS
static QDF_STATUS dp_get_ppe_info_for_vap(struct cdp_soc_t *cdp_soc, static QDF_STATUS dp_get_ppe_info_for_vap(struct dp_soc *pr_soc,
struct dp_soc *mld_soc,
struct dp_peer *pr_peer, struct dp_peer *pr_peer,
uint16_t *src_info) uint16_t *src_info)
{ {
@@ -3040,6 +3056,7 @@ static QDF_STATUS dp_get_ppe_info_for_vap(struct cdp_soc_t *cdp_soc,
struct cdp_ds_vp_params vp_params = {0}; struct cdp_ds_vp_params vp_params = {0};
struct dp_ppe_vp_profile *ppe_vp_profile; struct dp_ppe_vp_profile *ppe_vp_profile;
QDF_STATUS qdf_status = QDF_STATUS_SUCCESS; QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
struct cdp_soc_t *cdp_soc = &pr_soc->cdp_soc;
/* /*
* Extract the VP profile from the VAP * Extract the VP profile from the VAP
@@ -3053,7 +3070,7 @@ static QDF_STATUS dp_get_ppe_info_for_vap(struct cdp_soc_t *cdp_soc,
* Check if PPE DS routing is enabled on the associated vap. * Check if PPE DS routing is enabled on the associated vap.
*/ */
qdf_status = cdp_soc->ol_ops->get_ppeds_profile_info_for_vap( qdf_status = cdp_soc->ol_ops->get_ppeds_profile_info_for_vap(
mld_soc->ctrl_psoc, pr_soc->ctrl_psoc,
pr_peer->vdev->vdev_id, pr_peer->vdev->vdev_id,
&vp_params); &vp_params);
@@ -3068,7 +3085,7 @@ static QDF_STATUS dp_get_ppe_info_for_vap(struct cdp_soc_t *cdp_soc,
if (vp_params.ppe_vp_type != PPE_VP_USER_TYPE_DS) if (vp_params.ppe_vp_type != PPE_VP_USER_TYPE_DS)
return qdf_status; return qdf_status;
be_soc_mld = dp_get_be_soc_from_dp_soc(mld_soc); be_soc_mld = dp_get_be_soc_from_dp_soc(pr_soc);
ppe_vp_profile = &be_soc_mld->ppe_vp_profile[ ppe_vp_profile = &be_soc_mld->ppe_vp_profile[
vp_params.ppe_vp_profile_idx]; vp_params.ppe_vp_profile_idx];
*src_info = ppe_vp_profile->vp_num; *src_info = ppe_vp_profile->vp_num;
@@ -3076,8 +3093,7 @@ static QDF_STATUS dp_get_ppe_info_for_vap(struct cdp_soc_t *cdp_soc,
return qdf_status; return qdf_status;
} }
#else #else
static QDF_STATUS dp_get_ppe_info_for_vap(struct cdp_soc_t *cdp_soc, static QDF_STATUS dp_get_ppe_info_for_vap(struct dp_soc *pr_soc,
struct dp_soc *mld_soc,
struct dp_peer *pr_peer, struct dp_peer *pr_peer,
uint16_t *src_info) uint16_t *src_info)
{ {
@@ -3102,9 +3118,11 @@ QDF_STATUS dp_htt_reo_migration(struct dp_soc *soc, uint16_t peer_id,
struct dp_peer *current_pr_peer = NULL; struct dp_peer *current_pr_peer = NULL;
struct dp_peer_info *peer_info; struct dp_peer_info *peer_info;
struct dp_vdev_be *be_vdev; struct dp_vdev_be *be_vdev;
struct cdp_soc_t *cdp_soc;
uint16_t src_info = 0; uint16_t src_info = 0;
QDF_STATUS status; QDF_STATUS status;
struct dp_ast_entry *ast_entry;
uint16_t hw_peer_id;
uint16_t ast_hash;
if (!dp_mlo) { if (!dp_mlo) {
dp_htt_err("Invalid dp_mlo ctxt"); dp_htt_err("Invalid dp_mlo ctxt");
@@ -3146,8 +3164,7 @@ QDF_STATUS dp_htt_reo_migration(struct dp_soc *soc, uint16_t peer_id,
} }
mld_soc = mld_peer->vdev->pdev->soc; mld_soc = mld_peer->vdev->pdev->soc;
cdp_soc = &mld_soc->cdp_soc; status = dp_get_ppe_info_for_vap(pr_soc, pr_peer, &src_info);
status = dp_get_ppe_info_for_vap(cdp_soc, mld_soc, pr_peer, &src_info);
if (status == QDF_STATUS_E_NULL_VALUE) { if (status == QDF_STATUS_E_NULL_VALUE) {
dp_htt_err("Invalid ppe info for the vdev"); dp_htt_err("Invalid ppe info for the vdev");
return QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;
@@ -3160,6 +3177,27 @@ QDF_STATUS dp_htt_reo_migration(struct dp_soc *soc, uint16_t peer_id,
dp_peer_rx_reo_shared_qaddr_delete(current_pr_soc, mld_peer); dp_peer_rx_reo_shared_qaddr_delete(current_pr_soc, mld_peer);
/* delete ast entry for current primary peer */
qdf_spin_lock_bh(&current_pr_soc->ast_lock);
ast_entry = dp_peer_ast_hash_find_soc(current_pr_soc, mld_peer->mac_addr.raw);
if (!ast_entry) {
dp_htt_err("Invalid ast entry");
qdf_spin_unlock_bh(&current_pr_soc->ast_lock);
return QDF_STATUS_E_FAILURE;
}
hw_peer_id = ast_entry->ast_idx;
ast_hash = ast_entry->ast_hash_value;
dp_peer_unlink_ast_entry(current_pr_soc, ast_entry, mld_peer);
if (ast_entry->is_mapped)
current_pr_soc->ast_table[ast_entry->ast_idx] = NULL;
dp_peer_free_ast_entry(current_pr_soc, ast_entry);
mld_peer->self_ast_entry = NULL;
qdf_spin_unlock_bh(&current_pr_soc->ast_lock);
peer_info = qdf_mem_malloc(sizeof(struct dp_peer_info)); peer_info = qdf_mem_malloc(sizeof(struct dp_peer_info));
if (!peer_info) { if (!peer_info) {
dp_htt_err("Malloc failed"); dp_htt_err("Malloc failed");
@@ -3168,6 +3206,8 @@ QDF_STATUS dp_htt_reo_migration(struct dp_soc *soc, uint16_t peer_id,
peer_info->primary_peer_id = peer_id; peer_info->primary_peer_id = peer_id;
peer_info->chip_id = chip_id; peer_info->chip_id = chip_id;
peer_info->hw_peer_id = hw_peer_id;
peer_info->ast_hash = ast_hash;
qdf_mem_zero(&params, sizeof(params)); qdf_mem_zero(&params, sizeof(params));

View File

@@ -1206,10 +1206,14 @@ QDF_STATUS htt_h2t_rx_cce_super_rule_setup(struct htt_soc *htt_soc,
* struct dp_peer_info - Primary Peer information * struct dp_peer_info - Primary Peer information
* @primary_peer_id: Primary peer id * @primary_peer_id: Primary peer id
* @chip_id: Chip id of primary peer * @chip_id: Chip id of primary peer
* @hw_peer_id: ast hash index
* @ast_hash: ast hash value
*/ */
struct dp_peer_info { struct dp_peer_info {
uint16_t primary_peer_id; uint16_t primary_peer_id;
uint8_t chip_id; uint8_t chip_id;
uint16_t hw_peer_id;
uint16_t ast_hash;
}; };
/** /**

View File

@@ -1287,19 +1287,6 @@ void dp_peer_map_ipa_evt(struct dp_soc *soc, struct dp_peer *peer,
} }
#endif #endif
/**
* dp_peer_host_add_map_ast() - Add ast entry with HW AST Index
* @soc: SoC handle
* @peer_id: peer id from firmware
* @mac_addr: MAC address of ast node
* @hw_peer_id: HW AST Index returned by target in peer map event
* @vdev_id: vdev id for VAP to which the peer belongs to
* @ast_hash: ast hash value in HW
* @is_wds: flag to indicate peer map event for WDS ast entry
*
* Return: QDF_STATUS code
*/
static inline
QDF_STATUS dp_peer_host_add_map_ast(struct dp_soc *soc, uint16_t peer_id, QDF_STATUS dp_peer_host_add_map_ast(struct dp_soc *soc, uint16_t peer_id,
uint8_t *mac_addr, uint16_t hw_peer_id, uint8_t *mac_addr, uint16_t hw_peer_id,
uint8_t vdev_id, uint16_t ast_hash, uint8_t vdev_id, uint16_t ast_hash,

View File

@@ -2492,4 +2492,23 @@ bool dp_peer_check_wds_ext_peer(struct dp_peer *peer);
* Return: DP MLD peer id * Return: DP MLD peer id
*/ */
uint16_t dp_gen_ml_peer_id(struct dp_soc *soc, uint16_t peer_id); uint16_t dp_gen_ml_peer_id(struct dp_soc *soc, uint16_t peer_id);
#ifdef FEATURE_AST
/**
* dp_peer_host_add_map_ast() - Add ast entry with HW AST Index
* @soc: SoC handle
* @peer_id: peer id from firmware
* @mac_addr: MAC address of ast node
* @hw_peer_id: HW AST Index returned by target in peer map event
* @vdev_id: vdev id for VAP to which the peer belongs to
* @ast_hash: ast hash value in HW
* @is_wds: flag to indicate peer map event for WDS ast entry
*
* Return: QDF_STATUS code
*/
QDF_STATUS dp_peer_host_add_map_ast(struct dp_soc *soc, uint16_t peer_id,
uint8_t *mac_addr, uint16_t hw_peer_id,
uint8_t vdev_id, uint16_t ast_hash,
uint8_t is_wds);
#endif
#endif /* _DP_PEER_H_ */ #endif /* _DP_PEER_H_ */

View File

@@ -347,7 +347,7 @@ enum dp_peer_type {
TAILQ_FOREACH((_peer), &(_vdev)->peer_list, peer_list_elem) TAILQ_FOREACH((_peer), &(_vdev)->peer_list, peer_list_elem)
#define DP_PEER_ITERATE_ASE_LIST(_peer, _ase, _temp_ase) \ #define DP_PEER_ITERATE_ASE_LIST(_peer, _ase, _temp_ase) \
TAILQ_FOREACH_SAFE((_ase), &peer->ast_entry_list, ase_list_elem, (_temp_ase)) TAILQ_FOREACH_SAFE((_ase), &_peer->ast_entry_list, ase_list_elem, (_temp_ase))
#define DP_MUTEX_TYPE qdf_spinlock_t #define DP_MUTEX_TYPE qdf_spinlock_t