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