xref: /wlan-dirver/qca-wifi-host-cmn/qdf/linux/src/i_qdf_nbuf_w.h (revision 2f4b444fb7e689b83a4ab0e7b3b38f0bf4def8e0)
1 /*
2  * Copyright (c) 2014-2021 The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for
5  * any purpose with or without fee is hereby granted, provided that the
6  * above copyright notice and this permission notice appear in all
7  * copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16  * PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 /**
20  * DOC: i_qdf_nbuf_w.h
21  *
22  * This file provides platform specific nbuf API's.
23  * Included by i_qdf_nbuf.h and should not be included
24  * directly from other files.
25  */
26 
27 #ifndef _I_QDF_NBUF_W_H
28 #define _I_QDF_NBUF_W_H
29 
30 /* ext_cb accesor macros and internal API's */
31 
32 #define QDF_NBUF_CB_EXT_CB(skb) \
33 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.priv_cb_w.ext_cb_ptr)
34 
35 #define __qdf_nbuf_set_ext_cb(skb, ref) \
36 	do { \
37 		QDF_NBUF_CB_EXT_CB((skb)) = (ref); \
38 	} while (0)
39 
40 #define __qdf_nbuf_get_ext_cb(skb) \
41 	QDF_NBUF_CB_EXT_CB((skb))
42 
43 /* fctx accesor macros and internal API's*/
44 
45 #define QDF_NBUF_CB_RX_FCTX(skb) \
46 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_w.fctx)
47 
48 #define QDF_NBUF_CB_TX_FCTX(skb) \
49 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.priv_cb_w.fctx)
50 
51 #define QDF_NBUF_CB_RX_PEER_ID(skb) \
52 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_w.peer_id)
53 
54 #define QDF_NBUF_CB_RX_PKT_LEN(skb) \
55 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_w.msdu_len)
56 
57 #define QDF_NBUF_CB_RX_INTRA_BSS(skb) \
58 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_w.flag_intra_bss)
59 
60 #define __qdf_nbuf_set_rx_fctx_type(skb, ctx, type) \
61 	do { \
62 		QDF_NBUF_CB_RX_FCTX((skb)) = (ctx); \
63 		QDF_NBUF_CB_RX_FTYPE((skb)) = (type); \
64 	} while (0)
65 
66 #define __qdf_nbuf_get_rx_fctx(skb) \
67 		 QDF_NBUF_CB_RX_FCTX((skb))
68 
69 #define __qdf_nbuf_set_intra_bss(skb, val) \
70 	((QDF_NBUF_CB_RX_INTRA_BSS((skb))) = val)
71 
72 #define __qdf_nbuf_is_intra_bss(skb) \
73 	(QDF_NBUF_CB_RX_INTRA_BSS((skb)))
74 
75 #define __qdf_nbuf_set_tx_fctx_type(skb, ctx, type) \
76 	do { \
77 		QDF_NBUF_CB_TX_FCTX((skb)) = (ctx); \
78 		QDF_NBUF_CB_TX_FTYPE((skb)) = (type); \
79 	} while (0)
80 
81 #define __qdf_nbuf_get_tx_fctx(skb) \
82 		 QDF_NBUF_CB_TX_FCTX((skb))
83 
84 #define QDF_NBUF_CB_RX_PROTOCOL_TAG(skb) \
85 		(((struct qdf_nbuf_cb *) \
86 		((skb)->cb))->u.rx.dev.priv_cb_w.protocol_tag)
87 
88 #define __qdf_nbuf_set_rx_protocol_tag(skb, val) \
89 		((QDF_NBUF_CB_RX_PROTOCOL_TAG((skb))) = val)
90 
91 #define __qdf_nbuf_get_rx_protocol_tag(skb) \
92 		(QDF_NBUF_CB_RX_PROTOCOL_TAG((skb)))
93 
94 #define QDF_NBUF_CB_RX_FLOW_TAG(skb) \
95 		(((struct qdf_nbuf_cb *) \
96 		((skb)->cb))->u.rx.dev.priv_cb_w.flow_tag)
97 
98 #define __qdf_nbuf_set_rx_flow_tag(skb, val) \
99 		((QDF_NBUF_CB_RX_FLOW_TAG((skb))) = val)
100 
101 #define __qdf_nbuf_get_rx_flow_tag(skb) \
102 		(QDF_NBUF_CB_RX_FLOW_TAG((skb)))
103 
104 /**
105  * qdf_nbuf_cb_update_vdev_id() - update vdev id in skb cb
106  * @skb: skb pointer whose cb is updated with vdev id information
107  * @vdev_id: vdev id to be updated in cb
108  *
109  * Return: void
110  */
111 static inline void
112 qdf_nbuf_cb_update_vdev_id(struct sk_buff *skb, uint8_t vdev_id)
113 {
114 	/* Does not apply to WIN */
115 }
116 
117 /**
118  * __qdf_nbuf_push_head() - Push data in the front
119  * @skb: Pointer to network buffer
120  * @size: size to be pushed
121  *
122  * Return: New data pointer of this buf after data has been pushed,
123  *         or NULL if there is not enough room in this buf.
124  */
125 static inline uint8_t *__qdf_nbuf_push_head(struct sk_buff *skb, size_t size)
126 {
127 	return skb_push(skb, size);
128 }
129 
130 /**
131  * __qdf_nbuf_pull_head() - pull data out from the front
132  * @skb: Pointer to network buffer
133  * @size: size to be popped
134  *
135  * Return: New data pointer of this buf after data has been popped,
136  * or NULL if there is not sufficient data to pull.
137  */
138 static inline uint8_t *__qdf_nbuf_pull_head(struct sk_buff *skb, size_t size)
139 {
140 	return skb_pull(skb, size);
141 }
142 
143 static inline void qdf_nbuf_init_replenish_timer(void) {}
144 static inline void qdf_nbuf_deinit_replenish_timer(void) {}
145 
146 /**
147  * __qdf_nbuf_dma_inv_range() - nbuf invalidate
148  * @buf_start: from
149  * @buf_end: to address to invalidate
150  *
151  * Return: none
152  */
153 #if (defined(__LINUX_ARM_ARCH__) && !defined(DP_NO_CACHE_DESC_SUPPORT))
154 static inline void
155 __qdf_nbuf_dma_inv_range(const void *buf_start, const void *buf_end)
156 {
157 	dmac_inv_range(buf_start, buf_end);
158 }
159 #elif defined(__LINUX_MIPS32_ARCH__) || defined(__LINUX_MIPS64_ARCH__)
160 static inline void
161 __qdf_nbuf_dma_inv_range(const void *buf_start, const void *buf_end)
162 {
163 	dma_cache_inv((unsigned long)buf_start,
164 		      (unsigned long)(buf_end - buf_start));
165 }
166 #else
167 static inline void
168 __qdf_nbuf_dma_inv_range(const void *buf_start, const void *buf_end)
169 {
170 }
171 #endif
172 #endif /*_I_QDF_NBUF_W_H */
173