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