qca-wifi: Update feature wds APIs and move dp_peer_teardown_wifi3 to cmndev

dp_tx_mec_handleri,dp_rx_wds_add_or_update_ast,
dp_rx_wds_srcport_learn were changed inside common dp.
As part of cleanup we have moved it to component
dev.This change adopts to the latest dp_tx_mec_handler version.
With this change we are moving dp_peer_teardown_wifi3 to common code as
it is also required by MCL driver code.

Change-Id: Ieba59ceb2f3a3b21f3588fe2685e0dc720ee049a
This commit is contained in:
Pranita Solanke
2019-05-17 17:12:45 +05:30
förälder 02c71a8024
incheckning 0b5337fd6b
2 ändrade filer med 41 tillägg och 70 borttagningar

Visa fil

@@ -197,9 +197,7 @@ void dp_tx_mec_handler(struct dp_vdev *vdev, uint8_t *status)
return; return;
soc = vdev->pdev->soc; soc = vdev->pdev->soc;
qdf_spin_lock_bh(&soc->peer_ref_mutex); peer = vdev->vap_bss_peer;
peer = TAILQ_FIRST(&vdev->peer_list);
qdf_spin_unlock_bh(&soc->peer_ref_mutex);
if (!peer) { if (!peer) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,

Visa fil

@@ -34,48 +34,6 @@ dp_rx_da_learn(struct dp_soc *soc,
qdf_nbuf_t nbuf); qdf_nbuf_t nbuf);
void dp_tx_mec_handler(struct dp_vdev *vdev, uint8_t *status); void dp_tx_mec_handler(struct dp_vdev *vdev, uint8_t *status);
#ifdef FEATURE_AST
/*
* dp_peer_delete_ast_entries(): Delete all AST entries for a peer
* @soc - datapath soc handle
* @peer - datapath peer handle
*
* Delete the AST entries belonging to a peer
*/
static inline void dp_peer_delete_ast_entries(struct dp_soc *soc,
struct dp_peer *peer)
{
struct dp_ast_entry *ast_entry, *temp_ast_entry;
qdf_spin_lock_bh(&soc->ast_lock);
DP_PEER_ITERATE_ASE_LIST(peer, ast_entry, temp_ast_entry)
dp_peer_del_ast(soc, ast_entry);
peer->self_ast_entry = NULL;
qdf_spin_unlock_bh(&soc->ast_lock);
}
static void dp_peer_teardown_wifi3(struct cdp_vdev *vdev_hdl, void *peer_hdl)
{
struct dp_vdev *vdev = (struct dp_vdev *)vdev_hdl;
struct dp_peer *peer = (struct dp_peer *)peer_hdl;
struct dp_soc *soc = (struct dp_soc *)vdev->pdev->soc;
/*
* For BSS peer, new peer is not created on alloc_node if the
* peer with same address already exists , instead refcnt is
* increased for existing peer. Correspondingly in delete path,
* only refcnt is decreased; and peer is only deleted , when all
* references are deleted. So delete_in_progress should not be set
* for bss_peer, unless only 2 reference remains (peer map reference
* and peer hash table reference).
*/
if (peer->bss_peer && (qdf_atomic_read(&peer->ref_cnt) > 2))
return;
peer->delete_in_progress = true;
dp_peer_delete_ast_entries(soc, peer);
}
#endif
#ifdef FEATURE_WDS #ifdef FEATURE_WDS
static inline bool dp_tx_da_search_override(struct dp_vdev *vdev) static inline bool dp_tx_da_search_override(struct dp_vdev *vdev)
{ {
@@ -119,7 +77,7 @@ dp_txrx_set_wds_rx_policy(struct cdp_vdev *vdev_handle,
*/ */
static inline void static inline void
dp_rx_wds_add_or_update_ast(struct dp_soc *soc, struct dp_peer *ta_peer, dp_rx_wds_add_or_update_ast(struct dp_soc *soc, struct dp_peer *ta_peer,
uint8_t *wds_src_mac, uint8_t is_ad4_valid, qdf_nbuf_t nbuf, uint8_t is_ad4_valid,
uint8_t is_sa_valid, uint8_t is_chfrag_start, uint8_t is_sa_valid, uint8_t is_chfrag_start,
uint16_t sa_idx, uint16_t sa_sw_peer_id) uint16_t sa_idx, uint16_t sa_sw_peer_id)
{ {
@@ -129,6 +87,7 @@ dp_rx_wds_add_or_update_ast(struct dp_soc *soc, struct dp_peer *ta_peer,
uint32_t ret = 0; uint32_t ret = 0;
struct dp_neighbour_peer *neighbour_peer = NULL; struct dp_neighbour_peer *neighbour_peer = NULL;
struct dp_pdev *pdev = ta_peer->vdev->pdev; struct dp_pdev *pdev = ta_peer->vdev->pdev;
uint8_t wds_src_mac[QDF_MAC_ADDR_SIZE];
/* For AP mode : Do wds source port learning only if it is a /* For AP mode : Do wds source port learning only if it is a
* 4-address mpdu * 4-address mpdu
@@ -150,8 +109,15 @@ dp_rx_wds_add_or_update_ast(struct dp_soc *soc, struct dp_peer *ta_peer,
} }
if (qdf_unlikely(!is_sa_valid)) { if (qdf_unlikely(!is_sa_valid)) {
ret = dp_peer_add_ast(soc, ta_peer, wds_src_mac, qdf_mem_copy(wds_src_mac,
CDP_TXRX_AST_TYPE_WDS, flags); (qdf_nbuf_data(nbuf) + QDF_MAC_ADDR_SIZE),
QDF_MAC_ADDR_SIZE);
ret = dp_peer_add_ast(soc,
ta_peer,
wds_src_mac,
CDP_TXRX_AST_TYPE_WDS,
flags);
return; return;
} }
@@ -174,11 +140,17 @@ dp_rx_wds_add_or_update_ast(struct dp_soc *soc, struct dp_peer *ta_peer,
* cached. * cached.
*/ */
if (!soc->ast_override_support) { if (!soc->ast_override_support) {
ret = dp_peer_add_ast(soc, ta_peer, wds_src_mac, qdf_mem_copy(wds_src_mac,
CDP_TXRX_AST_TYPE_WDS, flags); (qdf_nbuf_data(nbuf) + QDF_MAC_ADDR_SIZE),
QDF_MAC_ADDR_SIZE);
ret = dp_peer_add_ast(soc,
ta_peer,
wds_src_mac,
CDP_TXRX_AST_TYPE_WDS,
flags);
return; return;
} } else {
if (soc->ast_override_support) {
/* In HKv2 smart monitor case, when NAC client is /* In HKv2 smart monitor case, when NAC client is
* added first and this client roams within BSS to * added first and this client roams within BSS to
* connect to RE, since we have an AST entry for * connect to RE, since we have an AST entry for
@@ -187,24 +159,26 @@ dp_rx_wds_add_or_update_ast(struct dp_soc *soc, struct dp_peer *ta_peer,
* to FW. * to FW.
*/ */
if (pdev->neighbour_peers_added) { if (pdev->neighbour_peers_added) {
qdf_mem_copy(wds_src_mac,
(qdf_nbuf_data(nbuf) +
QDF_MAC_ADDR_SIZE),
QDF_MAC_ADDR_SIZE);
qdf_spin_lock_bh(&pdev->neighbour_peer_mutex); qdf_spin_lock_bh(&pdev->neighbour_peer_mutex);
TAILQ_FOREACH(neighbour_peer, TAILQ_FOREACH(neighbour_peer,
&pdev->neighbour_peers_list, &pdev->neighbour_peers_list,
neighbour_peer_list_elem) { neighbour_peer_list_elem) {
if (!qdf_mem_cmp(&neighbour_peer-> if (!qdf_mem_cmp(&neighbour_peer->neighbour_peers_macaddr,
neighbour_peers_macaddr
, wds_src_mac,
QDF_MAC_ADDR_SIZE)) {
ret = dp_peer_add_ast
(soc,
ta_peer,
wds_src_mac, wds_src_mac,
CDP_TXRX_AST_TYPE_WDS, QDF_MAC_ADDR_SIZE)) {
flags); ret = dp_peer_add_ast(soc,
QDF_TRACE ta_peer,
(QDF_MODULE_ID_DP, wds_src_mac,
QDF_TRACE_LEVEL_INFO, CDP_TXRX_AST_TYPE_WDS,
"sa valid and nac roamed to wds"); flags);
QDF_TRACE(QDF_MODULE_ID_DP,
QDF_TRACE_LEVEL_INFO,
"sa valid and nac roamed to wds");
break; break;
} }
} }
@@ -214,6 +188,7 @@ dp_rx_wds_add_or_update_ast(struct dp_soc *soc, struct dp_peer *ta_peer,
} }
} }
if ((ast->type == CDP_TXRX_AST_TYPE_WDS_HM) || if ((ast->type == CDP_TXRX_AST_TYPE_WDS_HM) ||
(ast->type == CDP_TXRX_AST_TYPE_WDS_HM_SEC)) (ast->type == CDP_TXRX_AST_TYPE_WDS_HM_SEC))
return; return;
@@ -262,8 +237,9 @@ dp_rx_wds_add_or_update_ast(struct dp_soc *soc, struct dp_peer *ta_peer,
* for multicast loopback frames originated from connected * for multicast loopback frames originated from connected
* clients and looped back (intrabss) by Root AP * clients and looped back (intrabss) by Root AP
*/ */
if (ast->pdev_id != ta_peer->vdev->pdev->pdev_id) if (ast->pdev_id != ta_peer->vdev->pdev->pdev_id) {
return; return;
}
/* /*
* Kickout, when direct associated peer(SA) roams * Kickout, when direct associated peer(SA) roams
@@ -300,7 +276,6 @@ dp_rx_wds_srcport_learn(struct dp_soc *soc,
{ {
uint16_t sa_sw_peer_id = hal_rx_msdu_end_sa_sw_peer_id_get(rx_tlv_hdr); uint16_t sa_sw_peer_id = hal_rx_msdu_end_sa_sw_peer_id_get(rx_tlv_hdr);
uint8_t sa_is_valid = hal_rx_msdu_end_sa_is_valid_get(rx_tlv_hdr); uint8_t sa_is_valid = hal_rx_msdu_end_sa_is_valid_get(rx_tlv_hdr);
uint8_t wds_src_mac[IEEE80211_ADDR_LEN];
uint16_t sa_idx; uint16_t sa_idx;
uint8_t is_chfrag_start = 0; uint8_t is_chfrag_start = 0;
uint8_t is_ad4_valid = 0; uint8_t is_ad4_valid = 0;
@@ -312,15 +287,13 @@ dp_rx_wds_srcport_learn(struct dp_soc *soc,
if (is_chfrag_start) if (is_chfrag_start)
is_ad4_valid = hal_rx_get_mpdu_mac_ad4_valid(rx_tlv_hdr); is_ad4_valid = hal_rx_get_mpdu_mac_ad4_valid(rx_tlv_hdr);
memcpy(wds_src_mac, (qdf_nbuf_data(nbuf) + IEEE80211_ADDR_LEN),
IEEE80211_ADDR_LEN);
/* /*
* Get the AST entry from HW SA index and mark it as active * Get the AST entry from HW SA index and mark it as active
*/ */
sa_idx = hal_rx_msdu_end_sa_idx_get(rx_tlv_hdr); sa_idx = hal_rx_msdu_end_sa_idx_get(rx_tlv_hdr);
dp_rx_wds_add_or_update_ast(soc, ta_peer, wds_src_mac, is_ad4_valid, dp_rx_wds_add_or_update_ast(soc, ta_peer, nbuf, is_ad4_valid,
sa_is_valid, is_chfrag_start, sa_is_valid, is_chfrag_start,
sa_idx, sa_sw_peer_id); sa_idx, sa_sw_peer_id);
} }