xref: /openbmc/linux/drivers/net/wireless/marvell/libertas_tf/libertas_tf.h (revision 03ab8e6297acd1bc0eedaa050e2a1635c576fd11)
12874c5fdSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
2dd3f92deSKalle Valo /*
3dd3f92deSKalle Valo  *  Copyright (C) 2008, cozybit Inc.
4dd3f92deSKalle Valo  *  Copyright (C) 2007, Red Hat, Inc.
5dd3f92deSKalle Valo  *  Copyright (C) 2003-2006, Marvell International Ltd.
6dd3f92deSKalle Valo  */
7dd3f92deSKalle Valo #include <linux/spinlock.h>
8dd3f92deSKalle Valo #include <linux/device.h>
9dd3f92deSKalle Valo #include <linux/kthread.h>
10dd3f92deSKalle Valo #include <net/mac80211.h>
11dd3f92deSKalle Valo 
12dd3f92deSKalle Valo #include "deb_defs.h"
13dd3f92deSKalle Valo 
14dd3f92deSKalle Valo #ifndef DRV_NAME
15dd3f92deSKalle Valo #define DRV_NAME "libertas_tf"
16dd3f92deSKalle Valo #endif
17dd3f92deSKalle Valo 
18dd3f92deSKalle Valo #define	MRVL_DEFAULT_RETRIES			9
19dd3f92deSKalle Valo #define MRVL_PER_PACKET_RATE			0x10
20dd3f92deSKalle Valo #define MRVL_MAX_BCN_SIZE			440
21dd3f92deSKalle Valo #define CMD_OPTION_WAITFORRSP			0x0002
22dd3f92deSKalle Valo 
23dd3f92deSKalle Valo /* Return command are almost always the same as the host command, but with
24dd3f92deSKalle Valo  * bit 15 set high.  There are a few exceptions, though...
25dd3f92deSKalle Valo  */
26dd3f92deSKalle Valo #define CMD_RET(cmd)			(0x8000 | cmd)
27dd3f92deSKalle Valo 
28dd3f92deSKalle Valo /* Command codes */
29dd3f92deSKalle Valo #define CMD_GET_HW_SPEC				0x0003
30dd3f92deSKalle Valo #define CMD_802_11_RESET			0x0005
31dd3f92deSKalle Valo #define CMD_MAC_MULTICAST_ADR			0x0010
32dd3f92deSKalle Valo #define CMD_802_11_RADIO_CONTROL		0x001c
33dd3f92deSKalle Valo #define CMD_802_11_RF_CHANNEL			0x001d
34dd3f92deSKalle Valo #define CMD_802_11_RF_TX_POWER			0x001e
35dd3f92deSKalle Valo #define CMD_MAC_CONTROL				0x0028
36dd3f92deSKalle Valo #define CMD_802_11_MAC_ADDRESS			0x004d
37dd3f92deSKalle Valo #define	CMD_SET_BOOT2_VER			0x00a5
38dd3f92deSKalle Valo #define CMD_802_11_BEACON_CTRL			0x00b0
39dd3f92deSKalle Valo #define CMD_802_11_BEACON_SET			0x00cb
40dd3f92deSKalle Valo #define CMD_802_11_SET_MODE			0x00cc
41dd3f92deSKalle Valo #define CMD_802_11_SET_BSSID			0x00cd
42dd3f92deSKalle Valo 
43dd3f92deSKalle Valo #define CMD_ACT_GET			0x0000
44dd3f92deSKalle Valo #define CMD_ACT_SET			0x0001
45dd3f92deSKalle Valo 
46dd3f92deSKalle Valo /* Define action or option for CMD_802_11_RESET */
47dd3f92deSKalle Valo #define CMD_ACT_HALT			0x0003
48dd3f92deSKalle Valo 
49dd3f92deSKalle Valo /* Define action or option for CMD_MAC_CONTROL */
50dd3f92deSKalle Valo #define CMD_ACT_MAC_RX_ON			0x0001
51dd3f92deSKalle Valo #define CMD_ACT_MAC_TX_ON			0x0002
52dd3f92deSKalle Valo #define CMD_ACT_MAC_MULTICAST_ENABLE		0x0020
53dd3f92deSKalle Valo #define CMD_ACT_MAC_BROADCAST_ENABLE		0x0040
54dd3f92deSKalle Valo #define CMD_ACT_MAC_PROMISCUOUS_ENABLE		0x0080
55dd3f92deSKalle Valo #define CMD_ACT_MAC_ALL_MULTICAST_ENABLE	0x0100
56dd3f92deSKalle Valo 
57dd3f92deSKalle Valo /* Define action or option for CMD_802_11_RADIO_CONTROL */
58dd3f92deSKalle Valo #define CMD_TYPE_AUTO_PREAMBLE		0x0001
59dd3f92deSKalle Valo #define CMD_TYPE_SHORT_PREAMBLE		0x0002
60dd3f92deSKalle Valo #define CMD_TYPE_LONG_PREAMBLE		0x0003
61dd3f92deSKalle Valo 
62dd3f92deSKalle Valo #define TURN_ON_RF			0x01
63dd3f92deSKalle Valo #define RADIO_ON			0x01
64dd3f92deSKalle Valo #define RADIO_OFF			0x00
65dd3f92deSKalle Valo 
66dd3f92deSKalle Valo #define SET_AUTO_PREAMBLE		0x05
67dd3f92deSKalle Valo #define SET_SHORT_PREAMBLE		0x03
68dd3f92deSKalle Valo #define SET_LONG_PREAMBLE		0x01
69dd3f92deSKalle Valo 
70dd3f92deSKalle Valo /* Define action or option for CMD_802_11_RF_CHANNEL */
71dd3f92deSKalle Valo #define CMD_OPT_802_11_RF_CHANNEL_GET	0x00
72dd3f92deSKalle Valo #define CMD_OPT_802_11_RF_CHANNEL_SET	0x01
73dd3f92deSKalle Valo 
74dd3f92deSKalle Valo /* Codes for CMD_802_11_SET_MODE */
75dd3f92deSKalle Valo enum lbtf_mode {
76dd3f92deSKalle Valo 	LBTF_PASSIVE_MODE,
77dd3f92deSKalle Valo 	LBTF_STA_MODE,
78dd3f92deSKalle Valo 	LBTF_AP_MODE,
79dd3f92deSKalle Valo };
80dd3f92deSKalle Valo 
81dd3f92deSKalle Valo /** Card Event definition */
82dd3f92deSKalle Valo #define MACREG_INT_CODE_FIRMWARE_READY		48
83dd3f92deSKalle Valo /** Buffer Constants */
84dd3f92deSKalle Valo 
85dd3f92deSKalle Valo /*	The size of SQ memory PPA, DPA are 8 DWORDs, that keep the physical
86dd3f92deSKalle Valo *	addresses of TxPD buffers. Station has only 8 TxPD available, Whereas
87dd3f92deSKalle Valo *	driver has more local TxPDs. Each TxPD on the host memory is associated
88dd3f92deSKalle Valo *	with a Tx control node. The driver maintains 8 RxPD descriptors for
89dd3f92deSKalle Valo *	station firmware to store Rx packet information.
90dd3f92deSKalle Valo *
91dd3f92deSKalle Valo *	Current version of MAC has a 32x6 multicast address buffer.
92dd3f92deSKalle Valo *
93dd3f92deSKalle Valo *	802.11b can have up to  14 channels, the driver keeps the
94dd3f92deSKalle Valo *	BSSID(MAC address) of each APs or Ad hoc stations it has sensed.
95dd3f92deSKalle Valo */
96dd3f92deSKalle Valo 
97dd3f92deSKalle Valo #define MRVDRV_MAX_MULTICAST_LIST_SIZE	32
98dd3f92deSKalle Valo #define LBS_NUM_CMD_BUFFERS             10
99dd3f92deSKalle Valo #define LBS_CMD_BUFFER_SIZE             (2 * 1024)
100dd3f92deSKalle Valo #define MRVDRV_MAX_CHANNEL_SIZE		14
101dd3f92deSKalle Valo #define MRVDRV_SNAP_HEADER_LEN          8
102dd3f92deSKalle Valo 
103dd3f92deSKalle Valo #define	LBS_UPLD_SIZE			2312
104dd3f92deSKalle Valo #define DEV_NAME_LEN			32
105dd3f92deSKalle Valo 
106dd3f92deSKalle Valo /** Misc constants */
107dd3f92deSKalle Valo /* This section defines 802.11 specific contants */
108dd3f92deSKalle Valo 
109dd3f92deSKalle Valo #define MRVDRV_MAX_REGION_CODE			6
110dd3f92deSKalle Valo /**
111dd3f92deSKalle Valo  * the table to keep region code
112dd3f92deSKalle Valo  */
113dd3f92deSKalle Valo #define LBTF_REGDOMAIN_US	0x10
114dd3f92deSKalle Valo #define LBTF_REGDOMAIN_CA	0x20
115dd3f92deSKalle Valo #define LBTF_REGDOMAIN_EU	0x30
116dd3f92deSKalle Valo #define LBTF_REGDOMAIN_SP	0x31
117dd3f92deSKalle Valo #define LBTF_REGDOMAIN_FR	0x32
118dd3f92deSKalle Valo #define LBTF_REGDOMAIN_JP	0x40
119dd3f92deSKalle Valo 
120dd3f92deSKalle Valo #define SBI_EVENT_CAUSE_SHIFT		3
121dd3f92deSKalle Valo 
122dd3f92deSKalle Valo /** RxPD status */
123dd3f92deSKalle Valo 
124dd3f92deSKalle Valo #define MRVDRV_RXPD_STATUS_OK                0x0001
125dd3f92deSKalle Valo 
126dd3f92deSKalle Valo 
127dd3f92deSKalle Valo /* This is for firmware specific length */
128dd3f92deSKalle Valo #define EXTRA_LEN	36
129dd3f92deSKalle Valo 
130dd3f92deSKalle Valo #define MRVDRV_ETH_TX_PACKET_BUFFER_SIZE \
131dd3f92deSKalle Valo 	(ETH_FRAME_LEN + sizeof(struct txpd) + EXTRA_LEN)
132dd3f92deSKalle Valo 
133dd3f92deSKalle Valo #define MRVDRV_ETH_RX_PACKET_BUFFER_SIZE \
134dd3f92deSKalle Valo 	(ETH_FRAME_LEN + sizeof(struct rxpd) \
135dd3f92deSKalle Valo 	 + MRVDRV_SNAP_HEADER_LEN + EXTRA_LEN)
136dd3f92deSKalle Valo 
137dd3f92deSKalle Valo #define	CMD_F_HOSTCMD		(1 << 0)
138dd3f92deSKalle Valo #define FW_CAPINFO_WPA  	(1 << 0)
139dd3f92deSKalle Valo 
140dd3f92deSKalle Valo #define RF_ANTENNA_1		0x1
141dd3f92deSKalle Valo #define RF_ANTENNA_2		0x2
142dd3f92deSKalle Valo #define RF_ANTENNA_AUTO		0xFFFF
143dd3f92deSKalle Valo 
144dd3f92deSKalle Valo #define LBTF_EVENT_BCN_SENT	55
145dd3f92deSKalle Valo 
146dd3f92deSKalle Valo /** Global Variable Declaration */
147dd3f92deSKalle Valo /** mv_ms_type */
148dd3f92deSKalle Valo enum mv_ms_type {
149dd3f92deSKalle Valo 	MVMS_DAT = 0,
150dd3f92deSKalle Valo 	MVMS_CMD = 1,
151dd3f92deSKalle Valo 	MVMS_TXDONE = 2,
152dd3f92deSKalle Valo 	MVMS_EVENT
153dd3f92deSKalle Valo };
154dd3f92deSKalle Valo 
155dd3f92deSKalle Valo extern struct workqueue_struct *lbtf_wq;
156dd3f92deSKalle Valo 
157dd3f92deSKalle Valo struct lbtf_private;
158dd3f92deSKalle Valo 
159dd3f92deSKalle Valo struct lbtf_offset_value {
160dd3f92deSKalle Valo 	u32 offset;
161dd3f92deSKalle Valo 	u32 value;
162dd3f92deSKalle Valo };
163dd3f92deSKalle Valo 
164dd3f92deSKalle Valo struct channel_range {
165dd3f92deSKalle Valo 	u8 regdomain;
166dd3f92deSKalle Valo 	u8 start;
167dd3f92deSKalle Valo 	u8 end; /* exclusive (channel must be less than end) */
168dd3f92deSKalle Valo };
169dd3f92deSKalle Valo 
170dd3f92deSKalle Valo struct if_usb_card;
171dd3f92deSKalle Valo 
172be9d0d3fSLubomir Rintel struct lbtf_ops {
173be9d0d3fSLubomir Rintel 	/** Hardware access */
174be9d0d3fSLubomir Rintel 	int (*hw_host_to_card)(struct lbtf_private *priv, u8 type,
175be9d0d3fSLubomir Rintel 			       u8 *payload, u16 nb);
176baa0280fSLubomir Rintel 	int (*hw_prog_firmware)(struct lbtf_private *priv);
177baa0280fSLubomir Rintel 	int (*hw_reset_device)(struct lbtf_private *priv);
178be9d0d3fSLubomir Rintel };
179be9d0d3fSLubomir Rintel 
180dd3f92deSKalle Valo /** Private structure for the MV device */
181dd3f92deSKalle Valo struct lbtf_private {
182dd3f92deSKalle Valo 	void *card;
183dd3f92deSKalle Valo 	struct ieee80211_hw *hw;
184be9d0d3fSLubomir Rintel 	const struct lbtf_ops *ops;
185dd3f92deSKalle Valo 
186dd3f92deSKalle Valo 	/* Command response buffer */
187dd3f92deSKalle Valo 	u8 cmd_resp_buff[LBS_UPLD_SIZE];
188dd3f92deSKalle Valo 	/* Download sent:
189dd3f92deSKalle Valo 	   bit0 1/0=data_sent/data_tx_done,
190dd3f92deSKalle Valo 	   bit1 1/0=cmd_sent/cmd_tx_done,
191dd3f92deSKalle Valo 	   all other bits reserved 0 */
192dd3f92deSKalle Valo 	struct ieee80211_vif *vif;
193dd3f92deSKalle Valo 
194dd3f92deSKalle Valo 	struct work_struct cmd_work;
195dd3f92deSKalle Valo 	struct work_struct tx_work;
196dd3f92deSKalle Valo 
197dd3f92deSKalle Valo 	/** Wlan adapter data structure*/
198dd3f92deSKalle Valo 	/** STATUS variables */
199dd3f92deSKalle Valo 	u32 fwrelease;
200dd3f92deSKalle Valo 	u32 fwcapinfo;
201dd3f92deSKalle Valo 	/* protected with big lock */
202dd3f92deSKalle Valo 
203dd3f92deSKalle Valo 	struct mutex lock;
204dd3f92deSKalle Valo 
205dd3f92deSKalle Valo 	/** command-related variables */
206dd3f92deSKalle Valo 	u16 seqnum;
207dd3f92deSKalle Valo 	/* protected by big lock */
208dd3f92deSKalle Valo 
209dd3f92deSKalle Valo 	struct cmd_ctrl_node *cmd_array;
210dd3f92deSKalle Valo 	/** Current command */
211dd3f92deSKalle Valo 	struct cmd_ctrl_node *cur_cmd;
212dd3f92deSKalle Valo 	/** command Queues */
213dd3f92deSKalle Valo 	/** Free command buffers */
214dd3f92deSKalle Valo 	struct list_head cmdfreeq;
215dd3f92deSKalle Valo 	/** Pending command buffers */
216dd3f92deSKalle Valo 	struct list_head cmdpendingq;
217dd3f92deSKalle Valo 
218dd3f92deSKalle Valo 	/** spin locks */
219dd3f92deSKalle Valo 	spinlock_t driver_lock;
220dd3f92deSKalle Valo 
221dd3f92deSKalle Valo 	/** Timers */
222dd3f92deSKalle Valo 	struct timer_list command_timer;
223dd3f92deSKalle Valo 	int nr_retries;
224dd3f92deSKalle Valo 	int cmd_timed_out;
225dd3f92deSKalle Valo 
226dd3f92deSKalle Valo 	u8 cmd_response_rxed;
227dd3f92deSKalle Valo 
228dd3f92deSKalle Valo 	/** capability Info used in Association, start, join */
229dd3f92deSKalle Valo 	u16 capability;
230dd3f92deSKalle Valo 
231dd3f92deSKalle Valo 	/** MAC address information */
232dd3f92deSKalle Valo 	u8 current_addr[ETH_ALEN];
233dd3f92deSKalle Valo 	u8 multicastlist[MRVDRV_MAX_MULTICAST_LIST_SIZE][ETH_ALEN];
234dd3f92deSKalle Valo 	u32 nr_of_multicastmacaddr;
235dd3f92deSKalle Valo 	int cur_freq;
236dd3f92deSKalle Valo 
237dd3f92deSKalle Valo 	struct sk_buff *skb_to_tx;
238dd3f92deSKalle Valo 	struct sk_buff *tx_skb;
239dd3f92deSKalle Valo 
240dd3f92deSKalle Valo 	/** NIC Operation characteristics */
241dd3f92deSKalle Valo 	u16 mac_control;
242dd3f92deSKalle Valo 	u16 regioncode;
243dd3f92deSKalle Valo 	struct channel_range range;
244dd3f92deSKalle Valo 
245dd3f92deSKalle Valo 	u8 radioon;
246dd3f92deSKalle Valo 	u32 preamble;
247dd3f92deSKalle Valo 
248dd3f92deSKalle Valo 	struct ieee80211_channel channels[14];
249dd3f92deSKalle Valo 	struct ieee80211_rate rates[12];
250dd3f92deSKalle Valo 	struct ieee80211_supported_band band;
251dd3f92deSKalle Valo 	struct lbtf_offset_value offsetvalue;
252dd3f92deSKalle Valo 
253dd3f92deSKalle Valo 	u8 surpriseremoved;
254dd3f92deSKalle Valo 	struct sk_buff_head bc_ps_buf;
255dd3f92deSKalle Valo 
256dd3f92deSKalle Valo 	/* Most recently reported noise in dBm */
257dd3f92deSKalle Valo 	s8 noise;
258dd3f92deSKalle Valo };
259dd3f92deSKalle Valo 
260dd3f92deSKalle Valo /* 802.11-related definitions */
261dd3f92deSKalle Valo 
262dd3f92deSKalle Valo /* TxPD descriptor */
263dd3f92deSKalle Valo struct txpd {
264dd3f92deSKalle Valo 	/* Current Tx packet status */
265dd3f92deSKalle Valo 	__le32 tx_status;
266dd3f92deSKalle Valo 	/* Tx control */
267dd3f92deSKalle Valo 	__le32 tx_control;
268dd3f92deSKalle Valo 	__le32 tx_packet_location;
269dd3f92deSKalle Valo 	/* Tx packet length */
270dd3f92deSKalle Valo 	__le16 tx_packet_length;
271*05db148eSKees Cook 	struct_group_attr(tx_dest_addr, __packed,
272dd3f92deSKalle Valo 		/* First 2 byte of destination MAC address */
273dd3f92deSKalle Valo 		u8 tx_dest_addr_high[2];
274dd3f92deSKalle Valo 		/* Last 4 byte of destination MAC address */
275dd3f92deSKalle Valo 		u8 tx_dest_addr_low[4];
276642a5747SKees Cook 	);
277dd3f92deSKalle Valo 	/* Pkt Priority */
278dd3f92deSKalle Valo 	u8 priority;
279dd3f92deSKalle Valo 	/* Pkt Trasnit Power control */
280dd3f92deSKalle Valo 	u8 powermgmt;
281dd3f92deSKalle Valo 	/* Time the packet has been queued in the driver (units = 2ms) */
282dd3f92deSKalle Valo 	u8 pktdelay_2ms;
283dd3f92deSKalle Valo 	/* reserved */
284dd3f92deSKalle Valo 	u8 reserved1;
285*05db148eSKees Cook } __packed;
286dd3f92deSKalle Valo 
287dd3f92deSKalle Valo /* RxPD Descriptor */
288dd3f92deSKalle Valo struct rxpd {
289dd3f92deSKalle Valo 	/* Current Rx packet status */
290dd3f92deSKalle Valo 	__le16 status;
291dd3f92deSKalle Valo 
292dd3f92deSKalle Valo 	/* SNR */
293dd3f92deSKalle Valo 	u8 snr;
294dd3f92deSKalle Valo 
295dd3f92deSKalle Valo 	/* Tx control */
296dd3f92deSKalle Valo 	u8 rx_control;
297dd3f92deSKalle Valo 
298dd3f92deSKalle Valo 	/* Pkt length */
299dd3f92deSKalle Valo 	__le16 pkt_len;
300dd3f92deSKalle Valo 
301dd3f92deSKalle Valo 	/* Noise Floor */
302dd3f92deSKalle Valo 	u8 nf;
303dd3f92deSKalle Valo 
304dd3f92deSKalle Valo 	/* Rx Packet Rate */
305dd3f92deSKalle Valo 	u8 rx_rate;
306dd3f92deSKalle Valo 
307dd3f92deSKalle Valo 	/* Pkt addr */
308dd3f92deSKalle Valo 	__le32 pkt_ptr;
309dd3f92deSKalle Valo 
310dd3f92deSKalle Valo 	/* Next Rx RxPD addr */
311dd3f92deSKalle Valo 	__le32 next_rxpd_ptr;
312dd3f92deSKalle Valo 
313dd3f92deSKalle Valo 	/* Pkt Priority */
314dd3f92deSKalle Valo 	u8 priority;
315dd3f92deSKalle Valo 	u8 reserved[3];
316*05db148eSKees Cook } __packed;
317dd3f92deSKalle Valo 
318dd3f92deSKalle Valo struct cmd_header {
319dd3f92deSKalle Valo 	__le16 command;
320dd3f92deSKalle Valo 	__le16 size;
321dd3f92deSKalle Valo 	__le16 seqnum;
322dd3f92deSKalle Valo 	__le16 result;
323dd3f92deSKalle Valo } __packed;
324dd3f92deSKalle Valo 
325dd3f92deSKalle Valo struct cmd_ctrl_node {
326dd3f92deSKalle Valo 	struct list_head list;
327dd3f92deSKalle Valo 	int result;
328dd3f92deSKalle Valo 	/* command response */
329dd3f92deSKalle Valo 	int (*callback)(struct lbtf_private *,
330dd3f92deSKalle Valo 			unsigned long, struct cmd_header *);
331dd3f92deSKalle Valo 	unsigned long callback_arg;
332dd3f92deSKalle Valo 	/* command data */
333dd3f92deSKalle Valo 	struct cmd_header *cmdbuf;
334dd3f92deSKalle Valo 	/* wait queue */
335dd3f92deSKalle Valo 	u16 cmdwaitqwoken;
336dd3f92deSKalle Valo 	wait_queue_head_t cmdwait_q;
337dd3f92deSKalle Valo };
338dd3f92deSKalle Valo 
339dd3f92deSKalle Valo /*
340dd3f92deSKalle Valo  * Define data structure for CMD_GET_HW_SPEC
341dd3f92deSKalle Valo  * This structure defines the response for the GET_HW_SPEC command
342dd3f92deSKalle Valo  */
343dd3f92deSKalle Valo struct cmd_ds_get_hw_spec {
344dd3f92deSKalle Valo 	struct cmd_header hdr;
345dd3f92deSKalle Valo 
346dd3f92deSKalle Valo 	/* HW Interface version number */
347dd3f92deSKalle Valo 	__le16 hwifversion;
348dd3f92deSKalle Valo 	/* HW version number */
349dd3f92deSKalle Valo 	__le16 version;
350dd3f92deSKalle Valo 	/* Max number of TxPD FW can handle */
351dd3f92deSKalle Valo 	__le16 nr_txpd;
352dd3f92deSKalle Valo 	/* Max no of Multicast address */
353dd3f92deSKalle Valo 	__le16 nr_mcast_adr;
354dd3f92deSKalle Valo 	/* MAC address */
355dd3f92deSKalle Valo 	u8 permanentaddr[6];
356dd3f92deSKalle Valo 
357dd3f92deSKalle Valo 	/* region Code */
358dd3f92deSKalle Valo 	__le16 regioncode;
359dd3f92deSKalle Valo 
360dd3f92deSKalle Valo 	/* Number of antenna used */
361dd3f92deSKalle Valo 	__le16 nr_antenna;
362dd3f92deSKalle Valo 
363dd3f92deSKalle Valo 	/* FW release number, example 0x01030304 = 2.3.4p1 */
364dd3f92deSKalle Valo 	__le32 fwrelease;
365dd3f92deSKalle Valo 
366dd3f92deSKalle Valo 	/* Base Address of TxPD queue */
367dd3f92deSKalle Valo 	__le32 wcb_base;
368dd3f92deSKalle Valo 	/* Read Pointer of RxPd queue */
369dd3f92deSKalle Valo 	__le32 rxpd_rdptr;
370dd3f92deSKalle Valo 
371dd3f92deSKalle Valo 	/* Write Pointer of RxPd queue */
372dd3f92deSKalle Valo 	__le32 rxpd_wrptr;
373dd3f92deSKalle Valo 
374dd3f92deSKalle Valo 	/*FW/HW capability */
375dd3f92deSKalle Valo 	__le32 fwcapinfo;
376dd3f92deSKalle Valo } __packed;
377dd3f92deSKalle Valo 
378dd3f92deSKalle Valo struct cmd_ds_mac_control {
379dd3f92deSKalle Valo 	struct cmd_header hdr;
380dd3f92deSKalle Valo 	__le16 action;
381dd3f92deSKalle Valo 	u16 reserved;
382*05db148eSKees Cook } __packed;
383dd3f92deSKalle Valo 
384dd3f92deSKalle Valo struct cmd_ds_802_11_mac_address {
385dd3f92deSKalle Valo 	struct cmd_header hdr;
386dd3f92deSKalle Valo 
387dd3f92deSKalle Valo 	__le16 action;
388dd3f92deSKalle Valo 	uint8_t macadd[ETH_ALEN];
389*05db148eSKees Cook } __packed;
390dd3f92deSKalle Valo 
391dd3f92deSKalle Valo struct cmd_ds_mac_multicast_addr {
392dd3f92deSKalle Valo 	struct cmd_header hdr;
393dd3f92deSKalle Valo 
394dd3f92deSKalle Valo 	__le16 action;
395dd3f92deSKalle Valo 	__le16 nr_of_adrs;
396dd3f92deSKalle Valo 	u8 maclist[ETH_ALEN * MRVDRV_MAX_MULTICAST_LIST_SIZE];
397*05db148eSKees Cook } __packed;
398dd3f92deSKalle Valo 
399dd3f92deSKalle Valo struct cmd_ds_set_mode {
400dd3f92deSKalle Valo 	struct cmd_header hdr;
401dd3f92deSKalle Valo 
402dd3f92deSKalle Valo 	__le16 mode;
403*05db148eSKees Cook } __packed;
404dd3f92deSKalle Valo 
405dd3f92deSKalle Valo struct cmd_ds_set_bssid {
406dd3f92deSKalle Valo 	struct cmd_header hdr;
407dd3f92deSKalle Valo 
408dd3f92deSKalle Valo 	u8 bssid[6];
409dd3f92deSKalle Valo 	u8 activate;
410*05db148eSKees Cook } __packed;
411dd3f92deSKalle Valo 
412dd3f92deSKalle Valo struct cmd_ds_802_11_radio_control {
413dd3f92deSKalle Valo 	struct cmd_header hdr;
414dd3f92deSKalle Valo 
415dd3f92deSKalle Valo 	__le16 action;
416dd3f92deSKalle Valo 	__le16 control;
417*05db148eSKees Cook } __packed;
418dd3f92deSKalle Valo 
419dd3f92deSKalle Valo 
420dd3f92deSKalle Valo struct cmd_ds_802_11_rf_channel {
421dd3f92deSKalle Valo 	struct cmd_header hdr;
422dd3f92deSKalle Valo 
423dd3f92deSKalle Valo 	__le16 action;
424dd3f92deSKalle Valo 	__le16 channel;
425dd3f92deSKalle Valo 	__le16 rftype;      /* unused */
426dd3f92deSKalle Valo 	__le16 reserved;    /* unused */
427dd3f92deSKalle Valo 	u8 channellist[32]; /* unused */
428*05db148eSKees Cook } __packed;
429dd3f92deSKalle Valo 
430dd3f92deSKalle Valo struct cmd_ds_set_boot2_ver {
431dd3f92deSKalle Valo 	struct cmd_header hdr;
432dd3f92deSKalle Valo 
433dd3f92deSKalle Valo 	__le16 action;
434dd3f92deSKalle Valo 	__le16 version;
435*05db148eSKees Cook } __packed;
436dd3f92deSKalle Valo 
437dd3f92deSKalle Valo struct cmd_ds_802_11_reset {
438dd3f92deSKalle Valo 	struct cmd_header hdr;
439dd3f92deSKalle Valo 
440dd3f92deSKalle Valo 	__le16 action;
441*05db148eSKees Cook } __packed;
442dd3f92deSKalle Valo 
443dd3f92deSKalle Valo struct cmd_ds_802_11_beacon_control {
444dd3f92deSKalle Valo 	struct cmd_header hdr;
445dd3f92deSKalle Valo 
446dd3f92deSKalle Valo 	__le16 action;
447dd3f92deSKalle Valo 	__le16 beacon_enable;
448dd3f92deSKalle Valo 	__le16 beacon_period;
449*05db148eSKees Cook } __packed;
450dd3f92deSKalle Valo 
451dd3f92deSKalle Valo struct cmd_ds_802_11_beacon_set {
452dd3f92deSKalle Valo 	struct cmd_header hdr;
453dd3f92deSKalle Valo 
454dd3f92deSKalle Valo 	__le16 len;
455dd3f92deSKalle Valo 	u8 beacon[MRVL_MAX_BCN_SIZE];
456*05db148eSKees Cook } __packed;
457dd3f92deSKalle Valo 
458dd3f92deSKalle Valo struct cmd_ctrl_node;
459dd3f92deSKalle Valo 
460dd3f92deSKalle Valo /** Function Prototype Declaration */
461dd3f92deSKalle Valo void lbtf_set_mac_control(struct lbtf_private *priv);
462dd3f92deSKalle Valo 
463dd3f92deSKalle Valo int lbtf_free_cmd_buffer(struct lbtf_private *priv);
464dd3f92deSKalle Valo 
465dd3f92deSKalle Valo int lbtf_allocate_cmd_buffer(struct lbtf_private *priv);
466dd3f92deSKalle Valo int lbtf_execute_next_command(struct lbtf_private *priv);
467dd3f92deSKalle Valo int lbtf_set_radio_control(struct lbtf_private *priv);
468dd3f92deSKalle Valo int lbtf_update_hw_spec(struct lbtf_private *priv);
469dd3f92deSKalle Valo int lbtf_cmd_set_mac_multicast_addr(struct lbtf_private *priv);
470dd3f92deSKalle Valo void lbtf_set_mode(struct lbtf_private *priv, enum lbtf_mode mode);
471dd3f92deSKalle Valo void lbtf_set_bssid(struct lbtf_private *priv, bool activate, const u8 *bssid);
472dd3f92deSKalle Valo int lbtf_set_mac_address(struct lbtf_private *priv, uint8_t *mac_addr);
473dd3f92deSKalle Valo 
474dd3f92deSKalle Valo int lbtf_set_channel(struct lbtf_private *priv, u8 channel);
475dd3f92deSKalle Valo 
476dd3f92deSKalle Valo int lbtf_beacon_set(struct lbtf_private *priv, struct sk_buff *beacon);
477dd3f92deSKalle Valo int lbtf_beacon_ctrl(struct lbtf_private *priv, bool beacon_enable,
478dd3f92deSKalle Valo 		     int beacon_int);
479dd3f92deSKalle Valo 
480dd3f92deSKalle Valo 
481dd3f92deSKalle Valo int lbtf_process_rx_command(struct lbtf_private *priv);
482dd3f92deSKalle Valo void lbtf_complete_command(struct lbtf_private *priv, struct cmd_ctrl_node *cmd,
483dd3f92deSKalle Valo 			  int result);
484dd3f92deSKalle Valo void lbtf_cmd_response_rx(struct lbtf_private *priv);
485dd3f92deSKalle Valo 
486dd3f92deSKalle Valo /* main.c */
487dd3f92deSKalle Valo struct chan_freq_power *lbtf_get_region_cfp_table(u8 region,
488dd3f92deSKalle Valo 	int *cfp_no);
489be9d0d3fSLubomir Rintel struct lbtf_private *lbtf_add_card(void *card, struct device *dmdev,
490be9d0d3fSLubomir Rintel 				   const struct lbtf_ops *ops);
491dd3f92deSKalle Valo int lbtf_remove_card(struct lbtf_private *priv);
492dd3f92deSKalle Valo int lbtf_start_card(struct lbtf_private *priv);
493dd3f92deSKalle Valo int lbtf_rx(struct lbtf_private *priv, struct sk_buff *skb);
494dd3f92deSKalle Valo void lbtf_send_tx_feedback(struct lbtf_private *priv, u8 retrycnt, u8 fail);
495dd3f92deSKalle Valo void lbtf_bcn_sent(struct lbtf_private *priv);
496dd3f92deSKalle Valo 
497dd3f92deSKalle Valo /* support functions for cmd.c */
498dd3f92deSKalle Valo /* lbtf_cmd() infers the size of the buffer to copy data back into, from
499dd3f92deSKalle Valo    the size of the target of the pointer. Since the command to be sent
500dd3f92deSKalle Valo    may often be smaller, that size is set in cmd->size by the caller.*/
501dd3f92deSKalle Valo #define lbtf_cmd(priv, cmdnr, cmd, cb, cb_arg)	({		\
502dd3f92deSKalle Valo 	uint16_t __sz = le16_to_cpu((cmd)->hdr.size);		\
503dd3f92deSKalle Valo 	(cmd)->hdr.size = cpu_to_le16(sizeof(*(cmd)));		\
504dd3f92deSKalle Valo 	__lbtf_cmd(priv, cmdnr, &(cmd)->hdr, __sz, cb, cb_arg);	\
505dd3f92deSKalle Valo })
506dd3f92deSKalle Valo 
507dd3f92deSKalle Valo #define lbtf_cmd_with_response(priv, cmdnr, cmd)	\
508dd3f92deSKalle Valo 	lbtf_cmd(priv, cmdnr, cmd, lbtf_cmd_copyback, (unsigned long) (cmd))
509dd3f92deSKalle Valo 
510dd3f92deSKalle Valo void lbtf_cmd_async(struct lbtf_private *priv, uint16_t command,
511dd3f92deSKalle Valo 	struct cmd_header *in_cmd, int in_cmd_size);
512dd3f92deSKalle Valo 
513dd3f92deSKalle Valo int __lbtf_cmd(struct lbtf_private *priv, uint16_t command,
514dd3f92deSKalle Valo 	      struct cmd_header *in_cmd, int in_cmd_size,
515dd3f92deSKalle Valo 	      int (*callback)(struct lbtf_private *, unsigned long,
516dd3f92deSKalle Valo 			      struct cmd_header *),
517dd3f92deSKalle Valo 	      unsigned long callback_arg);
518dd3f92deSKalle Valo 
519dd3f92deSKalle Valo int lbtf_cmd_copyback(struct lbtf_private *priv, unsigned long extra,
520dd3f92deSKalle Valo 		     struct cmd_header *resp);
521