Merge "qcacmn: copy peer meta data from reo descriptor to RX TLV"
diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c
index 862655d..a219791 100644
--- a/dp/wifi3.0/dp_rx.c
+++ b/dp/wifi3.0/dp_rx.c
@@ -290,6 +290,12 @@
 	}
 	return vdev;
 }
+/*
+ * In case of LFR, this is an empty inline function
+ */
+static inline void dp_rx_peer_validity_check(struct dp_peer *peer)
+{
+}
 #else
 static inline struct dp_vdev *
 dp_get_vdev_from_peer(struct dp_soc *soc,
@@ -307,6 +313,14 @@
 		return peer->vdev;
 	}
 }
+
+/*
+ * Assert if PEER is NULL
+ */
+static inline void dp_rx_peer_validity_check(struct dp_peer *peer)
+{
+	qdf_assert_always(peer);
+}
 #endif
 
 /**
@@ -846,7 +860,7 @@
 	struct hal_rx_mpdu_desc_info mpdu_desc_info;
 	struct hal_rx_msdu_desc_info msdu_desc_info;
 	enum hal_reo_error_status error;
-	static uint32_t peer_mdata;
+	uint32_t peer_mdata;
 	uint8_t *rx_tlv_hdr;
 	uint32_t rx_bufs_reaped[MAX_PDEV_CNT] = { 0 };
 	uint32_t sgi, mcs, tid, nss, bw, reception_type, pkt_type;
@@ -933,6 +947,9 @@
 		peer_id = DP_PEER_METADATA_PEER_ID_GET(
 				mpdu_desc_info.peer_meta_data);
 
+		hal_rx_mpdu_peer_meta_data_set(qdf_nbuf_data(rx_desc->nbuf),
+						mpdu_desc_info.peer_meta_data);
+
 		peer = dp_peer_find_by_id(soc, peer_id);
 
 		vdev = dp_get_vdev_from_peer(soc, peer_id, peer,
@@ -1089,33 +1106,19 @@
 				}
 			}
 
-			if (qdf_nbuf_is_chfrag_start(nbuf)) {
-				peer_mdata = hal_rx_mpdu_peer_meta_data_get
-								(rx_tlv_hdr);
-			}
-
+			peer_mdata = hal_rx_mpdu_peer_meta_data_get(rx_tlv_hdr);
 			peer_id = DP_PEER_METADATA_PEER_ID_GET(peer_mdata);
 			peer = dp_peer_find_by_id(soc, peer_id);
 
-			/* TODO */
 			/*
-			 * In case of roaming peer object may not be
-			 * immediately available -- need to handle this
-			 * Cannot drop these packets right away.
+			 * This is a redundant sanity check, Ideally peer
+			 * should never be NULL here. if for any reason it
+			 * is NULL we will assert.
+			 * Do nothing for LFR case.
 			 */
