GNU Linux-libre 5.19-rc6-gnu
[releases.git] / drivers / net / wireless / marvell / libertas_tf / libertas_tf.h
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 chan_freq_power *lbtf_get_region_cfp_table(u8 region,
488         int *cfp_no);
489 struct lbtf_private *lbtf_add_card(void *card, struct device *dmdev,
490                                    const struct lbtf_ops *ops);
491 int lbtf_remove_card(struct lbtf_private *priv);
492 int lbtf_start_card(struct lbtf_private *priv);
493 int lbtf_rx(struct lbtf_private *priv, struct sk_buff *skb);
494 void lbtf_send_tx_feedback(struct lbtf_private *priv, u8 retrycnt, u8 fail);
495 void lbtf_bcn_sent(struct lbtf_private *priv);
496
497 /* support functions for cmd.c */
498 /* lbtf_cmd() infers the size of the buffer to copy data back into, from
499    the size of the target of the pointer. Since the command to be sent
500    may often be smaller, that size is set in cmd->size by the caller.*/
501 #define lbtf_cmd(priv, cmdnr, cmd, cb, cb_arg)  ({              \
502         uint16_t __sz = le16_to_cpu((cmd)->hdr.size);           \
503         (cmd)->hdr.size = cpu_to_le16(sizeof(*(cmd)));          \
504         __lbtf_cmd(priv, cmdnr, &(cmd)->hdr, __sz, cb, cb_arg); \
505 })
506
507 #define lbtf_cmd_with_response(priv, cmdnr, cmd)        \
508         lbtf_cmd(priv, cmdnr, cmd, lbtf_cmd_copyback, (unsigned long) (cmd))
509
510 void lbtf_cmd_async(struct lbtf_private *priv, uint16_t command,
511         struct cmd_header *in_cmd, int in_cmd_size);
512
513 int __lbtf_cmd(struct lbtf_private *priv, uint16_t command,
514               struct cmd_header *in_cmd, int in_cmd_size,
515               int (*callback)(struct lbtf_private *, unsigned long,
516                               struct cmd_header *),
517               unsigned long callback_arg);
518
519 int lbtf_cmd_copyback(struct lbtf_private *priv, unsigned long extra,
520                      struct cmd_header *resp);