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