Эх сурвалжийг харах

qcawifi: Process full mon via nr_frags

process mon destination buffer via nr_frags if
RX_MON_MEM_FRAG is enabled.

Change-Id: I3c191a13a3a3be01ad4205702f5dcaebe02f9270
CRs-Fixed: 2741793
Ankit Kumar 5 жил өмнө
parent
commit
f7e514b4df

+ 46 - 41
dp/wifi3.0/dp_full_mon.c

@@ -422,13 +422,14 @@ dp_rx_mon_mpdu_reap(struct dp_soc *soc, uint32_t mac_id, void *ring_desc,
 	uint16_t num_msdus = 0, msdu_index, rx_hdr_tlv_len, l3_hdr_pad;
 	uint32_t total_frag_len = 0, frag_len = 0;
 	bool drop_mpdu = false;
-	bool msdu_frag = false;
+	bool msdu_frag = false, is_first_msdu = true, is_frag_non_raw = false;
 	void *link_desc_va;
 	uint8_t *rx_tlv_hdr;
 	qdf_nbuf_t msdu = NULL, last_msdu = NULL;
 	uint32_t rx_link_buf_info[HAL_RX_BUFFINFO_NUM_DWORDS];
 	struct hal_rx_mon_desc_info *desc_info;
 	uint16_t prev_ppdu_id;
+	struct rx_desc_pool *rx_desc_pool = NULL;
 
 	desc_info = pdev->mon_desc;
 
@@ -478,24 +479,43 @@ dp_rx_mon_mpdu_reap(struct dp_soc *soc, uint32_t mac_id, void *ring_desc,
 
 			qdf_assert_always(rx_desc);
 
-			msdu = rx_desc->nbuf;
+			msdu = DP_RX_MON_GET_NBUF_FROM_DESC(rx_desc);
 
 			if (rx_desc->unmapped == 0) {
-				qdf_nbuf_unmap_single(soc->osdev,
-						      msdu,
-						      QDF_DMA_FROM_DEVICE);
+				rx_desc_pool = dp_rx_get_mon_desc_pool(
+					soc, mac_id, pdev->pdev_id);
+				dp_rx_mon_buffer_unmap(soc, rx_desc,
+						       rx_desc_pool->buf_size);
+
 				rx_desc->unmapped = 1;
 			}
 
 			if (drop_mpdu) {
-				qdf_nbuf_free(msdu);
+				dp_rx_mon_buffer_free(rx_desc);
 				msdu = NULL;
 				desc_info->msdu_count--;
 				goto next_msdu;
 			}
 
-			rx_tlv_hdr = qdf_nbuf_data(msdu);
-
+			rx_tlv_hdr = dp_rx_mon_get_buffer_data(rx_desc);
+
+			if (is_first_msdu) {
+				if (dp_rx_mon_alloc_parent_buffer(head_msdu)
+				    != QDF_STATUS_SUCCESS) {
+					DP_STATS_INC(pdev,
+						     replenish.nbuf_alloc_fail,
+						     1);
+					qdf_frag_free(rx_tlv_hdr);
+					QDF_TRACE(QDF_MODULE_ID_DP,
+						  QDF_TRACE_LEVEL_DEBUG,
+						  "[%s] failed to allocate parent buffer to hold all frag",
+						  __func__);
+					drop_mpdu = true;
+					desc_info->msdu_count--;
+					goto next_msdu;
+				}
+				is_first_msdu = false;
+			}
 			if (hal_rx_desc_is_first_msdu(soc->hal_soc,
 						      rx_tlv_hdr))
 				hal_rx_mon_hw_desc_get_mpdu_status(soc->hal_soc,
@@ -508,23 +528,16 @@ dp_rx_mon_mpdu_reap(struct dp_soc *soc, uint32_t mac_id, void *ring_desc,
 			 *   b. calculate the number of fragmented buffers for
 			 *      a msdu and decrement one msdu_count
 			 */
-			if (msdu_list.msdu_info[msdu_index].msdu_flags
-			    & HAL_MSDU_F_MSDU_CONTINUATION) {
-				if (!msdu_frag) {
-					total_frag_len = msdu_list.msdu_info[msdu_index].msdu_len;
-					msdu_frag = true;
-				}
-				dp_mon_adjust_frag_len(&total_frag_len,
-						       &frag_len);
-			} else {
-				if (msdu_frag)
-					dp_mon_adjust_frag_len(&total_frag_len,
-							       &frag_len);
-				else
-					frag_len = msdu_list.msdu_info[msdu_index].msdu_len;
-				msdu_frag = false;
+			dp_rx_mon_parse_desc_buffer(soc,
+					&(msdu_list.msdu_info[msdu_index]),
+						 &msdu_frag,
+						 &total_frag_len,
+						 &frag_len,
+						 &l3_hdr_pad,
+						 rx_tlv_hdr,
+						 &is_frag_non_raw, rx_tlv_hdr);
+			if (!msdu_frag)
 				desc_info->msdu_count--;
-			}
 
 			rx_hdr_tlv_len = SIZE_OF_MONITOR_TLV;
 
@@ -535,9 +548,6 @@ dp_rx_mon_mpdu_reap(struct dp_soc *soc, uint32_t mac_id, void *ring_desc,
 			 * header begins.
 			 */
 
-			l3_hdr_pad = hal_rx_msdu_end_l3_hdr_padding_get(
-								soc->hal_soc,
-								rx_tlv_hdr);
 
 			/*******************************************************
 			 *                    RX_PACKET                        *
@@ -546,17 +556,14 @@ dp_rx_mon_mpdu_reap(struct dp_soc *soc, uint32_t mac_id, void *ring_desc,
 			 * ----------------------------------------------------*
 			 ******************************************************/
 
-			qdf_nbuf_set_pktlen(msdu,
-					    rx_hdr_tlv_len +
-					    l3_hdr_pad +
-					    frag_len);
+			dp_rx_mon_buffer_set_pktlen(msdu,
+						    rx_hdr_tlv_len +
+						    l3_hdr_pad +
+						    frag_len);
 
-			if (head_msdu && !*head_msdu)
-				*head_msdu = msdu;
-			else if (last_msdu)
-				qdf_nbuf_set_next(last_msdu, msdu);
-
-			last_msdu = msdu;
+			dp_rx_mon_add_msdu_to_list(head_msdu, msdu, &last_msdu,
+						   rx_tlv_hdr, frag_len,
+						   l3_hdr_pad);
 
 next_msdu:
 			rx_buf_reaped++;
@@ -592,10 +599,8 @@ next_msdu:
 	}
 	pdev->rx_mon_stats.dest_mpdu_done++;
 
-	if (last_msdu)
-		qdf_nbuf_set_next(last_msdu, NULL);
-
-	*tail_msdu = msdu;
+	dp_rx_mon_init_tail_msdu(msdu, last_msdu, tail_msdu);
+	dp_rx_mon_remove_raw_frame_fcs_len(head_msdu);
 
 	return rx_buf_reaped;
 }

+ 71 - 2
dp/wifi3.0/dp_rx_tag.c

@@ -96,6 +96,39 @@ void dp_rx_update_rx_err_protocol_tag_stats(struct dp_pdev *pdev,
  * Return: void
  */
 #ifdef WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG
+
+#ifdef DP_RX_MON_MEM_FRAG
+/**
+ * dp_rx_update_proto_tag() - Update protocol tag to nbuf cb or to headroom
+ *
+ * @nbuf: QDF pkt buffer on which the protocol tag should be set
+ * @protocol_tag: Protocol tag
+ */
+static inline
+void dp_rx_update_proto_tag(qdf_nbuf_t nbuf, uint16_t protocol_tag)
+{
+	uint8_t idx;
+	uint8_t *nbuf_head = NULL;
+
+	if (qdf_nbuf_get_nr_frags(nbuf)) {
+		/* Get frag index, which was saved while restitch */
+		idx = QDF_NBUF_CB_RX_CTX_ID(nbuf);
+		nbuf_head = qdf_nbuf_head(nbuf);
+		nbuf_head += (idx * DP_RX_MON_PF_TAG_SIZE);
+
+		*((uint16_t *)nbuf_head) = protocol_tag;
+	} else {
+		qdf_nbuf_set_rx_protocol_tag(nbuf, protocol_tag);
+	}
+}
+#else
+static inline
+void dp_rx_update_proto_tag(qdf_nbuf_t nbuf, uint16_t protocol_tag)
+{
+	qdf_nbuf_set_rx_protocol_tag(nbuf, protocol_tag);
+}
+#endif
+
 void
 dp_rx_update_protocol_tag(struct dp_soc *soc, struct dp_vdev *vdev,
 			  qdf_nbuf_t nbuf, uint8_t *rx_tlv_hdr,
@@ -156,7 +189,8 @@ dp_rx_update_protocol_tag(struct dp_soc *soc, struct dp_vdev *vdev,
 	 * received protocol type.
 	 */
 	protocol_tag = pdev->rx_proto_tag_map[cce_metadata].tag;
-	qdf_nbuf_set_rx_protocol_tag(nbuf, protocol_tag);
+
+	dp_rx_update_proto_tag(nbuf, protocol_tag);
 	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_LOW,
 		  "Seq:%u dcap:%u CCE Match:%u ProtoID:%u Tag:%u stats:%u",
 		  hal_rx_get_rx_sequence(soc->hal_soc, rx_tlv_hdr),
@@ -189,6 +223,41 @@ dp_rx_update_protocol_tag(struct dp_soc *soc, struct dp_vdev *vdev,
  * Return: void
  */
 #ifdef WLAN_SUPPORT_RX_FLOW_TAG
+
+#ifdef DP_RX_MON_MEM_FRAG
+/**
+ * dp_rx_update_flow_tags() - Update protocol tag to nbuf cb or to headroom
+ *
+ * @nbuf: QDF pkt buffer on which the protocol tag should be set
+ * @flow_tag: Flow tag
+ */
+static inline
+void dp_rx_update_flow_tags(qdf_nbuf_t nbuf, uint32_t flow_tag)
+{
+	uint8_t idx;
+	uint8_t *nbuf_head = NULL;
+	uint16_t updated_flow_tag = (uint16_t)(flow_tag & 0xFFFF);
+
+	if (qdf_nbuf_get_nr_frags(nbuf)) {
+		/* Get frag index, which was saved while restitch */
+		idx = QDF_NBUF_CB_RX_CTX_ID(nbuf);
+		nbuf_head = qdf_nbuf_head(nbuf);
+		nbuf_head += ((idx * DP_RX_MON_PF_TAG_SIZE) +
+				sizeof(uint16_t));
+
+		*((uint16_t *)nbuf_head) = updated_flow_tag;
+	} else {
+		qdf_nbuf_set_rx_flow_tag(nbuf, flow_tag);
+	}
+}
+#else
+static inline
+void dp_rx_update_flow_tags(qdf_nbuf_t nbuf, uint16_t flow_tag)
+{
+	qdf_nbuf_set_rx_flow_tag(nbuf, flow_tag);
+}
+#endif
+
 void
 dp_rx_update_flow_tag(struct dp_soc *soc, struct dp_vdev *vdev,
 		      qdf_nbuf_t nbuf, uint8_t *rx_tlv_hdr, bool update_stats)
@@ -240,7 +309,7 @@ dp_rx_update_flow_tag(struct dp_soc *soc, struct dp_vdev *vdev,
 	fse_metadata = hal_rx_msdu_fse_metadata_get(soc->hal_soc, rx_tlv_hdr) & 0xFFFF;
 
 	/* update the skb->cb with the user-specified tag/metadata */
-	qdf_nbuf_set_rx_flow_tag(nbuf, fse_metadata);
+	dp_rx_update_flow_tags(nbuf, fse_metadata);
 
 	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_LOW,
 		  "Seq:%u dcap:%u invalid:%u timeout:%u flow:%u tag:%u stat:%u",

+ 4 - 0
dp/wifi3.0/dp_rx_tag.h

@@ -22,6 +22,10 @@
 #include "dp_internal.h"
 #include "dp_types.h"
 
+#ifdef DP_RX_MON_MEM_FRAG
+#define DP_RX_MON_PF_TAG_SIZE (4)
+#endif
+
 #ifdef WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG
 /**
  * dp_update_pdev_rx_protocol_tag - Add/remove a protocol tag that should be