1*5113495bSYour Name /* 2*5113495bSYour Name * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. 3*5113495bSYour Name * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. 4*5113495bSYour Name * 5*5113495bSYour Name * Permission to use, copy, modify, and/or distribute this software for any 6*5113495bSYour Name * purpose with or without fee is hereby granted, provided that the above 7*5113495bSYour Name * copyright notice and this permission notice appear in all copies. 8*5113495bSYour Name * 9*5113495bSYour Name * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10*5113495bSYour Name * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11*5113495bSYour Name * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12*5113495bSYour Name * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13*5113495bSYour Name * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14*5113495bSYour Name * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15*5113495bSYour Name * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16*5113495bSYour Name */ 17*5113495bSYour Name 18*5113495bSYour Name #ifndef _OL_TXRX_IPA_H_ 19*5113495bSYour Name #define _OL_TXRX_IPA_H_ 20*5113495bSYour Name 21*5113495bSYour Name #ifdef IPA_OFFLOAD 22*5113495bSYour Name 23*5113495bSYour Name #include <cdp_txrx_cmn.h> /* ol_txrx_vdev_t, etc. */ 24*5113495bSYour Name #include <ol_txrx_types.h> 25*5113495bSYour Name 26*5113495bSYour Name /** 27*5113495bSYour Name * struct frag_header - fragment header type registered to IPA hardware 28*5113495bSYour Name * @length: fragment length 29*5113495bSYour Name * @reserved1: Reserved not used 30*5113495bSYour Name * @reserved2: Reserved not used 31*5113495bSYour Name * 32*5113495bSYour Name */ 33*5113495bSYour Name #ifdef QCA_WIFI_3_0 34*5113495bSYour Name struct frag_header { 35*5113495bSYour Name uint16_t length; 36*5113495bSYour Name uint32_t reserved1; 37*5113495bSYour Name uint32_t reserved2; 38*5113495bSYour Name } __packed; 39*5113495bSYour Name #else 40*5113495bSYour Name struct frag_header { 41*5113495bSYour Name uint32_t 42*5113495bSYour Name length:16, 43*5113495bSYour Name reserved16:16; 44*5113495bSYour Name uint32_t reserved2; 45*5113495bSYour Name } __packed; 46*5113495bSYour Name #endif 47*5113495bSYour Name 48*5113495bSYour Name /** 49*5113495bSYour Name * struct ipa_header - ipa header type registered to IPA hardware 50*5113495bSYour Name * @vdev_id: vdev id 51*5113495bSYour Name * @reserved: Reserved not used 52*5113495bSYour Name * 53*5113495bSYour Name */ 54*5113495bSYour Name struct ipa_header { 55*5113495bSYour Name uint32_t 56*5113495bSYour Name vdev_id:8, /* vdev_id field is LSB of IPA DESC */ 57*5113495bSYour Name reserved:24; 58*5113495bSYour Name } __packed; 59*5113495bSYour Name 60*5113495bSYour Name /** 61*5113495bSYour Name * struct ol_txrx_ipa_uc_tx_hdr - full tx header registered to IPA hardware 62*5113495bSYour Name * @frag_hd: fragment header 63*5113495bSYour Name * @ipa_hd: ipa header 64*5113495bSYour Name * @eth: ether II header 65*5113495bSYour Name * 66*5113495bSYour Name */ 67*5113495bSYour Name struct ol_txrx_ipa_uc_tx_hdr { 68*5113495bSYour Name struct frag_header frag_hd; 69*5113495bSYour Name struct ipa_header ipa_hd; 70*5113495bSYour Name struct ethhdr eth; 71*5113495bSYour Name } __packed; 72*5113495bSYour Name 73*5113495bSYour Name /** 74*5113495bSYour Name * struct ol_txrx_ipa_uc_rx_hdr - full rx header registered to IPA hardware 75*5113495bSYour Name * @eth: ether II header 76*5113495bSYour Name * 77*5113495bSYour Name */ 78*5113495bSYour Name struct ol_txrx_ipa_uc_rx_hdr { 79*5113495bSYour Name struct ethhdr eth; 80*5113495bSYour Name } __packed; 81*5113495bSYour Name 82*5113495bSYour Name #define OL_TXRX_IPA_UC_WLAN_8023_HDR_SIZE 14 83*5113495bSYour Name 84*5113495bSYour Name #define OL_TXRX_IPA_IPV4_NAME_EXT "_ipv4" 85*5113495bSYour Name #define OL_TXRX_IPA_IPV6_NAME_EXT "_ipv6" 86*5113495bSYour Name 87*5113495bSYour Name #define OL_TXRX_IPA_MAX_IFACE MAX_IPA_IFACE 88*5113495bSYour Name 89*5113495bSYour Name #define OL_TXRX_IPA_WLAN_FRAG_HEADER sizeof(struct frag_header) 90*5113495bSYour Name #define OL_TXRX_IPA_WLAN_IPA_HEADER sizeof(struct ipa_header) 91*5113495bSYour Name #define OL_TXRX_IPA_UC_WLAN_TX_HDR_LEN sizeof(struct ol_txrx_ipa_uc_tx_hdr) 92*5113495bSYour Name #define OL_TXRX_IPA_UC_WLAN_RX_HDR_LEN sizeof(struct ol_txrx_ipa_uc_rx_hdr) 93*5113495bSYour Name #define OL_TXRX_IPA_UC_WLAN_HDR_DES_MAC_OFFSET \ 94*5113495bSYour Name (OL_TXRX_IPA_WLAN_FRAG_HEADER + OL_TXRX_IPA_WLAN_IPA_HEADER) 95*5113495bSYour Name 96*5113495bSYour Name #if defined(QCA_WIFI_3_0) && defined(CONFIG_IPA3) 97*5113495bSYour Name #define OL_TXRX_IPA_WDI2_SET(pipe_in, ipa_res, osdev) \ 98*5113495bSYour Name do { \ 99*5113495bSYour Name QDF_IPA_PIPE_IN_UL_RDY_RING_RP_VA(pipe_in) = \ 100*5113495bSYour Name ipa_res->rx_proc_done_idx->vaddr; \ 101*5113495bSYour Name QDF_IPA_PIPE_IN_UL_RDY_COMP_RING(pipe_in) = \ 102*5113495bSYour Name qdf_mem_get_dma_addr(osdev, \ 103*5113495bSYour Name &ipa_res->rx2_rdy_ring->mem_info);\ 104*5113495bSYour Name QDF_IPA_PIPE_IN_UL_RDY_COMP_RING_SIZE(pipe_in) = \ 105*5113495bSYour Name ipa_res->rx2_rdy_ring->mem_info.size; \ 106*5113495bSYour Name QDF_IPA_PIPE_IN_UL_RDY_COMP_RING_WP_PA(pipe_in) = \ 107*5113495bSYour Name qdf_mem_get_dma_addr(osdev, \ 108*5113495bSYour Name &ipa_res->rx2_proc_done_idx->mem_info); \ 109*5113495bSYour Name QDF_IPA_PIPE_IN_UL_RDY_COMP_RING_WP_VA(pipe_in) = \ 110*5113495bSYour Name ipa_res->rx2_proc_done_idx->vaddr; \ 111*5113495bSYour Name } while (0) 112*5113495bSYour Name #else 113*5113495bSYour Name /* Do nothing */ 114*5113495bSYour Name #define OL_TXRX_IPA_WDI2_SET(pipe_in, ipa_res, osdev) 115*5113495bSYour Name #endif /* IPA3 */ 116*5113495bSYour Name 117*5113495bSYour Name /** 118*5113495bSYour Name * ol_txrx_ipa_uc_get_resource() - Client request resource information 119*5113495bSYour Name * @soc_hdl: data path soc handle 120*5113495bSYour Name * @pdev_id: device instance id 121*5113495bSYour Name * 122*5113495bSYour Name * OL client will request IPA UC related resource information 123*5113495bSYour Name * Resource information will be distributted to IPA module 124*5113495bSYour Name * All of the required resources should be pre-allocated 125*5113495bSYour Name * 126*5113495bSYour Name * Return: QDF_STATUS 127*5113495bSYour Name */ 128*5113495bSYour Name QDF_STATUS ol_txrx_ipa_uc_get_resource(struct cdp_soc_t *soc_hdl, 129*5113495bSYour Name uint8_t pdev_id); 130*5113495bSYour Name 131*5113495bSYour Name /** 132*5113495bSYour Name * ol_txrx_ipa_uc_set_doorbell_paddr() - Client set IPA UC doorbell register 133*5113495bSYour Name * @soc_hdl: data path soc handle 134*5113495bSYour Name * @pdev_id: device instance id 135*5113495bSYour Name * 136*5113495bSYour Name * IPA UC let know doorbell register physical address 137*5113495bSYour Name * WLAN firmware will use this physical address to notify IPA UC 138*5113495bSYour Name * 139*5113495bSYour Name * Return: QDF_STATUS 140*5113495bSYour Name */ 141*5113495bSYour Name QDF_STATUS ol_txrx_ipa_uc_set_doorbell_paddr(struct cdp_soc_t *soc_hdl, 142*5113495bSYour Name uint8_t pdev_id); 143*5113495bSYour Name 144*5113495bSYour Name /** 145*5113495bSYour Name * ol_txrx_ipa_uc_set_active() - Client notify IPA UC data path active or not 146*5113495bSYour Name * @soc_hdl: data path soc handle 147*5113495bSYour Name * @pdev_id: device instance id 148*5113495bSYour Name * @uc_active: WDI UC path enable or not 149*5113495bSYour Name * @is_tx: TX path or RX path 150*5113495bSYour Name * 151*5113495bSYour Name * IPA UC let know doorbell register physical address 152*5113495bSYour Name * WLAN firmware will use this physical address to notify IPA UC 153*5113495bSYour Name * 154*5113495bSYour Name * Return: QDF_STATUS 155*5113495bSYour Name */ 156*5113495bSYour Name QDF_STATUS ol_txrx_ipa_uc_set_active(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 157*5113495bSYour Name bool uc_active, bool is_tx); 158*5113495bSYour Name 159*5113495bSYour Name /** 160*5113495bSYour Name * ol_txrx_ipa_uc_op_response() - Handle OP command response from firmware 161*5113495bSYour Name * @soc_hdl: data path soc handle 162*5113495bSYour Name * @pdev_id: device instance id 163*5113495bSYour Name * @op_msg: op response message from firmware 164*5113495bSYour Name * 165*5113495bSYour Name * Return: none 166*5113495bSYour Name */ 167*5113495bSYour Name QDF_STATUS ol_txrx_ipa_uc_op_response(struct cdp_soc_t *soc_hdl, 168*5113495bSYour Name uint8_t pdev_id, uint8_t *op_msg); 169*5113495bSYour Name 170*5113495bSYour Name /** 171*5113495bSYour Name * ol_txrx_ipa_uc_register_op_cb() - Register OP handler function 172*5113495bSYour Name * @soc_hdl: data path soc handle 173*5113495bSYour Name * @pdev_id: device instance id 174*5113495bSYour Name * @op_cb: handler function pointer 175*5113495bSYour Name * 176*5113495bSYour Name * Return: none 177*5113495bSYour Name */ 178*5113495bSYour Name QDF_STATUS ol_txrx_ipa_uc_register_op_cb(struct cdp_soc_t *soc_hdl, 179*5113495bSYour Name uint8_t pdev_id, 180*5113495bSYour Name ipa_uc_op_cb_type op_cb, 181*5113495bSYour Name void *usr_ctxt); 182*5113495bSYour Name 183*5113495bSYour Name /** 184*5113495bSYour Name * ol_txrx_ipa_uc_get_stat() - Get firmware wdi status 185*5113495bSYour Name * @soc_hdl: data path soc handle 186*5113495bSYour Name * @pdev_id: device instance id 187*5113495bSYour Name * 188*5113495bSYour Name * Return: none 189*5113495bSYour Name */ 190*5113495bSYour Name QDF_STATUS ol_txrx_ipa_uc_get_stat(struct cdp_soc_t *soc_hdl, uint8_t pdev_id); 191*5113495bSYour Name 192*5113495bSYour Name /** 193*5113495bSYour Name * ol_txrx_ipa_enable_autonomy() - Enable autonomy RX path 194*5113495bSYour Name * @soc_hdl: data path soc handle 195*5113495bSYour Name * @pdev_id: device instance id 196*5113495bSYour Name * 197*5113495bSYour Name * Set all RX packet route to IPA 198*5113495bSYour Name * Return: none 199*5113495bSYour Name */ 200*5113495bSYour Name QDF_STATUS ol_txrx_ipa_enable_autonomy(struct cdp_soc_t *soc_hdl, 201*5113495bSYour Name uint8_t pdev_id); 202*5113495bSYour Name 203*5113495bSYour Name /** 204*5113495bSYour Name * ol_txrx_ipa_disable_autonomy() - Disable autonomy RX path 205*5113495bSYour Name * @soc_hdl: data path soc handle 206*5113495bSYour Name * @pdev_id: device instance id 207*5113495bSYour Name * 208*5113495bSYour Name * Disable RX packet route to host 209*5113495bSYour Name * Return: none 210*5113495bSYour Name */ 211*5113495bSYour Name QDF_STATUS ol_txrx_ipa_disable_autonomy(struct cdp_soc_t *soc_hdl, 212*5113495bSYour Name uint8_t pdev_id); 213*5113495bSYour Name 214*5113495bSYour Name /** 215*5113495bSYour Name * ol_txrx_ipa_tx_buf_smmu_mapping() - Create SMMU mappings for IPA 216*5113495bSYour Name * allocated TX buffers 217*5113495bSYour Name * @soc_hdl: handle to the soc 218*5113495bSYour Name * @pdev_id: pdev id number, to get the handle 219*5113495bSYour Name * 220*5113495bSYour Name * Return: QDF_STATUS 221*5113495bSYour Name */ 222*5113495bSYour Name QDF_STATUS ol_txrx_ipa_tx_buf_smmu_mapping(struct cdp_soc_t *soc_hdl, 223*5113495bSYour Name uint8_t pdev_id, 224*5113495bSYour Name const char *func, 225*5113495bSYour Name uint32_t line); 226*5113495bSYour Name 227*5113495bSYour Name /** 228*5113495bSYour Name * ol_txrx_ipa_tx_buf_smmu_unmapping() - Release SMMU mappings for IPA 229*5113495bSYour Name * allocated TX buffers 230*5113495bSYour Name * @soc_hdl: handle to the soc 231*5113495bSYour Name * @pdev_id: pdev id number, to get the handle 232*5113495bSYour Name * 233*5113495bSYour Name * Return: QDF_STATUS 234*5113495bSYour Name */ 235*5113495bSYour Name QDF_STATUS ol_txrx_ipa_tx_buf_smmu_unmapping(struct cdp_soc_t *soc_hdl, 236*5113495bSYour Name uint8_t pdev_id, 237*5113495bSYour Name const char *func, 238*5113495bSYour Name uint32_t line); 239*5113495bSYour Name 240*5113495bSYour Name #ifdef CONFIG_IPA_WDI_UNIFIED_API 241*5113495bSYour Name /** 242*5113495bSYour Name * ol_txrx_ipa_setup() - Setup and connect IPA pipes 243*5113495bSYour Name * @soc_hdl: data path soc handle 244*5113495bSYour Name * @pdev_id: device instance id 245*5113495bSYour Name * @ipa_i2w_cb: IPA to WLAN callback 246*5113495bSYour Name * @ipa_w2i_cb: WLAN to IPA callback 247*5113495bSYour Name * @ipa_wdi_meter_notifier_cb: IPA WDI metering callback 248*5113495bSYour Name * @ipa_desc_size: IPA descriptor size 249*5113495bSYour Name * @ipa_priv: handle to the HTT instance 250*5113495bSYour Name * @is_rm_enabled: Is IPA RM enabled or not 251*5113495bSYour Name * @p_tx_pipe_handle: pointer to Tx pipe handle 252*5113495bSYour Name * @p_rx_pipe_handle: pointer to Rx pipe handle 253*5113495bSYour Name * @is_smmu_enabled: Is SMMU enabled or not 254*5113495bSYour Name * @sys_in: parameters to setup sys pipe in mcc mode 255*5113495bSYour Name * @over_gsi: is ipa ver gsi fw 256*5113495bSYour Name * 257*5113495bSYour Name * Return: QDF_STATUS 258*5113495bSYour Name */ 259*5113495bSYour Name QDF_STATUS ol_txrx_ipa_setup(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 260*5113495bSYour Name void *ipa_i2w_cb, void *ipa_w2i_cb, 261*5113495bSYour Name void *ipa_wdi_meter_notifier_cb, 262*5113495bSYour Name uint32_t ipa_desc_size, 263*5113495bSYour Name void *ipa_priv, bool is_rm_enabled, 264*5113495bSYour Name uint32_t *tx_pipe_handle, uint32_t *rx_pipe_handle, 265*5113495bSYour Name bool is_smmu_enabled, 266*5113495bSYour Name qdf_ipa_sys_connect_params_t *sys_in, 267*5113495bSYour Name bool over_gsi, 268*5113495bSYour Name qdf_ipa_wdi_hdl_t hdl, 269*5113495bSYour Name qdf_ipa_wdi_hdl_t id, 270*5113495bSYour Name void *ipa_ast_notify_cb); 271*5113495bSYour Name #else /* CONFIG_IPA_WDI_UNIFIED_API */ 272*5113495bSYour Name /** 273*5113495bSYour Name * ol_txrx_ipa_setup() - Setup and connect IPA pipes 274*5113495bSYour Name * @soc_hdl: data path soc handle 275*5113495bSYour Name * @pdev_id: device instance id 276*5113495bSYour Name * @ipa_i2w_cb: IPA to WLAN callback 277*5113495bSYour Name * @ipa_w2i_cb: WLAN to IPA callback 278*5113495bSYour Name * @ipa_wdi_meter_notifier_cb: IPA WDI metering callback 279*5113495bSYour Name * @ipa_desc_size: IPA descriptor size 280*5113495bSYour Name * @ipa_priv: handle to the HTT instance 281*5113495bSYour Name * @is_rm_enabled: Is IPA RM enabled or not 282*5113495bSYour Name * @p_tx_pipe_handle: pointer to Tx pipe handle 283*5113495bSYour Name * @p_rx_pipe_handle: pointer to Rx pipe handle 284*5113495bSYour Name * 285*5113495bSYour Name * Return: QDF_STATUS 286*5113495bSYour Name */ 287*5113495bSYour Name QDF_STATUS ol_txrx_ipa_setup(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 288*5113495bSYour Name void *ipa_i2w_cb, void *ipa_w2i_cb, 289*5113495bSYour Name void *ipa_wdi_meter_notifier_cb, 290*5113495bSYour Name uint32_t ipa_desc_size, void *ipa_priv, 291*5113495bSYour Name bool is_rm_enabled, uint32_t *tx_pipe_handle, 292*5113495bSYour Name uint32_t *rx_pipe_handle, 293*5113495bSYour Name qdf_ipa_wdi_hdl_t hdl); 294*5113495bSYour Name #endif /* CONFIG_IPA_WDI_UNIFIED_API */ 295*5113495bSYour Name QDF_STATUS ol_txrx_ipa_cleanup(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 296*5113495bSYour Name uint32_t tx_pipe_handle, 297*5113495bSYour Name uint32_t rx_pipe_handle, 298*5113495bSYour Name qdf_ipa_wdi_hdl_t hdl); 299*5113495bSYour Name QDF_STATUS ol_txrx_ipa_setup_iface(char *ifname, uint8_t *mac_addr, 300*5113495bSYour Name qdf_ipa_client_type_t prod_client, 301*5113495bSYour Name qdf_ipa_client_type_t cons_client, 302*5113495bSYour Name uint8_t session_id, bool is_ipv6_enabled, 303*5113495bSYour Name qdf_ipa_wdi_hdl_t hdl); 304*5113495bSYour Name QDF_STATUS ol_txrx_ipa_cleanup_iface(char *ifname, bool is_ipv6_enabled, 305*5113495bSYour Name qdf_ipa_wdi_hdl_t hdl); 306*5113495bSYour Name 307*5113495bSYour Name /** 308*5113495bSYour Name * ol_txrx_ipa_enable_pipes() - Enable and resume traffic on Tx/Rx pipes 309*5113495bSYour Name * @soc_hdl: data path soc handle 310*5113495bSYour Name * @pdev_id: device instance id 311*5113495bSYour Name * 312*5113495bSYour Name * Return: QDF_STATUS 313*5113495bSYour Name */ 314*5113495bSYour Name QDF_STATUS ol_txrx_ipa_enable_pipes(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 315*5113495bSYour Name qdf_ipa_wdi_hdl_t hdl); 316*5113495bSYour Name 317*5113495bSYour Name /** 318*5113495bSYour Name * ol_txrx_ipa_disable_pipes() – Suspend traffic and disable Tx/Rx pipes 319*5113495bSYour Name * @soc_hdl: data path soc handle 320*5113495bSYour Name * @pdev_id: device instance id 321*5113495bSYour Name * 322*5113495bSYour Name * Return: QDF_STATUS 323*5113495bSYour Name */ 324*5113495bSYour Name QDF_STATUS ol_txrx_ipa_disable_pipes(struct cdp_soc_t *soc_hdl, 325*5113495bSYour Name uint8_t pdev_id, 326*5113495bSYour Name qdf_ipa_wdi_hdl_t hdl); 327*5113495bSYour Name QDF_STATUS ol_txrx_ipa_set_perf_level(int client, 328*5113495bSYour Name uint32_t max_supported_bw_mbps, 329*5113495bSYour Name qdf_ipa_wdi_hdl_t hdl); 330*5113495bSYour Name #ifdef FEATURE_METERING 331*5113495bSYour Name /** 332*5113495bSYour Name * ol_txrx_ipa_uc_get_share_stats() - get Tx/Rx byte stats from FW 333*5113495bSYour Name * @soc_hdl: data path soc handle 334*5113495bSYour Name * @pdev_id: physical device instance id 335*5113495bSYour Name * @value: reset stats 336*5113495bSYour Name * 337*5113495bSYour Name * Return: QDF_STATUS 338*5113495bSYour Name */ 339*5113495bSYour Name QDF_STATUS ol_txrx_ipa_uc_get_share_stats(struct cdp_soc_t *soc_hdl, 340*5113495bSYour Name uint8_t pdev_id, uint8_t reset_stats); 341*5113495bSYour Name /** 342*5113495bSYour Name * ol_txrx_ipa_uc_set_quota() - set quota limit to FW 343*5113495bSYour Name * @soc_hdl: data path soc handle 344*5113495bSYour Name * @pdev_id: physical device instance number 345*5113495bSYour Name * @value: quota limit bytes 346*5113495bSYour Name * 347*5113495bSYour Name * Return: QDF_STATUS 348*5113495bSYour Name */ 349*5113495bSYour Name QDF_STATUS ol_txrx_ipa_uc_set_quota(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 350*5113495bSYour Name uint64_t quota_bytes); 351*5113495bSYour Name #endif 352*5113495bSYour Name #endif 353*5113495bSYour Name #endif /* _OL_TXRX_IPA_H_*/ 354