Преглед изворни кода

qcacmn: Raw Mode AMSDU msdu ext desc not working

For RAW Mode AMSDU when multiple fragments will come
address for first fragment getting updated but other
fragments were not getting updated properly.Fix updated
all the fragment address.

Change-Id: Ie450bcd4e467cca779d0280d76ce7b4ace1dffc2
Ruchi, Agrawal пре 7 година
родитељ
комит
d8532ff2a0
1 измењених фајлова са 26 додато и 9 уклоњено
  1. 26 9
      dp/wifi3.0/dp_tx.c

+ 26 - 9
dp/wifi3.0/dp_tx.c

@@ -725,6 +725,7 @@ static qdf_nbuf_t dp_tx_prepare_raw(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
 	uint16_t total_len = 0;
 	qdf_dma_addr_t paddr;
 	int32_t i;
+	int32_t mapped_buf_num = 0;
 
 	struct dp_tx_sg_info_s *sg_info = &msdu_info->u.sg_info;
 	qdf_dot3_qosframe_t *qos_wh = (qdf_dot3_qosframe_t *) nbuf->data;
@@ -735,16 +736,18 @@ static qdf_nbuf_t dp_tx_prepare_raw(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
 	if (qos_wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_QOS)
 		qos_wh->i_fc[1] |= IEEE80211_FC1_WEP;
 
-	if (QDF_STATUS_SUCCESS != qdf_nbuf_map(vdev->osdev, nbuf,
-				QDF_DMA_TO_DEVICE)) {
-		qdf_print("dma map error\n");
-		DP_STATS_INC(vdev, tx_i.raw.dma_map_error, 1);
-		qdf_nbuf_free(nbuf);
-		return NULL;
-	}
-
 	for (curr_nbuf = nbuf, i = 0; curr_nbuf;
-				curr_nbuf = qdf_nbuf_next(curr_nbuf), i++) {
+			curr_nbuf = qdf_nbuf_next(curr_nbuf), i++) {
+
+		if (QDF_STATUS_SUCCESS != qdf_nbuf_map(vdev->osdev, curr_nbuf,
+					QDF_DMA_TO_DEVICE)) {
+			QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+				"%s dma map error \n", __func__);
+			DP_STATS_INC(vdev, tx_i.raw.dma_map_error, 1);
+			mapped_buf_num = i;
+			goto error;
+		}
+
 		paddr = qdf_nbuf_get_frag_paddr(curr_nbuf, 0);
 		seg_info->frags[i].paddr_lo = paddr;
 		seg_info->frags[i].paddr_hi = ((uint64_t)paddr >> 32);
@@ -763,6 +766,20 @@ static qdf_nbuf_t dp_tx_prepare_raw(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
 	msdu_info->num_seg = 1;
 
 	return nbuf;
+
+error:
+	i = 0;
+	while (nbuf) {
+		curr_nbuf = nbuf;
+		if (i < mapped_buf_num) {
+			qdf_nbuf_unmap(vdev->osdev, curr_nbuf, QDF_DMA_TO_DEVICE);
+			i++;
+		}
+		nbuf = qdf_nbuf_next(nbuf);
+		qdf_nbuf_free(curr_nbuf);
+	}
+	return NULL;
+
 }
 
 /**