-			/* Peer lookup failed */
-			if (!peer && !vdev) {
-				dp_rx_process_invalid_peer(soc, nbuf);
-				DP_STATS_INC_PKT(soc, rx.err.rx_invalid_peer, 1,
-						qdf_nbuf_len(nbuf));
-				/* Drop & free packet */
-				qdf_nbuf_free(nbuf);
+			dp_rx_peer_validity_check(peer);
 
-				/* Statistics */
-				continue;
-			}
-
-			if (peer && qdf_unlikely(peer->bss_peer)) {
+			if (qdf_unlikely(peer->bss_peer)) {
 				QDF_TRACE(QDF_MODULE_ID_DP,
 					QDF_TRACE_LEVEL_INFO,
 					FL("received pkt with same src MAC"));
diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c
index b691bc9..ebfc4f4 100644
--- a/dp/wifi3.0/dp_rx_err.c
+++ b/dp/wifi3.0/dp_rx_err.c
@@ -963,7 +963,6 @@
 	uint32_t rx_bufs_used = 0;
 	uint32_t msdu_cnt;
 	uint32_t i;
-	bool mpdu_err;
 	uint8_t push_reason;
 	uint8_t rxdma_error_code = 0;
 
@@ -972,7 +971,7 @@
 	last = NULL;
 
 	hal_rx_reo_ent_buf_paddr_get(rxdma_dst_ring_desc, &buf_info,
-		&p_last_buf_addr_info, &msdu_cnt, &mpdu_err);
+		&p_last_buf_addr_info, &msdu_cnt);
 
 	push_reason =
 		hal_rx_reo_ent_rxdma_push_reason_get(rxdma_dst_ring_desc);
diff --git a/dp/wifi3.0/dp_rx_mon_dest.c b/dp/wifi3.0/dp_rx_mon_dest.c
index 7d337df..da478a2 100644
--- a/dp/wifi3.0/dp_rx_mon_dest.c
+++ b/dp/wifi3.0/dp_rx_mon_dest.c
@@ -85,6 +85,27 @@
 }
 
 /**
+ * dp_mon_adjust_frag_len() - MPDU and MSDU may spread across
+ *				multiple nbufs. This function
+ *                              is to return data length in
+ *				fragmented buffer
+ *
+ * @total_len: pointer to remaining data length.
+ * @frag_len: poiter to data length in this fragment.
+*/
+static inline void dp_mon_adjust_frag_len(uint32_t *total_len,
+uint32_t *frag_len)
+{
+	if (*total_len >= (RX_BUFFER_SIZE - RX_PKT_TLVS_LEN)) {
+		*frag_len = RX_BUFFER_SIZE - RX_PKT_TLVS_LEN;
+		*total_len -= *frag_len;
+	} else {
+		*frag_len = *total_len;
+		*total_len = 0;
+	}
+}
+
+/**
  * dp_rx_mon_mpdu_pop() - Return a MPDU link descriptor to HW
  *			      (WBM), following error handling
  *
@@ -121,14 +142,23 @@
 	uint32_t msdu_ppdu_id, msdu_cnt;
 	uint8_t *data;
 	uint32_t i;
-	bool mpdu_fcs_err;
+	bool mpdu_err = false;
+	uint32_t total_frag_len, frag_len;
+	bool is_frag, is_first_msdu;
 
 	msdu = 0;
 
 	last = NULL;
 
 	hal_rx_reo_ent_buf_paddr_get(rxdma_dst_ring_desc, &buf_info,
-		&p_last_buf_addr_info, &msdu_cnt, &mpdu_fcs_err);
+		&p_last_buf_addr_info, &msdu_cnt);
+
+	if(HAL_RX_WBM_RXDMA_PSH_RSN_ERROR ==
+		hal_rx_reo_ent_rxdma_push_reason_get(rxdma_dst_ring_desc))
+		mpdu_err = true;
+
+	is_frag = false;
+	is_first_msdu = true;
 
 	do {
 		rx_msdu_link_desc =
@@ -136,13 +166,8 @@
 
 		qdf_assert(rx_msdu_link_desc);
 
-		num_msdus = (msdu_cnt > HAL_RX_NUM_MSDU_DESC) ?
-			HAL_RX_NUM_MSDU_DESC:msdu_cnt;
-
 		hal_rx_msdu_list_get(rx_msdu_link_desc, &msdu_list, &num_msdus);
 
-		msdu_cnt -= num_msdus;
-
 		for (i = 0; i < num_msdus; i++) {
 			uint32_t l2_hdr_offset;
 			struct dp_rx_desc *rx_desc =
@@ -163,8 +188,12 @@
 					__func__, __LINE__, msdu, data);
 
 				rx_desc_tlv = HAL_RX_MON_DEST_GET_DESC(data);
-				msdu_ppdu_id =
+
+				if(is_first_msdu) {
+					msdu_ppdu_id =
 					HAL_RX_MON_HW_DESC_GET_PPDUID_GET(rx_desc_tlv);
+					is_first_msdu = false;
+				}
 
 				QDF_TRACE(QDF_MODULE_ID_DP,
 					QDF_TRACE_LEVEL_DEBUG,
@@ -179,7 +208,7 @@
 					__func__, __LINE__, *ppdu_id,
 					msdu_ppdu_id);
 
-				if (*ppdu_id != msdu_ppdu_id) {
+				if ((*ppdu_id != msdu_ppdu_id) && !mpdu_err) {
 					*ppdu_id = msdu_ppdu_id;
 					return rx_bufs_used;
 				}
@@ -188,6 +217,28 @@
 					hal_rx_mon_hw_desc_get_mpdu_status(rx_desc_tlv,
 						&(dp_pdev->ppdu_info.rx_status));
 
+
+				if(msdu_list.msdu_info[i].msdu_flags &
+					HAL_MSDU_F_MSDU_CONTINUATION) {
+					if(!is_frag) {
+						total_frag_len =
+						msdu_list.msdu_info[i].msdu_len;
+						is_frag = true;
+					}
+					dp_mon_adjust_frag_len(
+						&total_frag_len, &frag_len);
+				} else {
+					if(is_frag) {
+						dp_mon_adjust_frag_len(
+							&total_frag_len, &frag_len);
+					} else {
+						frag_len =
+						msdu_list.msdu_info[i].msdu_len;
+					}
+					is_frag = false;
+					msdu_cnt--;
+				}
+
 				rx_pkt_offset = HAL_RX_MON_HW_RX_DESC_SIZE();
 				/*
 				 * HW structures call this L3 header padding
@@ -199,7 +250,7 @@
 				hal_rx_msdu_end_l3_hdr_padding_get(data);
 
 				rx_buf_size = rx_pkt_offset + l2_hdr_offset
-					+ msdu_list.msdu_info[i].msdu_len;
+					+ frag_len;
 
 				qdf_nbuf_set_pktlen(msdu, rx_buf_size);
 
diff --git a/dp/wifi3.0/hal_rx.h b/dp/wifi3.0/hal_rx.h
index 5e6d31a..977de6d 100644
--- a/dp/wifi3.0/hal_rx.h
+++ b/dp/wifi3.0/hal_rx.h
@@ -687,6 +687,31 @@
 	return peer_meta_data;
 }
 
+#define HAL_RX_MPDU_PEER_META_DATA_SET(_rx_mpdu_info, peer_mdata)	\
+		((*(((uint32_t *)_rx_mpdu_info) +			\
+		(RX_MPDU_INFO_8_PEER_META_DATA_OFFSET >> 2))) =		\
+		(peer_mdata << RX_MPDU_INFO_8_PEER_META_DATA_LSB) &	\
+		RX_MPDU_INFO_8_PEER_META_DATA_MASK)
+
+/*
+ * @ hal_rx_mpdu_peer_meta_data_set: set peer meta data in RX mpdu start tlv
+ *
+ * @ buf: rx_tlv_hdr of the received packet
+ * @ peer_mdata: peer meta data to be set.
+ * @ Return: void
+ */
+static inline void
+hal_rx_mpdu_peer_meta_data_set(uint8_t *buf, uint32_t peer_mdata)
+{
+	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
+	struct rx_mpdu_start *mpdu_start =
+				 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
+
+	struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
+
+	HAL_RX_MPDU_PEER_META_DATA_SET(mpdu_info, peer_mdata);
+}
+
 #if defined(WCSS_VERSION) && \
 	((defined(CONFIG_WIN) && (WCSS_VERSION > 81)) || \
 	 (defined(CONFIG_MCL) && (WCSS_VERSION >= 72)))
