qcacmn: fix rx path dma-inv-range, unmap-single issues

In case of duplicated rx descriptors from hardware,
it will hit issues in __dma_inv_range(), __qdf_nbuf_unmap_single.
Detect the duplicates, skip processing them, drop the mpdu.

CRs-Fixed: 2413816
Change-Id: I7efd4b0c1bda5578578927bb22fe9d487758897d
This commit is contained in:
nwzhao
2019-02-14 11:54:25 -08:00
committed by nshrivas
vanhempi 3b2666f1a5
commit d7196d8dd4
2 muutettua tiedostoa jossa 28 lisäystä ja 11 poistoa

Näytä tiedosto

@@ -273,6 +273,7 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
bool is_frag, is_first_msdu;
bool drop_mpdu = false;
uint8_t bm_action = HAL_BM_ACTION_PUT_IN_IDLE_LIST;
uint64_t nbuf_paddr = 0;
msdu = 0;
@@ -318,22 +319,30 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
uint32_t l2_hdr_offset;
struct dp_rx_desc *rx_desc = NULL;
/* WAR for duplicate buffers received from HW */
if (qdf_unlikely(dp_pdev->mon_last_buf_cookie ==
msdu_list.sw_cookie[i])) {
/* Skip duplicate buffer and drop subsequent
* buffers in this MPDU
*/
drop_mpdu = true;
dp_pdev->rx_mon_stats.dup_mon_buf_cnt++;
continue;
}
rx_desc = dp_rx_get_mon_desc(soc,
msdu_list.sw_cookie[i]);
qdf_assert_always(rx_desc);
msdu = rx_desc->nbuf;
if (msdu)
nbuf_paddr = qdf_nbuf_get_frag_paddr(msdu, 0);
/* WAR for duplicate buffers received from HW */
if (qdf_unlikely(dp_pdev->mon_last_buf_cookie ==
msdu_list.sw_cookie[i] ||
!msdu ||
msdu_list.paddr[i] != nbuf_paddr ||
!rx_desc->in_use)) {
/* Skip duplicate buffer and drop subsequent
* buffers in this MPDU
*/
drop_mpdu = true;
dp_pdev->rx_mon_stats.dup_mon_buf_cnt++;
dp_pdev->mon_last_linkdesc_paddr =
buf_info.paddr;
continue;
}
if (rx_desc->unmapped == 0) {
qdf_nbuf_unmap_single(soc->osdev, msdu,
QDF_DMA_FROM_DEVICE);
@@ -341,6 +350,8 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
}
if (drop_mpdu) {
dp_pdev->mon_last_linkdesc_paddr =
buf_info.paddr;
qdf_nbuf_free(msdu);
msdu = NULL;
goto next_msdu;