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 #ifdef WDI3_STATS_UPDATE 390 /** 391 * __qdf_ipa_wdi_wlan_stats() - Client should call this function to 392 * send Tx byte counts to IPA driver 393 * @tx_stats: number of Tx bytes on STA and SAP 394 * 395 * Returns: 0 on success, negative on failure 396 */ 397 static inline int __qdf_ipa_wdi_wlan_stats(struct ipa_wdi_tx_info *tx_stats) 398 { 399 return ipa_wdi_sw_stats(tx_stats); 400 } 401 402 /** 403 * ipa_uc_bw_monitor() - start/stop uc bw monitoring 404 * @bw_info: set bw info levels to monitor 405 * 406 * Returns: 0 on success, negative on failure 407 */ 408 static inline int __qdf_ipa_uc_bw_monitor(struct ipa_wdi_bw_info *bw_info) 409 { 410 return ipa_uc_bw_monitor(bw_info); 411 } 412 #endif 413 #else /* CONFIG_IPA_WDI_UNIFIED_API */ 414 415 /** 416 * __qdf_ipa_wdi_hdr_info_t - Header to install on IPA HW 417 */ 418 typedef struct ipa_wdi3_hdr_info __qdf_ipa_wdi_hdr_info_t; 419 420 #define __QDF_IPA_WDI_HDR_INFO_HDR(hdr_info) \ 421 (((struct ipa_wdi3_hdr_info *)(hdr_info))->hdr) 422 #define __QDF_IPA_WDI_HDR_INFO_HDR_LEN(hdr_info) \ 423 (((struct ipa_wdi3_hdr_info *)(hdr_info))->hdr_len) 424 #define __QDF_IPA_WDI_HDR_INFO_DST_MAC_ADDR_OFFSET(hdr_info) \ 425 (((struct ipa_wdi3_hdr_info *)(hdr_info))->dst_mac_addr_offset) 426 #define __QDF_IPA_WDI_HDR_INFO_HDR_TYPE(hdr_info) \ 427 (((struct ipa_wdi3_hdr_info *)(hdr_info))->hdr_type) 428 429 /** 430 * __qdf_ipa_wdi_reg_intf_in_params_t - parameters for uC offload 431 * interface registration 432 */ 433 typedef struct ipa_wdi3_reg_intf_in_params __qdf_ipa_wdi_reg_intf_in_params_t; 434 435 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_NETDEV_NAME(in) \ 436 (((struct ipa_wdi3_reg_intf_in_params *)(in))->netdev_name) 437 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_HDR_INFO(in) \ 438 (((struct ipa_wdi3_reg_intf_in_params *)(in))->hdr_info) 439 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_IS_META_DATA_VALID(in) \ 440 (((struct ipa_wdi3_reg_intf_in_params *)(in))->is_meta_data_valid) 441 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_META_DATA(in) \ 442 (((struct ipa_wdi3_reg_intf_in_params *)(in))->meta_data) 443 #define __QDF_IPA_WDI_REG_INTF_IN_PARAMS_META_DATA_MASK(in) \ 444 (((struct ipa_wdi3_reg_intf_in_params *)(in))->meta_data_mask) 445 446 /** 447 * __qdf_ipa_wdi_setup_info_t - WDI3 TX/Rx configuration 448 */ 449 typedef struct ipa_wdi3_setup_info __qdf_ipa_wdi_pipe_setup_info_t; 450 451 #define __QDF_IPA_WDI_SETUP_INFO_NAT_EN(txrx) \ 452 (((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.nat.nat_en) 453 #define __QDF_IPA_WDI_SETUP_INFO_HDR_LEN(txrx) \ 454 (((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_len) 455 #define __QDF_IPA_WDI_SETUP_INFO_HDR_OFST_METADATA_VALID(txrx) \ 456 (((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_ofst_metadata_valid) 457 #define __QDF_IPA_WDI_SETUP_INFO_HDR_METADATA_REG_VALID(txrx) \ 458 (((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_metadata_reg_valid) 459 #define __QDF_IPA_WDI_SETUP_INFO_HDR_OFST_PKT_SIZE_VALID(txrx) \ 460 (((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_ofst_pkt_size_valid) 461 #define __QDF_IPA_WDI_SETUP_INFO_HDR_OFST_PKT_SIZE(txrx) \ 462 (((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_ofst_pkt_size) 463 #define __QDF_IPA_WDI_SETUP_INFO_HDR_ADDITIONAL_CONST_LEN(txrx) \ 464 (((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr.hdr_additional_const_len) 465 #define __QDF_IPA_WDI_SETUP_INFO_MODE(txrx) \ 466 (((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.mode.mode) 467 #define __QDF_IPA_WDI_SETUP_INFO_HDR_LITTLE_ENDIAN(txrx) \ 468 (((struct ipa_wdi3_setup_info *)(txrx))->ipa_ep_cfg.hdr_ext.hdr_little_endian) 469 470 #define __QDF_IPA_WDI_SETUP_INFO_CLIENT(txrx) \ 471 (((struct ipa_wdi3_setup_info *)(txrx))->client) 472 #define __QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_BASE_PA(txrx) \ 473 (((struct ipa_wdi3_setup_info *)(txrx))->transfer_ring_base_pa) 474 #define __QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_SIZE(txrx) \ 475 (((struct ipa_wdi3_setup_info *)(txrx))->transfer_ring_size) 476 #define __QDF_IPA_WDI_SETUP_INFO_TRANSFER_RING_DOORBELL_PA(txrx) \ 477 (((struct ipa_wdi3_setup_info *)(txrx))->transfer_ring_doorbell_pa) 478 #define __QDF_IPA_WDI_SETUP_INFO_EVENT_RING_BASE_PA(txrx) \ 479 (((struct ipa_wdi3_setup_info *)(txrx))->event_ring_base_pa) 480 #define __QDF_IPA_WDI_SETUP_INFO_EVENT_RING_SIZE(txrx) \ 481 (((struct ipa_wdi3_setup_info *)(txrx))->event_ring_size) 482 #define __QDF_IPA_WDI_SETUP_INFO_EVENT_RING_DOORBELL_PA(txrx) \ 483 (((struct ipa_wdi3_setup_info *)(txrx))->event_ring_doorbell_pa) 484 #define __QDF_IPA_WDI_SETUP_INFO_NUM_PKT_BUFFERS(txrx) \ 485 (((struct ipa_wdi3_setup_info *)(txrx))->num_pkt_buffers) 486 #define __QDF_IPA_WDI_SETUP_INFO_PKT_OFFSET(txrx) \ 487 (((struct ipa_wdi3_setup_info *)(txrx))->pkt_offset) 488 #define __QDF_IPA_WDI_SETUP_INFO_DESC_FORMAT_TEMPLATE(txrx) \ 489 (((struct ipa_wdi3_setup_info *)(txrx))->desc_format_template) 490 491 /** 492 * __qdf_ipa_wdi_conn_in_params_t - information provided by 493 * uC offload client 494 */ 495 typedef struct ipa_wdi3_conn_in_params __qdf_ipa_wdi_conn_in_params_t; 496 497 #define __QDF_IPA_WDI_CONN_IN_PARAMS_NOTIFY(pipe_in) \ 498 (((struct ipa_wdi3_conn_in_params *)(pipe_in))->notify) 499 #define __QDF_IPA_WDI_CONN_IN_PARAMS_PRIV(pipe_in) \ 500 (((struct ipa_wdi3_conn_in_params *)(pipe_in))->priv) 501 #define __QDF_IPA_WDI_CONN_IN_PARAMS_TX(pipe_in) \ 502 (((struct ipa_wdi3_conn_in_params *)(pipe_in))->tx) 503 #define __QDF_IPA_WDI_CONN_IN_PARAMS_RX(pipe_in) \ 504 (((struct ipa_wdi3_conn_in_params *)(pipe_in))->rx) 505 506 /** 507 * __qdf_ipa_wdi_conn_out_params_t - information provided 508 * to WLAN druver 509 */ 510 typedef struct ipa_wdi3_conn_out_params __qdf_ipa_wdi_conn_out_params_t; 511 512 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_TX_UC_DB_PA(pipe_out) \ 513 (((struct ipa_wdi3_conn_out_params *)(pipe_out))->tx_uc_db_pa) 514 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_TX_UC_DB_VA(pipe_out) \ 515 (((struct ipa_wdi3_conn_out_params *)(pipe_out))->tx_uc_db_va) 516 #define __QDF_IPA_WDI_CONN_OUT_PARAMS_RX_UC_DB_PA(pipe_out) \ 517 (((struct ipa_wdi3_conn_out_params *)(pipe_out))->rx_uc_db_pa) 518 519 /** 520 * __qdf_ipa_wdi_perf_profile_t - To set BandWidth profile 521 */ 522 typedef struct ipa_wdi3_perf_profile __qdf_ipa_wdi_perf_profile_t; 523 524 #define __QDF_IPA_WDI_PERF_PROFILE_CLIENT(profile) \ 525 (((struct ipa_wdi3_perf_profile *)(profile))->client) 526 #define __QDF_IPA_WDI_PERF_PROFILE_MAX_SUPPORTED_BW_MBPS(profile) \ 527 (((struct ipa_wdi3_perf_profile *)(profile))->max_supported_bw_mbps) 528 529 /** 530 * __qdf_ipa_wdi_reg_intf - Client should call this function to 531 * init WDI3 IPA offload data path 532 * 533 * Note: Should not be called from atomic context and only 534 * after checking IPA readiness using ipa_register_ipa_ready_cb() 535 * 536 * @Return 0 on success, negative on failure 537 */ 538 static inline int __qdf_ipa_wdi_reg_intf( 539 struct ipa_wdi3_reg_intf_in_params *in) 540 { 541 return ipa_wdi3_reg_intf(in); 542 } 543 544 /** 545 * __qdf_ipa_wdi_dereg_intf - Client Driver should call this 546 * function to deregister before unload and after disconnect 547 * 548 * @Return 0 on success, negative on failure 549 */ 550 static inline int __qdf_ipa_wdi_dereg_intf(const char *netdev_name) 551 { 552 return ipa_wdi3_dereg_intf(netdev_name); 553 } 554 555 /** 556 * __qdf_ipa_wdi_conn_pipes - Client should call this 557 * function to connect pipes 558 * 559 * @in: [in] input parameters from client 560 * @out: [out] output params to client 561 * 562 * Note: Should not be called from atomic context and only 563 * after checking IPA readiness using ipa_register_ipa_ready_cb() 564 * 565 * @Return 0 on success, negative on failure 566 */ 567 static inline int __qdf_ipa_wdi_conn_pipes(struct ipa_wdi3_conn_in_params *in, 568 struct ipa_wdi3_conn_out_params *out) 569 { 570 return ipa_wdi3_conn_pipes(in, out); 571 } 572 573 /** 574 * __qdf_ipa_wdi_disconn_pipes() - Client should call this 575 * function to disconnect pipes 576 * 577 * Note: Should not be called from atomic context 578 * 579 * Returns: 0 on success, negative on failure 580 */ 581 static inline int __qdf_ipa_wdi_disconn_pipes(void) 582 { 583 return ipa_wdi3_disconn_pipes(); 584 } 585 586 /** 587 * __qdf_ipa_wdi_enable_pipes() - Client should call this 588 * function to enable IPA offload data path 589 * 590 * Note: Should not be called from atomic context 591 * 592 * Returns: 0 on success, negative on failure 593 */ 594 static inline int __qdf_ipa_wdi_enable_pipes(void) 595 { 596 return ipa_wdi3_enable_pipes(); 597 } 598 599 /** 600 * __qdf_ipa_wdi_disable_pipes() - Client should call this 601 * function to disable IPA offload data path 602 * 603 * Note: Should not be called from atomic context 604 * 605 * Returns: 0 on success, negative on failure 606 */ 607 static inline int __qdf_ipa_wdi_disable_pipes(void) 608 { 609 return ipa_wdi3_disable_pipes(); 610 } 611 612 /** 613 * __qdf_ipa_wdi_set_perf_profile() - Client should call this function to 614 * set IPA clock bandwidth based on data rates 615 * 616 * @profile: [in] BandWidth profile to use 617 * 618 * Returns: 0 on success, negative on failure 619 */ 620 static inline int __qdf_ipa_wdi_set_perf_profile( 621 struct ipa_wdi3_perf_profile *profile) 622 { 623 return ipa_wdi3_set_perf_profile(profile); 624 } 625 626 #endif /* CONFIG_IPA_WDI_UNIFIED_API */ 627 628 #endif /* IPA_OFFLOAD */ 629 #endif /* I_QDF_IPA_WDI_H */ 630