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