1 /* 2 * Copyright (c) 2017-2020, 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 #if (defined(IPA_WDI3_GSI)) || (defined(IPA_WDI2_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 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0)) 226 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_IS_DB_DDR_MAPPED(pipe_out) \ 227 (((struct ipa_wdi_conn_out_params *)(pipe_out))->is_ddr_mapped) 228 #else 229 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_IS_DB_DDR_MAPPED(pipe_out) false 230 #endif 231 232 /** 233 * __qdf_ipa_wdi_perf_profile_t - To set BandWidth profile 234 */ 235 typedef struct ipa_wdi_perf_profile __qdf_ipa_wdi_perf_profile_t; 236 237 #define __QDF_IPA_WDI_PERF_PROFILE_CLIENT(profile) \ 238 (((struct ipa_wdi_perf_profile *)(profile))->client) 239 #define __QDF_IPA_WDI_PERF_PROFILE_MAX_SUPPORTED_BW_MBPS(profile) \ 240 (((struct ipa_wdi_perf_profile *)(profile))->max_supported_bw_mbps) 241 242 /** 243 * __qdf_ipa_wdi_init - Client should call this function to 244 * init WDI IPA offload data path 245 * 246 * Note: Should not be called from atomic context and only 247 * after checking IPA readiness using ipa_register_ipa_ready_cb() 248 * 249 * @Return 0 on success, negative on failure 250 */ 251 static inline int __qdf_ipa_wdi_init(struct ipa_wdi_init_in_params *in, 252 struct ipa_wdi_init_out_params *out) 253 { 254 return ipa_wdi_init(in, out); 255 } 256 257 /** 258 * __qdf_ipa_wdi_cleanup - Client should call this function to 259 * clean up WDI IPA offload data path 260 * 261 * @Return 0 on success, negative on failure 262 */ 263 static inline int __qdf_ipa_wdi_cleanup(void) 264 { 265 return ipa_wdi_cleanup(); 266 } 267 268 /** 269 * __qdf_ipa_wdi_reg_intf - Client should call this function to 270 * init WDI IPA offload data path 271 * 272 * Note: Should not be called from atomic context and only 273 * after checking IPA readiness using ipa_register_ipa_ready_cb() 274 * 275 * @Return 0 on success, negative on failure 276 */ 277 static inline int __qdf_ipa_wdi_reg_intf( 278 struct ipa_wdi_reg_intf_in_params *in) 279 { 280 return ipa_wdi_reg_intf(in); 281 } 282 283 /** 284 * __qdf_ipa_wdi_dereg_intf - Client Driver should call this 285 * function to deregister before unload and after disconnect 286 * 287 * @Return 0 on success, negative on failure 288 */ 289 static inline int __qdf_ipa_wdi_dereg_intf(const char *netdev_name) 290 { 291 return ipa_wdi_dereg_intf(netdev_name); 292 } 293 294 /** 295 * __qdf_ipa_wdi_conn_pipes - Client should call this 296 * function to connect pipes 297 * 298 * @in: [in] input parameters from client 299 * @out: [out] output params to client 300 * 301 * Note: Should not be called from atomic context and only 302 * after checking IPA readiness using ipa_register_ipa_ready_cb() 303 * 304 * @Return 0 on success, negative on failure 305 */ 306 static inline int __qdf_ipa_wdi_conn_pipes(struct ipa_wdi_conn_in_params *in, 307 struct ipa_wdi_conn_out_params *out) 308 { 309 return ipa_wdi_conn_pipes(in, out); 310 } 311 312 /** 313 * __qdf_ipa_wdi_disconn_pipes() - Client should call this 314 * function to disconnect pipes 315 * 316 * Note: Should not be called from atomic context 317 * 318 * Returns: 0 on success, negative on failure 319 */ 320 static inline int __qdf_ipa_wdi_disconn_pipes(void) 321 { 322 return ipa_wdi_disconn_pipes(); 323 } 324 325 /** 326 * __qdf_ipa_wdi_enable_pipes() - Client should call this 327 * function to enable IPA offload data path 328 * 329 * Note: Should not be called from atomic context 330 * 331 * Returns: 0 on success, negative on failure 332 */ 333 static inline int __qdf_ipa_wdi_enable_pipes(void) 334 { 335 return ipa_wdi_enable_pipes(); 336 } 337 338 /** 339 * __qdf_ipa_wdi_disable_pipes() - Client should call this 340 * function to disable IPA offload data path 341 * 342 * Note: Should not be called from atomic context 343 * 344 * Returns: 0 on success, negative on failure 345 */ 346 static inline int __qdf_ipa_wdi_disable_pipes(void) 347 { 348 return ipa_wdi_disable_pipes(); 349 } 350 351 /** 352 * __qdf_ipa_wdi_set_perf_profile() - Client should call this function to 353 * set IPA clock bandwidth based on data rates 354 * 355 * @profile: [in] BandWidth profile to use 356 * 357 * Returns: 0 on success, negative on failure 358 */ 359 static inline int __qdf_ipa_wdi_set_perf_profile( 360 struct ipa_wdi_perf_profile *profile) 361 { 362 return ipa_wdi_set_perf_profile(profile); 363 } 364 365 /** 366 * __qdf_ipa_wdi_create_smmu_mapping() - Client should call this function to 367 * create smmu mapping 368 * 369 * @num_buffers: [in] number of buffers 370 * @info: [in] wdi buffer info 371 * 372 * Returns: 0 on success, negative on failure 373 */ 374 static inline int __qdf_ipa_wdi_create_smmu_mapping(u32 num_buffers, 375 struct ipa_wdi_buffer_info *info) 376 { 377 return ipa_wdi_create_smmu_mapping(num_buffers, info); 378 } 379 380 /** 381 * __qdf_ipa_wdi_release_smmu_mapping() - Client should call this function to 382 * release smmu mapping 383 * 384 * @num_buffers: [in] number of buffers 385 * @info: [in] wdi buffer info 386 * 387 * Returns: 0 on success, negative on failure 388 */ 389 static inline int __qdf_ipa_wdi_release_smmu_mapping(u32 num_buffers, 390 struct ipa_wdi_buffer_info *info) 391 { 392 return ipa_wdi_release_smmu_mapping(num_buffers, info); 393 } 394 395 #ifdef WDI3_STATS_UPDATE 396 /** 397 * __qdf_ipa_wdi_wlan_stats() - Client should call this function to 398 * send Tx byte counts to IPA driver 399 * @tx_stats: number of Tx bytes on STA and SAP 400 * 401 * Returns: 0 on success, negative on failure 402 */ 403 static inline int __qdf_ipa_wdi_wlan_stats(struct ipa_wdi_tx_info *tx_stats) 404 { 405 return ipa_wdi_sw_stats(tx_stats); 406 } 407 408 /** 409 * ipa_uc_bw_monitor() - start/stop uc bw monitoring 410 * @bw_info: set bw info levels to monitor 411 * 412 * Returns: 0 on success, negative on failure 413 */ 414 static inline int __qdf_ipa_uc_bw_monitor(struct ipa_wdi_bw_info *bw_info) 415 { 416 return ipa_uc_bw_monitor(bw_info); 417 } 418 #endif 419 #else /* CONFIG_IPA_WDI_UNIFIED_API */ 420 421 /** 422 * __qdf_ipa_wdi_hdr_info_t - Header to install on IPA HW 423 */ 424 typedef struct ipa_wdi3_hdr_info __qdf_ipa_wdi_hdr_info_t; 425 426 #define __QDF_IPA_WDI_HDR_INFO_HDR(hdr_info) \ 427 (((struct ipa_wdi3_hdr_info *)(hdr_info))->hdr) 428 #define __QDF_IPA_WDI_HDR_INFO_HDR_LEN(hdr_info) \ 429 (((struct ipa_wdi3_hdr_info *)(hdr_info))->hdr_len) 430 #define __QDF_IPA_WDI_HDR_INFO_DST_MAC_ADDR_OFFSET(hdr_info) \ 431 (((struct ipa_wdi3_hdr_info *)(hdr_info))->dst_mac_addr_offset) 432 #define __QDF_IPA_WDI_HDR_INFO_HDR_TYPE(hdr_info) \ 433 (((struct ipa_wdi3_hdr_info *)(hdr_info))->hdr_type) 434 435 /** 436 * __qdf_ipa_wdi_reg_intf_in_params_t - parameters for uC offload 437 * interface registration 438 */ 439 typedef struct ipa_wdi3_reg_intf_in_params __qdf_ipa_wdi_reg_intf_in_params_t; 440 441 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_NETDEV_NAME(in) \ 442 (((struct ipa_wdi3_reg_intf_in_params *)(in))->netdev_name) 443 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_HDR_INFO(in) \ 444 (((struct ipa_wdi3_reg_intf_in_params *)(in))->hdr_info) 445 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_IS_META_DATA_VALID(in) \ 446 (((struct ipa_wdi3_reg_intf_in_params *)(in))->is_meta_data_valid) 447 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_META_DATA(in) \ 448 (((struct ipa_wdi3_reg_intf_in_params *)(in))->meta_data) 449 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_META_DATA_MASK(in) \ 450 (((struct ipa_wdi3_reg_intf_in_params *)(in))->meta_data_mask) 451 452 /** 453 * __qdf_ipa_wdi_setup_info_t - WDI3 TX/Rx configuration 454 */ 455 typedef struct ipa_wdi3_setup_info __qdf_ipa_wdi_pipe_setup_info_t; 456 457 #define __QDF_IPA_WDI_SETUP_INFO_NAT_EN(txrx) \ 458 (((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.nat.nat_en) 459 #define __QDF_IPA_WDI_SETUP_INFO_HDR_LEN(txrx) \ 460 (((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_len) 461 #define __QDF_IPA_WDI_SETUP_INFO_HDR_OFST_METADATA_VALID(txrx) \ 462 (((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_ofst_metadata_valid) 463 #define __QDF_IPA_WDI_SETUP_INFO_HDR_METADATA_REG_VALID(txrx) \ 464 (((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_metadata_reg_valid) 465 #define __QDF_IPA_WDI_SETUP_INFO_HDR_OFST_PKT_SIZE_VALID(txrx) \ 466 (((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_ofst_pkt_size_valid) 467 #define __QDF_IPA_WDI_SETUP_INFO_HDR_OFST_PKT_SIZE(txrx) \ 468 (((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_ofst_pkt_size) 469 #define __QDF_IPA_WDI_SETUP_INFO_HDR_ADDITIONAL_CONST_LEN(txrx) \ 470 (((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_additional_const_len) 471 #define __QDF_IPA_WDI_SETUP_INFO_MODE(txrx) \ 472 (((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.mode.mode) 473 #define __QDF_IPA_WDI_SETUP_INFO_HDR_LITTLE_ENDIAN(txrx) \ 474 (((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr_ext.hdr_little_endian) 475 476 #define __QDF_IPA_WDI_SETUP_INFO_CLIENT(txrx) \ 477 (((struct ipa_wdi3_setup_info *)(txrx))->client) 478 #define __QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_BASE_PA(txrx) \ 479 (((struct ipa_wdi3_setup_info *)(txrx))->transfer_ring_base_pa) 480 #define __QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_SIZE(txrx) \ 481 (((struct ipa_wdi3_setup_info *)(txrx))->transfer_ring_size) 482 #define __QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_DOORBELL_PA(txrx) \ 483 (((struct ipa_wdi3_setup_info *)(txrx))->transfer_ring_doorbell_pa) 484 #define __QDF_IPA_WDI_SETUP_INFO_EVENT_RING_BASE_PA(txrx) \ 485 (((struct ipa_wdi3_setup_info *)(txrx))->event_ring_base_pa) 486 #define __QDF_IPA_WDI_SETUP_INFO_EVENT_RING_SIZE(txrx) \ 487 (((struct ipa_wdi3_setup_info *)(txrx))->event_ring_size) 488 #define __QDF_IPA_WDI_SETUP_INFO_EVENT_RING_DOORBELL_PA(txrx) \ 489 (((struct ipa_wdi3_setup_info *)(txrx))->event_ring_doorbell_pa) 490 #define __QDF_IPA_WDI_SETUP_INFO_NUM_PKT_BUFFERS(txrx) \ 491 (((struct ipa_wdi3_setup_info *)(txrx))->num_pkt_buffers) 492 #define __QDF_IPA_WDI_SETUP_INFO_PKT_OFFSET(txrx) \ 493 (((struct ipa_wdi3_setup_info *)(txrx))->pkt_offset) 494 #define __QDF_IPA_WDI_SETUP_INFO_DESC_FORMAT_TEMPLATE(txrx) \ 495 (((struct ipa_wdi3_setup_info *)(txrx))->desc_format_template) 496 497 /** 498 * __qdf_ipa_wdi_conn_in_params_t - information provided by 499 * uC offload client 500 */ 501 typedef struct ipa_wdi3_conn_in_params __qdf_ipa_wdi_conn_in_params_t; 502 503 #define __QDF_IPA_WDI_CONN_IN_PARAMS_NOTIFY(pipe_in) \ 504 (((struct ipa_wdi3_conn_in_params *)(pipe_in))->notify) 505 #define __QDF_IPA_WDI_CONN_IN_PARAMS_PRIV(pipe_in) \ 506 (((struct ipa_wdi3_conn_in_params *)(pipe_in))->priv) 507 #define __QDF_IPA_WDI_CONN_IN_PARAMS_TX(pipe_in) \ 508 (((struct ipa_wdi3_conn_in_params *)(pipe_in))->tx) 509 #define __QDF_IPA_WDI_CONN_IN_PARAMS_RX(pipe_in) \ 510 (((struct ipa_wdi3_conn_in_params *)(pipe_in))->rx) 511 512 /** 513 * __qdf_ipa_wdi_conn_out_params_t - information provided 514 * to WLAN druver 515 */ 516 typedef struct ipa_wdi3_conn_out_params __qdf_ipa_wdi_conn_out_params_t; 517 518 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_TX_UC_DB_PA(pipe_out) \ 519 (((struct ipa_wdi3_conn_out_params *)(pipe_out))->tx_uc_db_pa) 520 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_TX_UC_DB_VA(pipe_out) \ 521 (((struct ipa_wdi3_conn_out_params *)(pipe_out))->tx_uc_db_va) 522 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_RX_UC_DB_PA(pipe_out) \ 523 (((struct ipa_wdi3_conn_out_params *)(pipe_out))->rx_uc_db_pa) 524 525 /** 526 * __qdf_ipa_wdi_perf_profile_t - To set BandWidth profile 527 */ 528 typedef struct ipa_wdi3_perf_profile __qdf_ipa_wdi_perf_profile_t; 529 530 #define __QDF_IPA_WDI_PERF_PROFILE_CLIENT(profile) \ 531 (((struct ipa_wdi3_perf_profile *)(profile))->client) 532 #define __QDF_IPA_WDI_PERF_PROFILE_MAX_SUPPORTED_BW_MBPS(profile) \ 533 (((struct ipa_wdi3_perf_profile *)(profile))->max_supported_bw_mbps) 534 535 /** 536 * __qdf_ipa_wdi_reg_intf - Client should call this function to 537 * init WDI3 IPA offload data path 538 * 539 * Note: Should not be called from atomic context and only 540 * after checking IPA readiness using ipa_register_ipa_ready_cb() 541 * 542 * @Return 0 on success, negative on failure 543 */ 544 static inline int __qdf_ipa_wdi_reg_intf( 545 struct ipa_wdi3_reg_intf_in_params *in) 546 { 547 return ipa_wdi3_reg_intf(in); 548 } 549 550 /** 551 * __qdf_ipa_wdi_dereg_intf - Client Driver should call this 552 * function to deregister before unload and after disconnect 553 * 554 * @Return 0 on success, negative on failure 555 */ 556 static inline int __qdf_ipa_wdi_dereg_intf(const char *netdev_name) 557 { 558 return ipa_wdi3_dereg_intf(netdev_name); 559 } 560 561 /** 562 * __qdf_ipa_wdi_conn_pipes - Client should call this 563 * function to connect pipes 564 * 565 * @in: [in] input parameters from client 566 * @out: [out] output params to client 567 * 568 * Note: Should not be called from atomic context and only 569 * after checking IPA readiness using ipa_register_ipa_ready_cb() 570 * 571 * @Return 0 on success, negative on failure 572 */ 573 static inline int __qdf_ipa_wdi_conn_pipes(struct ipa_wdi3_conn_in_params *in, 574 struct ipa_wdi3_conn_out_params *out) 575 { 576 return ipa_wdi3_conn_pipes(in, out); 577 } 578 579 /** 580 * __qdf_ipa_wdi_disconn_pipes() - Client should call this 581 * function to disconnect pipes 582 * 583 * Note: Should not be called from atomic context 584 * 585 * Returns: 0 on success, negative on failure 586 */ 587 static inline int __qdf_ipa_wdi_disconn_pipes(void) 588 { 589 return ipa_wdi3_disconn_pipes(); 590 } 591 592 /** 593 * __qdf_ipa_wdi_enable_pipes() - Client should call this 594 * function to enable IPA offload data path 595 * 596 * Note: Should not be called from atomic context 597 * 598 * Returns: 0 on success, negative on failure 599 */ 600 static inline int __qdf_ipa_wdi_enable_pipes(void) 601 { 602 return ipa_wdi3_enable_pipes(); 603 } 604 605 /** 606 * __qdf_ipa_wdi_disable_pipes() - Client should call this 607 * function to disable IPA offload data path 608 * 609 * Note: Should not be called from atomic context 610 * 611 * Returns: 0 on success, negative on failure 612 */ 613 static inline int __qdf_ipa_wdi_disable_pipes(void) 614 { 615 return ipa_wdi3_disable_pipes(); 616 } 617 618 /** 619 * __qdf_ipa_wdi_set_perf_profile() - Client should call this function to 620 * set IPA clock bandwidth based on data rates 621 * 622 * @profile: [in] BandWidth profile to use 623 * 624 * Returns: 0 on success, negative on failure 625 */ 626 static inline int __qdf_ipa_wdi_set_perf_profile( 627 struct ipa_wdi3_perf_profile *profile) 628 { 629 return ipa_wdi3_set_perf_profile(profile); 630 } 631 632 #endif /* CONFIG_IPA_WDI_UNIFIED_API */ 633 634 #endif /* IPA_OFFLOAD */ 635 #endif /* I_QDF_IPA_WDI_H */ 636