rsi_main.h 8.67 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/**
 * Copyright (c) 2014 Redpine Signals 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.
 */

#ifndef __RSI_MAIN_H__
#define __RSI_MAIN_H__

#include <linux/string.h>
#include <linux/skbuff.h>
#include <net/mac80211.h>
23
#include <net/rsi_91x.h>
24

25 26 27 28 29 30 31
struct rsi_sta {
	struct ieee80211_sta *sta;
	s16 sta_id;
	u16 seq_start[IEEE80211_NUM_TIDS];
	bool start_tx_aggr[IEEE80211_NUM_TIDS];
};

32 33 34 35
struct rsi_hw;

#include "rsi_ps.h"

36 37 38 39 40 41 42 43 44 45
#define ERR_ZONE                        BIT(0)  /* For Error Msgs             */
#define INFO_ZONE                       BIT(1)  /* For General Status Msgs    */
#define INIT_ZONE                       BIT(2)  /* For Driver Init Seq Msgs   */
#define MGMT_TX_ZONE                    BIT(3)  /* For TX Mgmt Path Msgs      */
#define MGMT_RX_ZONE                    BIT(4)  /* For RX Mgmt Path Msgs      */
#define DATA_TX_ZONE                    BIT(5)  /* For TX Data Path Msgs      */
#define DATA_RX_ZONE                    BIT(6)  /* For RX Data Path Msgs      */
#define FSM_ZONE                        BIT(7)  /* For State Machine Msgs     */
#define ISR_ZONE                        BIT(8)  /* For Interrupt Msgs         */

46
enum RSI_FSM_STATES {
47
	FSM_FW_NOT_LOADED,
48
	FSM_CARD_NOT_READY,
49
	FSM_COMMON_DEV_PARAMS_SENT,
50 51
	FSM_BOOT_PARAMS_SENT,
	FSM_EEPROM_READ_MAC_ADDR,
52
	FSM_EEPROM_READ_RF_TYPE,
53 54 55
	FSM_RESET_MAC_SENT,
	FSM_RADIO_CAPS_SENT,
	FSM_BB_RF_PROG_SENT,
56 57 58
	FSM_MAC_INIT_DONE,

	NUM_FSM_STATES
59
};
60 61

extern u32 rsi_zone_enabled;
62
extern __printf(2, 3) void rsi_dbg(u32 zone, const char *fmt, ...);
63

64
#define RSI_MAX_VIFS                    3
65 66 67 68
#define NUM_EDCA_QUEUES                 4
#define IEEE80211_ADDR_LEN              6
#define FRAME_DESC_SZ                   16
#define MIN_802_11_HDR_LEN              24
69
#define RSI_DEF_KEEPALIVE               90
70 71
#define RSI_WOW_KEEPALIVE                5
#define RSI_BCN_MISS_THRESHOLD           24
72 73 74 75 76 77

#define DATA_QUEUE_WATER_MARK           400
#define MIN_DATA_QUEUE_WATER_MARK       300
#define MULTICAST_WATER_MARK            200
#define MAC_80211_HDR_FRAME_CONTROL     0
#define WME_NUM_AC                      4
78
#define NUM_SOFT_QUEUES                 6
79
#define MAX_HW_QUEUES                   12
80 81 82 83
#define INVALID_QUEUE                   0xff
#define MAX_CONTINUOUS_VO_PKTS          8
#define MAX_CONTINUOUS_VI_PKTS          4

84 85 86 87 88
/* Hardware queue info */
#define BROADCAST_HW_Q			9
#define MGMT_HW_Q			10
#define BEACON_HW_Q			11

89 90 91
#define IEEE80211_MGMT_FRAME            0x00
#define IEEE80211_CTL_FRAME             0x04

92
#define RSI_MAX_ASSOC_STAS		32
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
#define IEEE80211_QOS_TID               0x0f
#define IEEE80211_NONQOS_TID            16

#define MAX_DEBUGFS_ENTRIES             4

#define TID_TO_WME_AC(_tid) (      \
	((_tid) == 0 || (_tid) == 3) ? BE_Q : \
	((_tid) < 3) ? BK_Q : \
	((_tid) < 6) ? VI_Q : \
	VO_Q)

#define WME_AC(_q) (    \
	((_q) == BK_Q) ? IEEE80211_AC_BK : \
	((_q) == BE_Q) ? IEEE80211_AC_BE : \
	((_q) == VI_Q) ? IEEE80211_AC_VI : \
	IEEE80211_AC_VO)

