diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index e4dae840c46e..82a5b1b3ebfc 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -4720,7 +4720,7 @@ static void dp_vdev_detach_wifi3(struct cdp_vdev *vdev_handle, goto free_vdev; if (wlan_op_mode_sta == vdev->opmode) - dp_peer_delete_wifi3(vdev->vap_bss_peer, 0); + dp_peer_delete_wifi3(vdev->vap_self_peer, 0); /* * If Target is hung, flush all peers before detaching vdev @@ -5023,11 +5023,20 @@ static void *dp_peer_create_wifi3(struct cdp_vdev *vdev_handle, /* * For every peer MAp message search and set if bss_peer */ - if (memcmp(peer->mac_addr.raw, vdev->mac_addr.raw, 6) == 0) { + if (qdf_mem_cmp(peer->mac_addr.raw, vdev->mac_addr.raw, + QDF_MAC_ADDR_SIZE) == 0 && + (wlan_op_mode_sta != vdev->opmode)) { dp_info("vdev bss_peer!!"); peer->bss_peer = 1; vdev->vap_bss_peer = peer; } + + if (wlan_op_mode_sta == vdev->opmode && + qdf_mem_cmp(peer->mac_addr.raw, vdev->mac_addr.raw, + QDF_MAC_ADDR_SIZE) == 0) { + vdev->vap_self_peer = peer; + } + for (i = 0; i < DP_MAX_TIDS; i++) qdf_spinlock_create(&peer->rx_tid[i].tid_lock); diff --git a/dp/wifi3.0/dp_peer.c b/dp/wifi3.0/dp_peer.c index 64b85e0842ac..bd9fb4d19c19 100644 --- a/dp/wifi3.0/dp_peer.c +++ b/dp/wifi3.0/dp_peer.c @@ -1446,13 +1446,11 @@ dp_rx_peer_map_handler(void *soc_handle, uint16_t peer_id, hw_peer_id, vdev_id); if (peer) { - /* - * For every peer Map message search and set if bss_peer - */ - if (!(qdf_mem_cmp(peer->mac_addr.raw, - peer->vdev->mac_addr.raw, - QDF_MAC_ADDR_SIZE))) { - dp_info("vdev bss_peer!!!!"); + if (wlan_op_mode_sta == peer->vdev->opmode && + qdf_mem_cmp(peer->mac_addr.raw, + peer->vdev->mac_addr.raw, + QDF_MAC_ADDR_SIZE) != 0) { + dp_info("STA vdev bss_peer!!!!"); peer->bss_peer = 1; peer->vdev->vap_bss_peer = peer; } @@ -2186,7 +2184,7 @@ void dp_peer_rx_cleanup(struct dp_vdev *vdev, struct dp_peer *peer) struct dp_rx_tid *rx_tid = &peer->rx_tid[tid]; qdf_spin_lock_bh(&rx_tid->tid_lock); - if (!peer->bss_peer) { + if (!peer->bss_peer && peer->vdev->opmode != wlan_op_mode_sta) { /* Cleanup defrag related resource */ dp_rx_defrag_waitlist_remove(peer, tid); dp_rx_reorder_flush_frag(peer, tid); diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 9957568b5e6a..bf01493b039c 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -2088,21 +2088,6 @@ done: continue; } - if (qdf_unlikely(peer && peer->bss_peer)) { - QDF_TRACE(QDF_MODULE_ID_DP, - QDF_TRACE_LEVEL_ERROR, - FL("received pkt with same src MAC")); - tid_stats->fail_cnt[MEC_DROP]++; - DP_STATS_INC_PKT(peer, rx.mec_drop, 1, msdu_len); - - /* Drop & free packet */ - qdf_nbuf_free(nbuf); - /* Statistics */ - nbuf = next; - dp_peer_unref_del_find_by_id(peer); - continue; - } - if (qdf_unlikely(peer && (peer->nawds_enabled) && (qdf_nbuf_is_da_mcbc(nbuf)) && (hal_rx_get_mpdu_mac_ad4_valid(rx_tlv_hdr) == diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c index 845e4e2484cc..ec1ccee4d8ee 100644 --- a/dp/wifi3.0/dp_rx_err.c +++ b/dp/wifi3.0/dp_rx_err.c @@ -805,13 +805,6 @@ dp_rx_null_q_desc_handle(struct dp_soc *soc, qdf_nbuf_t nbuf, qdf_nbuf_set_next(nbuf, NULL); dp_rx_deliver_raw(vdev, nbuf, peer); } else { - if (qdf_unlikely(peer->bss_peer)) { - dp_info_rl("received pkt with same src MAC"); - DP_STATS_INC_PKT(peer, rx.mec_drop, 1, - qdf_nbuf_len(nbuf)); - goto drop_nbuf; - } - if (vdev->osif_rx) { qdf_nbuf_set_next(nbuf, NULL); DP_STATS_INC_PKT(peer, rx.to_stack, 1, diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index 952a31974d38..f0ae73746897 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -2641,9 +2641,7 @@ void dp_tx_mec_handler(struct dp_vdev *vdev, uint8_t *status) return; soc = vdev->pdev->soc; - qdf_spin_lock_bh(&soc->peer_ref_mutex); - peer = TAILQ_FIRST(&vdev->peer_list); - qdf_spin_unlock_bh(&soc->peer_ref_mutex); + peer = vdev->vap_bss_peer; if (!peer) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index a31434ed463c..61ff9dae660c 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -1768,6 +1768,8 @@ struct dp_vdev { /* TIDmap priority */ uint8_t tidmap_prty; + /* Self Peer in STA mode */ + struct dp_peer *vap_self_peer; };