| /* |
| * Copyright (c) 2013-2017 The Linux Foundation. All rights reserved. |
| * |
| * Previously licensed under the ISC license by Qualcomm Atheros, Inc. |
| * |
| * |
| * Permission to use, copy, modify, and/or distribute this software for |
| * any purpose with or without fee is hereby granted, provided that the |
| * above copyright notice and this permission notice appear in all |
| * copies. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL |
| * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED |
| * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE |
| * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL |
| * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR |
| * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER |
| * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR |
| * PERFORMANCE OF THIS SOFTWARE. |
| */ |
| |
| /* |
| * This file was originally distributed by Qualcomm Atheros, Inc. |
| * under proprietary terms before Copyright ownership was assigned |
| * to the Linux Foundation. |
| */ |
| |
| /* |
| * Defintions for the Atheros Wireless LAN controller driver. |
| */ |
| #ifndef _DEV_OL_ATH_ATHVAR_H |
| #define _DEV_OL_ATH_ATHVAR_H |
| |
| #include <osdep.h> |
| #include <a_types.h> |
| #include <osapi_linux.h> |
| #include "adf_os_types.h" |
| #include "adf_os_lock.h" |
| #include "wmi_unified_api.h" |
| #include "htc_api.h" |
| #include "bmi_msg.h" |
| #include "ol_txrx_api.h" |
| #include "ol_txrx_ctrl_api.h" |
| #include "ol_txrx_osif_api.h" |
| #include "ol_params.h" |
| #include <wdi_event_api.h> |
| #include "vos_cnss.h" |
| |
| #include "ol_ctrl_addba_api.h" |
| typedef void * hif_handle_t; |
| |
| struct ol_version { |
| u_int32_t host_ver; |
| u_int32_t target_ver; |
| u_int32_t wlan_ver; |
| u_int32_t wlan_ver_1; |
| u_int32_t abi_ver; |
| }; |
| |
| typedef enum _ATH_BIN_FILE { |
| ATH_OTP_FILE, |
| ATH_FIRMWARE_FILE, |
| ATH_PATCH_FILE, |
| ATH_BOARD_DATA_FILE, |
| ATH_FLASH_FILE, |
| ATH_SETUP_FILE, |
| } ATH_BIN_FILE; |
| |
| typedef enum _ol_target_status { |
| OL_TRGET_STATUS_CONNECTED = 0, /* target connected */ |
| OL_TRGET_STATUS_RESET, /* target got reset */ |
| OL_TRGET_STATUS_EJECT, /* target got ejected */ |
| OL_TRGET_STATUS_SUSPEND /*target got suspend*/ |
| } ol_target_status; |
| |
| enum ol_ath_tx_ecodes { |
| TX_IN_PKT_INCR=0, |
| TX_OUT_HDR_COMPL, |
| TX_OUT_PKT_COMPL, |
| PKT_ENCAP_FAIL, |
| TX_PKT_BAD, |
| RX_RCV_MSG_RX_IND, |
| RX_RCV_MSG_PEER_MAP, |
| RX_RCV_MSG_TYPE_TEST |
| } ; |
| |
| #ifdef HIF_SDIO |
| #define MAX_FILE_NAME NAME_MAX |
| struct ol_fw_files { |
| char image_file[MAX_FILE_NAME]; |
| char ibss_image_file[MAX_FILE_NAME]; |
| char board_data[MAX_FILE_NAME]; |
| char otp_data[MAX_FILE_NAME]; |
| char utf_file[MAX_FILE_NAME]; |
| char utf_board_data[MAX_FILE_NAME]; |
| char setup_file[MAX_FILE_NAME]; |
| char epping_file[MAX_FILE_NAME]; |
| }; |
| #endif |
| |
| #ifdef QCA_ARP_SPOOFING_WAR |
| enum { |
| RX_INTRA_BSS_FWD, |
| FILTER_NONE |
| }; |
| |
| typedef int (*hdd_filter_cb_t)(u_int32_t, adf_nbuf_t, u_int32_t); |
| #endif |
| |
| #ifndef ATH_CAP_DCS_CWIM |
| #define ATH_CAP_DCS_CWIM 0x1 |
| #define ATH_CAP_DCS_WLANIM 0x2 |
| #endif |
| /* |
| * structure to hold the packet error count for CE and hif layer |
| */ |
| struct ol_ath_stats { |
| int hif_pipe_no_resrc_count; |
| int ce_ring_delta_fail_count; |
| }; |
| |
| #ifdef HIF_USB |
| /* Magic patterns for FW to report crash information (Rome USB) */ |
| #define FW_ASSERT_PATTERN 0x0000c600 |
| #define FW_REG_PATTERN 0x0000d600 |
| #define FW_REG_END_PATTERN 0x0000e600 |
| #define FW_RAMDUMP_PATTERN 0x0000f600 |
| #define FW_RAMDUMP_END_PATTERN 0x0000f601 |
| #define FW_RAMDUMP_PATTERN_MASK 0xfffffff0 |
| |
| #define FW_REG_DUMP_CNT 60 |
| |
| /* FW RAM segments (Rome USB) */ |
| enum { |
| FW_RAM_SEG_DRAM, |
| FW_RAM_SEG_IRAM, |
| FW_RAM_SEG_AXI, |
| FW_RAM_SEG_CNT |
| }; |
| |
| /* Allocate 384K memory to save each segment of ram dump */ |
| #define FW_RAMDUMP_SEG_SIZE 393216 |
| |
| /* structure to save RAM dump information */ |
| struct fw_ramdump { |
| A_UINT32 start_addr; |
| A_UINT32 length; |
| A_UINT8 *mem; |
| }; |
| #endif |
| #ifdef CONFIG_NON_QC_PLATFORM_PCI |
| #define MAX_FILE_NAME 20 |
| struct non_qc_platform_pci_fw_files { |
| char image_file[MAX_FILE_NAME]; |
| char board_data[MAX_FILE_NAME]; |
| char otp_data[MAX_FILE_NAME]; |
| char utf_file[MAX_FILE_NAME]; |
| char utf_board_data[MAX_FILE_NAME]; |
| char epping_file[MAX_FILE_NAME]; |
| char evicted_data[MAX_FILE_NAME]; |
| }; |
| #endif |
| |
| struct ol_softc { |
| /* |
| * handle for code that uses the osdep.h version of OS |
| * abstraction primitives |
| */ |
| osdev_t sc_osdev; |
| |
| /* |
| * handle for code that uses adf version of OS |
| * abstraction primitives |
| */ |
| adf_os_device_t adf_dev; |
| |
| struct ol_version version; |
| |
| /* Packet statistics */ |
| struct ol_ath_stats pkt_stats; |
| |
| u_int32_t target_type; /* A_TARGET_TYPE_* */ |
| u_int32_t target_fw_version; |
| u_int32_t target_version; |
| u_int32_t target_revision; |
| u_int8_t crm_version_string[64]; /* store pHalStartRsp->startRspParams.wcnssCrmVersionString */ |
| u_int8_t wlan_version_string[64]; /* store pHalStartRsp->startRspParams.wcnssWlanVersionString */ |
| ol_target_status target_status; /* target status */ |
| bool is_sim; /* is this a simulator */ |
| u_int8_t *cal_in_flash; /* calibration data is stored in flash */ |
| void *cal_mem; /* virtual address for the calibration data on the flash */ |
| |
| WLAN_INIT_STATUS wlan_init_status; /* status of target init */ |
| |
| /* BMI info */ |
| void *bmi_ol_priv; /* OS-dependent private info for BMI */ |
| bool bmiDone; |
| bool bmiUADone; |
| u_int8_t *pBMICmdBuf; |
| dma_addr_t BMICmd_pa; |
| OS_DMA_MEM_CONTEXT(bmicmd_dmacontext) |
| |
| u_int8_t *pBMIRspBuf; |
| dma_addr_t BMIRsp_pa; |
| u_int32_t last_rxlen; /* length of last response */ |
| OS_DMA_MEM_CONTEXT(bmirsp_dmacontext) |
| |
| void *MSI_magic; |
| dma_addr_t MSI_magic_dma; |
| OS_DMA_MEM_CONTEXT(MSI_dmacontext) |
| |
| /* Handles for Lower Layers : filled in at init time */ |
| hif_handle_t hif_hdl; |
| #if defined(HIF_PCI) |
| struct hif_pci_softc *hif_sc; |
| #elif defined(HIF_USB) |
| struct hif_usb_softc *hif_sc; |
| #else |
| struct ath_hif_sdio_softc *hif_sc; |
| #endif |
| |
| /* HTC handles */ |
| void *htc_handle; |
| |
| bool IdlePowerSave; |
| int ProtocolPowerSave; |
| A_BOOL fEnableBeaconEarlyTermination; |
| u_int8_t bcnEarlyTermWakeInterval; |
| |
| /* ol data path handle */ |
| ol_txrx_pdev_handle pdev_txrx_handle; |
| |
| /* UTF event information */ |
| struct { |
| u_int8_t *data; |
| u_int32_t length; |
| adf_os_size_t offset; |
| u_int8_t currentSeq; |
| u_int8_t expectedSeq; |
| } utf_event_info; |
| |
| struct ol_wow_info *scn_wowInfo; |
| |
| #ifdef PERE_IP_HDR_ALIGNMENT_WAR |
| bool host_80211_enable; /* Enables native-wifi mode on host */ |
| #endif |
| bool enableuartprint; /* enable uart/serial prints from target */ |
| bool enablefwlog; /* enable fwlog */ |
| /* enable FW self-recovery for Rome USB */ |
| bool enableFwSelfRecovery; |
| #ifdef HIF_USB |
| /* structure to save FW RAM dump (Rome USB) */ |
| struct fw_ramdump *ramdump[FW_RAM_SEG_CNT]; |
| A_UINT8 ramdump_index; |
| bool fw_ram_dumping; |
| #endif |
| |
| bool enablesinglebinary; /* Use single binary for FW */ |
| HAL_REG_CAPABILITIES hal_reg_capabilities; |
| struct ol_regdmn *ol_regdmn_handle; |
| u_int8_t bcn_mode; |
| u_int8_t arp_override; |
| /* |
| * Includes host side stack level stats + |
| * radio level athstats |
| */ |
| struct wlan_dbg_stats ath_stats; |
| int16_t chan_nf; /* noise_floor */ |
| u_int32_t min_tx_power; |
| u_int32_t max_tx_power; |
| u_int32_t txpowlimit2G; |
| u_int32_t txpowlimit5G; |
| u_int32_t txpower_scale; |
| u_int32_t chan_tx_pwr; |
| u_int32_t vdev_count; |
| u_int32_t max_bcn_ie_size; |
| adf_os_spinlock_t scn_lock; |
| |
| u_int8_t vow_extstats; |
| |
| u_int8_t scn_dcs; /* if dcs enabled or not*/ |
| wdi_event_subscribe scn_rx_peer_invalid_subscriber; |
| u_int8_t proxy_sta; |
| u_int8_t bcn_enabled; |
| u_int8_t dtcs; /* Dynamic Tx Chainmask Selection enabled/disabled */ |
| u_int32_t set_ht_vht_ies:1; /* true if vht ies are set on target */ |
| bool scn_cwmenable; /*CWM enable/disable state*/ |
| u_int8_t max_no_of_peers; |
| #ifdef CONFIG_NON_QC_PLATFORM_PCI |
| struct non_qc_platform_pci_fw_files fw_files; |
| #elif defined(HIF_PCI) |
| struct cnss_fw_files fw_files; |
| #elif defined(HIF_SDIO) |
| struct ol_fw_files fw_files; |
| #endif |
| #if defined(CONFIG_CNSS) || defined(HIF_SDIO) || defined(HIF_PCI) |
| void *ramdump_base; |
| unsigned long ramdump_address; |
| unsigned long ramdump_size; |
| #endif |
| bool enable_self_recovery; |
| #ifdef WLAN_FEATURE_LPSS |
| bool enablelpasssupport; |
| #endif |
| bool enableRamdumpCollection; |
| #ifdef FEATURE_RUNTIME_PM |
| bool enable_runtime_pm; |
| u_int32_t runtime_pm_delay; |
| #endif |
| #ifdef FEATURE_SECURE_FIRMWARE |
| bool enable_fw_hash_check; |
| #endif |
| uint16_t board_id; |
| }; |
| |
| #ifdef PERE_IP_HDR_ALIGNMENT_WAR |
| #define ol_scn_host_80211_enable_get(_ol_pdev_hdl) \ |
| ((struct ol_softc *)(_ol_pdev_hdl))->host_80211_enable |
| #endif |
| |
| struct bcn_buf_entry { |
| A_BOOL is_dma_mapped; |
| adf_nbuf_t bcn_buf; |
| TAILQ_ENTRY(bcn_buf_entry) deferred_bcn_list_elem; |
| }; |
| |
| struct ol_ath_vap_net80211 { |
| struct ol_softc *av_sc; /* back pointer to softc */ |
| ol_txrx_vdev_handle av_txrx_handle; /* ol data path handle */ |
| u_int32_t av_if_id; /* interface id */ |
| u_int64_t av_tsfadjust; /* Adjusted TSF, host endian */ |
| bool av_beacon_offload; /* Handle beacons in FW */ |
| adf_nbuf_t av_wbuf; /* Beacon buffer */ |
| A_BOOL is_dma_mapped; |
| os_timer_t av_timer; |
| bool av_ol_resmgr_wait; /* UMAC waits for target */ |
| /* event to bringup vap*/ |
| adf_os_spinlock_t avn_lock; |
| TAILQ_HEAD(, bcn_buf_entry) deferred_bcn_list; |
| os_timer_t av_target_stop_timer; |
| bool av_set_target_stopping; |
| bool av_target_stopped; |
| }; |
| #define OL_ATH_VAP_NET80211(_vap) ((struct ol_ath_vap_net80211 *)(_vap)) |
| |
| struct ol_ath_node_net80211 { |
| ol_txrx_peer_handle an_txrx_handle; /* ol data path handle */ |
| }; |
| |
| #define OL_ATH_NODE_NET80211(_ni) ((struct ol_ath_node_net80211 *)(_ni)) |
| |
| #define UAPSD_SRV_INTERVAL_DEFAULT_BK_BE_VI 300 /* Default U-APSD Service Interval in msec for BK, BE and VI */ |
| #define UAPSD_SRV_INTERVAL_DEFAULT_VO 20 /* Default U-APSD Service Interval in msec for VO */ |
| #define UAPSD_SUS_INTERVAL_DEFAULT 2000 /* Default U-APSD Suspend Interval in msec for BK, BE and VI */ |
| #define UAPSD_DELAY_INTERVAL_DEFAULT 3000 /* Default U-APSD Delay Interval in msec for BK, BE and VI */ |
| #define UAPSD_USER_PRIO_BE 0 |
| #define UAPSD_USER_PRIO_BK 2 |
| #define UAPSD_USER_PRIO_VI 5 |
| #define UAPSD_USER_PRIO_VO 7 |
| |
| #define SIR_MAC_DS_PARAM_SET_EID 3 |
| #define SIR_MAC_EDCA_PARAM_SET_EID 12 |
| #define SIR_MAC_CHNL_SWITCH_ANN_EID 37 |
| #define SIR_MAC_QUIET_EID 40 |
| #define SIR_MAC_ERP_INFO_EID 42 |
| #define SIR_MAC_QOS_CAPABILITY_EID 46 |
| #define SIR_MAC_HT_INFO_EID 61 |
| |
| void ol_target_failure(void *instance, A_STATUS status); |
| |
| int ol_asf_adf_attach(struct ol_softc *scn); |
| |
| int ol_ath_detach(struct ol_softc *scn, int force); |
| void ol_ath_utf_detach(struct ol_softc *scn); |
| #ifdef QVIT |
| void ol_ath_qvit_detach(struct ol_softc *scn); |
| void ol_ath_qvit_attach(struct ol_softc *scn); |
| #endif |
| |
| int ol_ath_resume(struct ol_softc *scn); |
| |
| int ol_ath_suspend(struct ol_softc *scn); |
| |
| int ol_ath_cwm_attach(struct ol_softc *scn); |
| |
| u_int8_t *ol_ath_vap_get_myaddr(struct ol_softc *scn, u_int8_t vdev_id); |
| |
| void ol_ath_utf_attach(struct ol_softc *scn); |
| |
| void ol_ath_vap_send_hdr_complete(void *ctx, HTC_PACKET_QUEUE *htc_pkt_list); |
| |
| |
| void ol_rx_indicate(void *ctx, adf_nbuf_t wbuf); |
| |
| void ol_rx_handler(void *ctx, HTC_PACKET *htc_packet); |
| |
| void ol_ath_beacon_stop(struct ol_softc *scn, |
| struct ol_ath_vap_net80211 *avn); |
| |
| u_int32_t host_interest_item_address(u_int32_t target_type, u_int32_t item_offset); |
| |
| int |
| ol_ath_set_config_param(struct ol_softc *scn, ol_ath_param_t param, void *buff); |
| |
| int |
| ol_ath_get_config_param(struct ol_softc *scn, ol_ath_param_t param, void *buff); |
| |
| int |
| ol_hal_set_config_param(struct ol_softc *scn, ol_hal_param_t param, void *buff); |
| |
| int |
| ol_hal_get_config_param(struct ol_softc *scn, ol_hal_param_t param, void *buff); |
| |
| void ol_ath_host_config_update(struct ol_softc *scn); |
| |
| int ol_ath_suspend_target(struct ol_softc *scn, int disable_target_intr); |
| int ol_ath_resume_target(struct ol_softc *scn); |
| |
| int wmi_unified_pdev_get_tpc_config(wmi_unified_t wmi_handle, u_int32_t param); |
| void ol_get_wlan_dbg_stats(struct ol_softc *scn, struct wlan_dbg_stats *dbg_stats); |
| |
| int |
| wmi_unified_node_set_param(wmi_unified_t wmi_handle, u_int8_t *peer_addr,u_int32_t param_id, |
| u_int32_t param_val,u_int32_t vdev_id); |
| |
| |
| #ifdef BIG_ENDIAN_HOST |
| /* This API is used in copying in elements to WMI message, |
| since WMI message uses multilpes of 4 bytes, This API |
| converts length into multiples of 4 bytes, and performs copy |
| */ |
| #define OL_IF_MSG_COPY_CHAR_ARRAY(destp, srcp, len) do { \ |
| int j; \ |
| u_int32_t *src, *dest; \ |
| src = (u_int32_t *)srcp; \ |
| dest = (u_int32_t *)destp; \ |
| for(j=0; j < roundup(len, sizeof(u_int32_t))/4; j++) { \ |
| *(dest+j) = adf_os_le32_to_cpu(*(src+j)); \ |
| } \ |
| } while(0) |
| |
| #else |
| |
| #define OL_IF_MSG_COPY_CHAR_ARRAY(destp, srcp, len) do { \ |
| OS_MEMCPY(destp, srcp, len); \ |
| } while(0) |
| |
| #endif |
| |
| /* Keep Alive KeepAliveParam. */ |
| typedef struct |
| { |
| u_int8_t keepAliveEnable;//Enable or Disable |
| u_int32_t keepAliveMethod;// Type of frame which need to send for keep alive purpose |
| u_int32_t keepAliveInterval;//Interval in Seconds |
| u_int8_t hostIpv4Addr[4]; //Used only when method type is Arp |
| u_int8_t destIpv4Addr[4];//Used only when method type is Arp |
| u_int8_t destMacAddr[6];//Used only when method type is Arp |
| } KeepAliveParam, *pKeepAliveParam; |
| |
| #endif /* _DEV_OL_ATH_ATHVAR_H */ |