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);