qcacmn: Add APIs to get AST entry with pdev_id
With HKv1 WAR to handle DBDC backhaul SON cases a AST entry for same mac can exist on different radio added CDP APIs to support the same Change-Id: I374b8af3fe5e34f62eeb5b09819e331fdeda602a
This commit is contained in:

committed by
nshrivas

parent
7c8cf12b76
commit
cf347d1686
@@ -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)
|
||||
{
|
||||
|
@@ -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,
|
||||
|
@@ -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,
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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,
|
||||
|
@@ -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) {
|
||||
|
||||
|
@@ -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;
|
||||
|
Reference in New Issue
Block a user