bwn: fixing performance problems and an RX buffer overflow problem
[dragonfly.git] / sys / dev / netif / bwn / bwn / if_bwnvar.h
1 /*-
2  * Copyright (c) 2009-2010 Weongyo Jeong <weongyo@freebsd.org>
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer,
10  *    without modification.
11  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
12  *    similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
13  *    redistribution must be conditioned upon including a substantially
14  *    similar Disclaimer requirement for further binary redistribution.
15  *
16  * NO WARRANTY
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19  * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
20  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
21  * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
22  * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
27  * THE POSSIBILITY OF SUCH DAMAGES.
28  *
29  * $FreeBSD: head/sys/dev/bwn/if_bwnvar.h 228399 2011-12-10 21:05:06Z eadler $
30  */
31
32 #ifndef _IF_BWNVAR_H
33 #define _IF_BWNVAR_H
34
35 #include <netproto/802_11/ieee80211_amrr.h>
36
37 struct siba_dev_softc;
38 struct bwn_softc;
39 struct bwn_mac;
40
41 #define N(a)                    (sizeof(a) / sizeof(a[0]))
42 #define BWN_ALIGN                       0x2000
43 #define BWN_BUS_SPACE_MAXADDR_30BIT     0x3fffffff
44 #define BWN_RETRY_SHORT                 7
45 #define BWN_RETRY_LONG                  4
46 #define BWN_STAID_MAX                   64
47 #define BWN_TXPWR_IGNORE_TIME           (1 << 0)
48 #define BWN_TXPWR_IGNORE_TSSI           (1 << 1)
49 #define BWN_HAS_TXMAG(phy)                                              \
50         (((phy)->rev >= 2) && ((phy)->rf_ver == 0x2050) &&              \
51          ((phy)->rf_rev == 8))
52 #define BWN_HAS_LOOPBACK(phy)                                           \
53         (((phy)->rev > 1) || ((phy)->gmode))
54 #define BWN_TXERROR_MAX                 1000
55 #define BWN_GETTIME(v)  do {                                            \
56         struct timespec ts;                                             \
57         nanouptime(&ts);                                                \
58         (v) = ts.tv_nsec / 1000000 + ts.tv_sec * 1000;                  \
59 } while (0)
60 #define BWN_ISOLDFMT(mac)               ((mac)->mac_fw.rev <= 351)
61 #define BWN_TSSI2DBM(num, den)                                          \
62         ((int32_t)((num < 0) ? num / den : (num + den / 2) / den))
63 #define BWN_MAX_HDRSIZE(mac)    (104 + sizeof(struct bwn_plcp6))
64 #define BWN_HDRSIZE(mac)                                                \
65         ((BWN_ISOLDFMT(mac)) ? (100 + sizeof(struct bwn_plcp6)) :       \
66             (104 + sizeof(struct bwn_plcp6)))
67 #define BWN_PIO_COOKIE(tq, tp)                                          \
68         ((uint16_t)((((uint16_t)tq->tq_index + 1) << 12) | tp->tp_index))
69 #define BWN_DMA_COOKIE(dr, slot)                                        \
70         ((uint16_t)(((uint16_t)dr->dr_index + 1) << 12) | (uint16_t)slot)
71 #define BWN_READ_2(mac, o)              (siba_read_2(mac->mac_sc->sc_dev, o))
72 #define BWN_READ_4(mac, o)              (siba_read_4(mac->mac_sc->sc_dev, o))
73 #define BWN_WRITE_2(mac, o, v)                                          \
74         (siba_write_2(mac->mac_sc->sc_dev, o, v))
75 #define BWN_WRITE_4(mac, o, v)                                          \
76         (siba_write_4(mac->mac_sc->sc_dev, o, v))
77 #define BWN_PIO_TXQOFFSET(mac)                                          \
78         ((siba_get_revid(mac->mac_sc->sc_dev) >= 11) ? 0x18 : 0)
79 #define BWN_PIO_RXQOFFSET(mac)                                          \
80         ((siba_get_revid(mac->mac_sc->sc_dev) >= 11) ? 0x38 : 8)
81 #define BWN_SEC_NEWAPI(mac)             (mac->mac_fw.rev >= 351)
82 #define BWN_SEC_KEY2FW(mac, idx)                                        \
83         (BWN_SEC_NEWAPI(mac) ? idx : ((idx >= 4) ? idx - 4 : idx))
84 #define BWN_RF_READ(mac, r)             (mac->mac_phy.rf_read(mac, r))
85 #define BWN_RF_WRITE(mac, r, v)         (mac->mac_phy.rf_write(mac, r, v))
86 #define BWN_RF_MASK(mac, o, m)                                          \
87         BWN_RF_WRITE(mac, o, BWN_RF_READ(mac, o) & m)
88 #define BWN_RF_SETMASK(mac, offset, mask, set)                          \
89         BWN_RF_WRITE(mac, offset, (BWN_RF_READ(mac, offset) & mask) | set)
90 #define BWN_RF_SET(mac, offset, set)                                    \
91         BWN_RF_WRITE(mac, offset, BWN_RF_READ(mac, offset) | set)
92 #define BWN_PHY_READ(mac, r)            (mac->mac_phy.phy_read(mac, r))
93 #define BWN_PHY_WRITE(mac, r, v)                                        \
94         (mac->mac_phy.phy_write(mac, r, v))
95 #define BWN_PHY_SET(mac, offset, set)   do {                            \
96         if (mac->mac_phy.phy_maskset != NULL) {                         \
97                 KASSERT(mac->mac_status < BWN_MAC_STATUS_INITED ||      \
98                     mac->mac_suspended > 0,                             \
99                     ("dont access PHY or RF registers after turning on MAC")); \
100                 mac->mac_phy.phy_maskset(mac, offset, 0xffff, set);     \
101         } else                                                          \
102                 BWN_PHY_WRITE(mac, offset,                              \
103                     BWN_PHY_READ(mac, offset) | (set));                 \
104 } while (0)
105 #define BWN_PHY_SETMASK(mac, offset, mask, set) do {                    \
106         if (mac->mac_phy.phy_maskset != NULL) {                         \
107                 KASSERT(mac->mac_status < BWN_MAC_STATUS_INITED ||      \
108                     mac->mac_suspended > 0,                             \
109                     ("dont access PHY or RF registers after turning on MAC")); \
110                 mac->mac_phy.phy_maskset(mac, offset, mask, set);       \
111         } else                                                          \
112                 BWN_PHY_WRITE(mac, offset,                              \
113                     (BWN_PHY_READ(mac, offset) & (mask)) | (set));      \
114 } while (0)
115 #define BWN_PHY_MASK(mac, offset, mask) do {                            \
116         if (mac->mac_phy.phy_maskset != NULL) {                         \
117                 KASSERT(mac->mac_status < BWN_MAC_STATUS_INITED ||      \
118                     mac->mac_suspended > 0,                             \
119                     ("dont access PHY or RF registers after turning on MAC")); \
120                 mac->mac_phy.phy_maskset(mac, offset, mask, 0);         \
121         } else                                                          \
122                 BWN_PHY_WRITE(mac, offset,                              \
123                     BWN_PHY_READ(mac, offset) & mask);                  \
124 } while (0)
125 #define BWN_PHY_COPY(mac, dst, src)     do {                            \
126         KASSERT(mac->mac_status < BWN_MAC_STATUS_INITED ||              \
127             mac->mac_suspended > 0,                                     \
128             ("dont access PHY or RF registers after turning on MAC"));  \
129         BWN_PHY_WRITE(mac, dst, BWN_PHY_READ(mac, src));                \
130 } while (0)
131 #define BWN_LO_CALIB_EXPIRE             (1000 * (30 - 2))
132 #define BWN_LO_PWRVEC_EXPIRE            (1000 * (30 - 2))
133 #define BWN_LO_TXCTL_EXPIRE             (1000 * (180 - 4))
134 #define BWN_DMA_BIT_MASK(n)             (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1))
135 #define BWN_LPD(L, P, D)                (((L) << 2) | ((P) << 1) | ((D) << 0))
136 #define BWN_BITREV4(tmp)                (BWN_BITREV8(tmp) >> 4)
137 #define BWN_BITREV8(byte)               (bwn_bitrev_table[byte])
138 #define BWN_BBATTCMP(a, b)              ((a)->att == (b)->att)
139 #define BWN_RFATTCMP(a, b)                                              \
140         (((a)->att == (b)->att) && ((a)->padmix == (b)->padmix))
141 #define BWN_PIO_WRITE_2(mac, tq, offset, value)                         \
142         BWN_WRITE_2(mac, (tq)->tq_base + offset, value)
143 #define BWN_PIO_READ_4(mac, tq, offset)                                 \
144         BWN_READ_4(mac, tq->tq_base + offset)
145 #define BWN_ISCCKRATE(rate)                                             \
146         (rate == BWN_CCK_RATE_1MB || rate == BWN_CCK_RATE_2MB ||        \
147          rate == BWN_CCK_RATE_5MB || rate == BWN_CCK_RATE_11MB)
148 #define BWN_ISOFDMRATE(rate)            (!BWN_ISCCKRATE(rate))
149 #define BWN_BARRIER(mac, flags)         siba_barrier(mac->mac_sc->sc_dev, flags)
150 #define BWN_DMA_READ(dr, offset)                                \
151         (BWN_READ_4(dr->dr_mac, dr->dr_base + offset))
152 #define BWN_DMA_WRITE(dr, offset, value)                        \
153         (BWN_WRITE_4(dr->dr_mac, dr->dr_base + offset, value))
154
155 struct bwn_rate {
156         uint16_t                        rateid;
157         uint32_t                        flags;
158 };
159
160 #define BWN_ANT0                        0
161 #define BWN_ANT1                        1
162 #define BWN_ANTAUTO0                    2
163 #define BWN_ANTAUTO1                    3
164 #define BWN_ANT2                        4
165 #define BWN_ANT3                        8
166 #define BWN_ANTAUTO                     BWN_ANTAUTO0
167 #define BWN_ANT_DEFAULT                 BWN_ANTAUTO
168 #define BWN_TX_SLOTS_PER_FRAME          2
169
170 struct bwn_channel {
171         unsigned                        freq;
172         unsigned                        ieee;
173         unsigned                        maxTxPow;
174 };
175
176 struct bwn_channelinfo {
177         struct bwn_channel              channels[IEEE80211_CHAN_MAX];
178         unsigned                        nchannels;
179 };
180
181 struct bwn_bbatt {
182         uint8_t                         att;
183 };
184
185 struct bwn_bbatt_list {
186         const struct bwn_bbatt          *array;
187         uint8_t                         len;
188         uint8_t                         min;
189         uint8_t                         max;
190 };
191
192 struct bwn_rfatt {
193         uint8_t                         att;
194         int                             padmix;
195 };
196
197 struct bwn_rfatt_list {
198         const struct bwn_rfatt          *array;
199         uint8_t                         len;
200         uint8_t                         min;
201         uint8_t                         max;
202 };
203
204 #define BWN_DC_LT_SIZE                  32
205
206 struct bwn_loctl {
207         int8_t                          i;
208         int8_t                          q;
209 };
210
211 struct bwn_lo_calib {
212         struct bwn_bbatt                bbatt;
213         struct bwn_rfatt                rfatt;
214         struct bwn_loctl                ctl;
215         unsigned long                   calib_time;
216         TAILQ_ENTRY(bwn_lo_calib)       list;
217 };
218
219 struct bwn_rxhdr4 {
220         uint16_t                        frame_len;
221         uint8_t                         pad1[2];
222         uint16_t                        phy_status0;
223         union {
224                 struct {
225                         uint8_t         rssi;
226                         uint8_t         sig_qual;
227                 } __packed abg;
228                 struct {
229                         int8_t          power0;
230                         int8_t          power1;
231                 } __packed n;
232         } __packed phy;
233         uint16_t                        phy_status2;
234         uint16_t                        phy_status3;
235         uint32_t                        mac_status;
236         uint16_t                        mac_time;
237         uint16_t                        channel;
238 } __packed;
239
240 struct bwn_txstatus {
241         uint16_t                        cookie;
242         uint16_t                        seq;
243         uint8_t                         phy_stat;
244         uint8_t                         framecnt;
245         uint8_t                         rtscnt;
246         uint8_t                         sreason;
247         uint8_t                         pm;
248         uint8_t                         im;
249         uint8_t                         ampdu;
250         uint8_t                         ack;
251 };
252
253 #define BWN_TXCTL_PA3DB                 0x40
254 #define BWN_TXCTL_PA2DB                 0x20
255 #define BWN_TXCTL_TXMIX                 0x10
256
257 struct bwn_txpwr_loctl {
258         struct bwn_rfatt_list           rfatt;
259         struct bwn_bbatt_list           bbatt;
260         uint16_t                        dc_lt[BWN_DC_LT_SIZE];
261         TAILQ_HEAD(, bwn_lo_calib)      calib_list;
262         unsigned long                   pwr_vec_read_time;
263         unsigned long                   txctl_measured_time;
264         uint8_t                         tx_bias;
265         uint8_t                         tx_magn;
266         uint64_t                        power_vector;
267 };
268
269 #define BWN_OFDMTAB_DIR_UNKNOWN         0
270 #define BWN_OFDMTAB_DIR_READ            1
271 #define BWN_OFDMTAB_DIR_WRITE           2
272
273 struct bwn_phy_g {
274         unsigned                        pg_flags;
275 #define BWN_PHY_G_FLAG_TSSITABLE_ALLOC  (1 << 0)
276 #define BWN_PHY_G_FLAG_RADIOCTX_VALID   (1 << 1)
277         int                             pg_aci_enable;
278         int                             pg_aci_wlan_automatic;
279         int                             pg_aci_hw_rssi;
280         int                             pg_rf_on;
281         uint16_t                        pg_radioctx_over;
282         uint16_t                        pg_radioctx_overval;
283         uint16_t                        pg_minlowsig[2];
284         uint16_t                        pg_minlowsigpos[2];
285         int8_t                          *pg_tssi2dbm;
286         int                             pg_idletssi;
287         int                             pg_curtssi;
288         uint8_t                         pg_avgtssi;
289         struct bwn_bbatt                pg_bbatt;
290         struct bwn_rfatt                pg_rfatt;
291         uint8_t                         pg_txctl;
292         int                             pg_bbatt_delta;
293         int                             pg_rfatt_delta;
294
295         struct bwn_txpwr_loctl          pg_loctl;
296         int16_t                         pg_max_lb_gain;
297         int16_t                         pg_trsw_rx_gain;
298         int16_t                         pg_lna_lod_gain;
299         int16_t                         pg_lna_gain;
300         int16_t                         pg_pga_gain;
301         int                             pg_immode;
302 #define BWN_INTERFSTACK_SIZE    26
303         uint32_t                        pg_interfstack[BWN_INTERFSTACK_SIZE];
304
305         int16_t                         pg_nrssi[2];
306         int32_t                         pg_nrssi_slope;
307         int8_t                          pg_nrssi_lt[64];
308
309         uint16_t                        pg_lofcal;
310
311         uint16_t                        pg_initval;
312         uint16_t                        pg_ofdmtab_addr;
313         unsigned                        pg_ofdmtab_dir;
314 };
315
316 #define BWN_IMMODE_NONE                 0
317 #define BWN_IMMODE_NONWLAN              1
318 #define BWN_IMMODE_MANUAL               2
319 #define BWN_IMMODE_AUTO                 3
320 #define BWN_TXPWR_RES_NEED_ADJUST       0
321 #define BWN_TXPWR_RES_DONE              1
322
323 #define BWN_PHYLP_TXPCTL_UNKNOWN        0
324 #define BWN_PHYLP_TXPCTL_OFF            1
325 #define BWN_PHYLP_TXPCTL_ON_SW          2
326 #define BWN_PHYLP_TXPCTL_ON_HW          3
327
328 struct bwn_phy_lp {
329         uint8_t                         plp_chan;
330         uint8_t                         plp_chanfullcal;
331         int32_t                         plp_antenna;
332         uint8_t                         plp_txpctlmode;
333         uint8_t                         plp_txisoband_h;
334         uint8_t                         plp_txisoband_m;
335         uint8_t                         plp_txisoband_l;
336         uint8_t                         plp_rxpwroffset;
337         int8_t                          plp_txpwridx;
338         uint16_t                        plp_tssiidx;
339         uint16_t                        plp_tssinpt;
340         uint8_t                         plp_rssivf;
341         uint8_t                         plp_rssivc;
342         uint8_t                         plp_rssigs;
343         uint8_t                         plp_rccap;
344         uint8_t                         plp_bxarch;
345         uint8_t                         plp_crsusr_off;
346         uint8_t                         plp_crssys_off;
347         uint32_t                        plp_div;
348         int32_t                         plp_tonefreq;
349         uint16_t                        plp_digfilt[9];
350 };
351
352 /* for LP */
353 struct bwn_txgain {
354         uint16_t                        tg_gm;
355         uint16_t                        tg_pga;
356         uint16_t                        tg_pad;
357         uint16_t                        tg_dac;
358 };
359
360 struct bwn_rxcompco {
361         uint8_t                         rc_chan;
362         int8_t                          rc_c1;
363         int8_t                          rc_c0;
364 };
365
366 struct bwn_phy_lp_iq_est {
367         uint32_t                        ie_iqprod;
368         uint32_t                        ie_ipwr;
369         uint32_t                        ie_qpwr;
370 };
371
372 struct bwn_txgain_entry {
373         uint8_t                         te_gm;
374         uint8_t                         te_pga;
375         uint8_t                         te_pad;
376         uint8_t                         te_dac;
377         uint8_t                         te_bbmult;
378 };
379
380 /* only for LP PHY */
381 struct bwn_stxtable {
382         uint16_t                        st_phyoffset;
383         uint16_t                        st_physhift;
384         uint16_t                        st_rfaddr;
385         uint16_t                        st_rfshift;
386         uint16_t                        st_mask;
387 };
388
389 struct bwn_b206x_chan {
390         uint8_t                         bc_chan;
391         uint16_t                        bc_freq;
392         const uint8_t                   *bc_data;
393 };
394
395 struct bwn_b206x_rfinit_entry {
396         uint16_t                        br_offset;
397         uint16_t                        br_valuea;
398         uint16_t                        br_valueg;
399         uint8_t                         br_flags;
400 };
401
402 struct bwn_phy {
403         uint8_t                         type;
404         uint8_t                         rev;
405         uint8_t                         analog;
406
407         int                             supports_2ghz;
408         int                             supports_5ghz;
409
410         int                             gmode;
411         struct bwn_phy_g                phy_g;
412         struct bwn_phy_lp               phy_lp;
413
414         uint16_t                        rf_manuf;
415         uint16_t                        rf_ver;
416         uint8_t                         rf_rev;
417         int                             rf_on;
418
419         int                             txpower;
420         int                             hwpctl;
421         unsigned long                   nexttime;
422         unsigned int                    chan;
423         int                             txerrors;
424
425         int                             (*attach)(struct bwn_mac *);
426         void                            (*detach)(struct bwn_mac *);
427         int                             (*prepare_hw)(struct bwn_mac *);
428         void                            (*init_pre)(struct bwn_mac *);
429         int                             (*init)(struct bwn_mac *);
430         void                            (*exit)(struct bwn_mac *);
431         uint16_t                        (*phy_read)(struct bwn_mac *, uint16_t);
432         void                            (*phy_write)(struct bwn_mac *, uint16_t,
433                                             uint16_t);
434         void                            (*phy_maskset)(struct bwn_mac *,
435                                             uint16_t, uint16_t, uint16_t);
436         uint16_t                        (*rf_read)(struct bwn_mac *, uint16_t);
437         void                            (*rf_write)(struct bwn_mac *, uint16_t,
438                                             uint16_t);
439         int                             (*use_hwpctl)(struct bwn_mac *);
440         void                            (*rf_onoff)(struct bwn_mac *, int);
441         void                            (*switch_analog)(struct bwn_mac *, int);
442         int                             (*switch_channel)(struct bwn_mac *,
443                                             unsigned int);
444         uint32_t                        (*get_default_chan)(struct bwn_mac *);
445         void                            (*set_antenna)(struct bwn_mac *, int);
446         int                             (*set_im)(struct bwn_mac *, int);
447         int                             (*recalc_txpwr)(struct bwn_mac *, int);
448         void                            (*set_txpwr)(struct bwn_mac *);
449         void                            (*task_15s)(struct bwn_mac *);
450         void                            (*task_60s)(struct bwn_mac *);
451 };
452
453 struct bwn_chan_band {
454         uint32_t                        flags;
455         uint8_t                         nchan;
456 #define BWN_MAX_CHAN_PER_BAND           14
457         uint8_t                         chan[BWN_MAX_CHAN_PER_BAND];
458 };
459
460 #define BWN_NR_WMEPARAMS                16
461 enum {
462         BWN_WMEPARAM_TXOP = 0,
463         BWN_WMEPARAM_CWMIN,
464         BWN_WMEPARAM_CWMAX,
465         BWN_WMEPARAM_CWCUR,
466         BWN_WMEPARAM_AIFS,
467         BWN_WMEPARAM_BSLOTS,
468         BWN_WMEPARAM_REGGAP,
469         BWN_WMEPARAM_STATUS,
470 };
471
472 #define BWN_WME_PARAMS(queue)   \
473         (BWN_SHARED_EDCFQ + (BWN_NR_WMEPARAMS * sizeof(uint16_t) * (queue)))
474 #define BWN_WME_BACKGROUND      BWN_WME_PARAMS(0)
475 #define BWN_WME_BESTEFFORT      BWN_WME_PARAMS(1)
476 #define BWN_WME_VIDEO           BWN_WME_PARAMS(2)
477 #define BWN_WME_VOICE           BWN_WME_PARAMS(3)
478
479 /*
480  * Radio capture format.
481  */
482 #define BWN_RX_RADIOTAP_PRESENT (               \
483         (1 << IEEE80211_RADIOTAP_TSFT)          | \
484         (1 << IEEE80211_RADIOTAP_FLAGS)         | \
485         (1 << IEEE80211_RADIOTAP_RATE)          | \
486         (1 << IEEE80211_RADIOTAP_CHANNEL)       | \
487         (1 << IEEE80211_RADIOTAP_ANTENNA)       | \
488         (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | \
489         (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE)  | \
490         0)
491
492 struct bwn_rx_radiotap_header {
493         struct ieee80211_radiotap_header wr_ihdr;
494         uint64_t                        wr_tsf;
495         u_int8_t                        wr_flags;
496         u_int8_t                        wr_rate;
497         u_int16_t                       wr_chan_freq;
498         u_int16_t                       wr_chan_flags;
499         int8_t                          wr_antsignal;
500         int8_t                          wr_antnoise;
501         u_int8_t                        wr_antenna;
502 };
503
504 #define BWN_TX_RADIOTAP_PRESENT (               \
505         (1 << IEEE80211_RADIOTAP_FLAGS)         | \
506         (1 << IEEE80211_RADIOTAP_RATE)          | \
507         (1 << IEEE80211_RADIOTAP_CHANNEL)       | \
508         (1 << IEEE80211_RADIOTAP_DBM_TX_POWER)  | \
509         (1 << IEEE80211_RADIOTAP_ANTENNA)       | \
510         0)
511
512 struct bwn_tx_radiotap_header {
513         struct ieee80211_radiotap_header wt_ihdr;
514         u_int8_t                        wt_flags;
515         u_int8_t                        wt_rate;
516         u_int16_t                       wt_chan_freq;
517         u_int16_t                       wt_chan_flags;
518         u_int8_t                        wt_txpower;
519         u_int8_t                        wt_antenna;
520 };
521
522 struct bwn_stats {
523         int32_t                         rtsfail;
524         int32_t                         rts;
525         int32_t                         link_noise;
526 };
527
528 /* Noise Calculation (Link Quality) */
529 struct bwn_noise {
530         uint8_t                         noi_running;
531         uint8_t                         noi_nsamples;
532         int8_t                          noi_samples[8][4];
533 };
534
535 #define BWN_DMA_30BIT                   30
536 #define BWN_DMA_32BIT                   32
537 #define BWN_DMA_64BIT                   64
538
539 struct bwn_dmadesc_meta {
540         bus_dmamap_t                    mt_dmap;
541         bus_addr_t                      mt_paddr;
542         struct mbuf                     *mt_m;
543         struct ieee80211_node           *mt_ni;
544         uint8_t                         mt_txtype;
545 #define BWN_DMADESC_METATYPE_HEADER     0
546 #define BWN_DMADESC_METATYPE_BODY       1
547         uint8_t                         mt_islast;
548 };
549
550 #define BWN_DMAINTR_FATALMASK   \
551         ((1 << 10) | (1 << 11) | (1 << 12) | (1 << 14) | (1 << 15))
552 #define BWN_DMAINTR_RDESC_UFLOW         (1 << 13)
553 #define BWN_DMAINTR_RX_DONE             (1 << 16)
554
555 #define BWN_DMA32_DCTL_BYTECNT          0x00001fff
556 #define BWN_DMA32_DCTL_ADDREXT_MASK     0x00030000
557 #define BWN_DMA32_DCTL_ADDREXT_SHIFT    16
558 #define BWN_DMA32_DCTL_DTABLEEND        0x10000000
559 #define BWN_DMA32_DCTL_IRQ              0x20000000
560 #define BWN_DMA32_DCTL_FRAMEEND         0x40000000
561 #define BWN_DMA32_DCTL_FRAMESTART       0x80000000
562 struct bwn_dmadesc32 {
563         uint32_t                        control;
564         uint32_t                        address;
565 } __packed;
566
567 #define BWN_DMA64_DCTL0_DTABLEEND       0x10000000
568 #define BWN_DMA64_DCTL0_IRQ             0x20000000
569 #define BWN_DMA64_DCTL0_FRAMEEND        0x40000000
570 #define BWN_DMA64_DCTL0_FRAMESTART      0x80000000
571 #define BWN_DMA64_DCTL1_BYTECNT         0x00001fff
572 #define BWN_DMA64_DCTL1_ADDREXT_MASK    0x00030000
573 #define BWN_DMA64_DCTL1_ADDREXT_SHIFT   16
574 struct bwn_dmadesc64 {
575         uint32_t                        control0;
576         uint32_t                        control1;
577         uint32_t                        address_low;
578         uint32_t                        address_high;
579 } __packed;
580
581 struct bwn_dmadesc_generic {
582         union {
583                 struct bwn_dmadesc32 dma32;
584                 struct bwn_dmadesc64 dma64;
585         } __packed dma;
586 } __packed;
587
588 struct bwn_dma_ring;
589
590 struct bwn_dma_ring {
591         struct bwn_mac                  *dr_mac;
592         const struct bwn_dma_ops        *dr_ops;
593         struct bwn_dmadesc_meta         *dr_meta;
594         void                            *dr_txhdr_cache;
595         bus_dma_tag_t                   dr_ring_dtag;
596         bus_dma_tag_t                   dr_txring_dtag;
597         bus_dmamap_t                    dr_txring_dmap;
598         bus_dmamap_t                    dr_spare_dmap; /* only for RX */
599         bus_dmamap_t                    dr_ring_dmap;
600         bus_addr_t                      dr_txring_paddr;
601         void                            *dr_ring_descbase;
602         bus_addr_t                      dr_ring_dmabase;
603         int                             dr_numslots;
604         int                             dr_usedslot;
605         int                             dr_curslot;
606         uint32_t                        dr_frameoffset;
607         uint16_t                        dr_rx_bufsize;
608         uint16_t                        dr_base;
609         int                             dr_index;
610         uint8_t                         dr_tx;
611         uint8_t                         dr_stop;
612         int                             dr_type;
613
614         void                            (*getdesc)(struct bwn_dma_ring *,
615                                             int, struct bwn_dmadesc_generic **,
616                                             struct bwn_dmadesc_meta **);
617         void                            (*setdesc)(struct bwn_dma_ring *,
618                                             struct bwn_dmadesc_generic *,
619                                             bus_addr_t, uint16_t, int, int,
620                                             int);
621         void                            (*start_transfer)(struct bwn_dma_ring *,
622                                             int);
623         void                            (*suspend)(struct bwn_dma_ring *);
624         void                            (*resume)(struct bwn_dma_ring *);
625         int                             (*get_curslot)(struct bwn_dma_ring *);
626         void                            (*set_curslot)(struct bwn_dma_ring *,
627                                             int);
628 };
629
630 struct bwn_dma {
631         int                             dmatype;
632         bus_dma_tag_t                   parent_dtag;
633         bus_dma_tag_t                   rxbuf_dtag;
634         bus_dma_tag_t                   txbuf_dtag;
635
636         struct bwn_dma_ring             *wme[5];
637         struct bwn_dma_ring             *mcast;
638         struct bwn_dma_ring             *rx;
639         uint64_t                        lastseq;        /* XXX FIXME */
640 };
641
642 struct bwn_pio_rxqueue {
643         struct bwn_mac                  *prq_mac;
644         uint16_t                        prq_base;
645         uint8_t                         prq_rev;
646 };
647
648 struct bwn_pio_txqueue;
649 struct bwn_pio_txpkt {
650         struct bwn_pio_txqueue          *tp_queue;
651         struct ieee80211_node           *tp_ni;
652         struct mbuf                     *tp_m;
653         uint8_t                         tp_index;
654         TAILQ_ENTRY(bwn_pio_txpkt)      tp_list;
655 };
656
657 #define BWN_PIO_MAX_TXPACKETS           32
658 struct bwn_pio_txqueue {
659         uint16_t                        tq_base;
660         uint16_t                        tq_size;
661         uint16_t                        tq_used;
662         uint16_t                        tq_free;
663         uint8_t                         tq_stop;
664         uint8_t                         tq_index;
665         struct bwn_pio_txpkt            tq_pkts[BWN_PIO_MAX_TXPACKETS];
666         TAILQ_HEAD(, bwn_pio_txpkt)     tq_pktlist;
667 };
668
669 struct bwn_pio {
670         struct bwn_pio_txqueue          wme[5];
671         struct bwn_pio_txqueue          mcast;
672         struct bwn_pio_rxqueue          rx;
673 };
674
675 struct bwn_plcp4 {
676         union {
677                 uint32_t                data;
678                 uint8_t                 raw[4];
679         } __packed o;
680 } __packed;
681
682 struct bwn_plcp6 {
683         union {
684                 uint32_t                data;
685                 uint8_t                 raw[6];
686         } __packed o;
687 } __packed;
688
689 struct bwn_txhdr {
690         uint32_t                        macctl;
691         uint8_t                         macfc[2];
692         uint16_t                        tx_festime;
693         uint16_t                        phyctl;
694         uint16_t                        phyctl_1;
695         uint16_t                        phyctl_1fb;
696         uint16_t                        phyctl_1rts;
697         uint16_t                        phyctl_1rtsfb;
698         uint8_t                         phyrate;
699         uint8_t                         phyrate_rts;
700         uint8_t                         eftypes;        /* extra frame types */
701         uint8_t                         chan;
702         uint8_t                         iv[16];
703         uint8_t                         addr1[IEEE80211_ADDR_LEN];
704         uint16_t                        tx_festime_fb;
705         struct bwn_plcp6                rts_plcp_fb;
706         uint16_t                        rts_dur_fb;
707         struct bwn_plcp6                plcp_fb;
708         uint16_t                        dur_fb;
709         uint16_t                        mimo_modelen;
710         uint16_t                        mimo_ratelen_fb;
711         uint32_t                        timeout;
712
713         union {
714                 /* format <= r351 */
715                 struct {
716                         uint8_t         pad0[2];
717                         uint16_t        cookie;
718                         uint16_t        tx_status;
719                         struct bwn_plcp6        rts_plcp;
720                         uint8_t         rts_frame[16];
721                         uint8_t         pad1[2];
722                         struct bwn_plcp6        plcp;
723                 } __packed old;
724                 /* format > r410 */
725                 struct {
726                         uint16_t        mimo_antenna;
727                         uint16_t        preload_size;
728                         uint8_t         pad0[2];
729                         uint16_t        cookie;
730                         uint16_t        tx_status;
731                         struct bwn_plcp6        rts_plcp;
732                         uint8_t         rts_frame[16];
733                         uint8_t         pad1[2];
734                         struct bwn_plcp6        plcp;
735                 } __packed new;
736         } __packed body;
737 } __packed;
738
739 #define BWN_FWTYPE_UCODE                'u'
740 #define BWN_FWTYPE_PCM                  'p'
741 #define BWN_FWTYPE_IV                   'i'
742 struct bwn_fwhdr {
743         uint8_t                         type;
744         uint8_t                         ver;
745         uint8_t                         pad[2];
746         uint32_t                        size;
747 } __packed;
748
749 #define BWN_FWINITVALS_OFFSET_MASK      0x7fff
750 #define BWN_FWINITVALS_32BIT            0x8000
751 struct bwn_fwinitvals {
752         uint16_t                        offset_size;
753         union {
754                 uint16_t                d16;
755                 uint32_t                d32;
756         } __packed data;
757 } __packed;
758
759 enum bwn_fwtype {
760         BWN_FWTYPE_DEFAULT,
761         BWN_FWTYPE_OPENSOURCE,
762         BWN_NR_FWTYPES,
763 };
764
765 struct bwn_fwfile {
766         const char                      *filename;
767         const struct firmware           *fw;
768         enum bwn_fwtype                 type;
769 };
770
771 struct bwn_key {
772         void                            *keyconf;
773         uint8_t                         algorithm;
774 };
775
776 struct bwn_fw {
777         struct bwn_fwfile               ucode;
778         struct bwn_fwfile               pcm;
779         struct bwn_fwfile               initvals;
780         struct bwn_fwfile               initvals_band;
781
782         uint16_t                        rev;
783         uint16_t                        patch;
784         uint8_t                         opensource;
785         uint8_t                         no_pcmfile;
786 };
787
788 struct bwn_lo_g_sm {
789         int                             curstate;
790         int                             nmeasure;
791         int                             multipler;
792         uint16_t                        feedth;
793         struct bwn_loctl                loctl;
794 };
795
796 struct bwn_lo_g_value {
797         uint8_t                         old_channel;
798         uint16_t                        phy_lomask;
799         uint16_t                        phy_extg;
800         uint16_t                        phy_dacctl_hwpctl;
801         uint16_t                        phy_dacctl;
802         uint16_t                        phy_hpwr_tssictl;
803         uint16_t                        phy_analogover;
804         uint16_t                        phy_analogoverval;
805         uint16_t                        phy_rfover;
806         uint16_t                        phy_rfoverval;
807         uint16_t                        phy_classctl;
808         uint16_t                        phy_crs0;
809         uint16_t                        phy_pgactl;
810         uint16_t                        phy_syncctl;
811         uint16_t                        phy_cck0;
812         uint16_t                        phy_cck1;
813         uint16_t                        phy_cck2;
814         uint16_t                        phy_cck3;
815         uint16_t                        phy_cck4;
816         uint16_t                        reg0;
817         uint16_t                        reg1;
818         uint16_t                        rf0;
819         uint16_t                        rf1;
820         uint16_t                        rf2;
821 };
822
823 #define BWN_LED_MAX                     4
824
825 #define BWN_LED_EVENT_NONE              -1
826 #define BWN_LED_EVENT_POLL              0
827 #define BWN_LED_EVENT_TX                1
828 #define BWN_LED_EVENT_RX                2
829 #define BWN_LED_SLOWDOWN(dur)           (dur) = (((dur) * 3) / 2)
830
831 struct bwn_led {
832         uint8_t                         led_flags;      /* BWN_LED_F_ */
833         uint8_t                         led_act;        /* BWN_LED_ACT_ */
834         uint8_t                         led_mask;
835 };
836
837 #define BWN_LED_F_ACTLOW                0x1
838 #define BWN_LED_F_BLINK                 0x2
839 #define BWN_LED_F_POLLABLE              0x4
840 #define BWN_LED_F_SLOW                  0x8
841
842 struct bwn_mac {
843         struct bwn_softc                *mac_sc;
844         unsigned                        mac_status;
845 #define BWN_MAC_STATUS_UNINIT           0
846 #define BWN_MAC_STATUS_INITED           1
847 #define BWN_MAC_STATUS_STARTED          2
848         unsigned                        mac_flags;
849         /* use "Bad Frames Preemption" */
850 #define BWN_MAC_FLAG_BADFRAME_PREEMP    (1 << 0)
851 #define BWN_MAC_FLAG_DFQVALID           (1 << 1)
852 #define BWN_MAC_FLAG_RADIO_ON           (1 << 2)
853 #define BWN_MAC_FLAG_DMA                (1 << 3)
854 #define BWN_MAC_FLAG_WME                (1 << 4)
855 #define BWN_MAC_FLAG_HWCRYPTO           (1 << 5)
856
857         struct bwn_noise                mac_noise;
858         struct bwn_phy                  mac_phy;
859         struct bwn_stats                mac_stats;
860         uint32_t                        mac_reason_intr;
861         uint32_t                        mac_reason[6];
862         uint32_t                        mac_intr_mask;
863         int                             mac_suspended;
864
865         struct bwn_fw                   mac_fw;
866
867         union {
868                 struct bwn_dma          dma;
869                 struct bwn_pio          pio;
870         } mac_method;
871
872         uint16_t                        mac_ktp;        /* Key table pointer */
873         uint8_t                         mac_max_nr_keys;
874         struct bwn_key                  mac_key[58];
875
876         unsigned int                    mac_task_state;
877         struct task                     mac_intrtask;
878         struct task                     mac_hwreset;
879         struct task                     mac_txpower;
880
881         TAILQ_ENTRY(bwn_mac)    mac_list;
882 };
883
884 /*
885  * Driver-specific vap state.
886  */
887 struct bwn_vap {
888         struct ieee80211vap             bv_vap; /* base class */
889         int                             (*bv_newstate)(struct ieee80211vap *,
890                                             enum ieee80211_state, int);
891 };
892 #define BWN_VAP(vap)                    ((struct bwn_vap *)(vap))
893 #define BWN_VAP_CONST(vap)              ((const struct mwl_vap *)(vap))
894
895 struct bwn_softc {
896         device_t                        sc_dev;
897         struct ifnet                    *sc_ifp;
898         unsigned                        sc_flags;
899 #define BWN_FLAG_ATTACHED               (1 << 0)
900 #define BWN_FLAG_INVALID                (1 << 1)
901 #define BWN_FLAG_NEED_BEACON_TP         (1 << 2)
902         struct sysctl_ctx_list  sc_sysctl_ctx;
903         struct sysctl_oid       *sc_sysctl_tree;
904         unsigned                        sc_debug;
905
906         struct bwn_mac          *sc_curmac;
907         TAILQ_HEAD(, bwn_mac)   sc_maclist;
908
909         uint8_t                         sc_macaddr[IEEE80211_ADDR_LEN];
910         uint8_t                         sc_bssid[IEEE80211_ADDR_LEN];
911         unsigned int                    sc_filters;
912         uint8_t                         sc_beacons[2];
913         uint8_t                         sc_rf_enabled;
914
915         struct wmeParams                sc_wmeParams[4];
916
917         struct callout                  sc_rfswitch_ch; /* for laptop */
918         struct callout                  sc_task_ch;
919         struct callout                  sc_watchdog_ch;
920         int                             sc_watchdog_timer;
921         struct taskqueue                *sc_tq; /* private task queue */
922         int                             (*sc_newstate)(struct ieee80211com *,
923                                             enum ieee80211_state, int);
924         void                            (*sc_node_cleanup)(
925                                             struct ieee80211_node *);
926
927         int                             sc_rx_rate;
928         int                             sc_tx_rate;
929
930         int                             sc_led_blinking;
931         int                             sc_led_ticks;
932         struct bwn_led                  *sc_blink_led;
933         struct callout                  sc_led_blink_ch;
934         int                             sc_led_blink_offdur;
935         struct bwn_led                  sc_leds[BWN_LED_MAX];
936         int                             sc_led_idle;
937         int                             sc_led_blink;
938
939         struct resource                 *bwn_irq;
940         void                            *bwn_intr;
941         int                             bwn_irq_rid;
942         int                             bwn_irq_type;
943
944         struct bwn_tx_radiotap_header   sc_tx_th;
945         struct bwn_rx_radiotap_header   sc_rx_th;
946 };
947
948 #endif  /* !_IF_BWNVAR_H */