| Randy Dunlap | 8973a6e | 2011-04-26 15:25:29 -0700 | [diff] [blame] | 1 | /* | 
 | 2 |  * This file contains definitions and data structures specific | 
 | 3 |  * to Marvell 802.11 NIC. It contains the Device Information | 
 | 4 |  * structure struct lbs_private.. | 
 | 5 |  */ | 
| Holger Schurig | 1007832 | 2007-11-15 18:05:47 -0500 | [diff] [blame] | 6 | #ifndef _LBS_DEV_H_ | 
 | 7 | #define _LBS_DEV_H_ | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 8 |  | 
| Kiran Divekar | e86dc1c | 2010-06-14 22:01:26 +0530 | [diff] [blame] | 9 | #include "defs.h" | 
 | 10 | #include "host.h" | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 11 |  | 
| Stefani Seibold | 4546548 | 2009-12-21 14:37:26 -0800 | [diff] [blame] | 12 | #include <linux/kfifo.h> | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 13 |  | 
| Randy Dunlap | 8973a6e | 2011-04-26 15:25:29 -0700 | [diff] [blame] | 14 | /* sleep_params */ | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 15 | struct sleep_params { | 
| David Woodhouse | 3fbe104 | 2007-12-17 23:48:31 -0500 | [diff] [blame] | 16 | 	uint16_t sp_error; | 
 | 17 | 	uint16_t sp_offset; | 
 | 18 | 	uint16_t sp_stabletime; | 
 | 19 | 	uint8_t  sp_calcontrol; | 
 | 20 | 	uint8_t  sp_extsleepclk; | 
 | 21 | 	uint16_t sp_reserved; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 22 | }; | 
 | 23 |  | 
| Daniel Drake | 49fee69 | 2011-07-21 20:43:17 +0100 | [diff] [blame] | 24 | /* Mesh statistics */ | 
 | 25 | struct lbs_mesh_stats { | 
 | 26 | 	u32	fwd_bcast_cnt;		/* Fwd: Broadcast counter */ | 
 | 27 | 	u32	fwd_unicast_cnt;	/* Fwd: Unicast counter */ | 
 | 28 | 	u32	fwd_drop_ttl;		/* Fwd: TTL zero */ | 
 | 29 | 	u32	fwd_drop_rbt;		/* Fwd: Recently Broadcasted */ | 
 | 30 | 	u32	fwd_drop_noroute; 	/* Fwd: No route to Destination */ | 
 | 31 | 	u32	fwd_drop_nobuf;		/* Fwd: Run out of internal buffers */ | 
 | 32 | 	u32	drop_blind;		/* Rx:  Dropped by blinding table */ | 
 | 33 | 	u32	tx_failed_cnt;		/* Tx:  Failed transmissions */ | 
 | 34 | }; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 35 |  | 