@@ -1683,21 +1708,17 @@
 	struct rx_msdu_link *msdu_link = (struct rx_msdu_link *)msdu_link_desc;
 	int i;
 
-	if (*num_msdus > HAL_RX_NUM_MSDU_DESC)
-		*num_msdus = HAL_RX_NUM_MSDU_DESC;
-
 	msdu_details = HAL_RX_LINK_DESC_MSDU0_PTR(msdu_link);
 
 	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
 		"[%s][%d] msdu_link=%p msdu_details=%p\n",
 		__func__, __LINE__, msdu_link, msdu_details);
 
-	for (i = 0; i < *num_msdus; i++) {
+	for (i = 0; i < HAL_RX_NUM_MSDU_DESC; i++) {
 		/* num_msdus received in mpdu descriptor may be incorrect
 		 * sometimes due to HW issue. Check msdu buffer address also */
 		if (HAL_RX_BUFFER_ADDR_31_0_GET(
 			&msdu_details[i].buffer_addr_info_details) == 0) {
-			*num_msdus = i;
 			break;
 		}
 		msdu_desc_info = HAL_RX_MSDU_DESC_INFO_GET(&msdu_details[i]);
@@ -1713,6 +1734,7 @@
 			"[%s][%d] i=%d sw_cookie=%d\n",
 			__func__, __LINE__, i, msdu_list->sw_cookie[i]);
 	}
