ソースを参照

qcacmn: Fix rx packet queue processsing

- Ensure the head and tail pointers are reset after
processing the packets on each vdev
- Ensure the network buffer is null terminated when
processing the null queue

Change-Id: I7bfab46b7fc6054e782f7f1fc09dd56a58e46a4d
CRs-Fixed: 2001835
Dhanashri Atre 8 年 前
コミット
bda02dc9c2
2 ファイル変更14 行追加4 行削除
  1. 2 2
      dp/wifi3.0/dp_rx.c
  2. 12 2
      dp/wifi3.0/dp_rx_err.c

+ 2 - 2
dp/wifi3.0/dp_rx.c

@@ -194,8 +194,6 @@ dp_rx_process(struct dp_soc *soc, void *hal_ring, uint32_t quota)
 	void *ring_desc;
 	struct dp_rx_desc *rx_desc;
 	qdf_nbuf_t nbuf;
-	qdf_nbuf_t deliver_list_head = NULL;
-	qdf_nbuf_t deliver_list_tail = NULL;
 	union dp_rx_desc_list_elem_t *head = NULL;
 	union dp_rx_desc_list_elem_t *tail = NULL;
 	uint32_t rx_bufs_used = 0, rx_buf_cookie, l2_hdr_offset;
@@ -311,6 +309,8 @@ done:
 	}
 
 	TAILQ_FOREACH(vdev, &pdev->vdev_list, vdev_list_elem) {
+		qdf_nbuf_t deliver_list_head = NULL;
+		qdf_nbuf_t deliver_list_tail = NULL;
 
 		while ((nbuf = qdf_nbuf_queue_remove(&vdev->rxq))) {
 			rx_tlv_hdr = qdf_nbuf_data(nbuf);

+ 12 - 2
dp/wifi3.0/dp_rx_err.c

@@ -261,7 +261,7 @@ dp_rx_null_q_desc_handle(struct dp_soc *soc, void *ring_desc,
 	struct dp_pdev *pdev0;
 	struct dp_vdev *vdev0;
 	uint32_t tid = 0;
-	uint16_t peer_id;
+	uint16_t peer_id = 0xFFFF;
 	struct dp_peer *peer = NULL;
 
 	rx_buf_cookie = HAL_RX_WBM_BUF_COOKIE_GET(ring_desc);
@@ -325,6 +325,16 @@ dp_rx_null_q_desc_handle(struct dp_soc *soc, void *ring_desc,
 		}
 	}
 
+#ifdef QCA_WIFI_NAPIER_EMULATION /* Debug code, remove later */
+	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+		 "%s: p_id %d msdu_len %d hdr_off %d",
+		 __func__, peer_id, msdu_len, l2_hdr_offset);
+
+	print_hex_dump(KERN_ERR,
+		 "\t Pkt Data:", DUMP_PREFIX_NONE, 32, 4,
+		qdf_nbuf_data(nbuf), 128, false);
+#endif /* NAPIER_EMULATION */
+
 	pdev0 = soc->pdev_list[0];/* Hard code 0th elem */
 
 	if (pdev0) {
@@ -333,7 +343,7 @@ dp_rx_null_q_desc_handle(struct dp_soc *soc, void *ring_desc,
 			QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO,
 				FL("pdev0 %p vdev0 %p osif_rx %p"), pdev0, vdev0,
 				vdev0->osif_rx);
-
+			qdf_nbuf_set_next(nbuf, NULL);
 			vdev0->osif_rx(vdev0->osif_vdev, nbuf);
 		} else {
 			QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,