Commit | Line | Data |
---|---|---|
8973a6e7 RD |
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 | */ | |
10078321 HS |
6 | #ifndef _LBS_DEV_H_ |
7 | #define _LBS_DEV_H_ | |
876c9d3a | 8 | |
e86dc1ca | 9 | #include "defs.h" |
534111c7 | 10 | #include "decl.h" |
e86dc1ca | 11 | #include "host.h" |
876c9d3a | 12 | |
45465487 | 13 | #include <linux/kfifo.h> |
876c9d3a | 14 | |
8973a6e7 | 15 | /* sleep_params */ |
876c9d3a | 16 | struct sleep_params { |
3fbe104c DW |
17 | uint16_t sp_error; |
18 | uint16_t sp_offset; | |
19 | uint16_t sp_stabletime; | |
20 | uint8_t sp_calcontrol; | |
21 | uint8_t sp_extsleepclk; | |
22 | uint16_t sp_reserved; | |
876c9d3a MT |
23 | }; |
24 | ||
49fee692 DD |
25 | /* Mesh statistics */ |
26 | struct lbs_mesh_stats { | |
27 | u32 fwd_bcast_cnt; /* Fwd: Broadcast counter */ | |
28 | u32 fwd_unicast_cnt; /* Fwd: Unicast counter */ | |
29 | u32 fwd_drop_ttl; /* Fwd: TTL zero */ | |
30 | u32 fwd_drop_rbt; /* Fwd: Recently Broadcasted */ | |
31 | u32 fwd_drop_noroute; /* Fwd: No route to Destination */ | |
32 | u32 fwd_drop_nobuf; /* Fwd: Run out of internal buffers */ | |
33 | u32 drop_blind; /* Rx: Dropped by blinding table */ | |
34 | u32 tx_failed_cnt; /* Tx: Failed transmissions */ | |
35 | }; | |
876c9d3a | 36 | |
8973a6e7 | 37 | /* Private structure for the MV device */ |
69f9032d | 38 | struct lbs_private { |
5e047692 HS |
39 | |
40 | /* Basic networking */ | |
41 | struct net_device *dev; | |
42 | u32 connect_status; | |
5e047692 HS |
43 | struct work_struct mcast_work; |
44 | u32 nr_of_multicastmacaddr; | |
45 | u8 multicastlist[MRVDRV_MAX_MULTICAST_LIST_SIZE][ETH_ALEN]; | |
46 | ||
47 | /* CFG80211 */ | |
ff9fc791 | 48 | struct wireless_dev *wdev; |
73714004 | 49 | bool wiphy_registered; |
e86dc1ca KD |
50 | struct cfg80211_scan_request *scan_req; |
51 | u8 assoc_bss[ETH_ALEN]; | |
20d2ebe5 | 52 | u8 country_code[IEEE80211_COUNTRY_STRING_LEN]; |
e86dc1ca | 53 | u8 disassoc_reason; |
5e047692 HS |
54 | |
55 | /* Mesh */ | |
56 | struct net_device *mesh_dev; /* Virtual device */ | |
4143a23d | 57 | #ifdef CONFIG_LIBERTAS_MESH |
5e047692 | 58 | struct lbs_mesh_stats mstats; |
5e047692 HS |
59 | uint16_t mesh_tlv; |
60 | u8 mesh_ssid[IEEE80211_MAX_SSID_LEN + 1]; | |
61 | u8 mesh_ssid_len; | |
e8c9bd5b | 62 | u8 mesh_channel; |
4143a23d | 63 | #endif |
876c9d3a | 64 | |
5e047692 | 65 | /* Debugfs */ |
876c9d3a MT |
66 | struct dentry *debugfs_dir; |
67 | struct dentry *debugfs_debug; | |
68 | struct dentry *debugfs_files[6]; | |
876c9d3a MT |
69 | struct dentry *events_dir; |
70 | struct dentry *debugfs_events_files[6]; | |
876c9d3a MT |
71 | struct dentry *regs_dir; |
72 | struct dentry *debugfs_regs_files[6]; | |
73 | ||
5e047692 | 74 | /* Hardware debugging */ |
876c9d3a MT |
75 | u32 mac_offset; |
76 | u32 bbp_offset; | |
77 | u32 rf_offset; | |
5e047692 HS |
78 | |
79 | /* Power management */ | |
80 | u16 psmode; | |
81 | u32 psstate; | |
82 | u8 needtowakeup; | |
876c9d3a | 83 | |
5e047692 | 84 | /* Deep sleep */ |
49125454 | 85 | int is_deep_sleep; |
66fceb69 | 86 | int deep_sleep_required; |
49125454 | 87 | int is_auto_deep_sleep_enabled; |
49125454 | 88 | int wakeup_dev_required; |
49125454 | 89 | int is_activity_detected; |
5e047692 HS |
90 | int auto_deep_sleep_timeout; /* in ms */ |
91 | wait_queue_head_t ds_awake_q; | |
92 | struct timer_list auto_deepsleep_timer; | |
208fdd2f | 93 | |
66fceb69 AK |
94 | /* Host sleep*/ |
95 | int is_host_sleep_configured; | |
96 | int is_host_sleep_activated; | |
97 | wait_queue_head_t host_sleep_q; | |
98 | ||
5e047692 HS |
99 | /* Hardware access */ |
100 | void *card; | |
d2e7b342 | 101 | bool iface_running; |
5e047692 HS |
102 | u8 fw_ready; |
103 | u8 surpriseremoved; | |
75abde4d | 104 | u8 setup_fw_on_resume; |
69f9032d | 105 | int (*hw_host_to_card) (struct lbs_private *priv, u8 type, u8 *payload, u16 nb); |
edf5dabf | 106 | void (*reset_card) (struct lbs_private *priv); |
d2e7b342 DD |
107 | int (*power_save) (struct lbs_private *priv); |
108 | int (*power_restore) (struct lbs_private *priv); | |
49125454 AK |
109 | int (*enter_deep_sleep) (struct lbs_private *priv); |
110 | int (*exit_deep_sleep) (struct lbs_private *priv); | |
111 | int (*reset_deep_sleep_wakeup) (struct lbs_private *priv); | |
876c9d3a | 112 | |
5e047692 | 113 | /* Adapter info (from EEPROM) */ |
dac10a9f | 114 | u32 fwrelease; |
876c9d3a | 115 | u32 fwcapinfo; |
5e047692 HS |
116 | u16 regioncode; |
117 | u8 current_addr[ETH_ALEN]; | |
75abde4d | 118 | u8 copied_hwaddr; |
876c9d3a | 119 | |
5e047692 HS |
120 | /* Command download */ |
121 | u8 dnld_sent; | |
122 | /* bit0 1/0=data_sent/data_tx_done, | |
123 | bit1 1/0=cmd_sent/cmd_tx_done, | |
124 | all other bits reserved 0 */ | |
876c9d3a | 125 | u16 seqnum; |
876c9d3a | 126 | struct cmd_ctrl_node *cmd_array; |
876c9d3a | 127 | struct cmd_ctrl_node *cur_cmd; |
5e047692 HS |
128 | struct list_head cmdfreeq; /* free command buffers */ |
129 | struct list_head cmdpendingq; /* pending command buffers */ | |
5e047692 | 130 | struct timer_list command_timer; |
5e047692 | 131 | int cmd_timed_out; |
876c9d3a | 132 | |
7919b89c HS |
133 | /* Command responses sent from the hardware to the driver */ |
134 | u8 resp_idx; | |
135 | u8 resp_buf[2][LBS_UPLD_SIZE]; | |
136 | u32 resp_len[2]; | |
137 | ||
138 | /* Events sent from hardware to driver */ | |
45465487 | 139 | struct kfifo event_fifo; |
7919b89c | 140 | |
8973a6e7 | 141 | /* thread to service interrupts */ |
5e047692 HS |
142 | struct task_struct *main_thread; |
143 | wait_queue_head_t waitq; | |
144 | struct workqueue_struct *work_thread; | |
876c9d3a | 145 | |
8973a6e7 | 146 | /* Encryption stuff */ |
921ca03c | 147 | u8 authtype_auto; |
e86dc1ca KD |
148 | u8 wep_tx_key; |
149 | u8 wep_key[4][WLAN_KEY_LEN_WEP104]; | |
150 | u8 wep_key_len[4]; | |
876c9d3a | 151 | |
5e047692 HS |
152 | /* Wake On LAN */ |
153 | uint32_t wol_criteria; | |
154 | uint8_t wol_gpio; | |
155 | uint8_t wol_gap; | |
ae63a33e | 156 | bool ehs_remove_supported; |
876c9d3a | 157 | |
5e047692 HS |
158 | /* Transmitting */ |
159 | int tx_pending_len; /* -1 while building packet */ | |
160 | u8 tx_pending_buf[LBS_UPLD_SIZE]; | |
161 | /* protected by hard_start_xmit serialization */ | |
876c9d3a | 162 | u8 txretrycount; |
876c9d3a | 163 | struct sk_buff *currenttxskb; |
8f641d93 | 164 | struct timer_list tx_lockup_timer; |
876c9d3a | 165 | |
5e047692 HS |
166 | /* Locks */ |
167 | struct mutex lock; | |
168 | spinlock_t driver_lock; | |
169 | ||
170 | /* NIC/link operation characteristics */ | |
d9e9778c | 171 | u16 mac_control; |
5e047692 | 172 | u8 radio_on; |
e86dc1ca | 173 | u8 cur_rate; |
c14951fe | 174 | u8 channel; |
87c8c72d DW |
175 | s16 txpower_cur; |
176 | s16 txpower_min; | |
177 | s16 txpower_max; | |
876c9d3a | 178 | |
8973a6e7 | 179 | /* Scanning */ |
5e047692 HS |
180 | struct delayed_work scan_work; |
181 | int scan_channel; | |
cc026819 DW |
182 | /* Queue of things waiting for scan completion */ |
183 | wait_queue_head_t scan_q; | |
184 | /* Whether the scan was initiated internally and not by cfg80211 */ | |
185 | bool internal_scan; | |
534111c7 DD |
186 | |
187 | /* Firmware load */ | |
188 | u32 fw_model; | |
189 | wait_queue_head_t fw_waitq; | |
190 | struct device *fw_device; | |
191 | const struct firmware *helper_fw; | |
192 | const struct lbs_fw_table *fw_table; | |
193 | const struct lbs_fw_table *fw_iter; | |
194 | lbs_fw_cb fw_callback; | |
876c9d3a MT |
195 | }; |
196 | ||
f539f2ef HS |
197 | extern struct cmd_confirm_sleep confirm_sleep; |
198 | ||
d2e7b342 DD |
199 | /* Check if there is an interface active. */ |
200 | static inline int lbs_iface_active(struct lbs_private *priv) | |
201 | { | |
202 | int r; | |
203 | ||
204 | r = netif_running(priv->dev); | |
bfe2ed8f DC |
205 | if (priv->mesh_dev) |
206 | r |= netif_running(priv->mesh_dev); | |
d2e7b342 DD |
207 | |
208 | return r; | |
209 | } | |
210 | ||
10078321 | 211 | #endif |