qcacmn: add fields to record transmit timestamp in nbuf cb

Add field 'u.tx.pa_ts.ts_value' to store the driver ingress
timestamp, and field 'u.tx.dev.priv_cb_m.flag_ts_valid' to
indicate whether 'u.tx.pa_ts.ts_value' is available or not.
Both fields must be cleared before fragment mapping, to
avoid overlap with the filed 'u.tx.pa_ts.paddr'.

Change-Id: I645c3c27b0c519417f86e6346f4f018b8d87d701
CRs-Fixed: 3560477
Цей коміт міститься в:
Yu Wang
2023-09-04 19:10:23 -07:00
зафіксовано Rahul Choudhary
джерело 5ac8175db3
коміт 8aa054e666
2 змінених файлів з 60 додано та 4 видалено

Переглянути файл

@@ -149,6 +149,8 @@
* @u.tx.dev.priv_cb_m.dma_option.dma_option.reserved: reserved bits for future
* use
* @u.tx.dev.priv_cb_m.flag_notify_comp: reserved
* @u.tx.dev.priv_cb_m.flag_ts_valid: flag to indicate field
* u.tx.pa_ts.ts_value is available, it must be cleared before fragment mapping
* @u.tx.dev.priv_cb_m.rsvd: reserved
* @u.tx.dev.priv_cb_m.reserved: reserved
*
@@ -183,7 +185,9 @@
* @u.tx.trace.print: enable packet logging
*
* @u.tx.vaddr: virtual address of ~
* @u.tx.paddr: physical/DMA address of ~
* @u.tx.pa_ts.paddr: physical/DMA address of ~
* @u.tx.pa_ts.ts_value: driver ingress timestamp, it must be cleared before
* fragment mapping
*/
struct qdf_nbuf_cb {
/* common */
@@ -303,7 +307,8 @@ struct qdf_nbuf_cb {
} dma_option;
uint8_t flag_notify_comp:1,
band:3,
rsvd:4;
flag_ts_valid:1,
rsvd:3;
uint8_t reserved[2];
} priv_cb_m;
} dev;
@@ -337,7 +342,10 @@ struct qdf_nbuf_cb {
print:1;
} trace;
unsigned char *vaddr;
qdf_paddr_t paddr;
union {
qdf_paddr_t paddr;
qdf_ktime_t ts_value;
} pa_ts;
} tx;
} u;
}; /* struct qdf_nbuf_cb: MAX 48 bytes */
@@ -545,7 +553,12 @@ QDF_COMPILE_TIME_ASSERT(qdf_nbuf_cb_size,
#define QDF_NBUF_CB_TX_EXTRA_FRAG_VADDR(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.vaddr)
#define QDF_NBUF_CB_TX_EXTRA_FRAG_PADDR(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.paddr.dma_addr)
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.pa_ts.paddr.dma_addr)
#define QDF_NBUF_CB_TX_TS_VALID(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.priv_cb_m.flag_ts_valid)
#define QDF_NBUF_CB_TX_TS_VALUE(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.pa_ts.ts_value)
/* assume the OS provides a single fragment */
#define __qdf_nbuf_get_num_frags(skb) \
@@ -660,6 +673,22 @@ QDF_COMPILE_TIME_ASSERT(qdf_nbuf_cb_size,
#define __qdf_nbuf_data_attr_set(skb, data_attr) \
(QDF_NBUF_CB_TX_DATA_ATTR(skb) = (data_attr))
#define __qdf_nbuf_set_tx_ts(skb, ts) \
do { \
QDF_NBUF_CB_TX_TS_VALUE(skb) = (ts); \
QDF_NBUF_CB_TX_TS_VALID(skb) = 1; \
} while (0)
#define __qdf_nbuf_clear_tx_ts(skb) \
do { \
QDF_NBUF_CB_TX_TS_VALUE(skb) = 0; \
QDF_NBUF_CB_TX_TS_VALID(skb) = 0; \
} while (0)
#define __qdf_nbuf_get_tx_ts(skb) \
(QDF_NBUF_CB_TX_TS_VALID(skb) ? \
QDF_NBUF_CB_TX_TS_VALUE(skb) : 0)
/**
* __qdf_nbuf_map_nbytes_single() - map nbytes
* @osdev: os device