+	*num_msdus = i;
 }
 
 /**
diff --git a/hal/wifi3.0/hal_api_mon.h b/hal/wifi3.0/hal_api_mon.h
index 8c47ab5..50ec3dc 100644
--- a/hal/wifi3.0/hal_api_mon.h
+++ b/hal/wifi3.0/hal_api_mon.h
@@ -158,12 +158,13 @@
 static inline
 uint32_t HAL_RX_MON_HW_DESC_GET_PPDUID_GET(void *hw_desc_addr)
 {
-	struct rx_attention *rx_attn;
+	struct rx_mpdu_info *rx_mpdu_info;
 	struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)hw_desc_addr;
 
-	rx_attn = &rx_desc->attn_tlv.rx_attn;
+	rx_mpdu_info =
+		&rx_desc->mpdu_start_tlv.rx_mpdu_start.rx_mpdu_info_details;
 
-	return HAL_RX_GET(rx_attn, RX_ATTENTION_0, PHY_PPDU_ID);
+	return HAL_RX_GET(rx_mpdu_info, RX_MPDU_INFO_0, PHY_PPDU_ID);
 }
 
 /* TODO: Move all Rx descriptor functions to hal_rx.h to avoid duplication */
@@ -205,15 +206,13 @@
  * the current descriptor
  * @ buf_info: structure to return the buffer information
  * @ msdu_cnt: pointer to msdu count in MPDU
- * @ mpdu_fcs_err: pointer to valuable of mpdu fcs error
  * Return: void
  */
 static inline
 void hal_rx_reo_ent_buf_paddr_get(void *rx_desc,
 	struct hal_buf_info *buf_info,
 	void **pp_buf_addr_info,
-	uint32_t *msdu_cnt,
-	bool *mpdu_fcs_err
+	uint32_t *msdu_cnt
 )
 {
 	struct reo_entrance_ring *reo_ent_ring =
@@ -221,24 +220,10 @@
 	struct buffer_addr_info *buf_addr_info;
 	struct rx_mpdu_desc_info *rx_mpdu_desc_info_details;
 	uint32_t loop_cnt;
-	uint32_t rxdma_push_reason;
-	uint32_t rxdma_error_code;
 
 	rx_mpdu_desc_info_details =
 	&reo_ent_ring->reo_level_mpdu_frame_info.rx_mpdu_desc_info_details;
 
-	rxdma_push_reason = HAL_RX_GET(reo_ent_ring, REO_ENTRANCE_RING_6,
-			RXDMA_PUSH_REASON);
-
-	*mpdu_fcs_err = false;
-
-	if (rxdma_push_reason == HAL_RX_WBM_RXDMA_PSH_RSN_ERROR) {
-		rxdma_error_code = HAL_RX_GET(reo_ent_ring,
-			REO_ENTRANCE_RING_6, RXDMA_ERROR_CODE);
-		if (rxdma_error_code == HAL_RXDMA_ERR_FCS)
-			*mpdu_fcs_err = true;
-	}
-
 	*msdu_cnt = HAL_RX_GET(rx_mpdu_desc_info_details,
 				RX_MPDU_DESC_INFO_0, MSDU_COUNT);
 
diff --git a/qdf/inc/qdf_nbuf.h b/qdf/inc/qdf_nbuf.h
index 408a98e..3db5e72 100644
--- a/qdf/inc/qdf_nbuf.h
+++ b/qdf/inc/qdf_nbuf.h
@@ -557,9 +557,9 @@
 }
 
 static inline void
