Forráskód Böngészése

qcacmn: Add rawmode tx support for lithium

Added raw mode descriptor preparation support in tx path when packet is
in Interface configured in raw mode.

Change-Id: I3159bce9ec6f3cd86ccfb157c51d1cb5f6412b89
Venkateswara Swamy Bandaru 8 éve
szülő
commit
99075965f8
1 módosított fájl, 39 hozzáadás és 3 törlés
  1. 39 3
      dp/wifi3.0/dp_tx.c

+ 39 - 3
dp/wifi3.0/dp_tx.c

@@ -443,17 +443,51 @@ failure:
 }
 
 /**
- * dp_tx_prepare_send_raw() - Prepare RAW packet TX
+ * dp_tx_prepare_raw() - Prepare RAW packet TX
  * @vdev: DP vdev handle
  * @nbuf: buffer pointer
+ * @seg_info: Pointer to Segment info Descriptor to be prepared
  * @msdu_info: MSDU info to be setup in MSDU descriptor and MSDU extension
  *     descriptor
  *
  * Return:
  */
 static qdf_nbuf_t dp_tx_prepare_raw(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
-				    struct dp_tx_msdu_info_s *msdu_info)
+	struct dp_tx_seg_info_s *seg_info, struct dp_tx_msdu_info_s *msdu_info)
 {
+	qdf_nbuf_t curr_nbuf = NULL;
+	uint16_t total_len = 0;
+	int32_t i;
+
+	struct dp_tx_sg_info_s *sg_info = &msdu_info->u.sg_info;
+
+	if (QDF_STATUS_SUCCESS != qdf_nbuf_map_nbytes_single(vdev->osdev, nbuf,
+				QDF_DMA_TO_DEVICE,
+				qdf_nbuf_len(nbuf))) {
+		qdf_print("dma map error\n");
+		qdf_nbuf_free(nbuf);
+		return NULL;
+	}
+
+	for (curr_nbuf = nbuf, i = 0; curr_nbuf;
+				curr_nbuf = qdf_nbuf_next(nbuf), i++) {
+		seg_info->frags[i].paddr_lo =
+			qdf_nbuf_get_frag_paddr(curr_nbuf, 0);
+		seg_info->frags[i].paddr_hi = 0x0;
+		seg_info->frags[i].len = qdf_nbuf_len(curr_nbuf);
+		seg_info->frags[i].vaddr = (void *) curr_nbuf;
+		total_len += qdf_nbuf_len(curr_nbuf);
+	}
+
+	seg_info->frag_cnt = i;
+	seg_info->total_len = total_len;
+	seg_info->next = NULL;
+
+	sg_info->curr_seg = seg_info;
+
+	msdu_info->frm_type = dp_tx_frm_raw;
+	msdu_info->num_seg = 1;
+
 	return nbuf;
 }
 
@@ -913,7 +947,9 @@ qdf_nbuf_t dp_tx_send(void *vap_dev, qdf_nbuf_t nbuf)
 
 	/* RAW */
 	if (qdf_unlikely(vdev->tx_encap_type == htt_pkt_type_raw)) {
-		nbuf = dp_tx_prepare_raw(vdev, nbuf, &msdu_info);
+		nbuf = dp_tx_prepare_raw(vdev, nbuf, &seg_info, &msdu_info);
+		if (nbuf == NULL)
+			return NULL;
 
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
 			  "%s Raw frame %p\n", __func__, vdev);