xref: /wlan-driver/qca-wifi-host-cmn/qdf/linux/src/i_qdf_nbuf_w.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2014-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-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_w.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_W_H
29*5113495bSYour Name #define _I_QDF_NBUF_W_H
30*5113495bSYour Name 
31*5113495bSYour Name /**
32*5113495bSYour Name  * struct qdf_nbuf_cb - network buffer control block contents (skb->cb)
33*5113495bSYour Name  *                    - data passed between layers of the driver.
34*5113495bSYour Name  *
35*5113495bSYour Name  * Notes:
36*5113495bSYour Name  *   1. Hard limited to 48 bytes. Please count your bytes
37*5113495bSYour Name  *   2. The size of this structure has to be easily calculable and
38*5113495bSYour Name  *      consistently so: do not use any conditional compile flags
39*5113495bSYour Name  *   3. Split into a common part followed by a tx/rx overlay
40*5113495bSYour Name  *   4. There is only one extra frag, which represents the HTC/HTT header
41*5113495bSYour Name  *   5. "ext_cb_pt" must be the first member in both TX and RX unions
42*5113495bSYour Name  *      for the priv_cb_w since it must be at same offset for both
43*5113495bSYour Name  *      TX and RX union
44*5113495bSYour Name  *   6. "ipa.owned" bit must be first member in both TX and RX unions
45*5113495bSYour Name  *      for the priv_cb_m since it must be at same offset for both
46*5113495bSYour Name  *      TX and RX union.
47*5113495bSYour Name  *
48*5113495bSYour Name  * @paddr   : physical addressed retrieved by dma_map of nbuf->data
49*5113495bSYour Name  * @u: union of TX and RX member elements
50*5113495bSYour Name  * @u.rx.ext_cb_ptr: extended cb pointer
51*5113495bSYour Name  * @u.rx.fctx: ctx to handle special pkts defined by ftype
52*5113495bSYour Name  * @u.rx.rx_ctx_id: RX ring id
53*5113495bSYour Name  * @u.rx.fcs_err: fcs error in RX packet
54*5113495bSYour Name  * @u.rx.ipa_smmu_map: do IPA smmu map
55*5113495bSYour Name  * @u.rx.flow_idx_valid: is flow_idx_valid flag
56*5113495bSYour Name  * @u.rx.flow_idx_timeout: is flow_idx_timeout flag
57*5113495bSYour Name  * @u.rx.rsvd8: reserved bits
58*5113495bSYour Name  * @u.rx.num_elements_in_list: num of elements (nbufs) in the list
59*5113495bSYour Name  * @u.rx.trace: combined structure for DP and protocol trace
60*5113495bSYour Name  * @u.rx.trace.packet_stat: {NBUF_TX_PKT_[(HDD)|(TXRX_ENQUEUE)|(TXRX_DEQUEUE)|
61*5113495bSYour Name  *                       +          (TXRX)|(HTT)|(HTC)|(HIF)|(CE)|(FREE)]
62*5113495bSYour Name  * @u.rx.trace.dp_trace: flag (Datapath trace)
63*5113495bSYour Name  * @u.rx.trace.packet_track: RX_DATA packet
64*5113495bSYour Name  * @u.rx.trace.rsrvd: enable packet logging
65*5113495bSYour Name  *
66*5113495bSYour Name  * @u.rx.protocol_tag: protocol tag set by app for rcvd packet type
67*5113495bSYour Name  * @u.rx.flow_tag: flow tag set by application for 5 tuples rcvd
68*5113495bSYour Name  *
69*5113495bSYour Name  * @u.rx.hw_info: combined structure for HW info fields
70*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.msdu_count: num of msdus
71*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.fragment_flag: is this fragment mpdu
72*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.flag_retry: is mpdu retry flag set
73*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.flag_is_ampdu: is ampdu flag set
74*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.bar_frame: is this bar frame
75*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.pn_fields_contain_valid_info: pn valid
76*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.is_raw_frame: is this raw frame
77*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.more_fragment_flag: more fragment flag
78*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.src_info: PPE VP number
79*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.mpdu_qos_control_valid: is qos ctrl valid
80*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.tid_val: tid value
81*5113495bSYour Name  *
82*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.peer_id: peer id
83*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.ml_peer_valid: is ml peer valid
84*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.vdev_id: vdev id
85*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.hw_link_id: link id of RX packet
86*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.chip_id: chip id
87*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.reserved2: reserved
88*5113495bSYour Name  *
89*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.flag_chfrag_start: first fragment of msdu
90*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.flag_chfrag_end: last fragment of msdu
91*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.flag_chfrag_cont: msdu frag is continued
92*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.msdu_len: msdu length
93*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.flag_is_frag: msdu is frag
94*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.flag_sa_valid: source address is valid
95*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.flag_da_valid: dest address is valid
96*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.flag_da_mcbc: is mcast/bcast msdu
97*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.l3_hdr_pad_msb: l3 pad bytes
98*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.tcp_udp_chksum_fail: tcp/udp checksum failed
99*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.ip_chksum_fail: ip checksum failed
100*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.fr_ds: FROM DS bit is set
101*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.to_ds: TO DS bit is set
102*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.intra_bss: this is intra-bss msdu
103*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.rsvd4: reserved
104*5113495bSYour Name  *
105*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.release_source_module: release source
106*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.bm_action: bm action
107*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.buffer_or_desc_type: buffer or desc
108*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.return_buffer_manager: rbm value
109*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.reserved_2a: reserved
110*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.cache_id: cache_id
111*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.cookie_conversion_status: cc status
112*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.rxdma_push_reason: rxdma push reason
113*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.rxdma_error_code: rxdma error code
114*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.reo_push_reason: reo push reason
115*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.reo_error_code: reo error code
116*5113495bSYour Name  * @u.rx.hw_info.desc_tlv_members.wbm_internal_error: wbm internal error
117*5113495bSYour Name  *
118*5113495bSYour Name  * @u.rx.hw_info.desc_info.mpdu_desc_info[2]: reo destination mpdu desc info
119*5113495bSYour Name  * @u.rx.hw_info.desc_info.msdu_desc_info: reo destination msdu desc info
120*5113495bSYour Name  * @u.rx.hw_info.desc_info.rx_error_code: wbm error codes
121*5113495bSYour Name  *
122*5113495bSYour Name  *
123*5113495bSYour Name  * @u.tx.ext_cb_ptr: extended cb pointer
124*5113495bSYour Name  * @u.tx.fctx: ctx to handle special pkts defined by ftype
125*5113495bSYour Name  * @u.tx.ftype: ftype
126*5113495bSYour Name  * @u.tx.xmit_type: xmit type of packet (MLD/Legacy)
127*5113495bSYour Name  * @u.tx.reserved: unused
128*5113495bSYour Name  * @u.tx.vdev_id: vdev_id
129*5113495bSYour Name  * @u.tx.len: len
130*5113495bSYour Name  * @u.tx.flags:
131*5113495bSYour Name  * @u.tx.flags.bits.flag_efrag:
132*5113495bSYour Name  * @u.tx.flags.bits.flag_nbuf:
133*5113495bSYour Name  * @u.tx.flags.bits.num:
134*5113495bSYour Name  * @u.tx.flags.bits.flag_chfrag_start:
135*5113495bSYour Name  * @u.tx.flags.bits.flag_chfrag_cont:
136*5113495bSYour Name  * @u.tx.flags.bits.flag_chfrag_end:
137*5113495bSYour Name  * @u.tx.flags.bits.flag_ext_header:
138*5113495bSYour Name  * @u.tx.flags.bits.is_critical:
139*5113495bSYour Name  * @u.tx.flags.u8:
140*5113495bSYour Name  * @u.tx.trace.packet_state:  {NBUF_TX_PKT_[(HDD)|(TXRX_ENQUEUE)|(TXRX_DEQUEUE)|
141*5113495bSYour Name  *			+          (TXRX)|(HTT)|(HTC)|(HIF)|(CE)|(FREE)]
142*5113495bSYour Name  * @u.tx.trace.is_packet_priv:
143*5113495bSYour Name  * @u.tx.trace.packet_track: {NBUF_TX_PKT_[(DATA)|(MGMT)]_TRACK}
144*5113495bSYour Name  * @u.tx.trace.to_fw: Flag to indicate send this packet to FW
145*5113495bSYour Name  * @u.tx.trace.htt2_frm: flag (high-latency path only)
146*5113495bSYour Name  * @u.tx.trace.proto_type: bitmap of NBUF_PKT_TRAC_TYPE[(EAPOL)|(DHCP)|
147*5113495bSYour Name  *			+ (MGMT_ACTION)] - 4 bits
148*5113495bSYour Name  * @u.tx.trace.dp_trace: flag (Datapath trace)
149*5113495bSYour Name  * @u.tx.trace.is_bcast: flag (Broadcast packet)
150*5113495bSYour Name  * @u.tx.trace.is_mcast: flag (Multicast packet)
151*5113495bSYour Name  * @u.tx.trace.packet_type: flag (Packet type)
152*5113495bSYour Name  * @u.tx.trace.print: enable packet logging
153*5113495bSYour Name  *
154*5113495bSYour Name  * @u.tx.vaddr: virtual address of ~
155*5113495bSYour Name  * @u.tx.paddr: physical/DMA address of ~
156*5113495bSYour Name  */
157*5113495bSYour Name 
158*5113495bSYour Name struct qdf_nbuf_cb {
159*5113495bSYour Name 	/* common */
160*5113495bSYour Name 	qdf_paddr_t paddr; /* of skb->data */
161*5113495bSYour Name 	/* valid only in one direction */
162*5113495bSYour Name 	union {
163*5113495bSYour Name 		/* Note: MAX: 40 bytes */
164*5113495bSYour Name 		struct {
165*5113495bSYour Name 			void *ext_cb_ptr;
166*5113495bSYour Name 			void *fctx;
167*5113495bSYour Name 			uint16_t ftype:4,
168*5113495bSYour Name 				 rx_ctx_id:4,
169*5113495bSYour Name 				 fcs_err:1,
170*5113495bSYour Name 				 ipa_smmu_map:1,
171*5113495bSYour Name 				 flow_idx_valid:1,
172*5113495bSYour Name 				 flow_idx_timeout:1,
173*5113495bSYour Name 				 rsvd8:4;
174*5113495bSYour Name 			uint8_t num_elements_in_list;
175*5113495bSYour Name 			union {
176*5113495bSYour Name 				uint8_t packet_state;
177*5113495bSYour Name 				uint8_t dp_trace:1,
178*5113495bSYour Name 					packet_track:3,
179*5113495bSYour Name 					rsrvd:4;
180*5113495bSYour Name 			} trace;
181*5113495bSYour Name 			uint16_t protocol_tag;
182*5113495bSYour Name 			uint16_t flow_tag;
183*5113495bSYour Name 			union {
184*5113495bSYour Name 				struct {
185*5113495bSYour Name 					/* do not re-arrange the fields in
186*5113495bSYour Name 					 * the below 3 uint32_t words as
187*5113495bSYour Name 					 * they map exactly to the desc info
188*5113495bSYour Name 					 */
189*5113495bSYour Name #ifndef BIG_ENDIAN_HOST
190*5113495bSYour Name 					/* 1st word rx_mpdu_desc_info */
191*5113495bSYour Name 					uint32_t msdu_count:8,
192*5113495bSYour Name 						 fragment_flag:1,
193*5113495bSYour Name 						 flag_retry:1,
194*5113495bSYour Name 						 flag_is_ampdu:1,
195*5113495bSYour Name 						 bar_frame:1,
196*5113495bSYour Name 						 pn_fields_contain_valid_info:1,
197*5113495bSYour Name 						 is_raw_frame:1,
198*5113495bSYour Name 						 more_fragment_flag:1,
199*5113495bSYour Name 						 src_info:12,
200*5113495bSYour Name 						 mpdu_qos_control_valid:1,
201*5113495bSYour Name 						 tid_val:4;
202*5113495bSYour Name #else
203*5113495bSYour Name 					uint32_t tid_val:4,
204*5113495bSYour Name 						 mpdu_qos_control_valid:1,
205*5113495bSYour Name 						 src_info:12,
206*5113495bSYour Name 						 more_fragment_flag:1,
207*5113495bSYour Name 						 is_raw_frame:1,
208*5113495bSYour Name 						 pn_fields_contain_valid_info:1,
209*5113495bSYour Name 						 bar_frame:1,
210*5113495bSYour Name 						 flag_is_ampdu:1,
211*5113495bSYour Name 						 flag_retry:1,
212*5113495bSYour Name 						 fragment_flag:1,
213*5113495bSYour Name 						 msdu_count:8;
214*5113495bSYour Name #endif
215*5113495bSYour Name 					/* 2nd word rx_mpdu_desc_info */
216*5113495bSYour Name 					uint32_t peer_id:14,
217*5113495bSYour Name 						 vdev_id:8,
218*5113495bSYour Name 						 hw_link_id:4,
219*5113495bSYour Name 						 chip_id:3,
220*5113495bSYour Name 						 reserved2:3;
221*5113495bSYour Name #ifndef BIG_ENDIAN_HOST
222*5113495bSYour Name 					/* 1st word of rx_msdu_desc_info */
223*5113495bSYour Name 					uint32_t flag_chfrag_start:1,
224*5113495bSYour Name 						 flag_chfrag_end:1,
225*5113495bSYour Name 						 flag_chfrag_cont:1,
226*5113495bSYour Name 						 msdu_len:14,
227*5113495bSYour Name 						 flag_is_frag:1,
228*5113495bSYour Name 						 flag_sa_valid:1,
229*5113495bSYour Name 						 flag_da_valid:1,
230*5113495bSYour Name 						 flag_da_mcbc:1,
231*5113495bSYour Name 						 l3_hdr_pad_msb:1,
232*5113495bSYour Name 						 tcp_udp_chksum_fail:1,
233*5113495bSYour Name 						 ip_chksum_fail:1,
234*5113495bSYour Name 						 fr_ds:1,
235*5113495bSYour Name 						 to_ds:1,
236*5113495bSYour Name 						 intra_bss:1,
237*5113495bSYour Name 						 rsvd4:5;
238*5113495bSYour Name 					uint32_t release_source_module:3,
239*5113495bSYour Name 						 bm_action:3,
240*5113495bSYour Name 						 buffer_or_desc_type:3,
241*5113495bSYour Name 						 return_buffer_manager:4,
242*5113495bSYour Name 						 reserved_2a:2,
243*5113495bSYour Name 						 cache_id:1,
244*5113495bSYour Name 						 cookie_conversion_status:1,
245*5113495bSYour Name 						 rxdma_push_reason:2,
246*5113495bSYour Name 						 rxdma_error_code:5,
247*5113495bSYour Name 						 reo_push_reason:2,
248*5113495bSYour Name 						 reo_error_code:5,
249*5113495bSYour Name 						 wbm_internal_error:1;
250*5113495bSYour Name #else
251*5113495bSYour Name 					uint32_t rsvd4:5,
252*5113495bSYour Name 						 intra_bss:1,
253*5113495bSYour Name 						 to_ds:1,
254*5113495bSYour Name 						 fr_ds:1,
255*5113495bSYour Name 						 ip_chksum_fail:1,
256*5113495bSYour Name 						 tcp_udp_chksum_fail:1,
257*5113495bSYour Name 						 l3_hdr_pad_msb:1,
258*5113495bSYour Name 						 flag_da_mcbc:1,
259*5113495bSYour Name 						 flag_da_valid:1,
260*5113495bSYour Name 						 flag_sa_valid:1,
261*5113495bSYour Name 						 flag_is_frag:1,
262*5113495bSYour Name 						 msdu_len:14,
263*5113495bSYour Name 						 flag_chfrag_cont:1,
264*5113495bSYour Name 						 flag_chfrag_end:1,
265*5113495bSYour Name 						 flag_chfrag_start:1;
266*5113495bSYour Name 					uint32_t wbm_internal_error:1,
267*5113495bSYour Name 						 reo_error_code:5,
268*5113495bSYour Name 						 reo_push_reason:2,
269*5113495bSYour Name 						 rxdma_error_code:5,
270*5113495bSYour Name 						 rxdma_push_reason:2,
271*5113495bSYour Name 						 cookie_conversion_status:1,
272*5113495bSYour Name 						 cache_id:1,
273*5113495bSYour Name 						 reserved_2a:2,
274*5113495bSYour Name 						 return_buffer_manager:4,
275*5113495bSYour Name 						 buffer_or_desc_type:3,
276*5113495bSYour Name 						 bm_action:3,
277*5113495bSYour Name 						 release_source_module:3;
278*5113495bSYour Name #endif
279*5113495bSYour Name 				} desc_tlv_members;
280*5113495bSYour Name 				struct {
281*5113495bSYour Name 					uint32_t mpdu_desc_info[2];
282*5113495bSYour Name 					uint32_t msdu_desc_info;
283*5113495bSYour Name 					uint32_t rx_error_codes;
284*5113495bSYour Name 				} desc_info;
285*5113495bSYour Name 			} hw_info;
286*5113495bSYour Name 		} rx;
287*5113495bSYour Name 
288*5113495bSYour Name 		/* Note: MAX: 40 bytes */
289*5113495bSYour Name 		struct {
290*5113495bSYour Name 			void *ext_cb_ptr;
291*5113495bSYour Name 			void *fctx;
292*5113495bSYour Name 			uint8_t ftype:4,
293*5113495bSYour Name 				xmit_type:1,
294*5113495bSYour Name 				reserved:3;
295*5113495bSYour Name 			uint8_t vdev_id;
296*5113495bSYour Name 			uint16_t len;
297*5113495bSYour Name 			union {
298*5113495bSYour Name 				struct {
299*5113495bSYour Name 					uint8_t flag_efrag:1,
300*5113495bSYour Name 						flag_nbuf:1,
301*5113495bSYour Name 						num:1,
302*5113495bSYour Name 						flag_chfrag_start:1,
303*5113495bSYour Name 						flag_chfrag_cont:1,
304*5113495bSYour Name 						flag_chfrag_end:1,
305*5113495bSYour Name 						flag_ext_header:1,
306*5113495bSYour Name 						is_critical:1;
307*5113495bSYour Name 				} bits;
308*5113495bSYour Name 				uint8_t u8;
309*5113495bSYour Name 			} flags;
310*5113495bSYour Name 			struct {
311*5113495bSYour Name 				uint8_t packet_state:7,
312*5113495bSYour Name 					is_packet_priv:1;
313*5113495bSYour Name 				uint8_t packet_track:3,
314*5113495bSYour Name 					to_fw:1,
315*5113495bSYour Name 					/* used only for hl */
316*5113495bSYour Name 					htt2_frm:1,
317*5113495bSYour Name 					proto_type:3;
318*5113495bSYour Name 				uint8_t dp_trace:1,
319*5113495bSYour Name 					is_bcast:1,
320*5113495bSYour Name 					is_mcast:1,
321*5113495bSYour Name 					packet_type:4,
322*5113495bSYour Name 					print:1;
323*5113495bSYour Name 			} trace;
324*5113495bSYour Name 			unsigned char *vaddr;
325*5113495bSYour Name 			qdf_paddr_t paddr;
326*5113495bSYour Name 		} tx;
327*5113495bSYour Name 	} u;
328*5113495bSYour Name }; /* struct qdf_nbuf_cb: MAX 48 bytes */
329*5113495bSYour Name 
330*5113495bSYour Name #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 16, 0))
331*5113495bSYour Name QDF_COMPILE_TIME_ASSERT(qdf_nbuf_cb_size,
332*5113495bSYour Name 			(sizeof(struct qdf_nbuf_cb)) <=
333*5113495bSYour Name 			sizeof_field(struct sk_buff, cb));
334*5113495bSYour Name #else
335*5113495bSYour Name QDF_COMPILE_TIME_ASSERT(qdf_nbuf_cb_size,
336*5113495bSYour Name 			(sizeof(struct qdf_nbuf_cb)) <=
337*5113495bSYour Name 			FIELD_SIZEOF(struct sk_buff, cb));
338*5113495bSYour Name #endif
339*5113495bSYour Name 
340*5113495bSYour Name /*
341*5113495bSYour Name  *  access macros to qdf_nbuf_cb
342*5113495bSYour Name  *  Note: These macros can be used as L-values as well as R-values.
343*5113495bSYour Name  *        When used as R-values, they effectively function as "get" macros
344*5113495bSYour Name  *        When used as L_values, they effectively function as "set" macros
345*5113495bSYour Name  */
346*5113495bSYour Name 
347*5113495bSYour Name #define QDF_NBUF_CB_PADDR(skb) \
348*5113495bSYour Name 	(((struct qdf_nbuf_cb *)((skb)->cb))->paddr.dma_addr)
349*5113495bSYour Name 
350*5113495bSYour Name #define QDF_NBUF_CB_RX_CTX_ID(skb) \
351*5113495bSYour Name 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.rx_ctx_id)
352*5113495bSYour Name #define QDF_NBUF_CB_RX_NUM_ELEMENTS_IN_LIST(skb) \
353*5113495bSYour Name 		(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.num_elements_in_list)
354*5113495bSYour Name 
355*5113495bSYour Name #define QDF_NBUF_CB_RX_PACKET_STATE(skb)\
356*5113495bSYour Name 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.trace.packet_state)
357*5113495bSYour Name #define QDF_NBUF_CB_RX_DP_TRACE(skb) \
358*5113495bSYour Name 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.trace.dp_trace)
359*5113495bSYour Name 
360*5113495bSYour Name #define QDF_NBUF_CB_RX_FTYPE(skb) \
361*5113495bSYour Name 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.ftype)
362*5113495bSYour Name 
363*5113495bSYour Name #define QDF_NBUF_CB_PKT_XMIT_TYPE(skb) \
364*5113495bSYour Name 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.xmit_type)
365*5113495bSYour Name 
366*5113495bSYour Name #define QDF_NBUF_CB_RX_CHFRAG_START(skb) \
367*5113495bSYour Name 	(((struct qdf_nbuf_cb *) \
368*5113495bSYour Name 	((skb)->cb))->u.rx.hw_info.desc_tlv_members.flag_chfrag_start)
369*5113495bSYour Name #define QDF_NBUF_CB_RX_CHFRAG_CONT(skb) \
370*5113495bSYour Name 	(((struct qdf_nbuf_cb *) \
371*5113495bSYour Name 	((skb)->cb))->u.rx.hw_info.desc_tlv_members.flag_chfrag_cont)
372*5113495bSYour Name #define QDF_NBUF_CB_RX_CHFRAG_END(skb) \
373*5113495bSYour Name 		(((struct qdf_nbuf_cb *) \
374*5113495bSYour Name 		((skb)->cb))->u.rx.hw_info.desc_tlv_members.flag_chfrag_end)
375*5113495bSYour Name 
376*5113495bSYour Name #define QDF_NBUF_CB_RX_DA_MCBC(skb) \
377*5113495bSYour Name 	(((struct qdf_nbuf_cb *) \
378*5113495bSYour Name 	((skb)->cb))->u.rx.hw_info.desc_tlv_members.flag_da_mcbc)
379*5113495bSYour Name 
380*5113495bSYour Name #define QDF_NBUF_CB_RX_L3_PAD_MSB(skb) \
381*5113495bSYour Name 	(((struct qdf_nbuf_cb *) \
382*5113495bSYour Name 	((skb)->cb))->u.rx.hw_info.desc_tlv_members.l3_hdr_pad_msb)
383*5113495bSYour Name 
384*5113495bSYour Name #define QDF_NBUF_CB_RX_DA_VALID(skb) \
385*5113495bSYour Name 	(((struct qdf_nbuf_cb *) \
386*5113495bSYour Name 	((skb)->cb))->u.rx.hw_info.desc_tlv_members.flag_da_valid)
387*5113495bSYour Name 
388*5113495bSYour Name #define QDF_NBUF_CB_RX_SA_VALID(skb) \
389*5113495bSYour Name 	(((struct qdf_nbuf_cb *) \
390*5113495bSYour Name 	((skb)->cb))->u.rx.hw_info.desc_tlv_members.flag_sa_valid)
391*5113495bSYour Name 
392*5113495bSYour Name #define QDF_NBUF_CB_RX_RETRY_FLAG(skb) \
393*5113495bSYour Name 	(((struct qdf_nbuf_cb *) \
394*5113495bSYour Name 	((skb)->cb))->u.rx.hw_info.desc_tlv_members.flag_retry)
395*5113495bSYour Name 
396*5113495bSYour Name #define QDF_NBUF_CB_RX_RAW_FRAME(skb) \
397*5113495bSYour Name 	(((struct qdf_nbuf_cb *) \
398*5113495bSYour Name 	((skb)->cb))->u.rx.hw_info.desc_tlv_members.is_raw_frame)
399*5113495bSYour Name 
400*5113495bSYour Name #define QDF_NBUF_CB_RX_FROM_DS(skb) \
401*5113495bSYour Name 	(((struct qdf_nbuf_cb *) \
402*5113495bSYour Name 	  ((skb)->cb))->u.rx.hw_info.desc_tlv_members.fr_ds)
403*5113495bSYour Name 
404*5113495bSYour Name #define QDF_NBUF_CB_RX_TO_DS(skb) \
405*5113495bSYour Name 	(((struct qdf_nbuf_cb *) \
406*5113495bSYour Name 	  ((skb)->cb))->u.rx.hw_info.desc_tlv_members.to_ds)
407*5113495bSYour Name 
408*5113495bSYour Name #define QDF_NBUF_CB_RX_IS_FRAG(skb) \
409*5113495bSYour Name 	(((struct qdf_nbuf_cb *) \
410*5113495bSYour Name 	((skb)->cb))->u.rx.hw_info.desc_tlv_members.flag_is_frag)
411*5113495bSYour Name 
412*5113495bSYour Name #define QDF_NBUF_CB_RX_FCS_ERR(skb) \
413*5113495bSYour Name 	(((struct qdf_nbuf_cb *) \
414*5113495bSYour Name 	  ((skb)->cb))->u.rx.fcs_err)
415*5113495bSYour Name 
416*5113495bSYour Name #define QDF_NBUF_CB_RX_MSDU_DESC_INFO(skb) \
417*5113495bSYour Name 	(((struct qdf_nbuf_cb *) \
418*5113495bSYour Name 	  ((skb)->cb))->u.rx.hw_info.desc_info.msdu_desc_info)
419*5113495bSYour Name 
420*5113495bSYour Name #define QDF_NBUF_CB_RX_MPDU_DESC_INFO(skb) \
421*5113495bSYour Name 	(((struct qdf_nbuf_cb *) \
422*5113495bSYour Name 	  ((skb)->cb))->u.rx.hw_info.desc_info.mpdu_desc_info)
423*5113495bSYour Name 
424*5113495bSYour Name #define QDF_NBUF_CB_RX_MPDU_DESC_INFO_1(skb) \
425*5113495bSYour Name 	(((struct qdf_nbuf_cb *) \
426*5113495bSYour Name 	  ((skb)->cb))->u.rx.hw_info.desc_info.mpdu_desc_info[0])
427*5113495bSYour Name 
428*5113495bSYour Name #define QDF_NBUF_CB_RX_MPDU_DESC_INFO_2(skb) \
429*5113495bSYour Name 	(((struct qdf_nbuf_cb *) \
430*5113495bSYour Name 	  ((skb)->cb))->u.rx.hw_info.desc_info.mpdu_desc_info[1])
431*5113495bSYour Name 
432*5113495bSYour Name #define QDF_NBUF_CB_RX_ERROR_CODE_INFO(skb) \
433*5113495bSYour Name 	(((struct qdf_nbuf_cb *) \
434*5113495bSYour Name 	  ((skb)->cb))->u.rx.hw_info.desc_info.rx_error_codes)
435*5113495bSYour Name 
436*5113495bSYour Name #define QDF_NBUF_CB_RX_PEER_ID(skb) \
437*5113495bSYour Name 	(((struct qdf_nbuf_cb *) \
438*5113495bSYour Name 	  ((skb)->cb))->u.rx.hw_info.desc_tlv_members.peer_id)
439*5113495bSYour Name 
440*5113495bSYour Name #define QDF_NBUF_CB_RX_VDEV_ID(skb) \
441*5113495bSYour Name 	(((struct qdf_nbuf_cb *) \
442*5113495bSYour Name 	  ((skb)->cb))->u.rx.hw_info.desc_tlv_members.vdev_id)
443*5113495bSYour Name 
444*5113495bSYour Name #define QDF_NBUF_CB_RX_PKT_LEN(skb) \
445*5113495bSYour Name 	(((struct qdf_nbuf_cb *) \
446*5113495bSYour Name 	  ((skb)->cb))->u.rx.hw_info.desc_tlv_members.msdu_len)
447*5113495bSYour Name 
448*5113495bSYour Name #define QDF_NBUF_CB_RX_TID_VAL(skb) \
449*5113495bSYour Name 	(((struct qdf_nbuf_cb *) \
450*5113495bSYour Name 	  ((skb)->cb))->u.rx.hw_info.desc_tlv_members.tid_val)
451*5113495bSYour Name 
452*5113495bSYour Name #define QDF_NBUF_CB_RX_NUM_ELEMENTS_IN_LIST(skb) \
453*5113495bSYour Name 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.num_elements_in_list)
454*5113495bSYour Name 
455*5113495bSYour Name #define QDF_NBUF_UPDATE_TX_PKT_COUNT(skb, PACKET_STATE) \
456*5113495bSYour Name 	qdf_nbuf_set_state(skb, PACKET_STATE)
457*5113495bSYour Name 
458*5113495bSYour Name #define QDF_NBUF_CB_TX_FTYPE(skb) \
459*5113495bSYour Name 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.ftype)
460*5113495bSYour Name 
461*5113495bSYour Name #define QDF_NBUF_CB_TX_EXTRA_FRAG_LEN(skb) \
462*5113495bSYour Name 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.len)
463*5113495bSYour Name #define QDF_NBUF_CB_TX_VDEV_CTX(skb) \
464*5113495bSYour Name 		(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.vdev_id)
465*5113495bSYour Name 
466*5113495bSYour Name /* Tx Flags Accessor Macros*/
467*5113495bSYour Name #define QDF_NBUF_CB_TX_EXTRA_FRAG_WORDSTR_EFRAG(skb) \
468*5113495bSYour Name 	(((struct qdf_nbuf_cb *) \
469*5113495bSYour Name 		((skb)->cb))->u.tx.flags.bits.flag_efrag)
470*5113495bSYour Name #define QDF_NBUF_CB_TX_EXTRA_FRAG_WORDSTR_NBUF(skb) \
471*5113495bSYour Name 	(((struct qdf_nbuf_cb *) \
472*5113495bSYour Name 		((skb)->cb))->u.tx.flags.bits.flag_nbuf)
473*5113495bSYour Name #define QDF_NBUF_CB_TX_NUM_EXTRA_FRAGS(skb) \
474*5113495bSYour Name 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.flags.bits.num)
475*5113495bSYour Name #define QDF_NBUF_CB_TX_EXTRA_FRAG_FLAGS_CHFRAG_START(skb) \
476*5113495bSYour Name 	(((struct qdf_nbuf_cb *) \
477*5113495bSYour Name 	((skb)->cb))->u.tx.flags.bits.flag_chfrag_start)
478*5113495bSYour Name #define QDF_NBUF_CB_TX_EXTRA_FRAG_FLAGS_CHFRAG_CONT(skb) \
479*5113495bSYour Name 	(((struct qdf_nbuf_cb *) \
480*5113495bSYour Name 	((skb)->cb))->u.tx.flags.bits.flag_chfrag_cont)
481*5113495bSYour Name #define QDF_NBUF_CB_TX_EXTRA_FRAG_FLAGS_CHFRAG_END(skb) \
482*5113495bSYour Name 		(((struct qdf_nbuf_cb *) \
483*5113495bSYour Name 		((skb)->cb))->u.tx.flags.bits.flag_chfrag_end)
484*5113495bSYour Name #define QDF_NBUF_CB_TX_EXTRA_FRAG_FLAGS_EXT_HEADER(skb) \
485*5113495bSYour Name 		(((struct qdf_nbuf_cb *) \
486*5113495bSYour Name 		((skb)->cb))->u.tx.flags.bits.flag_ext_header)
487*5113495bSYour Name #define QDF_NBUF_CB_TX_EXTRA_FRAG_WORDSTR_FLAGS(skb) \
488*5113495bSYour Name 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.flags.u8)
489*5113495bSYour Name 
490*5113495bSYour Name #define QDF_NBUF_CB_TX_EXTRA_IS_CRITICAL(skb) \
491*5113495bSYour Name 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.flags.bits.is_critical)
492*5113495bSYour Name /* End of Tx Flags Accessor Macros */
493*5113495bSYour Name 
494*5113495bSYour Name /* Tx trace accessor macros */
495*5113495bSYour Name #define QDF_NBUF_CB_TX_PACKET_STATE(skb)\
496*5113495bSYour Name 	(((struct qdf_nbuf_cb *) \
497*5113495bSYour Name 		((skb)->cb))->u.tx.trace.packet_state)
498*5113495bSYour Name 
499*5113495bSYour Name #define QDF_NBUF_CB_TX_IS_PACKET_PRIV(skb) \
500*5113495bSYour Name 	(((struct qdf_nbuf_cb *) \
501*5113495bSYour Name 		((skb)->cb))->u.tx.trace.is_packet_priv)
502*5113495bSYour Name 
503*5113495bSYour Name #define QDF_NBUF_CB_TX_PACKET_TRACK(skb)\
504*5113495bSYour Name 	(((struct qdf_nbuf_cb *) \
505*5113495bSYour Name 		((skb)->cb))->u.tx.trace.packet_track)
506*5113495bSYour Name 
507*5113495bSYour Name #define QDF_NBUF_CB_TX_PACKET_TO_FW(skb)\
508*5113495bSYour Name 	(((struct qdf_nbuf_cb *) \
509*5113495bSYour Name 		((skb)->cb))->u.tx.trace.to_fw)
510*5113495bSYour Name 
511*5113495bSYour Name #define QDF_NBUF_CB_RX_PACKET_TRACK(skb)\
512*5113495bSYour Name 		(((struct qdf_nbuf_cb *) \
513*5113495bSYour Name 			((skb)->cb))->u.rx.trace.packet_track)
514*5113495bSYour Name 
515*5113495bSYour Name #define QDF_NBUF_CB_TX_PROTO_TYPE(skb)\
516*5113495bSYour Name 	(((struct qdf_nbuf_cb *) \
517*5113495bSYour Name 		((skb)->cb))->u.tx.trace.proto_type)
518*5113495bSYour Name 
519*5113495bSYour Name #define QDF_NBUF_CB_TX_DP_TRACE(skb)\
520*5113495bSYour Name 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.trace.dp_trace)
521*5113495bSYour Name 
522*5113495bSYour Name #define QDF_NBUF_CB_DP_TRACE_PRINT(skb)	\
523*5113495bSYour Name 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.trace.print)
524*5113495bSYour Name 
525*5113495bSYour Name #define QDF_NBUF_CB_TX_HL_HTT2_FRM(skb)	\
526*5113495bSYour Name 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.trace.htt2_frm)
527*5113495bSYour Name 
528*5113495bSYour Name #define QDF_NBUF_CB_GET_IS_BCAST(skb)\
529*5113495bSYour Name 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.trace.is_bcast)
530*5113495bSYour Name 
531*5113495bSYour Name #define QDF_NBUF_CB_GET_IS_MCAST(skb)\
532*5113495bSYour Name 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.trace.is_mcast)
533*5113495bSYour Name 
534*5113495bSYour Name #define QDF_NBUF_CB_GET_PACKET_TYPE(skb)\
535*5113495bSYour Name 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.trace.packet_type)
536*5113495bSYour Name 
537*5113495bSYour Name #define QDF_NBUF_CB_SET_BCAST(skb) \
538*5113495bSYour Name 	(((struct qdf_nbuf_cb *) \
539*5113495bSYour Name 		((skb)->cb))->u.tx.trace.is_bcast = true)
540*5113495bSYour Name 
541*5113495bSYour Name #define QDF_NBUF_CB_SET_MCAST(skb) \
542*5113495bSYour Name 	(((struct qdf_nbuf_cb *) \
543*5113495bSYour Name 		((skb)->cb))->u.tx.trace.is_mcast = true)
544*5113495bSYour Name /* End of Tx trace accessor macros */
545*5113495bSYour Name 
546*5113495bSYour Name #define QDF_NBUF_CB_TX_EXTRA_FRAG_VADDR(skb) \
547*5113495bSYour Name 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.vaddr)
548*5113495bSYour Name #define QDF_NBUF_CB_TX_EXTRA_FRAG_PADDR(skb) \
549*5113495bSYour Name 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.paddr.dma_addr)
550*5113495bSYour Name 
551*5113495bSYour Name /* assume the OS provides a single fragment */
552*5113495bSYour Name #define __qdf_nbuf_get_num_frags(skb)		   \
553*5113495bSYour Name 	(QDF_NBUF_CB_TX_NUM_EXTRA_FRAGS(skb) + 1)
554*5113495bSYour Name 
555*5113495bSYour Name #define __qdf_nbuf_reset_num_frags(skb) \
556*5113495bSYour Name 	(QDF_NBUF_CB_TX_NUM_EXTRA_FRAGS(skb) = 0)
557*5113495bSYour Name 
558*5113495bSYour Name /* ext_cb accessor macros and internal API's */
559*5113495bSYour Name #define QDF_NBUF_CB_EXT_CB(skb) \
560*5113495bSYour Name 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.ext_cb_ptr)
561*5113495bSYour Name 
562*5113495bSYour Name #define __qdf_nbuf_set_ext_cb(skb, ref) \
563*5113495bSYour Name 	do { \
564*5113495bSYour Name 		QDF_NBUF_CB_EXT_CB((skb)) = (ref); \
565*5113495bSYour Name 	} while (0)
566*5113495bSYour Name 
567*5113495bSYour Name #define __qdf_nbuf_get_ext_cb(skb) \
568*5113495bSYour Name 	QDF_NBUF_CB_EXT_CB((skb))
569*5113495bSYour Name 
570*5113495bSYour Name /* fctx accessor macros and internal API's*/
571*5113495bSYour Name #define QDF_NBUF_CB_RX_FCTX(skb) \
572*5113495bSYour Name 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.fctx)
573*5113495bSYour Name 
574*5113495bSYour Name #define QDF_NBUF_CB_TX_FCTX(skb) \
575*5113495bSYour Name 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.fctx)
576*5113495bSYour Name 
577*5113495bSYour Name #define QDF_NBUF_CB_RX_INTRA_BSS(skb) \
578*5113495bSYour Name 	(((struct qdf_nbuf_cb *) \
579*5113495bSYour Name 	  ((skb)->cb))->u.rx.hw_info.desc_tlv_members.intra_bss)
580*5113495bSYour Name 
581*5113495bSYour Name #define __qdf_nbuf_set_rx_fctx_type(skb, ctx, type) \
582*5113495bSYour Name 	do { \
583*5113495bSYour Name 		QDF_NBUF_CB_RX_FCTX((skb)) = (ctx); \
584*5113495bSYour Name 		QDF_NBUF_CB_RX_FTYPE((skb)) = (type); \
585*5113495bSYour Name 	} while (0)
586*5113495bSYour Name 
587*5113495bSYour Name #define __qdf_nbuf_get_rx_fctx(skb) \
588*5113495bSYour Name 		 QDF_NBUF_CB_RX_FCTX((skb))
589*5113495bSYour Name 
590*5113495bSYour Name #define __qdf_nbuf_set_intra_bss(skb, val) \
591*5113495bSYour Name 	((QDF_NBUF_CB_RX_INTRA_BSS((skb))) = val)
592*5113495bSYour Name 
593*5113495bSYour Name #define __qdf_nbuf_is_intra_bss(skb) \
594*5113495bSYour Name 	(QDF_NBUF_CB_RX_INTRA_BSS((skb)))
595*5113495bSYour Name 
596*5113495bSYour Name #define __qdf_nbuf_set_tx_fctx_type(skb, ctx, type) \
597*5113495bSYour Name 	do { \
598*5113495bSYour Name 		QDF_NBUF_CB_TX_FCTX((skb)) = (ctx); \
599*5113495bSYour Name 		QDF_NBUF_CB_TX_FTYPE((skb)) = (type); \
600*5113495bSYour Name 	} while (0)
601*5113495bSYour Name 
602*5113495bSYour Name #define __qdf_nbuf_get_tx_fctx(skb) \
603*5113495bSYour Name 		 QDF_NBUF_CB_TX_FCTX((skb))
604*5113495bSYour Name 
605*5113495bSYour Name #define QDF_NBUF_CB_RX_PROTOCOL_TAG(skb) \
606*5113495bSYour Name 		(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.protocol_tag)
607*5113495bSYour Name 
608*5113495bSYour Name #define __qdf_nbuf_set_rx_protocol_tag(skb, val) \
609*5113495bSYour Name 		((QDF_NBUF_CB_RX_PROTOCOL_TAG((skb))) = val)
610*5113495bSYour Name 
611*5113495bSYour Name #define __qdf_nbuf_get_rx_protocol_tag(skb) \
612*5113495bSYour Name 		(QDF_NBUF_CB_RX_PROTOCOL_TAG((skb)))
613*5113495bSYour Name 
614*5113495bSYour Name #define QDF_NBUF_CB_RX_FLOW_TAG(skb) \
615*5113495bSYour Name 		(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.flow_tag)
616*5113495bSYour Name 
617*5113495bSYour Name #define __qdf_nbuf_set_rx_flow_tag(skb, val) \
618*5113495bSYour Name 		((QDF_NBUF_CB_RX_FLOW_TAG((skb))) = val)
619*5113495bSYour Name 
620*5113495bSYour Name #define __qdf_nbuf_get_rx_flow_tag(skb) \
621*5113495bSYour Name 		(QDF_NBUF_CB_RX_FLOW_TAG((skb)))
622*5113495bSYour Name 
623*5113495bSYour Name #define QDF_NBUF_CB_RX_FLOW_IDX_VALID(skb) \
624*5113495bSYour Name 		(((struct qdf_nbuf_cb *) \
625*5113495bSYour Name 		((skb)->cb))->u.rx.flow_idx_valid)
626*5113495bSYour Name 
627*5113495bSYour Name #define __qdf_nbuf_set_rx_flow_idx_valid(skb, val) \
628*5113495bSYour Name 		((QDF_NBUF_CB_RX_FLOW_IDX_VALID((skb))) = val)
629*5113495bSYour Name 
630*5113495bSYour Name #define __qdf_nbuf_get_rx_flow_idx_valid(skb) \
631*5113495bSYour Name 		(QDF_NBUF_CB_RX_FLOW_IDX_VALID((skb)))
632*5113495bSYour Name 
633*5113495bSYour Name #define QDF_NBUF_CB_RX_FLOW_IDX_TIMEOUT(skb) \
634*5113495bSYour Name 		(((struct qdf_nbuf_cb *) \
635*5113495bSYour Name 		((skb)->cb))->u.rx.flow_idx_timeout)
636*5113495bSYour Name 
637*5113495bSYour Name #define QDF_NBUF_CB_RX_HW_LINK_ID(skb) \
638*5113495bSYour Name 		(((struct qdf_nbuf_cb *) \
639*5113495bSYour Name 		((skb)->cb))->u.rx.hw_info.desc_tlv_members.hw_link_id)
640*5113495bSYour Name 
641*5113495bSYour Name #define __qdf_nbuf_set_rx_flow_idx_timeout(skb, val) \
642*5113495bSYour Name 		((QDF_NBUF_CB_RX_FLOW_IDX_TIMEOUT((skb))) = val)
643*5113495bSYour Name 
644*5113495bSYour Name #define __qdf_nbuf_get_rx_flow_idx_timeout(skb) \
645*5113495bSYour Name 		(QDF_NBUF_CB_RX_FLOW_IDX_TIMEOUT((skb)))
646*5113495bSYour Name 
647*5113495bSYour Name #define  QDF_NBUF_CB_RX_PACKET_IPA_SMMU_MAP(skb) \
648*5113495bSYour Name 	 (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.ipa_smmu_map)
649*5113495bSYour Name 
650*5113495bSYour Name #define __qdf_nbuf_data_attr_get(skb) (0)
651*5113495bSYour Name #define __qdf_nbuf_data_attr_set(skb, data_attr)
652*5113495bSYour Name 
653*5113495bSYour Name /**
654*5113495bSYour Name  * __qdf_nbuf_map_nbytes_single() - map nbytes
655*5113495bSYour Name  * @osdev: os device
656*5113495bSYour Name  * @buf: buffer
657*5113495bSYour Name  * @dir: direction
658*5113495bSYour Name  * @nbytes: number of bytes
659*5113495bSYour Name  *
660*5113495bSYour Name  * Return: QDF_STATUS
661*5113495bSYour Name  */
662*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)663*5113495bSYour Name static inline QDF_STATUS __qdf_nbuf_map_nbytes_single(
664*5113495bSYour Name 		qdf_device_t osdev, struct sk_buff *buf,
665*5113495bSYour Name 		qdf_dma_dir_t dir, int nbytes)
666*5113495bSYour Name {
667*5113495bSYour Name 	qdf_dma_addr_t paddr;
668*5113495bSYour Name 
669*5113495bSYour Name 	QDF_NBUF_CB_PADDR(buf) = paddr = buf->data;
670*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
671*5113495bSYour Name }
672*5113495bSYour Name #else
__qdf_nbuf_map_nbytes_single(qdf_device_t osdev,struct sk_buff * buf,qdf_dma_dir_t dir,int nbytes)673*5113495bSYour Name static inline QDF_STATUS __qdf_nbuf_map_nbytes_single(
674*5113495bSYour Name 		qdf_device_t osdev, struct sk_buff *buf,
675*5113495bSYour Name 		qdf_dma_dir_t dir, int nbytes)
676*5113495bSYour Name {
677*5113495bSYour Name 	qdf_dma_addr_t paddr;
678*5113495bSYour Name 	QDF_STATUS ret;
679*5113495bSYour Name 
680*5113495bSYour Name 	/* assume that the OS only provides a single fragment */
681*5113495bSYour Name 	QDF_NBUF_CB_PADDR(buf) = paddr =
682*5113495bSYour Name 		dma_map_single(osdev->dev, buf->data,
683*5113495bSYour Name 			       nbytes, __qdf_dma_dir_to_os(dir));
684*5113495bSYour Name 	ret =  dma_mapping_error(osdev->dev, paddr) ?
685*5113495bSYour Name 		QDF_STATUS_E_FAULT : QDF_STATUS_SUCCESS;
686*5113495bSYour Name 	if (QDF_IS_STATUS_SUCCESS(ret))
687*5113495bSYour Name 		__qdf_record_nbuf_nbytes(__qdf_nbuf_get_end_offset(buf),
688*5113495bSYour Name 					 dir, true);
689*5113495bSYour Name 	return ret;
690*5113495bSYour Name }
691*5113495bSYour Name #endif
692*5113495bSYour Name /**
693*5113495bSYour Name  * __qdf_nbuf_unmap_nbytes_single() - unmap 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: none
700*5113495bSYour Name  */
701*5113495bSYour Name #if defined(A_SIMOS_DEVHOST)
702*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)703*5113495bSYour Name __qdf_nbuf_unmap_nbytes_single(qdf_device_t osdev, struct sk_buff *buf,
704*5113495bSYour Name 			       qdf_dma_dir_t dir, int nbytes)
705*5113495bSYour Name {
706*5113495bSYour Name }
707*5113495bSYour Name #else
708*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)709*5113495bSYour Name __qdf_nbuf_unmap_nbytes_single(qdf_device_t osdev, struct sk_buff *buf,
710*5113495bSYour Name 			       qdf_dma_dir_t dir, int nbytes)
711*5113495bSYour Name {
712*5113495bSYour Name 	qdf_dma_addr_t paddr = QDF_NBUF_CB_PADDR(buf);
713*5113495bSYour Name 
714*5113495bSYour Name 	if (qdf_likely(paddr)) {
715*5113495bSYour Name 		__qdf_record_nbuf_nbytes(
716*5113495bSYour Name 			__qdf_nbuf_get_end_offset(buf), dir, false);
717*5113495bSYour Name 		dma_unmap_single(osdev->dev, paddr, nbytes,
718*5113495bSYour Name 				 __qdf_dma_dir_to_os(dir));
719*5113495bSYour Name 		return;
720*5113495bSYour Name 	}
721*5113495bSYour Name }
722*5113495bSYour Name #endif
723*5113495bSYour Name 
724*5113495bSYour Name /**
725*5113495bSYour Name  * __qdf_nbuf_reset() - reset the buffer data and pointer
726*5113495bSYour Name  * @skb: Network buf instance
727*5113495bSYour Name  * @reserve: reserve
728*5113495bSYour Name  * @align: align
729*5113495bSYour Name  *
730*5113495bSYour Name  * Return: none
731*5113495bSYour Name  */
732*5113495bSYour Name static inline void
__qdf_nbuf_reset(struct sk_buff * skb,int reserve,int align)733*5113495bSYour Name __qdf_nbuf_reset(struct sk_buff *skb, int reserve, int align)
734*5113495bSYour Name {
735*5113495bSYour Name 	int offset;
736*5113495bSYour Name 
737*5113495bSYour Name 	skb_push(skb, skb_headroom(skb));
738*5113495bSYour Name 	skb_put(skb, skb_tailroom(skb));
739*5113495bSYour Name 	memset(skb->data, 0x0, skb->len);
740*5113495bSYour Name 	skb_trim(skb, 0);
741*5113495bSYour Name 	skb_reserve(skb, NET_SKB_PAD);
742*5113495bSYour Name 	memset(skb->cb, 0x0, sizeof(skb->cb));
743*5113495bSYour Name 
744*5113495bSYour Name 	/*
745*5113495bSYour Name 	 * The default is for netbuf fragments to be interpreted
746*5113495bSYour Name 	 * as wordstreams rather than bytestreams.
747*5113495bSYour Name 	 */
748*5113495bSYour Name 	QDF_NBUF_CB_TX_EXTRA_FRAG_WORDSTR_EFRAG(skb) = 1;
749*5113495bSYour Name 	QDF_NBUF_CB_TX_EXTRA_FRAG_WORDSTR_NBUF(skb) = 1;
750*5113495bSYour Name 
751*5113495bSYour Name 	/*
752*5113495bSYour Name 	 * Align & make sure that the tail & data are adjusted properly
753*5113495bSYour Name 	 */
754*5113495bSYour Name 
755*5113495bSYour Name 	if (align) {
756*5113495bSYour Name 		offset = ((unsigned long)skb->data) % align;
757*5113495bSYour Name 		if (offset)
758*5113495bSYour Name 			skb_reserve(skb, align - offset);
759*5113495bSYour Name 	}
760*5113495bSYour Name 
761*5113495bSYour Name 	skb_reserve(skb, reserve);
762*5113495bSYour Name }
763*5113495bSYour Name 
764*5113495bSYour Name /**
765*5113495bSYour Name  * __qdf_nbuf_len() - return the amount of valid data in the skb
766*5113495bSYour Name  * @skb: Pointer to network buffer
767*5113495bSYour Name  *
768*5113495bSYour Name  * This API returns the amount of valid data in the skb, If there are frags
769*5113495bSYour Name  * then it returns total length.
770*5113495bSYour Name  *
771*5113495bSYour Name  * Return: network buffer length
772*5113495bSYour Name  */
__qdf_nbuf_len(struct sk_buff * skb)773*5113495bSYour Name static inline size_t __qdf_nbuf_len(struct sk_buff *skb)
774*5113495bSYour Name {
775*5113495bSYour Name 	int i, extra_frag_len = 0;
776*5113495bSYour Name 
777*5113495bSYour Name 	i = QDF_NBUF_CB_TX_NUM_EXTRA_FRAGS(skb);
778*5113495bSYour Name 	if (i > 0)
779*5113495bSYour Name 		extra_frag_len = QDF_NBUF_CB_TX_EXTRA_FRAG_LEN(skb);
780*5113495bSYour Name 
781*5113495bSYour Name 	return extra_frag_len + skb->len;
782*5113495bSYour Name }
783*5113495bSYour Name 
784*5113495bSYour Name /**
785*5113495bSYour Name  * __qdf_nbuf_num_frags_init() - init extra frags
786*5113495bSYour Name  * @skb: sk buffer
787*5113495bSYour Name  *
788*5113495bSYour Name  * Return: none
789*5113495bSYour Name  */
790*5113495bSYour Name static inline
__qdf_nbuf_num_frags_init(struct sk_buff * skb)791*5113495bSYour Name void __qdf_nbuf_num_frags_init(struct sk_buff *skb)
792*5113495bSYour Name {
793*5113495bSYour Name 	QDF_NBUF_CB_TX_NUM_EXTRA_FRAGS(skb) = 0;
794*5113495bSYour Name }
795*5113495bSYour Name 
796*5113495bSYour Name /**
797*5113495bSYour Name  * qdf_nbuf_cb_update_vdev_id() - update vdev id in skb cb
798*5113495bSYour Name  * @skb: skb pointer whose cb is updated with vdev id information
799*5113495bSYour Name  * @vdev_id: vdev id to be updated in cb
800*5113495bSYour Name  *
801*5113495bSYour Name  * Return: void
802*5113495bSYour Name  */
803*5113495bSYour Name static inline void
qdf_nbuf_cb_update_vdev_id(struct sk_buff * skb,uint8_t vdev_id)804*5113495bSYour Name qdf_nbuf_cb_update_vdev_id(struct sk_buff *skb, uint8_t vdev_id)
805*5113495bSYour Name {
806*5113495bSYour Name 	/* Does not apply to WIN */
807*5113495bSYour Name }
808*5113495bSYour Name 
809*5113495bSYour Name /**
810*5113495bSYour Name  * __qdf_nbuf_push_head() - Push data in the front
811*5113495bSYour Name  * @skb: Pointer to network buffer
812*5113495bSYour Name  * @size: size to be pushed
813*5113495bSYour Name  *
814*5113495bSYour Name  * Return: New data pointer of this buf after data has been pushed,
815*5113495bSYour Name  *         or NULL if there is not enough room in this buf.
816*5113495bSYour Name  */
__qdf_nbuf_push_head(struct sk_buff * skb,size_t size)817*5113495bSYour Name static inline uint8_t *__qdf_nbuf_push_head(struct sk_buff *skb, size_t size)
818*5113495bSYour Name {
819*5113495bSYour Name 	return skb_push(skb, size);
820*5113495bSYour Name }
821*5113495bSYour Name 
822*5113495bSYour Name /**
823*5113495bSYour Name  * __qdf_nbuf_pull_head() - pull data out from the front
824*5113495bSYour Name  * @skb: Pointer to network buffer
825*5113495bSYour Name  * @size: size to be popped
826*5113495bSYour Name  *
827*5113495bSYour Name  * Return: New data pointer of this buf after data has been popped,
828*5113495bSYour Name  * or NULL if there is not sufficient data to pull.
829*5113495bSYour Name  */
__qdf_nbuf_pull_head(struct sk_buff * skb,size_t size)830*5113495bSYour Name static inline uint8_t *__qdf_nbuf_pull_head(struct sk_buff *skb, size_t size)
831*5113495bSYour Name {
832*5113495bSYour Name 	return skb_pull(skb, size);
833*5113495bSYour Name }
834*5113495bSYour Name 
qdf_nbuf_init_replenish_timer(void)835*5113495bSYour Name static inline void qdf_nbuf_init_replenish_timer(void) {}
qdf_nbuf_deinit_replenish_timer(void)836*5113495bSYour Name static inline void qdf_nbuf_deinit_replenish_timer(void) {}
837*5113495bSYour Name 
838*5113495bSYour Name /**
839*5113495bSYour Name  * __qdf_nbuf_dma_inv_range() - nbuf invalidate
840*5113495bSYour Name  * @buf_start: from
841*5113495bSYour Name  * @buf_end: to address to invalidate
842*5113495bSYour Name  *
843*5113495bSYour Name  * Return: none
844*5113495bSYour Name  */
845*5113495bSYour Name #if (defined(__LINUX_ARM_ARCH__) && !defined(DP_NO_CACHE_DESC_SUPPORT))
846*5113495bSYour Name static inline void
__qdf_nbuf_dma_inv_range(const void * buf_start,const void * buf_end)847*5113495bSYour Name __qdf_nbuf_dma_inv_range(const void *buf_start, const void *buf_end)
848*5113495bSYour Name {
849*5113495bSYour Name 	dmac_inv_range(buf_start, buf_end);
850*5113495bSYour Name }
851*5113495bSYour Name 
852*5113495bSYour Name static inline void
__qdf_nbuf_dma_inv_range_no_dsb(const void * buf_start,const void * buf_end)853*5113495bSYour Name __qdf_nbuf_dma_inv_range_no_dsb(const void *buf_start, const void *buf_end)
854*5113495bSYour Name {
855*5113495bSYour Name #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 89)
856*5113495bSYour Name 	dmac_inv_range_no_dsb(buf_start, buf_end);
857*5113495bSYour Name #else
858*5113495bSYour Name 	dmac_inv_range(buf_start, buf_end);
859*5113495bSYour Name #endif
860*5113495bSYour Name }
861*5113495bSYour Name 
862*5113495bSYour Name static inline void
__qdf_nbuf_dma_clean_range_no_dsb(const void * buf_start,const void * buf_end)863*5113495bSYour Name __qdf_nbuf_dma_clean_range_no_dsb(const void *buf_start, const void *buf_end)
864*5113495bSYour Name {
865*5113495bSYour Name #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 89)
866*5113495bSYour Name 	dmac_clean_range_no_dsb(buf_start, buf_end);
867*5113495bSYour Name #else
868*5113495bSYour Name 	dmac_clean_range(buf_start, buf_end);
869*5113495bSYour Name #endif
870*5113495bSYour Name }
871*5113495bSYour Name 
872*5113495bSYour Name static inline void
__qdf_dsb(void)873*5113495bSYour Name __qdf_dsb(void)
874*5113495bSYour Name {
875*5113495bSYour Name #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 89)
876*5113495bSYour Name 	dsb(st);
877*5113495bSYour Name #endif
878*5113495bSYour Name }
879*5113495bSYour Name 
880*5113495bSYour Name static inline void
__qdf_nbuf_dma_clean_range(const void * buf_start,const void * buf_end)881*5113495bSYour Name __qdf_nbuf_dma_clean_range(const void *buf_start, const void *buf_end)
882*5113495bSYour Name {
883*5113495bSYour Name 	dmac_clean_range(buf_start, buf_end);
884*5113495bSYour Name }
885*5113495bSYour Name #elif defined(__LINUX_MIPS32_ARCH__) || defined(__LINUX_MIPS64_ARCH__)
886*5113495bSYour Name static inline void
__qdf_nbuf_dma_inv_range(const void * buf_start,const void * buf_end)887*5113495bSYour Name __qdf_nbuf_dma_inv_range(const void *buf_start, const void *buf_end)
888*5113495bSYour Name {
889*5113495bSYour Name 	dma_cache_inv((unsigned long)buf_start,
890*5113495bSYour Name 		      (unsigned long)(buf_end - buf_start));
891*5113495bSYour Name }
892*5113495bSYour Name 
893*5113495bSYour Name static inline void
__qdf_nbuf_dma_inv_range_no_dsb(const void * buf_start,const void * buf_end)894*5113495bSYour Name __qdf_nbuf_dma_inv_range_no_dsb(const void *buf_start, const void *buf_end)
895*5113495bSYour Name {
896*5113495bSYour Name 	dma_cache_inv((unsigned long)buf_start,
897*5113495bSYour Name 		      (unsigned long)(buf_end - buf_start));
898*5113495bSYour Name }
899*5113495bSYour Name 
900*5113495bSYour Name static inline void
__qdf_nbuf_dma_clean_range_no_dsb(const void * buf_start,const void * buf_end)901*5113495bSYour Name __qdf_nbuf_dma_clean_range_no_dsb(const void *buf_start, const void *buf_end)
902*5113495bSYour Name {
903*5113495bSYour Name 	dmac_cache_wback((unsigned long)buf_start,
904*5113495bSYour Name 			 (unsigned long)(buf_end - buf_start));
905*5113495bSYour Name }
906*5113495bSYour Name 
907*5113495bSYour Name static inline void
__qdf_dsb(void)908*5113495bSYour Name __qdf_dsb(void)
909*5113495bSYour Name {
910*5113495bSYour Name }
911*5113495bSYour Name 
912*5113495bSYour Name static inline void
__qdf_nbuf_dma_clean_range(const void * buf_start,const void * buf_end)913*5113495bSYour Name __qdf_nbuf_dma_clean_range(const void *buf_start, const void *buf_end)
914*5113495bSYour Name {
915*5113495bSYour Name 	dma_cache_wback((unsigned long)buf_start,
916*5113495bSYour Name 			(unsigned long)(buf_end - buf_start));
917*5113495bSYour Name }
918*5113495bSYour Name #else
919*5113495bSYour Name static inline void
__qdf_nbuf_dma_inv_range(const void * buf_start,const void * buf_end)920*5113495bSYour Name __qdf_nbuf_dma_inv_range(const void *buf_start, const void *buf_end)
921*5113495bSYour Name {
922*5113495bSYour Name }
923*5113495bSYour Name 
924*5113495bSYour Name static inline void
__qdf_nbuf_dma_inv_range_no_dsb(const void * buf_start,const void * buf_end)925*5113495bSYour Name __qdf_nbuf_dma_inv_range_no_dsb(const void *buf_start, const void *buf_end)
926*5113495bSYour Name {
927*5113495bSYour Name }
928*5113495bSYour Name 
929*5113495bSYour Name static inline void
__qdf_nbuf_dma_clean_range_no_dsb(const void * buf_start,const void * buf_end)930*5113495bSYour Name __qdf_nbuf_dma_clean_range_no_dsb(const void *buf_start, const void *buf_end)
931*5113495bSYour Name {
932*5113495bSYour Name }
933*5113495bSYour Name 
934*5113495bSYour Name static inline void
__qdf_dsb(void)935*5113495bSYour Name __qdf_dsb(void)
936*5113495bSYour Name {
937*5113495bSYour Name }
938*5113495bSYour Name 
939*5113495bSYour Name static inline void
__qdf_nbuf_dma_clean_range(const void * buf_start,const void * buf_end)940*5113495bSYour Name __qdf_nbuf_dma_clean_range(const void *buf_start, const void *buf_end)
941*5113495bSYour Name {
942*5113495bSYour Name }
943*5113495bSYour Name #endif
944*5113495bSYour Name #endif /*_I_QDF_NBUF_W_H */
945