-qdf_nbuf_set_vdev_ctx(qdf_nbuf_t buf, void *vdev_ctx)
+qdf_nbuf_set_vdev_ctx(qdf_nbuf_t buf, uint8_t vdev_id)
 {
-	__qdf_nbuf_set_vdev_ctx(buf, vdev_ctx);
+	__qdf_nbuf_set_vdev_ctx(buf, vdev_id);
 }
 
 static inline void
@@ -569,12 +569,18 @@
 }
 
 static inline void
+qdf_nbuf_set_ext_cb(qdf_nbuf_t buf, void *ref)
+{
+	__qdf_nbuf_set_ext_cb(buf, ref);
+}
+
+static inline void
 qdf_nbuf_set_fctx_type(qdf_nbuf_t buf, void *ctx, uint8_t type)
 {
 	__qdf_nbuf_set_fctx_type(buf, ctx, type);
 }
 
-static inline void *
+static inline uint8_t
 qdf_nbuf_get_vdev_ctx(qdf_nbuf_t buf)
 {
 	return  __qdf_nbuf_get_vdev_ctx(buf);
@@ -590,6 +596,12 @@
 	return  __qdf_nbuf_get_ftype(buf);
 }
 
+static inline void *
+qdf_nbuf_get_ext_cb(qdf_nbuf_t buf)
+{
+	return  __qdf_nbuf_get_ext_cb(buf);
+}
+
 static inline qdf_dma_addr_t
 qdf_nbuf_mapped_paddr_get(qdf_nbuf_t buf)
 {
@@ -2349,4 +2361,42 @@
 	 __qdf_nbuf_reg_free_cb(cb_func_ptr);
 }
 
+/**
+ * qdf_nbuf_set_timestamp() - set the timestamp for frame
+ *
+ * @buf: sk buff
+ *
+ * Return: void
+ */
+static inline void
+qdf_nbuf_set_timestamp(struct sk_buff *skb)
+{
+	__qdf_nbuf_set_timestamp(skb);
+}
+
+/**
+ * qdf_nbuf_get_timedelta_ms() - get time difference in ms
+ *
+ * @buf: sk buff
+ *
+ * Return: time difference ms
+ */
+static inline uint64_t
+qdf_nbuf_get_timedelta_ms(struct sk_buff *skb)
+{
+	return __qdf_nbuf_get_timedelta_ms(skb);
+}
+
+/**
+ * qdf_nbuf_get_timedelta_us() - get time difference in micro seconds
+ *
+ * @buf: sk buff
+ *
+ * Return: time difference in micro seconds
+ */
+static inline uint64_t
+qdf_nbuf_get_timedelta_us(struct sk_buff *skb)
+{
+	return __qdf_nbuf_get_timedelta_us(skb);
+}
 #endif /* _QDF_NBUF_H */
diff --git a/qdf/linux/src/i_qdf_nbuf.h b/qdf/linux/src/i_qdf_nbuf.h
index 2bbd82d..8f8c9d7 100644
--- a/qdf/linux/src/i_qdf_nbuf.h
+++ b/qdf/linux/src/i_qdf_nbuf.h
@@ -178,26 +178,22 @@
 						uint8_t u8;
 					} flags;
 					uint8_t ftype;
