]> bbs.cooldavid.org Git - net-next-2.6.git/blame - drivers/net/wireless/libertas_tf/libertas_tf.h
Merge branch 'master' of git://dev.medozas.de/linux
[net-next-2.6.git] / drivers / net / wireless / libertas_tf / libertas_tf.h
CommitLineData
7670e62c
LCC
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
edfcba15
JL
16#include "deb_defs.h"
17
7670e62c
LCC
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 */
79enum lbtf_mode {
80 LBTF_PASSIVE_MODE,
81 LBTF_STA_MODE,
82 LBTF_AP_MODE,
83};
84
85/** Card Event definition */
86#define MACREG_INT_CODE_FIRMWARE_READY 48
87/** Buffer Constants */
88
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
110/** Misc constants */
111/* This section defines 802.11 specific contants */
112
113#define MRVDRV_MAX_REGION_CODE 6
114/**
115 * the table to keep region code
116 */
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
126/** RxPD status */
127
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
150/** Global Variable Declaration */
151/** mv_ms_type */
152enum mv_ms_type {
153 MVMS_DAT = 0,
154 MVMS_CMD = 1,
155 MVMS_TXDONE = 2,
156 MVMS_EVENT
157};
158
159extern struct workqueue_struct *lbtf_wq;
160
161struct lbtf_private;
162
163struct lbtf_offset_value {
164 u32 offset;
165 u32 value;
166};
167
168struct channel_range {
169 u8 regdomain;
170 u8 start;
171 u8 end; /* exclusive (channel must be less than end) */
172};
173
174struct if_usb_card;
175
176/** Private structure for the MV device */
177struct lbtf_private {
178 void *card;
179 struct ieee80211_hw *hw;
180
181 /* Command response buffer */
182 u8 cmd_resp_buff[LBS_UPLD_SIZE];
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 */
187 struct ieee80211_vif *vif;
188
189 struct work_struct cmd_work;
190 struct work_struct tx_work;
191 /** Hardware access */
192 int (*hw_host_to_card) (struct lbtf_private *priv, u8 type, u8 *payload, u16 nb);
193 int (*hw_prog_firmware) (struct if_usb_card *cardp);
194 int (*hw_reset_device) (struct if_usb_card *cardp);
195
196
197 /** Wlan adapter data structure*/
198 /** STATUS variables */
199 u32 fwrelease;
200 u32 fwcapinfo;
201 /* protected with big lock */
202
203 struct mutex lock;
204
205 /** command-related variables */
206 u16 seqnum;
207 /* protected by big lock */
208
209 struct cmd_ctrl_node *cmd_array;
210 /** Current command */
211 struct cmd_ctrl_node *cur_cmd;
212 /** command Queues */
213 /** Free command buffers */
214 struct list_head cmdfreeq;
215 /** Pending command buffers */
216 struct list_head cmdpendingq;
217
218 /** spin locks */
219 spinlock_t driver_lock;
220
221 /** Timers */
222 struct timer_list command_timer;
223 int nr_retries;
224 int cmd_timed_out;
225
226 u8 cmd_response_rxed;
227
228 /** capability Info used in Association, start, join */
229 u16 capability;
230
231 /** MAC address information */
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 /** NIC Operation characteristics */
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 fw_ready;
254 u8 surpriseremoved;
255 struct sk_buff_head bc_ps_buf;
256};
257
258/* 802.11-related definitions */
259
260/* TxPD descriptor */
261struct txpd {
262 /* Current Tx packet status */
263 __le32 tx_status;
264 /* Tx control */
265 __le32 tx_control;
266 __le32 tx_packet_location;
267 /* Tx packet length */
268 __le16 tx_packet_length;
269 /* First 2 byte of destination MAC address */
270 u8 tx_dest_addr_high[2];
271 /* Last 4 byte of destination MAC address */
272 u8 tx_dest_addr_low[4];
273 /* Pkt Priority */
274 u8 priority;
275 /* Pkt Trasnit Power control */
276 u8 powermgmt;
277 /* Time the packet has been queued in the driver (units = 2ms) */
278 u8 pktdelay_2ms;
279 /* reserved */
280 u8 reserved1;
281};
282
283/* RxPD Descriptor */
284struct rxpd {
285 /* Current Rx packet status */
286 __le16 status;
287
288 /* SNR */
289 u8 snr;
290
291 /* Tx control */
292 u8 rx_control;
293
294 /* Pkt length */
295 __le16 pkt_len;
296
297 /* Noise Floor */
298 u8 nf;
299
300 /* Rx Packet Rate */
301 u8 rx_rate;
302
303 /* Pkt addr */
304 __le32 pkt_ptr;
305
306 /* Next Rx RxPD addr */
307 __le32 next_rxpd_ptr;
308
309 /* Pkt Priority */
310 u8 priority;
311 u8 reserved[3];
312};
313
314struct cmd_header {
315 __le16 command;
316 __le16 size;
317 __le16 seqnum;
318 __le16 result;
319} __attribute__ ((packed));
320
321struct cmd_ctrl_node {
322 struct list_head list;
323 int result;
324 /* command response */
325 int (*callback)(struct lbtf_private *,
326 unsigned long, struct cmd_header *);
327 unsigned long callback_arg;
328 /* command data */
329 struct cmd_header *cmdbuf;
330 /* wait queue */
331 u16 cmdwaitqwoken;
332 wait_queue_head_t cmdwait_q;
333};
334
335/*
336 * Define data structure for CMD_GET_HW_SPEC
337 * This structure defines the response for the GET_HW_SPEC command
338 */
339struct cmd_ds_get_hw_spec {
340 struct cmd_header hdr;
341
342 /* HW Interface version number */
343 __le16 hwifversion;
344 /* HW version number */
345 __le16 version;
346 /* Max number of TxPD FW can handle */
347 __le16 nr_txpd;
348 /* Max no of Multicast address */
349 __le16 nr_mcast_adr;
350 /* MAC address */
351 u8 permanentaddr[6];
352
353 /* region Code */
354 __le16 regioncode;
355
356 /* Number of antenna used */
357 __le16 nr_antenna;
358
359 /* FW release number, example 0x01030304 = 2.3.4p1 */
360 __le32 fwrelease;
361
362 /* Base Address of TxPD queue */
363 __le32 wcb_base;
364 /* Read Pointer of RxPd queue */
365 __le32 rxpd_rdptr;
366
367 /* Write Pointer of RxPd queue */
368 __le32 rxpd_wrptr;
369
370 /*FW/HW capability */
371 __le32 fwcapinfo;
372} __attribute__ ((packed));
373
374struct cmd_ds_mac_control {
375 struct cmd_header hdr;
376 __le16 action;
377 u16 reserved;
378};
379
380struct cmd_ds_802_11_mac_address {
381 struct cmd_header hdr;
382
383 __le16 action;
384 uint8_t macadd[ETH_ALEN];
385};
386
387struct cmd_ds_mac_multicast_addr {
388 struct cmd_header hdr;
389
390 __le16 action;
391 __le16 nr_of_adrs;
392 u8 maclist[ETH_ALEN * MRVDRV_MAX_MULTICAST_LIST_SIZE];
393};
394
395struct cmd_ds_set_mode {
396 struct cmd_header hdr;
397
398 __le16 mode;
399};
400
401struct cmd_ds_set_bssid {
402 struct cmd_header hdr;
403
404 u8 bssid[6];
405 u8 activate;
406};
407
408struct cmd_ds_802_11_radio_control {
409 struct cmd_header hdr;
410
411 __le16 action;
412 __le16 control;
413};
414
415
416struct cmd_ds_802_11_rf_channel {
417 struct cmd_header hdr;
418
419 __le16 action;
420 __le16 channel;
421 __le16 rftype; /* unused */
422 __le16 reserved; /* unused */
423 u8 channellist[32]; /* unused */
424};
425
426struct cmd_ds_set_boot2_ver {
427 struct cmd_header hdr;
428
429 __le16 action;
430 __le16 version;
431};
432
433struct cmd_ds_802_11_reset {
434 struct cmd_header hdr;
435
436 __le16 action;
437};
438
439struct cmd_ds_802_11_beacon_control {
440 struct cmd_header hdr;
441
442 __le16 action;
443 __le16 beacon_enable;
444 __le16 beacon_period;
445};
446
447struct cmd_ds_802_11_beacon_set {
448 struct cmd_header hdr;
449
450 __le16 len;
451 u8 beacon[MRVL_MAX_BCN_SIZE];
452};
453
454struct lbtf_private;
455struct cmd_ctrl_node;
456
457/** Function Prototype Declaration */
458void lbtf_set_mac_control(struct lbtf_private *priv);
459
460int lbtf_free_cmd_buffer(struct lbtf_private *priv);
461
462int lbtf_allocate_cmd_buffer(struct lbtf_private *priv);
463int lbtf_execute_next_command(struct lbtf_private *priv);
464int lbtf_set_radio_control(struct lbtf_private *priv);
465int lbtf_update_hw_spec(struct lbtf_private *priv);
466int lbtf_cmd_set_mac_multicast_addr(struct lbtf_private *priv);
467void lbtf_set_mode(struct lbtf_private *priv, enum lbtf_mode mode);
5f936f11 468void lbtf_set_bssid(struct lbtf_private *priv, bool activate, const u8 *bssid);
7670e62c
LCC
469int lbtf_set_mac_address(struct lbtf_private *priv, uint8_t *mac_addr);
470
471int lbtf_set_channel(struct lbtf_private *priv, u8 channel);
472
473int lbtf_beacon_set(struct lbtf_private *priv, struct sk_buff *beacon);
474int lbtf_beacon_ctrl(struct lbtf_private *priv, bool beacon_enable,
475 int beacon_int);
476
477
478int lbtf_process_rx_command(struct lbtf_private *priv);
479void lbtf_complete_command(struct lbtf_private *priv, struct cmd_ctrl_node *cmd,
480 int result);
481void lbtf_cmd_response_rx(struct lbtf_private *priv);
482
483/* main.c */
484struct chan_freq_power *lbtf_get_region_cfp_table(u8 region,
485 int *cfp_no);
486struct lbtf_private *lbtf_add_card(void *card, struct device *dmdev);
487int lbtf_remove_card(struct lbtf_private *priv);
488int lbtf_start_card(struct lbtf_private *priv);
489int lbtf_rx(struct lbtf_private *priv, struct sk_buff *skb);
490void lbtf_send_tx_feedback(struct lbtf_private *priv, u8 retrycnt, u8 fail);
491void lbtf_bcn_sent(struct lbtf_private *priv);
492
493/* support functions for cmd.c */
494/* lbtf_cmd() infers the size of the buffer to copy data back into, from
495 the size of the target of the pointer. Since the command to be sent
496 may often be smaller, that size is set in cmd->size by the caller.*/
497#define lbtf_cmd(priv, cmdnr, cmd, cb, cb_arg) ({ \
498 uint16_t __sz = le16_to_cpu((cmd)->hdr.size); \
499 (cmd)->hdr.size = cpu_to_le16(sizeof(*(cmd))); \
500 __lbtf_cmd(priv, cmdnr, &(cmd)->hdr, __sz, cb, cb_arg); \
501})
502
503#define lbtf_cmd_with_response(priv, cmdnr, cmd) \
504 lbtf_cmd(priv, cmdnr, cmd, lbtf_cmd_copyback, (unsigned long) (cmd))
505
506void lbtf_cmd_async(struct lbtf_private *priv, uint16_t command,
507 struct cmd_header *in_cmd, int in_cmd_size);
508
509int __lbtf_cmd(struct lbtf_private *priv, uint16_t command,
510 struct cmd_header *in_cmd, int in_cmd_size,
511 int (*callback)(struct lbtf_private *, unsigned long,
512 struct cmd_header *),
513 unsigned long callback_arg);
514
515int lbtf_cmd_copyback(struct lbtf_private *priv, unsigned long extra,
516 struct cmd_header *resp);