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 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 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 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 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 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 */ 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 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 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 */ 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 */ 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 835 static inline void qdf_nbuf_init_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 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 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 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 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 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 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 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 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 908 __qdf_dsb(void) 909 { 910 } 911 912 static inline void 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 920 __qdf_nbuf_dma_inv_range(const void *buf_start, const void *buf_end) 921 { 922 } 923 924 static inline void 925 __qdf_nbuf_dma_inv_range_no_dsb(const void *buf_start, const void *buf_end) 926 { 927 } 928 929 static inline void 930 __qdf_nbuf_dma_clean_range_no_dsb(const void *buf_start, const void *buf_end) 931 { 932 } 933 934 static inline void 935 __qdf_dsb(void) 936 { 937 } 938 939 static inline void 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