-
-					union {
-						struct {
-							uint8_t packet_state:7,
-								is_packet_priv:1;
-							uint8_t packet_track:4,
-								proto_type:4;
-							uint8_t dp_trace:1,
-								is_bcast:1,
-								is_mcast:1,
-								packet_type:3,
-								/* used only for hl*/
-								htt2_frm:1,
-								print:1;
-							uint8_t vdev_id;
-						} trace;
-						uint32_t submit_ts;
-					} u;
+					uint8_t vdev_id;
+					struct {
+						uint8_t packet_state:7,
+						is_packet_priv:1;
+						uint8_t packet_track:4,
+							proto_type:4;
+						uint8_t dp_trace:1,
+							is_bcast:1,
+							is_mcast:1,
+							packet_type:3,
+						/* used only for hl*/
+							htt2_frm:1,
+							print:1;
+					} trace;
 					void *fctx;
-					void *vdev_ctx;
+					void *ext_cb_ptr;
 				} win;
 				struct {
 					uint16_t len;
@@ -360,8 +356,10 @@
 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.fctx)
 
 #define QDF_NBUF_CB_TX_VDEV_CTX(skb) \
-		(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.vdev_ctx)
+		(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.vdev_id)
 
+#define QDF_NBUF_CB_TX_EXT_CB(skb) \
+	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.ext_cb_ptr)
 
 #ifndef CONFIG_WIN
 
@@ -414,54 +412,51 @@
 
 #define QDF_NBUF_CB_TX_PACKET_STATE(skb)\
 	(((struct qdf_nbuf_cb *) \
-		((skb)->cb))->u.tx.dev.win.u.trace.packet_state)
+		((skb)->cb))->u.tx.dev.win.trace.packet_state)
 
 #define QDF_NBUF_CB_TX_IS_PACKET_PRIV(skb) \
 	(((struct qdf_nbuf_cb *) \
-		((skb)->cb))->u.tx.dev.win.u.trace.is_packet_priv)
+		((skb)->cb))->u.tx.dev.win.trace.is_packet_priv)
 
 #define QDF_NBUF_CB_TX_PACKET_TRACK(skb)\
 	(((struct qdf_nbuf_cb *) \
-		((skb)->cb))->u.tx.dev.win.u.trace.packet_track)
-
-#define QDF_NBUF_CB_TX_SUBMIT_TS(skb) \
-	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.u.submit_ts)
+		((skb)->cb))->u.tx.dev.win.trace.packet_track)
 
 #define QDF_NBUF_CB_TX_PROTO_TYPE(skb)\
 	(((struct qdf_nbuf_cb *) \
-		((skb)->cb))->u.tx.dev.win.u.trace.proto_type)
+		((skb)->cb))->u.tx.dev.win.trace.proto_type)
 
 #define QDF_NBUF_GET_PACKET_TRACK(skb)\
 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.u.trace.packet_track)
 
 #define QDF_NBUF_CB_TX_DP_TRACE(skb)\
-	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.u.trace.dp_trace)
+	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.trace.dp_trace)
 
 #define QDF_NBUF_CB_DP_TRACE_PRINT(skb)	\
-	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.u.trace.print)
+	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.trace.print)
 
 #define QDF_NBUF_CB_TX_HL_HTT2_FRM(skb)	\
-	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.u.trace.htt2_frm)
+	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.trace.htt2_frm)
 
 #define QDF_NBUF_CB_TX_VDEV_ID(skb)\
-	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.u.trace.vdev_id)
+	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.trace.vdev_id)
 
 #define QDF_NBUF_CB_GET_IS_BCAST(skb)\
-	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.u.trace.is_bcast)
+	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.trace.is_bcast)
 
 #define QDF_NBUF_CB_GET_IS_MCAST(skb)\
