1 /* 2 * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved. 3 * 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17 /** 18 * DOC: i_qdf_ipa_wdi3.h 19 * This file provides OS dependent IPA WDI APIs. 20 */ 21 22 #ifndef I_QDF_IPA_WDI_H 23 #define I_QDF_IPA_WDI_H 24 25 #ifdef IPA_OFFLOAD 26 27 #include <qdf_status.h> /* QDF_STATUS */ 28 #include <linux/ipa_wdi3.h> 29 30 #ifdef CONFIG_IPA_WDI_UNIFIED_API 31 32 /** 33 * __qdf_ipa_wdi_version_t - IPA WDI version 34 */ 35 typedef enum ipa_wdi_version __qdf_ipa_wdi_version_t; 36 37 /** 38 * __qdf_ipa_wdi_init_in_params_t - wdi init input parameters 39 */ 40 typedef struct ipa_wdi_init_in_params __qdf_ipa_wdi_init_in_params_t; 41 42 #define __QDF_IPA_WDI_INIT_IN_PARAMS_WDI_VERSION(in_params) \ 43 (((struct ipa_wdi_init_in_params *)(in_params))->wdi_version) 44 #define __QDF_IPA_WDI_INIT_IN_PARAMS_NOTIFY(in_params) \ 45 (((struct ipa_wdi_init_in_params *)(in_params))->notify) 46 #define __QDF_IPA_WDI_INIT_IN_PARAMS_PRIV(in_params) \ 47 (((struct ipa_wdi_init_in_params *)(in_params))->priv) 48 #define __QDF_IPA_WDI_INIT_IN_PARAMS_WDI_NOTIFY(in_params) \ 49 (((struct ipa_wdi_init_in_params *)(in_params))->wdi_notify) 50 51 /** 52 * __qdf_ipa_wdi_init_out_params_t - wdi init output parameters 53 */ 54 typedef struct ipa_wdi_init_out_params __qdf_ipa_wdi_init_out_params_t; 55 56 #define __QDF_IPA_WDI_INIT_OUT_PARAMS_IS_UC_READY(out_params) \ 57 (((struct ipa_wdi_init_out_params *)(out_params))->is_uC_ready) 58 #define __QDF_IPA_WDI_INIT_OUT_PARAMS_IS_SMMU_ENABLED(out_params) \ 59 (((struct ipa_wdi_init_out_params *)(out_params))->is_smmu_enabled) 60 #ifdef IPA_WDI3_GSI 61 #define QDF_IPA_WDI_INIT_OUT_PARAMS_IS_OVER_GSI(out_params) \ 62 (((struct ipa_wdi_init_out_params *)(out_params))->is_over_gsi) 63 #else 64 #define QDF_IPA_WDI_INIT_OUT_PARAMS_IS_OVER_GSI(out_params) \ 65 false 66 #endif 67 68 /** 69 * __qdf_ipa_wdi_hdr_info_t - Header to install on IPA HW 70 */ 71 typedef struct ipa_wdi_hdr_info __qdf_ipa_wdi_hdr_info_t; 72 73 #define __QDF_IPA_WDI_HDR_INFO_HDR(hdr_info) \ 74 (((struct ipa_wdi_hdr_info *)(hdr_info))->hdr) 75 #define __QDF_IPA_WDI_HDR_INFO_HDR_LEN(hdr_info) \ 76 (((struct ipa_wdi_hdr_info *)(hdr_info))->hdr_len) 77 #define __QDF_IPA_WDI_HDR_INFO_DST_MAC_ADDR_OFFSET(hdr_info) \ 78 (((struct ipa_wdi_hdr_info *)(hdr_info))->dst_mac_addr_offset) 79 #define __QDF_IPA_WDI_HDR_INFO_HDR_TYPE(hdr_info) \ 80 (((struct ipa_wdi_hdr_info *)(hdr_info))->hdr_type) 81 82 /** 83 * __qdf_ipa_wdi_reg_intf_in_params_t - parameters for uC offload 84 * interface registration 85 */ 86 typedef struct ipa_wdi_reg_intf_in_params __qdf_ipa_wdi_reg_intf_in_params_t; 87 88 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_NETDEV_NAME(in) \ 89 (((struct ipa_wdi_reg_intf_in_params *)(in))->netdev_name) 90 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_HDR_INFO(in) \ 91 (((struct ipa_wdi_reg_intf_in_params *)(in))->hdr_info) 92 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_ALT_DST_PIPE(in) \ 93 (((struct ipa_wdi_reg_intf_in_params *)(in))->alt_dst_pipe) 94 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_IS_META_DATA_VALID(in) \ 95 (((struct ipa_wdi_reg_intf_in_params *)(in))->is_meta_data_valid) 96 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_META_DATA(in) \ 97 (((struct ipa_wdi_reg_intf_in_params *)(in))->meta_data) 98 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_META_DATA_MASK(in) \ 99 (((struct ipa_wdi_reg_intf_in_params *)(in))->meta_data_mask) 100 101 typedef struct ipa_ep_cfg __qdf_ipa_ep_cfg_t; 102 103 #define __QDF_IPA_EP_CFG_NAT_EN(cfg) \ 104 (((struct ipa_ep_cfg *)(cfg))->nat.nat_en) 105 #define __QDF_IPA_EP_CFG_HDR_LEN(cfg) \ 106 (((struct ipa_ep_cfg *)(cfg))->hdr.hdr_len) 107 #define __QDF_IPA_EP_CFG_HDR_OFST_METADATA_VALID(cfg) \ 108 (((struct ipa_ep_cfg *)(cfg))->hdr.hdr_ofst_metadata_valid) 109 #define __QDF_IPA_EP_CFG_HDR_METADATA_REG_VALID(cfg) \ 110 (((struct ipa_ep_cfg *)(cfg))->hdr.hdr_metadata_reg_valid) 111 #define __QDF_IPA_EP_CFG_HDR_OFST_PKT_SIZE_VALID(cfg) \ 112 (((struct ipa_ep_cfg *)(cfg))->hdr.hdr_ofst_pkt_size_valid) 113 #define __QDF_IPA_EP_CFG_HDR_OFST_PKT_SIZE(cfg) \ 114 (((struct ipa_ep_cfg *)(cfg))->hdr.hdr_ofst_pkt_size) 115 #define __QDF_IPA_EP_CFG_HDR_ADDITIONAL_CONST_LEN(cfg) \ 116 (((struct ipa_ep_cfg *)(cfg))->hdr.hdr_additional_const_len) 117 #define __QDF_IPA_EP_CFG_MODE(cfg) \ 118 (((struct ipa_ep_cfg *)(cfg))->mode.mode) 119 #define __QDF_IPA_EP_CFG_HDR_LITTLE_ENDIAN(cfg) \ 120 (((struct ipa_ep_cfg *)(cfg))->hdr_ext.hdr_little_endian) 121 122 /** 123 * __qdf_ipa_wdi_pipe_setup_info_t - WDI TX/Rx configuration 124 */ 125 typedef struct ipa_wdi_pipe_setup_info __qdf_ipa_wdi_pipe_setup_info_t; 126 127 #define __QDF_IPA_WDI_SETUP_INFO_EP_CFG(txrx) \ 128 (((struct ipa_wdi_pipe_setup_info *)(txrx))->ipa_ep_cfg) 129 130 #define __QDF_IPA_WDI_SETUP_INFO_CLIENT(txrx) \ 131 (((struct ipa_wdi_pipe_setup_info *)(txrx))->client) 132 #define __QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_BASE_PA(txrx) \ 133 (((struct ipa_wdi_pipe_setup_info *)(txrx))->transfer_ring_base_pa) 134 #define __QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_SIZE(txrx) \ 135 (((struct ipa_wdi_pipe_setup_info *)(txrx))->transfer_ring_size) 136 #define __QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_DOORBELL_PA(txrx) \ 137 (((struct ipa_wdi_pipe_setup_info *)(txrx))->transfer_ring_doorbell_pa) 138 #define __QDF_IPA_WDI_SETUP_INFO_IS_TXR_RN_DB_PCIE_ADDR(txrx) \ 139 (((struct ipa_wdi_pipe_setup_info *)(txrx))->is_txr_rn_db_pcie_addr) 140 #define __QDF_IPA_WDI_SETUP_INFO_EVENT_RING_BASE_PA(txrx) \ 141 (((struct ipa_wdi_pipe_setup_info *)(txrx))->event_ring_base_pa) 142 #define __QDF_IPA_WDI_SETUP_INFO_EVENT_RING_SIZE(txrx) \ 143 (((struct ipa_wdi_pipe_setup_info *)(txrx))->event_ring_size) 144 #define __QDF_IPA_WDI_SETUP_INFO_EVENT_RING_DOORBELL_PA(txrx) \ 145 (((struct ipa_wdi_pipe_setup_info *)(txrx))->event_ring_doorbell_pa) 146 #define __QDF_IPA_WDI_SETUP_INFO_IS_EVT_RN_DB_PCIE_ADDR(txrx) \ 147 (((struct ipa_wdi_pipe_setup_info *)(txrx))->is_evt_rn_db_pcie_addr) 148 #define __QDF_IPA_WDI_SETUP_INFO_NUM_PKT_BUFFERS(txrx) \ 149 (((struct ipa_wdi_pipe_setup_info *)(txrx))->num_pkt_buffers) 150 #define __QDF_IPA_WDI_SETUP_INFO_PKT_OFFSET(txrx) \ 151 (((struct ipa_wdi_pipe_setup_info *)(txrx))->pkt_offset) 152 #define __QDF_IPA_WDI_SETUP_INFO_DESC_FORMAT_TEMPLATE(txrx) \ 153 (((struct ipa_wdi_pipe_setup_info *)(txrx))->desc_format_template) 154 155 /** 156 * __qdf_ipa_wdi_pipe_setup_info_smmu_t - WDI TX/Rx configuration 157 */ 158 typedef struct ipa_wdi_pipe_setup_info_smmu __qdf_ipa_wdi_pipe_setup_info_smmu_t; 159 160 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_EP_CFG(txrx) \ 161 (((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->ipa_ep_cfg) 162 163 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_CLIENT(txrx) \ 164 (((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->client) 165 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_TRANSFER_RING_BASE(txrx) \ 166 (((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->transfer_ring_base) 167 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_TRANSFER_RING_SIZE(txrx) \ 168 (((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->transfer_ring_size) 169 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_TRANSFER_RING_DOORBELL_PA(txrx) \ 170 (((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->transfer_ring_doorbell_pa) 171 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_IS_TXR_RN_DB_PCIE_ADDR(txrx) \ 172 (((struct ipa_wdi_pipe_setup_info_smmu *) \ 173 (txrx))->is_txr_rn_db_pcie_addr) 174 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_EVENT_RING_BASE(txrx) \ 175 (((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->event_ring_base) 176 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_EVENT_RING_SIZE(txrx) \ 177 (((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->event_ring_size) 178 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_EVENT_RING_DOORBELL_PA(txrx) \ 179 (((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->event_ring_doorbell_pa) 180 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_IS_EVT_RN_DB_PCIE_ADDR(txrx) \ 181 (((struct ipa_wdi_pipe_setup_info_smmu *) \ 182 (txrx))->is_evt_rn_db_pcie_addr) 183 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_NUM_PKT_BUFFERS(txrx) \ 184 (((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->num_pkt_buffers) 185 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_PKT_OFFSET(txrx) \ 186 (((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->pkt_offset) 187 #define __QDF_IPA_WDI_SETUP_INFO_SMMU_DESC_FORMAT_TEMPLATE(txrx) \ 188 (((struct ipa_wdi_pipe_setup_info_smmu *)(txrx))->desc_format_template) 189 190 /** 191 * __qdf_ipa_wdi_conn_in_params_t - information provided by 192 * uC offload client 193 */ 194 typedef struct ipa_wdi_conn_in_params __qdf_ipa_wdi_conn_in_params_t; 195 196 #define __QDF_IPA_WDI_CONN_IN_PARAMS_NOTIFY(pipe_in) \ 197 (((struct ipa_wdi_conn_in_params *)(pipe_in))->notify) 198 #define __QDF_IPA_WDI_CONN_IN_PARAMS_PRIV(pipe_in) \ 199 (((struct ipa_wdi_conn_in_params *)(pipe_in))->priv) 200 #define __QDF_IPA_WDI_CONN_IN_PARAMS_SMMU_ENABLED(pipe_in) \ 201 (((struct ipa_wdi_conn_in_params *)(pipe_in))->is_smmu_enabled) 202 #define __QDF_IPA_WDI_CONN_IN_PARAMS_NUM_SYS_PIPE_NEEDED(pipe_in) \ 203 (((struct ipa_wdi_conn_in_params *)(pipe_in))->num_sys_pipe_needed) 204 #define __QDF_IPA_WDI_CONN_IN_PARAMS_SYS_IN(in) \ 205 (((struct ipa_wdi_conn_in_params *)(pipe_in))->sys_in) 206 #define __QDF_IPA_WDI_CONN_IN_PARAMS_TX(pipe_in) \ 207 (((struct ipa_wdi_conn_in_params *)(pipe_in))->u_tx.tx) 208 #define __QDF_IPA_WDI_CONN_IN_PARAMS_TX_SMMU(pipe_in) \ 209 (((struct ipa_wdi_conn_in_params *)(pipe_in))->u_tx.tx_smmu) 210 #define __QDF_IPA_WDI_CONN_IN_PARAMS_RX(pipe_in) \ 211 (((struct ipa_wdi_conn_in_params *)(pipe_in))->u_rx.rx) 212 #define __QDF_IPA_WDI_CONN_IN_PARAMS_RX_SMMU(pipe_in) \ 213 (((struct ipa_wdi_conn_in_params *)(pipe_in))->u_rx.rx_smmu) 214 215 /** 216 * __qdf_ipa_wdi_conn_out_params_t - information provided 217 * to WLAN druver 218 */ 219 typedef struct ipa_wdi_conn_out_params __qdf_ipa_wdi_conn_out_params_t; 220 221 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_TX_UC_DB_PA(pipe_out) \ 222 (((struct ipa_wdi_conn_out_params *)(pipe_out))->tx_uc_db_pa) 223 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_RX_UC_DB_PA(pipe_out) \ 224 (((struct ipa_wdi_conn_out_params *)(pipe_out))->rx_uc_db_pa) 225 226 /** 227 * __qdf_ipa_wdi_perf_profile_t - To set BandWidth profile 228 */ 229 typedef struct ipa_wdi_perf_profile __qdf_ipa_wdi_perf_profile_t; 230 231 #define __QDF_IPA_WDI_PERF_PROFILE_CLIENT(profile) \ 232 (((struct ipa_wdi_perf_profile *)(profile))->client) 233 #define __QDF_IPA_WDI_PERF_PROFILE_MAX_SUPPORTED_BW_MBPS(profile) \ 234 (((struct ipa_wdi_perf_profile *)(profile))->max_supported_bw_mbps) 235 236 /** 237 * __qdf_ipa_wdi_init - Client should call this function to 238 * init WDI IPA offload data path 239 * 240 * Note: Should not be called from atomic context and only 241 * after checking IPA readiness using ipa_register_ipa_ready_cb() 242 * 243 * @Return 0 on success, negative on failure 244 */ 245 static inline int __qdf_ipa_wdi_init(struct ipa_wdi_init_in_params *in, 246 struct ipa_wdi_init_out_params *out) 247 { 248 return ipa_wdi_init(in, out); 249 } 250 251 /** 252 * __qdf_ipa_wdi_cleanup - Client should call this function to 253 * clean up WDI IPA offload data path 254 * 255 * @Return 0 on success, negative on failure 256 */ 257 static inline int __qdf_ipa_wdi_cleanup(void) 258 { 259 return ipa_wdi_cleanup(); 260 } 261 262 /** 263 * __qdf_ipa_wdi_reg_intf - Client should call this function to 264 * init WDI IPA offload data path 265 * 266 * Note: Should not be called from atomic context and only 267 * after checking IPA readiness using ipa_register_ipa_ready_cb() 268 * 269 * @Return 0 on success, negative on failure 270 */ 271 static inline int __qdf_ipa_wdi_reg_intf( 272 struct ipa_wdi_reg_intf_in_params *in) 273 { 274 return ipa_wdi_reg_intf(in); 275 } 276 277 /** 278 * __qdf_ipa_wdi_dereg_intf - Client Driver should call this 279 * function to deregister before unload and after disconnect 280 * 281 * @Return 0 on success, negative on failure 282 */ 283 static inline int __qdf_ipa_wdi_dereg_intf(const char *netdev_name) 284 { 285 return ipa_wdi_dereg_intf(netdev_name); 286 } 287 288 /** 289 * __qdf_ipa_wdi_conn_pipes - Client should call this 290 * function to connect pipes 291 * 292 * @in: [in] input parameters from client 293 * @out: [out] output params to client 294 * 295 * Note: Should not be called from atomic context and only 296 * after checking IPA readiness using ipa_register_ipa_ready_cb() 297 * 298 * @Return 0 on success, negative on failure 299 */ 300 static inline int __qdf_ipa_wdi_conn_pipes(struct ipa_wdi_conn_in_params *in, 301 struct ipa_wdi_conn_out_params *out) 302 { 303 return ipa_wdi_conn_pipes(in, out); 304 } 305 306 /** 307 * __qdf_ipa_wdi_disconn_pipes() - Client should call this 308 * function to disconnect pipes 309 * 310 * Note: Should not be called from atomic context 311 * 312 * Returns: 0 on success, negative on failure 313 */ 314 static inline int __qdf_ipa_wdi_disconn_pipes(void) 315 { 316 return ipa_wdi_disconn_pipes(); 317 } 318 319 /** 320 * __qdf_ipa_wdi_enable_pipes() - Client should call this 321 * function to enable IPA offload data path 322 * 323 * Note: Should not be called from atomic context 324 * 325 * Returns: 0 on success, negative on failure 326 */ 327 static inline int __qdf_ipa_wdi_enable_pipes(void) 328 { 329 return ipa_wdi_enable_pipes(); 330 } 331 332 /** 333 * __qdf_ipa_wdi_disable_pipes() - Client should call this 334 * function to disable IPA offload data path 335 * 336 * Note: Should not be called from atomic context 337 * 338 * Returns: 0 on success, negative on failure 339 */ 340 static inline int __qdf_ipa_wdi_disable_pipes(void) 341 { 342 return ipa_wdi_disable_pipes(); 343 } 344 345 /** 346 * __qdf_ipa_wdi_set_perf_profile() - Client should call this function to 347 * set IPA clock bandwidth based on data rates 348 * 349 * @profile: [in] BandWidth profile to use 350 * 351 * Returns: 0 on success, negative on failure 352 */ 353 static inline int __qdf_ipa_wdi_set_perf_profile( 354 struct ipa_wdi_perf_profile *profile) 355 { 356 return ipa_wdi_set_perf_profile(profile); 357 } 358 359 /** 360 * __qdf_ipa_wdi_create_smmu_mapping() - Client should call this function to 361 * create smmu mapping 362 * 363 * @num_buffers: [in] number of buffers 364 * @info: [in] wdi buffer info 365 * 366 * Returns: 0 on success, negative on failure 367 */ 368 static inline int __qdf_ipa_wdi_create_smmu_mapping(u32 num_buffers, 369 struct ipa_wdi_buffer_info *info) 370 { 371 return ipa_wdi_create_smmu_mapping(num_buffers, info); 372 } 373 374 /** 375 * __qdf_ipa_wdi_release_smmu_mapping() - Client should call this function to 376 * release smmu mapping 377 * 378 * @num_buffers: [in] number of buffers 379 * @info: [in] wdi buffer info 380 * 381 * Returns: 0 on success, negative on failure 382 */ 383 static inline int __qdf_ipa_wdi_release_smmu_mapping(u32 num_buffers, 384 struct ipa_wdi_buffer_info *info) 385 { 386 return ipa_wdi_release_smmu_mapping(num_buffers, info); 387 } 388 389 #else /* CONFIG_IPA_WDI_UNIFIED_API */ 390 391 /** 392 * __qdf_ipa_wdi_hdr_info_t - Header to install on IPA HW 393 */ 394 typedef struct ipa_wdi3_hdr_info __qdf_ipa_wdi_hdr_info_t; 395 396 #define __QDF_IPA_WDI_HDR_INFO_HDR(hdr_info) \ 397 (((struct ipa_wdi3_hdr_info *)(hdr_info))->hdr) 398 #define __QDF_IPA_WDI_HDR_INFO_HDR_LEN(hdr_info) \ 399 (((struct ipa_wdi3_hdr_info *)(hdr_info))->hdr_len) 400 #define __QDF_IPA_WDI_HDR_INFO_DST_MAC_ADDR_OFFSET(hdr_info) \ 401 (((struct ipa_wdi3_hdr_info *)(hdr_info))->dst_mac_addr_offset) 402 #define __QDF_IPA_WDI_HDR_INFO_HDR_TYPE(hdr_info) \ 403 (((struct ipa_wdi3_hdr_info *)(hdr_info))->hdr_type) 404 405 /** 406 * __qdf_ipa_wdi_reg_intf_in_params_t - parameters for uC offload 407 * interface registration 408 */ 409 typedef struct ipa_wdi3_reg_intf_in_params __qdf_ipa_wdi_reg_intf_in_params_t; 410 411 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_NETDEV_NAME(in) \ 412 (((struct ipa_wdi3_reg_intf_in_params *)(in))->netdev_name) 413 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_HDR_INFO(in) \ 414 (((struct ipa_wdi3_reg_intf_in_params *)(in))->hdr_info) 415 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_IS_META_DATA_VALID(in) \ 416 (((struct ipa_wdi3_reg_intf_in_params *)(in))->is_meta_data_valid) 417 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_META_DATA(in) \ 418 (((struct ipa_wdi3_reg_intf_in_params *)(in))->meta_data) 419 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_META_DATA_MASK(in) \ 420 (((struct ipa_wdi3_reg_intf_in_params *)(in))->meta_data_mask) 421 422 /** 423 * __qdf_ipa_wdi_setup_info_t - WDI3 TX/Rx configuration 424 */ 425 typedef struct ipa_wdi3_setup_info __qdf_ipa_wdi_pipe_setup_info_t; 426 427 #define __QDF_IPA_WDI_SETUP_INFO_NAT_EN(txrx) \ 428 (((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.nat.nat_en) 429 #define __QDF_IPA_WDI_SETUP_INFO_HDR_LEN(txrx) \ 430 (((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_len) 431 #define __QDF_IPA_WDI_SETUP_INFO_HDR_OFST_METADATA_VALID(txrx) \ 432 (((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_ofst_metadata_valid) 433 #define __QDF_IPA_WDI_SETUP_INFO_HDR_METADATA_REG_VALID(txrx) \ 434 (((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_metadata_reg_valid) 435 #define __QDF_IPA_WDI_SETUP_INFO_HDR_OFST_PKT_SIZE_VALID(txrx) \ 436 (((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_ofst_pkt_size_valid) 437 #define __QDF_IPA_WDI_SETUP_INFO_HDR_OFST_PKT_SIZE(txrx) \ 438 (((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_ofst_pkt_size) 439 #define __QDF_IPA_WDI_SETUP_INFO_HDR_ADDITIONAL_CONST_LEN(txrx) \ 440 (((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_additional_const_len) 441 #define __QDF_IPA_WDI_SETUP_INFO_MODE(txrx) \ 442 (((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.mode.mode) 443 #define __QDF_IPA_WDI_SETUP_INFO_HDR_LITTLE_ENDIAN(txrx) \ 444 (((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr_ext.hdr_little_endian) 445 446 #define __QDF_IPA_WDI_SETUP_INFO_CLIENT(txrx) \ 447 (((struct ipa_wdi3_setup_info *)(txrx))->client) 448 #define __QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_BASE_PA(txrx) \ 449 (((struct ipa_wdi3_setup_info *)(txrx))->transfer_ring_base_pa) 450 #define __QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_SIZE(txrx) \ 451 (((struct ipa_wdi3_setup_info *)(txrx))->transfer_ring_size) 452 #define __QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_DOORBELL_PA(txrx) \ 453 (((struct ipa_wdi3_setup_info *)(txrx))->transfer_ring_doorbell_pa) 454 #define __QDF_IPA_WDI_SETUP_INFO_EVENT_RING_BASE_PA(txrx) \ 455 (((struct ipa_wdi3_setup_info *)(txrx))->event_ring_base_pa) 456 #define __QDF_IPA_WDI_SETUP_INFO_EVENT_RING_SIZE(txrx) \ 457 (((struct ipa_wdi3_setup_info *)(txrx))->event_ring_size) 458 #define __QDF_IPA_WDI_SETUP_INFO_EVENT_RING_DOORBELL_PA(txrx) \ 459 (((struct ipa_wdi3_setup_info *)(txrx))->event_ring_doorbell_pa) 460 #define __QDF_IPA_WDI_SETUP_INFO_NUM_PKT_BUFFERS(txrx) \ 461 (((struct ipa_wdi3_setup_info *)(txrx))->num_pkt_buffers) 462 #define __QDF_IPA_WDI_SETUP_INFO_PKT_OFFSET(txrx) \ 463 (((struct ipa_wdi3_setup_info *)(txrx))->pkt_offset) 464 #define __QDF_IPA_WDI_SETUP_INFO_DESC_FORMAT_TEMPLATE(txrx) \ 465 (((struct ipa_wdi3_setup_info *)(txrx))->desc_format_template) 466 467 /** 468 * __qdf_ipa_wdi_conn_in_params_t - information provided by 469 * uC offload client 470 */ 471 typedef struct ipa_wdi3_conn_in_params __qdf_ipa_wdi_conn_in_params_t; 472 473 #define __QDF_IPA_WDI_CONN_IN_PARAMS_NOTIFY(pipe_in) \ 474 (((struct ipa_wdi3_conn_in_params *)(pipe_in))->notify) 475 #define __QDF_IPA_WDI_CONN_IN_PARAMS_PRIV(pipe_in) \ 476 (((struct ipa_wdi3_conn_in_params *)(pipe_in))->priv) 477 #define __QDF_IPA_WDI_CONN_IN_PARAMS_TX(pipe_in) \ 478 (((struct ipa_wdi3_conn_in_params *)(pipe_in))->tx) 479 #define __QDF_IPA_WDI_CONN_IN_PARAMS_RX(pipe_in) \ 480 (((struct ipa_wdi3_conn_in_params *)(pipe_in))->rx) 481 482 /** 483 * __qdf_ipa_wdi_conn_out_params_t - information provided 484 * to WLAN druver 485 */ 486 typedef struct ipa_wdi3_conn_out_params __qdf_ipa_wdi_conn_out_params_t; 487 488 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_TX_UC_DB_PA(pipe_out) \ 489 (((struct ipa_wdi3_conn_out_params *)(pipe_out))->tx_uc_db_pa) 490 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_TX_UC_DB_VA(pipe_out) \ 491 (((struct ipa_wdi3_conn_out_params *)(pipe_out))->tx_uc_db_va) 492 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_RX_UC_DB_PA(pipe_out) \ 493 (((struct ipa_wdi3_conn_out_params *)(pipe_out))->rx_uc_db_pa) 494 495 /** 496 * __qdf_ipa_wdi_perf_profile_t - To set BandWidth profile 497 */ 498 typedef struct ipa_wdi3_perf_profile __qdf_ipa_wdi_perf_profile_t; 499 500 #define __QDF_IPA_WDI_PERF_PROFILE_CLIENT(profile) \ 501 (((struct ipa_wdi3_perf_profile *)(profile))->client) 502 #define __QDF_IPA_WDI_PERF_PROFILE_MAX_SUPPORTED_BW_MBPS(profile) \ 503 (((struct ipa_wdi3_perf_profile *)(profile))->max_supported_bw_mbps) 504 505 /** 506 * __qdf_ipa_wdi_reg_intf - Client should call this function to 507 * init WDI3 IPA offload data path 508 * 509 * Note: Should not be called from atomic context and only 510 * after checking IPA readiness using ipa_register_ipa_ready_cb() 511 * 512 * @Return 0 on success, negative on failure 513 */ 514 static inline int __qdf_ipa_wdi_reg_intf( 515 struct ipa_wdi3_reg_intf_in_params *in) 516 { 517 return ipa_wdi3_reg_intf(in); 518 } 519 520 /** 521 * __qdf_ipa_wdi_dereg_intf - Client Driver should call this 522 * function to deregister before unload and after disconnect 523 * 524 * @Return 0 on success, negative on failure 525 */ 526 static inline int __qdf_ipa_wdi_dereg_intf(const char *netdev_name) 527 { 528 return ipa_wdi3_dereg_intf(netdev_name); 529 } 530 531 /** 532 * __qdf_ipa_wdi_conn_pipes - Client should call this 533 * function to connect pipes 534 * 535 * @in: [in] input parameters from client 536 * @out: [out] output params to client 537 * 538 * Note: Should not be called from atomic context and only 539 * after checking IPA readiness using ipa_register_ipa_ready_cb() 540 * 541 * @Return 0 on success, negative on failure 542 */ 543 static inline int __qdf_ipa_wdi_conn_pipes(struct ipa_wdi3_conn_in_params *in, 544 struct ipa_wdi3_conn_out_params *out) 545 { 546 return ipa_wdi3_conn_pipes(in, out); 547 } 548 549 /** 550 * __qdf_ipa_wdi_disconn_pipes() - Client should call this 551 * function to disconnect pipes 552 * 553 * Note: Should not be called from atomic context 554 * 555 * Returns: 0 on success, negative on failure 556 */ 557 static inline int __qdf_ipa_wdi_disconn_pipes(void) 558 { 559 return ipa_wdi3_disconn_pipes(); 560 } 561 562 /** 563 * __qdf_ipa_wdi_enable_pipes() - Client should call this 564 * function to enable IPA offload data path 565 * 566 * Note: Should not be called from atomic context 567 * 568 * Returns: 0 on success, negative on failure 569 */ 570 static inline int __qdf_ipa_wdi_enable_pipes(void) 571 { 572 return ipa_wdi3_enable_pipes(); 573 } 574 575 /** 576 * __qdf_ipa_wdi_disable_pipes() - Client should call this 577 * function to disable IPA offload data path 578 * 579 * Note: Should not be called from atomic context 580 * 581 * Returns: 0 on success, negative on failure 582 */ 583 static inline int __qdf_ipa_wdi_disable_pipes(void) 584 { 585 return ipa_wdi3_disable_pipes(); 586 } 587 588 /** 589 * __qdf_ipa_wdi_set_perf_profile() - Client should call this function to 590 * set IPA clock bandwidth based on data rates 591 * 592 * @profile: [in] BandWidth profile to use 593 * 594 * Returns: 0 on success, negative on failure 595 */ 596 static inline int __qdf_ipa_wdi_set_perf_profile( 597 struct ipa_wdi3_perf_profile *profile) 598 { 599 return ipa_wdi3_set_perf_profile(profile); 600 } 601 602 #endif /* CONFIG_IPA_WDI_UNIFIED_API */ 603 604 #endif /* IPA_OFFLOAD */ 605 #endif /* I_QDF_IPA_WDI_H */ 606