Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
libertas_tf.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2008, cozybit Inc.
3  * Copyright (C) 2007, Red Hat, Inc.
4  * Copyright (C) 2003-2006, Marvell International Ltd.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or (at
9  * your option) any later version.
10  */
11 #include <linux/spinlock.h>
12 #include <linux/device.h>
13 #include <linux/kthread.h>
14 #include <net/mac80211.h>
15 
16 #include "deb_defs.h"
17 
18 #ifndef DRV_NAME
19 #define DRV_NAME "libertas_tf"
20 #endif
21 
22 #define MRVL_DEFAULT_RETRIES 9
23 #define MRVL_PER_PACKET_RATE 0x10
24 #define MRVL_MAX_BCN_SIZE 440
25 #define CMD_OPTION_WAITFORRSP 0x0002
26 
27 /* Return command are almost always the same as the host command, but with
28  * bit 15 set high. There are a few exceptions, though...
29  */
30 #define CMD_RET(cmd) (0x8000 | cmd)
31 
32 /* Command codes */
33 #define CMD_GET_HW_SPEC 0x0003
34 #define CMD_802_11_RESET 0x0005
35 #define CMD_MAC_MULTICAST_ADR 0x0010
36 #define CMD_802_11_RADIO_CONTROL 0x001c
37 #define CMD_802_11_RF_CHANNEL 0x001d
38 #define CMD_802_11_RF_TX_POWER 0x001e
39 #define CMD_MAC_CONTROL 0x0028
40 #define CMD_802_11_MAC_ADDRESS 0x004d
41 #define CMD_SET_BOOT2_VER 0x00a5
42 #define CMD_802_11_BEACON_CTRL 0x00b0
43 #define CMD_802_11_BEACON_SET 0x00cb
44 #define CMD_802_11_SET_MODE 0x00cc
45 #define CMD_802_11_SET_BSSID 0x00cd
46 
47 #define CMD_ACT_GET 0x0000
48 #define CMD_ACT_SET 0x0001
49 
50 /* Define action or option for CMD_802_11_RESET */
51 #define CMD_ACT_HALT 0x0003
52 
53 /* Define action or option for CMD_MAC_CONTROL */
54 #define CMD_ACT_MAC_RX_ON 0x0001
55 #define CMD_ACT_MAC_TX_ON 0x0002
56 #define CMD_ACT_MAC_MULTICAST_ENABLE 0x0020
57 #define CMD_ACT_MAC_BROADCAST_ENABLE 0x0040
58 #define CMD_ACT_MAC_PROMISCUOUS_ENABLE 0x0080
59 #define CMD_ACT_MAC_ALL_MULTICAST_ENABLE 0x0100
60 
61 /* Define action or option for CMD_802_11_RADIO_CONTROL */
62 #define CMD_TYPE_AUTO_PREAMBLE 0x0001
63 #define CMD_TYPE_SHORT_PREAMBLE 0x0002
64 #define CMD_TYPE_LONG_PREAMBLE 0x0003
65 
66 #define TURN_ON_RF 0x01
67 #define RADIO_ON 0x01
68 #define RADIO_OFF 0x00
69 
70 #define SET_AUTO_PREAMBLE 0x05
71 #define SET_SHORT_PREAMBLE 0x03
72 #define SET_LONG_PREAMBLE 0x01
73 
74 /* Define action or option for CMD_802_11_RF_CHANNEL */
75 #define CMD_OPT_802_11_RF_CHANNEL_GET 0x00
76 #define CMD_OPT_802_11_RF_CHANNEL_SET 0x01
77 
78 /* Codes for CMD_802_11_SET_MODE */
79 enum lbtf_mode {
83 };
84 
86 #define MACREG_INT_CODE_FIRMWARE_READY 48
87 
89 /* The size of SQ memory PPA, DPA are 8 DWORDs, that keep the physical
90 * addresses of TxPD buffers. Station has only 8 TxPD available, Whereas
91 * driver has more local TxPDs. Each TxPD on the host memory is associated
92 * with a Tx control node. The driver maintains 8 RxPD descriptors for
93 * station firmware to store Rx packet information.
94 *
95 * Current version of MAC has a 32x6 multicast address buffer.
96 *
97 * 802.11b can have up to 14 channels, the driver keeps the
98 * BSSID(MAC address) of each APs or Ad hoc stations it has sensed.
99 */
100 
101 #define MRVDRV_MAX_MULTICAST_LIST_SIZE 32
102 #define LBS_NUM_CMD_BUFFERS 10
103 #define LBS_CMD_BUFFER_SIZE (2 * 1024)
104 #define MRVDRV_MAX_CHANNEL_SIZE 14
105 #define MRVDRV_SNAP_HEADER_LEN 8
106 
107 #define LBS_UPLD_SIZE 2312
108 #define DEV_NAME_LEN 32
109 
111 /* This section defines 802.11 specific contants */
112 
113 #define MRVDRV_MAX_REGION_CODE 6
114 
117 #define LBTF_REGDOMAIN_US 0x10
118 #define LBTF_REGDOMAIN_CA 0x20
119 #define LBTF_REGDOMAIN_EU 0x30
120 #define LBTF_REGDOMAIN_SP 0x31
121 #define LBTF_REGDOMAIN_FR 0x32
122 #define LBTF_REGDOMAIN_JP 0x40
123 
124 #define SBI_EVENT_CAUSE_SHIFT 3
125 
128 #define MRVDRV_RXPD_STATUS_OK 0x0001
129 
130 
131 /* This is for firmware specific length */
132 #define EXTRA_LEN 36
133 
134 #define MRVDRV_ETH_TX_PACKET_BUFFER_SIZE \
135  (ETH_FRAME_LEN + sizeof(struct txpd) + EXTRA_LEN)
136 
137 #define MRVDRV_ETH_RX_PACKET_BUFFER_SIZE \
138  (ETH_FRAME_LEN + sizeof(struct rxpd) \
139  + MRVDRV_SNAP_HEADER_LEN + EXTRA_LEN)
140 
141 #define CMD_F_HOSTCMD (1 << 0)
142 #define FW_CAPINFO_WPA (1 << 0)
143 
144 #define RF_ANTENNA_1 0x1
145 #define RF_ANTENNA_2 0x2
146 #define RF_ANTENNA_AUTO 0xFFFF
147 
148 #define LBTF_EVENT_BCN_SENT 55
149 
153  MVMS_DAT = 0,
154  MVMS_CMD = 1,
157 };
158 
159 extern struct workqueue_struct *lbtf_wq;
160 
161 struct lbtf_private;
162 
166 };
167 
171  u8 end; /* exclusive (channel must be less than end) */
172 };
173 
174 struct if_usb_card;
175 
177 struct lbtf_private {
178  void *card;
179  struct ieee80211_hw *hw;
180 
181  /* Command response buffer */
183  /* Download sent:
184  bit0 1/0=data_sent/data_tx_done,
185  bit1 1/0=cmd_sent/cmd_tx_done,
186  all other bits reserved 0 */
188 
193  int (*hw_prog_firmware) (struct if_usb_card *cardp);
194  int (*hw_reset_device) (struct if_usb_card *cardp);
195 
196 
201  /* protected with big lock */
202 
203  struct mutex lock;
204 
207  /* protected by big lock */
208 
217 
220 
225 
227 
230 
235  int cur_freq;
236 
238  struct sk_buff *tx_skb;
239 
244 
247 
249  struct ieee80211_rate rates[12];
252 
256 
257  /* Most recently reported noise in dBm */
259 };
260 
261 /* 802.11-related definitions */
262 
263 /* TxPD descriptor */
264 struct txpd {
265  /* Current Tx packet status */
267  /* Tx control */
270  /* Tx packet length */
272  /* First 2 byte of destination MAC address */
274  /* Last 4 byte of destination MAC address */
275  u8 tx_dest_addr_low[4];
276  /* Pkt Priority */
277  u8 priority;
278  /* Pkt Trasnit Power control */
279  u8 powermgmt;
280  /* Time the packet has been queued in the driver (units = 2ms) */
282  /* reserved */
283  u8 reserved1;
284 };
285 
286 /* RxPD Descriptor */
287 struct rxpd {
288  /* Current Rx packet status */
289  __le16 status;
290 
291  /* SNR */
292  u8 snr;
293 
294  /* Tx control */
295  u8 rx_control;
296 
297  /* Pkt length */
298  __le16 pkt_len;
299 
300  /* Noise Floor */
301  u8 nf;
302 
303  /* Rx Packet Rate */
304  u8 rx_rate;
305 
306  /* Pkt addr */
307  __le32 pkt_ptr;
308 
309  /* Next Rx RxPD addr */
311 
312  /* Pkt Priority */
313  u8 priority;
314  u8 reserved[3];
315 };
316 
317 struct cmd_header {
318  __le16 command;
319  __le16 size;
320  __le16 seqnum;
321  __le16 result;
322 } __packed;
323 
324 struct cmd_ctrl_node {
325  struct list_head list;
326  int result;
327  /* command response */
328  int (*callback)(struct lbtf_private *,
329  unsigned long, struct cmd_header *);
330  unsigned long callback_arg;
331  /* command data */
332  struct cmd_header *cmdbuf;
333  /* wait queue */
336 };
337 
338 /*
339  * Define data structure for CMD_GET_HW_SPEC
340  * This structure defines the response for the GET_HW_SPEC command
341  */
342 struct cmd_ds_get_hw_spec {
343  struct cmd_header hdr;
344 
345  /* HW Interface version number */
347  /* HW version number */
348  __le16 version;
349  /* Max number of TxPD FW can handle */
350  __le16 nr_txpd;
351  /* Max no of Multicast address */
353  /* MAC address */
354  u8 permanentaddr[6];
355 
356  /* region Code */
358 
359  /* Number of antenna used */
361 
362  /* FW release number, example 0x01030304 = 2.3.4p1 */
364 
365  /* Base Address of TxPD queue */
367  /* Read Pointer of RxPd queue */
369 
370  /* Write Pointer of RxPd queue */
372 
373  /*FW/HW capability */
375 } __packed;
376 
377 struct cmd_ds_mac_control {
378  struct cmd_header hdr;
379  __le16 action;
380  u16 reserved;
381 };
382 
384  struct cmd_header hdr;
385 
386  __le16 action;
388 };
389 
391  struct cmd_header hdr;
392 
396 };
397 
399  struct cmd_header hdr;
400 
402 };
403 
405  struct cmd_header hdr;
406 
407  u8 bssid[6];
409 };
410 
412  struct cmd_header hdr;
413 
414  __le16 action;
415  __le16 control;
416 };
417 
418 
420  struct cmd_header hdr;
421 
422  __le16 action;
423  __le16 channel;
424  __le16 rftype; /* unused */
425  __le16 reserved; /* unused */
426  u8 channellist[32]; /* unused */
427 };
428 
429 struct cmd_ds_set_boot2_ver {
430  struct cmd_header hdr;
431 
432  __le16 action;
433  __le16 version;
434 };
435 
437  struct cmd_header hdr;
438 
440 };
441 
443  struct cmd_header hdr;
444 
445  __le16 action;
448 };
449 
451  struct cmd_header hdr;
452 
455 };
456 
457 struct lbtf_private;
458 struct cmd_ctrl_node;
459 
462 
464 
470 void lbtf_set_mode(struct lbtf_private *priv, enum lbtf_mode mode);
471 void lbtf_set_bssid(struct lbtf_private *priv, bool activate, const u8 *bssid);
473 
475 
476 int lbtf_beacon_set(struct lbtf_private *priv, struct sk_buff *beacon);
477 int lbtf_beacon_ctrl(struct lbtf_private *priv, bool beacon_enable,
478  int beacon_int);
479 
480 
483  int result);
485 
486 /* main.c */
487 struct chan_freq_power *lbtf_get_region_cfp_table(u8 region,
488  int *cfp_no);
489 struct lbtf_private *lbtf_add_card(void *card, struct device *dmdev);
490 int lbtf_remove_card(struct lbtf_private *priv);
491 int lbtf_start_card(struct lbtf_private *priv);
492 int lbtf_rx(struct lbtf_private *priv, struct sk_buff *skb);
493 void lbtf_send_tx_feedback(struct lbtf_private *priv, u8 retrycnt, u8 fail);
494 void lbtf_bcn_sent(struct lbtf_private *priv);
495 
496 /* support functions for cmd.c */
497 /* lbtf_cmd() infers the size of the buffer to copy data back into, from
498  the size of the target of the pointer. Since the command to be sent
499  may often be smaller, that size is set in cmd->size by the caller.*/
500 #define lbtf_cmd(priv, cmdnr, cmd, cb, cb_arg) ({ \
501  uint16_t __sz = le16_to_cpu((cmd)->hdr.size); \
502  (cmd)->hdr.size = cpu_to_le16(sizeof(*(cmd))); \
503  __lbtf_cmd(priv, cmdnr, &(cmd)->hdr, __sz, cb, cb_arg); \
504 })
505 
506 #define lbtf_cmd_with_response(priv, cmdnr, cmd) \
507  lbtf_cmd(priv, cmdnr, cmd, lbtf_cmd_copyback, (unsigned long) (cmd))
508 
510  struct cmd_header *in_cmd, int in_cmd_size);
511 
513  struct cmd_header *in_cmd, int in_cmd_size,
514  int (*callback)(struct lbtf_private *, unsigned long,
515  struct cmd_header *),
516  unsigned long callback_arg);
517 
518 int lbtf_cmd_copyback(struct lbtf_private *priv, unsigned long extra,
519  struct cmd_header *resp);