• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6/drivers/net/wireless/libertas_tf/
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 */
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	/* Most recently reported noise in dBm */
258	s8 noise;
259};
260
261/* 802.11-related definitions */
262
263/* TxPD descriptor */
264struct txpd {
265	/* Current Tx packet status */
266	__le32 tx_status;
267	/* Tx control */
268	__le32 tx_control;
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];
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) */
281	u8 pktdelay_2ms;
282	/* reserved */
283	u8 reserved1;
284};
285
286/* RxPD Descriptor */
287struct 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 */
310	__le32 next_rxpd_ptr;
311
312	/* Pkt Priority */
313	u8 priority;
314	u8 reserved[3];
315};
316
317struct cmd_header {
318	__le16 command;
319	__le16 size;
320	__le16 seqnum;
321	__le16 result;
322} __packed;
323
324struct 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 */
334	u16 cmdwaitqwoken;
335	wait_queue_head_t cmdwait_q;
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 */
342struct cmd_ds_get_hw_spec {
343	struct cmd_header hdr;
344
345	/* HW Interface version number */
346	__le16 hwifversion;
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 */
352	__le16 nr_mcast_adr;
353	/* MAC address */
354	u8 permanentaddr[6];
355
356	/* region Code */
357	__le16 regioncode;
358
359	/* Number of antenna used */
360	__le16 nr_antenna;
361
362	/* FW release number, example 0x01030304 = 2.3.4p1 */
363	__le32 fwrelease;
364
365	/* Base Address of TxPD queue */
366	__le32 wcb_base;
367	/* Read Pointer of RxPd queue */
368	__le32 rxpd_rdptr;
369
370	/* Write Pointer of RxPd queue */
371	__le32 rxpd_wrptr;
372
373	/*FW/HW capability */
374	__le32 fwcapinfo;
375} __packed;
376
377struct cmd_ds_mac_control {
378	struct cmd_header hdr;
379	__le16 action;
380	u16 reserved;
381};
382
383struct cmd_ds_802_11_mac_address {
384	struct cmd_header hdr;
385
386	__le16 action;
387	uint8_t macadd[ETH_ALEN];
388};
389
390struct cmd_ds_mac_multicast_addr {
391	struct cmd_header hdr;
392
393	__le16 action;
394	__le16 nr_of_adrs;
395	u8 maclist[ETH_ALEN * MRVDRV_MAX_MULTICAST_LIST_SIZE];
396};
397
398struct cmd_ds_set_mode {
399	struct cmd_header hdr;
400
401	__le16 mode;
402};
403
404struct cmd_ds_set_bssid {
405	struct cmd_header hdr;
406
407	u8 bssid[6];
408	u8 activate;
409};
410
411struct cmd_ds_802_11_radio_control {
412	struct cmd_header hdr;
413
414	__le16 action;
415	__le16 control;
416};
417
418
419struct cmd_ds_802_11_rf_channel {
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
429struct cmd_ds_set_boot2_ver {
430	struct cmd_header hdr;
431
432	__le16 action;
433	__le16 version;
434};
435
436struct cmd_ds_802_11_reset {
437	struct cmd_header hdr;
438
439	__le16 action;
440};
441
442struct cmd_ds_802_11_beacon_control {
443	struct cmd_header hdr;
444
445	__le16 action;
446	__le16 beacon_enable;
447	__le16 beacon_period;
448};
449
450struct cmd_ds_802_11_beacon_set {
451	struct cmd_header hdr;
452
453	__le16 len;
454	u8 beacon[MRVL_MAX_BCN_SIZE];
455};
456
457struct lbtf_private;
458struct cmd_ctrl_node;
459
460/** Function Prototype Declaration */
461void lbtf_set_mac_control(struct lbtf_private *priv);
462
463int lbtf_free_cmd_buffer(struct lbtf_private *priv);
464
465int lbtf_allocate_cmd_buffer(struct lbtf_private *priv);
466int lbtf_execute_next_command(struct lbtf_private *priv);
467int lbtf_set_radio_control(struct lbtf_private *priv);
468int lbtf_update_hw_spec(struct lbtf_private *priv);
469int lbtf_cmd_set_mac_multicast_addr(struct lbtf_private *priv);
470void lbtf_set_mode(struct lbtf_private *priv, enum lbtf_mode mode);
471void lbtf_set_bssid(struct lbtf_private *priv, bool activate, const u8 *bssid);
472int lbtf_set_mac_address(struct lbtf_private *priv, uint8_t *mac_addr);
473
474int lbtf_set_channel(struct lbtf_private *priv, u8 channel);
475
476int lbtf_beacon_set(struct lbtf_private *priv, struct sk_buff *beacon);
477int lbtf_beacon_ctrl(struct lbtf_private *priv, bool beacon_enable,
478		     int beacon_int);
479
480
481int lbtf_process_rx_command(struct lbtf_private *priv);
482void lbtf_complete_command(struct lbtf_private *priv, struct cmd_ctrl_node *cmd,
483			  int result);
484void lbtf_cmd_response_rx(struct lbtf_private *priv);
485
486/* main.c */
487struct chan_freq_power *lbtf_get_region_cfp_table(u8 region,
488	int *cfp_no);
489struct lbtf_private *lbtf_add_card(void *card, struct device *dmdev);
490int lbtf_remove_card(struct lbtf_private *priv);
491int lbtf_start_card(struct lbtf_private *priv);
492int lbtf_rx(struct lbtf_private *priv, struct sk_buff *skb);
493void lbtf_send_tx_feedback(struct lbtf_private *priv, u8 retrycnt, u8 fail);
494void 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
509void lbtf_cmd_async(struct lbtf_private *priv, uint16_t command,
510	struct cmd_header *in_cmd, int in_cmd_size);
511
512int __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);
517
518int lbtf_cmd_copyback(struct lbtf_private *priv, unsigned long extra,
519		     struct cmd_header *resp);
520