| 
									
										
										
										
											2014-03-16 03:47:02 +05:30
										 |  |  | /**
 | 
					
						
							|  |  |  |  * 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>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #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         */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define FSM_CARD_NOT_READY              0
 | 
					
						
							|  |  |  | #define FSM_BOOT_PARAMS_SENT            1
 | 
					
						
							|  |  |  | #define FSM_EEPROM_READ_MAC_ADDR        2
 | 
					
						
							|  |  |  | #define FSM_RESET_MAC_SENT              3
 | 
					
						
							|  |  |  | #define FSM_RADIO_CAPS_SENT             4
 | 
					
						
							|  |  |  | #define FSM_BB_RF_PROG_SENT             5
 | 
					
						
							|  |  |  | #define FSM_MAC_INIT_DONE               6
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern u32 rsi_zone_enabled; | 
					
						
							| 
									
										
										
										
											2014-03-18 17:59:47 -07:00
										 |  |  | extern __printf(2, 3) void rsi_dbg(u32 zone, const char *fmt, ...); | 
					
						
							| 
									
										
										
										
											2014-03-16 03:47:02 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  | #define RSI_MAX_VIFS                    1
 | 
					
						
							|  |  |  | #define NUM_EDCA_QUEUES                 4
 | 
					
						
							|  |  |  | #define IEEE80211_ADDR_LEN              6
 | 
					
						
							|  |  |  | #define FRAME_DESC_SZ                   16
 | 
					
						
							|  |  |  | #define MIN_802_11_HDR_LEN              24
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #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
 | 
					
						
							|  |  |  | #define NUM_SOFT_QUEUES                 5
 | 
					
						
							|  |  |  | #define MAX_HW_QUEUES                   8
 | 
					
						
							|  |  |  | #define INVALID_QUEUE                   0xff
 | 
					
						
							|  |  |  | #define MAX_CONTINUOUS_VO_PKTS          8
 | 
					
						
							|  |  |  | #define MAX_CONTINUOUS_VI_PKTS          4
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Queue information */ | 
					
						
							|  |  |  | #define RSI_WIFI_MGMT_Q                 0x4
 | 
					
						
							|  |  |  | #define RSI_WIFI_DATA_Q                 0x5
 | 
					
						
							|  |  |  | #define IEEE80211_MGMT_FRAME            0x00
 | 
					
						
							|  |  |  | #define IEEE80211_CTL_FRAME             0x04
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #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) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct version_info { | 
					
						
							|  |  |  | 	u16 major; | 
					
						
							|  |  |  | 	u16 minor; | 
					
						
							|  |  |  | 	u16 release_num; | 
					
						
							|  |  |  | 	u16 patch_num; | 
					
						
							|  |  |  | } __packed; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct skb_info { | 
					
						
							|  |  |  | 	s8 rssi; | 
					
						
							|  |  |  | 	u32 flags; | 
					
						
							|  |  |  | 	u16 channel; | 
					
						
							|  |  |  | 	s8 tid; | 
					
						
							|  |  |  | 	s8 sta_id; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | enum edca_queue { | 
					
						
							|  |  |  | 	BK_Q, | 
					
						
							|  |  |  | 	BE_Q, | 
					
						
							|  |  |  | 	VI_Q, | 
					
						
							|  |  |  | 	VO_Q, | 
					
						
							|  |  |  | 	MGMT_SOFT_Q | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct security_info { | 
					
						
							|  |  |  | 	bool security_enable; | 
					
						
							|  |  |  | 	u32 ptk_cipher; | 
					
						
							|  |  |  | 	u32 gtk_cipher; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct wmm_qinfo { | 
					
						
							|  |  |  | 	s32 weight; | 
					
						
							|  |  |  | 	s32 wme_params; | 
					
						
							|  |  |  | 	s32 pkt_contended; | 
					
						
							| 
									
										
										
										
											2014-06-16 19:45:03 +05:30
										 |  |  | 	s32 txop; | 
					
						
							| 
									
										
										
										
											2014-03-16 03:47:02 +05:30
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct transmit_q_stats { | 
					
						
							|  |  |  | 	u32 total_tx_pkt_send[NUM_EDCA_QUEUES + 1]; | 
					
						
							|  |  |  | 	u32 total_tx_pkt_freed[NUM_EDCA_QUEUES + 1]; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct vif_priv { | 
					
						
							|  |  |  | 	bool is_ht; | 
					
						
							|  |  |  | 	bool sgi; | 
					
						
							|  |  |  | 	u16 seq_start; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-16 19:46:48 +05:30
										 |  |  | struct cqm_info { | 
					
						
							|  |  |  | 	s8 last_cqm_event_rssi; | 
					
						
							|  |  |  | 	int rssi_thold; | 
					
						
							|  |  |  | 	u32 rssi_hyst; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-16 03:47:02 +05:30
										 |  |  | struct rsi_hw; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct rsi_common { | 
					
						
							|  |  |  | 	struct rsi_hw *priv; | 
					
						
							|  |  |  | 	struct vif_priv vif_info[RSI_MAX_VIFS]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	bool mgmt_q_block; | 
					
						
							|  |  |  | 	struct version_info driver_ver; | 
					
						
							|  |  |  | 	struct version_info fw_ver; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	struct rsi_thread tx_thread; | 
					
						
							|  |  |  | 	struct sk_buff_head tx_queue[NUM_EDCA_QUEUES + 1]; | 
					
						
							|  |  |  | 	/* Mutex declaration */ | 
					
						
							|  |  |  | 	struct mutex mutex; | 
					
						
							|  |  |  | 	/* Mutex used between tx/rx threads */ | 
					
						
							|  |  |  | 	struct mutex tx_rxlock; | 
					
						
							|  |  |  | 	u8 endpoint; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Channel/band related */ | 
					
						
							|  |  |  | 	u8 band; | 
					
						
							|  |  |  | 	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; | 
					
						
							| 
									
										
										
										
											2014-06-16 19:45:03 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-16 19:46:48 +05:30
										 |  |  | 	/* bgscan related */ | 
					
						
							|  |  |  | 	struct cqm_info cqm_info; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-16 19:45:03 +05:30
										 |  |  | 	bool hw_data_qs_blocked; | 
					
						
							| 
									
										
										
										
											2014-03-16 03:47:02 +05:30
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct rsi_hw { | 
					
						
							|  |  |  | 	struct rsi_common *priv; | 
					
						
							|  |  |  | 	struct ieee80211_hw *hw; | 
					
						
							|  |  |  | 	struct ieee80211_vif *vifs[RSI_MAX_VIFS]; | 
					
						
							|  |  |  | 	struct ieee80211_tx_queue_params edca_params[NUM_EDCA_QUEUES]; | 
					
						
							|  |  |  | 	struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	struct device *device; | 
					
						
							|  |  |  | 	u8 sc_nvifs; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef CONFIG_RSI_DEBUGFS
 | 
					
						
							|  |  |  | 	struct rsi_debugfs *dfsentry; | 
					
						
							|  |  |  | 	u8 num_debugfs_entries; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 	void *rsi_dev; | 
					
						
							|  |  |  | 	int (*host_intf_read_pkt)(struct rsi_hw *adapter, u8 *pkt, u32 len); | 
					
						
							|  |  |  | 	int (*host_intf_write_pkt)(struct rsi_hw *adapter, u8 *pkt, u32 len); | 
					
						
							|  |  |  | 	int (*check_hw_queue_status)(struct rsi_hw *adapter, u8 q_num); | 
					
						
							|  |  |  | 	int (*rx_urb_submit)(struct rsi_hw *adapter); | 
					
						
							|  |  |  | 	int (*determine_event_timeout)(struct rsi_hw *adapter); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | #endif
 |