2 * Copyright (C) 2008, cozybit Inc.
3 * Copyright (C) 2007, Red Hat, Inc.
4 * Copyright (C) 2003-2006, Marvell International Ltd.
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.
11 #include <linux/spinlock.h>
12 #include <linux/device.h>
13 #include <linux/kthread.h>
14 #include <net/mac80211.h>
19 #define DRV_NAME "libertas_tf"
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
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...
30 #define CMD_RET(cmd) (0x8000 | cmd)
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
47 #define CMD_ACT_GET 0x0000
48 #define CMD_ACT_SET 0x0001
50 /* Define action or option for CMD_802_11_RESET */
51 #define CMD_ACT_HALT 0x0003
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
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
66 #define TURN_ON_RF 0x01
68 #define RADIO_OFF 0x00
70 #define SET_AUTO_PREAMBLE 0x05
71 #define SET_SHORT_PREAMBLE 0x03
72 #define SET_LONG_PREAMBLE 0x01
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
78 /* Codes for CMD_802_11_SET_MODE */
85 /** Card Event definition */
86 #define MACREG_INT_CODE_FIRMWARE_READY 48
87 /** Buffer Constants */
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.
95 * Current version of MAC has a 32x6 multicast address buffer.
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.
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
107 #define LBS_UPLD_SIZE 2312
108 #define DEV_NAME_LEN 32
110 /** Misc constants */
111 /* This section defines 802.11 specific contants */
113 #define MRVDRV_MAX_REGION_CODE 6
115 * the table to keep region code
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
124 #define SBI_EVENT_CAUSE_SHIFT 3
128 #define MRVDRV_RXPD_STATUS_OK 0x0001
131 /* This is for firmware specific length */
134 #define MRVDRV_ETH_TX_PACKET_BUFFER_SIZE \
135 (ETH_FRAME_LEN + sizeof(struct txpd) + EXTRA_LEN)
137 #define MRVDRV_ETH_RX_PACKET_BUFFER_SIZE \
138 (ETH_FRAME_LEN + sizeof(struct rxpd) \
139 + MRVDRV_SNAP_HEADER_LEN + EXTRA_LEN)
141 #define CMD_F_HOSTCMD (1 << 0)
142 #define FW_CAPINFO_WPA (1 << 0)
144 #define RF_ANTENNA_1 0x1
145 #define RF_ANTENNA_2 0x2
146 #define RF_ANTENNA_AUTO 0xFFFF
148 #define LBTF_EVENT_BCN_SENT 55
150 /** Global Variable Declaration */
159 extern struct workqueue_struct
*lbtf_wq
;
163 struct lbtf_offset_value
{
168 struct channel_range
{
171 u8 end
; /* exclusive (channel must be less than end) */
176 /** Private structure for the MV device */
177 struct lbtf_private
{
179 struct ieee80211_hw
*hw
;
181 /* Command response buffer */
182 u8 cmd_resp_buff
[LBS_UPLD_SIZE
];
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
;
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
);
197 /** Wlan adapter data structure*/
198 /** STATUS variables */
201 /* protected with big lock */
205 /** command-related variables */
207 /* protected by big lock */
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
;
219 spinlock_t driver_lock
;
222 struct timer_list command_timer
;
226 u8 cmd_response_rxed
;
228 /** capability Info used in Association, start, join */
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
;
237 struct sk_buff
*skb_to_tx
;
238 struct sk_buff
*tx_skb
;
240 /** NIC Operation characteristics */
243 struct channel_range range
;
248 struct ieee80211_channel channels
[14];
249 struct ieee80211_rate rates
[12];
250 struct ieee80211_supported_band band
;
251 struct lbtf_offset_value offsetvalue
;
255 struct sk_buff_head bc_ps_buf
;
257 /* Most recently reported noise in dBm */
261 /* 802.11-related definitions */
263 /* TxPD descriptor */
265 /* Current Tx packet status */
269 __le32 tx_packet_location
;
270 /* Tx packet length */
271 __le16 tx_packet_length
;
272 /* First 2 byte of destination MAC address */
273 u8 tx_dest_addr_high
[2];
274 /* Last 4 byte of destination MAC address */
275 u8 tx_dest_addr_low
[4];
278 /* Pkt Trasnit Power control */
280 /* Time the packet has been queued in the driver (units = 2ms) */
286 /* RxPD Descriptor */
288 /* Current Rx packet status */
309 /* Next Rx RxPD addr */
310 __le32 next_rxpd_ptr
;
324 struct cmd_ctrl_node
{
325 struct list_head list
;
327 /* command response */
328 int (*callback
)(struct lbtf_private
*,
329 unsigned long, struct cmd_header
*);
330 unsigned long callback_arg
;
332 struct cmd_header
*cmdbuf
;
335 wait_queue_head_t cmdwait_q
;
339 * Define data structure for CMD_GET_HW_SPEC
340 * This structure defines the response for the GET_HW_SPEC command
342 struct cmd_ds_get_hw_spec
{
343 struct cmd_header hdr
;
345 /* HW Interface version number */
347 /* HW version number */
349 /* Max number of TxPD FW can handle */
351 /* Max no of Multicast address */
359 /* Number of antenna used */
362 /* FW release number, example 0x01030304 = 2.3.4p1 */
365 /* Base Address of TxPD queue */
367 /* Read Pointer of RxPd queue */
370 /* Write Pointer of RxPd queue */
373 /*FW/HW capability */
377 struct cmd_ds_mac_control
{
378 struct cmd_header hdr
;
383 struct cmd_ds_802_11_mac_address
{
384 struct cmd_header hdr
;
387 uint8_t macadd
[ETH_ALEN
];
390 struct cmd_ds_mac_multicast_addr
{
391 struct cmd_header hdr
;
395 u8 maclist
[ETH_ALEN
* MRVDRV_MAX_MULTICAST_LIST_SIZE
];
398 struct cmd_ds_set_mode
{
399 struct cmd_header hdr
;
404 struct cmd_ds_set_bssid
{
405 struct cmd_header hdr
;
411 struct cmd_ds_802_11_radio_control
{
412 struct cmd_header hdr
;
419 struct cmd_ds_802_11_rf_channel
{
420 struct cmd_header hdr
;
424 __le16 rftype
; /* unused */
425 __le16 reserved
; /* unused */
426 u8 channellist
[32]; /* unused */
429 struct cmd_ds_set_boot2_ver
{
430 struct cmd_header hdr
;
436 struct cmd_ds_802_11_reset
{
437 struct cmd_header hdr
;
442 struct cmd_ds_802_11_beacon_control
{
443 struct cmd_header hdr
;
446 __le16 beacon_enable
;
447 __le16 beacon_period
;
450 struct cmd_ds_802_11_beacon_set
{
451 struct cmd_header hdr
;
454 u8 beacon
[MRVL_MAX_BCN_SIZE
];
458 struct cmd_ctrl_node
;
460 /** Function Prototype Declaration */
461 void lbtf_set_mac_control(struct lbtf_private
*priv
);
463 int lbtf_free_cmd_buffer(struct lbtf_private
*priv
);
465 int lbtf_allocate_cmd_buffer(struct lbtf_private
*priv
);
466 int lbtf_execute_next_command(struct lbtf_private
*priv
);
467 int lbtf_set_radio_control(struct lbtf_private
*priv
);
468 int lbtf_update_hw_spec(struct lbtf_private
*priv
);
469 int lbtf_cmd_set_mac_multicast_addr(struct lbtf_private
*priv
);
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
);
472 int lbtf_set_mac_address(struct lbtf_private
*priv
, uint8_t *mac_addr
);
474 int lbtf_set_channel(struct lbtf_private
*priv
, u8 channel
);
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
,
481 int lbtf_process_rx_command(struct lbtf_private
*priv
);
482 void lbtf_complete_command(struct lbtf_private
*priv
, struct cmd_ctrl_node
*cmd
,
484 void lbtf_cmd_response_rx(struct lbtf_private
*priv
);
487 struct chan_freq_power
*lbtf_get_region_cfp_table(u8 region
,
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
);
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); \
506 #define lbtf_cmd_with_response(priv, cmdnr, cmd) \
507 lbtf_cmd(priv, cmdnr, cmd, lbtf_cmd_copyback, (unsigned long) (cmd))
509 void lbtf_cmd_async(struct lbtf_private
*priv
, uint16_t command
,
510 struct cmd_header
*in_cmd
, int in_cmd_size
);
512 int __lbtf_cmd(struct lbtf_private
*priv
, uint16_t command
,
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
);
518 int lbtf_cmd_copyback(struct lbtf_private
*priv
, unsigned long extra
,
519 struct cmd_header
*resp
);