110 111 112 113
/* WoWLAN flags */
#define RSI_WOW_ENABLED			BIT(0)
#define RSI_WOW_NO_CONNECTION		BIT(1)

114 115
#define RSI_DEV_9113		1

116 117 118
struct version_info {
	u16 major;
	u16 minor;
119 120 121 122 123 124 125
	u8 release_num;
	u8 patch_num;
	union {
		struct {
			u8 fw_ver[8];
		} info;
	} ver;
126 127 128 129 130 131 132 133
} __packed;

struct skb_info {
	s8 rssi;
	u32 flags;
	u16 channel;
	s8 tid;
	s8 sta_id;
134
	u8 internal_hdr_size;
135 136
	struct ieee80211_vif *vif;
	u8 vap_id;
137 138 139 140 141 142 143
};

enum edca_queue {
	BK_Q,
	BE_Q,
	VI_Q,
	VO_Q,
144 145
	MGMT_SOFT_Q,
	MGMT_BEACON_Q
146 147 148 149 150 151 152 153 154 155 156 157
};

struct security_info {
	bool security_enable;
	u32 ptk_cipher;
	u32 gtk_cipher;
};

struct wmm_qinfo {
	s32 weight;
	s32 wme_params;
	s32 pkt_contended;
158
	s32 txop;
159 160 161
};

struct transmit_q_stats {
162 163
	u32 total_tx_pkt_send[NUM_EDCA_QUEUES + 2];
	u32 total_tx_pkt_freed[NUM_EDCA_QUEUES + 2];
164 165 166 167 168 169
};

struct vif_priv {
	bool is_ht;
	bool sgi;
	u16 seq_start;
170
	int vap_id;
171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
};

struct rsi_event {
	atomic_t event_condition;
	wait_queue_head_t event_queue;
};

struct rsi_thread {
	void (*thread_function)(void *);
	struct completion completion;
	struct task_struct *task;
	struct rsi_event event;
	atomic_t thread_done;
};

186 187 188 189 190 191
struct cqm_info {
	s8 last_cqm_event_rssi;
	int rssi_thold;
	u32 rssi_hyst;
};

192 193 194 195 196 197
struct xtended_desc {
	u8 confirm_frame_type;
	u8 retry_cnt;
	u16 reserved;
};

198 199 200 201 202 203 204
enum rsi_dfs_regions {
	RSI_REGION_FCC = 0,
	RSI_REGION_ETSI,
	RSI_REGION_TELEC,
	RSI_REGION_WORLD
};

205 206 207 208
struct rsi_common {
	struct rsi_hw *priv;
	struct vif_priv vif_info[RSI_MAX_VIFS];

209
	void *coex_cb;
210
	bool mgmt_q_block;
211
	struct version_info lmac_ver;
212 213

	struct rsi_thread tx_thread;
214
	struct sk_buff_head tx_queue[NUM_EDCA_QUEUES + 2];
215
	struct completion wlan_init_completion;
216 217
	/* Mutex declaration */
	struct mutex mutex;
218 219
	/* Mutex used for tx thread */
	struct mutex tx_lock;
220 221
	/* Mutex used for rx thread */
	struct mutex rx_lock;
222 223 224 225
	u8 endpoint;

	/* Channel/band related */
	u8 band;
226
	u8 num_supp_bands;
227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257
	u8 channel_width;

	u16 rts_threshold;
	u16 bitrate_mask[2];
	u32 fixedrate_mask[2];

	u8 rf_reset;
	struct transmit_q_stats tx_stats;
	struct security_info secinfo;
	struct wmm_qinfo tx_qinfo[NUM_EDCA_QUEUES];
	struct ieee80211_tx_queue_params edca_params[NUM_EDCA_QUEUES];
	u8 mac_addr[IEEE80211_ADDR_LEN];

	/* state related */
	u32 fsm_state;
	bool init_done;
	u8 bb_rf_prog_count;
	bool iface_down;

	/* Generic */
	u8 channel;
	u8 *rx_data_pkt;
	u8 mac_id;
	u8 radio_id;
	u16 rate_pwr[20];
	u16 min_rate;

