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