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 34dad0d04fSFariya Fatima #define FSM_CARD_NOT_READY 0 35dad0d04fSFariya Fatima #define FSM_BOOT_PARAMS_SENT 1 36dad0d04fSFariya Fatima #define FSM_EEPROM_READ_MAC_ADDR 2 37dad0d04fSFariya Fatima #define FSM_RESET_MAC_SENT 3 38dad0d04fSFariya Fatima #define FSM_RADIO_CAPS_SENT 4 39dad0d04fSFariya Fatima #define FSM_BB_RF_PROG_SENT 5 40dad0d04fSFariya Fatima #define FSM_MAC_INIT_DONE 6 41dad0d04fSFariya Fatima 42dad0d04fSFariya Fatima extern u32 rsi_zone_enabled; 435fe1b76aSJoe Perches extern __printf(2, 3) void rsi_dbg(u32 zone, const char *fmt, ...); 44dad0d04fSFariya Fatima 45dad0d04fSFariya Fatima #define RSI_MAX_VIFS 1 46dad0d04fSFariya Fatima #define NUM_EDCA_QUEUES 4 47dad0d04fSFariya Fatima #define IEEE80211_ADDR_LEN 6 48dad0d04fSFariya Fatima #define FRAME_DESC_SZ 16 49dad0d04fSFariya Fatima #define MIN_802_11_HDR_LEN 24 50dad0d04fSFariya Fatima 51dad0d04fSFariya Fatima #define DATA_QUEUE_WATER_MARK 400 52dad0d04fSFariya Fatima #define MIN_DATA_QUEUE_WATER_MARK 300 53dad0d04fSFariya Fatima #define MULTICAST_WATER_MARK 200 54dad0d04fSFariya Fatima #define MAC_80211_HDR_FRAME_CONTROL 0 55dad0d04fSFariya Fatima #define WME_NUM_AC 4 56dad0d04fSFariya Fatima #define NUM_SOFT_QUEUES 5 57dad0d04fSFariya Fatima #define MAX_HW_QUEUES 8 58dad0d04fSFariya Fatima #define INVALID_QUEUE 0xff 59dad0d04fSFariya Fatima #define MAX_CONTINUOUS_VO_PKTS 8 60dad0d04fSFariya Fatima #define MAX_CONTINUOUS_VI_PKTS 4 61dad0d04fSFariya Fatima 62dad0d04fSFariya Fatima /* Queue information */ 63dad0d04fSFariya Fatima #define RSI_WIFI_MGMT_Q 0x4 64dad0d04fSFariya Fatima #define RSI_WIFI_DATA_Q 0x5 65dad0d04fSFariya Fatima #define IEEE80211_MGMT_FRAME 0x00 66dad0d04fSFariya Fatima #define IEEE80211_CTL_FRAME 0x04 67dad0d04fSFariya Fatima 68dad0d04fSFariya Fatima #define IEEE80211_QOS_TID 0x0f 69dad0d04fSFariya Fatima #define IEEE80211_NONQOS_TID 16 70dad0d04fSFariya Fatima 71dad0d04fSFariya Fatima #define MAX_DEBUGFS_ENTRIES 4 72dad0d04fSFariya Fatima 73dad0d04fSFariya Fatima #define TID_TO_WME_AC(_tid) ( \ 74dad0d04fSFariya Fatima ((_tid) == 0 || (_tid) == 3) ? BE_Q : \ 75dad0d04fSFariya Fatima ((_tid) < 3) ? BK_Q : \ 76dad0d04fSFariya Fatima ((_tid) < 6) ? VI_Q : \ 77dad0d04fSFariya Fatima VO_Q) 78dad0d04fSFariya Fatima 79dad0d04fSFariya Fatima #define WME_AC(_q) ( \ 80dad0d04fSFariya Fatima ((_q) == BK_Q) ? IEEE80211_AC_BK : \ 81dad0d04fSFariya Fatima ((_q) == BE_Q) ? IEEE80211_AC_BE : \ 82dad0d04fSFariya Fatima ((_q) == VI_Q) ? IEEE80211_AC_VI : \ 83dad0d04fSFariya Fatima IEEE80211_AC_VO) 84dad0d04fSFariya Fatima 85dad0d04fSFariya Fatima struct version_info { 86dad0d04fSFariya Fatima u16 major; 87dad0d04fSFariya Fatima u16 minor; 88dad0d04fSFariya Fatima u16 release_num; 89dad0d04fSFariya Fatima u16 patch_num; 90dad0d04fSFariya Fatima } __packed; 91dad0d04fSFariya Fatima 92dad0d04fSFariya Fatima struct skb_info { 93dad0d04fSFariya Fatima s8 rssi; 94dad0d04fSFariya Fatima u32 flags; 95dad0d04fSFariya Fatima u16 channel; 96dad0d04fSFariya Fatima s8 tid; 97dad0d04fSFariya Fatima s8 sta_id; 98dad0d04fSFariya Fatima }; 99dad0d04fSFariya Fatima 100dad0d04fSFariya Fatima enum edca_queue { 101dad0d04fSFariya Fatima BK_Q, 102dad0d04fSFariya Fatima BE_Q, 103dad0d04fSFariya Fatima VI_Q, 104dad0d04fSFariya Fatima VO_Q, 105dad0d04fSFariya Fatima MGMT_SOFT_Q 106dad0d04fSFariya Fatima }; 107dad0d04fSFariya Fatima 108dad0d04fSFariya Fatima struct security_info { 109dad0d04fSFariya Fatima bool security_enable; 110dad0d04fSFariya Fatima u32 ptk_cipher; 111dad0d04fSFariya Fatima u32 gtk_cipher; 112dad0d04fSFariya Fatima }; 113dad0d04fSFariya Fatima 114dad0d04fSFariya Fatima struct wmm_qinfo { 115dad0d04fSFariya Fatima s32 weight; 116dad0d04fSFariya Fatima s32 wme_params; 117dad0d04fSFariya Fatima s32 pkt_contended; 118dad0d04fSFariya Fatima }; 119dad0d04fSFariya Fatima 120dad0d04fSFariya Fatima struct transmit_q_stats { 121dad0d04fSFariya Fatima u32 total_tx_pkt_send[NUM_EDCA_QUEUES + 1]; 122dad0d04fSFariya Fatima u32 total_tx_pkt_freed[NUM_EDCA_QUEUES + 1]; 123dad0d04fSFariya Fatima }; 124dad0d04fSFariya Fatima 125dad0d04fSFariya Fatima struct vif_priv { 126dad0d04fSFariya Fatima bool is_ht; 127dad0d04fSFariya Fatima bool sgi; 128dad0d04fSFariya Fatima u16 seq_start; 129dad0d04fSFariya Fatima }; 130dad0d04fSFariya Fatima 131dad0d04fSFariya Fatima struct rsi_event { 132dad0d04fSFariya Fatima atomic_t event_condition; 133dad0d04fSFariya Fatima wait_queue_head_t event_queue; 134dad0d04fSFariya Fatima }; 135dad0d04fSFariya Fatima 136dad0d04fSFariya Fatima struct rsi_thread { 137dad0d04fSFariya Fatima void (*thread_function)(void *); 138dad0d04fSFariya Fatima struct completion completion; 139dad0d04fSFariya Fatima struct task_struct *task; 140dad0d04fSFariya Fatima struct rsi_event event; 141dad0d04fSFariya Fatima atomic_t thread_done; 142dad0d04fSFariya Fatima }; 143dad0d04fSFariya Fatima 144dad0d04fSFariya Fatima struct rsi_hw; 145dad0d04fSFariya Fatima 146dad0d04fSFariya Fatima struct rsi_common { 147dad0d04fSFariya Fatima struct rsi_hw *priv; 148dad0d04fSFariya Fatima struct vif_priv vif_info[RSI_MAX_VIFS]; 149dad0d04fSFariya Fatima 150dad0d04fSFariya Fatima bool mgmt_q_block; 151dad0d04fSFariya Fatima struct version_info driver_ver; 152dad0d04fSFariya Fatima struct version_info fw_ver; 153dad0d04fSFariya Fatima 154dad0d04fSFariya Fatima struct rsi_thread tx_thread; 155dad0d04fSFariya Fatima struct sk_buff_head tx_queue[NUM_EDCA_QUEUES + 1]; 156dad0d04fSFariya Fatima /* Mutex declaration */ 157dad0d04fSFariya Fatima struct mutex mutex; 158dad0d04fSFariya Fatima /* Mutex used between tx/rx threads */ 159dad0d04fSFariya Fatima struct mutex tx_rxlock; 160dad0d04fSFariya Fatima u8 endpoint; 161dad0d04fSFariya Fatima 162dad0d04fSFariya Fatima /* Channel/band related */ 163dad0d04fSFariya Fatima u8 band; 164dad0d04fSFariya Fatima u8 channel_width; 165dad0d04fSFariya Fatima 166dad0d04fSFariya Fatima u16 rts_threshold; 167dad0d04fSFariya Fatima u16 bitrate_mask[2]; 168dad0d04fSFariya Fatima u32 fixedrate_mask[2]; 169dad0d04fSFariya Fatima 170dad0d04fSFariya Fatima u8 rf_reset; 171dad0d04fSFariya Fatima struct transmit_q_stats tx_stats; 172dad0d04fSFariya Fatima struct security_info secinfo; 173dad0d04fSFariya Fatima struct wmm_qinfo tx_qinfo[NUM_EDCA_QUEUES]; 174dad0d04fSFariya Fatima struct ieee80211_tx_queue_params edca_params[NUM_EDCA_QUEUES]; 175dad0d04fSFariya Fatima u8 mac_addr[IEEE80211_ADDR_LEN]; 176dad0d04fSFariya Fatima 177dad0d04fSFariya Fatima /* state related */ 178dad0d04fSFariya Fatima u32 fsm_state; 179dad0d04fSFariya Fatima bool init_done; 180dad0d04fSFariya Fatima u8 bb_rf_prog_count; 181dad0d04fSFariya Fatima bool iface_down; 182dad0d04fSFariya Fatima 183dad0d04fSFariya Fatima /* Generic */ 184dad0d04fSFariya Fatima u8 channel; 185dad0d04fSFariya Fatima u8 *rx_data_pkt; 186dad0d04fSFariya Fatima u8 mac_id; 187dad0d04fSFariya Fatima u8 radio_id; 188dad0d04fSFariya Fatima u16 rate_pwr[20]; 189dad0d04fSFariya Fatima u16 min_rate; 190dad0d04fSFariya Fatima 191dad0d04fSFariya Fatima /* WMM algo related */ 192dad0d04fSFariya Fatima u8 selected_qnum; 193dad0d04fSFariya Fatima u32 pkt_cnt; 194dad0d04fSFariya Fatima u8 min_weight; 195dad0d04fSFariya Fatima }; 196dad0d04fSFariya Fatima 197dad0d04fSFariya Fatima struct rsi_hw { 198dad0d04fSFariya Fatima struct rsi_common *priv; 199dad0d04fSFariya Fatima struct ieee80211_hw *hw; 200dad0d04fSFariya Fatima struct ieee80211_vif *vifs[RSI_MAX_VIFS]; 201dad0d04fSFariya Fatima struct ieee80211_tx_queue_params edca_params[NUM_EDCA_QUEUES]; 202dad0d04fSFariya Fatima struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS]; 203dad0d04fSFariya Fatima 204dad0d04fSFariya Fatima struct device *device; 205dad0d04fSFariya Fatima u8 sc_nvifs; 206dad0d04fSFariya Fatima 207dad0d04fSFariya Fatima #ifdef CONFIG_RSI_DEBUGFS 208dad0d04fSFariya Fatima struct rsi_debugfs *dfsentry; 209dad0d04fSFariya Fatima u8 num_debugfs_entries; 210dad0d04fSFariya Fatima #endif 211dad0d04fSFariya Fatima void *rsi_dev; 212dad0d04fSFariya Fatima int (*host_intf_read_pkt)(struct rsi_hw *adapter, u8 *pkt, u32 len); 213dad0d04fSFariya Fatima int (*host_intf_write_pkt)(struct rsi_hw *adapter, u8 *pkt, u32 len); 214dad0d04fSFariya Fatima int (*check_hw_queue_status)(struct rsi_hw *adapter, u8 q_num); 215dad0d04fSFariya Fatima int (*rx_urb_submit)(struct rsi_hw *adapter); 216dad0d04fSFariya Fatima int (*determine_event_timeout)(struct rsi_hw *adapter); 217dad0d04fSFariya Fatima }; 218dad0d04fSFariya Fatima #endif 219