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:
Chaithanya Garrepalli
2018-09-18 14:28:55 +05:30
committed by nshrivas
parent 7c8cf12b76
commit cf347d1686
7 changed files with 141 additions and 30 deletions

View File

@@ -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)
{

View File

@@ -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,

View File

@@ -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,

View File

@@ -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;
}

View File

@@ -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,

View File

@@ -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) {

View File

@@ -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;