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:

committed by
Madan Koyyalamudi

parent
ff6dd1fab7
commit
42dd66b280
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user