xref: /wlan-dirver/qca-wifi-host-cmn/qdf/linux/src/i_qdf_nbuf_m.h (revision 8aa054e666dc988324caebd71d46f3f39150637f)
1 /*
2  * Copyright (c) 2014-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 /**
21  * DOC: i_qdf_nbuf_m.h
22  *
23  * This file provides platform specific nbuf API's.
24  * Included by i_qdf_nbuf.h and should not be included
25  * directly from other files.
26  */
27 
28 #ifndef _I_QDF_NBUF_M_H
29 #define _I_QDF_NBUF_M_H
30 /**
31  * struct qdf_nbuf_cb - network buffer control block contents (skb->cb)
32  *                    - data passed between layers of the driver.
33  *
34  * Notes:
35  *   1. Hard limited to 48 bytes. Please count your bytes
36  *   2. The size of this structure has to be easily calculable and
37  *      consistently so: do not use any conditional compile flags
38  *   3. Split into a common part followed by a tx/rx overlay
39  *   4. There is only one extra frag, which represents the HTC/HTT header
40  *   5. "ext_cb_pt" must be the first member in both TX and RX unions
41  *      for the priv_cb_w since it must be at same offset for both
42  *      TX and RX union
43  *   6. "ipa.owned" bit must be first member in both TX and RX unions
44  *      for the priv_cb_m since it must be at same offset for both
45  *      TX and RX union.
46  *
47  * @paddr   : physical addressed retrieved by dma_map of nbuf->data
48  * @u: union of rx and tx data
49  * @u.rx: rx data
50  * @u.rx.dev: union of priv_cb_w and priv_cb_m
51  *
52  * @u.rx.dev.priv_cb_w:
53  * @u.rx.dev.priv_cb_w.ext_cb_ptr: extended cb pointer
54  * @u.rx.dev.priv_cb_w.fctx: ctx to handle special pkts defined by ftype
55  * @u.rx.dev.priv_cb_w.msdu_len: length of RX packet
56  * @u.rx.dev.priv_cb_w.flag_intra_bss: flag to indicate this is intra bss packet
57  * @u.rx.dev.priv_cb_w.ipa_smmu_map: do IPA smmu map
58  * @u.rx.dev.priv_cb_w.peer_id: peer_id for RX packet
59  * @u.rx.dev.priv_cb_w.protocol_tag: protocol tag set by app for rcvd packet
60  *                                   type
61  * @u.rx.dev.priv_cb_w.flow_tag: flow tag set by application for 5 tuples rcvd
62  *
63  * @u.rx.dev.priv_cb_m:
64  * @u.rx.dev.priv_cb_m.ipa.owned: packet owned by IPA
65  * @u.rx.dev.priv_cb_m.peer_cached_buf_frm: peer cached buffer
66  * @u.rx.dev.priv_cb_m.flush_ind: flush indication
67  * @u.rx.dev.priv_cb_m.packet_buf_pool:  packet buff bool
68  * @u.rx.dev.priv_cb_m.l3_hdr_pad: L3 header padding offset
69  * @u.rx.dev.priv_cb_m.exc_frm: exception frame
70  * @u.rx.dev.priv_cb_m.ipa_smmu_map: do IPA smmu map
71  * @u.rx.dev.priv_cb_m.reo_dest_ind_or_sw_excpt: reo destination indication or
72  *					     sw exception bit from ring desc
73  * @u.rx.dev.priv_cb_m.lmac_id: lmac id for RX packet
74  * @u.rx.dev.priv_cb_m.fr_ds: from DS bit in RX packet
75  * @u.rx.dev.priv_cb_m.to_ds: to DS bit in RX packet
76  * @u.rx.dev.priv_cb_m.logical_link_id: link id of RX packet
77  * @u.rx.dev.priv_cb_m.reserved1: reserved bits
78  * @u.rx.dev.priv_cb_m.dp_ext: Union of tcp and ext structs
79  * @u.rx.dev.priv_cb_m.dp_ext.tcp: TCP structs
80  * @u.rx.dev.priv_cb_m.dp_ext.tcp.tcp_seq_num: TCP sequence number
81  * @u.rx.dev.priv_cb_m.dp_ext.tcp.tcp_ack_num: TCP ACK number
82  * @u.rx.dev.priv_cb_m.dp_ext.ext: Extension struct for other usage
83  * @u.rx.dev.priv_cb_m.dp_ext.ext.mpdu_seq: wifi MPDU sequence number
84  * @u.rx.dev.priv_cb_m.dp: Union of wifi3 and wifi2 structs
85  * @u.rx.dev.priv_cb_m.dp.wifi3: wifi3 data
86  * @u.rx.dev.priv_cb_m.dp.wifi3.msdu_len: length of RX packet
87  * @u.rx.dev.priv_cb_m.dp.wifi3.peer_id:  peer_id for RX packet
88  * @u.rx.dev.priv_cb_m.dp.wifi2: wifi2 data
89  * @u.rx.dev.priv_cb_m.dp.wifi2.map_index:
90  * @u.rx.dev.priv_cb_m.lro_ctx: LRO context
91  *
92  * @u.rx.lro_eligible: flag to indicate whether the MSDU is LRO eligible
93  * @u.rx.tcp_proto: L4 protocol is TCP
94  * @u.rx.tcp_pure_ack: A TCP ACK packet with no payload
95  * @u.rx.ipv6_proto: L3 protocol is IPV6
96  * @u.rx.ip_offset: offset to IP header
97  * @u.rx.tcp_offset: offset to TCP header
98  * @u.rx.rx_ctx_id: Rx context id
99  * @u.rx.fcs_err: FCS error
100  * @u.rx.is_raw_frame: RAW frame
101  * @u.rx.num_elements_in_list: number of elements in the nbuf list
102  *
103  * @u.rx.tcp_udp_chksum: L4 payload checksum
104  * @u.rx.tcp_win: TCP window size
105  *
106  * @u.rx.flow_id: 32bit flow id
107  *
108  * @u.rx.flag_chfrag_start: first MSDU in an AMSDU
109  * @u.rx.flag_chfrag_cont: middle or part of MSDU in an AMSDU
110  * @u.rx.flag_chfrag_end: last MSDU in an AMSDU
111  * @u.rx.flag_retry: flag to indicate MSDU is retried
112  * @u.rx.flag_da_mcbc: flag to indicate mulicast or broadcast packets
113  * @u.rx.flag_da_valid: flag to indicate DA is valid for RX packet
114  * @u.rx.flag_sa_valid: flag to indicate SA is valid for RX packet
115  * @u.rx.flag_is_frag: flag to indicate skb has frag list
116  *
117  * @u.rx.trace: combined structure for DP and protocol trace
118  * @u.rx.trace.packet_state: {NBUF_TX_PKT_[(HDD)|(TXRX_ENQUEUE)|(TXRX_DEQUEUE)|
119  *                       +          (TXRX)|(HTT)|(HTC)|(HIF)|(CE)|(FREE)]
120  * @u.rx.trace.dp_trace: flag (Datapath trace)
121  * @u.rx.trace.packet_track: RX_DATA packet
122  * @u.rx.trace.rsrvd: enable packet logging
123  *
124  * @u.rx.vdev_id: vdev_id for RX pkt
125  * @u.rx.tid_val: tid value
126  * @u.rx.ftype: mcast2ucast, TSO, SG, MESH
127  *
128  * @u.tx: tx data
129  * @u.tx.dev: union of priv_cb_w and priv_cb_m
130  *
131  * @u.tx.dev.priv_cb_w:
132  * @u.tx.dev.priv_cb_w.ext_cb_ptr: extended cb pointer
133  * @u.tx.dev.priv_cb_w.fctx: ctx to handle special pkts defined by ftype
134  *
135  * @u.tx.dev.priv_cb_m:
136  * @u.tx.dev.priv_cb_m:ipa: IPA-specific data
137  * @u.tx.dev.priv_cb_m.ipa.ipa.owned: packet owned by IPA
138  * @u.tx.dev.priv_cb_m.ipa.ipa.priv: private data, used by IPA
139  * @u.tx.dev.priv_cb_m.data_attr: value that is programmed in CE descr, includes
140  *                 + (1) CE classification enablement bit
141  *                 + (2) packet type (802.3 or Ethernet type II)
142  *                 + (3) packet offset (usually length of HTC/HTT descr)
143  * @u.tx.dev.priv_cb_m.desc_id: tx desc id, used to sync between host and fw
144  * @u.tx.dev.priv_cb_m.dma_option: DMA options
145  * @u.tx.dev.priv_cb_m.dma_option.mgmt_desc_id: mgmt descriptor for tx
146  *                                              completion cb
147  * @u.tx.dev.priv_cb_m.dma_option.dma_option.bi_map: flag to do bi-direction
148  *                                                   dma map
149  * @u.tx.dev.priv_cb_m.dma_option.dma_option.reserved: reserved bits for future
150  *                                                     use
151  * @u.tx.dev.priv_cb_m.flag_notify_comp: reserved
152  * @u.tx.dev.priv_cb_m.flag_ts_valid: flag to indicate field
153  * u.tx.pa_ts.ts_value is available, it must be cleared before fragment mapping
154  * @u.tx.dev.priv_cb_m.rsvd: reserved
155  * @u.tx.dev.priv_cb_m.reserved: reserved
156  *
157  * @u.tx.ftype: mcast2ucast, TSO, SG, MESH
158  * @u.tx.vdev_id: vdev (for protocol trace)
159  * @u.tx.len: length of efrag pointed by the above pointers
160  *
161  * @u.tx.flags: union of flag representations
162  * @u.tx.flags.bits: flags represent as individual bitmasks
163  * @u.tx.flags.bits.flag_efrag: flag, efrag payload to be swapped (wordstream)
164  * @u.tx.flags.bits.num: number of extra frags ( 0 or 1)
165  * @u.tx.flags.bits.nbuf: flag, nbuf payload to be swapped (wordstream)
166  * @u.tx.flags.bits.flag_chfrag_start: first MSDU in an AMSDU
167  * @u.tx.flags.bits.flag_chfrag_cont: middle or part of MSDU in an AMSDU
168  * @u.tx.flags.bits.flag_chfrag_end: last MSDU in an AMSDU
169  * @u.tx.flags.bits.flag_ext_header: extended flags
170  * @u.tx.flags.bits.is_critical: flag indicating a critical frame
171  * @u.tx.flags.u8: flags as a single u8
172  * @u.tx.trace: combined structure for DP and protocol trace
173  * @u.tx.trace.packet_stat: {NBUF_TX_PKT_[(HDD)|(TXRX_ENQUEUE)|(TXRX_DEQUEUE)|
174  *                       +          (TXRX)|(HTT)|(HTC)|(HIF)|(CE)|(FREE)]
175  * @u.tx.trace.is_packet_priv:
176  * @u.tx.trace.packet_track: {NBUF_TX_PKT_[(DATA)|(MGMT)]_TRACK}
177  * @u.tx.trace.to_fw: Flag to indicate send this packet to FW
178  * @u.tx.trace.htt2_frm: flag (high-latency path only)
179  * @u.tx.trace.proto_type: bitmap of NBUF_PKT_TRAC_TYPE[(EAPOL)|(DHCP)|
180  *                          + (MGMT_ACTION)] - 4 bits
181  * @u.tx.trace.dp_trace: flag (Datapath trace)
182  * @u.tx.trace.is_bcast: flag (Broadcast packet)
183  * @u.tx.trace.is_mcast: flag (Multicast packet)
184  * @u.tx.trace.packet_type: flag (Packet type)
185  * @u.tx.trace.print: enable packet logging
186  *
187  * @u.tx.vaddr: virtual address of ~
188  * @u.tx.pa_ts.paddr: physical/DMA address of ~
189  * @u.tx.pa_ts.ts_value: driver ingress timestamp, it must be cleared before
190  * fragment mapping
191  */
192 struct qdf_nbuf_cb {
193 	/* common */
194 	qdf_paddr_t paddr; /* of skb->data */
195 	/* valid only in one direction */
196 	union {
197 		/* Note: MAX: 40 bytes */
198 		struct {
199 			union {
200 				struct {
201 					void *ext_cb_ptr;
202 					void *fctx;
203 					uint16_t msdu_len : 14,
204 						 flag_intra_bss : 1,
205 						 ipa_smmu_map : 1;
206 					uint16_t peer_id;
207 					uint16_t protocol_tag;
208 					uint16_t flow_tag;
209 				} priv_cb_w;
210 				struct {
211 					/* ipa_owned bit is common between rx
212 					 * control block and tx control block.
213 					 * Do not change location of this bit.
214 					 */
215 					uint32_t ipa_owned:1,
216 						 peer_cached_buf_frm:1,
217 						 flush_ind:1,
218 						 packet_buf_pool:1,
219 						 l3_hdr_pad:3,
220 						 /* exception frame flag */
221 						 exc_frm:1,
222 						 ipa_smmu_map:1,
223 						 reo_dest_ind_or_sw_excpt:5,
224 						 lmac_id:2,
225 						 fr_ds:1,
226 						 to_ds:1,
227 						 logical_link_id:4,
228 						 band:3,
229 						 reserved1:7;
230 					union {
231 						struct {
232 							uint32_t tcp_seq_num;
233 							uint32_t tcp_ack_num;
234 						} tcp;
235 						struct {
236 							uint32_t mpdu_seq:12,
237 								 reserved:20;
238 							uint32_t reserved1;
239 						} ext;
240 					} dp_ext;
241 					union {
242 						struct {
243 							uint16_t msdu_len;
244 							uint16_t peer_id;
245 						} wifi3;
246 						struct {
247 							uint32_t map_index;
248 						} wifi2;
249 					} dp;
250 					unsigned char *lro_ctx;
251 				} priv_cb_m;
252 			} dev;
253 			uint32_t lro_eligible:1,
254 				tcp_proto:1,
255 				tcp_pure_ack:1,
256 				ipv6_proto:1,
257 				ip_offset:7,
258 				tcp_offset:7,
259 				rx_ctx_id:4,
260 				fcs_err:1,
261 				is_raw_frame:1,
262 				num_elements_in_list:8;
263 			uint32_t tcp_udp_chksum:16,
264 				 tcp_win:16;
265 			uint32_t flow_id;
266 			uint8_t flag_chfrag_start:1,
267 				flag_chfrag_cont:1,
268 				flag_chfrag_end:1,
269 				flag_retry:1,
270 				flag_da_mcbc:1,
271 				flag_da_valid:1,
272 				flag_sa_valid:1,
273 				flag_is_frag:1;
274 			union {
275 				uint8_t packet_state;
276 				uint8_t dp_trace:1,
277 					packet_track:3,
278 					rsrvd:4;
279 			} trace;
280 			uint16_t vdev_id:8,
281 				 tid_val:4,
282 				 ftype:4;
283 		} rx;
284 
285 		/* Note: MAX: 40 bytes */
286 		struct {
287 			union {
288 				struct {
289 					void *ext_cb_ptr;
290 					void *fctx;
291 				} priv_cb_w;
292 				struct {
293 					/* ipa_owned bit is common between rx
294 					 * control block and tx control block.
295 					 * Do not change location of this bit.
296 					 */
297 					struct {
298 						uint32_t owned:1,
299 							priv:31;
300 					} ipa;
301 					uint32_t data_attr;
302 					uint16_t desc_id;
303 					uint16_t mgmt_desc_id;
304 					struct {
305 						uint8_t bi_map:1,
306 							reserved:7;
307 					} dma_option;
308 					uint8_t flag_notify_comp:1,
309 						band:3,
310 						flag_ts_valid:1,
311 						rsvd:3;
312 					uint8_t reserved[2];
313 				} priv_cb_m;
314 			} dev;
315 			uint8_t ftype;
316 			uint8_t vdev_id;
317 			uint16_t len;
318 			union {
319 				struct {
320 					uint8_t flag_efrag:1,
321 						flag_nbuf:1,
322 						num:1,
323 						flag_chfrag_start:1,
324 						flag_chfrag_cont:1,
325 						flag_chfrag_end:1,
326 						flag_ext_header:1,
327 						is_critical:1;
328 				} bits;
329 				uint8_t u8;
330 			} flags;
331 			struct {
332 				uint8_t packet_state:7,
333 					is_packet_priv:1;
334 				uint8_t packet_track:3,
335 					to_fw:1,
336 					htt2_frm:1,
337 					proto_type:3;
338 				uint8_t dp_trace:1,
339 					is_bcast:1,
340 					is_mcast:1,
341 					packet_type:4,
342 					print:1;
343 			} trace;
344 			unsigned char *vaddr;
345 			union {
346 				qdf_paddr_t paddr;
347 				qdf_ktime_t ts_value;
348 			} pa_ts;
349 		} tx;
350 	} u;
351 }; /* struct qdf_nbuf_cb: MAX 48 bytes */
352 
353 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 16, 0))
354 QDF_COMPILE_TIME_ASSERT(qdf_nbuf_cb_size,
355 			(sizeof(struct qdf_nbuf_cb)) <=
356 			sizeof_field(struct sk_buff, cb));
357 #else
358 QDF_COMPILE_TIME_ASSERT(qdf_nbuf_cb_size,
359 			(sizeof(struct qdf_nbuf_cb)) <=
360 			FIELD_SIZEOF(struct sk_buff, cb));
361 #endif
362 
363 /*
364  *  access macros to qdf_nbuf_cb
365  *  Note: These macros can be used as L-values as well as R-values.
366  *        When used as R-values, they effectively function as "get" macros
367  *        When used as L_values, they effectively function as "set" macros
368  */
369 
370 #define QDF_NBUF_CB_PADDR(skb) \
371 	(((struct qdf_nbuf_cb *)((skb)->cb))->paddr.dma_addr)
372 
373 #define QDF_NBUF_CB_RX_LRO_ELIGIBLE(skb) \
374 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.lro_eligible)
375 #define QDF_NBUF_CB_RX_TCP_PROTO(skb) \
376 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.tcp_proto)
377 #define QDF_NBUF_CB_RX_TCP_PURE_ACK(skb) \
378 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.tcp_pure_ack)
379 #define QDF_NBUF_CB_RX_IPV6_PROTO(skb) \
380 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.ipv6_proto)
381 #define QDF_NBUF_CB_RX_IP_OFFSET(skb) \
382 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.ip_offset)
383 #define QDF_NBUF_CB_RX_TCP_OFFSET(skb) \
384 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.tcp_offset)
385 #define QDF_NBUF_CB_RX_CTX_ID(skb) \
386 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.rx_ctx_id)
387 #define QDF_NBUF_CB_RX_NUM_ELEMENTS_IN_LIST(skb) \
388 		(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.num_elements_in_list)
389 
390 #define QDF_NBUF_CB_RX_TCP_CHKSUM(skb) \
391 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.tcp_udp_chksum)
392 #define QDF_NBUF_CB_RX_TCP_WIN(skb) \
393 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.tcp_win)
394 
395 #define QDF_NBUF_CB_RX_FLOW_ID(skb) \
396 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.flow_id)
397 
398 #define QDF_NBUF_CB_RX_PACKET_STATE(skb)\
399 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.trace.packet_state)
400 #define QDF_NBUF_CB_RX_DP_TRACE(skb) \
401 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.trace.dp_trace)
402 
403 #define QDF_NBUF_CB_RX_FTYPE(skb) \
404 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.ftype)
405 
406 #define QDF_NBUF_CB_RX_VDEV_ID(skb) \
407 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.vdev_id)
408 
409 #define QDF_NBUF_CB_RX_CHFRAG_START(skb) \
410 	(((struct qdf_nbuf_cb *) \
411 	((skb)->cb))->u.rx.flag_chfrag_start)
412 #define QDF_NBUF_CB_RX_CHFRAG_CONT(skb) \
413 	(((struct qdf_nbuf_cb *) \
414 	((skb)->cb))->u.rx.flag_chfrag_cont)
415 #define QDF_NBUF_CB_RX_CHFRAG_END(skb) \
416 		(((struct qdf_nbuf_cb *) \
417 		((skb)->cb))->u.rx.flag_chfrag_end)
418 
419 #define QDF_NBUF_CB_RX_DA_MCBC(skb) \
420 	(((struct qdf_nbuf_cb *) \
421 	((skb)->cb))->u.rx.flag_da_mcbc)
422 
423 #define QDF_NBUF_CB_RX_DA_VALID(skb) \
424 	(((struct qdf_nbuf_cb *) \
425 	((skb)->cb))->u.rx.flag_da_valid)
426 
427 #define QDF_NBUF_CB_RX_SA_VALID(skb) \
428 	(((struct qdf_nbuf_cb *) \
429 	((skb)->cb))->u.rx.flag_sa_valid)
430 
431 #define QDF_NBUF_CB_RX_RETRY_FLAG(skb) \
432 	(((struct qdf_nbuf_cb *) \
433 	((skb)->cb))->u.rx.flag_retry)
434 
435 #define QDF_NBUF_CB_RX_RAW_FRAME(skb) \
436 	(((struct qdf_nbuf_cb *) \
437 	((skb)->cb))->u.rx.is_raw_frame)
438 
439 #define QDF_NBUF_CB_RX_FROM_DS(skb) \
440 	(((struct qdf_nbuf_cb *) \
441 	((skb)->cb))->u.rx.dev.priv_cb_m.fr_ds)
442 
443 #define QDF_NBUF_CB_RX_TO_DS(skb) \
444 	(((struct qdf_nbuf_cb *) \
445 	((skb)->cb))->u.rx.dev.priv_cb_m.to_ds)
446 
447 #define QDF_NBUF_CB_RX_TID_VAL(skb) \
448 	(((struct qdf_nbuf_cb *) \
449 	((skb)->cb))->u.rx.tid_val)
450 
451 #define QDF_NBUF_CB_RX_IS_FRAG(skb) \
452 	(((struct qdf_nbuf_cb *) \
453 	((skb)->cb))->u.rx.flag_is_frag)
454 
455 #define QDF_NBUF_CB_RX_FCS_ERR(skb) \
456 	(((struct qdf_nbuf_cb *) \
457 	((skb)->cb))->u.rx.fcs_err)
458 
459 #define QDF_NBUF_UPDATE_TX_PKT_COUNT(skb, PACKET_STATE) \
460 	qdf_nbuf_set_state(skb, PACKET_STATE)
461 
462 #define QDF_NBUF_CB_TX_DATA_ATTR(skb) \
463 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.priv_cb_m.data_attr)
464 
465 #define QDF_NBUF_CB_TX_FTYPE(skb) \
466 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.ftype)
467 
468 #define QDF_NBUF_CB_TX_EXTRA_FRAG_LEN(skb) \
469 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.len)
470 #define QDF_NBUF_CB_TX_VDEV_CTX(skb) \
471 		(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.vdev_id)
472 
473 /* Tx Flags Accessor Macros*/
474 #define QDF_NBUF_CB_TX_EXTRA_FRAG_WORDSTR_EFRAG(skb) \
475 	(((struct qdf_nbuf_cb *) \
476 		((skb)->cb))->u.tx.flags.bits.flag_efrag)
477 #define QDF_NBUF_CB_TX_EXTRA_FRAG_WORDSTR_NBUF(skb) \
478 	(((struct qdf_nbuf_cb *) \
479 		((skb)->cb))->u.tx.flags.bits.flag_nbuf)
480 #define QDF_NBUF_CB_TX_NUM_EXTRA_FRAGS(skb) \
481 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.flags.bits.num)
482 #define QDF_NBUF_CB_TX_EXTRA_FRAG_FLAGS_CHFRAG_START(skb) \
483 	(((struct qdf_nbuf_cb *) \
484 	((skb)->cb))->u.tx.flags.bits.flag_chfrag_start)
485 #define QDF_NBUF_CB_TX_EXTRA_FRAG_FLAGS_CHFRAG_CONT(skb) \
486 	(((struct qdf_nbuf_cb *) \
487 	((skb)->cb))->u.tx.flags.bits.flag_chfrag_cont)
488 #define QDF_NBUF_CB_TX_EXTRA_FRAG_FLAGS_CHFRAG_END(skb) \
489 		(((struct qdf_nbuf_cb *) \
490 		((skb)->cb))->u.tx.flags.bits.flag_chfrag_end)
491 #define QDF_NBUF_CB_TX_EXTRA_FRAG_FLAGS_EXT_HEADER(skb) \
492 		(((struct qdf_nbuf_cb *) \
493 		((skb)->cb))->u.tx.flags.bits.flag_ext_header)
494 #define QDF_NBUF_CB_TX_EXTRA_FRAG_WORDSTR_FLAGS(skb) \
495 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.flags.u8)
496 
497 #define QDF_NBUF_CB_TX_EXTRA_IS_CRITICAL(skb) \
498 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.flags.bits.is_critical)
499 /* End of Tx Flags Accessor Macros */
500 
501 /* Tx trace accessor macros */
502 #define QDF_NBUF_CB_TX_PACKET_STATE(skb)\
503 	(((struct qdf_nbuf_cb *) \
504 		((skb)->cb))->u.tx.trace.packet_state)
505 
506 #define QDF_NBUF_CB_TX_IS_PACKET_PRIV(skb) \
507 	(((struct qdf_nbuf_cb *) \
508 		((skb)->cb))->u.tx.trace.is_packet_priv)
509 
510 #define QDF_NBUF_CB_TX_PACKET_TRACK(skb)\
511 	(((struct qdf_nbuf_cb *) \
512 		((skb)->cb))->u.tx.trace.packet_track)
513 
514 #define QDF_NBUF_CB_TX_PACKET_TO_FW(skb)\
515 	(((struct qdf_nbuf_cb *) \
516 		((skb)->cb))->u.tx.trace.to_fw)
517 
518 #define QDF_NBUF_CB_RX_PACKET_TRACK(skb)\
519 		(((struct qdf_nbuf_cb *) \
520 			((skb)->cb))->u.rx.trace.packet_track)
521 
522 #define QDF_NBUF_CB_TX_PROTO_TYPE(skb)\
523 	(((struct qdf_nbuf_cb *) \
524 		((skb)->cb))->u.tx.trace.proto_type)
525 
526 #define QDF_NBUF_CB_TX_DP_TRACE(skb)\
527 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.trace.dp_trace)
528 
529 #define QDF_NBUF_CB_DP_TRACE_PRINT(skb)	\
530 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.trace.print)
531 
532 #define QDF_NBUF_CB_TX_HL_HTT2_FRM(skb)	\
533 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.trace.htt2_frm)
534 
535 #define QDF_NBUF_CB_GET_IS_BCAST(skb)\
536 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.trace.is_bcast)
537 
538 #define QDF_NBUF_CB_GET_IS_MCAST(skb)\
539 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.trace.is_mcast)
540 
541 #define QDF_NBUF_CB_GET_PACKET_TYPE(skb)\
542 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.trace.packet_type)
543 
544 #define QDF_NBUF_CB_SET_BCAST(skb) \
545 	(((struct qdf_nbuf_cb *) \
546 		((skb)->cb))->u.tx.trace.is_bcast = true)
547 
548 #define QDF_NBUF_CB_SET_MCAST(skb) \
549 	(((struct qdf_nbuf_cb *) \
550 		((skb)->cb))->u.tx.trace.is_mcast = true)
551 /* End of Tx trace accessor macros */
552 
553 #define QDF_NBUF_CB_TX_EXTRA_FRAG_VADDR(skb) \
554 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.vaddr)
555 #define QDF_NBUF_CB_TX_EXTRA_FRAG_PADDR(skb) \
556 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.pa_ts.paddr.dma_addr)
557 
558 #define QDF_NBUF_CB_TX_TS_VALID(skb) \
559 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.priv_cb_m.flag_ts_valid)
560 #define QDF_NBUF_CB_TX_TS_VALUE(skb) \
561 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.pa_ts.ts_value)
562 
563 /* assume the OS provides a single fragment */
564 #define __qdf_nbuf_get_num_frags(skb)		   \
565 	(QDF_NBUF_CB_TX_NUM_EXTRA_FRAGS(skb) + 1)
566 
567 #define __qdf_nbuf_reset_num_frags(skb) \
568 	(QDF_NBUF_CB_TX_NUM_EXTRA_FRAGS(skb) = 0)
569 
570 #define QDF_NBUF_CB_RX_TCP_SEQ_NUM(skb) \
571 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m. \
572 	 dp_ext.tcp.tcp_seq_num)
573 #define QDF_NBUF_CB_RX_TCP_ACK_NUM(skb) \
574 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m. \
575 	 dp_ext.tcp.tcp_ack_num)
576 #define QDF_NBUF_CB_RX_MPDU_SEQ_NUM(skb) \
577 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m. \
578 	 dp_ext.ext.mpdu_seq)
579 
580 #define QDF_NBUF_CB_RX_LRO_CTX(skb) \
581 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m.lro_ctx)
582 
583 #define QDF_NBUF_CB_TX_IPA_OWNED(skb) \
584 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.priv_cb_m.ipa.owned)
585 #define QDF_NBUF_CB_TX_IPA_PRIV(skb) \
586 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.priv_cb_m.ipa.priv)
587 #define QDF_NBUF_CB_TX_DESC_ID(skb)\
588 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.priv_cb_m.desc_id)
589 #define QDF_NBUF_CB_MGMT_TXRX_DESC_ID(skb)\
590 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.priv_cb_m.mgmt_desc_id)
591 #define QDF_NBUF_CB_TX_DMA_BI_MAP(skb) \
592 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.priv_cb_m. \
593 	dma_option.bi_map)
594 #define QDF_NBUF_CB_TX_EXTRA_FRAG_FLAGS_NOTIFY_COMP(skb) \
595 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.priv_cb_m. \
596 	flag_notify_comp)
597 
598 #define QDF_NBUF_CB_TX_BAND(skb) \
599 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.priv_cb_m. \
600 	band)
601 
602 #define QDF_NBUF_CB_RX_PEER_ID(skb) \
603 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m.dp. \
604 	wifi3.peer_id)
605 
606 #define QDF_NBUF_CB_RX_PKT_LEN(skb) \
607 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m.dp. \
608 	wifi3.msdu_len)
609 
610 #define QDF_NBUF_CB_RX_MAP_IDX(skb) \
611 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m.dp. \
612 	wifi2.map_index)
613 
614 #define  QDF_NBUF_CB_RX_PEER_CACHED_FRM(skb) \
615 	 (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m. \
616 	 peer_cached_buf_frm)
617 
618 #define  QDF_NBUF_CB_RX_FLUSH_IND(skb) \
619 	 (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m.flush_ind)
620 
621 #define  QDF_NBUF_CB_RX_PACKET_BUFF_POOL(skb) \
622 	 (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m. \
623 	 packet_buf_pool)
624 
625 #define  QDF_NBUF_CB_RX_PACKET_L3_HDR_PAD(skb) \
626 	 (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m. \
627 	 l3_hdr_pad)
628 
629 #define  QDF_NBUF_CB_RX_PACKET_EXC_FRAME(skb) \
630 	 (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m. \
631 	 exc_frm)
632 
633 #define  QDF_NBUF_CB_RX_PACKET_IPA_SMMU_MAP(skb) \
634 	 (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m. \
635 	 ipa_smmu_map)
636 
637 #define  QDF_NBUF_CB_RX_PACKET_REO_DEST_IND_OR_SW_EXCPT(skb) \
638 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m. \
639 	reo_dest_ind_or_sw_excpt)
640 
641 #define  QDF_NBUF_CB_RX_PACKET_LMAC_ID(skb) \
642 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m. \
643 	lmac_id)
644 
645 #define QDF_NBUF_CB_RX_LOGICAL_LINK_ID(skb) \
646 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m. \
647 	logical_link_id)
648 
649 #define QDF_NBUF_CB_RX_BAND(skb) \
650 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m. \
651 	band)
652 
653 #define __qdf_nbuf_ipa_owned_get(skb) \
654 	QDF_NBUF_CB_TX_IPA_OWNED(skb)
655 
656 #define __qdf_nbuf_ipa_owned_set(skb) \
657 	(QDF_NBUF_CB_TX_IPA_OWNED(skb) = 1)
658 
659 #define __qdf_nbuf_ipa_owned_clear(skb) \
660 	(QDF_NBUF_CB_TX_IPA_OWNED(skb) = 0)
661 
662 #define __qdf_nbuf_ipa_priv_get(skb)	\
663 	QDF_NBUF_CB_TX_IPA_PRIV(skb)
664 
665 #define __qdf_nbuf_ipa_priv_set(skb, priv) \
666 	(QDF_NBUF_CB_TX_IPA_PRIV(skb) = (priv))
667 
668 #define QDF_NBUF_CB_TX_DATA_ATTR(skb) \
669 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.priv_cb_m.data_attr)
670 
671 #define __qdf_nbuf_data_attr_get(skb)		\
672 	QDF_NBUF_CB_TX_DATA_ATTR(skb)
673 #define __qdf_nbuf_data_attr_set(skb, data_attr) \
674 	(QDF_NBUF_CB_TX_DATA_ATTR(skb) = (data_attr))
675 
676 #define __qdf_nbuf_set_tx_ts(skb, ts) \
677 	do { \
678 		QDF_NBUF_CB_TX_TS_VALUE(skb) = (ts); \
679 		QDF_NBUF_CB_TX_TS_VALID(skb) = 1; \
680 	} while (0)
681 
682 #define __qdf_nbuf_clear_tx_ts(skb) \
683 	do { \
684 		QDF_NBUF_CB_TX_TS_VALUE(skb) = 0; \
685 		QDF_NBUF_CB_TX_TS_VALID(skb) = 0; \
686 	} while (0)
687 
688 #define __qdf_nbuf_get_tx_ts(skb) \
689 	(QDF_NBUF_CB_TX_TS_VALID(skb) ? \
690 	 QDF_NBUF_CB_TX_TS_VALUE(skb) : 0)
691 
692 /**
693  * __qdf_nbuf_map_nbytes_single() - map nbytes
694  * @osdev: os device
695  * @buf: buffer
696  * @dir: direction
697  * @nbytes: number of bytes
698  *
699  * Return: QDF_STATUS
700  */
701 #ifdef A_SIMOS_DEVHOST
702 static inline QDF_STATUS __qdf_nbuf_map_nbytes_single(
703 		qdf_device_t osdev, struct sk_buff *buf,
704 		qdf_dma_dir_t dir, int nbytes)
705 {
706 	qdf_dma_addr_t paddr;
707 
708 	QDF_NBUF_CB_PADDR(buf) = paddr = buf->data;
709 	return QDF_STATUS_SUCCESS;
710 }
711 #else
712 static inline QDF_STATUS __qdf_nbuf_map_nbytes_single(
713 		qdf_device_t osdev, struct sk_buff *buf,
714 		qdf_dma_dir_t dir, int nbytes)
715 {
716 	qdf_dma_addr_t paddr;
717 	QDF_STATUS ret;
718 
719 	/* assume that the OS only provides a single fragment */
720 	QDF_NBUF_CB_PADDR(buf) = paddr =
721 		dma_map_single(osdev->dev, buf->data,
722 			       nbytes, __qdf_dma_dir_to_os(dir));
723 	ret =  dma_mapping_error(osdev->dev, paddr) ?
724 		QDF_STATUS_E_FAULT : QDF_STATUS_SUCCESS;
725 	if (QDF_IS_STATUS_SUCCESS(ret))
726 		__qdf_record_nbuf_nbytes(__qdf_nbuf_get_end_offset(buf),
727 					 dir, true);
728 	return ret;
729 }
730 #endif
731 /**
732  * __qdf_nbuf_unmap_nbytes_single() - unmap nbytes
733  * @osdev: os device
734  * @buf: buffer
735  * @dir: direction
736  * @nbytes: number of bytes
737  *
738  * Return: none
739  */
740 #if defined(A_SIMOS_DEVHOST)
741 static inline void
742 __qdf_nbuf_unmap_nbytes_single(qdf_device_t osdev, struct sk_buff *buf,
743 			       qdf_dma_dir_t dir, int nbytes)
744 {
745 }
746 
747 #else
748 static inline void
749 __qdf_nbuf_unmap_nbytes_single(qdf_device_t osdev, struct sk_buff *buf,
750 			       qdf_dma_dir_t dir, int nbytes)
751 {
752 	qdf_dma_addr_t paddr = QDF_NBUF_CB_PADDR(buf);
753 
754 	if (qdf_likely(paddr)) {
755 		__qdf_record_nbuf_nbytes(
756 			__qdf_nbuf_get_end_offset(buf), dir, false);
757 		dma_unmap_single(osdev->dev, paddr, nbytes,
758 				 __qdf_dma_dir_to_os(dir));
759 		return;
760 	}
761 }
762 #endif
763 
764 /**
765  * __qdf_nbuf_reset() - reset the buffer data and pointer
766  * @skb: Network buf instance
767  * @reserve: reserve
768  * @align: align
769  *
770  * Return: none
771  */
772 static inline void
773 __qdf_nbuf_reset(struct sk_buff *skb, int reserve, int align)
774 {
775 	int offset;
776 
777 	skb_push(skb, skb_headroom(skb));
778 	skb_put(skb, skb_tailroom(skb));
779 	memset(skb->data, 0x0, skb->len);
780 	skb_trim(skb, 0);
781 	skb_reserve(skb, NET_SKB_PAD);
782 	memset(skb->cb, 0x0, sizeof(skb->cb));
783 
784 	/*
785 	 * The default is for netbuf fragments to be interpreted
786 	 * as wordstreams rather than bytestreams.
787 	 */
788 	QDF_NBUF_CB_TX_EXTRA_FRAG_WORDSTR_EFRAG(skb) = 1;
789 	QDF_NBUF_CB_TX_EXTRA_FRAG_WORDSTR_NBUF(skb) = 1;
790 
791 	/*
792 	 * Align & make sure that the tail & data are adjusted properly
793 	 */
794 
795 	if (align) {
796 		offset = ((unsigned long)skb->data) % align;
797 		if (offset)
798 			skb_reserve(skb, align - offset);
799 	}
800 
801 	skb_reserve(skb, reserve);
802 }
803 
804 /**
805  * qdf_nbuf_cb_update_vdev_id() - update vdev id in skb cb
806  * @skb: skb pointer whose cb is updated with vdev id information
807  * @vdev_id: vdev id to be updated in cb
808  *
809  * Return: void
810  */
811 static inline void
812 qdf_nbuf_cb_update_vdev_id(struct sk_buff *skb, uint8_t vdev_id)
813 {
814 	QDF_NBUF_CB_RX_VDEV_ID(skb) = vdev_id;
815 }
816 
817 /**
818  * __qdf_nbuf_init_replenish_timer() - Initialize the alloc replenish timer
819  *
820  * This function initializes the nbuf alloc fail replenish timer.
821  *
822  * Return: void
823  */
824 void __qdf_nbuf_init_replenish_timer(void);
825 
826 /**
827  * __qdf_nbuf_deinit_replenish_timer() - Deinitialize the alloc replenish timer
828  *
829  * This function deinitializes the nbuf alloc fail replenish timer.
830  *
831  * Return: void
832  */
833 void __qdf_nbuf_deinit_replenish_timer(void);
834 
835 /**
836  * __qdf_nbuf_len() - return the amount of valid data in the skb
837  * @skb: Pointer to network buffer
838  *
839  * This API returns the amount of valid data in the skb, If there are frags
840  * then it returns total length.
841  *
842  * Return: network buffer length
843  */
844 static inline size_t __qdf_nbuf_len(struct sk_buff *skb)
845 {
846 	int i, extra_frag_len = 0;
847 
848 	i = QDF_NBUF_CB_TX_NUM_EXTRA_FRAGS(skb);
849 	if (i > 0)
850 		extra_frag_len = QDF_NBUF_CB_TX_EXTRA_FRAG_LEN(skb);
851 
852 	return extra_frag_len + skb->len;
853 }
854 
855 /**
856  * __qdf_nbuf_num_frags_init() - init extra frags
857  * @skb: sk buffer
858  *
859  * Return: none
860  */
861 static inline
862 void __qdf_nbuf_num_frags_init(struct sk_buff *skb)
863 {
864 	QDF_NBUF_CB_TX_NUM_EXTRA_FRAGS(skb) = 0;
865 }
866 
867 /**
868  * __qdf_nbuf_push_head() - Push data in the front
869  * @skb: Pointer to network buffer
870  * @size: size to be pushed
871  *
872  * Return: New data pointer of this buf after data has been pushed,
873  *         or NULL if there is not enough room in this buf.
874  */
875 static inline uint8_t *__qdf_nbuf_push_head(struct sk_buff *skb, size_t size)
876 {
877 	if (QDF_NBUF_CB_PADDR(skb))
878 		QDF_NBUF_CB_PADDR(skb) -= size;
879 
880 	return skb_push(skb, size);
881 }
882 
883 
884 /**
885  * __qdf_nbuf_pull_head() - pull data out from the front
886  * @skb: Pointer to network buffer
887  * @size: size to be popped
888  *
889  * Return: New data pointer of this buf after data has been popped,
890  *	   or NULL if there is not sufficient data to pull.
891  */
892 static inline uint8_t *__qdf_nbuf_pull_head(struct sk_buff *skb, size_t size)
893 {
894 	if (QDF_NBUF_CB_PADDR(skb))
895 		QDF_NBUF_CB_PADDR(skb) += size;
896 
897 	return skb_pull(skb, size);
898 }
899 
900 /**
901  * qdf_nbuf_is_intra_bss() - get intra bss bit
902  * @buf: Network buffer
903  *
904  * Return: integer value - 0/1
905  */
906 static inline int qdf_nbuf_is_intra_bss(struct sk_buff *buf)
907 {
908 	return 0;
909 }
910 
911 /**
912  * qdf_nbuf_set_intra_bss() - set intra bss bit
913  * @buf: Network buffer
914  * @val: 0/1
915  *
916  * Return: void
917  */
918 static inline void qdf_nbuf_set_intra_bss(struct sk_buff *buf, uint8_t val)
919 {
920 }
921 
922 /**
923  * qdf_nbuf_init_replenish_timer - Initialize the alloc replenish timer
924  *
925  * This function initializes the nbuf alloc fail replenish timer.
926  *
927  * Return: void
928  */
929 static inline void
930 qdf_nbuf_init_replenish_timer(void)
931 {
932 	__qdf_nbuf_init_replenish_timer();
933 }
934 
935 /**
936  * qdf_nbuf_deinit_replenish_timer - Deinitialize the alloc replenish timer
937  *
938  * This function deinitializes the nbuf alloc fail replenish timer.
939  *
940  * Return: void
941  */
942 static inline void
943 qdf_nbuf_deinit_replenish_timer(void)
944 {
945 	__qdf_nbuf_deinit_replenish_timer();
946 }
947 
948 static inline void
949 __qdf_nbuf_dma_inv_range(const void *buf_start, const void *buf_end) {}
950 
951 static inline void
952 __qdf_nbuf_dma_inv_range_no_dsb(const void *buf_start, const void *buf_end) {}
953 
954 static inline void
955 __qdf_nbuf_dma_clean_range_no_dsb(const void *buf_start, const void *buf_end) {}
956 
957 static inline void
958 __qdf_dsb(void) {}
959 
960 static inline void
961 __qdf_nbuf_dma_clean_range(const void *buf_start, const void *buf_end) {}
962 
963 #endif /*_I_QDF_NBUF_M_H */
964