diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 38d6e2a722..7643916bb3 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -2382,29 +2382,11 @@ void dp_rx_skip_tlvs(struct dp_soc *soc, qdf_nbuf_t nbuf, uint32_t l3_padding) QDF_NBUF_CB_RX_PACKET_L3_HDR_PAD(nbuf) = l3_padding; qdf_nbuf_pull_head(nbuf, l3_padding + soc->rx_pkt_tlv_size); } - -/** - * dp_rx_set_hdr_pad() - set l3 padding in nbuf cb - * @nbuf: pkt skb pointer - * @l3_padding: l3 padding - * - * Return: None - */ -static inline -void dp_rx_set_hdr_pad(qdf_nbuf_t nbuf, uint32_t l3_padding) -{ - QDF_NBUF_CB_RX_PACKET_L3_HDR_PAD(nbuf) = l3_padding; -} #else void dp_rx_skip_tlvs(struct dp_soc *soc, qdf_nbuf_t nbuf, uint32_t l3_padding) { qdf_nbuf_pull_head(nbuf, l3_padding + soc->rx_pkt_tlv_size); } - -static inline -void dp_rx_set_hdr_pad(qdf_nbuf_t nbuf, uint32_t l3_padding) -{ -} #endif #ifndef QCA_HOST_MODE_WIFI_DISABLED diff --git a/dp/wifi3.0/dp_rx.h b/dp/wifi3.0/dp_rx.h index 7189f74e9f..60bf641ba8 100644 --- a/dp/wifi3.0/dp_rx.h +++ b/dp/wifi3.0/dp_rx.h @@ -194,6 +194,26 @@ struct dp_rx_desc { __dp_rx_buffers_replenish(soc, mac_id, rxdma_srng, rx_desc_pool, \ num_buffers, desc_list, tail, __func__) +#ifdef WLAN_SUPPORT_RX_FISA +/** + * dp_rx_set_hdr_pad() - set l3 padding in nbuf cb + * @nbuf: pkt skb pointer + * @l3_padding: l3 padding + * + * Return: None + */ +static inline +void dp_rx_set_hdr_pad(qdf_nbuf_t nbuf, uint32_t l3_padding) +{ + QDF_NBUF_CB_RX_PACKET_L3_HDR_PAD(nbuf) = l3_padding; +} +#else +static inline +void dp_rx_set_hdr_pad(qdf_nbuf_t nbuf, uint32_t l3_padding) +{ +} +#endif + #ifdef DP_RX_SPECIAL_FRAME_NEED /** * dp_rx_is_special_frame() - check is RX frame special needed diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c index d323a7fa94..c136c15fac 100644 --- a/dp/wifi3.0/dp_rx_err.c +++ b/dp/wifi3.0/dp_rx_err.c @@ -475,6 +475,64 @@ dp_rx_pn_error_handle(struct dp_soc *soc, hal_ring_desc_t ring_desc, return rx_bufs_used; } +#ifdef DP_RX_DELIVER_ALL_OOR_FRAMES +/** + * dp_rx_deliver_oor_frame() - deliver OOR frames to stack + * @soc: Datapath soc handler + * @peer: pointer to DP peer + * @nbuf: pointer to the skb of RX frame + * @frame_mask: the mask for speical frame needed + * @rx_tlv_hdr: start of rx tlv header + * + * note: Msdu_len must have been stored in QDF_NBUF_CB_RX_PKT_LEN(nbuf) and + * single nbuf is expected. + * + * return: true - nbuf has been delivered to stack, false - not. + */ +static bool +dp_rx_deliver_oor_frame(struct dp_soc *soc, + struct dp_txrx_peer *txrx_peer, + qdf_nbuf_t nbuf, uint32_t frame_mask, + uint8_t *rx_tlv_hdr) +{ + uint32_t l2_hdr_offset = 0; + uint16_t msdu_len = 0; + uint32_t skip_len; + + l2_hdr_offset = + hal_rx_msdu_end_l3_hdr_padding_get(soc->hal_soc, rx_tlv_hdr); + + if (qdf_unlikely(qdf_nbuf_is_frag(nbuf))) { + skip_len = l2_hdr_offset; + } else { + msdu_len = QDF_NBUF_CB_RX_PKT_LEN(nbuf); + skip_len = l2_hdr_offset + soc->rx_pkt_tlv_size; + qdf_nbuf_set_pktlen(nbuf, msdu_len + skip_len); + } + + QDF_NBUF_CB_RX_NUM_ELEMENTS_IN_LIST(nbuf) = 1; + dp_rx_set_hdr_pad(nbuf, l2_hdr_offset); + qdf_nbuf_pull_head(nbuf, skip_len); + qdf_nbuf_set_exc_frame(nbuf, 1); + + dp_info_rl("OOR frame, mpdu sn 0x%x", + hal_rx_get_rx_sequence(soc->hal_soc, rx_tlv_hdr)); + dp_rx_deliver_to_stack(soc, txrx_peer->vdev, txrx_peer, nbuf, NULL); + return true; +} + +#else +static bool +dp_rx_deliver_oor_frame(struct dp_soc *soc, + struct dp_txrx_peer *txrx_peer, + qdf_nbuf_t nbuf, uint32_t frame_mask, + uint8_t *rx_tlv_hdr) +{ + return dp_rx_deliver_special_frame(soc, txrx_peer, nbuf, frame_mask, + rx_tlv_hdr); +} +#endif + /** * dp_rx_oor_handle() - Handles the msdu which is OOR error * @@ -507,8 +565,8 @@ dp_rx_oor_handle(struct dp_soc *soc, goto free_nbuf; } - if (dp_rx_deliver_special_frame(soc, txrx_peer, nbuf, frame_mask, - rx_tlv_hdr)) { + if (dp_rx_deliver_oor_frame(soc, txrx_peer, nbuf, frame_mask, + rx_tlv_hdr)) { DP_STATS_INC(soc, rx.err.reo_err_oor_to_stack, 1); dp_txrx_peer_unref_delete(txrx_ref_handle, DP_MOD_ID_RX_ERR); return;