1 /* 2 * Copyright (c) 2014-2021 The Linux Foundation. All rights reserved. 3 * 4 * Permission to use, copy, modify, and/or distribute this software for 5 * any purpose with or without fee is hereby granted, provided that the 6 * above copyright notice and this permission notice appear in all 7 * copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 16 * PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19 /** 20 * DOC: i_qdf_nbuf_w.h 21 * 22 * This file provides platform specific nbuf API's. 23 * Included by i_qdf_nbuf.h and should not be included 24 * directly from other files. 25 */ 26 27 #ifndef _I_QDF_NBUF_W_H 28 #define _I_QDF_NBUF_W_H 29 30 /* ext_cb accesor macros and internal API's */ 31 32 #define QDF_NBUF_CB_EXT_CB(skb) \ 33 (((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.priv_cb_w.ext_cb_ptr) 34 35 #define __qdf_nbuf_set_ext_cb(skb, ref) \ 36 do { \ 37 QDF_NBUF_CB_EXT_CB((skb)) = (ref); \ 38 } while (0) 39 40 #define __qdf_nbuf_get_ext_cb(skb) \ 41 QDF_NBUF_CB_EXT_CB((skb)) 42 43 /* fctx accesor macros and internal API's*/ 44 45 #define QDF_NBUF_CB_RX_FCTX(skb) \ 46 (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_w.fctx) 47 48 #define QDF_NBUF_CB_TX_FCTX(skb) \ 49 (((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.priv_cb_w.fctx) 50 51 #define QDF_NBUF_CB_RX_PEER_ID(skb) \ 52 (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_w.peer_id) 53 54 #define QDF_NBUF_CB_RX_PKT_LEN(skb) \ 55 (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_w.msdu_len) 56 57 #define QDF_NBUF_CB_RX_INTRA_BSS(skb) \ 58 (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_w.flag_intra_bss) 59 60 #define __qdf_nbuf_set_rx_fctx_type(skb, ctx, type) \ 61 do { \ 62 QDF_NBUF_CB_RX_FCTX((skb)) = (ctx); \ 63 QDF_NBUF_CB_RX_FTYPE((skb)) = (type); \ 64 } while (0) 65 66 #define __qdf_nbuf_get_rx_fctx(skb) \ 67 QDF_NBUF_CB_RX_FCTX((skb)) 68 69 #define __qdf_nbuf_set_intra_bss(skb, val) \ 70 ((QDF_NBUF_CB_RX_INTRA_BSS((skb))) = val) 71 72 #define __qdf_nbuf_is_intra_bss(skb) \ 73 (QDF_NBUF_CB_RX_INTRA_BSS((skb))) 74 75 #define __qdf_nbuf_set_tx_fctx_type(skb, ctx, type) \ 76 do { \ 77 QDF_NBUF_CB_TX_FCTX((skb)) = (ctx); \ 78 QDF_NBUF_CB_TX_FTYPE((skb)) = (type); \ 79 } while (0) 80 81 #define __qdf_nbuf_get_tx_fctx(skb) \ 82 QDF_NBUF_CB_TX_FCTX((skb)) 83 84 #define QDF_NBUF_CB_RX_PROTOCOL_TAG(skb) \ 85 (((struct qdf_nbuf_cb *) \ 86 ((skb)->cb))->u.rx.dev.priv_cb_w.protocol_tag) 87 88 #define __qdf_nbuf_set_rx_protocol_tag(skb, val) \ 89 ((QDF_NBUF_CB_RX_PROTOCOL_TAG((skb))) = val) 90 91 #define __qdf_nbuf_get_rx_protocol_tag(skb) \ 92 (QDF_NBUF_CB_RX_PROTOCOL_TAG((skb))) 93 94 #define QDF_NBUF_CB_RX_FLOW_TAG(skb) \ 95 (((struct qdf_nbuf_cb *) \ 96 ((skb)->cb))->u.rx.dev.priv_cb_w.flow_tag) 97 98 #define __qdf_nbuf_set_rx_flow_tag(skb, val) \ 99 ((QDF_NBUF_CB_RX_FLOW_TAG((skb))) = val) 100 101 #define __qdf_nbuf_get_rx_flow_tag(skb) \ 102 (QDF_NBUF_CB_RX_FLOW_TAG((skb))) 103 104 /** 105 * qdf_nbuf_cb_update_vdev_id() - update vdev id in skb cb 106 * @skb: skb pointer whose cb is updated with vdev id information 107 * @vdev_id: vdev id to be updated in cb 108 * 109 * Return: void 110 */ 111 static inline void 112 qdf_nbuf_cb_update_vdev_id(struct sk_buff *skb, uint8_t vdev_id) 113 { 114 /* Does not apply to WIN */ 115 } 116 117 /** 118 * __qdf_nbuf_push_head() - Push data in the front 119 * @skb: Pointer to network buffer 120 * @size: size to be pushed 121 * 122 * Return: New data pointer of this buf after data has been pushed, 123 * or NULL if there is not enough room in this buf. 124 */ 125 static inline uint8_t *__qdf_nbuf_push_head(struct sk_buff *skb, size_t size) 126 { 127 return skb_push(skb, size); 128 } 129 130 /** 131 * __qdf_nbuf_pull_head() - pull data out from the front 132 * @skb: Pointer to network buffer 133 * @size: size to be popped 134 * 135 * Return: New data pointer of this buf after data has been popped, 136 * or NULL if there is not sufficient data to pull. 137 */ 138 static inline uint8_t *__qdf_nbuf_pull_head(struct sk_buff *skb, size_t size) 139 { 140 return skb_pull(skb, size); 141 } 142 143 static inline void qdf_nbuf_init_replenish_timer(void) {} 144 static inline void qdf_nbuf_deinit_replenish_timer(void) {} 145 146 /** 147 * __qdf_nbuf_dma_inv_range() - nbuf invalidate 148 * @buf_start: from 149 * @buf_end: to address to invalidate 150 * 151 * Return: none 152 */ 153 #if (defined(__LINUX_ARM_ARCH__) && !defined(DP_NO_CACHE_DESC_SUPPORT)) 154 static inline void 155 __qdf_nbuf_dma_inv_range(const void *buf_start, const void *buf_end) 156 { 157 dmac_inv_range(buf_start, buf_end); 158 } 159 #elif defined(__LINUX_MIPS32_ARCH__) || defined(__LINUX_MIPS64_ARCH__) 160 static inline void 161 __qdf_nbuf_dma_inv_range(const void *buf_start, const void *buf_end) 162 { 163 dma_cache_inv((unsigned long)buf_start, 164 (unsigned long)(buf_end - buf_start)); 165 } 166 #else 167 static inline void 168 __qdf_nbuf_dma_inv_range(const void *buf_start, const void *buf_end) 169 { 170 } 171 #endif 172 #endif /*_I_QDF_NBUF_W_H */ 173