-	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.u.trace.is_mcast)
+	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.trace.is_mcast)
 
 #define QDF_NBUF_CB_GET_PACKET_TYPE(skb)\
-	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.u.trace.packet_type)
+	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.trace.packet_type)
 
 #define QDF_NBUF_CB_SET_BCAST(skb) \
 	(((struct qdf_nbuf_cb *) \
-		((skb)->cb))->u.tx.dev.win.u.trace.is_bcast = true)
+		((skb)->cb))->u.tx.dev.win.trace.is_bcast = true)
 
 #define QDF_NBUF_CB_SET_MCAST(skb) \
 	(((struct qdf_nbuf_cb *) \
-		((skb)->cb))->u.tx.dev.win.u.trace.is_mcast = true)
+		((skb)->cb))->u.tx.dev.win.trace.is_mcast = true)
 
 #define QDF_NBUF_CB_TX_FTYPE(skb) \
 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.ftype)
@@ -529,8 +524,10 @@
 							      is_wstrm; \
 	} while (0)
 
-#define __qdf_nbuf_set_vdev_ctx(skb, vdev_ctx) \
-	(QDF_NBUF_CB_TX_VDEV_CTX((skb)) = (vdev_ctx))
+#define __qdf_nbuf_set_vdev_ctx(skb, vdev_id) \
+	do { \
+		QDF_NBUF_CB_TX_VDEV_CTX((skb)) = (vdev_id); \
+	} while (0)
 
 #define __qdf_nbuf_get_vdev_ctx(skb) \
 	QDF_NBUF_CB_TX_VDEV_CTX((skb))
@@ -552,6 +549,14 @@
 #define __qdf_nbuf_get_ftype(skb) \
 		 QDF_NBUF_CB_TX_FTYPE((skb))
 
+#define __qdf_nbuf_set_ext_cb(skb, ref) \
+	do { \
+		QDF_NBUF_CB_TX_EXT_CB((skb)) = (ref); \
+	} while (0)
+
+#define __qdf_nbuf_get_ext_cb(skb) \
+	QDF_NBUF_CB_TX_EXT_CB((skb))
+
 #define __qdf_nbuf_set_chfrag_start(skb, val) \
 	((QDF_NBUF_CB_TX_EXTRA_FRAG_FLAGS_CHFRAG_START((skb))) = val)
 
@@ -1842,4 +1847,43 @@
 {
 	return skb->queue_mapping;
 }
+
+/**
+ * __qdf_nbuf_set_timestamp() - set the timestamp for frame
+ *
+ * @buf: sk buff
+ *
+ * Return: void
+ */
+static inline void
+__qdf_nbuf_set_timestamp(struct sk_buff *skb)
+{
+	__net_timestamp(skb);
+}
+
+/**
+ * __qdf_nbuf_get_timedelta_ms() - get time difference in ms
+ *
+ * @buf: sk buff
+ *
+ * Return: time difference in ms
+ */
+static inline uint64_t
+__qdf_nbuf_get_timedelta_ms(struct sk_buff *skb)
+{
+	return ktime_to_ms(net_timedelta(skb->tstamp));
+}
+
+/**
+ * __qdf_nbuf_get_timedelta_us() - get time difference in micro seconds
+ *
+ * @buf: sk buff
+ *
+ * Return: time difference in micro seconds
+ */
+static inline uint64_t
+__qdf_nbuf_get_timedelta_us(struct sk_buff *skb)
+{
+	return ktime_to_us(net_timedelta(skb->tstamp));
+}
 #endif /*_I_QDF_NET_BUF_H */
diff --git a/qdf/linux/src/i_qdf_trace.h b/qdf/linux/src/i_qdf_trace.h
index 5c53f1b..e6ad92a 100644
--- a/qdf/linux/src/i_qdf_trace.h
+++ b/qdf/linux/src/i_qdf_trace.h
@@ -131,7 +131,7 @@
 #ifdef KSYM_SYMBOL_LEN
 #define __QDF_SYMBOL_LEN KSYM_SYMBOL_LEN
 #else
