1
2
3
4
5
6
7#include <linux/spinlock.h>
8#include <linux/device.h>
9#include <linux/kthread.h>
10#include <net/mac80211.h>
11
12#include "deb_defs.h"
13
14#ifndef DRV_NAME
15#define DRV_NAME "libertas_tf"
16#endif
17
18#define MRVL_DEFAULT_RETRIES 9
19#define MRVL_PER_PACKET_RATE 0x10
20#define MRVL_MAX_BCN_SIZE 440
21#define CMD_OPTION_WAITFORRSP 0x0002
22
23
24
25
26#define CMD_RET(cmd) (0x8000 | cmd)
27
28
29#define CMD_GET_HW_SPEC 0x0003
30#define CMD_802_11_RESET 0x0005
31#define CMD_MAC_MULTICAST_ADR 0x0010
32#define CMD_802_11_RADIO_CONTROL 0x001c
33#define CMD_802_11_RF_CHANNEL 0x001d
34#define CMD_802_11_RF_TX_POWER 0x001e
35#define CMD_MAC_CONTROL 0x0028
36#define CMD_802_11_MAC_ADDRESS 0x004d
37#define CMD_SET_BOOT2_VER 0x00a5
38#define CMD_802_11_BEACON_CTRL 0x00b0
39#define CMD_802_11_BEACON_SET 0x00cb
40#define CMD_802_11_SET_MODE 0x00cc
41#define CMD_802_11_SET_BSSID 0x00cd
42
43#define CMD_ACT_GET 0x0000
44#define CMD_ACT_SET 0x0001
45
46
47#define CMD_ACT_HALT 0x0003
48
49
50#define CMD_ACT_MAC_RX_ON 0x0001
51#define CMD_ACT_MAC_TX_ON 0x0002
52#define CMD_ACT_MAC_MULTICAST_ENABLE 0x0020
53#define CMD_ACT_MAC_BROADCAST_ENABLE 0x0040
54#define CMD_ACT_MAC_PROMISCUOUS_ENABLE 0x0080
55#define CMD_ACT_MAC_ALL_MULTICAST_ENABLE 0x0100
56
57
58#define CMD_TYPE_AUTO_PREAMBLE 0x0001
59#define CMD_TYPE_SHORT_PREAMBLE 0x0002
60#define CMD_TYPE_LONG_PREAMBLE 0x0003
61
62#define TURN_ON_RF 0x01
63#define RADIO_ON 0x01
64#define RADIO_OFF 0x00
65
66#define SET_AUTO_PREAMBLE 0x05
67#define SET_SHORT_PREAMBLE 0x03
68#define SET_LONG_PREAMBLE 0x01
69
70
71#define CMD_OPT_802_11_RF_CHANNEL_GET 0x00
72#define CMD_OPT_802_11_RF_CHANNEL_SET 0x01
73
74
75enum lbtf_mode {
76 LBTF_PASSIVE_MODE,
77 LBTF_STA_MODE,
78 LBTF_AP_MODE,
79};
80
81
82#define MACREG_INT_CODE_FIRMWARE_READY 48
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97#define MRVDRV_MAX_MULTICAST_LIST_SIZE 32
98#define LBS_NUM_CMD_BUFFERS 10
99#define LBS_CMD_BUFFER_SIZE (2 * 1024)
100#define MRVDRV_MAX_CHANNEL_SIZE 14
101#define MRVDRV_SNAP_HEADER_LEN 8
102
103#define LBS_UPLD_SIZE 2312
104#define DEV_NAME_LEN 32
105
106
107
108
109#define MRVDRV_MAX_REGION_CODE 6
110
111
112
113#define LBTF_REGDOMAIN_US 0x10
114#define LBTF_REGDOMAIN_CA 0x20
115#define LBTF_REGDOMAIN_EU 0x30
116#define LBTF_REGDOMAIN_SP 0x31
117#define LBTF_REGDOMAIN_FR 0x32
118#define LBTF_REGDOMAIN_JP 0x40
119
120#define SBI_EVENT_CAUSE_SHIFT 3
121
122
123
124#define MRVDRV_RXPD_STATUS_OK 0x0001
125
126
127
128#define EXTRA_LEN 36
129
130#define MRVDRV_ETH_TX_PACKET_BUFFER_SIZE \
131 (ETH_FRAME_LEN + sizeof(struct txpd) + EXTRA_LEN)
132
133#define MRVDRV_ETH_RX_PACKET_BUFFER_SIZE \
134 (ETH_FRAME_LEN + sizeof(struct rxpd) \
135 + MRVDRV_SNAP_HEADER_LEN + EXTRA_LEN)
136
137#define CMD_F_HOSTCMD (1 << 0)
138#define FW_CAPINFO_WPA (1 << 0)
139
140#define RF_ANTENNA_1 0x1
141#define RF_ANTENNA_2 0x2
142#define RF_ANTENNA_AUTO 0xFFFF
143
144#define LBTF_EVENT_BCN_SENT 55
145
146
147
148enum mv_ms_type {
149 MVMS_DAT = 0,
150 MVMS_CMD = 1,
151 MVMS_TXDONE = 2,
152 MVMS_EVENT
153};
154
155extern struct workqueue_struct *lbtf_wq;
156
157struct lbtf_private;
158
159struct lbtf_offset_value {
160 u32 offset;
161 u32 value;
162};
163
164struct channel_range {
165 u8 regdomain;
166 u8 start;
167 u8 end;
168};
169
170struct if_usb_card;
171
172struct lbtf_ops {
173
174 int (*hw_host_to_card)(struct lbtf_private *priv, u8 type,
175 u8 *payload, u16 nb);
176 int (*hw_prog_firmware)(struct lbtf_private *priv);
177 int (*hw_reset_device)(struct lbtf_private *priv);
178};
179
180
181struct lbtf_private {
182 void *card;
183 struct ieee80211_hw *hw;
184 const struct lbtf_ops *ops;
185
186
187 u8 cmd_resp_buff[LBS_UPLD_SIZE];
188
189
190
191
192 struct ieee80211_vif *vif;
193
194 struct work_struct cmd_work;
195 struct work_struct tx_work;
196
197
198
199 u32 fwrelease;
200 u32 fwcapinfo;
201
202
203 struct mutex lock;
204
205
206 u16 seqnum;
207
208
209 struct cmd_ctrl_node *cmd_array;
210
211 struct cmd_ctrl_node *cur_cmd;
212
213
214 struct list_head cmdfreeq;
215
216 struct list_head cmdpendingq;
217
218
219 spinlock_t driver_lock;
220
221
222 struct timer_list command_timer;
223 int nr_retries;
224 int cmd_timed_out;
225
226 u8 cmd_response_rxed;
227
228
229 u16 capability;
230
231
232 u8 current_addr[ETH_ALEN];
233 u8 multicastlist[MRVDRV_MAX_MULTICAST_LIST_SIZE][ETH_ALEN];
234 u32 nr_of_multicastmacaddr;
235 int cur_freq;
236
237 struct sk_buff *skb_to_tx;
238 struct sk_buff *tx_skb;
239
240
241 u16 mac_control;
242 u16 regioncode;
243 struct channel_range range;
244
245 u8 radioon;
246 u32 preamble;
247
248 struct ieee80211_channel channels[14];
249 struct ieee80211_rate rates[12];
250 struct ieee80211_supported_band band;
251 struct lbtf_offset_value offsetvalue;
252
253 u8 surpriseremoved;
254 struct sk_buff_head bc_ps_buf;
255
256
257 s8 noise;
258};
259
260
261
262
263struct txpd {
264
265 __le32 tx_status;
266
267 __le32 tx_control;
268 __le32 tx_packet_location;
269
270 __le16 tx_packet_length;
271
272 u8 tx_dest_addr_high[2];
273
274 u8 tx_dest_addr_low[4];
275
276 u8 priority;
277
278 u8 powermgmt;
279
280 u8 pktdelay_2ms;
281
282 u8 reserved1;
283};
284
285
286struct rxpd {
287
288 __le16 status;
289
290
291 u8 snr;
292
293
294 u8 rx_control;
295
296
297 __le16 pkt_len;
298
299
300 u8 nf;
301
302
303 u8 rx_rate;
304
305
306 __le32 pkt_ptr;
307
308
309 __le32 next_rxpd_ptr;
310
311
312 u8 priority;
313 u8 reserved[3];
314};
315
316struct cmd_header {
317 __le16 command;
318 __le16 size;
319 __le16 seqnum;
320 __le16 result;
321} __packed;
322
323struct cmd_ctrl_node {
324 struct list_head list;
325 int result;
326
327 int (*callback)(struct lbtf_private *,
328 unsigned long, struct cmd_header *);
329 unsigned long callback_arg;
330
331 struct cmd_header *cmdbuf;
332
333 u16 cmdwaitqwoken;
334 wait_queue_head_t cmdwait_q;
335};
336
337
338
339
340
341struct cmd_ds_get_hw_spec {
342 struct cmd_header hdr;
343
344
345 __le16 hwifversion;
346
347 __le16 version;
348
349 __le16 nr_txpd;
350
351 __le16 nr_mcast_adr;
352
353 u8 permanentaddr[6];
354
355
356 __le16 regioncode;
357
358
359 __le16 nr_antenna;
360
361
362 __le32 fwrelease;
363
364
365 __le32 wcb_base;
366
367 __le32 rxpd_rdptr;
368
369
370 __le32 rxpd_wrptr;
371
372
373 __le32 fwcapinfo;
374} __packed;
375
376struct cmd_ds_mac_control {
377 struct cmd_header hdr;
378 __le16 action;
379 u16 reserved;
380};
381
382struct cmd_ds_802_11_mac_address {
383 struct cmd_header hdr;
384
385 __le16 action;
386 uint8_t macadd[ETH_ALEN];
387};
388
389struct cmd_ds_mac_multicast_addr {
390 struct cmd_header hdr;
391
392 __le16 action;
393 __le16 nr_of_adrs;
394 u8 maclist[ETH_ALEN * MRVDRV_MAX_MULTICAST_LIST_SIZE];
395};
396
397struct cmd_ds_set_mode {
398 struct cmd_header hdr;
399
400 __le16 mode;
401};
402
403struct cmd_ds_set_bssid {
404 struct cmd_header hdr;
405
406 u8 bssid[6];
407 u8 activate;
408};
409
410struct cmd_ds_802_11_radio_control {
411 struct cmd_header hdr;
412
413 __le16 action;
414 __le16 control;
415};
416
417
418struct cmd_ds_802_11_rf_channel {
419 struct cmd_header hdr;
420
421 __le16 action;
422 __le16 channel;
423 __le16 rftype;
424 __le16 reserved;
425 u8 channellist[32];
426};
427
428struct cmd_ds_set_boot2_ver {
429 struct cmd_header hdr;
430
431 __le16 action;
432 __le16 version;
433};
434
435struct cmd_ds_802_11_reset {
436 struct cmd_header hdr;
437
438 __le16 action;
439};
440
441struct cmd_ds_802_11_beacon_control {
442 struct cmd_header hdr;
443
444 __le16 action;
445 __le16 beacon_enable;
446 __le16 beacon_period;
447};
448
449struct cmd_ds_802_11_beacon_set {
450 struct cmd_header hdr;
451
452 __le16 len;
453 u8 beacon[MRVL_MAX_BCN_SIZE];
454};
455
456struct cmd_ctrl_node;
457
458
459void lbtf_set_mac_control(struct lbtf_private *priv);
460
461int lbtf_free_cmd_buffer(struct lbtf_private *priv);
462
463int lbtf_allocate_cmd_buffer(struct lbtf_private *priv);
464int lbtf_execute_next_command(struct lbtf_private *priv);
465int lbtf_set_radio_control(struct lbtf_private *priv);
466int lbtf_update_hw_spec(struct lbtf_private *priv);
467int lbtf_cmd_set_mac_multicast_addr(struct lbtf_private *priv);
468void lbtf_set_mode(struct lbtf_private *priv, enum lbtf_mode mode);
469void lbtf_set_bssid(struct lbtf_private *priv, bool activate, const u8 *bssid);
470int lbtf_set_mac_address(struct lbtf_private *priv, uint8_t *mac_addr);
471
472int lbtf_set_channel(struct lbtf_private *priv, u8 channel);
473
474int lbtf_beacon_set(struct lbtf_private *priv, struct sk_buff *beacon);
475int lbtf_beacon_ctrl(struct lbtf_private *priv, bool beacon_enable,
476 int beacon_int);
477
478
479int lbtf_process_rx_command(struct lbtf_private *priv);
480void lbtf_complete_command(struct lbtf_private *priv, struct cmd_ctrl_node *cmd,
481 int result);
482void lbtf_cmd_response_rx(struct lbtf_private *priv);
483
484
485struct chan_freq_power *lbtf_get_region_cfp_table(u8 region,
486 int *cfp_no);
487struct lbtf_private *lbtf_add_card(void *card, struct device *dmdev,
488 const struct lbtf_ops *ops);
489int lbtf_remove_card(struct lbtf_private *priv);
490int lbtf_start_card(struct lbtf_private *priv);
491int lbtf_rx(struct lbtf_private *priv, struct sk_buff *skb);
492void lbtf_send_tx_feedback(struct lbtf_private *priv, u8 retrycnt, u8 fail);
493void lbtf_bcn_sent(struct lbtf_private *priv);
494
495
496
497
498
499#define lbtf_cmd(priv, cmdnr, cmd, cb, cb_arg) ({ \
500 uint16_t __sz = le16_to_cpu((cmd)->hdr.size); \
501 (cmd)->hdr.size = cpu_to_le16(sizeof(*(cmd))); \
502 __lbtf_cmd(priv, cmdnr, &(cmd)->hdr, __sz, cb, cb_arg); \
503})
504
505#define lbtf_cmd_with_response(priv, cmdnr, cmd) \
506 lbtf_cmd(priv, cmdnr, cmd, lbtf_cmd_copyback, (unsigned long) (cmd))
507
508void lbtf_cmd_async(struct lbtf_private *priv, uint16_t command,
509 struct cmd_header *in_cmd, int in_cmd_size);
510
511int __lbtf_cmd(struct lbtf_private *priv, uint16_t command,
512 struct cmd_header *in_cmd, int in_cmd_size,
513 int (*callback)(struct lbtf_private *, unsigned long,
514 struct cmd_header *),
515 unsigned long callback_arg);
516
517int lbtf_cmd_copyback(struct lbtf_private *priv, unsigned long extra,
518 struct cmd_header *resp);
519