|
@@ -2501,6 +2501,41 @@ static inline void dp_rx_wbm_sg_list_last_msdu_war(struct dp_soc *soc)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+#ifdef RX_DESC_DEBUG_CHECK
|
|
|
+/**
|
|
|
+ * dp_rx_wbm_desc_nbuf_sanity_check - Add sanity check to for WBM rx_desc paddr
|
|
|
+ * corruption
|
|
|
+ *
|
|
|
+ * @ring_desc: REO ring descriptor
|
|
|
+ * @rx_desc: Rx descriptor
|
|
|
+ *
|
|
|
+ * Return: NONE
|
|
|
+ */
|
|
|
+static
|
|
|
+QDF_STATUS dp_rx_wbm_desc_nbuf_sanity_check(struct dp_soc *soc,
|
|
|
+ hal_ring_desc_t ring_desc,
|
|
|
+ struct dp_rx_desc *rx_desc)
|
|
|
+{
|
|
|
+ struct hal_buf_info hbi;
|
|
|
+
|
|
|
+ hal_rx_wbm_rel_buf_paddr_get(soc->hal_soc, ring_desc, &hbi);
|
|
|
+ /* Sanity check for possible buffer paddr corruption */
|
|
|
+ if (dp_rx_desc_paddr_sanity_check(rx_desc, (&hbi)->paddr))
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+static
|
|
|
+QDF_STATUS dp_rx_wbm_desc_nbuf_sanity_check(struct dp_soc *soc,
|
|
|
+ hal_ring_desc_t ring_desc,
|
|
|
+ struct dp_rx_desc *rx_desc)
|
|
|
+{
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
static inline bool
|
|
|
dp_rx_is_sg_formation_required(struct hal_wbm_err_desc_info *info)
|
|
|
{
|
|
@@ -2543,6 +2578,7 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc,
|
|
|
uint8_t msdu_continuation = 0;
|
|
|
bool process_sg_buf = false;
|
|
|
uint32_t wbm_err_src;
|
|
|
+ QDF_STATUS status;
|
|
|
|
|
|
/* Debug -- Remove later */
|
|
|
qdf_assert(soc && hal_ring_hdl);
|
|
@@ -2612,6 +2648,22 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc,
|
|
|
|
|
|
hal_rx_wbm_err_info_get(ring_desc, &wbm_err_info, hal_soc);
|
|
|
nbuf = rx_desc->nbuf;
|
|
|
+
|
|
|
+ status = dp_rx_wbm_desc_nbuf_sanity_check(soc, ring_desc,
|
|
|
+ rx_desc);
|
|
|
+ if (qdf_likely(QDF_IS_STATUS_ERROR(status))) {
|
|
|
+ DP_STATS_INC(soc, rx.err.nbuf_sanity_fail, 1);
|
|
|
+ dp_info_rl("Rx error Nbuf sanity check failure!");
|
|
|
+ rx_desc->in_err_state = 1;
|
|
|
+ rx_desc->unmapped = 1;
|
|
|
+ rx_bufs_reaped[rx_desc->pool_id]++;
|
|
|
+ dp_rx_add_to_free_desc_list(&head[rx_desc->pool_id],
|
|
|
+ &tail[rx_desc->pool_id],
|
|
|
+ rx_desc);
|
|
|
+
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
rx_desc_pool = &soc->rx_desc_buf[rx_desc->pool_id];
|
|
|
dp_ipa_rx_buf_smmu_mapping_lock(soc);
|
|
|
dp_rx_nbuf_unmap_pool(soc, rx_desc_pool, nbuf);
|