b8f2b12c8c7cd1340b7201b74538980e21ef8885
[platform/adaptation/renesas_rcar/renesas_kernel.git] / drivers / net / wireless / mwl8k.c
1 /*
2  * drivers/net/wireless/mwl8k.c
3  * Driver for Marvell TOPDOG 802.11 Wireless cards
4  *
5  * Copyright (C) 2008, 2009, 2010 Marvell Semiconductor Inc.
6  *
7  * This file is licensed under the terms of the GNU General Public
8  * License version 2.  This program is licensed "as is" without any
9  * warranty of any kind, whether express or implied.
10  */
11
12 #include <linux/init.h>
13 #include <linux/module.h>
14 #include <linux/kernel.h>
15 #include <linux/sched.h>
16 #include <linux/spinlock.h>
17 #include <linux/list.h>
18 #include <linux/pci.h>
19 #include <linux/delay.h>
20 #include <linux/completion.h>
21 #include <linux/etherdevice.h>
22 #include <linux/slab.h>
23 #include <net/mac80211.h>
24 #include <linux/moduleparam.h>
25 #include <linux/firmware.h>
26 #include <linux/workqueue.h>
27
28 #define MWL8K_DESC      "Marvell TOPDOG(R) 802.11 Wireless Network Driver"
29 #define MWL8K_NAME      KBUILD_MODNAME
30 #define MWL8K_VERSION   "0.12"
31
32 /* Module parameters */
33 static unsigned ap_mode_default;
34 module_param(ap_mode_default, bool, 0);
35 MODULE_PARM_DESC(ap_mode_default,
36                  "Set to 1 to make ap mode the default instead of sta mode");
37
38 /* Register definitions */
39 #define MWL8K_HIU_GEN_PTR                       0x00000c10
40 #define  MWL8K_MODE_STA                          0x0000005a
41 #define  MWL8K_MODE_AP                           0x000000a5
42 #define MWL8K_HIU_INT_CODE                      0x00000c14
43 #define  MWL8K_FWSTA_READY                       0xf0f1f2f4
44 #define  MWL8K_FWAP_READY                        0xf1f2f4a5
45 #define  MWL8K_INT_CODE_CMD_FINISHED             0x00000005
46 #define MWL8K_HIU_SCRATCH                       0x00000c40
47
48 /* Host->device communications */
49 #define MWL8K_HIU_H2A_INTERRUPT_EVENTS          0x00000c18
50 #define MWL8K_HIU_H2A_INTERRUPT_STATUS          0x00000c1c
51 #define MWL8K_HIU_H2A_INTERRUPT_MASK            0x00000c20
52 #define MWL8K_HIU_H2A_INTERRUPT_CLEAR_SEL       0x00000c24
53 #define MWL8K_HIU_H2A_INTERRUPT_STATUS_MASK     0x00000c28
54 #define  MWL8K_H2A_INT_DUMMY                     (1 << 20)
55 #define  MWL8K_H2A_INT_RESET                     (1 << 15)
56 #define  MWL8K_H2A_INT_DOORBELL                  (1 << 1)
57 #define  MWL8K_H2A_INT_PPA_READY                 (1 << 0)
58
59 /* Device->host communications */
60 #define MWL8K_HIU_A2H_INTERRUPT_EVENTS          0x00000c2c
61 #define MWL8K_HIU_A2H_INTERRUPT_STATUS          0x00000c30
62 #define MWL8K_HIU_A2H_INTERRUPT_MASK            0x00000c34
63 #define MWL8K_HIU_A2H_INTERRUPT_CLEAR_SEL       0x00000c38
64 #define MWL8K_HIU_A2H_INTERRUPT_STATUS_MASK     0x00000c3c
65 #define  MWL8K_A2H_INT_DUMMY                     (1 << 20)
66 #define  MWL8K_A2H_INT_BA_WATCHDOG               (1 << 14)
67 #define  MWL8K_A2H_INT_CHNL_SWITCHED             (1 << 11)
68 #define  MWL8K_A2H_INT_QUEUE_EMPTY               (1 << 10)
69 #define  MWL8K_A2H_INT_RADAR_DETECT              (1 << 7)
70 #define  MWL8K_A2H_INT_RADIO_ON                  (1 << 6)
71 #define  MWL8K_A2H_INT_RADIO_OFF                 (1 << 5)
72 #define  MWL8K_A2H_INT_MAC_EVENT                 (1 << 3)
73 #define  MWL8K_A2H_INT_OPC_DONE                  (1 << 2)
74 #define  MWL8K_A2H_INT_RX_READY                  (1 << 1)
75 #define  MWL8K_A2H_INT_TX_DONE                   (1 << 0)
76
77 /* HW micro second timer register
78  * located at offset 0xA600. This
79  * will be used to timestamp tx
80  * packets.
81  */
82
83 #define MWL8K_HW_TIMER_REGISTER                 0x0000a600
84
85 #define MWL8K_A2H_EVENTS        (MWL8K_A2H_INT_DUMMY | \
86                                  MWL8K_A2H_INT_CHNL_SWITCHED | \
87                                  MWL8K_A2H_INT_QUEUE_EMPTY | \
88                                  MWL8K_A2H_INT_RADAR_DETECT | \
89                                  MWL8K_A2H_INT_RADIO_ON | \
90                                  MWL8K_A2H_INT_RADIO_OFF | \
91                                  MWL8K_A2H_INT_MAC_EVENT | \
92                                  MWL8K_A2H_INT_OPC_DONE | \
93                                  MWL8K_A2H_INT_RX_READY | \
94                                  MWL8K_A2H_INT_TX_DONE | \
95                                  MWL8K_A2H_INT_BA_WATCHDOG)
96
97 #define MWL8K_RX_QUEUES         1
98 #define MWL8K_TX_WMM_QUEUES     4
99 #define MWL8K_MAX_AMPDU_QUEUES  8
100 #define MWL8K_MAX_TX_QUEUES     (MWL8K_TX_WMM_QUEUES + MWL8K_MAX_AMPDU_QUEUES)
101 #define mwl8k_tx_queues(priv)   (MWL8K_TX_WMM_QUEUES + (priv)->num_ampdu_queues)
102
103 struct rxd_ops {
104         int rxd_size;
105         void (*rxd_init)(void *rxd, dma_addr_t next_dma_addr);
106         void (*rxd_refill)(void *rxd, dma_addr_t addr, int len);
107         int (*rxd_process)(void *rxd, struct ieee80211_rx_status *status,
108                            __le16 *qos, s8 *noise);
109 };
110
111 struct mwl8k_device_info {
112         char *part_name;
113         char *helper_image;
114         char *fw_image_sta;
115         char *fw_image_ap;
116         struct rxd_ops *ap_rxd_ops;
117         u32 fw_api_ap;
118 };
119
120 struct mwl8k_rx_queue {
121         int rxd_count;
122
123         /* hw receives here */
124         int head;
125
126         /* refill descs here */
127         int tail;
128
129         void *rxd;
130         dma_addr_t rxd_dma;
131         struct {
132                 struct sk_buff *skb;
133                 DEFINE_DMA_UNMAP_ADDR(dma);
134         } *buf;
135 };
136
137 struct mwl8k_tx_queue {
138         /* hw transmits here */
139         int head;
140
141         /* sw appends here */
142         int tail;
143
144         unsigned int len;
145         struct mwl8k_tx_desc *txd;
146         dma_addr_t txd_dma;
147         struct sk_buff **skb;
148 };
149
150 enum {
151         AMPDU_NO_STREAM,
152         AMPDU_STREAM_NEW,
153         AMPDU_STREAM_IN_PROGRESS,
154         AMPDU_STREAM_ACTIVE,
155 };
156
157 struct mwl8k_ampdu_stream {
158         struct ieee80211_sta *sta;
159         u8 tid;
160         u8 state;
161         u8 idx;
162         u8 txq_idx; /* index of this stream in priv->txq */
163 };
164
165 struct mwl8k_priv {
166         struct ieee80211_hw *hw;
167         struct pci_dev *pdev;
168         int irq;
169
170         struct mwl8k_device_info *device_info;
171
172         void __iomem *sram;
173         void __iomem *regs;
174
175         /* firmware */
176         const struct firmware *fw_helper;
177         const struct firmware *fw_ucode;
178
179         /* hardware/firmware parameters */
180         bool ap_fw;
181         struct rxd_ops *rxd_ops;
182         struct ieee80211_supported_band band_24;
183         struct ieee80211_channel channels_24[14];
184         struct ieee80211_rate rates_24[14];
185         struct ieee80211_supported_band band_50;
186         struct ieee80211_channel channels_50[4];
187         struct ieee80211_rate rates_50[9];
188         u32 ap_macids_supported;
189         u32 sta_macids_supported;
190
191         /* Ampdu stream information */
192         u8 num_ampdu_queues;
193         spinlock_t stream_lock;
194         struct mwl8k_ampdu_stream ampdu[MWL8K_MAX_AMPDU_QUEUES];
195         struct work_struct watchdog_ba_handle;
196
197         /* firmware access */
198         struct mutex fw_mutex;
199         struct task_struct *fw_mutex_owner;
200         int fw_mutex_depth;
201         struct completion *hostcmd_wait;
202
203         /* lock held over TX and TX reap */
204         spinlock_t tx_lock;
205
206         /* TX quiesce completion, protected by fw_mutex and tx_lock */
207         struct completion *tx_wait;
208
209         /* List of interfaces.  */
210         u32 macids_used;
211         struct list_head vif_list;
212
213         /* power management status cookie from firmware */
214         u32 *cookie;
215         dma_addr_t cookie_dma;
216
217         u16 num_mcaddrs;
218         u8 hw_rev;
219         u32 fw_rev;
220
221         /*
222          * Running count of TX packets in flight, to avoid
223          * iterating over the transmit rings each time.
224          */
225         int pending_tx_pkts;
226
227         struct mwl8k_rx_queue rxq[MWL8K_RX_QUEUES];
228         struct mwl8k_tx_queue txq[MWL8K_MAX_TX_QUEUES];
229         u32 txq_offset[MWL8K_MAX_TX_QUEUES];
230
231         bool radio_on;
232         bool radio_short_preamble;
233         bool sniffer_enabled;
234         bool wmm_enabled;
235
236         /* XXX need to convert this to handle multiple interfaces */
237         bool capture_beacon;
238         u8 capture_bssid[ETH_ALEN];
239         struct sk_buff *beacon_skb;
240
241         /*
242          * This FJ worker has to be global as it is scheduled from the
243          * RX handler.  At this point we don't know which interface it
244          * belongs to until the list of bssids waiting to complete join
245          * is checked.
246          */
247         struct work_struct finalize_join_worker;
248
249         /* Tasklet to perform TX reclaim.  */
250         struct tasklet_struct poll_tx_task;
251
252         /* Tasklet to perform RX.  */
253         struct tasklet_struct poll_rx_task;
254
255         /* Most recently reported noise in dBm */
256         s8 noise;
257
258         /*
259          * preserve the queue configurations so they can be restored if/when
260          * the firmware image is swapped.
261          */
262         struct ieee80211_tx_queue_params wmm_params[MWL8K_TX_WMM_QUEUES];
263
264         /* async firmware loading state */
265         unsigned fw_state;
266         char *fw_pref;
267         char *fw_alt;
268         struct completion firmware_loading_complete;
269 };
270
271 #define MAX_WEP_KEY_LEN         13
272 #define NUM_WEP_KEYS            4
273
274 /* Per interface specific private data */
275 struct mwl8k_vif {
276         struct list_head list;
277         struct ieee80211_vif *vif;
278
279         /* Firmware macid for this vif.  */
280         int macid;
281
282         /* Non AMPDU sequence number assigned by driver.  */
283         u16 seqno;
284
285         /* Saved WEP keys */
286         struct {
287                 u8 enabled;
288                 u8 key[sizeof(struct ieee80211_key_conf) + MAX_WEP_KEY_LEN];
289         } wep_key_conf[NUM_WEP_KEYS];
290
291         /* BSSID */
292         u8 bssid[ETH_ALEN];
293
294         /* A flag to indicate is HW crypto is enabled for this bssid */
295         bool is_hw_crypto_enabled;
296 };
297 #define MWL8K_VIF(_vif) ((struct mwl8k_vif *)&((_vif)->drv_priv))
298 #define IEEE80211_KEY_CONF(_u8) ((struct ieee80211_key_conf *)(_u8))
299
300 struct tx_traffic_info {
301         u32 start_time;
302         u32 pkts;
303 };
304
305 #define MWL8K_MAX_TID 8
306 struct mwl8k_sta {
307         /* Index into station database. Returned by UPDATE_STADB.  */
308         u8 peer_id;
309         u8 is_ampdu_allowed;
310         struct tx_traffic_info tx_stats[MWL8K_MAX_TID];
311 };
312 #define MWL8K_STA(_sta) ((struct mwl8k_sta *)&((_sta)->drv_priv))
313
314 static const struct ieee80211_channel mwl8k_channels_24[] = {
315         { .center_freq = 2412, .hw_value = 1, },
316         { .center_freq = 2417, .hw_value = 2, },
317         { .center_freq = 2422, .hw_value = 3, },
318         { .center_freq = 2427, .hw_value = 4, },
319         { .center_freq = 2432, .hw_value = 5, },
320         { .center_freq = 2437, .hw_value = 6, },
321         { .center_freq = 2442, .hw_value = 7, },
322         { .center_freq = 2447, .hw_value = 8, },
323         { .center_freq = 2452, .hw_value = 9, },
324         { .center_freq = 2457, .hw_value = 10, },
325         { .center_freq = 2462, .hw_value = 11, },
326         { .center_freq = 2467, .hw_value = 12, },
327         { .center_freq = 2472, .hw_value = 13, },
328         { .center_freq = 2484, .hw_value = 14, },
329 };
330
331 static const struct ieee80211_rate mwl8k_rates_24[] = {
332         { .bitrate = 10, .hw_value = 2, },
333         { .bitrate = 20, .hw_value = 4, },
334         { .bitrate = 55, .hw_value = 11, },
335         { .bitrate = 110, .hw_value = 22, },
336         { .bitrate = 220, .hw_value = 44, },
337         { .bitrate = 60, .hw_value = 12, },
338         { .bitrate = 90, .hw_value = 18, },
339         { .bitrate = 120, .hw_value = 24, },
340         { .bitrate = 180, .hw_value = 36, },
341         { .bitrate = 240, .hw_value = 48, },
342         { .bitrate = 360, .hw_value = 72, },
343         { .bitrate = 480, .hw_value = 96, },
344         { .bitrate = 540, .hw_value = 108, },
345         { .bitrate = 720, .hw_value = 144, },
346 };
347
348 static const struct ieee80211_channel mwl8k_channels_50[] = {
349         { .center_freq = 5180, .hw_value = 36, },
350         { .center_freq = 5200, .hw_value = 40, },
351         { .center_freq = 5220, .hw_value = 44, },
352         { .center_freq = 5240, .hw_value = 48, },
353 };
354
355 static const struct ieee80211_rate mwl8k_rates_50[] = {
356         { .bitrate = 60, .hw_value = 12, },
357         { .bitrate = 90, .hw_value = 18, },
358         { .bitrate = 120, .hw_value = 24, },
359         { .bitrate = 180, .hw_value = 36, },
360         { .bitrate = 240, .hw_value = 48, },
361         { .bitrate = 360, .hw_value = 72, },
362         { .bitrate = 480, .hw_value = 96, },
363         { .bitrate = 540, .hw_value = 108, },
364         { .bitrate = 720, .hw_value = 144, },
365 };
366
367 /* Set or get info from Firmware */
368 #define MWL8K_CMD_GET                   0x0000
369 #define MWL8K_CMD_SET                   0x0001
370 #define MWL8K_CMD_SET_LIST              0x0002
371
372 /* Firmware command codes */
373 #define MWL8K_CMD_CODE_DNLD             0x0001
374 #define MWL8K_CMD_GET_HW_SPEC           0x0003
375 #define MWL8K_CMD_SET_HW_SPEC           0x0004
376 #define MWL8K_CMD_MAC_MULTICAST_ADR     0x0010
377 #define MWL8K_CMD_GET_STAT              0x0014
378 #define MWL8K_CMD_RADIO_CONTROL         0x001c
379 #define MWL8K_CMD_RF_TX_POWER           0x001e
380 #define MWL8K_CMD_TX_POWER              0x001f
381 #define MWL8K_CMD_RF_ANTENNA            0x0020
382 #define MWL8K_CMD_SET_BEACON            0x0100          /* per-vif */
383 #define MWL8K_CMD_SET_PRE_SCAN          0x0107
384 #define MWL8K_CMD_SET_POST_SCAN         0x0108
385 #define MWL8K_CMD_SET_RF_CHANNEL        0x010a
386 #define MWL8K_CMD_SET_AID               0x010d
387 #define MWL8K_CMD_SET_RATE              0x0110
388 #define MWL8K_CMD_SET_FINALIZE_JOIN     0x0111
389 #define MWL8K_CMD_RTS_THRESHOLD         0x0113
390 #define MWL8K_CMD_SET_SLOT              0x0114
391 #define MWL8K_CMD_SET_EDCA_PARAMS       0x0115
392 #define MWL8K_CMD_SET_WMM_MODE          0x0123
393 #define MWL8K_CMD_MIMO_CONFIG           0x0125
394 #define MWL8K_CMD_USE_FIXED_RATE        0x0126
395 #define MWL8K_CMD_ENABLE_SNIFFER        0x0150
396 #define MWL8K_CMD_SET_MAC_ADDR          0x0202          /* per-vif */
397 #define MWL8K_CMD_SET_RATEADAPT_MODE    0x0203
398 #define MWL8K_CMD_GET_WATCHDOG_BITMAP   0x0205
399 #define MWL8K_CMD_BSS_START             0x1100          /* per-vif */
400 #define MWL8K_CMD_SET_NEW_STN           0x1111          /* per-vif */
401 #define MWL8K_CMD_UPDATE_ENCRYPTION     0x1122          /* per-vif */
402 #define MWL8K_CMD_UPDATE_STADB          0x1123
403 #define MWL8K_CMD_BASTREAM              0x1125
404
405 static const char *mwl8k_cmd_name(__le16 cmd, char *buf, int bufsize)
406 {
407         u16 command = le16_to_cpu(cmd);
408
409 #define MWL8K_CMDNAME(x)        case MWL8K_CMD_##x: do {\
410                                         snprintf(buf, bufsize, "%s", #x);\
411                                         return buf;\
412                                         } while (0)
413         switch (command & ~0x8000) {
414                 MWL8K_CMDNAME(CODE_DNLD);
415                 MWL8K_CMDNAME(GET_HW_SPEC);
416                 MWL8K_CMDNAME(SET_HW_SPEC);
417                 MWL8K_CMDNAME(MAC_MULTICAST_ADR);
418                 MWL8K_CMDNAME(GET_STAT);
419                 MWL8K_CMDNAME(RADIO_CONTROL);
420                 MWL8K_CMDNAME(RF_TX_POWER);
421                 MWL8K_CMDNAME(TX_POWER);
422                 MWL8K_CMDNAME(RF_ANTENNA);
423                 MWL8K_CMDNAME(SET_BEACON);
424                 MWL8K_CMDNAME(SET_PRE_SCAN);
425                 MWL8K_CMDNAME(SET_POST_SCAN);
426                 MWL8K_CMDNAME(SET_RF_CHANNEL);
427                 MWL8K_CMDNAME(SET_AID);
428                 MWL8K_CMDNAME(SET_RATE);
429                 MWL8K_CMDNAME(SET_FINALIZE_JOIN);
430                 MWL8K_CMDNAME(RTS_THRESHOLD);
431                 MWL8K_CMDNAME(SET_SLOT);
432                 MWL8K_CMDNAME(SET_EDCA_PARAMS);
433                 MWL8K_CMDNAME(SET_WMM_MODE);
434                 MWL8K_CMDNAME(MIMO_CONFIG);
435                 MWL8K_CMDNAME(USE_FIXED_RATE);
436                 MWL8K_CMDNAME(ENABLE_SNIFFER);
437                 MWL8K_CMDNAME(SET_MAC_ADDR);
438                 MWL8K_CMDNAME(SET_RATEADAPT_MODE);
439                 MWL8K_CMDNAME(BSS_START);
440                 MWL8K_CMDNAME(SET_NEW_STN);
441                 MWL8K_CMDNAME(UPDATE_ENCRYPTION);
442                 MWL8K_CMDNAME(UPDATE_STADB);
443                 MWL8K_CMDNAME(BASTREAM);
444                 MWL8K_CMDNAME(GET_WATCHDOG_BITMAP);
445         default:
446                 snprintf(buf, bufsize, "0x%x", cmd);
447         }
448 #undef MWL8K_CMDNAME
449
450         return buf;
451 }
452
453 /* Hardware and firmware reset */
454 static void mwl8k_hw_reset(struct mwl8k_priv *priv)
455 {
456         iowrite32(MWL8K_H2A_INT_RESET,
457                 priv->regs + MWL8K_HIU_H2A_INTERRUPT_EVENTS);
458         iowrite32(MWL8K_H2A_INT_RESET,
459                 priv->regs + MWL8K_HIU_H2A_INTERRUPT_EVENTS);
460         msleep(20);
461 }
462
463 /* Release fw image */
464 static void mwl8k_release_fw(const struct firmware **fw)
465 {
466         if (*fw == NULL)
467                 return;
468         release_firmware(*fw);
469         *fw = NULL;
470 }
471
472 static void mwl8k_release_firmware(struct mwl8k_priv *priv)
473 {
474         mwl8k_release_fw(&priv->fw_ucode);
475         mwl8k_release_fw(&priv->fw_helper);
476 }
477
478 /* states for asynchronous f/w loading */
479 static void mwl8k_fw_state_machine(const struct firmware *fw, void *context);
480 enum {
481         FW_STATE_INIT = 0,
482         FW_STATE_LOADING_PREF,
483         FW_STATE_LOADING_ALT,
484         FW_STATE_ERROR,
485 };
486
487 /* Request fw image */
488 static int mwl8k_request_fw(struct mwl8k_priv *priv,
489                             const char *fname, const struct firmware **fw,
490                             bool nowait)
491 {
492         /* release current image */
493         if (*fw != NULL)
494                 mwl8k_release_fw(fw);
495
496         if (nowait)
497                 return request_firmware_nowait(THIS_MODULE, 1, fname,
498                                                &priv->pdev->dev, GFP_KERNEL,
499                                                priv, mwl8k_fw_state_machine);
500         else
501                 return request_firmware(fw, fname, &priv->pdev->dev);
502 }
503
504 static int mwl8k_request_firmware(struct mwl8k_priv *priv, char *fw_image,
505                                   bool nowait)
506 {
507         struct mwl8k_device_info *di = priv->device_info;
508         int rc;
509
510         if (di->helper_image != NULL) {
511                 if (nowait)
512                         rc = mwl8k_request_fw(priv, di->helper_image,
513                                               &priv->fw_helper, true);
514                 else
515                         rc = mwl8k_request_fw(priv, di->helper_image,
516                                               &priv->fw_helper, false);
517                 if (rc)
518                         printk(KERN_ERR "%s: Error requesting helper fw %s\n",
519                                pci_name(priv->pdev), di->helper_image);
520
521                 if (rc || nowait)
522                         return rc;
523         }
524
525         if (nowait) {
526                 /*
527                  * if we get here, no helper image is needed.  Skip the
528                  * FW_STATE_INIT state.
529                  */
530                 priv->fw_state = FW_STATE_LOADING_PREF;
531                 rc = mwl8k_request_fw(priv, fw_image,
532                                       &priv->fw_ucode,
533                                       true);
534         } else
535                 rc = mwl8k_request_fw(priv, fw_image,
536                                       &priv->fw_ucode, false);
537         if (rc) {
538                 printk(KERN_ERR "%s: Error requesting firmware file %s\n",
539                        pci_name(priv->pdev), fw_image);
540                 mwl8k_release_fw(&priv->fw_helper);
541                 return rc;
542         }
543
544         return 0;
545 }
546
547 struct mwl8k_cmd_pkt {
548         __le16  code;
549         __le16  length;
550         __u8    seq_num;
551         __u8    macid;
552         __le16  result;
553         char    payload[0];
554 } __packed;
555
556 /*
557  * Firmware loading.
558  */
559 static int
560 mwl8k_send_fw_load_cmd(struct mwl8k_priv *priv, void *data, int length)
561 {
562         void __iomem *regs = priv->regs;
563         dma_addr_t dma_addr;
564         int loops;
565
566         dma_addr = pci_map_single(priv->pdev, data, length, PCI_DMA_TODEVICE);
567         if (pci_dma_mapping_error(priv->pdev, dma_addr))
568                 return -ENOMEM;
569
570         iowrite32(dma_addr, regs + MWL8K_HIU_GEN_PTR);
571         iowrite32(0, regs + MWL8K_HIU_INT_CODE);
572         iowrite32(MWL8K_H2A_INT_DOORBELL,
573                 regs + MWL8K_HIU_H2A_INTERRUPT_EVENTS);
574         iowrite32(MWL8K_H2A_INT_DUMMY,
575                 regs + MWL8K_HIU_H2A_INTERRUPT_EVENTS);
576
577         loops = 1000;
578         do {
579                 u32 int_code;
580
581                 int_code = ioread32(regs + MWL8K_HIU_INT_CODE);
582                 if (int_code == MWL8K_INT_CODE_CMD_FINISHED) {
583                         iowrite32(0, regs + MWL8K_HIU_INT_CODE);
584                         break;
585                 }
586
587                 cond_resched();
588                 udelay(1);
589         } while (--loops);
590
591         pci_unmap_single(priv->pdev, dma_addr, length, PCI_DMA_TODEVICE);
592
593         return loops ? 0 : -ETIMEDOUT;
594 }
595
596 static int mwl8k_load_fw_image(struct mwl8k_priv *priv,
597                                 const u8 *data, size_t length)
598 {
599         struct mwl8k_cmd_pkt *cmd;
600         int done;
601         int rc = 0;
602
603         cmd = kmalloc(sizeof(*cmd) + 256, GFP_KERNEL);
604         if (cmd == NULL)
605                 return -ENOMEM;
606
607         cmd->code = cpu_to_le16(MWL8K_CMD_CODE_DNLD);
608         cmd->seq_num = 0;
609         cmd->macid = 0;
610         cmd->result = 0;
611
612         done = 0;
613         while (length) {
614                 int block_size = length > 256 ? 256 : length;
615
616                 memcpy(cmd->payload, data + done, block_size);
617                 cmd->length = cpu_to_le16(block_size);
618
619                 rc = mwl8k_send_fw_load_cmd(priv, cmd,
620                                                 sizeof(*cmd) + block_size);
621                 if (rc)
622                         break;
623
624                 done += block_size;
625                 length -= block_size;
626         }
627
628         if (!rc) {
629                 cmd->length = 0;
630                 rc = mwl8k_send_fw_load_cmd(priv, cmd, sizeof(*cmd));
631         }
632
633         kfree(cmd);
634
635         return rc;
636 }
637
638 static int mwl8k_feed_fw_image(struct mwl8k_priv *priv,
639                                 const u8 *data, size_t length)
640 {
641         unsigned char *buffer;
642         int may_continue, rc = 0;
643         u32 done, prev_block_size;
644
645         buffer = kmalloc(1024, GFP_KERNEL);
646         if (buffer == NULL)
647                 return -ENOMEM;
648
649         done = 0;
650         prev_block_size = 0;
651         may_continue = 1000;
652         while (may_continue > 0) {
653                 u32 block_size;
654
655                 block_size = ioread32(priv->regs + MWL8K_HIU_SCRATCH);
656                 if (block_size & 1) {
657                         block_size &= ~1;
658                         may_continue--;
659                 } else {
660                         done += prev_block_size;
661                         length -= prev_block_size;
662                 }
663
664                 if (block_size > 1024 || block_size > length) {
665                         rc = -EOVERFLOW;
666                         break;
667                 }
668
669                 if (length == 0) {
670                         rc = 0;
671                         break;
672                 }
673
674                 if (block_size == 0) {
675                         rc = -EPROTO;
676                         may_continue--;
677                         udelay(1);
678                         continue;
679                 }
680
681                 prev_block_size = block_size;
682                 memcpy(buffer, data + done, block_size);
683
684                 rc = mwl8k_send_fw_load_cmd(priv, buffer, block_size);
685                 if (rc)
686                         break;
687         }
688
689         if (!rc && length != 0)
690                 rc = -EREMOTEIO;
691
692         kfree(buffer);
693
694         return rc;
695 }
696
697 static int mwl8k_load_firmware(struct ieee80211_hw *hw)
698 {
699         struct mwl8k_priv *priv = hw->priv;
700         const struct firmware *fw = priv->fw_ucode;
701         int rc;
702         int loops;
703
704         if (!memcmp(fw->data, "\x01\x00\x00\x00", 4)) {
705                 const struct firmware *helper = priv->fw_helper;
706
707                 if (helper == NULL) {
708                         printk(KERN_ERR "%s: helper image needed but none "
709                                "given\n", pci_name(priv->pdev));
710                         return -EINVAL;
711                 }
712
713                 rc = mwl8k_load_fw_image(priv, helper->data, helper->size);
714                 if (rc) {
715                         printk(KERN_ERR "%s: unable to load firmware "
716                                "helper image\n", pci_name(priv->pdev));
717                         return rc;
718                 }
719                 msleep(20);
720
721                 rc = mwl8k_feed_fw_image(priv, fw->data, fw->size);
722         } else {
723                 rc = mwl8k_load_fw_image(priv, fw->data, fw->size);
724         }
725
726         if (rc) {
727                 printk(KERN_ERR "%s: unable to load firmware image\n",
728                        pci_name(priv->pdev));
729                 return rc;
730         }
731
732         iowrite32(MWL8K_MODE_STA, priv->regs + MWL8K_HIU_GEN_PTR);
733
734         loops = 500000;
735         do {
736                 u32 ready_code;
737
738                 ready_code = ioread32(priv->regs + MWL8K_HIU_INT_CODE);
739                 if (ready_code == MWL8K_FWAP_READY) {
740                         priv->ap_fw = 1;
741                         break;
742                 } else if (ready_code == MWL8K_FWSTA_READY) {
743                         priv->ap_fw = 0;
744                         break;
745                 }
746
747                 cond_resched();
748                 udelay(1);
749         } while (--loops);
750
751         return loops ? 0 : -ETIMEDOUT;
752 }
753
754
755 /* DMA header used by firmware and hardware.  */
756 struct mwl8k_dma_data {
757         __le16 fwlen;
758         struct ieee80211_hdr wh;
759         char data[0];
760 } __packed;
761
762 /* Routines to add/remove DMA header from skb.  */
763 static inline void mwl8k_remove_dma_header(struct sk_buff *skb, __le16 qos)
764 {
765         struct mwl8k_dma_data *tr;
766         int hdrlen;
767
768         tr = (struct mwl8k_dma_data *)skb->data;
769         hdrlen = ieee80211_hdrlen(tr->wh.frame_control);
770
771         if (hdrlen != sizeof(tr->wh)) {
772                 if (ieee80211_is_data_qos(tr->wh.frame_control)) {
773                         memmove(tr->data - hdrlen, &tr->wh, hdrlen - 2);
774                         *((__le16 *)(tr->data - 2)) = qos;
775                 } else {
776                         memmove(tr->data - hdrlen, &tr->wh, hdrlen);
777                 }
778         }
779
780         if (hdrlen != sizeof(*tr))
781                 skb_pull(skb, sizeof(*tr) - hdrlen);
782 }
783
784 static void
785 mwl8k_add_dma_header(struct sk_buff *skb, int tail_pad)
786 {
787         struct ieee80211_hdr *wh;
788         int hdrlen;
789         int reqd_hdrlen;
790         struct mwl8k_dma_data *tr;
791
792         /*
793          * Add a firmware DMA header; the firmware requires that we
794          * present a 2-byte payload length followed by a 4-address
795          * header (without QoS field), followed (optionally) by any
796          * WEP/ExtIV header (but only filled in for CCMP).
797          */
798         wh = (struct ieee80211_hdr *)skb->data;
799
800         hdrlen = ieee80211_hdrlen(wh->frame_control);
801         reqd_hdrlen = sizeof(*tr);
802
803         if (hdrlen != reqd_hdrlen)
804                 skb_push(skb, reqd_hdrlen - hdrlen);
805
806         if (ieee80211_is_data_qos(wh->frame_control))
807                 hdrlen -= IEEE80211_QOS_CTL_LEN;
808
809         tr = (struct mwl8k_dma_data *)skb->data;
810         if (wh != &tr->wh)
811                 memmove(&tr->wh, wh, hdrlen);
812         if (hdrlen != sizeof(tr->wh))
813                 memset(((void *)&tr->wh) + hdrlen, 0, sizeof(tr->wh) - hdrlen);
814
815         /*
816          * Firmware length is the length of the fully formed "802.11
817          * payload".  That is, everything except for the 802.11 header.
818          * This includes all crypto material including the MIC.
819          */
820         tr->fwlen = cpu_to_le16(skb->len - sizeof(*tr) + tail_pad);
821 }
822
823 static void mwl8k_encapsulate_tx_frame(struct sk_buff *skb)
824 {
825         struct ieee80211_hdr *wh;
826         struct ieee80211_tx_info *tx_info;
827         struct ieee80211_key_conf *key_conf;
828         int data_pad;
829
830         wh = (struct ieee80211_hdr *)skb->data;
831
832         tx_info = IEEE80211_SKB_CB(skb);
833
834         key_conf = NULL;
835         if (ieee80211_is_data(wh->frame_control))
836                 key_conf = tx_info->control.hw_key;
837
838         /*
839          * Make sure the packet header is in the DMA header format (4-address
840          * without QoS), the necessary crypto padding between the header and the
841          * payload has already been provided by mac80211, but it doesn't add
842          * tail padding when HW crypto is enabled.
843          *
844          * We have the following trailer padding requirements:
845          * - WEP: 4 trailer bytes (ICV)
846          * - TKIP: 12 trailer bytes (8 MIC + 4 ICV)
847          * - CCMP: 8 trailer bytes (MIC)
848          */
849         data_pad = 0;
850         if (key_conf != NULL) {
851                 switch (key_conf->cipher) {
852                 case WLAN_CIPHER_SUITE_WEP40:
853                 case WLAN_CIPHER_SUITE_WEP104:
854                         data_pad = 4;
855                         break;
856                 case WLAN_CIPHER_SUITE_TKIP:
857                         data_pad = 12;
858                         break;
859                 case WLAN_CIPHER_SUITE_CCMP:
860                         data_pad = 8;
861                         break;
862                 }
863         }
864         mwl8k_add_dma_header(skb, data_pad);
865 }
866
867 /*
868  * Packet reception for 88w8366 AP firmware.
869  */
870 struct mwl8k_rxd_8366_ap {
871         __le16 pkt_len;
872         __u8 sq2;
873         __u8 rate;
874         __le32 pkt_phys_addr;
875         __le32 next_rxd_phys_addr;
876         __le16 qos_control;
877         __le16 htsig2;
878         __le32 hw_rssi_info;
879         __le32 hw_noise_floor_info;
880         __u8 noise_floor;
881         __u8 pad0[3];
882         __u8 rssi;
883         __u8 rx_status;
884         __u8 channel;
885         __u8 rx_ctrl;
886 } __packed;
887
888 #define MWL8K_8366_AP_RATE_INFO_MCS_FORMAT      0x80
889 #define MWL8K_8366_AP_RATE_INFO_40MHZ           0x40
890 #define MWL8K_8366_AP_RATE_INFO_RATEID(x)       ((x) & 0x3f)
891
892 #define MWL8K_8366_AP_RX_CTRL_OWNED_BY_HOST     0x80
893
894 /* 8366 AP rx_status bits */
895 #define MWL8K_8366_AP_RXSTAT_DECRYPT_ERR_MASK           0x80
896 #define MWL8K_8366_AP_RXSTAT_GENERAL_DECRYPT_ERR        0xFF
897 #define MWL8K_8366_AP_RXSTAT_TKIP_DECRYPT_MIC_ERR       0x02
898 #define MWL8K_8366_AP_RXSTAT_WEP_DECRYPT_ICV_ERR        0x04
899 #define MWL8K_8366_AP_RXSTAT_TKIP_DECRYPT_ICV_ERR       0x08
900
901 static void mwl8k_rxd_8366_ap_init(void *_rxd, dma_addr_t next_dma_addr)
902 {
903         struct mwl8k_rxd_8366_ap *rxd = _rxd;
904
905         rxd->next_rxd_phys_addr = cpu_to_le32(next_dma_addr);
906         rxd->rx_ctrl = MWL8K_8366_AP_RX_CTRL_OWNED_BY_HOST;
907 }
908
909 static void mwl8k_rxd_8366_ap_refill(void *_rxd, dma_addr_t addr, int len)
910 {
911         struct mwl8k_rxd_8366_ap *rxd = _rxd;
912
913         rxd->pkt_len = cpu_to_le16(len);
914         rxd->pkt_phys_addr = cpu_to_le32(addr);
915         wmb();
916         rxd->rx_ctrl = 0;
917 }
918
919 static int
920 mwl8k_rxd_8366_ap_process(void *_rxd, struct ieee80211_rx_status *status,
921                           __le16 *qos, s8 *noise)
922 {
923         struct mwl8k_rxd_8366_ap *rxd = _rxd;
924
925         if (!(rxd->rx_ctrl & MWL8K_8366_AP_RX_CTRL_OWNED_BY_HOST))
926                 return -1;
927         rmb();
928
929         memset(status, 0, sizeof(*status));
930
931         status->signal = -rxd->rssi;
932         *noise = -rxd->noise_floor;
933
934         if (rxd->rate & MWL8K_8366_AP_RATE_INFO_MCS_FORMAT) {
935                 status->flag |= RX_FLAG_HT;
936                 if (rxd->rate & MWL8K_8366_AP_RATE_INFO_40MHZ)
937                         status->flag |= RX_FLAG_40MHZ;
938                 status->rate_idx = MWL8K_8366_AP_RATE_INFO_RATEID(rxd->rate);
939         } else {
940                 int i;
941
942                 for (i = 0; i < ARRAY_SIZE(mwl8k_rates_24); i++) {
943                         if (mwl8k_rates_24[i].hw_value == rxd->rate) {
944                                 status->rate_idx = i;
945                                 break;
946                         }
947                 }
948         }
949
950         if (rxd->channel > 14) {
951                 status->band = IEEE80211_BAND_5GHZ;
952                 if (!(status->flag & RX_FLAG_HT))
953                         status->rate_idx -= 5;
954         } else {
955                 status->band = IEEE80211_BAND_2GHZ;
956         }
957         status->freq = ieee80211_channel_to_frequency(rxd->channel,
958                                                       status->band);
959
960         *qos = rxd->qos_control;
961
962         if ((rxd->rx_status != MWL8K_8366_AP_RXSTAT_GENERAL_DECRYPT_ERR) &&
963             (rxd->rx_status & MWL8K_8366_AP_RXSTAT_DECRYPT_ERR_MASK) &&
964             (rxd->rx_status & MWL8K_8366_AP_RXSTAT_TKIP_DECRYPT_MIC_ERR))
965                 status->flag |= RX_FLAG_MMIC_ERROR;
966
967         return le16_to_cpu(rxd->pkt_len);
968 }
969
970 static struct rxd_ops rxd_8366_ap_ops = {
971         .rxd_size       = sizeof(struct mwl8k_rxd_8366_ap),
972         .rxd_init       = mwl8k_rxd_8366_ap_init,
973         .rxd_refill     = mwl8k_rxd_8366_ap_refill,
974         .rxd_process    = mwl8k_rxd_8366_ap_process,
975 };
976
977 /*
978  * Packet reception for STA firmware.
979  */
980 struct mwl8k_rxd_sta {
981         __le16 pkt_len;
982         __u8 link_quality;
983         __u8 noise_level;
984         __le32 pkt_phys_addr;
985         __le32 next_rxd_phys_addr;
986         __le16 qos_control;
987         __le16 rate_info;
988         __le32 pad0[4];
989         __u8 rssi;
990         __u8 channel;
991         __le16 pad1;
992         __u8 rx_ctrl;
993         __u8 rx_status;
994         __u8 pad2[2];
995 } __packed;
996
997 #define MWL8K_STA_RATE_INFO_SHORTPRE            0x8000
998 #define MWL8K_STA_RATE_INFO_ANTSELECT(x)        (((x) >> 11) & 0x3)
999 #define MWL8K_STA_RATE_INFO_RATEID(x)           (((x) >> 3) & 0x3f)
1000 #define MWL8K_STA_RATE_INFO_40MHZ               0x0004
1001 #define MWL8K_STA_RATE_INFO_SHORTGI             0x0002
1002 #define MWL8K_STA_RATE_INFO_MCS_FORMAT          0x0001
1003
1004 #define MWL8K_STA_RX_CTRL_OWNED_BY_HOST         0x02
1005 #define MWL8K_STA_RX_CTRL_DECRYPT_ERROR         0x04
1006 /* ICV=0 or MIC=1 */
1007 #define MWL8K_STA_RX_CTRL_DEC_ERR_TYPE          0x08
1008 /* Key is uploaded only in failure case */
1009 #define MWL8K_STA_RX_CTRL_KEY_INDEX                     0x30
1010
1011 static void mwl8k_rxd_sta_init(void *_rxd, dma_addr_t next_dma_addr)
1012 {
1013         struct mwl8k_rxd_sta *rxd = _rxd;
1014
1015         rxd->next_rxd_phys_addr = cpu_to_le32(next_dma_addr);
1016         rxd->rx_ctrl = MWL8K_STA_RX_CTRL_OWNED_BY_HOST;
1017 }
1018
1019 static void mwl8k_rxd_sta_refill(void *_rxd, dma_addr_t addr, int len)
1020 {
1021         struct mwl8k_rxd_sta *rxd = _rxd;
1022
1023         rxd->pkt_len = cpu_to_le16(len);
1024         rxd->pkt_phys_addr = cpu_to_le32(addr);
1025         wmb();
1026         rxd->rx_ctrl = 0;
1027 }
1028
1029 static int
1030 mwl8k_rxd_sta_process(void *_rxd, struct ieee80211_rx_status *status,
1031                        __le16 *qos, s8 *noise)
1032 {
1033         struct mwl8k_rxd_sta *rxd = _rxd;
1034         u16 rate_info;
1035
1036         if (!(rxd->rx_ctrl & MWL8K_STA_RX_CTRL_OWNED_BY_HOST))
1037                 return -1;
1038         rmb();
1039
1040         rate_info = le16_to_cpu(rxd->rate_info);
1041
1042         memset(status, 0, sizeof(*status));
1043
1044         status->signal = -rxd->rssi;
1045         *noise = -rxd->noise_level;
1046         status->antenna = MWL8K_STA_RATE_INFO_ANTSELECT(rate_info);
1047         status->rate_idx = MWL8K_STA_RATE_INFO_RATEID(rate_info);
1048
1049         if (rate_info & MWL8K_STA_RATE_INFO_SHORTPRE)
1050                 status->flag |= RX_FLAG_SHORTPRE;
1051         if (rate_info & MWL8K_STA_RATE_INFO_40MHZ)
1052                 status->flag |= RX_FLAG_40MHZ;
1053         if (rate_info & MWL8K_STA_RATE_INFO_SHORTGI)
1054                 status->flag |= RX_FLAG_SHORT_GI;
1055         if (rate_info & MWL8K_STA_RATE_INFO_MCS_FORMAT)
1056                 status->flag |= RX_FLAG_HT;
1057
1058         if (rxd->channel > 14) {
1059                 status->band = IEEE80211_BAND_5GHZ;
1060                 if (!(status->flag & RX_FLAG_HT))
1061                         status->rate_idx -= 5;
1062         } else {
1063                 status->band = IEEE80211_BAND_2GHZ;
1064         }
1065         status->freq = ieee80211_channel_to_frequency(rxd->channel,
1066                                                       status->band);
1067
1068         *qos = rxd->qos_control;
1069         if ((rxd->rx_ctrl & MWL8K_STA_RX_CTRL_DECRYPT_ERROR) &&
1070             (rxd->rx_ctrl & MWL8K_STA_RX_CTRL_DEC_ERR_TYPE))
1071                 status->flag |= RX_FLAG_MMIC_ERROR;
1072
1073         return le16_to_cpu(rxd->pkt_len);
1074 }
1075
1076 static struct rxd_ops rxd_sta_ops = {
1077         .rxd_size       = sizeof(struct mwl8k_rxd_sta),
1078         .rxd_init       = mwl8k_rxd_sta_init,
1079         .rxd_refill     = mwl8k_rxd_sta_refill,
1080         .rxd_process    = mwl8k_rxd_sta_process,
1081 };
1082
1083
1084 #define MWL8K_RX_DESCS          256
1085 #define MWL8K_RX_MAXSZ          3800
1086
1087 static int mwl8k_rxq_init(struct ieee80211_hw *hw, int index)
1088 {
1089         struct mwl8k_priv *priv = hw->priv;
1090         struct mwl8k_rx_queue *rxq = priv->rxq + index;
1091         int size;
1092         int i;
1093
1094         rxq->rxd_count = 0;
1095         rxq->head = 0;
1096         rxq->tail = 0;
1097
1098         size = MWL8K_RX_DESCS * priv->rxd_ops->rxd_size;
1099
1100         rxq->rxd = pci_alloc_consistent(priv->pdev, size, &rxq->rxd_dma);
1101         if (rxq->rxd == NULL) {
1102                 wiphy_err(hw->wiphy, "failed to alloc RX descriptors\n");
1103                 return -ENOMEM;
1104         }
1105         memset(rxq->rxd, 0, size);
1106
1107         rxq->buf = kcalloc(MWL8K_RX_DESCS, sizeof(*rxq->buf), GFP_KERNEL);
1108         if (rxq->buf == NULL) {
1109                 wiphy_err(hw->wiphy, "failed to alloc RX skbuff list\n");
1110                 pci_free_consistent(priv->pdev, size, rxq->rxd, rxq->rxd_dma);
1111                 return -ENOMEM;
1112         }
1113
1114         for (i = 0; i < MWL8K_RX_DESCS; i++) {
1115                 int desc_size;
1116                 void *rxd;
1117                 int nexti;
1118                 dma_addr_t next_dma_addr;
1119
1120                 desc_size = priv->rxd_ops->rxd_size;
1121                 rxd = rxq->rxd + (i * priv->rxd_ops->rxd_size);
1122
1123                 nexti = i + 1;
1124                 if (nexti == MWL8K_RX_DESCS)
1125                         nexti = 0;
1126                 next_dma_addr = rxq->rxd_dma + (nexti * desc_size);
1127
1128                 priv->rxd_ops->rxd_init(rxd, next_dma_addr);
1129         }
1130
1131         return 0;
1132 }
1133
1134 static int rxq_refill(struct ieee80211_hw *hw, int index, int limit)
1135 {
1136         struct mwl8k_priv *priv = hw->priv;
1137         struct mwl8k_rx_queue *rxq = priv->rxq + index;
1138         int refilled;
1139
1140         refilled = 0;
1141         while (rxq->rxd_count < MWL8K_RX_DESCS && limit--) {
1142                 struct sk_buff *skb;
1143                 dma_addr_t addr;
1144                 int rx;
1145                 void *rxd;
1146
1147                 skb = dev_alloc_skb(MWL8K_RX_MAXSZ);
1148                 if (skb == NULL)
1149                         break;
1150
1151                 addr = pci_map_single(priv->pdev, skb->data,
1152                                       MWL8K_RX_MAXSZ, DMA_FROM_DEVICE);
1153
1154                 rxq->rxd_count++;
1155                 rx = rxq->tail++;
1156                 if (rxq->tail == MWL8K_RX_DESCS)
1157                         rxq->tail = 0;
1158                 rxq->buf[rx].skb = skb;
1159                 dma_unmap_addr_set(&rxq->buf[rx], dma, addr);
1160
1161                 rxd = rxq->rxd + (rx * priv->rxd_ops->rxd_size);
1162                 priv->rxd_ops->rxd_refill(rxd, addr, MWL8K_RX_MAXSZ);
1163
1164                 refilled++;
1165         }
1166
1167         return refilled;
1168 }
1169
1170 /* Must be called only when the card's reception is completely halted */
1171 static void mwl8k_rxq_deinit(struct ieee80211_hw *hw, int index)
1172 {
1173         struct mwl8k_priv *priv = hw->priv;
1174         struct mwl8k_rx_queue *rxq = priv->rxq + index;
1175         int i;
1176
1177         if (rxq->rxd == NULL)
1178                 return;
1179
1180         for (i = 0; i < MWL8K_RX_DESCS; i++) {
1181                 if (rxq->buf[i].skb != NULL) {
1182                         pci_unmap_single(priv->pdev,
1183                                          dma_unmap_addr(&rxq->buf[i], dma),
1184                                          MWL8K_RX_MAXSZ, PCI_DMA_FROMDEVICE);
1185                         dma_unmap_addr_set(&rxq->buf[i], dma, 0);
1186
1187                         kfree_skb(rxq->buf[i].skb);
1188                         rxq->buf[i].skb = NULL;
1189                 }
1190         }
1191
1192         kfree(rxq->buf);
1193         rxq->buf = NULL;
1194
1195         pci_free_consistent(priv->pdev,
1196                             MWL8K_RX_DESCS * priv->rxd_ops->rxd_size,
1197                             rxq->rxd, rxq->rxd_dma);
1198         rxq->rxd = NULL;
1199 }
1200
1201
1202 /*
1203  * Scan a list of BSSIDs to process for finalize join.
1204  * Allows for extension to process multiple BSSIDs.
1205  */
1206 static inline int
1207 mwl8k_capture_bssid(struct mwl8k_priv *priv, struct ieee80211_hdr *wh)
1208 {
1209         return priv->capture_beacon &&
1210                 ieee80211_is_beacon(wh->frame_control) &&
1211                 !compare_ether_addr(wh->addr3, priv->capture_bssid);
1212 }
1213
1214 static inline void mwl8k_save_beacon(struct ieee80211_hw *hw,
1215                                      struct sk_buff *skb)
1216 {
1217         struct mwl8k_priv *priv = hw->priv;
1218
1219         priv->capture_beacon = false;
1220         memset(priv->capture_bssid, 0, ETH_ALEN);
1221
1222         /*
1223          * Use GFP_ATOMIC as rxq_process is called from
1224          * the primary interrupt handler, memory allocation call
1225          * must not sleep.
1226          */
1227         priv->beacon_skb = skb_copy(skb, GFP_ATOMIC);
1228         if (priv->beacon_skb != NULL)
1229                 ieee80211_queue_work(hw, &priv->finalize_join_worker);
1230 }
1231
1232 static inline struct mwl8k_vif *mwl8k_find_vif_bss(struct list_head *vif_list,
1233                                                    u8 *bssid)
1234 {
1235         struct mwl8k_vif *mwl8k_vif;
1236
1237         list_for_each_entry(mwl8k_vif,
1238                             vif_list, list) {
1239                 if (memcmp(bssid, mwl8k_vif->bssid,
1240                            ETH_ALEN) == 0)
1241                         return mwl8k_vif;
1242         }
1243
1244         return NULL;
1245 }
1246
1247 static int rxq_process(struct ieee80211_hw *hw, int index, int limit)
1248 {
1249         struct mwl8k_priv *priv = hw->priv;
1250         struct mwl8k_vif *mwl8k_vif = NULL;
1251         struct mwl8k_rx_queue *rxq = priv->rxq + index;
1252         int processed;
1253
1254         processed = 0;
1255         while (rxq->rxd_count && limit--) {
1256                 struct sk_buff *skb;
1257                 void *rxd;
1258                 int pkt_len;
1259                 struct ieee80211_rx_status status;
1260                 struct ieee80211_hdr *wh;
1261                 __le16 qos;
1262
1263                 skb = rxq->buf[rxq->head].skb;
1264                 if (skb == NULL)
1265                         break;
1266
1267                 rxd = rxq->rxd + (rxq->head * priv->rxd_ops->rxd_size);
1268
1269                 pkt_len = priv->rxd_ops->rxd_process(rxd, &status, &qos,
1270                                                         &priv->noise);
1271                 if (pkt_len < 0)
1272                         break;
1273
1274                 rxq->buf[rxq->head].skb = NULL;
1275
1276                 pci_unmap_single(priv->pdev,
1277                                  dma_unmap_addr(&rxq->buf[rxq->head], dma),
1278                                  MWL8K_RX_MAXSZ, PCI_DMA_FROMDEVICE);
1279                 dma_unmap_addr_set(&rxq->buf[rxq->head], dma, 0);
1280
1281                 rxq->head++;
1282                 if (rxq->head == MWL8K_RX_DESCS)
1283                         rxq->head = 0;
1284
1285                 rxq->rxd_count--;
1286
1287                 wh = &((struct mwl8k_dma_data *)skb->data)->wh;
1288
1289                 /*
1290                  * Check for a pending join operation.  Save a
1291                  * copy of the beacon and schedule a tasklet to
1292                  * send a FINALIZE_JOIN command to the firmware.
1293                  */
1294                 if (mwl8k_capture_bssid(priv, (void *)skb->data))
1295                         mwl8k_save_beacon(hw, skb);
1296
1297                 if (ieee80211_has_protected(wh->frame_control)) {
1298
1299                         /* Check if hw crypto has been enabled for
1300                          * this bss. If yes, set the status flags
1301                          * accordingly
1302                          */
1303                         mwl8k_vif = mwl8k_find_vif_bss(&priv->vif_list,
1304                                                                 wh->addr1);
1305
1306                         if (mwl8k_vif != NULL &&
1307                             mwl8k_vif->is_hw_crypto_enabled == true) {
1308                                 /*
1309                                  * When MMIC ERROR is encountered
1310                                  * by the firmware, payload is
1311                                  * dropped and only 32 bytes of
1312                                  * mwl8k Firmware header is sent
1313                                  * to the host.
1314                                  *
1315                                  * We need to add four bytes of
1316                                  * key information.  In it
1317                                  * MAC80211 expects keyidx set to
1318                                  * 0 for triggering Counter
1319                                  * Measure of MMIC failure.
1320                                  */
1321                                 if (status.flag & RX_FLAG_MMIC_ERROR) {
1322                                         struct mwl8k_dma_data *tr;
1323                                         tr = (struct mwl8k_dma_data *)skb->data;
1324                                         memset((void *)&(tr->data), 0, 4);
1325                                         pkt_len += 4;
1326                                 }
1327
1328                                 if (!ieee80211_is_auth(wh->frame_control))
1329                                         status.flag |= RX_FLAG_IV_STRIPPED |
1330                                                        RX_FLAG_DECRYPTED |
1331                                                        RX_FLAG_MMIC_STRIPPED;
1332                         }
1333                 }
1334
1335                 skb_put(skb, pkt_len);
1336                 mwl8k_remove_dma_header(skb, qos);
1337                 memcpy(IEEE80211_SKB_RXCB(skb), &status, sizeof(status));
1338                 ieee80211_rx_irqsafe(hw, skb);
1339
1340                 processed++;
1341         }
1342
1343         return processed;
1344 }
1345
1346
1347 /*
1348  * Packet transmission.
1349  */
1350
1351 #define MWL8K_TXD_STATUS_OK                     0x00000001
1352 #define MWL8K_TXD_STATUS_OK_RETRY               0x00000002
1353 #define MWL8K_TXD_STATUS_OK_MORE_RETRY          0x00000004
1354 #define MWL8K_TXD_STATUS_MULTICAST_TX           0x00000008
1355 #define MWL8K_TXD_STATUS_FW_OWNED               0x80000000
1356
1357 #define MWL8K_QOS_QLEN_UNSPEC                   0xff00
1358 #define MWL8K_QOS_ACK_POLICY_MASK               0x0060
1359 #define MWL8K_QOS_ACK_POLICY_NORMAL             0x0000
1360 #define MWL8K_QOS_ACK_POLICY_BLOCKACK           0x0060
1361 #define MWL8K_QOS_EOSP                          0x0010
1362
1363 struct mwl8k_tx_desc {
1364         __le32 status;
1365         __u8 data_rate;
1366         __u8 tx_priority;
1367         __le16 qos_control;
1368         __le32 pkt_phys_addr;
1369         __le16 pkt_len;
1370         __u8 dest_MAC_addr[ETH_ALEN];
1371         __le32 next_txd_phys_addr;
1372         __le32 timestamp;
1373         __le16 rate_info;
1374         __u8 peer_id;
1375         __u8 tx_frag_cnt;
1376 } __packed;
1377
1378 #define MWL8K_TX_DESCS          128
1379
1380 static int mwl8k_txq_init(struct ieee80211_hw *hw, int index)
1381 {
1382         struct mwl8k_priv *priv = hw->priv;
1383         struct mwl8k_tx_queue *txq = priv->txq + index;
1384         int size;
1385         int i;
1386
1387         txq->len = 0;
1388         txq->head = 0;
1389         txq->tail = 0;
1390
1391         size = MWL8K_TX_DESCS * sizeof(struct mwl8k_tx_desc);
1392
1393         txq->txd = pci_alloc_consistent(priv->pdev, size, &txq->txd_dma);
1394         if (txq->txd == NULL) {
1395                 wiphy_err(hw->wiphy, "failed to alloc TX descriptors\n");
1396                 return -ENOMEM;
1397         }
1398         memset(txq->txd, 0, size);
1399
1400         txq->skb = kcalloc(MWL8K_TX_DESCS, sizeof(*txq->skb), GFP_KERNEL);
1401         if (txq->skb == NULL) {
1402                 wiphy_err(hw->wiphy, "failed to alloc TX skbuff list\n");
1403                 pci_free_consistent(priv->pdev, size, txq->txd, txq->txd_dma);
1404                 return -ENOMEM;
1405         }
1406
1407         for (i = 0; i < MWL8K_TX_DESCS; i++) {
1408                 struct mwl8k_tx_desc *tx_desc;
1409                 int nexti;
1410
1411                 tx_desc = txq->txd + i;
1412                 nexti = (i + 1) % MWL8K_TX_DESCS;
1413
1414                 tx_desc->status = 0;
1415                 tx_desc->next_txd_phys_addr =
1416                         cpu_to_le32(txq->txd_dma + nexti * sizeof(*tx_desc));
1417         }
1418
1419         return 0;
1420 }
1421
1422 static inline void mwl8k_tx_start(struct mwl8k_priv *priv)
1423 {
1424         iowrite32(MWL8K_H2A_INT_PPA_READY,
1425                 priv->regs + MWL8K_HIU_H2A_INTERRUPT_EVENTS);
1426         iowrite32(MWL8K_H2A_INT_DUMMY,
1427                 priv->regs + MWL8K_HIU_H2A_INTERRUPT_EVENTS);
1428         ioread32(priv->regs + MWL8K_HIU_INT_CODE);
1429 }
1430
1431 static void mwl8k_dump_tx_rings(struct ieee80211_hw *hw)
1432 {
1433         struct mwl8k_priv *priv = hw->priv;
1434         int i;
1435
1436         for (i = 0; i < mwl8k_tx_queues(priv); i++) {
1437                 struct mwl8k_tx_queue *txq = priv->txq + i;
1438                 int fw_owned = 0;
1439                 int drv_owned = 0;
1440                 int unused = 0;
1441                 int desc;
1442
1443                 for (desc = 0; desc < MWL8K_TX_DESCS; desc++) {
1444                         struct mwl8k_tx_desc *tx_desc = txq->txd + desc;
1445                         u32 status;
1446
1447                         status = le32_to_cpu(tx_desc->status);
1448                         if (status & MWL8K_TXD_STATUS_FW_OWNED)
1449                                 fw_owned++;
1450                         else
1451                                 drv_owned++;
1452
1453                         if (tx_desc->pkt_len == 0)
1454                                 unused++;
1455                 }
1456
1457                 wiphy_err(hw->wiphy,
1458                           "txq[%d] len=%d head=%d tail=%d "
1459                           "fw_owned=%d drv_owned=%d unused=%d\n",
1460                           i,
1461                           txq->len, txq->head, txq->tail,
1462                           fw_owned, drv_owned, unused);
1463         }
1464 }
1465
1466 /*
1467  * Must be called with priv->fw_mutex held and tx queues stopped.
1468  */
1469 #define MWL8K_TX_WAIT_TIMEOUT_MS        5000
1470
1471 static int mwl8k_tx_wait_empty(struct ieee80211_hw *hw)
1472 {
1473         struct mwl8k_priv *priv = hw->priv;
1474         DECLARE_COMPLETION_ONSTACK(tx_wait);
1475         int retry;
1476         int rc;
1477
1478         might_sleep();
1479
1480         /*
1481          * The TX queues are stopped at this point, so this test
1482          * doesn't need to take ->tx_lock.
1483          */
1484         if (!priv->pending_tx_pkts)
1485                 return 0;
1486
1487         retry = 0;
1488         rc = 0;
1489
1490         spin_lock_bh(&priv->tx_lock);
1491         priv->tx_wait = &tx_wait;
1492         while (!rc) {
1493                 int oldcount;
1494                 unsigned long timeout;
1495
1496                 oldcount = priv->pending_tx_pkts;
1497
1498                 spin_unlock_bh(&priv->tx_lock);
1499                 timeout = wait_for_completion_timeout(&tx_wait,
1500                             msecs_to_jiffies(MWL8K_TX_WAIT_TIMEOUT_MS));
1501                 spin_lock_bh(&priv->tx_lock);
1502
1503                 if (timeout) {
1504                         WARN_ON(priv->pending_tx_pkts);
1505                         if (retry)
1506                                 wiphy_notice(hw->wiphy, "tx rings drained\n");
1507                         break;
1508                 }
1509
1510                 if (priv->pending_tx_pkts < oldcount) {
1511                         wiphy_notice(hw->wiphy,
1512                                      "waiting for tx rings to drain (%d -> %d pkts)\n",
1513                                      oldcount, priv->pending_tx_pkts);
1514                         retry = 1;
1515                         continue;
1516                 }
1517
1518                 priv->tx_wait = NULL;
1519
1520                 wiphy_err(hw->wiphy, "tx rings stuck for %d ms\n",
1521                           MWL8K_TX_WAIT_TIMEOUT_MS);
1522                 mwl8k_dump_tx_rings(hw);
1523
1524                 rc = -ETIMEDOUT;
1525         }
1526         spin_unlock_bh(&priv->tx_lock);
1527
1528         return rc;
1529 }
1530
1531 #define MWL8K_TXD_SUCCESS(status)                               \
1532         ((status) & (MWL8K_TXD_STATUS_OK |                      \
1533                      MWL8K_TXD_STATUS_OK_RETRY |                \
1534                      MWL8K_TXD_STATUS_OK_MORE_RETRY))
1535
1536 static int mwl8k_tid_queue_mapping(u8 tid)
1537 {
1538         BUG_ON(tid > 7);
1539
1540         switch (tid) {
1541         case 0:
1542         case 3:
1543                 return IEEE80211_AC_BE;
1544                 break;
1545         case 1:
1546         case 2:
1547                 return IEEE80211_AC_BK;
1548                 break;
1549         case 4:
1550         case 5:
1551                 return IEEE80211_AC_VI;
1552                 break;
1553         case 6:
1554         case 7:
1555                 return IEEE80211_AC_VO;
1556                 break;
1557         default:
1558                 return -1;
1559                 break;
1560         }
1561 }
1562
1563 /* The firmware will fill in the rate information
1564  * for each packet that gets queued in the hardware
1565  * in this structure
1566  */
1567
1568 struct rateinfo {
1569         __le16  format:1;
1570         __le16  short_gi:1;
1571         __le16  band_width:1;
1572         __le16  rate_id_mcs:6;
1573         __le16  adv_coding:2;
1574         __le16  antenna:2;
1575         __le16  act_sub_chan:2;
1576         __le16  preamble_type:1;
1577         __le16  power_id:4;
1578         __le16  antenna2:1;
1579         __le16  reserved:1;
1580         __le16  tx_bf_frame:1;
1581         __le16  green_field:1;
1582 } __packed;
1583
1584 static int
1585 mwl8k_txq_reclaim(struct ieee80211_hw *hw, int index, int limit, int force)
1586 {
1587         struct mwl8k_priv *priv = hw->priv;
1588         struct mwl8k_tx_queue *txq = priv->txq + index;
1589         int processed;
1590
1591         processed = 0;
1592         while (txq->len > 0 && limit--) {
1593                 int tx;
1594                 struct mwl8k_tx_desc *tx_desc;
1595                 unsigned long addr;
1596                 int size;
1597                 struct sk_buff *skb;
1598                 struct ieee80211_tx_info *info;
1599                 u32 status;
1600                 struct ieee80211_sta *sta;
1601                 struct mwl8k_sta *sta_info = NULL;
1602                 u16 rate_info;
1603                 struct rateinfo *rate;
1604                 struct ieee80211_hdr *wh;
1605
1606                 tx = txq->head;
1607                 tx_desc = txq->txd + tx;
1608
1609                 status = le32_to_cpu(tx_desc->status);
1610
1611                 if (status & MWL8K_TXD_STATUS_FW_OWNED) {
1612                         if (!force)
1613                                 break;
1614                         tx_desc->status &=
1615                                 ~cpu_to_le32(MWL8K_TXD_STATUS_FW_OWNED);
1616                 }
1617
1618                 txq->head = (tx + 1) % MWL8K_TX_DESCS;
1619                 BUG_ON(txq->len == 0);
1620                 txq->len--;
1621                 priv->pending_tx_pkts--;
1622
1623                 addr = le32_to_cpu(tx_desc->pkt_phys_addr);
1624                 size = le16_to_cpu(tx_desc->pkt_len);
1625                 skb = txq->skb[tx];
1626                 txq->skb[tx] = NULL;
1627
1628                 BUG_ON(skb == NULL);
1629                 pci_unmap_single(priv->pdev, addr, size, PCI_DMA_TODEVICE);
1630
1631                 mwl8k_remove_dma_header(skb, tx_desc->qos_control);
1632
1633                 wh = (struct ieee80211_hdr *) skb->data;
1634
1635                 /* Mark descriptor as unused */
1636                 tx_desc->pkt_phys_addr = 0;
1637                 tx_desc->pkt_len = 0;
1638
1639                 info = IEEE80211_SKB_CB(skb);
1640                 if (ieee80211_is_data(wh->frame_control)) {
1641                         sta = info->control.sta;
1642                         if (sta) {
1643                                 sta_info = MWL8K_STA(sta);
1644                                 BUG_ON(sta_info == NULL);
1645                                 rate_info = le16_to_cpu(tx_desc->rate_info);
1646                                 rate = (struct rateinfo *)&rate_info;
1647                                 /* If rate is < 6.5 Mpbs for an ht station
1648                                  * do not form an ampdu. If the station is a
1649                                  * legacy station (format = 0), do not form an
1650                                  * ampdu
1651                                  */
1652                                 if (rate->rate_id_mcs < 1 ||
1653                                     rate->format == 0) {
1654                                         sta_info->is_ampdu_allowed = false;
1655                                 } else {
1656                                         sta_info->is_ampdu_allowed = true;
1657                                 }
1658                         }
1659                 }
1660
1661                 ieee80211_tx_info_clear_status(info);
1662
1663                 /* Rate control is happening in the firmware.
1664                  * Ensure no tx rate is being reported.
1665                  */
1666                 info->status.rates[0].idx = -1;
1667                 info->status.rates[0].count = 1;
1668
1669                 if (MWL8K_TXD_SUCCESS(status))
1670                         info->flags |= IEEE80211_TX_STAT_ACK;
1671
1672                 ieee80211_tx_status_irqsafe(hw, skb);
1673
1674                 processed++;
1675         }
1676
1677         return processed;
1678 }
1679
1680 /* must be called only when the card's transmit is completely halted */
1681 static void mwl8k_txq_deinit(struct ieee80211_hw *hw, int index)
1682 {
1683         struct mwl8k_priv *priv = hw->priv;
1684         struct mwl8k_tx_queue *txq = priv->txq + index;
1685
1686         if (txq->txd == NULL)
1687                 return;
1688
1689         mwl8k_txq_reclaim(hw, index, INT_MAX, 1);
1690
1691         kfree(txq->skb);
1692         txq->skb = NULL;
1693
1694         pci_free_consistent(priv->pdev,
1695                             MWL8K_TX_DESCS * sizeof(struct mwl8k_tx_desc),
1696                             txq->txd, txq->txd_dma);
1697         txq->txd = NULL;
1698 }
1699
1700 /* caller must hold priv->stream_lock when calling the stream functions */
1701 static struct mwl8k_ampdu_stream *
1702 mwl8k_add_stream(struct ieee80211_hw *hw, struct ieee80211_sta *sta, u8 tid)
1703 {
1704         struct mwl8k_ampdu_stream *stream;
1705         struct mwl8k_priv *priv = hw->priv;
1706         int i;
1707
1708         for (i = 0; i < priv->num_ampdu_queues; i++) {
1709                 stream = &priv->ampdu[i];
1710                 if (stream->state == AMPDU_NO_STREAM) {
1711                         stream->sta = sta;
1712                         stream->state = AMPDU_STREAM_NEW;
1713                         stream->tid = tid;
1714                         stream->idx = i;
1715                         stream->txq_idx = MWL8K_TX_WMM_QUEUES + i;
1716                         wiphy_debug(hw->wiphy, "Added a new stream for %pM %d",
1717                                     sta->addr, tid);
1718                         return stream;
1719                 }
1720         }
1721         return NULL;
1722 }
1723
1724 static int
1725 mwl8k_start_stream(struct ieee80211_hw *hw, struct mwl8k_ampdu_stream *stream)
1726 {
1727         int ret;
1728
1729         /* if the stream has already been started, don't start it again */
1730         if (stream->state != AMPDU_STREAM_NEW)
1731                 return 0;
1732         ret = ieee80211_start_tx_ba_session(stream->sta, stream->tid, 0);
1733         if (ret)
1734                 wiphy_debug(hw->wiphy, "Failed to start stream for %pM %d: "
1735                             "%d\n", stream->sta->addr, stream->tid, ret);
1736         else
1737                 wiphy_debug(hw->wiphy, "Started stream for %pM %d\n",
1738                             stream->sta->addr, stream->tid);
1739         return ret;
1740 }
1741
1742 static void
1743 mwl8k_remove_stream(struct ieee80211_hw *hw, struct mwl8k_ampdu_stream *stream)
1744 {
1745         wiphy_debug(hw->wiphy, "Remove stream for %pM %d\n", stream->sta->addr,
1746                     stream->tid);
1747         memset(stream, 0, sizeof(*stream));
1748 }
1749
1750 static struct mwl8k_ampdu_stream *
1751 mwl8k_lookup_stream(struct ieee80211_hw *hw, u8 *addr, u8 tid)
1752 {
1753         struct mwl8k_priv *priv = hw->priv;
1754         int i;
1755
1756         for (i = 0 ; i < priv->num_ampdu_queues; i++) {
1757                 struct mwl8k_ampdu_stream *stream;
1758                 stream = &priv->ampdu[i];
1759                 if (stream->state == AMPDU_NO_STREAM)
1760                         continue;
1761                 if (!memcmp(stream->sta->addr, addr, ETH_ALEN) &&
1762                     stream->tid == tid)
1763                         return stream;
1764         }
1765         return NULL;
1766 }
1767
1768 #define MWL8K_AMPDU_PACKET_THRESHOLD 64
1769 static inline bool mwl8k_ampdu_allowed(struct ieee80211_sta *sta, u8 tid)
1770 {
1771         struct mwl8k_sta *sta_info = MWL8K_STA(sta);
1772         struct tx_traffic_info *tx_stats;
1773
1774         BUG_ON(tid >= MWL8K_MAX_TID);
1775         tx_stats = &sta_info->tx_stats[tid];
1776
1777         return sta_info->is_ampdu_allowed &&
1778                 tx_stats->pkts > MWL8K_AMPDU_PACKET_THRESHOLD;
1779 }
1780
1781 static inline void mwl8k_tx_count_packet(struct ieee80211_sta *sta, u8 tid)
1782 {
1783         struct mwl8k_sta *sta_info = MWL8K_STA(sta);
1784         struct tx_traffic_info *tx_stats;
1785
1786         BUG_ON(tid >= MWL8K_MAX_TID);
1787         tx_stats = &sta_info->tx_stats[tid];
1788
1789         if (tx_stats->start_time == 0)
1790                 tx_stats->start_time = jiffies;
1791
1792         /* reset the packet count after each second elapses.  If the number of
1793          * packets ever exceeds the ampdu_min_traffic threshold, we will allow
1794          * an ampdu stream to be started.
1795          */
1796         if (jiffies - tx_stats->start_time > HZ) {
1797                 tx_stats->pkts = 0;
1798                 tx_stats->start_time = 0;
1799         } else
1800                 tx_stats->pkts++;
1801 }
1802
1803 static void
1804 mwl8k_txq_xmit(struct ieee80211_hw *hw, int index, struct sk_buff *skb)
1805 {
1806         struct mwl8k_priv *priv = hw->priv;
1807         struct ieee80211_tx_info *tx_info;
1808         struct mwl8k_vif *mwl8k_vif;
1809         struct ieee80211_sta *sta;
1810         struct ieee80211_hdr *wh;
1811         struct mwl8k_tx_queue *txq;
1812         struct mwl8k_tx_desc *tx;
1813         dma_addr_t dma;
1814         u32 txstatus;
1815         u8 txdatarate;
1816         u16 qos;
1817         int txpriority;
1818         u8 tid = 0;
1819         struct mwl8k_ampdu_stream *stream = NULL;
1820         bool start_ba_session = false;
1821         bool mgmtframe = false;
1822         struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)skb->data;
1823
1824         wh = (struct ieee80211_hdr *)skb->data;
1825         if (ieee80211_is_data_qos(wh->frame_control))
1826                 qos = le16_to_cpu(*((__le16 *)ieee80211_get_qos_ctl(wh)));
1827         else
1828                 qos = 0;
1829
1830         if (ieee80211_is_mgmt(wh->frame_control))
1831                 mgmtframe = true;
1832
1833         if (priv->ap_fw)
1834                 mwl8k_encapsulate_tx_frame(skb);
1835         else
1836                 mwl8k_add_dma_header(skb, 0);
1837
1838         wh = &((struct mwl8k_dma_data *)skb->data)->wh;
1839
1840         tx_info = IEEE80211_SKB_CB(skb);
1841         sta = tx_info->control.sta;
1842         mwl8k_vif = MWL8K_VIF(tx_info->control.vif);
1843
1844         if (tx_info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) {
1845                 wh->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG);
1846                 wh->seq_ctrl |= cpu_to_le16(mwl8k_vif->seqno);
1847                 mwl8k_vif->seqno += 0x10;
1848         }
1849
1850         /* Setup firmware control bit fields for each frame type.  */
1851         txstatus = 0;
1852         txdatarate = 0;
1853         if (ieee80211_is_mgmt(wh->frame_control) ||
1854             ieee80211_is_ctl(wh->frame_control)) {
1855                 txdatarate = 0;
1856                 qos |= MWL8K_QOS_QLEN_UNSPEC | MWL8K_QOS_EOSP;
1857         } else if (ieee80211_is_data(wh->frame_control)) {
1858                 txdatarate = 1;
1859                 if (is_multicast_ether_addr(wh->addr1))
1860                         txstatus |= MWL8K_TXD_STATUS_MULTICAST_TX;
1861
1862                 qos &= ~MWL8K_QOS_ACK_POLICY_MASK;
1863                 if (tx_info->flags & IEEE80211_TX_CTL_AMPDU)
1864                         qos |= MWL8K_QOS_ACK_POLICY_BLOCKACK;
1865                 else
1866                         qos |= MWL8K_QOS_ACK_POLICY_NORMAL;
1867         }
1868
1869         /* Queue ADDBA request in the respective data queue.  While setting up
1870          * the ampdu stream, mac80211 queues further packets for that
1871          * particular ra/tid pair.  However, packets piled up in the hardware
1872          * for that ra/tid pair will still go out. ADDBA request and the
1873          * related data packets going out from different queues asynchronously
1874          * will cause a shift in the receiver window which might result in
1875          * ampdu packets getting dropped at the receiver after the stream has
1876          * been setup.
1877          */
1878         if (unlikely(ieee80211_is_action(wh->frame_control) &&
1879             mgmt->u.action.category == WLAN_CATEGORY_BACK &&
1880             mgmt->u.action.u.addba_req.action_code == WLAN_ACTION_ADDBA_REQ &&
1881             priv->ap_fw)) {
1882                 u16 capab = le16_to_cpu(mgmt->u.action.u.addba_req.capab);
1883                 tid = (capab & IEEE80211_ADDBA_PARAM_TID_MASK) >> 2;
1884                 index = mwl8k_tid_queue_mapping(tid);
1885         }
1886
1887         txpriority = index;
1888
1889         if (ieee80211_is_data_qos(wh->frame_control) &&
1890             skb->protocol != cpu_to_be16(ETH_P_PAE) &&
1891             sta->ht_cap.ht_supported && priv->ap_fw) {
1892                 tid = qos & 0xf;
1893                 mwl8k_tx_count_packet(sta, tid);
1894                 spin_lock(&priv->stream_lock);
1895                 stream = mwl8k_lookup_stream(hw, sta->addr, tid);
1896                 if (stream != NULL) {
1897                         if (stream->state == AMPDU_STREAM_ACTIVE) {
1898                                 txpriority = stream->txq_idx;
1899                                 index = stream->txq_idx;
1900                         } else if (stream->state == AMPDU_STREAM_NEW) {
1901                                 /* We get here if the driver sends us packets
1902                                  * after we've initiated a stream, but before
1903                                  * our ampdu_action routine has been called
1904                                  * with IEEE80211_AMPDU_TX_START to get the SSN
1905                                  * for the ADDBA request.  So this packet can
1906                                  * go out with no risk of sequence number
1907                                  * mismatch.  No special handling is required.
1908                                  */
1909                         } else {
1910                                 /* Drop packets that would go out after the
1911                                  * ADDBA request was sent but before the ADDBA
1912                                  * response is received.  If we don't do this,
1913                                  * the recipient would probably receive it
1914                                  * after the ADDBA request with SSN 0.  This
1915                                  * will cause the recipient's BA receive window
1916                                  * to shift, which would cause the subsequent
1917                                  * packets in the BA stream to be discarded.
1918                                  * mac80211 queues our packets for us in this
1919                                  * case, so this is really just a safety check.
1920                                  */
1921                                 wiphy_warn(hw->wiphy,
1922                                            "Cannot send packet while ADDBA "
1923                                            "dialog is underway.\n");
1924                                 spin_unlock(&priv->stream_lock);
1925                                 dev_kfree_skb(skb);
1926                                 return;
1927                         }
1928                 } else {
1929                         /* Defer calling mwl8k_start_stream so that the current
1930                          * skb can go out before the ADDBA request.  This
1931                          * prevents sequence number mismatch at the recepient
1932                          * as described above.
1933                          */
1934                         if (mwl8k_ampdu_allowed(sta, tid)) {
1935                                 stream = mwl8k_add_stream(hw, sta, tid);
1936                                 if (stream != NULL)
1937                                         start_ba_session = true;
1938                         }
1939                 }
1940                 spin_unlock(&priv->stream_lock);
1941         }
1942
1943         dma = pci_map_single(priv->pdev, skb->data,
1944                                 skb->len, PCI_DMA_TODEVICE);
1945
1946         if (pci_dma_mapping_error(priv->pdev, dma)) {
1947                 wiphy_debug(hw->wiphy,
1948                             "failed to dma map skb, dropping TX frame.\n");
1949                 if (start_ba_session) {
1950                         spin_lock(&priv->stream_lock);
1951                         mwl8k_remove_stream(hw, stream);
1952                         spin_unlock(&priv->stream_lock);
1953                 }
1954                 dev_kfree_skb(skb);
1955                 return;
1956         }
1957
1958         spin_lock_bh(&priv->tx_lock);
1959
1960         txq = priv->txq + index;
1961
1962         /* Mgmt frames that go out frequently are probe
1963          * responses. Other mgmt frames got out relatively
1964          * infrequently. Hence reserve 2 buffers so that
1965          * other mgmt frames do not get dropped due to an
1966          * already queued probe response in one of the
1967          * reserved buffers.
1968          */
1969
1970         if (txq->len >= MWL8K_TX_DESCS - 2) {
1971                 if (mgmtframe == false ||
1972                         txq->len == MWL8K_TX_DESCS) {
1973                         if (start_ba_session) {
1974                                 spin_lock(&priv->stream_lock);
1975                                 mwl8k_remove_stream(hw, stream);
1976                                 spin_unlock(&priv->stream_lock);
1977                         }
1978                         spin_unlock_bh(&priv->tx_lock);
1979                         dev_kfree_skb(skb);
1980                         return;
1981                 }
1982         }
1983
1984         BUG_ON(txq->skb[txq->tail] != NULL);
1985         txq->skb[txq->tail] = skb;
1986
1987         tx = txq->txd + txq->tail;
1988         tx->data_rate = txdatarate;
1989         tx->tx_priority = txpriority;
1990         tx->qos_control = cpu_to_le16(qos);
1991         tx->pkt_phys_addr = cpu_to_le32(dma);
1992         tx->pkt_len = cpu_to_le16(skb->len);
1993         tx->rate_info = 0;
1994         if (!priv->ap_fw && tx_info->control.sta != NULL)
1995                 tx->peer_id = MWL8K_STA(tx_info->control.sta)->peer_id;
1996         else
1997                 tx->peer_id = 0;
1998
1999         if (priv->ap_fw)
2000                 tx->timestamp = cpu_to_le32(ioread32(priv->regs +
2001                                                 MWL8K_HW_TIMER_REGISTER));
2002
2003         wmb();
2004         tx->status = cpu_to_le32(MWL8K_TXD_STATUS_FW_OWNED | txstatus);
2005
2006         txq->len++;
2007         priv->pending_tx_pkts++;
2008
2009         txq->tail++;
2010         if (txq->tail == MWL8K_TX_DESCS)
2011                 txq->tail = 0;
2012
2013         mwl8k_tx_start(priv);
2014
2015         spin_unlock_bh(&priv->tx_lock);
2016
2017         /* Initiate the ampdu session here */
2018         if (start_ba_session) {
2019                 spin_lock(&priv->stream_lock);
2020                 if (mwl8k_start_stream(hw, stream))
2021                         mwl8k_remove_stream(hw, stream);
2022                 spin_unlock(&priv->stream_lock);
2023         }
2024 }
2025
2026
2027 /*
2028  * Firmware access.
2029  *
2030  * We have the following requirements for issuing firmware commands:
2031  * - Some commands require that the packet transmit path is idle when
2032  *   the command is issued.  (For simplicity, we'll just quiesce the
2033  *   transmit path for every command.)
2034  * - There are certain sequences of commands that need to be issued to
2035  *   the hardware sequentially, with no other intervening commands.
2036  *
2037  * This leads to an implementation of a "firmware lock" as a mutex that
2038  * can be taken recursively, and which is taken by both the low-level
2039  * command submission function (mwl8k_post_cmd) as well as any users of
2040  * that function that require issuing of an atomic sequence of commands,
2041  * and quiesces the transmit path whenever it's taken.
2042  */
2043 static int mwl8k_fw_lock(struct ieee80211_hw *hw)
2044 {
2045         struct mwl8k_priv *priv = hw->priv;
2046
2047         if (priv->fw_mutex_owner != current) {
2048                 int rc;
2049
2050                 mutex_lock(&priv->fw_mutex);
2051                 ieee80211_stop_queues(hw);
2052
2053                 rc = mwl8k_tx_wait_empty(hw);
2054                 if (rc) {
2055                         ieee80211_wake_queues(hw);
2056                         mutex_unlock(&priv->fw_mutex);
2057
2058                         return rc;
2059                 }
2060
2061                 priv->fw_mutex_owner = current;
2062         }
2063
2064         priv->fw_mutex_depth++;
2065
2066         return 0;
2067 }
2068
2069 static void mwl8k_fw_unlock(struct ieee80211_hw *hw)
2070 {
2071         struct mwl8k_priv *priv = hw->priv;
2072
2073         if (!--priv->fw_mutex_depth) {
2074                 ieee80211_wake_queues(hw);
2075                 priv->fw_mutex_owner = NULL;
2076                 mutex_unlock(&priv->fw_mutex);
2077         }
2078 }
2079
2080
2081 /*
2082  * Command processing.
2083  */
2084
2085 /* Timeout firmware commands after 10s */
2086 #define MWL8K_CMD_TIMEOUT_MS    10000
2087
2088 static int mwl8k_post_cmd(struct ieee80211_hw *hw, struct mwl8k_cmd_pkt *cmd)
2089 {
2090         DECLARE_COMPLETION_ONSTACK(cmd_wait);
2091         struct mwl8k_priv *priv = hw->priv;
2092         void __iomem *regs = priv->regs;
2093         dma_addr_t dma_addr;
2094         unsigned int dma_size;
2095         int rc;
2096         unsigned long timeout = 0;
2097         u8 buf[32];
2098
2099         cmd->result = (__force __le16) 0xffff;
2100         dma_size = le16_to_cpu(cmd->length);
2101         dma_addr = pci_map_single(priv->pdev, cmd, dma_size,
2102                                   PCI_DMA_BIDIRECTIONAL);
2103         if (pci_dma_mapping_error(priv->pdev, dma_addr))
2104                 return -ENOMEM;
2105
2106         rc = mwl8k_fw_lock(hw);
2107         if (rc) {
2108                 pci_unmap_single(priv->pdev, dma_addr, dma_size,
2109                                                 PCI_DMA_BIDIRECTIONAL);
2110                 return rc;
2111         }
2112
2113         priv->hostcmd_wait = &cmd_wait;
2114         iowrite32(dma_addr, regs + MWL8K_HIU_GEN_PTR);
2115         iowrite32(MWL8K_H2A_INT_DOORBELL,
2116                 regs + MWL8K_HIU_H2A_INTERRUPT_EVENTS);
2117         iowrite32(MWL8K_H2A_INT_DUMMY,
2118                 regs + MWL8K_HIU_H2A_INTERRUPT_EVENTS);
2119
2120         timeout = wait_for_completion_timeout(&cmd_wait,
2121                                 msecs_to_jiffies(MWL8K_CMD_TIMEOUT_MS));
2122
2123         priv->hostcmd_wait = NULL;
2124
2125         mwl8k_fw_unlock(hw);
2126
2127         pci_unmap_single(priv->pdev, dma_addr, dma_size,
2128                                         PCI_DMA_BIDIRECTIONAL);
2129
2130         if (!timeout) {
2131                 wiphy_err(hw->wiphy, "Command %s timeout after %u ms\n",
2132                           mwl8k_cmd_name(cmd->code, buf, sizeof(buf)),
2133                           MWL8K_CMD_TIMEOUT_MS);
2134                 rc = -ETIMEDOUT;
2135         } else {
2136                 int ms;
2137
2138                 ms = MWL8K_CMD_TIMEOUT_MS - jiffies_to_msecs(timeout);
2139
2140                 rc = cmd->result ? -EINVAL : 0;
2141                 if (rc)
2142                         wiphy_err(hw->wiphy, "Command %s error 0x%x\n",
2143                                   mwl8k_cmd_name(cmd->code, buf, sizeof(buf)),
2144                                   le16_to_cpu(cmd->result));
2145                 else if (ms > 2000)
2146                         wiphy_notice(hw->wiphy, "Command %s took %d ms\n",
2147                                      mwl8k_cmd_name(cmd->code,
2148                                                     buf, sizeof(buf)),
2149                                      ms);
2150         }
2151
2152         return rc;
2153 }
2154
2155 static int mwl8k_post_pervif_cmd(struct ieee80211_hw *hw,
2156                                  struct ieee80211_vif *vif,
2157                                  struct mwl8k_cmd_pkt *cmd)
2158 {
2159         if (vif != NULL)
2160                 cmd->macid = MWL8K_VIF(vif)->macid;
2161         return mwl8k_post_cmd(hw, cmd);
2162 }
2163
2164 /*
2165  * Setup code shared between STA and AP firmware images.
2166  */
2167 static void mwl8k_setup_2ghz_band(struct ieee80211_hw *hw)
2168 {
2169         struct mwl8k_priv *priv = hw->priv;
2170
2171         BUILD_BUG_ON(sizeof(priv->channels_24) != sizeof(mwl8k_channels_24));
2172         memcpy(priv->channels_24, mwl8k_channels_24, sizeof(mwl8k_channels_24));
2173
2174         BUILD_BUG_ON(sizeof(priv->rates_24) != sizeof(mwl8k_rates_24));
2175         memcpy(priv->rates_24, mwl8k_rates_24, sizeof(mwl8k_rates_24));
2176
2177         priv->band_24.band = IEEE80211_BAND_2GHZ;
2178         priv->band_24.channels = priv->channels_24;
2179         priv->band_24.n_channels = ARRAY_SIZE(mwl8k_channels_24);
2180         priv->band_24.bitrates = priv->rates_24;
2181         priv->band_24.n_bitrates = ARRAY_SIZE(mwl8k_rates_24);
2182
2183         hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &priv->band_24;
2184 }
2185
2186 static void mwl8k_setup_5ghz_band(struct ieee80211_hw *hw)
2187 {
2188         struct mwl8k_priv *priv = hw->priv;
2189
2190         BUILD_BUG_ON(sizeof(priv->channels_50) != sizeof(mwl8k_channels_50));
2191         memcpy(priv->channels_50, mwl8k_channels_50, sizeof(mwl8k_channels_50));
2192
2193         BUILD_BUG_ON(sizeof(priv->rates_50) != sizeof(mwl8k_rates_50));
2194         memcpy(priv->rates_50, mwl8k_rates_50, sizeof(mwl8k_rates_50));
2195
2196         priv->band_50.band = IEEE80211_BAND_5GHZ;
2197         priv->band_50.channels = priv->channels_50;
2198         priv->band_50.n_channels = ARRAY_SIZE(mwl8k_channels_50);
2199         priv->band_50.bitrates = priv->rates_50;
2200         priv->band_50.n_bitrates = ARRAY_SIZE(mwl8k_rates_50);
2201
2202         hw->wiphy->bands[IEEE80211_BAND_5GHZ] = &priv->band_50;
2203 }
2204
2205 /*
2206  * CMD_GET_HW_SPEC (STA version).
2207  */
2208 struct mwl8k_cmd_get_hw_spec_sta {
2209         struct mwl8k_cmd_pkt header;
2210         __u8 hw_rev;
2211         __u8 host_interface;
2212         __le16 num_mcaddrs;
2213         __u8 perm_addr[ETH_ALEN];
2214         __le16 region_code;
2215         __le32 fw_rev;
2216         __le32 ps_cookie;
2217         __le32 caps;
2218         __u8 mcs_bitmap[16];
2219         __le32 rx_queue_ptr;
2220         __le32 num_tx_queues;
2221         __le32 tx_queue_ptrs[MWL8K_TX_WMM_QUEUES];
2222         __le32 caps2;
2223         __le32 num_tx_desc_per_queue;
2224         __le32 total_rxd;
2225 } __packed;
2226
2227 #define MWL8K_CAP_MAX_AMSDU             0x20000000
2228 #define MWL8K_CAP_GREENFIELD            0x08000000
2229 #define MWL8K_CAP_AMPDU                 0x04000000
2230 #define MWL8K_CAP_RX_STBC               0x01000000
2231 #define MWL8K_CAP_TX_STBC               0x00800000
2232 #define MWL8K_CAP_SHORTGI_40MHZ         0x00400000
2233 #define MWL8K_CAP_SHORTGI_20MHZ         0x00200000
2234 #define MWL8K_CAP_RX_ANTENNA_MASK       0x000e0000
2235 #define MWL8K_CAP_TX_ANTENNA_MASK       0x0001c000
2236 #define MWL8K_CAP_DELAY_BA              0x00003000
2237 #define MWL8K_CAP_MIMO                  0x00000200
2238 #define MWL8K_CAP_40MHZ                 0x00000100
2239 #define MWL8K_CAP_BAND_MASK             0x00000007
2240 #define MWL8K_CAP_5GHZ                  0x00000004
2241 #define MWL8K_CAP_2GHZ4                 0x00000001
2242
2243 static void
2244 mwl8k_set_ht_caps(struct ieee80211_hw *hw,
2245                   struct ieee80211_supported_band *band, u32 cap)
2246 {
2247         int rx_streams;
2248         int tx_streams;
2249
2250         band->ht_cap.ht_supported = 1;
2251
2252         if (cap & MWL8K_CAP_MAX_AMSDU)
2253                 band->ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
2254         if (cap & MWL8K_CAP_GREENFIELD)
2255                 band->ht_cap.cap |= IEEE80211_HT_CAP_GRN_FLD;
2256         if (cap & MWL8K_CAP_AMPDU) {
2257                 hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION;
2258                 band->ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
2259                 band->ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_NONE;
2260         }
2261         if (cap & MWL8K_CAP_RX_STBC)
2262                 band->ht_cap.cap |= IEEE80211_HT_CAP_RX_STBC;
2263         if (cap & MWL8K_CAP_TX_STBC)
2264                 band->ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
2265         if (cap & MWL8K_CAP_SHORTGI_40MHZ)
2266                 band->ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
2267         if (cap & MWL8K_CAP_SHORTGI_20MHZ)
2268                 band->ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
2269         if (cap & MWL8K_CAP_DELAY_BA)
2270                 band->ht_cap.cap |= IEEE80211_HT_CAP_DELAY_BA;
2271         if (cap & MWL8K_CAP_40MHZ)
2272                 band->ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
2273
2274         rx_streams = hweight32(cap & MWL8K_CAP_RX_ANTENNA_MASK);
2275         tx_streams = hweight32(cap & MWL8K_CAP_TX_ANTENNA_MASK);
2276
2277         band->ht_cap.mcs.rx_mask[0] = 0xff;
2278         if (rx_streams >= 2)
2279                 band->ht_cap.mcs.rx_mask[1] = 0xff;
2280         if (rx_streams >= 3)
2281                 band->ht_cap.mcs.rx_mask[2] = 0xff;
2282         band->ht_cap.mcs.rx_mask[4] = 0x01;
2283         band->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
2284
2285         if (rx_streams != tx_streams) {
2286                 band->ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_RX_DIFF;
2287                 band->ht_cap.mcs.tx_params |= (tx_streams - 1) <<
2288                                 IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT;
2289         }
2290 }
2291
2292 static void
2293 mwl8k_set_caps(struct ieee80211_hw *hw, u32 caps)
2294 {
2295         struct mwl8k_priv *priv = hw->priv;
2296
2297         if ((caps & MWL8K_CAP_2GHZ4) || !(caps & MWL8K_CAP_BAND_MASK)) {
2298                 mwl8k_setup_2ghz_band(hw);
2299                 if (caps & MWL8K_CAP_MIMO)
2300                         mwl8k_set_ht_caps(hw, &priv->band_24, caps);
2301         }
2302
2303         if (caps & MWL8K_CAP_5GHZ) {
2304                 mwl8k_setup_5ghz_band(hw);
2305                 if (caps & MWL8K_CAP_MIMO)
2306                         mwl8k_set_ht_caps(hw, &priv->band_50, caps);
2307         }
2308 }
2309
2310 static int mwl8k_cmd_get_hw_spec_sta(struct ieee80211_hw *hw)
2311 {
2312         struct mwl8k_priv *priv = hw->priv;
2313         struct mwl8k_cmd_get_hw_spec_sta *cmd;
2314         int rc;
2315         int i;
2316
2317         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
2318         if (cmd == NULL)
2319                 return -ENOMEM;
2320
2321         cmd->header.code = cpu_to_le16(MWL8K_CMD_GET_HW_SPEC);
2322         cmd->header.length = cpu_to_le16(sizeof(*cmd));
2323
2324         memset(cmd->perm_addr, 0xff, sizeof(cmd->perm_addr));
2325         cmd->ps_cookie = cpu_to_le32(priv->cookie_dma);
2326         cmd->rx_queue_ptr = cpu_to_le32(priv->rxq[0].rxd_dma);
2327         cmd->num_tx_queues = cpu_to_le32(mwl8k_tx_queues(priv));
2328         for (i = 0; i < mwl8k_tx_queues(priv); i++)
2329                 cmd->tx_queue_ptrs[i] = cpu_to_le32(priv->txq[i].txd_dma);
2330         cmd->num_tx_desc_per_queue = cpu_to_le32(MWL8K_TX_DESCS);
2331         cmd->total_rxd = cpu_to_le32(MWL8K_RX_DESCS);
2332
2333         rc = mwl8k_post_cmd(hw, &cmd->header);
2334
2335         if (!rc) {
2336                 SET_IEEE80211_PERM_ADDR(hw, cmd->perm_addr);
2337                 priv->num_mcaddrs = le16_to_cpu(cmd->num_mcaddrs);
2338                 priv->fw_rev = le32_to_cpu(cmd->fw_rev);
2339                 priv->hw_rev = cmd->hw_rev;
2340                 mwl8k_set_caps(hw, le32_to_cpu(cmd->caps));
2341                 priv->ap_macids_supported = 0x00000000;
2342                 priv->sta_macids_supported = 0x00000001;
2343         }
2344
2345         kfree(cmd);
2346         return rc;
2347 }
2348
2349 /*
2350  * CMD_GET_HW_SPEC (AP version).
2351  */
2352 struct mwl8k_cmd_get_hw_spec_ap {
2353         struct mwl8k_cmd_pkt header;
2354         __u8 hw_rev;
2355         __u8 host_interface;
2356         __le16 num_wcb;
2357         __le16 num_mcaddrs;
2358         __u8 perm_addr[ETH_ALEN];
2359         __le16 region_code;
2360         __le16 num_antenna;
2361         __le32 fw_rev;
2362         __le32 wcbbase0;
2363         __le32 rxwrptr;
2364         __le32 rxrdptr;
2365         __le32 ps_cookie;
2366         __le32 wcbbase1;
2367         __le32 wcbbase2;
2368         __le32 wcbbase3;
2369         __le32 fw_api_version;
2370         __le32 caps;
2371         __le32 num_of_ampdu_queues;
2372         __le32 wcbbase_ampdu[MWL8K_MAX_AMPDU_QUEUES];
2373 } __packed;
2374
2375 static int mwl8k_cmd_get_hw_spec_ap(struct ieee80211_hw *hw)
2376 {
2377         struct mwl8k_priv *priv = hw->priv;
2378         struct mwl8k_cmd_get_hw_spec_ap *cmd;
2379         int rc, i;
2380         u32 api_version;
2381
2382         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
2383         if (cmd == NULL)
2384                 return -ENOMEM;
2385
2386         cmd->header.code = cpu_to_le16(MWL8K_CMD_GET_HW_SPEC);
2387         cmd->header.length = cpu_to_le16(sizeof(*cmd));
2388
2389         memset(cmd->perm_addr, 0xff, sizeof(cmd->perm_addr));
2390         cmd->ps_cookie = cpu_to_le32(priv->cookie_dma);
2391
2392         rc = mwl8k_post_cmd(hw, &cmd->header);
2393
2394         if (!rc) {
2395                 int off;
2396
2397                 api_version = le32_to_cpu(cmd->fw_api_version);
2398                 if (priv->device_info->fw_api_ap != api_version) {
2399                         printk(KERN_ERR "%s: Unsupported fw API version for %s."
2400                                "  Expected %d got %d.\n", MWL8K_NAME,
2401                                priv->device_info->part_name,
2402                                priv->device_info->fw_api_ap,
2403                                api_version);
2404                         rc = -EINVAL;
2405                         goto done;
2406                 }
2407                 SET_IEEE80211_PERM_ADDR(hw, cmd->perm_addr);
2408                 priv->num_mcaddrs = le16_to_cpu(cmd->num_mcaddrs);
2409                 priv->fw_rev = le32_to_cpu(cmd->fw_rev);
2410                 priv->hw_rev = cmd->hw_rev;
2411                 mwl8k_set_caps(hw, le32_to_cpu(cmd->caps));
2412                 priv->ap_macids_supported = 0x000000ff;
2413                 priv->sta_macids_supported = 0x00000000;
2414                 priv->num_ampdu_queues = le32_to_cpu(cmd->num_of_ampdu_queues);
2415                 if (priv->num_ampdu_queues > MWL8K_MAX_AMPDU_QUEUES) {
2416                         wiphy_warn(hw->wiphy, "fw reported %d ampdu queues"
2417                                    " but we only support %d.\n",
2418                                    priv->num_ampdu_queues,
2419                                    MWL8K_MAX_AMPDU_QUEUES);
2420                         priv->num_ampdu_queues = MWL8K_MAX_AMPDU_QUEUES;
2421                 }
2422                 off = le32_to_cpu(cmd->rxwrptr) & 0xffff;
2423                 iowrite32(priv->rxq[0].rxd_dma, priv->sram + off);
2424
2425                 off = le32_to_cpu(cmd->rxrdptr) & 0xffff;
2426                 iowrite32(priv->rxq[0].rxd_dma, priv->sram + off);
2427
2428                 priv->txq_offset[0] = le32_to_cpu(cmd->wcbbase0) & 0xffff;
2429                 priv->txq_offset[1] = le32_to_cpu(cmd->wcbbase1) & 0xffff;
2430                 priv->txq_offset[2] = le32_to_cpu(cmd->wcbbase2) & 0xffff;
2431                 priv->txq_offset[3] = le32_to_cpu(cmd->wcbbase3) & 0xffff;
2432
2433                 for (i = 0; i < priv->num_ampdu_queues; i++)
2434                         priv->txq_offset[i + MWL8K_TX_WMM_QUEUES] =
2435                                 le32_to_cpu(cmd->wcbbase_ampdu[i]) & 0xffff;
2436         }
2437
2438 done:
2439         kfree(cmd);
2440         return rc;
2441 }
2442
2443 /*
2444  * CMD_SET_HW_SPEC.
2445  */
2446 struct mwl8k_cmd_set_hw_spec {
2447         struct mwl8k_cmd_pkt header;
2448         __u8 hw_rev;
2449         __u8 host_interface;
2450         __le16 num_mcaddrs;
2451         __u8 perm_addr[ETH_ALEN];
2452         __le16 region_code;
2453         __le32 fw_rev;
2454         __le32 ps_cookie;
2455         __le32 caps;
2456         __le32 rx_queue_ptr;
2457         __le32 num_tx_queues;
2458         __le32 tx_queue_ptrs[MWL8K_MAX_TX_QUEUES];
2459         __le32 flags;
2460         __le32 num_tx_desc_per_queue;
2461         __le32 total_rxd;
2462 } __packed;
2463
2464 /* If enabled, MWL8K_SET_HW_SPEC_FLAG_ENABLE_LIFE_TIME_EXPIRY will cause
2465  * packets to expire 500 ms after the timestamp in the tx descriptor.  That is,
2466  * the packets that are queued for more than 500ms, will be dropped in the
2467  * hardware. This helps minimizing the issues caused due to head-of-line
2468  * blocking where a slow client can hog the bandwidth and affect traffic to a
2469  * faster client.
2470  */
2471 #define MWL8K_SET_HW_SPEC_FLAG_ENABLE_LIFE_TIME_EXPIRY  0x00000400
2472 #define MWL8K_SET_HW_SPEC_FLAG_HOST_DECR_MGMT           0x00000080
2473 #define MWL8K_SET_HW_SPEC_FLAG_HOSTFORM_PROBERESP       0x00000020
2474 #define MWL8K_SET_HW_SPEC_FLAG_HOSTFORM_BEACON          0x00000010
2475
2476 static int mwl8k_cmd_set_hw_spec(struct ieee80211_hw *hw)
2477 {
2478         struct mwl8k_priv *priv = hw->priv;
2479         struct mwl8k_cmd_set_hw_spec *cmd;
2480         int rc;
2481         int i;
2482
2483         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
2484         if (cmd == NULL)
2485                 return -ENOMEM;
2486
2487         cmd->header.code = cpu_to_le16(MWL8K_CMD_SET_HW_SPEC);
2488         cmd->header.length = cpu_to_le16(sizeof(*cmd));
2489
2490         cmd->ps_cookie = cpu_to_le32(priv->cookie_dma);
2491         cmd->rx_queue_ptr = cpu_to_le32(priv->rxq[0].rxd_dma);
2492         cmd->num_tx_queues = cpu_to_le32(mwl8k_tx_queues(priv));
2493
2494         /*
2495          * Mac80211 stack has Q0 as highest priority and Q3 as lowest in
2496          * that order. Firmware has Q3 as highest priority and Q0 as lowest
2497          * in that order. Map Q3 of mac80211 to Q0 of firmware so that the
2498          * priority is interpreted the right way in firmware.
2499          */
2500         for (i = 0; i < mwl8k_tx_queues(priv); i++) {
2501                 int j = mwl8k_tx_queues(priv) - 1 - i;
2502                 cmd->tx_queue_ptrs[i] = cpu_to_le32(priv->txq[j].txd_dma);
2503         }
2504
2505         cmd->flags = cpu_to_le32(MWL8K_SET_HW_SPEC_FLAG_HOST_DECR_MGMT |
2506                                  MWL8K_SET_HW_SPEC_FLAG_HOSTFORM_PROBERESP |
2507                                  MWL8K_SET_HW_SPEC_FLAG_HOSTFORM_BEACON |
2508                                  MWL8K_SET_HW_SPEC_FLAG_ENABLE_LIFE_TIME_EXPIRY);
2509         cmd->num_tx_desc_per_queue = cpu_to_le32(MWL8K_TX_DESCS);
2510         cmd->total_rxd = cpu_to_le32(MWL8K_RX_DESCS);
2511
2512         rc = mwl8k_post_cmd(hw, &cmd->header);
2513         kfree(cmd);
2514
2515         return rc;
2516 }
2517
2518 /*
2519  * CMD_MAC_MULTICAST_ADR.
2520  */
2521 struct mwl8k_cmd_mac_multicast_adr {
2522         struct mwl8k_cmd_pkt header;
2523         __le16 action;
2524         __le16 numaddr;
2525         __u8 addr[0][ETH_ALEN];
2526 };
2527
2528 #define MWL8K_ENABLE_RX_DIRECTED        0x0001
2529 #define MWL8K_ENABLE_RX_MULTICAST       0x0002
2530 #define MWL8K_ENABLE_RX_ALL_MULTICAST   0x0004
2531 #define MWL8K_ENABLE_RX_BROADCAST       0x0008
2532
2533 static struct mwl8k_cmd_pkt *
2534 __mwl8k_cmd_mac_multicast_adr(struct ieee80211_hw *hw, int allmulti,
2535                               struct netdev_hw_addr_list *mc_list)
2536 {
2537         struct mwl8k_priv *priv = hw->priv;
2538         struct mwl8k_cmd_mac_multicast_adr *cmd;
2539         int size;
2540         int mc_count = 0;
2541
2542         if (mc_list)
2543                 mc_count = netdev_hw_addr_list_count(mc_list);
2544
2545         if (allmulti || mc_count > priv->num_mcaddrs) {
2546                 allmulti = 1;
2547                 mc_count = 0;
2548         }
2549
2550         size = sizeof(*cmd) + mc_count * ETH_ALEN;
2551
2552         cmd = kzalloc(size, GFP_ATOMIC);
2553         if (cmd == NULL)
2554                 return NULL;
2555
2556         cmd->header.code = cpu_to_le16(MWL8K_CMD_MAC_MULTICAST_ADR);
2557         cmd->header.length = cpu_to_le16(size);
2558         cmd->action = cpu_to_le16(MWL8K_ENABLE_RX_DIRECTED |
2559                                   MWL8K_ENABLE_RX_BROADCAST);
2560
2561         if (allmulti) {
2562                 cmd->action |= cpu_to_le16(MWL8K_ENABLE_RX_ALL_MULTICAST);
2563         } else if (mc_count) {
2564                 struct netdev_hw_addr *ha;
2565                 int i = 0;
2566
2567                 cmd->action |= cpu_to_le16(MWL8K_ENABLE_RX_MULTICAST);
2568                 cmd->numaddr = cpu_to_le16(mc_count);
2569                 netdev_hw_addr_list_for_each(ha, mc_list) {
2570                         memcpy(cmd->addr[i], ha->addr, ETH_ALEN);
2571                 }
2572         }
2573
2574         return &cmd->header;
2575 }
2576
2577 /*
2578  * CMD_GET_STAT.
2579  */
2580 struct mwl8k_cmd_get_stat {
2581         struct mwl8k_cmd_pkt header;
2582         __le32 stats[64];
2583 } __packed;
2584
2585 #define MWL8K_STAT_ACK_FAILURE  9
2586 #define MWL8K_STAT_RTS_FAILURE  12
2587 #define MWL8K_STAT_FCS_ERROR    24
2588 #define MWL8K_STAT_RTS_SUCCESS  11
2589
2590 static int mwl8k_cmd_get_stat(struct ieee80211_hw *hw,
2591                               struct ieee80211_low_level_stats *stats)
2592 {
2593         struct mwl8k_cmd_get_stat *cmd;
2594         int rc;
2595
2596         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
2597         if (cmd == NULL)
2598                 return -ENOMEM;
2599
2600         cmd->header.code = cpu_to_le16(MWL8K_CMD_GET_STAT);
2601         cmd->header.length = cpu_to_le16(sizeof(*cmd));
2602
2603         rc = mwl8k_post_cmd(hw, &cmd->header);
2604         if (!rc) {
2605                 stats->dot11ACKFailureCount =
2606                         le32_to_cpu(cmd->stats[MWL8K_STAT_ACK_FAILURE]);
2607                 stats->dot11RTSFailureCount =
2608                         le32_to_cpu(cmd->stats[MWL8K_STAT_RTS_FAILURE]);
2609                 stats->dot11FCSErrorCount =
2610                         le32_to_cpu(cmd->stats[MWL8K_STAT_FCS_ERROR]);
2611                 stats->dot11RTSSuccessCount =
2612                         le32_to_cpu(cmd->stats[MWL8K_STAT_RTS_SUCCESS]);
2613         }
2614         kfree(cmd);
2615
2616         return rc;
2617 }
2618
2619 /*
2620  * CMD_RADIO_CONTROL.
2621  */
2622 struct mwl8k_cmd_radio_control {
2623         struct mwl8k_cmd_pkt header;
2624         __le16 action;
2625         __le16 control;
2626         __le16 radio_on;
2627 } __packed;
2628
2629 static int
2630 mwl8k_cmd_radio_control(struct ieee80211_hw *hw, bool enable, bool force)
2631 {
2632         struct mwl8k_priv *priv = hw->priv;
2633         struct mwl8k_cmd_radio_control *cmd;
2634         int rc;
2635
2636         if (enable == priv->radio_on && !force)
2637                 return 0;
2638
2639         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
2640         if (cmd == NULL)
2641                 return -ENOMEM;
2642
2643         cmd->header.code = cpu_to_le16(MWL8K_CMD_RADIO_CONTROL);
2644         cmd->header.length = cpu_to_le16(sizeof(*cmd));
2645         cmd->action = cpu_to_le16(MWL8K_CMD_SET);
2646         cmd->control = cpu_to_le16(priv->radio_short_preamble ? 3 : 1);
2647         cmd->radio_on = cpu_to_le16(enable ? 0x0001 : 0x0000);
2648
2649         rc = mwl8k_post_cmd(hw, &cmd->header);
2650         kfree(cmd);
2651
2652         if (!rc)
2653                 priv->radio_on = enable;
2654
2655         return rc;
2656 }
2657
2658 static int mwl8k_cmd_radio_disable(struct ieee80211_hw *hw)
2659 {
2660         return mwl8k_cmd_radio_control(hw, 0, 0);
2661 }
2662
2663 static int mwl8k_cmd_radio_enable(struct ieee80211_hw *hw)
2664 {
2665         return mwl8k_cmd_radio_control(hw, 1, 0);
2666 }
2667
2668 static int
2669 mwl8k_set_radio_preamble(struct ieee80211_hw *hw, bool short_preamble)
2670 {
2671         struct mwl8k_priv *priv = hw->priv;
2672
2673         priv->radio_short_preamble = short_preamble;
2674
2675         return mwl8k_cmd_radio_control(hw, 1, 1);
2676 }
2677
2678 /*
2679  * CMD_RF_TX_POWER.
2680  */
2681 #define MWL8K_RF_TX_POWER_LEVEL_TOTAL   8
2682
2683 struct mwl8k_cmd_rf_tx_power {
2684         struct mwl8k_cmd_pkt header;
2685         __le16 action;
2686         __le16 support_level;
2687         __le16 current_level;
2688         __le16 reserved;
2689         __le16 power_level_list[MWL8K_RF_TX_POWER_LEVEL_TOTAL];
2690 } __packed;
2691
2692 static int mwl8k_cmd_rf_tx_power(struct ieee80211_hw *hw, int dBm)
2693 {
2694         struct mwl8k_cmd_rf_tx_power *cmd;
2695         int rc;
2696
2697         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
2698         if (cmd == NULL)
2699                 return -ENOMEM;
2700
2701         cmd->header.code = cpu_to_le16(MWL8K_CMD_RF_TX_POWER);
2702         cmd->header.length = cpu_to_le16(sizeof(*cmd));
2703         cmd->action = cpu_to_le16(MWL8K_CMD_SET);
2704         cmd->support_level = cpu_to_le16(dBm);
2705
2706         rc = mwl8k_post_cmd(hw, &cmd->header);
2707         kfree(cmd);
2708
2709         return rc;
2710 }
2711
2712 /*
2713  * CMD_TX_POWER.
2714  */
2715 #define MWL8K_TX_POWER_LEVEL_TOTAL      12
2716
2717 struct mwl8k_cmd_tx_power {
2718         struct mwl8k_cmd_pkt header;
2719         __le16 action;
2720         __le16 band;
2721         __le16 channel;
2722         __le16 bw;
2723         __le16 sub_ch;
2724         __le16 power_level_list[MWL8K_TX_POWER_LEVEL_TOTAL];
2725 } __packed;
2726
2727 static int mwl8k_cmd_tx_power(struct ieee80211_hw *hw,
2728                                      struct ieee80211_conf *conf,
2729                                      unsigned short pwr)
2730 {
2731         struct ieee80211_channel *channel = conf->channel;
2732         struct mwl8k_cmd_tx_power *cmd;
2733         int rc;
2734         int i;
2735
2736         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
2737         if (cmd == NULL)
2738                 return -ENOMEM;
2739
2740         cmd->header.code = cpu_to_le16(MWL8K_CMD_TX_POWER);
2741         cmd->header.length = cpu_to_le16(sizeof(*cmd));
2742         cmd->action = cpu_to_le16(MWL8K_CMD_SET_LIST);
2743
2744         if (channel->band == IEEE80211_BAND_2GHZ)
2745                 cmd->band = cpu_to_le16(0x1);
2746         else if (channel->band == IEEE80211_BAND_5GHZ)
2747                 cmd->band = cpu_to_le16(0x4);
2748
2749         cmd->channel = channel->hw_value;
2750
2751         if (conf->channel_type == NL80211_CHAN_NO_HT ||
2752             conf->channel_type == NL80211_CHAN_HT20) {
2753                 cmd->bw = cpu_to_le16(0x2);
2754         } else {
2755                 cmd->bw = cpu_to_le16(0x4);
2756                 if (conf->channel_type == NL80211_CHAN_HT40MINUS)
2757                         cmd->sub_ch = cpu_to_le16(0x3);
2758                 else if (conf->channel_type == NL80211_CHAN_HT40PLUS)
2759                         cmd->sub_ch = cpu_to_le16(0x1);
2760         }
2761
2762         for (i = 0; i < MWL8K_TX_POWER_LEVEL_TOTAL; i++)
2763                 cmd->power_level_list[i] = cpu_to_le16(pwr);
2764
2765         rc = mwl8k_post_cmd(hw, &cmd->header);
2766         kfree(cmd);
2767
2768         return rc;
2769 }
2770
2771 /*
2772  * CMD_RF_ANTENNA.
2773  */
2774 struct mwl8k_cmd_rf_antenna {
2775         struct mwl8k_cmd_pkt header;
2776         __le16 antenna;
2777         __le16 mode;
2778 } __packed;
2779
2780 #define MWL8K_RF_ANTENNA_RX             1
2781 #define MWL8K_RF_ANTENNA_TX             2
2782
2783 static int
2784 mwl8k_cmd_rf_antenna(struct ieee80211_hw *hw, int antenna, int mask)
2785 {
2786         struct mwl8k_cmd_rf_antenna *cmd;
2787         int rc;
2788
2789         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
2790         if (cmd == NULL)
2791                 return -ENOMEM;
2792
2793         cmd->header.code = cpu_to_le16(MWL8K_CMD_RF_ANTENNA);
2794         cmd->header.length = cpu_to_le16(sizeof(*cmd));
2795         cmd->antenna = cpu_to_le16(antenna);
2796         cmd->mode = cpu_to_le16(mask);
2797
2798         rc = mwl8k_post_cmd(hw, &cmd->header);
2799         kfree(cmd);
2800
2801         return rc;
2802 }
2803
2804 /*
2805  * CMD_SET_BEACON.
2806  */
2807 struct mwl8k_cmd_set_beacon {
2808         struct mwl8k_cmd_pkt header;
2809         __le16 beacon_len;
2810         __u8 beacon[0];
2811 };
2812
2813 static int mwl8k_cmd_set_beacon(struct ieee80211_hw *hw,
2814                                 struct ieee80211_vif *vif, u8 *beacon, int len)
2815 {
2816         struct mwl8k_cmd_set_beacon *cmd;
2817         int rc;
2818
2819         cmd = kzalloc(sizeof(*cmd) + len, GFP_KERNEL);
2820         if (cmd == NULL)
2821                 return -ENOMEM;
2822
2823         cmd->header.code = cpu_to_le16(MWL8K_CMD_SET_BEACON);
2824         cmd->header.length = cpu_to_le16(sizeof(*cmd) + len);
2825         cmd->beacon_len = cpu_to_le16(len);
2826         memcpy(cmd->beacon, beacon, len);
2827
2828         rc = mwl8k_post_pervif_cmd(hw, vif, &cmd->header);
2829         kfree(cmd);
2830
2831         return rc;
2832 }
2833
2834 /*
2835  * CMD_SET_PRE_SCAN.
2836  */
2837 struct mwl8k_cmd_set_pre_scan {
2838         struct mwl8k_cmd_pkt header;
2839 } __packed;
2840
2841 static int mwl8k_cmd_set_pre_scan(struct ieee80211_hw *hw)
2842 {
2843         struct mwl8k_cmd_set_pre_scan *cmd;
2844         int rc;
2845
2846         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
2847         if (cmd == NULL)
2848                 return -ENOMEM;
2849
2850         cmd->header.code = cpu_to_le16(MWL8K_CMD_SET_PRE_SCAN);
2851         cmd->header.length = cpu_to_le16(sizeof(*cmd));
2852
2853         rc = mwl8k_post_cmd(hw, &cmd->header);
2854         kfree(cmd);
2855
2856         return rc;
2857 }
2858
2859 /*
2860  * CMD_SET_POST_SCAN.
2861  */
2862 struct mwl8k_cmd_set_post_scan {
2863         struct mwl8k_cmd_pkt header;
2864         __le32 isibss;
2865         __u8 bssid[ETH_ALEN];
2866 } __packed;
2867
2868 static int
2869 mwl8k_cmd_set_post_scan(struct ieee80211_hw *hw, const __u8 *mac)
2870 {
2871         struct mwl8k_cmd_set_post_scan *cmd;
2872         int rc;
2873
2874         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
2875         if (cmd == NULL)
2876                 return -ENOMEM;
2877
2878         cmd->header.code = cpu_to_le16(MWL8K_CMD_SET_POST_SCAN);
2879         cmd->header.length = cpu_to_le16(sizeof(*cmd));
2880         cmd->isibss = 0;
2881         memcpy(cmd->bssid, mac, ETH_ALEN);
2882
2883         rc = mwl8k_post_cmd(hw, &cmd->header);
2884         kfree(cmd);
2885
2886         return rc;
2887 }
2888
2889 /*
2890  * CMD_SET_RF_CHANNEL.
2891  */
2892 struct mwl8k_cmd_set_rf_channel {
2893         struct mwl8k_cmd_pkt header;
2894         __le16 action;
2895         __u8 current_channel;
2896         __le32 channel_flags;
2897 } __packed;
2898
2899 static int mwl8k_cmd_set_rf_channel(struct ieee80211_hw *hw,
2900                                     struct ieee80211_conf *conf)
2901 {
2902         struct ieee80211_channel *channel = conf->channel;
2903         struct mwl8k_cmd_set_rf_channel *cmd;
2904         int rc;
2905
2906         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
2907         if (cmd == NULL)
2908                 return -ENOMEM;
2909
2910         cmd->header.code = cpu_to_le16(MWL8K_CMD_SET_RF_CHANNEL);
2911         cmd->header.length = cpu_to_le16(sizeof(*cmd));
2912         cmd->action = cpu_to_le16(MWL8K_CMD_SET);
2913         cmd->current_channel = channel->hw_value;
2914
2915         if (channel->band == IEEE80211_BAND_2GHZ)
2916                 cmd->channel_flags |= cpu_to_le32(0x00000001);
2917         else if (channel->band == IEEE80211_BAND_5GHZ)
2918                 cmd->channel_flags |= cpu_to_le32(0x00000004);
2919
2920         if (conf->channel_type == NL80211_CHAN_NO_HT ||
2921             conf->channel_type == NL80211_CHAN_HT20)
2922                 cmd->channel_flags |= cpu_to_le32(0x00000080);
2923         else if (conf->channel_type == NL80211_CHAN_HT40MINUS)
2924                 cmd->channel_flags |= cpu_to_le32(0x000001900);
2925         else if (conf->channel_type == NL80211_CHAN_HT40PLUS)
2926                 cmd->channel_flags |= cpu_to_le32(0x000000900);
2927
2928         rc = mwl8k_post_cmd(hw, &cmd->header);
2929         kfree(cmd);
2930
2931         return rc;
2932 }
2933
2934 /*
2935  * CMD_SET_AID.
2936  */
2937 #define MWL8K_FRAME_PROT_DISABLED                       0x00
2938 #define MWL8K_FRAME_PROT_11G                            0x07
2939 #define MWL8K_FRAME_PROT_11N_HT_40MHZ_ONLY              0x02
2940 #define MWL8K_FRAME_PROT_11N_HT_ALL                     0x06
2941
2942 struct mwl8k_cmd_update_set_aid {
2943         struct  mwl8k_cmd_pkt header;
2944         __le16  aid;
2945
2946          /* AP's MAC address (BSSID) */
2947         __u8    bssid[ETH_ALEN];
2948         __le16  protection_mode;
2949         __u8    supp_rates[14];
2950 } __packed;
2951
2952 static void legacy_rate_mask_to_array(u8 *rates, u32 mask)
2953 {
2954         int i;
2955         int j;
2956
2957         /*
2958          * Clear nonstandard rates 4 and 13.
2959          */
2960         mask &= 0x1fef;
2961
2962         for (i = 0, j = 0; i < 14; i++) {
2963                 if (mask & (1 << i))
2964                         rates[j++] = mwl8k_rates_24[i].hw_value;
2965         }
2966 }
2967
2968 static int
2969 mwl8k_cmd_set_aid(struct ieee80211_hw *hw,
2970                   struct ieee80211_vif *vif, u32 legacy_rate_mask)
2971 {
2972         struct mwl8k_cmd_update_set_aid *cmd;
2973         u16 prot_mode;
2974         int rc;
2975
2976         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
2977         if (cmd == NULL)
2978                 return -ENOMEM;
2979
2980         cmd->header.code = cpu_to_le16(MWL8K_CMD_SET_AID);
2981         cmd->header.length = cpu_to_le16(sizeof(*cmd));
2982         cmd->aid = cpu_to_le16(vif->bss_conf.aid);
2983         memcpy(cmd->bssid, vif->bss_conf.bssid, ETH_ALEN);
2984
2985         if (vif->bss_conf.use_cts_prot) {
2986                 prot_mode = MWL8K_FRAME_PROT_11G;
2987         } else {
2988                 switch (vif->bss_conf.ht_operation_mode &
2989                         IEEE80211_HT_OP_MODE_PROTECTION) {
2990                 case IEEE80211_HT_OP_MODE_PROTECTION_20MHZ:
2991                         prot_mode = MWL8K_FRAME_PROT_11N_HT_40MHZ_ONLY;
2992                         break;
2993                 case IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED:
2994                         prot_mode = MWL8K_FRAME_PROT_11N_HT_ALL;
2995                         break;
2996                 default:
2997                         prot_mode = MWL8K_FRAME_PROT_DISABLED;
2998                         break;
2999                 }
3000         }
3001         cmd->protection_mode = cpu_to_le16(prot_mode);
3002
3003         legacy_rate_mask_to_array(cmd->supp_rates, legacy_rate_mask);
3004
3005         rc = mwl8k_post_cmd(hw, &cmd->header);
3006         kfree(cmd);
3007
3008         return rc;
3009 }
3010
3011 /*
3012  * CMD_SET_RATE.
3013  */
3014 struct mwl8k_cmd_set_rate {
3015         struct  mwl8k_cmd_pkt header;
3016         __u8    legacy_rates[14];
3017
3018         /* Bitmap for supported MCS codes.  */
3019         __u8    mcs_set[16];
3020         __u8    reserved[16];
3021 } __packed;
3022
3023 static int
3024 mwl8k_cmd_set_rate(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
3025                    u32 legacy_rate_mask, u8 *mcs_rates)
3026 {
3027         struct mwl8k_cmd_set_rate *cmd;
3028         int rc;
3029
3030         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
3031         if (cmd == NULL)
3032                 return -ENOMEM;
3033
3034         cmd->header.code = cpu_to_le16(MWL8K_CMD_SET_RATE);
3035         cmd->header.length = cpu_to_le16(sizeof(*cmd));
3036         legacy_rate_mask_to_array(cmd->legacy_rates, legacy_rate_mask);
3037         memcpy(cmd->mcs_set, mcs_rates, 16);
3038
3039         rc = mwl8k_post_cmd(hw, &cmd->header);
3040         kfree(cmd);
3041
3042         return rc;
3043 }
3044
3045 /*
3046  * CMD_FINALIZE_JOIN.
3047  */
3048 #define MWL8K_FJ_BEACON_MAXLEN  128
3049
3050 struct mwl8k_cmd_finalize_join {
3051         struct mwl8k_cmd_pkt header;
3052         __le32 sleep_interval;  /* Number of beacon periods to sleep */
3053         __u8 beacon_data[MWL8K_FJ_BEACON_MAXLEN];
3054 } __packed;
3055
3056 static int mwl8k_cmd_finalize_join(struct ieee80211_hw *hw, void *frame,
3057                                    int framelen, int dtim)
3058 {
3059         struct mwl8k_cmd_finalize_join *cmd;
3060         struct ieee80211_mgmt *payload = frame;
3061         int payload_len;
3062         int rc;
3063
3064         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
3065         if (cmd == NULL)
3066                 return -ENOMEM;
3067
3068         cmd->header.code = cpu_to_le16(MWL8K_CMD_SET_FINALIZE_JOIN);
3069         cmd->header.length = cpu_to_le16(sizeof(*cmd));
3070         cmd->sleep_interval = cpu_to_le32(dtim ? dtim : 1);
3071
3072         payload_len = framelen - ieee80211_hdrlen(payload->frame_control);
3073         if (payload_len < 0)
3074                 payload_len = 0;
3075         else if (payload_len > MWL8K_FJ_BEACON_MAXLEN)
3076                 payload_len = MWL8K_FJ_BEACON_MAXLEN;
3077
3078         memcpy(cmd->beacon_data, &payload->u.beacon, payload_len);
3079
3080         rc = mwl8k_post_cmd(hw, &cmd->header);
3081         kfree(cmd);
3082
3083         return rc;
3084 }
3085
3086 /*
3087  * CMD_SET_RTS_THRESHOLD.
3088  */
3089 struct mwl8k_cmd_set_rts_threshold {
3090         struct mwl8k_cmd_pkt header;
3091         __le16 action;
3092         __le16 threshold;
3093 } __packed;
3094
3095 static int
3096 mwl8k_cmd_set_rts_threshold(struct ieee80211_hw *hw, int rts_thresh)
3097 {
3098         struct mwl8k_cmd_set_rts_threshold *cmd;
3099         int rc;
3100
3101         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
3102         if (cmd == NULL)
3103                 return -ENOMEM;
3104
3105         cmd->header.code = cpu_to_le16(MWL8K_CMD_RTS_THRESHOLD);
3106         cmd->header.length = cpu_to_le16(sizeof(*cmd));
3107         cmd->action = cpu_to_le16(MWL8K_CMD_SET);
3108         cmd->threshold = cpu_to_le16(rts_thresh);
3109
3110         rc = mwl8k_post_cmd(hw, &cmd->header);
3111         kfree(cmd);
3112
3113         return rc;
3114 }
3115
3116 /*
3117  * CMD_SET_SLOT.
3118  */
3119 struct mwl8k_cmd_set_slot {
3120         struct mwl8k_cmd_pkt header;
3121         __le16 action;
3122         __u8 short_slot;
3123 } __packed;
3124
3125 static int mwl8k_cmd_set_slot(struct ieee80211_hw *hw, bool short_slot_time)
3126 {
3127         struct mwl8k_cmd_set_slot *cmd;
3128         int rc;
3129
3130         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
3131         if (cmd == NULL)
3132                 return -ENOMEM;
3133
3134         cmd->header.code = cpu_to_le16(MWL8K_CMD_SET_SLOT);
3135         cmd->header.length = cpu_to_le16(sizeof(*cmd));
3136         cmd->action = cpu_to_le16(MWL8K_CMD_SET);
3137         cmd->short_slot = short_slot_time;
3138
3139         rc = mwl8k_post_cmd(hw, &cmd->header);
3140         kfree(cmd);
3141
3142         return rc;
3143 }
3144
3145 /*
3146  * CMD_SET_EDCA_PARAMS.
3147  */
3148 struct mwl8k_cmd_set_edca_params {
3149         struct mwl8k_cmd_pkt header;
3150
3151         /* See MWL8K_SET_EDCA_XXX below */
3152         __le16 action;
3153
3154         /* TX opportunity in units of 32 us */
3155         __le16 txop;
3156
3157         union {
3158                 struct {
3159                         /* Log exponent of max contention period: 0...15 */
3160                         __le32 log_cw_max;
3161
3162                         /* Log exponent of min contention period: 0...15 */
3163                         __le32 log_cw_min;
3164
3165                         /* Adaptive interframe spacing in units of 32us */
3166                         __u8 aifs;
3167
3168                         /* TX queue to configure */
3169                         __u8 txq;
3170                 } ap;
3171                 struct {
3172                         /* Log exponent of max contention period: 0...15 */
3173                         __u8 log_cw_max;
3174
3175                         /* Log exponent of min contention period: 0...15 */
3176                         __u8 log_cw_min;
3177
3178                         /* Adaptive interframe spacing in units of 32us */
3179                         __u8 aifs;
3180
3181                         /* TX queue to configure */
3182                         __u8 txq;
3183                 } sta;
3184         };
3185 } __packed;
3186
3187 #define MWL8K_SET_EDCA_CW       0x01
3188 #define MWL8K_SET_EDCA_TXOP     0x02
3189 #define MWL8K_SET_EDCA_AIFS     0x04
3190
3191 #define MWL8K_SET_EDCA_ALL      (MWL8K_SET_EDCA_CW | \
3192                                  MWL8K_SET_EDCA_TXOP | \
3193                                  MWL8K_SET_EDCA_AIFS)
3194
3195 static int
3196 mwl8k_cmd_set_edca_params(struct ieee80211_hw *hw, __u8 qnum,
3197                           __u16 cw_min, __u16 cw_max,
3198                           __u8 aifs, __u16 txop)
3199 {
3200         struct mwl8k_priv *priv = hw->priv;
3201         struct mwl8k_cmd_set_edca_params *cmd;
3202         int rc;
3203
3204         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
3205         if (cmd == NULL)
3206                 return -ENOMEM;
3207
3208         cmd->header.code = cpu_to_le16(MWL8K_CMD_SET_EDCA_PARAMS);
3209         cmd->header.length = cpu_to_le16(sizeof(*cmd));
3210         cmd->action = cpu_to_le16(MWL8K_SET_EDCA_ALL);
3211         cmd->txop = cpu_to_le16(txop);
3212         if (priv->ap_fw) {
3213                 cmd->ap.log_cw_max = cpu_to_le32(ilog2(cw_max + 1));
3214                 cmd->ap.log_cw_min = cpu_to_le32(ilog2(cw_min + 1));
3215                 cmd->ap.aifs = aifs;
3216                 cmd->ap.txq = qnum;
3217         } else {
3218                 cmd->sta.log_cw_max = (u8)ilog2(cw_max + 1);
3219                 cmd->sta.log_cw_min = (u8)ilog2(cw_min + 1);
3220                 cmd->sta.aifs = aifs;
3221                 cmd->sta.txq = qnum;
3222         }
3223
3224         rc = mwl8k_post_cmd(hw, &cmd->header);
3225         kfree(cmd);
3226
3227         return rc;
3228 }
3229
3230 /*
3231  * CMD_SET_WMM_MODE.
3232  */
3233 struct mwl8k_cmd_set_wmm_mode {
3234         struct mwl8k_cmd_pkt header;
3235         __le16 action;
3236 } __packed;
3237
3238 static int mwl8k_cmd_set_wmm_mode(struct ieee80211_hw *hw, bool enable)
3239 {
3240         struct mwl8k_priv *priv = hw->priv;
3241         struct mwl8k_cmd_set_wmm_mode *cmd;
3242         int rc;
3243
3244         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
3245         if (cmd == NULL)
3246                 return -ENOMEM;
3247
3248         cmd->header.code = cpu_to_le16(MWL8K_CMD_SET_WMM_MODE);
3249         cmd->header.length = cpu_to_le16(sizeof(*cmd));
3250         cmd->action = cpu_to_le16(!!enable);
3251
3252         rc = mwl8k_post_cmd(hw, &cmd->header);
3253         kfree(cmd);
3254
3255         if (!rc)
3256                 priv->wmm_enabled = enable;
3257
3258         return rc;
3259 }
3260
3261 /*
3262  * CMD_MIMO_CONFIG.
3263  */
3264 struct mwl8k_cmd_mimo_config {
3265         struct mwl8k_cmd_pkt header;
3266         __le32 action;
3267         __u8 rx_antenna_map;
3268         __u8 tx_antenna_map;
3269 } __packed;
3270
3271 static int mwl8k_cmd_mimo_config(struct ieee80211_hw *hw, __u8 rx, __u8 tx)
3272 {
3273         struct mwl8k_cmd_mimo_config *cmd;
3274         int rc;
3275
3276         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
3277         if (cmd == NULL)
3278                 return -ENOMEM;
3279
3280         cmd->header.code = cpu_to_le16(MWL8K_CMD_MIMO_CONFIG);
3281         cmd->header.length = cpu_to_le16(sizeof(*cmd));
3282         cmd->action = cpu_to_le32((u32)MWL8K_CMD_SET);
3283         cmd->rx_antenna_map = rx;
3284         cmd->tx_antenna_map = tx;
3285
3286         rc = mwl8k_post_cmd(hw, &cmd->header);
3287         kfree(cmd);
3288
3289         return rc;
3290 }
3291
3292 /*
3293  * CMD_USE_FIXED_RATE (STA version).
3294  */
3295 struct mwl8k_cmd_use_fixed_rate_sta {
3296         struct mwl8k_cmd_pkt header;
3297         __le32 action;
3298         __le32 allow_rate_drop;
3299         __le32 num_rates;
3300         struct {
3301                 __le32 is_ht_rate;
3302                 __le32 enable_retry;
3303                 __le32 rate;
3304                 __le32 retry_count;
3305         } rate_entry[8];
3306         __le32 rate_type;
3307         __le32 reserved1;
3308         __le32 reserved2;
3309 } __packed;
3310
3311 #define MWL8K_USE_AUTO_RATE     0x0002
3312 #define MWL8K_UCAST_RATE        0
3313
3314 static int mwl8k_cmd_use_fixed_rate_sta(struct ieee80211_hw *hw)
3315 {
3316         struct mwl8k_cmd_use_fixed_rate_sta *cmd;
3317         int rc;
3318
3319         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
3320         if (cmd == NULL)
3321                 return -ENOMEM;
3322
3323         cmd->header.code = cpu_to_le16(MWL8K_CMD_USE_FIXED_RATE);
3324         cmd->header.length = cpu_to_le16(sizeof(*cmd));
3325         cmd->action = cpu_to_le32(MWL8K_USE_AUTO_RATE);
3326         cmd->rate_type = cpu_to_le32(MWL8K_UCAST_RATE);
3327
3328         rc = mwl8k_post_cmd(hw, &cmd->header);
3329         kfree(cmd);
3330
3331         return rc;
3332 }
3333
3334 /*
3335  * CMD_USE_FIXED_RATE (AP version).
3336  */
3337 struct mwl8k_cmd_use_fixed_rate_ap {
3338         struct mwl8k_cmd_pkt header;
3339         __le32 action;
3340         __le32 allow_rate_drop;
3341         __le32 num_rates;
3342         struct mwl8k_rate_entry_ap {
3343                 __le32 is_ht_rate;
3344                 __le32 enable_retry;
3345                 __le32 rate;
3346                 __le32 retry_count;
3347         } rate_entry[4];
3348         u8 multicast_rate;
3349         u8 multicast_rate_type;
3350         u8 management_rate;
3351 } __packed;
3352
3353 static int
3354 mwl8k_cmd_use_fixed_rate_ap(struct ieee80211_hw *hw, int mcast, int mgmt)
3355 {
3356         struct mwl8k_cmd_use_fixed_rate_ap *cmd;
3357         int rc;
3358
3359         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
3360         if (cmd == NULL)
3361                 return -ENOMEM;
3362
3363         cmd->header.code = cpu_to_le16(MWL8K_CMD_USE_FIXED_RATE);
3364         cmd->header.length = cpu_to_le16(sizeof(*cmd));
3365         cmd->action = cpu_to_le32(MWL8K_USE_AUTO_RATE);
3366         cmd->multicast_rate = mcast;
3367         cmd->management_rate = mgmt;
3368
3369         rc = mwl8k_post_cmd(hw, &cmd->header);
3370         kfree(cmd);
3371
3372         return rc;
3373 }
3374
3375 /*
3376  * CMD_ENABLE_SNIFFER.
3377  */
3378 struct mwl8k_cmd_enable_sniffer {
3379         struct mwl8k_cmd_pkt header;
3380         __le32 action;
3381 } __packed;
3382
3383 static int mwl8k_cmd_enable_sniffer(struct ieee80211_hw *hw, bool enable)
3384 {
3385         struct mwl8k_cmd_enable_sniffer *cmd;
3386         int rc;
3387
3388         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
3389         if (cmd == NULL)
3390                 return -ENOMEM;
3391
3392         cmd->header.code = cpu_to_le16(MWL8K_CMD_ENABLE_SNIFFER);
3393         cmd->header.length = cpu_to_le16(sizeof(*cmd));
3394         cmd->action = cpu_to_le32(!!enable);
3395
3396         rc = mwl8k_post_cmd(hw, &cmd->header);
3397         kfree(cmd);
3398
3399         return rc;
3400 }
3401
3402 /*
3403  * CMD_SET_MAC_ADDR.
3404  */
3405 struct mwl8k_cmd_set_mac_addr {
3406         struct mwl8k_cmd_pkt header;
3407         union {
3408                 struct {
3409                         __le16 mac_type;
3410                         __u8 mac_addr[ETH_ALEN];
3411                 } mbss;
3412                 __u8 mac_addr[ETH_ALEN];
3413         };
3414 } __packed;
3415
3416 #define MWL8K_MAC_TYPE_PRIMARY_CLIENT           0
3417 #define MWL8K_MAC_TYPE_SECONDARY_CLIENT         1
3418 #define MWL8K_MAC_TYPE_PRIMARY_AP               2
3419 #define MWL8K_MAC_TYPE_SECONDARY_AP             3
3420
3421 static int mwl8k_cmd_set_mac_addr(struct ieee80211_hw *hw,
3422                                   struct ieee80211_vif *vif, u8 *mac)
3423 {
3424         struct mwl8k_priv *priv = hw->priv;
3425         struct mwl8k_vif *mwl8k_vif = MWL8K_VIF(vif);
3426         struct mwl8k_cmd_set_mac_addr *cmd;
3427         int mac_type;
3428         int rc;
3429
3430         mac_type = MWL8K_MAC_TYPE_PRIMARY_AP;
3431         if (vif != NULL && vif->type == NL80211_IFTYPE_STATION) {
3432                 if (mwl8k_vif->macid + 1 == ffs(priv->sta_macids_supported))
3433                         mac_type = MWL8K_MAC_TYPE_PRIMARY_CLIENT;
3434                 else
3435                         mac_type = MWL8K_MAC_TYPE_SECONDARY_CLIENT;
3436         } else if (vif != NULL && vif->type == NL80211_IFTYPE_AP) {
3437                 if (mwl8k_vif->macid + 1 == ffs(priv->ap_macids_supported))
3438                         mac_type = MWL8K_MAC_TYPE_PRIMARY_AP;
3439                 else
3440                         mac_type = MWL8K_MAC_TYPE_SECONDARY_AP;
3441         }
3442
3443         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
3444         if (cmd == NULL)
3445                 return -ENOMEM;
3446
3447         cmd->header.code = cpu_to_le16(MWL8K_CMD_SET_MAC_ADDR);
3448         cmd->header.length = cpu_to_le16(sizeof(*cmd));
3449         if (priv->ap_fw) {
3450                 cmd->mbss.mac_type = cpu_to_le16(mac_type);
3451                 memcpy(cmd->mbss.mac_addr, mac, ETH_ALEN);
3452         } else {
3453                 memcpy(cmd->mac_addr, mac, ETH_ALEN);
3454         }
3455
3456         rc = mwl8k_post_pervif_cmd(hw, vif, &cmd->header);
3457         kfree(cmd);
3458
3459         return rc;
3460 }
3461
3462 /*
3463  * CMD_SET_RATEADAPT_MODE.
3464  */
3465 struct mwl8k_cmd_set_rate_adapt_mode {
3466         struct mwl8k_cmd_pkt header;
3467         __le16 action;
3468         __le16 mode;
3469 } __packed;
3470
3471 static int mwl8k_cmd_set_rateadapt_mode(struct ieee80211_hw *hw, __u16 mode)
3472 {
3473         struct mwl8k_cmd_set_rate_adapt_mode *cmd;
3474         int rc;
3475
3476         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
3477         if (cmd == NULL)
3478                 return -ENOMEM;
3479
3480         cmd->header.code = cpu_to_le16(MWL8K_CMD_SET_RATEADAPT_MODE);
3481         cmd->header.length = cpu_to_le16(sizeof(*cmd));
3482         cmd->action = cpu_to_le16(MWL8K_CMD_SET);
3483         cmd->mode = cpu_to_le16(mode);
3484
3485         rc = mwl8k_post_cmd(hw, &cmd->header);
3486         kfree(cmd);
3487
3488         return rc;
3489 }
3490
3491 /*
3492  * CMD_GET_WATCHDOG_BITMAP.
3493  */
3494 struct mwl8k_cmd_get_watchdog_bitmap {
3495         struct mwl8k_cmd_pkt header;
3496         u8      bitmap;
3497 } __packed;
3498
3499 static int mwl8k_cmd_get_watchdog_bitmap(struct ieee80211_hw *hw, u8 *bitmap)
3500 {
3501         struct mwl8k_cmd_get_watchdog_bitmap *cmd;
3502         int rc;
3503
3504         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
3505         if (cmd == NULL)
3506                 return -ENOMEM;
3507
3508         cmd->header.code = cpu_to_le16(MWL8K_CMD_GET_WATCHDOG_BITMAP);
3509         cmd->header.length = cpu_to_le16(sizeof(*cmd));
3510
3511         rc = mwl8k_post_cmd(hw, &cmd->header);
3512         if (!rc)
3513                 *bitmap = cmd->bitmap;
3514
3515         kfree(cmd);
3516
3517         return rc;
3518 }
3519
3520 #define INVALID_BA      0xAA
3521 static void mwl8k_watchdog_ba_events(struct work_struct *work)
3522 {
3523         int rc;
3524         u8 bitmap = 0, stream_index;
3525         struct mwl8k_ampdu_stream *streams;
3526         struct mwl8k_priv *priv =
3527                 container_of(work, struct mwl8k_priv, watchdog_ba_handle);
3528
3529         rc = mwl8k_cmd_get_watchdog_bitmap(priv->hw, &bitmap);
3530         if (rc)
3531                 return;
3532
3533         if (bitmap == INVALID_BA)
3534                 return;
3535
3536         /* the bitmap is the hw queue number.  Map it to the ampdu queue. */
3537         stream_index = bitmap - MWL8K_TX_WMM_QUEUES;
3538
3539         BUG_ON(stream_index >= priv->num_ampdu_queues);
3540
3541         streams = &priv->ampdu[stream_index];
3542
3543         if (streams->state == AMPDU_STREAM_ACTIVE)
3544                 ieee80211_stop_tx_ba_session(streams->sta, streams->tid);
3545
3546         return;
3547 }
3548
3549
3550 /*
3551  * CMD_BSS_START.
3552  */
3553 struct mwl8k_cmd_bss_start {
3554         struct mwl8k_cmd_pkt header;
3555         __le32 enable;
3556 } __packed;
3557
3558 static int mwl8k_cmd_bss_start(struct ieee80211_hw *hw,
3559                                struct ieee80211_vif *vif, int enable)
3560 {
3561         struct mwl8k_cmd_bss_start *cmd;
3562         int rc;
3563
3564         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
3565         if (cmd == NULL)
3566                 return -ENOMEM;
3567
3568         cmd->header.code = cpu_to_le16(MWL8K_CMD_BSS_START);
3569         cmd->header.length = cpu_to_le16(sizeof(*cmd));
3570         cmd->enable = cpu_to_le32(enable);
3571
3572         rc = mwl8k_post_pervif_cmd(hw, vif, &cmd->header);
3573         kfree(cmd);
3574
3575         return rc;
3576 }
3577
3578 /*
3579  * CMD_BASTREAM.
3580  */
3581
3582 /*
3583  * UPSTREAM is tx direction
3584  */
3585 #define BASTREAM_FLAG_DIRECTION_UPSTREAM        0x00
3586 #define BASTREAM_FLAG_IMMEDIATE_TYPE            0x01
3587
3588 enum ba_stream_action_type {
3589         MWL8K_BA_CREATE,
3590         MWL8K_BA_UPDATE,
3591         MWL8K_BA_DESTROY,
3592         MWL8K_BA_FLUSH,
3593         MWL8K_BA_CHECK,
3594 };
3595
3596
3597 struct mwl8k_create_ba_stream {
3598         __le32  flags;
3599         __le32  idle_thrs;
3600         __le32  bar_thrs;
3601         __le32  window_size;
3602         u8      peer_mac_addr[6];
3603         u8      dialog_token;
3604         u8      tid;
3605         u8      queue_id;
3606         u8      param_info;
3607         __le32  ba_context;
3608         u8      reset_seq_no_flag;
3609         __le16  curr_seq_no;
3610         u8      sta_src_mac_addr[6];
3611 } __packed;
3612
3613 struct mwl8k_destroy_ba_stream {
3614         __le32  flags;
3615         __le32  ba_context;
3616 } __packed;
3617
3618 struct mwl8k_cmd_bastream {
3619         struct mwl8k_cmd_pkt    header;
3620         __le32  action;
3621         union {
3622                 struct mwl8k_create_ba_stream   create_params;
3623                 struct mwl8k_destroy_ba_stream  destroy_params;
3624         };
3625 } __packed;
3626
3627 static int
3628 mwl8k_check_ba(struct ieee80211_hw *hw, struct mwl8k_ampdu_stream *stream)
3629 {
3630         struct mwl8k_cmd_bastream *cmd;
3631         int rc;
3632
3633         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
3634         if (cmd == NULL)
3635                 return -ENOMEM;
3636
3637         cmd->header.code = cpu_to_le16(MWL8K_CMD_BASTREAM);
3638         cmd->header.length = cpu_to_le16(sizeof(*cmd));
3639
3640         cmd->action = cpu_to_le32(MWL8K_BA_CHECK);
3641
3642         cmd->create_params.queue_id = stream->idx;
3643         memcpy(&cmd->create_params.peer_mac_addr[0], stream->sta->addr,
3644                ETH_ALEN);
3645         cmd->create_params.tid = stream->tid;
3646
3647         cmd->create_params.flags =
3648                 cpu_to_le32(BASTREAM_FLAG_IMMEDIATE_TYPE) |
3649                 cpu_to_le32(BASTREAM_FLAG_DIRECTION_UPSTREAM);
3650
3651         rc = mwl8k_post_cmd(hw, &cmd->header);
3652
3653         kfree(cmd);
3654
3655         return rc;
3656 }
3657
3658 static int
3659 mwl8k_create_ba(struct ieee80211_hw *hw, struct mwl8k_ampdu_stream *stream,
3660                 u8 buf_size)
3661 {
3662         struct mwl8k_cmd_bastream *cmd;
3663         int rc;
3664
3665         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
3666         if (cmd == NULL)
3667                 return -ENOMEM;
3668
3669
3670         cmd->header.code = cpu_to_le16(MWL8K_CMD_BASTREAM);
3671         cmd->header.length = cpu_to_le16(sizeof(*cmd));
3672
3673         cmd->action = cpu_to_le32(MWL8K_BA_CREATE);
3674
3675         cmd->create_params.bar_thrs = cpu_to_le32((u32)buf_size);
3676         cmd->create_params.window_size = cpu_to_le32((u32)buf_size);
3677         cmd->create_params.queue_id = stream->idx;
3678
3679         memcpy(cmd->create_params.peer_mac_addr, stream->sta->addr, ETH_ALEN);
3680         cmd->create_params.tid = stream->tid;
3681         cmd->create_params.curr_seq_no = cpu_to_le16(0);
3682         cmd->create_params.reset_seq_no_flag = 1;
3683
3684         cmd->create_params.param_info =
3685                 (stream->sta->ht_cap.ampdu_factor &
3686                  IEEE80211_HT_AMPDU_PARM_FACTOR) |
3687                 ((stream->sta->ht_cap.ampdu_density << 2) &
3688                  IEEE80211_HT_AMPDU_PARM_DENSITY);
3689
3690         cmd->create_params.flags =
3691                 cpu_to_le32(BASTREAM_FLAG_IMMEDIATE_TYPE |
3692                                         BASTREAM_FLAG_DIRECTION_UPSTREAM);
3693
3694         rc = mwl8k_post_cmd(hw, &cmd->header);
3695
3696         wiphy_debug(hw->wiphy, "Created a BA stream for %pM : tid %d\n",
3697                 stream->sta->addr, stream->tid);
3698         kfree(cmd);
3699
3700         return rc;
3701 }
3702
3703 static void mwl8k_destroy_ba(struct ieee80211_hw *hw,
3704                              struct mwl8k_ampdu_stream *stream)
3705 {
3706         struct mwl8k_cmd_bastream *cmd;
3707
3708         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
3709         if (cmd == NULL)
3710                 return;
3711
3712         cmd->header.code = cpu_to_le16(MWL8K_CMD_BASTREAM);
3713         cmd->header.length = cpu_to_le16(sizeof(*cmd));
3714         cmd->action = cpu_to_le32(MWL8K_BA_DESTROY);
3715
3716         cmd->destroy_params.ba_context = cpu_to_le32(stream->idx);
3717         mwl8k_post_cmd(hw, &cmd->header);
3718
3719         wiphy_debug(hw->wiphy, "Deleted BA stream index %d\n", stream->idx);
3720
3721         kfree(cmd);
3722 }
3723
3724 /*
3725  * CMD_SET_NEW_STN.
3726  */
3727 struct mwl8k_cmd_set_new_stn {
3728         struct mwl8k_cmd_pkt header;
3729         __le16 aid;
3730         __u8 mac_addr[6];
3731         __le16 stn_id;
3732         __le16 action;
3733         __le16 rsvd;
3734         __le32 legacy_rates;
3735         __u8 ht_rates[4];
3736         __le16 cap_info;
3737         __le16 ht_capabilities_info;
3738         __u8 mac_ht_param_info;
3739         __u8 rev;
3740         __u8 control_channel;
3741         __u8 add_channel;
3742         __le16 op_mode;
3743         __le16 stbc;
3744         __u8 add_qos_info;
3745         __u8 is_qos_sta;
3746         __le32 fw_sta_ptr;
3747 } __packed;
3748
3749 #define MWL8K_STA_ACTION_ADD            0
3750 #define MWL8K_STA_ACTION_REMOVE         2
3751
3752 static int mwl8k_cmd_set_new_stn_add(struct ieee80211_hw *hw,
3753                                      struct ieee80211_vif *vif,
3754                                      struct ieee80211_sta *sta)
3755 {
3756         struct mwl8k_cmd_set_new_stn *cmd;
3757         u32 rates;
3758         int rc;
3759
3760         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
3761         if (cmd == NULL)
3762                 return -ENOMEM;
3763
3764         cmd->header.code = cpu_to_le16(MWL8K_CMD_SET_NEW_STN);
3765         cmd->header.length = cpu_to_le16(sizeof(*cmd));
3766         cmd->aid = cpu_to_le16(sta->aid);
3767         memcpy(cmd->mac_addr, sta->addr, ETH_ALEN);
3768         cmd->stn_id = cpu_to_le16(sta->aid);
3769         cmd->action = cpu_to_le16(MWL8K_STA_ACTION_ADD);
3770         if (hw->conf.channel->band == IEEE80211_BAND_2GHZ)
3771                 rates = sta->supp_rates[IEEE80211_BAND_2GHZ];
3772         else
3773                 rates = sta->supp_rates[IEEE80211_BAND_5GHZ] << 5;
3774         cmd->legacy_rates = cpu_to_le32(rates);
3775         if (sta->ht_cap.ht_supported) {
3776                 cmd->ht_rates[0] = sta->ht_cap.mcs.rx_mask[0];
3777                 cmd->ht_rates[1] = sta->ht_cap.mcs.rx_mask[1];
3778                 cmd->ht_rates[2] = sta->ht_cap.mcs.rx_mask[2];
3779                 cmd->ht_rates[3] = sta->ht_cap.mcs.rx_mask[3];
3780                 cmd->ht_capabilities_info = cpu_to_le16(sta->ht_cap.cap);
3781                 cmd->mac_ht_param_info = (sta->ht_cap.ampdu_factor & 3) |
3782                         ((sta->ht_cap.ampdu_density & 7) << 2);
3783                 cmd->is_qos_sta = 1;
3784         }
3785
3786         rc = mwl8k_post_pervif_cmd(hw, vif, &cmd->header);
3787         kfree(cmd);
3788
3789         return rc;
3790 }
3791
3792 static int mwl8k_cmd_set_new_stn_add_self(struct ieee80211_hw *hw,
3793                                           struct ieee80211_vif *vif)
3794 {
3795         struct mwl8k_cmd_set_new_stn *cmd;
3796         int rc;
3797
3798         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
3799         if (cmd == NULL)
3800                 return -ENOMEM;
3801
3802         cmd->header.code = cpu_to_le16(MWL8K_CMD_SET_NEW_STN);
3803         cmd->header.length = cpu_to_le16(sizeof(*cmd));
3804         memcpy(cmd->mac_addr, vif->addr, ETH_ALEN);
3805
3806         rc = mwl8k_post_pervif_cmd(hw, vif, &cmd->header);
3807         kfree(cmd);
3808
3809         return rc;
3810 }
3811
3812 static int mwl8k_cmd_set_new_stn_del(struct ieee80211_hw *hw,
3813                                      struct ieee80211_vif *vif, u8 *addr)
3814 {
3815         struct mwl8k_cmd_set_new_stn *cmd;
3816         int rc;
3817
3818         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
3819         if (cmd == NULL)
3820                 return -ENOMEM;
3821
3822         cmd->header.code = cpu_to_le16(MWL8K_CMD_SET_NEW_STN);
3823         cmd->header.length = cpu_to_le16(sizeof(*cmd));
3824         memcpy(cmd->mac_addr, addr, ETH_ALEN);
3825         cmd->action = cpu_to_le16(MWL8K_STA_ACTION_REMOVE);
3826
3827         rc = mwl8k_post_pervif_cmd(hw, vif, &cmd->header);
3828         kfree(cmd);
3829
3830         return rc;
3831 }
3832
3833 /*
3834  * CMD_UPDATE_ENCRYPTION.
3835  */
3836
3837 #define MAX_ENCR_KEY_LENGTH     16
3838 #define MIC_KEY_LENGTH          8
3839
3840 struct mwl8k_cmd_update_encryption {
3841         struct mwl8k_cmd_pkt header;
3842
3843         __le32 action;
3844         __le32 reserved;
3845         __u8 mac_addr[6];
3846         __u8 encr_type;
3847
3848 } __packed;
3849
3850 struct mwl8k_cmd_set_key {
3851         struct mwl8k_cmd_pkt header;
3852
3853         __le32 action;
3854         __le32 reserved;
3855         __le16 length;
3856         __le16 key_type_id;
3857         __le32 key_info;
3858         __le32 key_id;
3859         __le16 key_len;
3860         __u8 key_material[MAX_ENCR_KEY_LENGTH];
3861         __u8 tkip_tx_mic_key[MIC_KEY_LENGTH];
3862         __u8 tkip_rx_mic_key[MIC_KEY_LENGTH];
3863         __le16 tkip_rsc_low;
3864         __le32 tkip_rsc_high;
3865         __le16 tkip_tsc_low;
3866         __le32 tkip_tsc_high;
3867         __u8 mac_addr[6];
3868 } __packed;
3869
3870 enum {
3871         MWL8K_ENCR_ENABLE,
3872         MWL8K_ENCR_SET_KEY,
3873         MWL8K_ENCR_REMOVE_KEY,
3874         MWL8K_ENCR_SET_GROUP_KEY,
3875 };
3876
3877 #define MWL8K_UPDATE_ENCRYPTION_TYPE_WEP        0
3878 #define MWL8K_UPDATE_ENCRYPTION_TYPE_DISABLE    1
3879 #define MWL8K_UPDATE_ENCRYPTION_TYPE_TKIP       4
3880 #define MWL8K_UPDATE_ENCRYPTION_TYPE_MIXED      7
3881 #define MWL8K_UPDATE_ENCRYPTION_TYPE_AES        8
3882
3883 enum {
3884         MWL8K_ALG_WEP,
3885         MWL8K_ALG_TKIP,
3886         MWL8K_ALG_CCMP,
3887 };
3888
3889 #define MWL8K_KEY_FLAG_TXGROUPKEY       0x00000004
3890 #define MWL8K_KEY_FLAG_PAIRWISE         0x00000008
3891 #define MWL8K_KEY_FLAG_TSC_VALID        0x00000040
3892 #define MWL8K_KEY_FLAG_WEP_TXKEY        0x01000000
3893 #define MWL8K_KEY_FLAG_MICKEY_VALID     0x02000000
3894
3895 static int mwl8k_cmd_update_encryption_enable(struct ieee80211_hw *hw,
3896                                               struct ieee80211_vif *vif,
3897                                               u8 *addr,
3898                                               u8 encr_type)
3899 {
3900         struct mwl8k_cmd_update_encryption *cmd;
3901         int rc;
3902
3903         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
3904         if (cmd == NULL)
3905                 return -ENOMEM;
3906
3907         cmd->header.code = cpu_to_le16(MWL8K_CMD_UPDATE_ENCRYPTION);
3908         cmd->header.length = cpu_to_le16(sizeof(*cmd));
3909         cmd->action = cpu_to_le32(MWL8K_ENCR_ENABLE);
3910         memcpy(cmd->mac_addr, addr, ETH_ALEN);
3911         cmd->encr_type = encr_type;
3912
3913         rc = mwl8k_post_pervif_cmd(hw, vif, &cmd->header);
3914         kfree(cmd);
3915
3916         return rc;
3917 }
3918
3919 static int mwl8k_encryption_set_cmd_info(struct mwl8k_cmd_set_key *cmd,
3920                                                 u8 *addr,
3921                                                 struct ieee80211_key_conf *key)
3922 {
3923         cmd->header.code = cpu_to_le16(MWL8K_CMD_UPDATE_ENCRYPTION);
3924         cmd->header.length = cpu_to_le16(sizeof(*cmd));
3925         cmd->length = cpu_to_le16(sizeof(*cmd) -
3926                                 offsetof(struct mwl8k_cmd_set_key, length));
3927         cmd->key_id = cpu_to_le32(key->keyidx);
3928         cmd->key_len = cpu_to_le16(key->keylen);
3929         memcpy(cmd->mac_addr, addr, ETH_ALEN);
3930
3931         switch (key->cipher) {
3932         case WLAN_CIPHER_SUITE_WEP40:
3933         case WLAN_CIPHER_SUITE_WEP104:
3934                 cmd->key_type_id = cpu_to_le16(MWL8K_ALG_WEP);
3935                 if (key->keyidx == 0)
3936                         cmd->key_info = cpu_to_le32(MWL8K_KEY_FLAG_WEP_TXKEY);
3937
3938                 break;
3939         case WLAN_CIPHER_SUITE_TKIP:
3940                 cmd->key_type_id = cpu_to_le16(MWL8K_ALG_TKIP);
3941                 cmd->key_info = (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
3942                         ? cpu_to_le32(MWL8K_KEY_FLAG_PAIRWISE)
3943                         : cpu_to_le32(MWL8K_KEY_FLAG_TXGROUPKEY);
3944                 cmd->key_info |= cpu_to_le32(MWL8K_KEY_FLAG_MICKEY_VALID
3945                                                 | MWL8K_KEY_FLAG_TSC_VALID);
3946                 break;
3947         case WLAN_CIPHER_SUITE_CCMP:
3948                 cmd->key_type_id = cpu_to_le16(MWL8K_ALG_CCMP);
3949                 cmd->key_info = (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
3950                         ? cpu_to_le32(MWL8K_KEY_FLAG_PAIRWISE)
3951                         : cpu_to_le32(MWL8K_KEY_FLAG_TXGROUPKEY);
3952                 break;
3953         default:
3954                 return -ENOTSUPP;
3955         }
3956
3957         return 0;
3958 }
3959
3960 static int mwl8k_cmd_encryption_set_key(struct ieee80211_hw *hw,
3961                                                 struct ieee80211_vif *vif,
3962                                                 u8 *addr,
3963                                                 struct ieee80211_key_conf *key)
3964 {
3965         struct mwl8k_cmd_set_key *cmd;
3966         int rc;
3967         int keymlen;
3968         u32 action;
3969         u8 idx;
3970         struct mwl8k_vif *mwl8k_vif = MWL8K_VIF(vif);
3971
3972         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
3973         if (cmd == NULL)
3974                 return -ENOMEM;
3975
3976         rc = mwl8k_encryption_set_cmd_info(cmd, addr, key);
3977         if (rc < 0)
3978                 goto done;
3979
3980         idx = key->keyidx;
3981
3982         if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
3983                 action = MWL8K_ENCR_SET_KEY;
3984         else
3985                 action = MWL8K_ENCR_SET_GROUP_KEY;
3986
3987         switch (key->cipher) {
3988         case WLAN_CIPHER_SUITE_WEP40:
3989         case WLAN_CIPHER_SUITE_WEP104:
3990                 if (!mwl8k_vif->wep_key_conf[idx].enabled) {
3991                         memcpy(mwl8k_vif->wep_key_conf[idx].key, key,
3992                                                 sizeof(*key) + key->keylen);
3993                         mwl8k_vif->wep_key_conf[idx].enabled = 1;
3994                 }
3995
3996                 keymlen = 0;
3997                 action = MWL8K_ENCR_SET_KEY;
3998                 break;
3999         case WLAN_CIPHER_SUITE_TKIP:
4000                 keymlen = MAX_ENCR_KEY_LENGTH + 2 * MIC_KEY_LENGTH;
4001                 break;
4002         case WLAN_CIPHER_SUITE_CCMP:
4003                 keymlen = key->keylen;
4004                 break;
4005         default:
4006                 rc = -ENOTSUPP;
4007                 goto done;
4008         }
4009
4010         memcpy(cmd->key_material, key->key, keymlen);
4011         cmd->action = cpu_to_le32(action);
4012
4013         rc = mwl8k_post_pervif_cmd(hw, vif, &cmd->header);
4014 done:
4015         kfree(cmd);
4016
4017         return rc;
4018 }
4019
4020 static int mwl8k_cmd_encryption_remove_key(struct ieee80211_hw *hw,
4021                                                 struct ieee80211_vif *vif,
4022                                                 u8 *addr,
4023                                                 struct ieee80211_key_conf *key)
4024 {
4025         struct mwl8k_cmd_set_key *cmd;
4026         int rc;
4027         struct mwl8k_vif *mwl8k_vif = MWL8K_VIF(vif);
4028
4029         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
4030         if (cmd == NULL)
4031                 return -ENOMEM;
4032
4033         rc = mwl8k_encryption_set_cmd_info(cmd, addr, key);
4034         if (rc < 0)
4035                 goto done;
4036
4037         if (key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
4038                         WLAN_CIPHER_SUITE_WEP104)
4039                 mwl8k_vif->wep_key_conf[key->keyidx].enabled = 0;
4040
4041         cmd->action = cpu_to_le32(MWL8K_ENCR_REMOVE_KEY);
4042
4043         rc = mwl8k_post_pervif_cmd(hw, vif, &cmd->header);
4044 done:
4045         kfree(cmd);
4046
4047         return rc;
4048 }
4049
4050 static int mwl8k_set_key(struct ieee80211_hw *hw,
4051                          enum set_key_cmd cmd_param,
4052                          struct ieee80211_vif *vif,
4053                          struct ieee80211_sta *sta,
4054                          struct ieee80211_key_conf *key)
4055 {
4056         int rc = 0;
4057         u8 encr_type;
4058         u8 *addr;
4059         struct mwl8k_vif *mwl8k_vif = MWL8K_VIF(vif);
4060
4061         if (vif->type == NL80211_IFTYPE_STATION)
4062                 return -EOPNOTSUPP;
4063
4064         if (sta == NULL)
4065                 addr = hw->wiphy->perm_addr;
4066         else
4067                 addr = sta->addr;
4068
4069         if (cmd_param == SET_KEY) {
4070                 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
4071                 rc = mwl8k_cmd_encryption_set_key(hw, vif, addr, key);
4072                 if (rc)
4073                         goto out;
4074
4075                 if ((key->cipher == WLAN_CIPHER_SUITE_WEP40)
4076                                 || (key->cipher == WLAN_CIPHER_SUITE_WEP104))
4077                         encr_type = MWL8K_UPDATE_ENCRYPTION_TYPE_WEP;
4078                 else
4079                         encr_type = MWL8K_UPDATE_ENCRYPTION_TYPE_MIXED;
4080
4081                 rc = mwl8k_cmd_update_encryption_enable(hw, vif, addr,
4082                                                                 encr_type);
4083                 if (rc)
4084                         goto out;
4085
4086                 mwl8k_vif->is_hw_crypto_enabled = true;
4087
4088         } else {
4089                 rc = mwl8k_cmd_encryption_remove_key(hw, vif, addr, key);
4090
4091                 if (rc)
4092                         goto out;
4093
4094                 mwl8k_vif->is_hw_crypto_enabled = false;
4095
4096         }
4097 out:
4098         return rc;
4099 }
4100
4101 /*
4102  * CMD_UPDATE_STADB.
4103  */
4104 struct ewc_ht_info {
4105         __le16  control1;
4106         __le16  control2;
4107         __le16  control3;
4108 } __packed;
4109
4110 struct peer_capability_info {
4111         /* Peer type - AP vs. STA.  */
4112         __u8    peer_type;
4113
4114         /* Basic 802.11 capabilities from assoc resp.  */
4115         __le16  basic_caps;
4116
4117         /* Set if peer supports 802.11n high throughput (HT).  */
4118         __u8    ht_support;
4119
4120         /* Valid if HT is supported.  */
4121         __le16  ht_caps;
4122         __u8    extended_ht_caps;
4123         struct ewc_ht_info      ewc_info;
4124
4125         /* Legacy rate table. Intersection of our rates and peer rates.  */
4126         __u8    legacy_rates[12];
4127
4128         /* HT rate table. Intersection of our rates and peer rates.  */
4129         __u8    ht_rates[16];
4130         __u8    pad[16];
4131
4132         /* If set, interoperability mode, no proprietary extensions.  */
4133         __u8    interop;
4134         __u8    pad2;
4135         __u8    station_id;
4136         __le16  amsdu_enabled;
4137 } __packed;
4138
4139 struct mwl8k_cmd_update_stadb {
4140         struct mwl8k_cmd_pkt header;
4141
4142         /* See STADB_ACTION_TYPE */
4143         __le32  action;
4144
4145         /* Peer MAC address */
4146         __u8    peer_addr[ETH_ALEN];
4147
4148         __le32  reserved;
4149
4150         /* Peer info - valid during add/update.  */
4151         struct peer_capability_info     peer_info;
4152 } __packed;
4153
4154 #define MWL8K_STA_DB_MODIFY_ENTRY       1
4155 #define MWL8K_STA_DB_DEL_ENTRY          2
4156
4157 /* Peer Entry flags - used to define the type of the peer node */
4158 #define MWL8K_PEER_TYPE_ACCESSPOINT     2
4159
4160 static int mwl8k_cmd_update_stadb_add(struct ieee80211_hw *hw,
4161                                       struct ieee80211_vif *vif,
4162                                       struct ieee80211_sta *sta)
4163 {
4164         struct mwl8k_cmd_update_stadb *cmd;
4165         struct peer_capability_info *p;
4166         u32 rates;
4167         int rc;
4168
4169         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
4170         if (cmd == NULL)
4171                 return -ENOMEM;
4172
4173         cmd->header.code = cpu_to_le16(MWL8K_CMD_UPDATE_STADB);
4174         cmd->header.length = cpu_to_le16(sizeof(*cmd));
4175         cmd->action = cpu_to_le32(MWL8K_STA_DB_MODIFY_ENTRY);
4176         memcpy(cmd->peer_addr, sta->addr, ETH_ALEN);
4177
4178         p = &cmd->peer_info;
4179         p->peer_type = MWL8K_PEER_TYPE_ACCESSPOINT;
4180         p->basic_caps = cpu_to_le16(vif->bss_conf.assoc_capability);
4181         p->ht_support = sta->ht_cap.ht_supported;
4182         p->ht_caps = cpu_to_le16(sta->ht_cap.cap);
4183         p->extended_ht_caps = (sta->ht_cap.ampdu_factor & 3) |
4184                 ((sta->ht_cap.ampdu_density & 7) << 2);
4185         if (hw->conf.channel->band == IEEE80211_BAND_2GHZ)
4186                 rates = sta->supp_rates[IEEE80211_BAND_2GHZ];
4187         else
4188                 rates = sta->supp_rates[IEEE80211_BAND_5GHZ] << 5;
4189         legacy_rate_mask_to_array(p->legacy_rates, rates);
4190         memcpy(p->ht_rates, sta->ht_cap.mcs.rx_mask, 16);
4191         p->interop = 1;
4192         p->amsdu_enabled = 0;
4193
4194         rc = mwl8k_post_cmd(hw, &cmd->header);
4195         kfree(cmd);
4196
4197         return rc ? rc : p->station_id;
4198 }
4199
4200 static int mwl8k_cmd_update_stadb_del(struct ieee80211_hw *hw,
4201                                       struct ieee80211_vif *vif, u8 *addr)
4202 {
4203         struct mwl8k_cmd_update_stadb *cmd;
4204         int rc;
4205
4206         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
4207         if (cmd == NULL)
4208                 return -ENOMEM;
4209
4210         cmd->header.code = cpu_to_le16(MWL8K_CMD_UPDATE_STADB);
4211         cmd->header.length = cpu_to_le16(sizeof(*cmd));
4212         cmd->action = cpu_to_le32(MWL8K_STA_DB_DEL_ENTRY);
4213         memcpy(cmd->peer_addr, addr, ETH_ALEN);
4214
4215         rc = mwl8k_post_cmd(hw, &cmd->header);
4216         kfree(cmd);
4217
4218         return rc;
4219 }
4220
4221
4222 /*
4223  * Interrupt handling.
4224  */
4225 static irqreturn_t mwl8k_interrupt(int irq, void *dev_id)
4226 {
4227         struct ieee80211_hw *hw = dev_id;
4228         struct mwl8k_priv *priv = hw->priv;
4229         u32 status;
4230
4231         status = ioread32(priv->regs + MWL8K_HIU_A2H_INTERRUPT_STATUS);
4232         if (!status)
4233                 return IRQ_NONE;
4234
4235         if (status & MWL8K_A2H_INT_TX_DONE) {
4236                 status &= ~MWL8K_A2H_INT_TX_DONE;
4237                 tasklet_schedule(&priv->poll_tx_task);
4238         }
4239
4240         if (status & MWL8K_A2H_INT_RX_READY) {
4241                 status &= ~MWL8K_A2H_INT_RX_READY;
4242                 tasklet_schedule(&priv->poll_rx_task);
4243         }
4244
4245         if (status & MWL8K_A2H_INT_BA_WATCHDOG) {
4246                 status &= ~MWL8K_A2H_INT_BA_WATCHDOG;
4247                 ieee80211_queue_work(hw, &priv->watchdog_ba_handle);
4248         }
4249
4250         if (status)
4251                 iowrite32(~status, priv->regs + MWL8K_HIU_A2H_INTERRUPT_STATUS);
4252
4253         if (status & MWL8K_A2H_INT_OPC_DONE) {
4254                 if (priv->hostcmd_wait != NULL)
4255                         complete(priv->hostcmd_wait);
4256         }
4257
4258         if (status & MWL8K_A2H_INT_QUEUE_EMPTY) {
4259                 if (!mutex_is_locked(&priv->fw_mutex) &&
4260                     priv->radio_on && priv->pending_tx_pkts)
4261                         mwl8k_tx_start(priv);
4262         }
4263
4264         return IRQ_HANDLED;
4265 }
4266
4267 static void mwl8k_tx_poll(unsigned long data)
4268 {
4269         struct ieee80211_hw *hw = (struct ieee80211_hw *)data;
4270         struct mwl8k_priv *priv = hw->priv;
4271         int limit;
4272         int i;
4273
4274         limit = 32;
4275
4276         spin_lock_bh(&priv->tx_lock);
4277
4278         for (i = 0; i < mwl8k_tx_queues(priv); i++)
4279                 limit -= mwl8k_txq_reclaim(hw, i, limit, 0);
4280
4281         if (!priv->pending_tx_pkts && priv->tx_wait != NULL) {
4282                 complete(priv->tx_wait);
4283                 priv->tx_wait = NULL;
4284         }
4285
4286         spin_unlock_bh(&priv->tx_lock);
4287
4288         if (limit) {
4289                 writel(~MWL8K_A2H_INT_TX_DONE,
4290                        priv->regs + MWL8K_HIU_A2H_INTERRUPT_STATUS);
4291         } else {
4292                 tasklet_schedule(&priv->poll_tx_task);
4293         }
4294 }
4295
4296 static void mwl8k_rx_poll(unsigned long data)
4297 {
4298         struct ieee80211_hw *hw = (struct ieee80211_hw *)data;
4299         struct mwl8k_priv *priv = hw->priv;
4300         int limit;
4301
4302         limit = 32;
4303         limit -= rxq_process(hw, 0, limit);
4304         limit -= rxq_refill(hw, 0, limit);
4305
4306         if (limit) {
4307                 writel(~MWL8K_A2H_INT_RX_READY,
4308                        priv->regs + MWL8K_HIU_A2H_INTERRUPT_STATUS);
4309         } else {
4310                 tasklet_schedule(&priv->poll_rx_task);
4311         }
4312 }
4313
4314
4315 /*
4316  * Core driver operations.
4317  */
4318 static void mwl8k_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
4319 {
4320         struct mwl8k_priv *priv = hw->priv;
4321         int index = skb_get_queue_mapping(skb);
4322
4323         if (!priv->radio_on) {
4324                 wiphy_debug(hw->wiphy,
4325                             "dropped TX frame since radio disabled\n");
4326                 dev_kfree_skb(skb);
4327                 return;
4328         }
4329
4330         mwl8k_txq_xmit(hw, index, skb);
4331 }
4332
4333 static int mwl8k_start(struct ieee80211_hw *hw)
4334 {
4335         struct mwl8k_priv *priv = hw->priv;
4336         int rc;
4337
4338         rc = request_irq(priv->pdev->irq, mwl8k_interrupt,
4339                          IRQF_SHARED, MWL8K_NAME, hw);
4340         if (rc) {
4341                 priv->irq = -1;
4342                 wiphy_err(hw->wiphy, "failed to register IRQ handler\n");
4343                 return -EIO;
4344         }
4345         priv->irq = priv->pdev->irq;
4346
4347         /* Enable TX reclaim and RX tasklets.  */
4348         tasklet_enable(&priv->poll_tx_task);
4349         tasklet_enable(&priv->poll_rx_task);
4350
4351         /* Enable interrupts */
4352         iowrite32(MWL8K_A2H_EVENTS, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK);
4353         iowrite32(MWL8K_A2H_EVENTS,
4354                   priv->regs + MWL8K_HIU_A2H_INTERRUPT_STATUS_MASK);
4355
4356         rc = mwl8k_fw_lock(hw);
4357         if (!rc) {
4358                 rc = mwl8k_cmd_radio_enable(hw);
4359
4360                 if (!priv->ap_fw) {
4361                         if (!rc)
4362                                 rc = mwl8k_cmd_enable_sniffer(hw, 0);
4363
4364                         if (!rc)
4365                                 rc = mwl8k_cmd_set_pre_scan(hw);
4366
4367                         if (!rc)
4368                                 rc = mwl8k_cmd_set_post_scan(hw,
4369                                                 "\x00\x00\x00\x00\x00\x00");
4370                 }
4371
4372                 if (!rc)
4373                         rc = mwl8k_cmd_set_rateadapt_mode(hw, 0);
4374
4375                 if (!rc)
4376                         rc = mwl8k_cmd_set_wmm_mode(hw, 0);
4377
4378                 mwl8k_fw_unlock(hw);
4379         }
4380
4381         if (rc) {
4382                 iowrite32(0, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK);
4383                 free_irq(priv->pdev->irq, hw);
4384                 priv->irq = -1;
4385                 tasklet_disable(&priv->poll_tx_task);
4386                 tasklet_disable(&priv->poll_rx_task);
4387         }
4388
4389         return rc;
4390 }
4391
4392 static void mwl8k_stop(struct ieee80211_hw *hw)
4393 {
4394         struct mwl8k_priv *priv = hw->priv;
4395         int i;
4396
4397         mwl8k_cmd_radio_disable(hw);
4398
4399         ieee80211_stop_queues(hw);
4400
4401         /* Disable interrupts */
4402         iowrite32(0, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK);
4403         if (priv->irq != -1) {
4404                 free_irq(priv->pdev->irq, hw);
4405                 priv->irq = -1;
4406         }
4407
4408         /* Stop finalize join worker */
4409         cancel_work_sync(&priv->finalize_join_worker);
4410         cancel_work_sync(&priv->watchdog_ba_handle);
4411         if (priv->beacon_skb != NULL)
4412                 dev_kfree_skb(priv->beacon_skb);
4413
4414         /* Stop TX reclaim and RX tasklets.  */
4415         tasklet_disable(&priv->poll_tx_task);
4416         tasklet_disable(&priv->poll_rx_task);
4417
4418         /* Return all skbs to mac80211 */
4419         for (i = 0; i < mwl8k_tx_queues(priv); i++)
4420                 mwl8k_txq_reclaim(hw, i, INT_MAX, 1);
4421 }
4422
4423 static int mwl8k_reload_firmware(struct ieee80211_hw *hw, char *fw_image);
4424
4425 static int mwl8k_add_interface(struct ieee80211_hw *hw,
4426                                struct ieee80211_vif *vif)
4427 {
4428         struct mwl8k_priv *priv = hw->priv;
4429         struct mwl8k_vif *mwl8k_vif;
4430         u32 macids_supported;
4431         int macid, rc;
4432         struct mwl8k_device_info *di;
4433
4434         /*
4435          * Reject interface creation if sniffer mode is active, as
4436          * STA operation is mutually exclusive with hardware sniffer
4437          * mode.  (Sniffer mode is only used on STA firmware.)
4438          */
4439         if (priv->sniffer_enabled) {
4440                 wiphy_info(hw->wiphy,
4441                            "unable to create STA interface because sniffer mode is enabled\n");
4442                 return -EINVAL;
4443         }
4444
4445         di = priv->device_info;
4446         switch (vif->type) {
4447         case NL80211_IFTYPE_AP:
4448                 if (!priv->ap_fw && di->fw_image_ap) {
4449                         /* we must load the ap fw to meet this request */
4450                         if (!list_empty(&priv->vif_list))
4451                                 return -EBUSY;
4452                         rc = mwl8k_reload_firmware(hw, di->fw_image_ap);
4453                         if (rc)
4454                                 return rc;
4455                 }
4456                 macids_supported = priv->ap_macids_supported;
4457                 break;
4458         case NL80211_IFTYPE_STATION:
4459                 if (priv->ap_fw && di->fw_image_sta) {
4460                         /* we must load the sta fw to meet this request */
4461                         if (!list_empty(&priv->vif_list))
4462                                 return -EBUSY;
4463                         rc = mwl8k_reload_firmware(hw, di->fw_image_sta);
4464                         if (rc)
4465                                 return rc;
4466                 }
4467                 macids_supported = priv->sta_macids_supported;
4468                 break;
4469         default:
4470                 return -EINVAL;
4471         }
4472
4473         macid = ffs(macids_supported & ~priv->macids_used);
4474         if (!macid--)
4475                 return -EBUSY;
4476
4477         /* Setup driver private area. */
4478         mwl8k_vif = MWL8K_VIF(vif);
4479         memset(mwl8k_vif, 0, sizeof(*mwl8k_vif));
4480         mwl8k_vif->vif = vif;
4481         mwl8k_vif->macid = macid;
4482         mwl8k_vif->seqno = 0;
4483         memcpy(mwl8k_vif->bssid, vif->addr, ETH_ALEN);
4484         mwl8k_vif->is_hw_crypto_enabled = false;
4485
4486         /* Set the mac address.  */
4487         mwl8k_cmd_set_mac_addr(hw, vif, vif->addr);
4488
4489         if (priv->ap_fw)
4490                 mwl8k_cmd_set_new_stn_add_self(hw, vif);
4491
4492         priv->macids_used |= 1 << mwl8k_vif->macid;
4493         list_add_tail(&mwl8k_vif->list, &priv->vif_list);
4494
4495         return 0;
4496 }
4497
4498 static void mwl8k_remove_interface(struct ieee80211_hw *hw,
4499                                    struct ieee80211_vif *vif)
4500 {
4501         struct mwl8k_priv *priv = hw->priv;
4502         struct mwl8k_vif *mwl8k_vif = MWL8K_VIF(vif);
4503
4504         if (priv->ap_fw)
4505                 mwl8k_cmd_set_new_stn_del(hw, vif, vif->addr);
4506
4507         mwl8k_cmd_set_mac_addr(hw, vif, "\x00\x00\x00\x00\x00\x00");
4508
4509         priv->macids_used &= ~(1 << mwl8k_vif->macid);
4510         list_del(&mwl8k_vif->list);
4511 }
4512
4513 static int mwl8k_config(struct ieee80211_hw *hw, u32 changed)
4514 {
4515         struct ieee80211_conf *conf = &hw->conf;
4516         struct mwl8k_priv *priv = hw->priv;
4517         int rc;
4518
4519         if (conf->flags & IEEE80211_CONF_IDLE) {
4520                 mwl8k_cmd_radio_disable(hw);
4521                 return 0;
4522         }
4523
4524         rc = mwl8k_fw_lock(hw);
4525         if (rc)
4526                 return rc;
4527
4528         rc = mwl8k_cmd_radio_enable(hw);
4529         if (rc)
4530                 goto out;
4531
4532         rc = mwl8k_cmd_set_rf_channel(hw, conf);
4533         if (rc)
4534                 goto out;
4535
4536         if (conf->power_level > 18)
4537                 conf->power_level = 18;
4538
4539         if (priv->ap_fw) {
4540
4541                 if (conf->flags & IEEE80211_CONF_CHANGE_POWER) {
4542                         rc = mwl8k_cmd_tx_power(hw, conf, conf->power_level);
4543                         if (rc)
4544                                 goto out;
4545                 }
4546
4547                 rc = mwl8k_cmd_rf_antenna(hw, MWL8K_RF_ANTENNA_RX, 0x3);
4548                 if (rc)
4549                         wiphy_warn(hw->wiphy, "failed to set # of RX antennas");
4550                 rc = mwl8k_cmd_rf_antenna(hw, MWL8K_RF_ANTENNA_TX, 0x7);
4551                 if (rc)
4552                         wiphy_warn(hw->wiphy, "failed to set # of TX antennas");
4553
4554         } else {
4555                 rc = mwl8k_cmd_rf_tx_power(hw, conf->power_level);
4556                 if (rc)
4557                         goto out;
4558                 rc = mwl8k_cmd_mimo_config(hw, 0x7, 0x7);
4559         }
4560
4561 out:
4562         mwl8k_fw_unlock(hw);
4563
4564         return rc;
4565 }
4566
4567 static void
4568 mwl8k_bss_info_changed_sta(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
4569                            struct ieee80211_bss_conf *info, u32 changed)
4570 {
4571         struct mwl8k_priv *priv = hw->priv;
4572         u32 ap_legacy_rates = 0;
4573         u8 ap_mcs_rates[16];
4574         int rc;
4575
4576         if (mwl8k_fw_lock(hw))
4577                 return;
4578
4579         /*
4580          * No need to capture a beacon if we're no longer associated.
4581          */
4582         if ((changed & BSS_CHANGED_ASSOC) && !vif->bss_conf.assoc)
4583                 priv->capture_beacon = false;
4584
4585         /*
4586          * Get the AP's legacy and MCS rates.
4587          */
4588         if (vif->bss_conf.assoc) {
4589                 struct ieee80211_sta *ap;
4590
4591                 rcu_read_lock();
4592
4593                 ap = ieee80211_find_sta(vif, vif->bss_conf.bssid);
4594                 if (ap == NULL) {
4595                         rcu_read_unlock();
4596                         goto out;
4597                 }
4598
4599                 if (hw->conf.channel->band == IEEE80211_BAND_2GHZ) {
4600                         ap_legacy_rates = ap->supp_rates[IEEE80211_BAND_2GHZ];
4601                 } else {
4602                         ap_legacy_rates =
4603                                 ap->supp_rates[IEEE80211_BAND_5GHZ] << 5;
4604                 }
4605                 memcpy(ap_mcs_rates, ap->ht_cap.mcs.rx_mask, 16);
4606
4607                 rcu_read_unlock();
4608         }
4609
4610         if ((changed & BSS_CHANGED_ASSOC) && vif->bss_conf.assoc) {
4611                 rc = mwl8k_cmd_set_rate(hw, vif, ap_legacy_rates, ap_mcs_rates);
4612                 if (rc)
4613                         goto out;
4614
4615                 rc = mwl8k_cmd_use_fixed_rate_sta(hw);
4616                 if (rc)
4617                         goto out;
4618         }
4619
4620         if (changed & BSS_CHANGED_ERP_PREAMBLE) {
4621                 rc = mwl8k_set_radio_preamble(hw,
4622                                 vif->bss_conf.use_short_preamble);
4623                 if (rc)
4624                         goto out;
4625         }
4626
4627         if (changed & BSS_CHANGED_ERP_SLOT) {
4628                 rc = mwl8k_cmd_set_slot(hw, vif->bss_conf.use_short_slot);
4629                 if (rc)
4630                         goto out;
4631         }
4632
4633         if (vif->bss_conf.assoc &&
4634             (changed & (BSS_CHANGED_ASSOC | BSS_CHANGED_ERP_CTS_PROT |
4635                         BSS_CHANGED_HT))) {
4636                 rc = mwl8k_cmd_set_aid(hw, vif, ap_legacy_rates);
4637                 if (rc)
4638                         goto out;
4639         }
4640
4641         if (vif->bss_conf.assoc &&
4642             (changed & (BSS_CHANGED_ASSOC | BSS_CHANGED_BEACON_INT))) {
4643                 /*
4644                  * Finalize the join.  Tell rx handler to process
4645                  * next beacon from our BSSID.
4646                  */
4647                 memcpy(priv->capture_bssid, vif->bss_conf.bssid, ETH_ALEN);
4648                 priv->capture_beacon = true;
4649         }
4650
4651 out:
4652         mwl8k_fw_unlock(hw);
4653 }
4654
4655 static void
4656 mwl8k_bss_info_changed_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
4657                           struct ieee80211_bss_conf *info, u32 changed)
4658 {
4659         int rc;
4660
4661         if (mwl8k_fw_lock(hw))
4662                 return;
4663
4664         if (changed & BSS_CHANGED_ERP_PREAMBLE) {
4665                 rc = mwl8k_set_radio_preamble(hw,
4666                                 vif->bss_conf.use_short_preamble);
4667                 if (rc)
4668                         goto out;
4669         }
4670
4671         if (changed & BSS_CHANGED_BASIC_RATES) {
4672                 int idx;
4673                 int rate;
4674
4675                 /*
4676                  * Use lowest supported basic rate for multicasts
4677                  * and management frames (such as probe responses --
4678                  * beacons will always go out at 1 Mb/s).
4679                  */
4680                 idx = ffs(vif->bss_conf.basic_rates);
4681                 if (idx)
4682                         idx--;
4683
4684                 if (hw->conf.channel->band == IEEE80211_BAND_2GHZ)
4685                         rate = mwl8k_rates_24[idx].hw_value;
4686                 else
4687                         rate = mwl8k_rates_50[idx].hw_value;
4688
4689                 mwl8k_cmd_use_fixed_rate_ap(hw, rate, rate);
4690         }
4691
4692         if (changed & (BSS_CHANGED_BEACON_INT | BSS_CHANGED_BEACON)) {
4693                 struct sk_buff *skb;
4694
4695                 skb = ieee80211_beacon_get(hw, vif);
4696                 if (skb != NULL) {
4697                         mwl8k_cmd_set_beacon(hw, vif, skb->data, skb->len);
4698                         kfree_skb(skb);
4699                 }
4700         }
4701
4702         if (changed & BSS_CHANGED_BEACON_ENABLED)
4703                 mwl8k_cmd_bss_start(hw, vif, info->enable_beacon);
4704
4705 out:
4706         mwl8k_fw_unlock(hw);
4707 }
4708
4709 static void
4710 mwl8k_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
4711                        struct ieee80211_bss_conf *info, u32 changed)
4712 {
4713         struct mwl8k_priv *priv = hw->priv;
4714
4715         if (!priv->ap_fw)
4716                 mwl8k_bss_info_changed_sta(hw, vif, info, changed);
4717         else
4718                 mwl8k_bss_info_changed_ap(hw, vif, info, changed);
4719 }
4720
4721 static u64 mwl8k_prepare_multicast(struct ieee80211_hw *hw,
4722                                    struct netdev_hw_addr_list *mc_list)
4723 {
4724         struct mwl8k_cmd_pkt *cmd;
4725
4726         /*
4727          * Synthesize and return a command packet that programs the
4728          * hardware multicast address filter.  At this point we don't
4729          * know whether FIF_ALLMULTI is being requested, but if it is,
4730          * we'll end up throwing this packet away and creating a new
4731          * one in mwl8k_configure_filter().
4732          */
4733         cmd = __mwl8k_cmd_mac_multicast_adr(hw, 0, mc_list);
4734
4735         return (unsigned long)cmd;
4736 }
4737
4738 static int
4739 mwl8k_configure_filter_sniffer(struct ieee80211_hw *hw,
4740                                unsigned int changed_flags,
4741                                unsigned int *total_flags)
4742 {
4743         struct mwl8k_priv *priv = hw->priv;
4744
4745         /*
4746          * Hardware sniffer mode is mutually exclusive with STA
4747          * operation, so refuse to enable sniffer mode if a STA
4748          * interface is active.
4749          */
4750         if (!list_empty(&priv->vif_list)) {
4751                 if (net_ratelimit())
4752                         wiphy_info(hw->wiphy,
4753                                    "not enabling sniffer mode because STA interface is active\n");
4754                 return 0;
4755         }
4756
4757         if (!priv->sniffer_enabled) {
4758                 if (mwl8k_cmd_enable_sniffer(hw, 1))
4759                         return 0;
4760                 priv->sniffer_enabled = true;
4761         }
4762
4763         *total_flags &= FIF_PROMISC_IN_BSS | FIF_ALLMULTI |
4764                         FIF_BCN_PRBRESP_PROMISC | FIF_CONTROL |
4765                         FIF_OTHER_BSS;
4766
4767         return 1;
4768 }
4769
4770 static struct mwl8k_vif *mwl8k_first_vif(struct mwl8k_priv *priv)
4771 {
4772         if (!list_empty(&priv->vif_list))
4773                 return list_entry(priv->vif_list.next, struct mwl8k_vif, list);
4774
4775         return NULL;
4776 }
4777
4778 static void mwl8k_configure_filter(struct ieee80211_hw *hw,
4779                                    unsigned int changed_flags,
4780                                    unsigned int *total_flags,
4781                                    u64 multicast)
4782 {
4783         struct mwl8k_priv *priv = hw->priv;
4784         struct mwl8k_cmd_pkt *cmd = (void *)(unsigned long)multicast;
4785
4786         /*
4787          * AP firmware doesn't allow fine-grained control over
4788          * the receive filter.
4789          */
4790         if (priv->ap_fw) {
4791                 *total_flags &= FIF_ALLMULTI | FIF_BCN_PRBRESP_PROMISC;
4792                 kfree(cmd);
4793                 return;
4794         }
4795
4796         /*
4797          * Enable hardware sniffer mode if FIF_CONTROL or
4798          * FIF_OTHER_BSS is requested.
4799          */
4800         if (*total_flags & (FIF_CONTROL | FIF_OTHER_BSS) &&
4801             mwl8k_configure_filter_sniffer(hw, changed_flags, total_flags)) {
4802                 kfree(cmd);
4803                 return;
4804         }
4805
4806         /* Clear unsupported feature flags */
4807         *total_flags &= FIF_ALLMULTI | FIF_BCN_PRBRESP_PROMISC;
4808
4809         if (mwl8k_fw_lock(hw)) {
4810                 kfree(cmd);
4811                 return;
4812         }
4813
4814         if (priv->sniffer_enabled) {
4815                 mwl8k_cmd_enable_sniffer(hw, 0);
4816                 priv->sniffer_enabled = false;
4817         }
4818
4819         if (changed_flags & FIF_BCN_PRBRESP_PROMISC) {
4820                 if (*total_flags & FIF_BCN_PRBRESP_PROMISC) {
4821                         /*
4822                          * Disable the BSS filter.
4823                          */
4824                         mwl8k_cmd_set_pre_scan(hw);
4825                 } else {
4826                         struct mwl8k_vif *mwl8k_vif;
4827                         const u8 *bssid;
4828
4829                         /*
4830                          * Enable the BSS filter.
4831                          *
4832                          * If there is an active STA interface, use that
4833                          * interface's BSSID, otherwise use a dummy one
4834                          * (where the OUI part needs to be nonzero for
4835                          * the BSSID to be accepted by POST_SCAN).
4836                          */
4837                         mwl8k_vif = mwl8k_first_vif(priv);
4838                         if (mwl8k_vif != NULL)
4839                                 bssid = mwl8k_vif->vif->bss_conf.bssid;
4840                         else
4841                                 bssid = "\x01\x00\x00\x00\x00\x00";
4842
4843                         mwl8k_cmd_set_post_scan(hw, bssid);
4844                 }
4845         }
4846
4847         /*
4848          * If FIF_ALLMULTI is being requested, throw away the command
4849          * packet that ->prepare_multicast() built and replace it with
4850          * a command packet that enables reception of all multicast
4851          * packets.
4852          */
4853         if (*total_flags & FIF_ALLMULTI) {
4854                 kfree(cmd);
4855                 cmd = __mwl8k_cmd_mac_multicast_adr(hw, 1, NULL);
4856         }
4857
4858         if (cmd != NULL) {
4859                 mwl8k_post_cmd(hw, cmd);
4860                 kfree(cmd);
4861         }
4862
4863         mwl8k_fw_unlock(hw);
4864 }
4865
4866 static int mwl8k_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
4867 {
4868         return mwl8k_cmd_set_rts_threshold(hw, value);
4869 }
4870
4871 static int mwl8k_sta_remove(struct ieee80211_hw *hw,
4872                             struct ieee80211_vif *vif,
4873                             struct ieee80211_sta *sta)
4874 {
4875         struct mwl8k_priv *priv = hw->priv;
4876
4877         if (priv->ap_fw)
4878                 return mwl8k_cmd_set_new_stn_del(hw, vif, sta->addr);
4879         else
4880                 return mwl8k_cmd_update_stadb_del(hw, vif, sta->addr);
4881 }
4882
4883 static int mwl8k_sta_add(struct ieee80211_hw *hw,
4884                          struct ieee80211_vif *vif,
4885                          struct ieee80211_sta *sta)
4886 {
4887         struct mwl8k_priv *priv = hw->priv;
4888         int ret;
4889         int i;
4890         struct mwl8k_vif *mwl8k_vif = MWL8K_VIF(vif);
4891         struct ieee80211_key_conf *key;
4892
4893         if (!priv->ap_fw) {
4894                 ret = mwl8k_cmd_update_stadb_add(hw, vif, sta);
4895                 if (ret >= 0) {
4896                         MWL8K_STA(sta)->peer_id = ret;
4897                         if (sta->ht_cap.ht_supported)
4898                                 MWL8K_STA(sta)->is_ampdu_allowed = true;
4899                         ret = 0;
4900                 }
4901
4902         } else {
4903                 ret = mwl8k_cmd_set_new_stn_add(hw, vif, sta);
4904         }
4905
4906         for (i = 0; i < NUM_WEP_KEYS; i++) {
4907                 key = IEEE80211_KEY_CONF(mwl8k_vif->wep_key_conf[i].key);
4908                 if (mwl8k_vif->wep_key_conf[i].enabled)
4909                         mwl8k_set_key(hw, SET_KEY, vif, sta, key);
4910         }
4911         return ret;
4912 }
4913
4914 static int mwl8k_conf_tx(struct ieee80211_hw *hw, u16 queue,
4915                          const struct ieee80211_tx_queue_params *params)
4916 {
4917         struct mwl8k_priv *priv = hw->priv;
4918         int rc;
4919
4920         rc = mwl8k_fw_lock(hw);
4921         if (!rc) {
4922                 BUG_ON(queue > MWL8K_TX_WMM_QUEUES - 1);
4923                 memcpy(&priv->wmm_params[queue], params, sizeof(*params));
4924
4925                 if (!priv->wmm_enabled)
4926                         rc = mwl8k_cmd_set_wmm_mode(hw, 1);
4927
4928                 if (!rc) {
4929                         int q = MWL8K_TX_WMM_QUEUES - 1 - queue;
4930                         rc = mwl8k_cmd_set_edca_params(hw, q,
4931                                                        params->cw_min,
4932                                                        params->cw_max,
4933                                                        params->aifs,
4934                                                        params->txop);
4935                 }
4936
4937                 mwl8k_fw_unlock(hw);
4938         }
4939
4940         return rc;
4941 }
4942
4943 static int mwl8k_get_stats(struct ieee80211_hw *hw,
4944                            struct ieee80211_low_level_stats *stats)
4945 {
4946         return mwl8k_cmd_get_stat(hw, stats);
4947 }
4948
4949 static int mwl8k_get_survey(struct ieee80211_hw *hw, int idx,
4950                                 struct survey_info *survey)
4951 {
4952         struct mwl8k_priv *priv = hw->priv;
4953         struct ieee80211_conf *conf = &hw->conf;
4954
4955         if (idx != 0)
4956                 return -ENOENT;
4957
4958         survey->channel = conf->channel;
4959         survey->filled = SURVEY_INFO_NOISE_DBM;
4960         survey->noise = priv->noise;
4961
4962         return 0;
4963 }
4964
4965 #define MAX_AMPDU_ATTEMPTS 5
4966
4967 static int
4968 mwl8k_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
4969                    enum ieee80211_ampdu_mlme_action action,
4970                    struct ieee80211_sta *sta, u16 tid, u16 *ssn,
4971                    u8 buf_size)
4972 {
4973
4974         int i, rc = 0;
4975         struct mwl8k_priv *priv = hw->priv;
4976         struct mwl8k_ampdu_stream *stream;
4977         u8 *addr = sta->addr;
4978
4979         if (!(hw->flags & IEEE80211_HW_AMPDU_AGGREGATION))
4980                 return -ENOTSUPP;
4981
4982         spin_lock(&priv->stream_lock);
4983         stream = mwl8k_lookup_stream(hw, addr, tid);
4984
4985         switch (action) {
4986         case IEEE80211_AMPDU_RX_START:
4987         case IEEE80211_AMPDU_RX_STOP:
4988                 break;
4989         case IEEE80211_AMPDU_TX_START:
4990                 /* By the time we get here the hw queues may contain outgoing
4991                  * packets for this RA/TID that are not part of this BA
4992                  * session.  The hw will assign sequence numbers to these
4993                  * packets as they go out.  So if we query the hw for its next
4994                  * sequence number and use that for the SSN here, it may end up
4995                  * being wrong, which will lead to sequence number mismatch at
4996                  * the recipient.  To avoid this, we reset the sequence number
4997                  * to O for the first MPDU in this BA stream.
4998                  */
4999                 *ssn = 0;
5000                 if (stream == NULL) {
5001                         /* This means that somebody outside this driver called
5002                          * ieee80211_start_tx_ba_session.  This is unexpected
5003                          * because we do our own rate control.  Just warn and
5004                          * move on.
5005                          */
5006                         wiphy_warn(hw->wiphy, "Unexpected call to %s.  "
5007                                    "Proceeding anyway.\n", __func__);
5008                         stream = mwl8k_add_stream(hw, sta, tid);
5009                 }
5010                 if (stream == NULL) {
5011                         wiphy_debug(hw->wiphy, "no free AMPDU streams\n");
5012                         rc = -EBUSY;
5013                         break;
5014                 }
5015                 stream->state = AMPDU_STREAM_IN_PROGRESS;
5016
5017                 /* Release the lock before we do the time consuming stuff */
5018                 spin_unlock(&priv->stream_lock);
5019                 for (i = 0; i < MAX_AMPDU_ATTEMPTS; i++) {
5020                         rc = mwl8k_check_ba(hw, stream);
5021
5022                         if (!rc)
5023                                 break;
5024                         /*
5025                          * HW queues take time to be flushed, give them
5026                          * sufficient time
5027                          */
5028
5029                         msleep(1000);
5030                 }
5031                 spin_lock(&priv->stream_lock);
5032                 if (rc) {
5033                         wiphy_err(hw->wiphy, "Stream for tid %d busy after %d"
5034                                 " attempts\n", tid, MAX_AMPDU_ATTEMPTS);
5035                         mwl8k_remove_stream(hw, stream);
5036                         rc = -EBUSY;
5037                         break;
5038                 }
5039                 ieee80211_start_tx_ba_cb_irqsafe(vif, addr, tid);
5040                 break;
5041         case IEEE80211_AMPDU_TX_STOP:
5042                 if (stream == NULL)
5043                         break;
5044                 if (stream->state == AMPDU_STREAM_ACTIVE) {
5045                         spin_unlock(&priv->stream_lock);
5046                         mwl8k_destroy_ba(hw, stream);
5047                         spin_lock(&priv->stream_lock);
5048                 }
5049                 mwl8k_remove_stream(hw, stream);
5050                 ieee80211_stop_tx_ba_cb_irqsafe(vif, addr, tid);
5051                 break;
5052         case IEEE80211_AMPDU_TX_OPERATIONAL:
5053                 BUG_ON(stream == NULL);
5054                 BUG_ON(stream->state != AMPDU_STREAM_IN_PROGRESS);
5055                 spin_unlock(&priv->stream_lock);
5056                 rc = mwl8k_create_ba(hw, stream, buf_size);
5057                 spin_lock(&priv->stream_lock);
5058                 if (!rc)
5059                         stream->state = AMPDU_STREAM_ACTIVE;
5060                 else {
5061                         spin_unlock(&priv->stream_lock);
5062                         mwl8k_destroy_ba(hw, stream);
5063                         spin_lock(&priv->stream_lock);
5064                         wiphy_debug(hw->wiphy,
5065                                 "Failed adding stream for sta %pM tid %d\n",
5066                                 addr, tid);
5067                         mwl8k_remove_stream(hw, stream);
5068                 }
5069                 break;
5070
5071         default:
5072                 rc = -ENOTSUPP;
5073         }
5074
5075         spin_unlock(&priv->stream_lock);
5076         return rc;
5077 }
5078
5079 static const struct ieee80211_ops mwl8k_ops = {
5080         .tx                     = mwl8k_tx,
5081         .start                  = mwl8k_start,
5082         .stop                   = mwl8k_stop,
5083         .add_interface          = mwl8k_add_interface,
5084         .remove_interface       = mwl8k_remove_interface,
5085         .config                 = mwl8k_config,
5086         .bss_info_changed       = mwl8k_bss_info_changed,
5087         .prepare_multicast      = mwl8k_prepare_multicast,
5088         .configure_filter       = mwl8k_configure_filter,
5089         .set_key                = mwl8k_set_key,
5090         .set_rts_threshold      = mwl8k_set_rts_threshold,
5091         .sta_add                = mwl8k_sta_add,
5092         .sta_remove             = mwl8k_sta_remove,
5093         .conf_tx                = mwl8k_conf_tx,
5094         .get_stats              = mwl8k_get_stats,
5095         .get_survey             = mwl8k_get_survey,
5096         .ampdu_action           = mwl8k_ampdu_action,
5097 };
5098
5099 static void mwl8k_finalize_join_worker(struct work_struct *work)
5100 {
5101         struct mwl8k_priv *priv =
5102                 container_of(work, struct mwl8k_priv, finalize_join_worker);
5103         struct sk_buff *skb = priv->beacon_skb;
5104         struct ieee80211_mgmt *mgmt = (void *)skb->data;
5105         int len = skb->len - offsetof(struct ieee80211_mgmt, u.beacon.variable);
5106         const u8 *tim = cfg80211_find_ie(WLAN_EID_TIM,
5107                                          mgmt->u.beacon.variable, len);
5108         int dtim_period = 1;
5109
5110         if (tim && tim[1] >= 2)
5111                 dtim_period = tim[3];
5112
5113         mwl8k_cmd_finalize_join(priv->hw, skb->data, skb->len, dtim_period);
5114
5115         dev_kfree_skb(skb);
5116         priv->beacon_skb = NULL;
5117 }
5118
5119 enum {
5120         MWL8363 = 0,
5121         MWL8687,
5122         MWL8366,
5123 };
5124
5125 #define MWL8K_8366_AP_FW_API 2
5126 #define _MWL8K_8366_AP_FW(api) "mwl8k/fmimage_8366_ap-" #api ".fw"
5127 #define MWL8K_8366_AP_FW(api) _MWL8K_8366_AP_FW(api)
5128
5129 static struct mwl8k_device_info mwl8k_info_tbl[] __devinitdata = {
5130         [MWL8363] = {
5131                 .part_name      = "88w8363",
5132                 .helper_image   = "mwl8k/helper_8363.fw",
5133                 .fw_image_sta   = "mwl8k/fmimage_8363.fw",
5134         },
5135         [MWL8687] = {
5136                 .part_name      = "88w8687",
5137                 .helper_image   = "mwl8k/helper_8687.fw",
5138                 .fw_image_sta   = "mwl8k/fmimage_8687.fw",
5139         },
5140         [MWL8366] = {
5141                 .part_name      = "88w8366",
5142                 .helper_image   = "mwl8k/helper_8366.fw",
5143                 .fw_image_sta   = "mwl8k/fmimage_8366.fw",
5144                 .fw_image_ap    = MWL8K_8366_AP_FW(MWL8K_8366_AP_FW_API),
5145                 .fw_api_ap      = MWL8K_8366_AP_FW_API,
5146                 .ap_rxd_ops     = &rxd_8366_ap_ops,
5147         },
5148 };
5149
5150 MODULE_FIRMWARE("mwl8k/helper_8363.fw");
5151 MODULE_FIRMWARE("mwl8k/fmimage_8363.fw");
5152 MODULE_FIRMWARE("mwl8k/helper_8687.fw");
5153 MODULE_FIRMWARE("mwl8k/fmimage_8687.fw");
5154 MODULE_FIRMWARE("mwl8k/helper_8366.fw");
5155 MODULE_FIRMWARE("mwl8k/fmimage_8366.fw");
5156 MODULE_FIRMWARE(MWL8K_8366_AP_FW(MWL8K_8366_AP_FW_API));
5157
5158 static DEFINE_PCI_DEVICE_TABLE(mwl8k_pci_id_table) = {
5159         { PCI_VDEVICE(MARVELL, 0x2a0a), .driver_data = MWL8363, },
5160         { PCI_VDEVICE(MARVELL, 0x2a0c), .driver_data = MWL8363, },
5161         { PCI_VDEVICE(MARVELL, 0x2a24), .driver_data = MWL8363, },
5162         { PCI_VDEVICE(MARVELL, 0x2a2b), .driver_data = MWL8687, },
5163         { PCI_VDEVICE(MARVELL, 0x2a30), .driver_data = MWL8687, },
5164         { PCI_VDEVICE(MARVELL, 0x2a40), .driver_data = MWL8366, },
5165         { PCI_VDEVICE(MARVELL, 0x2a43), .driver_data = MWL8366, },
5166         { },
5167 };
5168 MODULE_DEVICE_TABLE(pci, mwl8k_pci_id_table);
5169
5170 static int mwl8k_request_alt_fw(struct mwl8k_priv *priv)
5171 {
5172         int rc;
5173         printk(KERN_ERR "%s: Error requesting preferred fw %s.\n"
5174                "Trying alternative firmware %s\n", pci_name(priv->pdev),
5175                priv->fw_pref, priv->fw_alt);
5176         rc = mwl8k_request_fw(priv, priv->fw_alt, &priv->fw_ucode, true);
5177         if (rc) {
5178                 printk(KERN_ERR "%s: Error requesting alt fw %s\n",
5179                        pci_name(priv->pdev), priv->fw_alt);
5180                 return rc;
5181         }
5182         return 0;
5183 }
5184
5185 static int mwl8k_firmware_load_success(struct mwl8k_priv *priv);
5186 static void mwl8k_fw_state_machine(const struct firmware *fw, void *context)
5187 {
5188         struct mwl8k_priv *priv = context;
5189         struct mwl8k_device_info *di = priv->device_info;
5190         int rc;
5191
5192         switch (priv->fw_state) {
5193         case FW_STATE_INIT:
5194                 if (!fw) {
5195                         printk(KERN_ERR "%s: Error requesting helper fw %s\n",
5196                                pci_name(priv->pdev), di->helper_image);
5197                         goto fail;
5198                 }
5199                 priv->fw_helper = fw;
5200                 rc = mwl8k_request_fw(priv, priv->fw_pref, &priv->fw_ucode,
5201                                       true);
5202                 if (rc && priv->fw_alt) {
5203                         rc = mwl8k_request_alt_fw(priv);
5204                         if (rc)
5205                                 goto fail;
5206                         priv->fw_state = FW_STATE_LOADING_ALT;
5207                 } else if (rc)
5208                         goto fail;
5209                 else
5210                         priv->fw_state = FW_STATE_LOADING_PREF;
5211                 break;
5212
5213         case FW_STATE_LOADING_PREF:
5214                 if (!fw) {
5215                         if (priv->fw_alt) {
5216                                 rc = mwl8k_request_alt_fw(priv);
5217                                 if (rc)
5218                                         goto fail;
5219                                 priv->fw_state = FW_STATE_LOADING_ALT;
5220                         } else
5221                                 goto fail;
5222                 } else {
5223                         priv->fw_ucode = fw;
5224                         rc = mwl8k_firmware_load_success(priv);
5225                         if (rc)
5226                                 goto fail;
5227                         else
5228                                 complete(&priv->firmware_loading_complete);
5229                 }
5230                 break;
5231
5232         case FW_STATE_LOADING_ALT:
5233                 if (!fw) {
5234                         printk(KERN_ERR "%s: Error requesting alt fw %s\n",
5235                                pci_name(priv->pdev), di->helper_image);
5236                         goto fail;
5237                 }
5238                 priv->fw_ucode = fw;
5239                 rc = mwl8k_firmware_load_success(priv);
5240                 if (rc)
5241                         goto fail;
5242                 else
5243                         complete(&priv->firmware_loading_complete);
5244                 break;
5245
5246         default:
5247                 printk(KERN_ERR "%s: Unexpected firmware loading state: %d\n",
5248                        MWL8K_NAME, priv->fw_state);
5249                 BUG_ON(1);
5250         }
5251
5252         return;
5253
5254 fail:
5255         priv->fw_state = FW_STATE_ERROR;
5256         complete(&priv->firmware_loading_complete);
5257         device_release_driver(&priv->pdev->dev);
5258         mwl8k_release_firmware(priv);
5259 }
5260
5261 static int mwl8k_init_firmware(struct ieee80211_hw *hw, char *fw_image,
5262                                bool nowait)
5263 {
5264         struct mwl8k_priv *priv = hw->priv;
5265         int rc;
5266
5267         /* Reset firmware and hardware */
5268         mwl8k_hw_reset(priv);
5269
5270         /* Ask userland hotplug daemon for the device firmware */
5271         rc = mwl8k_request_firmware(priv, fw_image, nowait);
5272         if (rc) {
5273                 wiphy_err(hw->wiphy, "Firmware files not found\n");
5274                 return rc;
5275         }
5276
5277         if (nowait)
5278                 return rc;
5279
5280         /* Load firmware into hardware */
5281         rc = mwl8k_load_firmware(hw);
5282         if (rc)
5283                 wiphy_err(hw->wiphy, "Cannot start firmware\n");
5284
5285         /* Reclaim memory once firmware is successfully loaded */
5286         mwl8k_release_firmware(priv);
5287
5288         return rc;
5289 }
5290
5291 static int mwl8k_init_txqs(struct ieee80211_hw *hw)
5292 {
5293         struct mwl8k_priv *priv = hw->priv;
5294         int rc = 0;
5295         int i;
5296
5297         for (i = 0; i < mwl8k_tx_queues(priv); i++) {
5298                 rc = mwl8k_txq_init(hw, i);
5299                 if (rc)
5300                         break;
5301                 if (priv->ap_fw)
5302                         iowrite32(priv->txq[i].txd_dma,
5303                                   priv->sram + priv->txq_offset[i]);
5304         }
5305         return rc;
5306 }
5307
5308 /* initialize hw after successfully loading a firmware image */
5309 static int mwl8k_probe_hw(struct ieee80211_hw *hw)
5310 {
5311         struct mwl8k_priv *priv = hw->priv;
5312         int rc = 0;
5313         int i;
5314
5315         if (priv->ap_fw) {
5316                 priv->rxd_ops = priv->device_info->ap_rxd_ops;
5317                 if (priv->rxd_ops == NULL) {
5318                         wiphy_err(hw->wiphy,
5319                                   "Driver does not have AP firmware image support for this hardware\n");
5320                         goto err_stop_firmware;
5321                 }
5322         } else {
5323                 priv->rxd_ops = &rxd_sta_ops;
5324         }
5325
5326         priv->sniffer_enabled = false;
5327         priv->wmm_enabled = false;
5328         priv->pending_tx_pkts = 0;
5329
5330         rc = mwl8k_rxq_init(hw, 0);
5331         if (rc)
5332                 goto err_stop_firmware;
5333         rxq_refill(hw, 0, INT_MAX);
5334
5335         /* For the sta firmware, we need to know the dma addresses of tx queues
5336          * before sending MWL8K_CMD_GET_HW_SPEC.  So we must initialize them
5337          * prior to issuing this command.  But for the AP case, we learn the
5338          * total number of queues from the result CMD_GET_HW_SPEC, so for this
5339          * case we must initialize the tx queues after.
5340          */
5341         priv->num_ampdu_queues = 0;
5342         if (!priv->ap_fw) {
5343                 rc = mwl8k_init_txqs(hw);
5344                 if (rc)
5345                         goto err_free_queues;
5346         }
5347
5348         iowrite32(0, priv->regs + MWL8K_HIU_A2H_INTERRUPT_STATUS);
5349         iowrite32(0, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK);
5350         iowrite32(MWL8K_A2H_INT_TX_DONE|MWL8K_A2H_INT_RX_READY|
5351                   MWL8K_A2H_INT_BA_WATCHDOG,
5352                   priv->regs + MWL8K_HIU_A2H_INTERRUPT_CLEAR_SEL);
5353         iowrite32(MWL8K_A2H_INT_OPC_DONE,
5354                   priv->regs + MWL8K_HIU_A2H_INTERRUPT_STATUS_MASK);
5355
5356         rc = request_irq(priv->pdev->irq, mwl8k_interrupt,
5357                          IRQF_SHARED, MWL8K_NAME, hw);
5358         if (rc) {
5359                 wiphy_err(hw->wiphy, "failed to register IRQ handler\n");
5360                 goto err_free_queues;
5361         }
5362
5363         memset(priv->ampdu, 0, sizeof(priv->ampdu));
5364
5365         /*
5366          * Temporarily enable interrupts.  Initial firmware host
5367          * commands use interrupts and avoid polling.  Disable
5368          * interrupts when done.
5369          */
5370         iowrite32(MWL8K_A2H_EVENTS, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK);
5371
5372         /* Get config data, mac addrs etc */
5373         if (priv->ap_fw) {
5374                 rc = mwl8k_cmd_get_hw_spec_ap(hw);
5375                 if (!rc)
5376                         rc = mwl8k_init_txqs(hw);
5377                 if (!rc)
5378                         rc = mwl8k_cmd_set_hw_spec(hw);
5379         } else {
5380                 rc = mwl8k_cmd_get_hw_spec_sta(hw);
5381         }
5382         if (rc) {
5383                 wiphy_err(hw->wiphy, "Cannot initialise firmware\n");
5384                 goto err_free_irq;
5385         }
5386
5387         /* Turn radio off */
5388         rc = mwl8k_cmd_radio_disable(hw);
5389         if (rc) {
5390                 wiphy_err(hw->wiphy, "Cannot disable\n");
5391                 goto err_free_irq;
5392         }
5393
5394         /* Clear MAC address */
5395         rc = mwl8k_cmd_set_mac_addr(hw, NULL, "\x00\x00\x00\x00\x00\x00");
5396         if (rc) {
5397                 wiphy_err(hw->wiphy, "Cannot clear MAC address\n");
5398                 goto err_free_irq;
5399         }
5400
5401         /* Disable interrupts */
5402         iowrite32(0, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK);
5403         free_irq(priv->pdev->irq, hw);
5404
5405         wiphy_info(hw->wiphy, "%s v%d, %pm, %s firmware %u.%u.%u.%u\n",
5406                    priv->device_info->part_name,
5407                    priv->hw_rev, hw->wiphy->perm_addr,
5408                    priv->ap_fw ? "AP" : "STA",
5409                    (priv->fw_rev >> 24) & 0xff, (priv->fw_rev >> 16) & 0xff,
5410                    (priv->fw_rev >> 8) & 0xff, priv->fw_rev & 0xff);
5411
5412         return 0;
5413
5414 err_free_irq:
5415         iowrite32(0, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK);
5416         free_irq(priv->pdev->irq, hw);
5417
5418 err_free_queues:
5419         for (i = 0; i < mwl8k_tx_queues(priv); i++)
5420                 mwl8k_txq_deinit(hw, i);
5421         mwl8k_rxq_deinit(hw, 0);
5422
5423 err_stop_firmware:
5424         mwl8k_hw_reset(priv);
5425
5426         return rc;
5427 }
5428
5429 /*
5430  * invoke mwl8k_reload_firmware to change the firmware image after the device
5431  * has already been registered
5432  */
5433 static int mwl8k_reload_firmware(struct ieee80211_hw *hw, char *fw_image)
5434 {
5435         int i, rc = 0;
5436         struct mwl8k_priv *priv = hw->priv;
5437
5438         mwl8k_stop(hw);
5439         mwl8k_rxq_deinit(hw, 0);
5440
5441         for (i = 0; i < mwl8k_tx_queues(priv); i++)
5442                 mwl8k_txq_deinit(hw, i);
5443
5444         rc = mwl8k_init_firmware(hw, fw_image, false);
5445         if (rc)
5446                 goto fail;
5447
5448         rc = mwl8k_probe_hw(hw);
5449         if (rc)
5450                 goto fail;
5451
5452         rc = mwl8k_start(hw);
5453         if (rc)
5454                 goto fail;
5455
5456         rc = mwl8k_config(hw, ~0);
5457         if (rc)
5458                 goto fail;
5459
5460         for (i = 0; i < MWL8K_TX_WMM_QUEUES; i++) {
5461                 rc = mwl8k_conf_tx(hw, i, &priv->wmm_params[i]);
5462                 if (rc)
5463                         goto fail;
5464         }
5465
5466         return rc;
5467
5468 fail:
5469         printk(KERN_WARNING "mwl8k: Failed to reload firmware image.\n");
5470         return rc;
5471 }
5472
5473 static int mwl8k_firmware_load_success(struct mwl8k_priv *priv)
5474 {
5475         struct ieee80211_hw *hw = priv->hw;
5476         int i, rc;
5477
5478         rc = mwl8k_load_firmware(hw);
5479         mwl8k_release_firmware(priv);
5480         if (rc) {
5481                 wiphy_err(hw->wiphy, "Cannot start firmware\n");
5482                 return rc;
5483         }
5484
5485         /*
5486          * Extra headroom is the size of the required DMA header
5487          * minus the size of the smallest 802.11 frame (CTS frame).
5488          */
5489         hw->extra_tx_headroom =
5490                 sizeof(struct mwl8k_dma_data) - sizeof(struct ieee80211_cts);
5491
5492         hw->channel_change_time = 10;
5493
5494         hw->queues = MWL8K_TX_WMM_QUEUES;
5495
5496         /* Set rssi values to dBm */
5497         hw->flags |= IEEE80211_HW_SIGNAL_DBM | IEEE80211_HW_HAS_RATE_CONTROL;
5498         hw->vif_data_size = sizeof(struct mwl8k_vif);
5499         hw->sta_data_size = sizeof(struct mwl8k_sta);
5500
5501         priv->macids_used = 0;
5502         INIT_LIST_HEAD(&priv->vif_list);
5503
5504         /* Set default radio state and preamble */
5505         priv->radio_on = 0;
5506         priv->radio_short_preamble = 0;
5507
5508         /* Finalize join worker */
5509         INIT_WORK(&priv->finalize_join_worker, mwl8k_finalize_join_worker);
5510         /* Handle watchdog ba events */
5511         INIT_WORK(&priv->watchdog_ba_handle, mwl8k_watchdog_ba_events);
5512
5513         /* TX reclaim and RX tasklets.  */
5514         tasklet_init(&priv->poll_tx_task, mwl8k_tx_poll, (unsigned long)hw);
5515         tasklet_disable(&priv->poll_tx_task);
5516         tasklet_init(&priv->poll_rx_task, mwl8k_rx_poll, (unsigned long)hw);
5517         tasklet_disable(&priv->poll_rx_task);
5518
5519         /* Power management cookie */
5520         priv->cookie = pci_alloc_consistent(priv->pdev, 4, &priv->cookie_dma);
5521         if (priv->cookie == NULL)
5522                 return -ENOMEM;
5523
5524         mutex_init(&priv->fw_mutex);
5525         priv->fw_mutex_owner = NULL;
5526         priv->fw_mutex_depth = 0;
5527         priv->hostcmd_wait = NULL;
5528
5529         spin_lock_init(&priv->tx_lock);
5530
5531         spin_lock_init(&priv->stream_lock);
5532
5533         priv->tx_wait = NULL;
5534
5535         rc = mwl8k_probe_hw(hw);
5536         if (rc)
5537                 goto err_free_cookie;
5538
5539         hw->wiphy->interface_modes = 0;
5540         if (priv->ap_macids_supported || priv->device_info->fw_image_ap)
5541                 hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_AP);
5542         if (priv->sta_macids_supported || priv->device_info->fw_image_sta)
5543                 hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_STATION);
5544
5545         rc = ieee80211_register_hw(hw);
5546         if (rc) {
5547                 wiphy_err(hw->wiphy, "Cannot register device\n");
5548                 goto err_unprobe_hw;
5549         }
5550
5551         return 0;
5552
5553 err_unprobe_hw:
5554         for (i = 0; i < mwl8k_tx_queues(priv); i++)
5555                 mwl8k_txq_deinit(hw, i);
5556         mwl8k_rxq_deinit(hw, 0);
5557
5558 err_free_cookie:
5559         if (priv->cookie != NULL)
5560                 pci_free_consistent(priv->pdev, 4,
5561                                 priv->cookie, priv->cookie_dma);
5562
5563         return rc;
5564 }
5565 static int __devinit mwl8k_probe(struct pci_dev *pdev,
5566                                  const struct pci_device_id *id)
5567 {
5568         static int printed_version;
5569         struct ieee80211_hw *hw;
5570         struct mwl8k_priv *priv;
5571         struct mwl8k_device_info *di;
5572         int rc;
5573
5574         if (!printed_version) {
5575                 printk(KERN_INFO "%s version %s\n", MWL8K_DESC, MWL8K_VERSION);
5576                 printed_version = 1;
5577         }
5578
5579
5580         rc = pci_enable_device(pdev);
5581         if (rc) {
5582                 printk(KERN_ERR "%s: Cannot enable new PCI device\n",
5583                        MWL8K_NAME);
5584                 return rc;
5585         }
5586
5587         rc = pci_request_regions(pdev, MWL8K_NAME);
5588         if (rc) {
5589                 printk(KERN_ERR "%s: Cannot obtain PCI resources\n",
5590                        MWL8K_NAME);
5591                 goto err_disable_device;
5592         }
5593
5594         pci_set_master(pdev);
5595
5596
5597         hw = ieee80211_alloc_hw(sizeof(*priv), &mwl8k_ops);
5598         if (hw == NULL) {
5599                 printk(KERN_ERR "%s: ieee80211 alloc failed\n", MWL8K_NAME);
5600                 rc = -ENOMEM;
5601                 goto err_free_reg;
5602         }
5603
5604         SET_IEEE80211_DEV(hw, &pdev->dev);
5605         pci_set_drvdata(pdev, hw);
5606
5607         priv = hw->priv;
5608         priv->hw = hw;
5609         priv->pdev = pdev;
5610         priv->device_info = &mwl8k_info_tbl[id->driver_data];
5611
5612
5613         priv->sram = pci_iomap(pdev, 0, 0x10000);
5614         if (priv->sram == NULL) {
5615                 wiphy_err(hw->wiphy, "Cannot map device SRAM\n");
5616                 goto err_iounmap;
5617         }
5618
5619         /*
5620          * If BAR0 is a 32 bit BAR, the register BAR will be BAR1.
5621          * If BAR0 is a 64 bit BAR, the register BAR will be BAR2.
5622          */
5623         priv->regs = pci_iomap(pdev, 1, 0x10000);
5624         if (priv->regs == NULL) {
5625                 priv->regs = pci_iomap(pdev, 2, 0x10000);
5626                 if (priv->regs == NULL) {
5627                         wiphy_err(hw->wiphy, "Cannot map device registers\n");
5628                         goto err_iounmap;
5629                 }
5630         }
5631
5632         /*
5633          * Choose the initial fw image depending on user input.  If a second
5634          * image is available, make it the alternative image that will be
5635          * loaded if the first one fails.
5636          */
5637         init_completion(&priv->firmware_loading_complete);
5638         di = priv->device_info;
5639         if (ap_mode_default && di->fw_image_ap) {
5640                 priv->fw_pref = di->fw_image_ap;
5641                 priv->fw_alt = di->fw_image_sta;
5642         } else if (!ap_mode_default && di->fw_image_sta) {
5643                 priv->fw_pref = di->fw_image_sta;
5644                 priv->fw_alt = di->fw_image_ap;
5645         } else if (ap_mode_default && !di->fw_image_ap && di->fw_image_sta) {
5646                 printk(KERN_WARNING "AP fw is unavailable.  Using STA fw.");
5647                 priv->fw_pref = di->fw_image_sta;
5648         } else if (!ap_mode_default && !di->fw_image_sta && di->fw_image_ap) {
5649                 printk(KERN_WARNING "STA fw is unavailable.  Using AP fw.");
5650                 priv->fw_pref = di->fw_image_ap;
5651         }
5652         rc = mwl8k_init_firmware(hw, priv->fw_pref, true);
5653         if (rc)
5654                 goto err_stop_firmware;
5655         return rc;
5656
5657 err_stop_firmware:
5658         mwl8k_hw_reset(priv);
5659
5660 err_iounmap:
5661         if (priv->regs != NULL)
5662                 pci_iounmap(pdev, priv->regs);
5663
5664         if (priv->sram != NULL)
5665                 pci_iounmap(pdev, priv->sram);
5666
5667         pci_set_drvdata(pdev, NULL);
5668         ieee80211_free_hw(hw);
5669
5670 err_free_reg:
5671         pci_release_regions(pdev);
5672
5673 err_disable_device:
5674         pci_disable_device(pdev);
5675
5676         return rc;
5677 }
5678
5679 static void __devexit mwl8k_shutdown(struct pci_dev *pdev)
5680 {
5681         printk(KERN_ERR "===>%s(%u)\n", __func__, __LINE__);
5682 }
5683
5684 static void __devexit mwl8k_remove(struct pci_dev *pdev)
5685 {
5686         struct ieee80211_hw *hw = pci_get_drvdata(pdev);
5687         struct mwl8k_priv *priv;
5688         int i;
5689
5690         if (hw == NULL)
5691                 return;
5692         priv = hw->priv;
5693
5694         wait_for_completion(&priv->firmware_loading_complete);
5695
5696         if (priv->fw_state == FW_STATE_ERROR) {
5697                 mwl8k_hw_reset(priv);
5698                 goto unmap;
5699         }
5700
5701         ieee80211_stop_queues(hw);
5702
5703         ieee80211_unregister_hw(hw);
5704
5705         /* Remove TX reclaim and RX tasklets.  */
5706         tasklet_kill(&priv->poll_tx_task);
5707         tasklet_kill(&priv->poll_rx_task);
5708
5709         /* Stop hardware */
5710         mwl8k_hw_reset(priv);
5711
5712         /* Return all skbs to mac80211 */
5713         for (i = 0; i < mwl8k_tx_queues(priv); i++)
5714                 mwl8k_txq_reclaim(hw, i, INT_MAX, 1);
5715
5716         for (i = 0; i < mwl8k_tx_queues(priv); i++)
5717                 mwl8k_txq_deinit(hw, i);
5718
5719         mwl8k_rxq_deinit(hw, 0);
5720
5721         pci_free_consistent(priv->pdev, 4, priv->cookie, priv->cookie_dma);
5722
5723 unmap:
5724         pci_iounmap(pdev, priv->regs);
5725         pci_iounmap(pdev, priv->sram);
5726         pci_set_drvdata(pdev, NULL);
5727         ieee80211_free_hw(hw);
5728         pci_release_regions(pdev);
5729         pci_disable_device(pdev);
5730 }
5731
5732 static struct pci_driver mwl8k_driver = {
5733         .name           = MWL8K_NAME,
5734         .id_table       = mwl8k_pci_id_table,
5735         .probe          = mwl8k_probe,
5736         .remove         = __devexit_p(mwl8k_remove),
5737         .shutdown       = __devexit_p(mwl8k_shutdown),
5738 };
5739
5740 static int __init mwl8k_init(void)
5741 {
5742         return pci_register_driver(&mwl8k_driver);
5743 }
5744
5745 static void __exit mwl8k_exit(void)
5746 {
5747         pci_unregister_driver(&mwl8k_driver);
5748 }
5749
5750 module_init(mwl8k_init);
5751 module_exit(mwl8k_exit);
5752
5753 MODULE_DESCRIPTION(MWL8K_DESC);
5754 MODULE_VERSION(MWL8K_VERSION);
5755 MODULE_AUTHOR("Lennert Buytenhek <buytenh@marvell.com>");
5756 MODULE_LICENSE("GPL");