| Randy Dunlap | 8973a6e | 2011-04-26 15:25:29 -0700 | [diff] [blame] | 36 | /* Private structure for the MV device */ | 
| Holger Schurig | 69f9032 | 2007-11-23 15:43:44 +0100 | [diff] [blame] | 37 | struct lbs_private { | 
| Holger Schurig | 5e04769 | 2009-10-22 15:30:49 +0200 | [diff] [blame] | 38 |  | 
 | 39 | 	/* Basic networking */ | 
 | 40 | 	struct net_device *dev; | 
 | 41 | 	u32 connect_status; | 
| Holger Schurig | 5e04769 | 2009-10-22 15:30:49 +0200 | [diff] [blame] | 42 | 	struct work_struct mcast_work; | 
 | 43 | 	u32 nr_of_multicastmacaddr; | 
 | 44 | 	u8 multicastlist[MRVDRV_MAX_MULTICAST_LIST_SIZE][ETH_ALEN]; | 
 | 45 |  | 
 | 46 | 	/* CFG80211 */ | 
| Holger Schurig | ff9fc79 | 2009-10-06 16:31:54 +0200 | [diff] [blame] | 47 | 	struct wireless_dev *wdev; | 
| Daniel Mack | 7371400 | 2010-03-29 17:14:18 +0200 | [diff] [blame] | 48 | 	bool wiphy_registered; | 
| Kiran Divekar | e86dc1c | 2010-06-14 22:01:26 +0530 | [diff] [blame] | 49 | 	struct cfg80211_scan_request *scan_req; | 
 | 50 | 	u8 assoc_bss[ETH_ALEN]; | 
 | 51 | 	u8 disassoc_reason; | 
| Holger Schurig | 5e04769 | 2009-10-22 15:30:49 +0200 | [diff] [blame] | 52 |  | 
 | 53 | 	/* Mesh */ | 
 | 54 | 	struct net_device *mesh_dev; /* Virtual device */ | 
| Holger Schurig | 4143a23 | 2009-12-02 15:26:02 +0100 | [diff] [blame] | 55 | #ifdef CONFIG_LIBERTAS_MESH | 
| Holger Schurig | 5e04769 | 2009-10-22 15:30:49 +0200 | [diff] [blame] | 56 | 	struct lbs_mesh_stats mstats; | 
| Holger Schurig | 5e04769 | 2009-10-22 15:30:49 +0200 | [diff] [blame] | 57 | 	uint16_t mesh_tlv; | 
 | 58 | 	u8 mesh_ssid[IEEE80211_MAX_SSID_LEN + 1]; | 
 | 59 | 	u8 mesh_ssid_len; | 
| Holger Schurig | 4143a23 | 2009-12-02 15:26:02 +0100 | [diff] [blame] | 60 | #endif | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 61 |  | 
| Holger Schurig | 5e04769 | 2009-10-22 15:30:49 +0200 | [diff] [blame] | 62 | 	/* Debugfs */ | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 63 | 	struct dentry *debugfs_dir; | 
 | 64 | 	struct dentry *debugfs_debug; | 
 | 65 | 	struct dentry *debugfs_files[6]; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 66 | 	struct dentry *events_dir; | 
 | 67 | 	struct dentry *debugfs_events_files[6]; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 68 | 	struct dentry *regs_dir; | 
 | 69 | 	struct dentry *debugfs_regs_files[6]; | 
 | 70 |  | 
| Holger Schurig | 5e04769 | 2009-10-22 15:30:49 +0200 | [diff] [blame] | 71 | 	/* Hardware debugging */ | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 72 | 	u32 mac_offset; | 
 | 73 | 	u32 bbp_offset; | 
 | 74 | 	u32 rf_offset; | 
 | 75 |  | 
| Holger Schurig | 5e04769 | 2009-10-22 15:30:49 +0200 | [diff] [blame] | 76 | 	/* Power management */ | 
 | 77 | 	u16 psmode; | 
 | 78 | 	u32 psstate; | 
 | 79 | 	u8 needtowakeup; | 
 | 80 |  | 
 | 81 | 	/* Deep sleep */ | 
| Amitkumar Karwar | 4912545 | 2009-09-30 20:04:38 -0700 | [diff] [blame] | 82 | 	int is_deep_sleep; | 
| Amitkumar Karwar | 66fceb6 | 2010-05-19 03:24:38 -0700 | [diff] [blame] | 83 | 	int deep_sleep_required; | 
| Amitkumar Karwar | 4912545 | 2009-09-30 20:04:38 -0700 | [diff] [blame] | 84 | 	int is_auto_deep_sleep_enabled; | 
| Amitkumar Karwar | 4912545 | 2009-09-30 20:04:38 -0700 | [diff] [blame] | 85 | 	int wakeup_dev_required; | 
| Amitkumar Karwar | 4912545 | 2009-09-30 20:04:38 -0700 | [diff] [blame] | 86 | 	int is_activity_detected; | 
| Holger Schurig | 5e04769 | 2009-10-22 15:30:49 +0200 | [diff] [blame] | 87 | 	int auto_deep_sleep_timeout; /* in ms */ | 
 | 88 | 	wait_queue_head_t ds_awake_q; | 
 | 89 | 	struct timer_list auto_deepsleep_timer; | 
| Amitkumar Karwar | 4912545 | 2009-09-30 20:04:38 -0700 | [diff] [blame] | 90 |  | 
| Amitkumar Karwar | 66fceb6 | 2010-05-19 03:24:38 -0700 | [diff] [blame] | 91 | 	/* Host sleep*/ | 
 | 92 | 	int is_host_sleep_configured; | 
 | 93 | 	int is_host_sleep_activated; | 
 | 94 | 	wait_queue_head_t host_sleep_q; | 
 | 95 |  | 
| Holger Schurig | 5e04769 | 2009-10-22 15:30:49 +0200 | [diff] [blame] | 96 | 	/* Hardware access */ | 
 | 97 | 	void *card; | 
| Daniel Drake | d2e7b34 | 2011-08-01 16:43:13 +0100 | [diff] [blame] | 98 | 	bool iface_running; | 
| Holger Schurig | 5e04769 | 2009-10-22 15:30:49 +0200 | [diff] [blame] | 99 | 	u8 fw_ready; | 
 | 100 | 	u8 surpriseremoved; | 
| Vasily Khoruzhick | 75abde4 | 2011-01-21 22:44:49 +0200 | [diff] [blame] | 101 | 	u8 setup_fw_on_resume; | 
| Holger Schurig | 69f9032 | 2007-11-23 15:43:44 +0100 | [diff] [blame] | 102 | 	int (*hw_host_to_card) (struct lbs_private *priv, u8 type, u8 *payload, u16 nb); | 
| David Woodhouse | edf5dab | 2008-05-20 16:43:31 +0100 | [diff] [blame] | 103 | 	void (*reset_card) (struct lbs_private *priv); | 
| Daniel Drake | d2e7b34 | 2011-08-01 16:43:13 +0100 | [diff] [blame] | 104 | 	int (*power_save) (struct lbs_private *priv); | 
 | 105 | 	int (*power_restore) (struct lbs_private *priv); | 
| Amitkumar Karwar | 4912545 | 2009-09-30 20:04:38 -0700 | [diff] [blame] | 106 | 	int (*enter_deep_sleep) (struct lbs_private *priv); | 
 | 107 | 	int (*exit_deep_sleep) (struct lbs_private *priv); | 
 | 108 | 	int (*reset_deep_sleep_wakeup) (struct lbs_private *priv); | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 109 |  | 
| Holger Schurig | 5e04769 | 2009-10-22 15:30:49 +0200 | [diff] [blame] | 110 | 	/* Adapter info (from EEPROM) */ | 
| Holger Schurig | dac10a9 | 2008-01-16 15:55:22 +0100 | [diff] [blame] | 111 | 	u32 fwrelease; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 112 | 	u32 fwcapinfo; | 
| Holger Schurig | 5e04769 | 2009-10-22 15:30:49 +0200 | [diff] [blame] | 113 | 	u16 regioncode; | 
 | 114 | 	u8 current_addr[ETH_ALEN]; | 
| Vasily Khoruzhick | 75abde4 | 2011-01-21 22:44:49 +0200 | [diff] [blame] | 115 | 	u8 copied_hwaddr; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 116 |  | 
| Holger Schurig | 5e04769 | 2009-10-22 15:30:49 +0200 | [diff] [blame] | 117 | 	/* Command download */ | 
 | 118 | 	u8 dnld_sent; | 
 | 119 | 	/* bit0 1/0=data_sent/data_tx_done, | 
 | 120 | 	   bit1 1/0=cmd_sent/cmd_tx_done, | 
 | 121 | 	   all other bits reserved 0 */ | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 122 | 	u16 seqnum; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 123 | 	struct cmd_ctrl_node *cmd_array; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 124 | 	struct cmd_ctrl_node *cur_cmd; | 
| Holger Schurig | 5e04769 | 2009-10-22 15:30:49 +0200 | [diff] [blame] | 125 | 	struct list_head cmdfreeq;    /* free command buffers */ | 
 | 126 | 	struct list_head cmdpendingq; /* pending command buffers */ | 
| Holger Schurig | 5e04769 | 2009-10-22 15:30:49 +0200 | [diff] [blame] | 127 | 	struct timer_list command_timer; | 
| Holger Schurig | 5e04769 | 2009-10-22 15:30:49 +0200 | [diff] [blame] | 128 | 	int cmd_timed_out; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 129 |  | 
| Holger Schurig | 7919b89 | 2008-04-01 14:50:43 +0200 | [diff] [blame] | 130 | 	/* Command responses sent from the hardware to the driver */ | 
 | 131 | 	u8 resp_idx; | 
 | 132 | 	u8 resp_buf[2][LBS_UPLD_SIZE]; | 
 | 133 | 	u32 resp_len[2]; | 
 | 134 |  | 
 | 135 | 	/* Events sent from hardware to driver */ | 
| Stefani Seibold | 4546548 | 2009-12-21 14:37:26 -0800 | [diff] [blame] | 136 | 	struct kfifo event_fifo; | 
| Holger Schurig | 7919b89 | 2008-04-01 14:50:43 +0200 | [diff] [blame] | 137 |  | 
| Randy Dunlap | 8973a6e | 2011-04-26 15:25:29 -0700 | [diff] [blame] | 138 | 	/* thread to service interrupts */ | 
| Holger Schurig | 5e04769 | 2009-10-22 15:30:49 +0200 | [diff] [blame] | 139 | 	struct task_struct *main_thread; | 
 | 140 | 	wait_queue_head_t waitq; | 
 | 141 | 	struct workqueue_struct *work_thread; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 142 |  | 
| Randy Dunlap | 8973a6e | 2011-04-26 15:25:29 -0700 | [diff] [blame] | 143 | 	/* Encryption stuff */ | 
| Amitkumar Karwar | 921ca03 | 2010-02-25 17:16:36 -0800 | [diff] [blame] | 144 | 	u8 authtype_auto; | 
| Kiran Divekar | e86dc1c | 2010-06-14 22:01:26 +0530 | [diff] [blame] | 145 | 	u8 wep_tx_key; | 
 | 146 | 	u8 wep_key[4][WLAN_KEY_LEN_WEP104]; | 
 | 147 | 	u8 wep_key_len[4]; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 148 |  | 
| Holger Schurig | 5e04769 | 2009-10-22 15:30:49 +0200 | [diff] [blame] | 149 | 	/* Wake On LAN */ | 
 | 150 | 	uint32_t wol_criteria; | 
 | 151 | 	uint8_t wol_gpio; | 
 | 152 | 	uint8_t wol_gap; | 
| Deepak Saxena | ae63a33 | 2010-10-31 13:40:33 +0000 | [diff] [blame] | 153 | 	bool ehs_remove_supported; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 154 |  | 
| Holger Schurig | 5e04769 | 2009-10-22 15:30:49 +0200 | [diff] [blame] | 155 | 	/* Transmitting */ | 
 | 156 | 	int tx_pending_len;		/* -1 while building packet */ | 
 | 157 | 	u8 tx_pending_buf[LBS_UPLD_SIZE]; | 
 | 158 | 	/* protected by hard_start_xmit serialization */ | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 159 | 	u8 txretrycount; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 160 | 	struct sk_buff *currenttxskb; | 
| Daniel Drake | 8f641d9 | 2011-10-03 11:33:02 +0100 | [diff] [blame] | 161 | 	struct timer_list tx_lockup_timer; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 162 |  | 
| Holger Schurig | 5e04769 | 2009-10-22 15:30:49 +0200 | [diff] [blame] | 163 | 	/* Locks */ | 
 | 164 | 	struct mutex lock; | 
 | 165 | 	spinlock_t driver_lock; | 
 | 166 |  | 
 | 167 | 	/* NIC/link operation characteristics */ | 
| Holger Schurig | d9e9778 | 2008-03-12 16:06:43 +0100 | [diff] [blame] | 168 | 	u16 mac_control; | 
| Holger Schurig | 5e04769 | 2009-10-22 15:30:49 +0200 | [diff] [blame] | 169 | 	u8 radio_on; | 
| Kiran Divekar | e86dc1c | 2010-06-14 22:01:26 +0530 | [diff] [blame] | 170 | 	u8 cur_rate; | 
| Holger Schurig | c14951f | 2009-10-22 15:30:50 +0200 | [diff] [blame] | 171 | 	u8 channel; | 
| Dan Williams | 87c8c72 | 2008-08-19 15:15:35 -0400 | [diff] [blame] | 172 | 	s16 txpower_cur; | 
 | 173 | 	s16 txpower_min; | 
 | 174 | 	s16 txpower_max; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 175 |  | 
| Randy Dunlap | 8973a6e | 2011-04-26 15:25:29 -0700 | [diff] [blame] | 176 | 	/* Scanning */ | 
| Holger Schurig | 5e04769 | 2009-10-22 15:30:49 +0200 | [diff] [blame] | 177 | 	struct delayed_work scan_work; | 
 | 178 | 	int scan_channel; | 
| Dan Williams | cc02681 | 2010-08-04 00:43:47 -0500 | [diff] [blame] | 179 | 	/* Queue of things waiting for scan completion */ | 
 | 180 | 	wait_queue_head_t scan_q; | 
 | 181 | 	/* Whether the scan was initiated internally and not by cfg80211 */ | 
 | 182 | 	bool internal_scan; | 
| Marcelo Tosatti | 876c9d3 | 2007-02-10 12:25:27 -0200 | [diff] [blame] | 183 | }; | 
 | 184 |  | 
| Holger Schurig | f539f2e | 2008-03-26 13:22:11 +0100 | [diff] [blame] | 185 | extern struct cmd_confirm_sleep confirm_sleep; | 
 | 186 |  | 
| Daniel Drake | d2e7b34 | 2011-08-01 16:43:13 +0100 | [diff] [blame] | 187 | /* Check if there is an interface active. */ | 
 | 188 | static inline int lbs_iface_active(struct lbs_private *priv) | 
 | 189 | { | 
 | 190 | 	int r; | 
 | 191 |  | 
 | 192 | 	r = netif_running(priv->dev); | 
| Dan Carpenter | bfe2ed8 | 2011-08-15 14:25:35 +0300 | [diff] [blame] | 193 | 	if (priv->mesh_dev) | 
 | 194 | 		r |= netif_running(priv->mesh_dev); | 
| Daniel Drake | d2e7b34 | 2011-08-01 16:43:13 +0100 | [diff] [blame] | 195 |  | 
 | 196 | 	return r; | 
 | 197 | } | 
 | 198 |  | 
| Holger Schurig | 1007832 | 2007-11-15 18:05:47 -0500 | [diff] [blame] | 199 | #endif |