diff --git a/dp/inc/cdp_txrx_cmn.h b/dp/inc/cdp_txrx_cmn.h index 1cc7e45c5f..e724b9d2d6 100644 --- a/dp/inc/cdp_txrx_cmn.h +++ b/dp/inc/cdp_txrx_cmn.h @@ -310,7 +310,7 @@ static inline void cdp_peer_setup peer); } -static inline void *cdp_peer_ast_hash_find +static inline void *cdp_peer_ast_hash_find_soc (ol_txrx_soc_handle soc, uint8_t *ast_mac_addr) { if (!soc || !soc->ops) { @@ -321,11 +321,32 @@ static inline void *cdp_peer_ast_hash_find } if (!soc->ops->cmn_drv_ops || - !soc->ops->cmn_drv_ops->txrx_peer_ast_hash_find) + !soc->ops->cmn_drv_ops->txrx_peer_ast_hash_find_soc) return NULL; - return soc->ops->cmn_drv_ops->txrx_peer_ast_hash_find(soc, - ast_mac_addr); + return soc->ops->cmn_drv_ops->txrx_peer_ast_hash_find_soc(soc, + ast_mac_addr); +} + +static inline void *cdp_peer_ast_hash_find_by_pdevid + (ol_txrx_soc_handle soc, uint8_t *ast_mac_addr, + uint8_t pdev_id) +{ + if (!soc || !soc->ops) { + QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, + "%s: Invalid Instance:", __func__); + QDF_BUG(0); + return NULL; + } + + if (!soc->ops->cmn_drv_ops || + !soc->ops->cmn_drv_ops->txrx_peer_ast_hash_find_by_pdevid) + return NULL; + + return soc->ops->cmn_drv_ops->txrx_peer_ast_hash_find_by_pdevid + (soc, + ast_mac_addr, + pdev_id); } static inline int cdp_peer_add_ast @@ -594,6 +615,42 @@ void cdp_peer_ast_free_entry(struct cdp_soc_t *soc, } #endif +static inline struct cdp_peer *cdp_peer_ast_get_peer + (ol_txrx_soc_handle soc, void *ast_handle) +{ + if (!soc || !soc->ops) { + QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, + "%s: Invalid Instance:", __func__); + QDF_BUG(0); + return NULL; + } + + if (!soc->ops->cmn_drv_ops || + !soc->ops->cmn_drv_ops->txrx_peer_ast_get_peer) + return NULL; + + return soc->ops->cmn_drv_ops->txrx_peer_ast_get_peer(soc, ast_handle); +} + +static inline uint32_t cdp_peer_ast_get_nexthop_peer_id + (ol_txrx_soc_handle soc, void *ast_handle) +{ + if (!soc || !soc->ops) { + QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, + "%s: Invalid Instance:", __func__); + QDF_BUG(0); + return CDP_INVALID_PEER; + } + + if (!soc->ops->cmn_drv_ops || + !soc->ops->cmn_drv_ops->txrx_peer_ast_get_nexthop_peer_id) + return CDP_INVALID_PEER; + + return soc->ops->cmn_drv_ops->txrx_peer_ast_get_nexthop_peer_id + (soc, + ast_handle); +} + static inline void cdp_peer_teardown (ol_txrx_soc_handle soc, struct cdp_vdev *vdev, void *peer) { diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index 5f7cf848a6..a66af1e89d 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/dp/inc/cdp_txrx_ops.h @@ -105,10 +105,13 @@ struct cdp_cmn_ops { (ol_txrx_soc_handle soc, struct cdp_peer *peer_hdl, uint8_t *mac_addr, uint32_t flags); - - void *(*txrx_peer_ast_hash_find) + void *(*txrx_peer_ast_hash_find_soc) (ol_txrx_soc_handle soc, uint8_t *ast_mac_addr); + void *(*txrx_peer_ast_hash_find_by_pdevid) + (ol_txrx_soc_handle soc, uint8_t *ast_mac_addr, + uint8_t pdev_id); + uint8_t (*txrx_peer_ast_get_pdev_id) (ol_txrx_soc_handle soc, void *ast_hdl); @@ -136,6 +139,12 @@ struct cdp_cmn_ops { enum cdp_txrx_ast_entry_type (*txrx_peer_ast_get_type) (ol_txrx_soc_handle soc, void *ast_hdl); + struct cdp_peer* (*txrx_peer_ast_get_peer) + (ol_txrx_soc_handle soc, void *ast_hdl); + + uint32_t (*txrx_peer_ast_get_nexthop_peer_id) + (ol_txrx_soc_handle soc, void *ast_hdl); + void (*txrx_peer_delete)(void *peer, uint32_t bitmap); int (*txrx_set_monitor_mode)(struct cdp_vdev *vdev, diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 6d254f75a5..fb8c908729 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -485,14 +485,16 @@ static int dp_peer_update_ast_wifi3(struct cdp_soc_t *soc_hdl, int status = -1; struct dp_soc *soc = (struct dp_soc *)soc_hdl; struct dp_ast_entry *ast_entry = NULL; + struct dp_peer *peer = (struct dp_peer *)peer_hdl; qdf_spin_lock_bh(&soc->ast_lock); - ast_entry = dp_peer_ast_hash_find(soc, wds_macaddr); + ast_entry = dp_peer_ast_hash_find_by_pdevid(soc, wds_macaddr, + peer->vdev->pdev->pdev_id); if (ast_entry) { status = dp_peer_update_ast(soc, - (struct dp_peer *)peer_hdl, - ast_entry, flags); + peer, + ast_entry, flags); } qdf_spin_unlock_bh(&soc->ast_lock); @@ -511,9 +513,11 @@ static void dp_wds_reset_ast_wifi3(struct cdp_soc_t *soc_hdl, { struct dp_soc *soc = (struct dp_soc *)soc_hdl; struct dp_ast_entry *ast_entry = NULL; + struct dp_vdev *vdev = (struct dp_vdev *)vdev_handle; qdf_spin_lock_bh(&soc->ast_lock); - ast_entry = dp_peer_ast_hash_find(soc, wds_macaddr); + ast_entry = dp_peer_ast_hash_find_by_pdevid(soc, wds_macaddr, + vdev->pdev->pdev_id); if (ast_entry) { if ((ast_entry->type != CDP_TXRX_AST_TYPE_STATIC) && @@ -607,13 +611,27 @@ static void dp_wds_flush_ast_table_wifi3(struct cdp_soc_t *soc_hdl) qdf_spin_unlock_bh(&soc->ast_lock); } -static void *dp_peer_ast_hash_find_wifi3(struct cdp_soc_t *soc_hdl, - uint8_t *ast_mac_addr) +static void *dp_peer_ast_hash_find_soc_wifi3(struct cdp_soc_t *soc_hdl, + uint8_t *ast_mac_addr) { struct dp_ast_entry *ast_entry; struct dp_soc *soc = (struct dp_soc *)soc_hdl; + qdf_spin_lock_bh(&soc->ast_lock); - ast_entry = dp_peer_ast_hash_find(soc, ast_mac_addr); + ast_entry = dp_peer_ast_hash_find_soc(soc, ast_mac_addr); + qdf_spin_unlock_bh(&soc->ast_lock); + return (void *)ast_entry; +} + +static void *dp_peer_ast_hash_find_by_pdevid_wifi3(struct cdp_soc_t *soc_hdl, + uint8_t *ast_mac_addr, + uint8_t pdev_id) +{ + struct dp_ast_entry *ast_entry; + struct dp_soc *soc = (struct dp_soc *)soc_hdl; + + qdf_spin_lock_bh(&soc->ast_lock); + ast_entry = dp_peer_ast_hash_find_by_pdevid(soc, ast_mac_addr, pdev_id); qdf_spin_unlock_bh(&soc->ast_lock); return (void *)ast_entry; } @@ -701,6 +719,19 @@ void dp_peer_ast_free_entry_wifi3(struct cdp_soc_t *soc_handle, } #endif +static struct cdp_peer *dp_peer_ast_get_peer_wifi3( + struct cdp_soc_t *soc_hdl, + void *ast_entry_hdl) +{ + return (struct cdp_peer *)((struct dp_ast_entry *)ast_entry_hdl)->peer; +} + +static uint32_t dp_peer_ast_get_nexhop_peer_id_wifi3( + struct cdp_soc_t *soc_hdl, + void *ast_entry_hdl) +{ + return ((struct dp_ast_entry *)ast_entry_hdl)->peer->peer_ids[0]; +} /** * dp_srng_find_ring_in_mask() - find which ext_group a ring belongs * @ring_num: ring num of the ring being queried @@ -4016,7 +4047,7 @@ static void *dp_peer_create_wifi3(struct cdp_vdev *vdev_handle, * MAC addresses, we could deduce it as a WDS entry */ qdf_spin_lock_bh(&soc->ast_lock); - ast_entry = dp_peer_ast_hash_find(soc, peer_mac_addr); + ast_entry = dp_peer_ast_hash_find_soc(soc, peer_mac_addr); if (ast_entry) dp_peer_del_ast(soc, ast_entry); qdf_spin_unlock_bh(&soc->ast_lock); @@ -7833,11 +7864,16 @@ static struct cdp_cmn_ops dp_ops_cmn = { .txrx_peer_add_ast = dp_peer_add_ast_wifi3, .txrx_peer_del_ast = dp_peer_del_ast_wifi3, .txrx_peer_update_ast = dp_peer_update_ast_wifi3, - .txrx_peer_ast_hash_find = dp_peer_ast_hash_find_wifi3, + .txrx_peer_ast_hash_find_soc = dp_peer_ast_hash_find_soc_wifi3, + .txrx_peer_ast_hash_find_by_pdevid = + dp_peer_ast_hash_find_by_pdevid_wifi3, .txrx_peer_ast_get_pdev_id = dp_peer_ast_get_pdev_id_wifi3, .txrx_peer_ast_get_next_hop = dp_peer_ast_get_next_hop_wifi3, .txrx_peer_ast_set_type = dp_peer_ast_set_type_wifi3, .txrx_peer_ast_get_type = dp_peer_ast_get_type_wifi3, + .txrx_peer_ast_get_peer = dp_peer_ast_get_peer_wifi3, + .txrx_peer_ast_get_nexthop_peer_id = + dp_peer_ast_get_nexhop_peer_id_wifi3, #if defined(FEATURE_AST) && defined(AST_HKV1_WORKAROUND) .txrx_peer_ast_set_cp_ctx = dp_peer_ast_set_cp_ctx_wifi3, .txrx_peer_ast_get_cp_ctx = dp_peer_ast_get_cp_ctx_wifi3, diff --git a/dp/wifi3.0/dp_peer.c b/dp/wifi3.0/dp_peer.c index ea2641b906..9459c815a1 100644 --- a/dp/wifi3.0/dp_peer.c +++ b/dp/wifi3.0/dp_peer.c @@ -368,10 +368,7 @@ struct dp_ast_entry *dp_peer_ast_list_find(struct dp_soc *soc, /* * dp_peer_ast_hash_find_by_pdevid() - Find AST entry by MAC address - * and pdev id * @soc: SoC handle - * @ast_mac_addr: mac address - * @pdev_id: pdev_id * * It assumes caller has taken the ast lock to protect the access to * AST hash table @@ -402,7 +399,7 @@ struct dp_ast_entry *dp_peer_ast_hash_find_by_pdevid(struct dp_soc *soc, } /* - * dp_peer_ast_hash_find() - Find AST entry by MAC address + * dp_peer_ast_hash_find_soc() - Find AST entry by MAC address * @soc: SoC handle * * It assumes caller has taken the ast lock to protect the access to @@ -410,8 +407,8 @@ struct dp_ast_entry *dp_peer_ast_hash_find_by_pdevid(struct dp_soc *soc, * * Return: AST entry */ -struct dp_ast_entry *dp_peer_ast_hash_find(struct dp_soc *soc, - uint8_t *ast_mac_addr) +struct dp_ast_entry *dp_peer_ast_hash_find_soc(struct dp_soc *soc, + uint8_t *ast_mac_addr) { union dp_align_mac_addr local_mac_addr_aligned, *mac_addr; unsigned index; @@ -550,7 +547,7 @@ int dp_peer_add_ast(struct dp_soc *soc, return 0; } } else { - ast_entry = dp_peer_ast_hash_find(soc, mac_addr); + ast_entry = dp_peer_ast_hash_find_soc(soc, mac_addr); if (ast_entry) { if (ast_entry->type == CDP_TXRX_AST_TYPE_MEC) { @@ -826,8 +823,15 @@ int dp_peer_update_ast(struct dp_soc *soc, struct dp_peer *peer, return 1; } -struct dp_ast_entry *dp_peer_ast_hash_find(struct dp_soc *soc, - uint8_t *ast_mac_addr) +struct dp_ast_entry *dp_peer_ast_hash_find_soc(struct dp_soc *soc, + uint8_t *ast_mac_addr) +{ + return NULL; +} + +struct dp_ast_entry *dp_peer_ast_hash_find_by_pdevid(struct dp_soc *soc, + uint8_t *ast_mac_addr, + uint8_t pdev_id) { return NULL; } diff --git a/dp/wifi3.0/dp_peer.h b/dp/wifi3.0/dp_peer.h index 0e02808631..d310ea9d35 100644 --- a/dp/wifi3.0/dp_peer.h +++ b/dp/wifi3.0/dp_peer.h @@ -116,8 +116,8 @@ struct dp_ast_entry *dp_peer_ast_hash_find_by_pdevid(struct dp_soc *soc, uint8_t *ast_mac_addr, uint8_t pdev_id); -struct dp_ast_entry *dp_peer_ast_hash_find(struct dp_soc *soc, - uint8_t *ast_mac_addr); +struct dp_ast_entry *dp_peer_ast_hash_find_soc(struct dp_soc *soc, + uint8_t *ast_mac_addr); struct dp_ast_entry *dp_peer_ast_list_find(struct dp_soc *soc, struct dp_peer *peer, diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c index 77f2610cc4..11ea947d33 100644 --- a/dp/wifi3.0/dp_rx_err.c +++ b/dp/wifi3.0/dp_rx_err.c @@ -127,7 +127,6 @@ static inline bool dp_rx_mcast_echo_check(struct dp_soc *soc, * ast is not in ast_table, we use the below API to get * AST entry for STA's own mac_address. */ - ase = dp_peer_ast_list_find(soc, peer, &data[DP_MAC_ADDR_LEN]); if (ase) { @@ -136,7 +135,7 @@ static inline bool dp_rx_mcast_echo_check(struct dp_soc *soc, } } } else - ase = dp_peer_ast_hash_find(soc, &data[DP_MAC_ADDR_LEN]); + ase = dp_peer_ast_hash_find_soc(soc, &data[DP_MAC_ADDR_LEN]); if (ase) { diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index 62e068ccf1..e0c8eca8e2 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -1722,7 +1722,10 @@ static qdf_nbuf_t dp_tx_prepare_nawds(struct dp_vdev *vdev, qdf_nbuf_t nbuf, qdf_nbuf_t nbuf_copy; qdf_spin_lock_bh(&(soc->ast_lock)); - ast_entry = dp_peer_ast_hash_find(soc, (uint8_t *)(eh->ether_shost)); + ast_entry = dp_peer_ast_hash_find_by_pdevid + (soc, + (uint8_t *)(eh->ether_shost), + vdev->pdev->pdev_id); if (ast_entry) sa_peer = ast_entry->peer; @@ -2157,7 +2160,10 @@ void dp_tx_reinject_handler(struct dp_tx_desc_s *tx_desc, uint8_t *status) qdf_spin_lock_bh(&(soc->ast_lock)); - ast_entry = dp_peer_ast_hash_find(soc, (uint8_t *)(eh->ether_shost)); + ast_entry = dp_peer_ast_hash_find_by_pdevid + (soc, + (uint8_t *)(eh->ether_shost), + vdev->pdev->pdev_id); if (ast_entry) sa_peer = ast_entry->peer;