-#define __QDF_SYMBOL_LEN 0
+#define __QDF_SYMBOL_LEN 1
 #endif
 
 #endif /* __I_QDF_TRACE_H */
diff --git a/scheduler/src/scheduler_api.c b/scheduler/src/scheduler_api.c
index ef0c0dd..5e3e17d 100644
--- a/scheduler/src/scheduler_api.c
+++ b/scheduler/src/scheduler_api.c
@@ -63,11 +63,13 @@
 				"%s: sched_ctx == NULL", __func__);
 		return QDF_STATUS_E_FAILURE;
 	}
+
 	/* shut down scheduler thread */
 	qdf_set_bit(MC_SHUTDOWN_EVENT_MASK, &sched_ctx->sch_event_flag);
 	qdf_set_bit(MC_POST_EVENT_MASK, &sched_ctx->sch_event_flag);
 	qdf_wake_up_interruptible(&sched_ctx->sch_wait_queue);
-	/* Wait for MC to exit */
+
+	/* Wait for scheduler thread to exit */
 	qdf_wait_single_event(&sched_ctx->sch_shutdown, 0);
 	sched_ctx->sch_thread = 0;
 
@@ -84,27 +86,32 @@
 
 static inline void scheduler_watchdog_notify(struct scheduler_ctx *sched)
 {
-	char symbol[QDF_SYMBOL_LEN] = "<null>";
+	char symbol[QDF_SYMBOL_LEN];
 
 	if (sched->watchdog_callback)
 		qdf_sprint_symbol(symbol, sched->watchdog_callback);
 
-	QDF_TRACE(QDF_MODULE_ID_SCHEDULER, QDF_TRACE_LEVEL_ERROR,
-		  "%s: Callback %s (type 0x%x) has exceeded its allotted time of %ds",
-		  __func__, symbol, sched->watchdog_msg_type,
-		  SCHEDULER_WATCHDOG_TIMEOUT / 1000);
+	sched_err("Callback %s (type 0x%x) exceeded its allotted time of %ds",
+		  sched->watchdog_callback ? symbol : "<null>",
+		  sched->watchdog_msg_type, SCHEDULER_WATCHDOG_TIMEOUT / 1000);
 }
 
 #ifdef CONFIG_SLUB_DEBUG_ON
-static void scheduler_watchdog_bite(void *arg)
+static void scheduler_watchdog_timeout(void *arg)
 {
-	scheduler_watchdog_notify((struct scheduler_ctx *)arg);
-	QDF_TRACE(QDF_MODULE_ID_SCHEDULER, QDF_TRACE_LEVEL_ERROR,
-		  "%s: Going down for Scheduler Watchdog Bite!", __func__);
+	struct scheduler_ctx *sched = arg;
+
+	scheduler_watchdog_notify(sched);
+
+	/* avoid crashing during shutdown */
+	if (qdf_test_bit(MC_SHUTDOWN_EVENT_MASK, &sched->sch_event_flag))
+		return;
+
+	sched_fatal("Going down for Scheduler Watchdog Bite!");
 	QDF_BUG(0);
 }
 #else
-static void scheduler_watchdog_bite(void *arg)
+static void scheduler_watchdog_timeout(void *arg)
 {
 	scheduler_watchdog_notify((struct scheduler_ctx *)arg);
 }
@@ -130,7 +137,7 @@
 	sched_ctx->sch_event_flag = 0;
 	qdf_timer_init(NULL,
 		       &sched_ctx->watchdog_timer,
-		       &scheduler_watchdog_bite,
+		       &scheduler_watchdog_timeout,
 		       sched_ctx,
 		       QDF_TIMER_TYPE_SW);