1dad0d04fSFariya Fatima /** 2dad0d04fSFariya Fatima * Copyright (c) 2014 Redpine Signals Inc. 3dad0d04fSFariya Fatima * 4dad0d04fSFariya Fatima * Permission to use, copy, modify, and/or distribute this software for any 5dad0d04fSFariya Fatima * purpose with or without fee is hereby granted, provided that the above 6dad0d04fSFariya Fatima * copyright notice and this permission notice appear in all copies. 7dad0d04fSFariya Fatima * 8dad0d04fSFariya Fatima * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9dad0d04fSFariya Fatima * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10dad0d04fSFariya Fatima * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11dad0d04fSFariya Fatima * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12dad0d04fSFariya Fatima * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13dad0d04fSFariya Fatima * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14dad0d04fSFariya Fatima * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15dad0d04fSFariya Fatima */ 16dad0d04fSFariya Fatima 17dad0d04fSFariya Fatima #ifndef __RSI_MAIN_H__ 18dad0d04fSFariya Fatima #define __RSI_MAIN_H__ 19dad0d04fSFariya Fatima 20dad0d04fSFariya Fatima #include <linux/string.h> 21dad0d04fSFariya Fatima #include <linux/skbuff.h> 22dad0d04fSFariya Fatima #include <net/mac80211.h> 23dad0d04fSFariya Fatima 24dad0d04fSFariya Fatima #define ERR_ZONE BIT(0) /* For Error Msgs */ 25dad0d04fSFariya Fatima #define INFO_ZONE BIT(1) /* For General Status Msgs */ 26dad0d04fSFariya Fatima #define INIT_ZONE BIT(2) /* For Driver Init Seq Msgs */ 27dad0d04fSFariya Fatima #define MGMT_TX_ZONE BIT(3) /* For TX Mgmt Path Msgs */ 28dad0d04fSFariya Fatima #define MGMT_RX_ZONE BIT(4) /* For RX Mgmt Path Msgs */ 29dad0d04fSFariya Fatima #define DATA_TX_ZONE BIT(5) /* For TX Data Path Msgs */ 30dad0d04fSFariya Fatima #define DATA_RX_ZONE BIT(6) /* For RX Data Path Msgs */ 31dad0d04fSFariya Fatima #define FSM_ZONE BIT(7) /* For State Machine Msgs */ 32dad0d04fSFariya Fatima #define ISR_ZONE BIT(8) /* For Interrupt Msgs */ 33dad0d04fSFariya Fatima 344833c953SAmitkumar Karwar enum RSI_FSM_STATES { 35015e3674SPrameela Rani Garnepudi FSM_FW_NOT_LOADED, 364833c953SAmitkumar Karwar FSM_CARD_NOT_READY, 379920322cSPrameela Rani Garnepudi FSM_COMMON_DEV_PARAMS_SENT, 384833c953SAmitkumar Karwar FSM_BOOT_PARAMS_SENT, 394833c953SAmitkumar Karwar FSM_EEPROM_READ_MAC_ADDR, 4009cfb41fSPrameela Rani Garnepudi FSM_EEPROM_READ_RF_TYPE, 414833c953SAmitkumar Karwar FSM_RESET_MAC_SENT, 424833c953SAmitkumar Karwar FSM_RADIO_CAPS_SENT, 434833c953SAmitkumar Karwar FSM_BB_RF_PROG_SENT, 44e0d0ae8aSAmitkumar Karwar FSM_MAC_INIT_DONE, 45e0d0ae8aSAmitkumar Karwar 46e0d0ae8aSAmitkumar Karwar NUM_FSM_STATES 474833c953SAmitkumar Karwar }; 48dad0d04fSFariya Fatima 49dad0d04fSFariya Fatima extern u32 rsi_zone_enabled; 505fe1b76aSJoe Perches extern __printf(2, 3) void rsi_dbg(u32 zone, const char *fmt, ...); 51dad0d04fSFariya Fatima 52dad0d04fSFariya Fatima #define RSI_MAX_VIFS 1 53dad0d04fSFariya Fatima #define NUM_EDCA_QUEUES 4 54dad0d04fSFariya Fatima #define IEEE80211_ADDR_LEN 6 55dad0d04fSFariya Fatima #define FRAME_DESC_SZ 16 56dad0d04fSFariya Fatima #define MIN_802_11_HDR_LEN 24 57dad0d04fSFariya Fatima 58dad0d04fSFariya Fatima #define DATA_QUEUE_WATER_MARK 400 59dad0d04fSFariya Fatima #define MIN_DATA_QUEUE_WATER_MARK 300 60dad0d04fSFariya Fatima #define MULTICAST_WATER_MARK 200 61dad0d04fSFariya Fatima #define MAC_80211_HDR_FRAME_CONTROL 0 62dad0d04fSFariya Fatima #define WME_NUM_AC 4 63dad0d04fSFariya Fatima #define NUM_SOFT_QUEUES 5 64dad0d04fSFariya Fatima #define MAX_HW_QUEUES 8 65dad0d04fSFariya Fatima #define INVALID_QUEUE 0xff 66dad0d04fSFariya Fatima #define MAX_CONTINUOUS_VO_PKTS 8 67dad0d04fSFariya Fatima #define MAX_CONTINUOUS_VI_PKTS 4 68dad0d04fSFariya Fatima 69dad0d04fSFariya Fatima /* Queue information */ 7061f2a6fcSPrameela Rani Garnepudi #define RSI_COEX_Q 0x0 71dad0d04fSFariya Fatima #define RSI_WIFI_MGMT_Q 0x4 72dad0d04fSFariya Fatima #define RSI_WIFI_DATA_Q 0x5 73dad0d04fSFariya Fatima #define IEEE80211_MGMT_FRAME 0x00 74dad0d04fSFariya Fatima #define IEEE80211_CTL_FRAME 0x04 75dad0d04fSFariya Fatima 76dad0d04fSFariya Fatima #define IEEE80211_QOS_TID 0x0f 77dad0d04fSFariya Fatima #define IEEE80211_NONQOS_TID 16 78dad0d04fSFariya Fatima 79dad0d04fSFariya Fatima #define MAX_DEBUGFS_ENTRIES 4 80dad0d04fSFariya Fatima 81dad0d04fSFariya Fatima #define TID_TO_WME_AC(_tid) ( \ 82dad0d04fSFariya Fatima ((_tid) == 0 || (_tid) == 3) ? BE_Q : \ 83dad0d04fSFariya Fatima ((_tid) < 3) ? BK_Q : \ 84dad0d04fSFariya Fatima ((_tid) < 6) ? VI_Q : \ 85dad0d04fSFariya Fatima VO_Q) 86dad0d04fSFariya Fatima 87dad0d04fSFariya Fatima #define WME_AC(_q) ( \ 88dad0d04fSFariya Fatima ((_q) == BK_Q) ? IEEE80211_AC_BK : \ 89dad0d04fSFariya Fatima ((_q) == BE_Q) ? IEEE80211_AC_BE : \ 90dad0d04fSFariya Fatima ((_q) == VI_Q) ? IEEE80211_AC_VI : \ 91dad0d04fSFariya Fatima IEEE80211_AC_VO) 92dad0d04fSFariya Fatima 93b78e91bcSPrameela Rani Garnepudi #define RSI_DEV_9113 1 94b78e91bcSPrameela Rani Garnepudi 95dad0d04fSFariya Fatima struct version_info { 96dad0d04fSFariya Fatima u16 major; 97dad0d04fSFariya Fatima u16 minor; 98dad0d04fSFariya Fatima u16 release_num; 99dad0d04fSFariya Fatima u16 patch_num; 100dad0d04fSFariya Fatima } __packed; 101dad0d04fSFariya Fatima 102dad0d04fSFariya Fatima struct skb_info { 103dad0d04fSFariya Fatima s8 rssi; 104dad0d04fSFariya Fatima u32 flags; 105dad0d04fSFariya Fatima u16 channel; 106dad0d04fSFariya Fatima s8 tid; 107dad0d04fSFariya Fatima s8 sta_id; 1086507de6dSPrameela Rani Garnepudi u8 internal_hdr_size; 109dad0d04fSFariya Fatima }; 110dad0d04fSFariya Fatima 111dad0d04fSFariya Fatima enum edca_queue { 112dad0d04fSFariya Fatima BK_Q, 113dad0d04fSFariya Fatima BE_Q, 114dad0d04fSFariya Fatima VI_Q, 115dad0d04fSFariya Fatima VO_Q, 116dad0d04fSFariya Fatima MGMT_SOFT_Q 117dad0d04fSFariya Fatima }; 118dad0d04fSFariya Fatima 119dad0d04fSFariya Fatima struct security_info { 120dad0d04fSFariya Fatima bool security_enable; 121dad0d04fSFariya Fatima u32 ptk_cipher; 122dad0d04fSFariya Fatima u32 gtk_cipher; 123dad0d04fSFariya Fatima }; 124dad0d04fSFariya Fatima 125dad0d04fSFariya Fatima struct wmm_qinfo { 126dad0d04fSFariya Fatima s32 weight; 127dad0d04fSFariya Fatima s32 wme_params; 128dad0d04fSFariya Fatima s32 pkt_contended; 129360accb0SJahnavi Meher s32 txop; 130dad0d04fSFariya Fatima }; 131dad0d04fSFariya Fatima 132dad0d04fSFariya Fatima struct transmit_q_stats { 133dad0d04fSFariya Fatima u32 total_tx_pkt_send[NUM_EDCA_QUEUES + 1]; 134dad0d04fSFariya Fatima u32 total_tx_pkt_freed[NUM_EDCA_QUEUES + 1]; 135dad0d04fSFariya Fatima }; 136dad0d04fSFariya Fatima 137dad0d04fSFariya Fatima struct vif_priv { 138dad0d04fSFariya Fatima bool is_ht; 139dad0d04fSFariya Fatima bool sgi; 140dad0d04fSFariya Fatima u16 seq_start; 141dad0d04fSFariya Fatima }; 142dad0d04fSFariya Fatima 143dad0d04fSFariya Fatima struct rsi_event { 144dad0d04fSFariya Fatima atomic_t event_condition; 145dad0d04fSFariya Fatima wait_queue_head_t event_queue; 146dad0d04fSFariya Fatima }; 147dad0d04fSFariya Fatima 148dad0d04fSFariya Fatima struct rsi_thread { 149dad0d04fSFariya Fatima void (*thread_function)(void *); 150dad0d04fSFariya Fatima struct completion completion; 151dad0d04fSFariya Fatima struct task_struct *task; 152dad0d04fSFariya Fatima struct rsi_event event; 153dad0d04fSFariya Fatima atomic_t thread_done; 154dad0d04fSFariya Fatima }; 155dad0d04fSFariya Fatima 156686a2541SJahnavi Meher struct cqm_info { 157686a2541SJahnavi Meher s8 last_cqm_event_rssi; 158686a2541SJahnavi Meher int rssi_thold; 159686a2541SJahnavi Meher u32 rssi_hyst; 160686a2541SJahnavi Meher }; 161686a2541SJahnavi Meher 1626507de6dSPrameela Rani Garnepudi struct xtended_desc { 1636507de6dSPrameela Rani Garnepudi u8 confirm_frame_type; 1646507de6dSPrameela Rani Garnepudi u8 retry_cnt; 1656507de6dSPrameela Rani Garnepudi u16 reserved; 1666507de6dSPrameela Rani Garnepudi }; 1676507de6dSPrameela Rani Garnepudi 168dad0d04fSFariya Fatima struct rsi_hw; 169dad0d04fSFariya Fatima 170dad0d04fSFariya Fatima struct rsi_common { 171dad0d04fSFariya Fatima struct rsi_hw *priv; 172dad0d04fSFariya Fatima struct vif_priv vif_info[RSI_MAX_VIFS]; 173dad0d04fSFariya Fatima 174dad0d04fSFariya Fatima bool mgmt_q_block; 175dad0d04fSFariya Fatima struct version_info driver_ver; 176dad0d04fSFariya Fatima struct version_info fw_ver; 177dad0d04fSFariya Fatima 178dad0d04fSFariya Fatima struct rsi_thread tx_thread; 179dad0d04fSFariya Fatima struct sk_buff_head tx_queue[NUM_EDCA_QUEUES + 1]; 180dad0d04fSFariya Fatima /* Mutex declaration */ 181dad0d04fSFariya Fatima struct mutex mutex; 182dad0d04fSFariya Fatima /* Mutex used between tx/rx threads */ 183dad0d04fSFariya Fatima struct mutex tx_rxlock; 184dad0d04fSFariya Fatima u8 endpoint; 185dad0d04fSFariya Fatima 186dad0d04fSFariya Fatima /* Channel/band related */ 187dad0d04fSFariya Fatima u8 band; 18809cfb41fSPrameela Rani Garnepudi u8 num_supp_bands; 189dad0d04fSFariya Fatima u8 channel_width; 190dad0d04fSFariya Fatima 191dad0d04fSFariya Fatima u16 rts_threshold; 192dad0d04fSFariya Fatima u16 bitrate_mask[2]; 193dad0d04fSFariya Fatima u32 fixedrate_mask[2]; 194dad0d04fSFariya Fatima 195dad0d04fSFariya Fatima u8 rf_reset; 196dad0d04fSFariya Fatima struct transmit_q_stats tx_stats; 197dad0d04fSFariya Fatima struct security_info secinfo; 198dad0d04fSFariya Fatima struct wmm_qinfo tx_qinfo[NUM_EDCA_QUEUES]; 199dad0d04fSFariya Fatima struct ieee80211_tx_queue_params edca_params[NUM_EDCA_QUEUES]; 200dad0d04fSFariya Fatima u8 mac_addr[IEEE80211_ADDR_LEN]; 201dad0d04fSFariya Fatima 202dad0d04fSFariya Fatima /* state related */ 203dad0d04fSFariya Fatima u32 fsm_state; 204dad0d04fSFariya Fatima bool init_done; 205dad0d04fSFariya Fatima u8 bb_rf_prog_count; 206dad0d04fSFariya Fatima bool iface_down; 207dad0d04fSFariya Fatima 208dad0d04fSFariya Fatima /* Generic */ 209dad0d04fSFariya Fatima u8 channel; 210dad0d04fSFariya Fatima u8 *rx_data_pkt; 211dad0d04fSFariya Fatima u8 mac_id; 212dad0d04fSFariya Fatima u8 radio_id; 213dad0d04fSFariya Fatima u16 rate_pwr[20]; 214dad0d04fSFariya Fatima u16 min_rate; 215dad0d04fSFariya Fatima 216dad0d04fSFariya Fatima /* WMM algo related */ 217dad0d04fSFariya Fatima u8 selected_qnum; 218dad0d04fSFariya Fatima u32 pkt_cnt; 219dad0d04fSFariya Fatima u8 min_weight; 220360accb0SJahnavi Meher 221686a2541SJahnavi Meher /* bgscan related */ 222686a2541SJahnavi Meher struct cqm_info cqm_info; 223686a2541SJahnavi Meher 224360accb0SJahnavi Meher bool hw_data_qs_blocked; 2259920322cSPrameela Rani Garnepudi u8 driver_mode; 226b78e91bcSPrameela Rani Garnepudi u8 coex_mode; 2279920322cSPrameela Rani Garnepudi u16 oper_mode; 2289920322cSPrameela Rani Garnepudi u8 lp_ps_handshake_mode; 2299920322cSPrameela Rani Garnepudi u8 ulp_ps_handshake_mode; 2309920322cSPrameela Rani Garnepudi u8 rf_power_val; 2319920322cSPrameela Rani Garnepudi u8 wlan_rf_power_mode; 2329920322cSPrameela Rani Garnepudi u8 obm_ant_sel_val; 2338b36de8cSPrameela Rani Garnepudi int tx_power; 2344edbcd1aSPrameela Rani Garnepudi u8 ant_in_use; 235dad0d04fSFariya Fatima }; 236dad0d04fSFariya Fatima 237a2ce952cSPrameela Rani Garnepudi enum host_intf { 238a2ce952cSPrameela Rani Garnepudi RSI_HOST_INTF_SDIO = 0, 239a2ce952cSPrameela Rani Garnepudi RSI_HOST_INTF_USB 240a2ce952cSPrameela Rani Garnepudi }; 241a2ce952cSPrameela Rani Garnepudi 24209cfb41fSPrameela Rani Garnepudi struct eepromrw_info { 24309cfb41fSPrameela Rani Garnepudi u32 offset; 24409cfb41fSPrameela Rani Garnepudi u32 length; 24509cfb41fSPrameela Rani Garnepudi u8 write; 24609cfb41fSPrameela Rani Garnepudi u16 eeprom_erase; 24709cfb41fSPrameela Rani Garnepudi u8 data[480]; 24809cfb41fSPrameela Rani Garnepudi }; 24909cfb41fSPrameela Rani Garnepudi 25009cfb41fSPrameela Rani Garnepudi struct eeprom_read { 25109cfb41fSPrameela Rani Garnepudi u16 length; 25209cfb41fSPrameela Rani Garnepudi u16 off_set; 25309cfb41fSPrameela Rani Garnepudi }; 25409cfb41fSPrameela Rani Garnepudi 255dad0d04fSFariya Fatima struct rsi_hw { 256dad0d04fSFariya Fatima struct rsi_common *priv; 257b78e91bcSPrameela Rani Garnepudi u8 device_model; 258dad0d04fSFariya Fatima struct ieee80211_hw *hw; 259dad0d04fSFariya Fatima struct ieee80211_vif *vifs[RSI_MAX_VIFS]; 260dad0d04fSFariya Fatima struct ieee80211_tx_queue_params edca_params[NUM_EDCA_QUEUES]; 26157fbcce3SJohannes Berg struct ieee80211_supported_band sbands[NUM_NL80211_BANDS]; 262dad0d04fSFariya Fatima 263dad0d04fSFariya Fatima struct device *device; 264dad0d04fSFariya Fatima u8 sc_nvifs; 265dad0d04fSFariya Fatima 266a2ce952cSPrameela Rani Garnepudi enum host_intf rsi_host_intf; 267b78e91bcSPrameela Rani Garnepudi u16 block_size; 2689920322cSPrameela Rani Garnepudi u32 usb_buffer_status_reg; 269dad0d04fSFariya Fatima #ifdef CONFIG_RSI_DEBUGFS 270dad0d04fSFariya Fatima struct rsi_debugfs *dfsentry; 271dad0d04fSFariya Fatima u8 num_debugfs_entries; 272dad0d04fSFariya Fatima #endif 273b78e91bcSPrameela Rani Garnepudi char *fw_file_name; 274b78e91bcSPrameela Rani Garnepudi struct timer_list bl_cmd_timer; 275b78e91bcSPrameela Rani Garnepudi bool blcmd_timer_expired; 276b78e91bcSPrameela Rani Garnepudi u32 flash_capacity; 27709cfb41fSPrameela Rani Garnepudi struct eepromrw_info eeprom; 27861d10842SPrameela Rani Garnepudi u8 dfs_region; 279dad0d04fSFariya Fatima void *rsi_dev; 280a2ce952cSPrameela Rani Garnepudi struct rsi_host_intf_ops *host_intf_ops; 281dad0d04fSFariya Fatima int (*check_hw_queue_status)(struct rsi_hw *adapter, u8 q_num); 282dad0d04fSFariya Fatima int (*rx_urb_submit)(struct rsi_hw *adapter); 283dad0d04fSFariya Fatima int (*determine_event_timeout)(struct rsi_hw *adapter); 284dad0d04fSFariya Fatima }; 285a2ce952cSPrameela Rani Garnepudi 286a2ce952cSPrameela Rani Garnepudi struct rsi_host_intf_ops { 287a2ce952cSPrameela Rani Garnepudi int (*read_pkt)(struct rsi_hw *adapter, u8 *pkt, u32 len); 288a2ce952cSPrameela Rani Garnepudi int (*write_pkt)(struct rsi_hw *adapter, u8 *pkt, u32 len); 289b78e91bcSPrameela Rani Garnepudi int (*master_access_msword)(struct rsi_hw *adapter, u16 ms_word); 290a2ce952cSPrameela Rani Garnepudi int (*read_reg_multiple)(struct rsi_hw *adapter, u32 addr, 291a2ce952cSPrameela Rani Garnepudi u8 *data, u16 count); 292a2ce952cSPrameela Rani Garnepudi int (*write_reg_multiple)(struct rsi_hw *adapter, u32 addr, 293a2ce952cSPrameela Rani Garnepudi u8 *data, u16 count); 294b97e9b94SPrameela Rani Garnepudi int (*master_reg_read)(struct rsi_hw *adapter, u32 addr, 295b97e9b94SPrameela Rani Garnepudi u32 *read_buf, u16 size); 296b97e9b94SPrameela Rani Garnepudi int (*master_reg_write)(struct rsi_hw *adapter, 297b97e9b94SPrameela Rani Garnepudi unsigned long addr, unsigned long data, 298b97e9b94SPrameela Rani Garnepudi u16 size); 299b97e9b94SPrameela Rani Garnepudi int (*load_data_master_write)(struct rsi_hw *adapter, u32 addr, 300b97e9b94SPrameela Rani Garnepudi u32 instructions_size, u16 block_size, 301b97e9b94SPrameela Rani Garnepudi u8 *fw); 302a2ce952cSPrameela Rani Garnepudi }; 303dad0d04fSFariya Fatima #endif 304