	/* WMM algo related */
	u8 selected_qnum;
	u32 pkt_cnt;
	u8 min_weight;
258

259 260 261
	/* bgscan related */
	struct cqm_info cqm_info;

262
	bool hw_data_qs_blocked;
263
	u8 driver_mode;
264
	u8 coex_mode;
265 266 267
	u16 oper_mode;
	u8 lp_ps_handshake_mode;
	u8 ulp_ps_handshake_mode;
268
	u8 uapsd_bitmap;
269 270 271
	u8 rf_power_val;
	u8 wlan_rf_power_mode;
	u8 obm_ant_sel_val;
272
	int tx_power;
273
	u8 ant_in_use;
274 275
	/* Mutex used for writing packet to bus */
	struct mutex tx_bus_mutex;
276 277
	bool hibernate_resume;
	bool reinit_hw;
278
	u8 wow_flags;
279 280
	u16 beacon_interval;
	u8 dtim_cnt;
281 282

	/* AP mode parameters */
283 284
	u8 beacon_enabled;
	u16 beacon_cnt;
285 286
	struct rsi_sta stations[RSI_MAX_ASSOC_STAS + 1];
	int num_stations;
287
	int max_stations;
288
	struct ieee80211_key_conf *key;
289 290 291

	/* Wi-Fi direct mode related */
	bool p2p_enabled;
292 293
	struct timer_list roc_timer;
	struct ieee80211_vif *roc_vif;
294 295
};

296 297 298 299 300 301 302 303 304 305 306 307 308
struct eepromrw_info {
	u32 offset;
	u32 length;
	u8  write;
	u16 eeprom_erase;
	u8 data[480];
};

struct eeprom_read {
	u16 length;
	u16 off_set;
};

309 310
struct rsi_hw {
	struct rsi_common *priv;
311
	u8 device_model;
312 313 314
	struct ieee80211_hw *hw;
	struct ieee80211_vif *vifs[RSI_MAX_VIFS];
	struct ieee80211_tx_queue_params edca_params[NUM_EDCA_QUEUES];
315
	struct ieee80211_supported_band sbands[NUM_NL80211_BANDS];
316 317 318 319

	struct device *device;
	u8 sc_nvifs;

320
	enum rsi_host_intf rsi_host_intf;
321
	u16 block_size;
322 323 324
	enum ps_state ps_state;
	struct rsi_ps_info ps_info;
	spinlock_t ps_lock; /*To protect power save config*/
325
	u32 usb_buffer_status_reg;
326 327 328 329
#ifdef CONFIG_RSI_DEBUGFS
	struct rsi_debugfs *dfsentry;
	u8 num_debugfs_entries;
#endif
330 331 332 333
	char *fw_file_name;
	struct timer_list bl_cmd_timer;
	bool blcmd_timer_expired;
	u32 flash_capacity;
334
	struct eepromrw_info eeprom;
335
	u32 interrupt_status;
336
	u8 dfs_region;
337
	char country[2];
338
	void *rsi_dev;
339
	struct rsi_host_intf_ops *host_intf_ops;
340
	int (*check_hw_queue_status)(struct rsi_hw *adapter, u8 q_num);
341
	int (*rx_urb_submit)(struct rsi_hw *adapter, u8 ep_num);
342 343
	int (*determine_event_timeout)(struct rsi_hw *adapter);
};
344

345 346
void rsi_print_version(struct rsi_common *common);

347 348 349
struct rsi_host_intf_ops {
	int (*read_pkt)(struct rsi_hw *adapter, u8 *pkt, u32 len);
	int (*write_pkt)(struct rsi_hw *adapter, u8 *pkt, u32 len);
350
	int (*master_access_msword)(struct rsi_hw *adapter, u16 ms_word);
351 352 353 354
	int (*read_reg_multiple)(struct rsi_hw *adapter, u32 addr,
				 u8 *data, u16 count);
	int (*write_reg_multiple)(struct rsi_hw *adapter, u32 addr,
				  u8 *data, u16 count);
355 356 357 358 359 360 361 362
	int (*master_reg_read)(struct rsi_hw *adapter, u32 addr,
			       u32 *read_buf, u16 size);
	int (*master_reg_write)(struct rsi_hw *adapter,
				unsigned long addr, unsigned long data,
				u16 size);
	int (*load_data_master_write)(struct rsi_hw *adapter, u32 addr,
				      u32 instructions_size, u16 block_size,
				      u8 *fw);
363
	int (*reinit_device)(struct rsi_hw *adapter);
364
};
365 366 367

enum rsi_host_intf rsi_get_host_intf(void *priv);

368
#endif