qcacmn: Allow all OOR frames to deliver to stack

Few APs are sending bar frame right after sending a
packet but the packet is not received and its retry
is received with the same sequence number. As SSN
is moved ahead due to bar frame, this packet is being
dropped.
To fix this, allow all frames to get delivered to stack.

Change-Id: I17f7126c8d318415e88b037b72563cf53cb14066
CRs-Fixed: 3151908
This commit is contained in:
Ananya Gupta
2022-03-16 16:55:36 +05:30
committed by Madan Koyyalamudi
parent ff6dd1fab7
commit 42dd66b280
3 changed files with 80 additions and 20 deletions

View File

@@ -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_CB_RX_PACKET_L3_HDR_PAD(nbuf) = l3_padding;
qdf_nbuf_pull_head(nbuf, l3_padding + soc->rx_pkt_tlv_size); 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 #else
void dp_rx_skip_tlvs(struct dp_soc *soc, qdf_nbuf_t nbuf, uint32_t l3_padding) 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); 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 #endif
#ifndef QCA_HOST_MODE_WIFI_DISABLED #ifndef QCA_HOST_MODE_WIFI_DISABLED

View File

@@ -194,6 +194,26 @@ struct dp_rx_desc {
__dp_rx_buffers_replenish(soc, mac_id, rxdma_srng, rx_desc_pool, \ __dp_rx_buffers_replenish(soc, mac_id, rxdma_srng, rx_desc_pool, \
num_buffers, desc_list, tail, __func__) 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 #ifdef DP_RX_SPECIAL_FRAME_NEED
/** /**
* dp_rx_is_special_frame() - check is RX frame special needed * dp_rx_is_special_frame() - check is RX frame special needed

View File

@@ -475,6 +475,64 @@ dp_rx_pn_error_handle(struct dp_soc *soc, hal_ring_desc_t ring_desc,
return rx_bufs_used; 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 * 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; goto free_nbuf;
} }
if (dp_rx_deliver_special_frame(soc, txrx_peer, nbuf, frame_mask, if (dp_rx_deliver_oor_frame(soc, txrx_peer, nbuf, frame_mask,
rx_tlv_hdr)) { rx_tlv_hdr)) {
DP_STATS_INC(soc, rx.err.reo_err_oor_to_stack, 1); 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); dp_txrx_peer_unref_delete(txrx_ref_handle, DP_MOD_ID_RX_ERR);
return; return;