diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 862655d4df79..a219791e8720 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -290,6 +290,12 @@ dp_get_vdev_from_peer(struct dp_soc *soc, } return vdev; } +/* + * In case of LFR, this is an empty inline function + */ +static inline void dp_rx_peer_validity_check(struct dp_peer *peer) +{ +} #else static inline struct dp_vdev * dp_get_vdev_from_peer(struct dp_soc *soc, @@ -307,6 +313,14 @@ dp_get_vdev_from_peer(struct dp_soc *soc, return peer->vdev; } } + +/* + * Assert if PEER is NULL + */ +static inline void dp_rx_peer_validity_check(struct dp_peer *peer) +{ + qdf_assert_always(peer); +} #endif /** @@ -846,7 +860,7 @@ dp_rx_process(struct dp_intr *int_ctx, void *hal_ring, uint32_t quota) struct hal_rx_mpdu_desc_info mpdu_desc_info; struct hal_rx_msdu_desc_info msdu_desc_info; enum hal_reo_error_status error; - static uint32_t peer_mdata; + uint32_t peer_mdata; uint8_t *rx_tlv_hdr; uint32_t rx_bufs_reaped[MAX_PDEV_CNT] = { 0 }; uint32_t sgi, mcs, tid, nss, bw, reception_type, pkt_type; @@ -933,6 +947,9 @@ dp_rx_process(struct dp_intr *int_ctx, void *hal_ring, uint32_t quota) peer_id = DP_PEER_METADATA_PEER_ID_GET( mpdu_desc_info.peer_meta_data); + hal_rx_mpdu_peer_meta_data_set(qdf_nbuf_data(rx_desc->nbuf), + mpdu_desc_info.peer_meta_data); + peer = dp_peer_find_by_id(soc, peer_id); vdev = dp_get_vdev_from_peer(soc, peer_id, peer, @@ -1089,33 +1106,19 @@ done: } } - if (qdf_nbuf_is_chfrag_start(nbuf)) { - peer_mdata = hal_rx_mpdu_peer_meta_data_get - (rx_tlv_hdr); - } - + peer_mdata = hal_rx_mpdu_peer_meta_data_get(rx_tlv_hdr); peer_id = DP_PEER_METADATA_PEER_ID_GET(peer_mdata); peer = dp_peer_find_by_id(soc, peer_id); - /* TODO */ /* - * In case of roaming peer object may not be - * immediately available -- need to handle this - * Cannot drop these packets right away. + * This is a redundant sanity check, Ideally peer + * should never be NULL here. if for any reason it + * is NULL we will assert. + * Do nothing for LFR case. */ - /* Peer lookup failed */ - if (!peer && !vdev) { - dp_rx_process_invalid_peer(soc, nbuf); - DP_STATS_INC_PKT(soc, rx.err.rx_invalid_peer, 1, - qdf_nbuf_len(nbuf)); - /* Drop & free packet */ - qdf_nbuf_free(nbuf); + dp_rx_peer_validity_check(peer); - /* Statistics */ - continue; - } - - if (peer && qdf_unlikely(peer->bss_peer)) { + if (qdf_unlikely(peer->bss_peer)) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO, FL("received pkt with same src MAC")); diff --git a/dp/wifi3.0/hal_rx.h b/dp/wifi3.0/hal_rx.h index 51bc4bc29c6f..977de6d098e0 100644 --- a/dp/wifi3.0/hal_rx.h +++ b/dp/wifi3.0/hal_rx.h @@ -687,6 +687,31 @@ hal_rx_mpdu_peer_meta_data_get(uint8_t *buf) return peer_meta_data; } +#define HAL_RX_MPDU_PEER_META_DATA_SET(_rx_mpdu_info, peer_mdata) \ + ((*(((uint32_t *)_rx_mpdu_info) + \ + (RX_MPDU_INFO_8_PEER_META_DATA_OFFSET >> 2))) = \ + (peer_mdata << RX_MPDU_INFO_8_PEER_META_DATA_LSB) & \ + RX_MPDU_INFO_8_PEER_META_DATA_MASK) + +/* + * @ hal_rx_mpdu_peer_meta_data_set: set peer meta data in RX mpdu start tlv + * + * @ buf: rx_tlv_hdr of the received packet + * @ peer_mdata: peer meta data to be set. + * @ Return: void + */ +static inline void +hal_rx_mpdu_peer_meta_data_set(uint8_t *buf, uint32_t peer_mdata) +{ + struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; + struct rx_mpdu_start *mpdu_start = + &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start; + + struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details; + + HAL_RX_MPDU_PEER_META_DATA_SET(mpdu_info, peer_mdata); +} + #if defined(WCSS_VERSION) && \ ((defined(CONFIG_WIN) && (WCSS_VERSION > 81)) || \ (defined(CONFIG_MCL) && (WCSS_VERSION >= 72)))