if_wpi - Port of FreeBSD's wpi driver for Intel 3945ABG Wifi adapters.
[dragonfly.git] / sys / dev / netif / wpi / if_wpivar.h
1 /*      $FreeBSD: src/sys/dev/wpi/if_wpivar.h,v 1.6.2.1 2009/08/03 08:13:06 kensmith Exp $      */
2
3 /*-
4  * Copyright (c) 2006,2007
5  *      Damien Bergamini <damien.bergamini@free.fr>
6  *
7  * Permission to use, copy, modify, and distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18  */
19 #include <netproto/802_11/ieee80211_amrr.h>
20
21 struct wpi_rx_radiotap_header {
22         struct ieee80211_radiotap_header wr_ihdr;
23         uint64_t        wr_tsft;
24         uint8_t         wr_flags;
25         uint8_t         wr_rate;
26         uint16_t        wr_chan_freq;
27         uint16_t        wr_chan_flags;
28         int8_t          wr_dbm_antsignal;
29         int8_t          wr_dbm_antnoise;
30         uint8_t         wr_antenna;
31 };
32
33 #define WPI_RX_RADIOTAP_PRESENT                                         \
34         ((1 << IEEE80211_RADIOTAP_TSFT) |                               \
35          (1 << IEEE80211_RADIOTAP_FLAGS) |                              \
36          (1 << IEEE80211_RADIOTAP_RATE) |                               \
37          (1 << IEEE80211_RADIOTAP_CHANNEL) |                            \
38          (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) |                      \
39          (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE) |                       \
40          (1 << IEEE80211_RADIOTAP_ANTENNA))
41
42 struct wpi_tx_radiotap_header {
43         struct ieee80211_radiotap_header wt_ihdr;
44         uint8_t         wt_flags;
45         uint8_t         wt_rate;
46         uint16_t        wt_chan_freq;
47         uint16_t        wt_chan_flags;
48         uint8_t         wt_hwqueue;
49 };
50
51 #define WPI_TX_RADIOTAP_PRESENT                                         \
52         ((1 << IEEE80211_RADIOTAP_FLAGS) |                              \
53          (1 << IEEE80211_RADIOTAP_RATE) |                               \
54          (1 << IEEE80211_RADIOTAP_CHANNEL))
55
56 struct wpi_dma_info {
57         bus_dma_tag_t           tag;
58         bus_dmamap_t            map;
59         bus_addr_t              paddr;        /* aligned p address */
60         bus_addr_t              paddr_start;  /* possibly unaligned p start*/
61         caddr_t                 vaddr;        /* aligned v address */
62         caddr_t                 vaddr_start;  /* possibly unaligned v start */
63         bus_size_t              size;
64 };
65
66 struct wpi_tx_data {
67         bus_dmamap_t            map;
68         struct mbuf             *m;
69         struct ieee80211_node   *ni;
70 };
71
72 struct wpi_tx_ring {
73         struct wpi_dma_info     desc_dma;
74         struct wpi_dma_info     cmd_dma;
75         struct wpi_tx_desc      *desc;
76         struct wpi_tx_cmd       *cmd;
77         struct wpi_tx_data      *data;
78         bus_dma_tag_t           data_dmat;
79         int                     qid;
80         int                     count;
81         int                     queued;
82         int                     cur;
83 };
84
85 #define WPI_RBUF_COUNT ( WPI_RX_RING_COUNT + 16 )
86
87 struct wpi_rx_data {
88         bus_dmamap_t            map;
89         struct mbuf             *m;
90 };
91
92 struct wpi_rx_ring {
93         struct wpi_dma_info     desc_dma;
94         uint32_t                *desc;
95         struct wpi_rx_data      data[WPI_RX_RING_COUNT];
96         bus_dma_tag_t           data_dmat;
97         int                     cur;
98 };
99
100 struct wpi_amrr {
101         struct  ieee80211_node ni;      /* must be the first */
102         int     txcnt;
103         int     retrycnt;
104         int     success;
105         int     success_threshold;
106         int     recovery;
107 };
108
109 struct wpi_node {
110         struct  ieee80211_node ni;      /* must be the first */
111         struct  ieee80211_amrr_node     amn;
112 };
113 #define WPI_NODE(ni)    ((struct wpi_node *)(ni))
114
115 struct wpi_power_sample {
116         uint8_t index;
117         int8_t  power;
118 };
119
120 struct wpi_power_group {
121 #define WPI_SAMPLES_COUNT       5
122         struct wpi_power_sample samples[WPI_SAMPLES_COUNT];
123         uint8_t chan;
124         int8_t  maxpwr;
125         int16_t temp;
126 };
127
128 struct wpi_vap {
129         struct ieee80211vap     vap;
130         struct ieee80211_amrr   amrr;
131
132         int                     (*newstate)(struct ieee80211vap *,
133                                     enum ieee80211_state, int);
134 };
135 #define WPI_VAP(vap)    ((struct wpi_vap *)(vap))
136
137 struct wpi_softc {
138         device_t                sc_dev;
139         struct ifnet            *sc_ifp;
140         struct lock             sc_lock;
141
142         struct fw_image         *sc_fw_image;
143
144         /* Flags indicating the current state the driver
145          * expects the hardware to be in
146          */
147         uint32_t                flags;
148 #define WPI_FLAG_HW_RADIO_OFF   (1 << 0)
149 #define WPI_FLAG_BUSY           (1 << 1)
150 #define WPI_FLAG_AUTH           (1 << 2)
151
152         /* shared area */
153         struct wpi_dma_info     shared_dma;
154         struct wpi_shared       *shared;
155
156         struct wpi_tx_ring      txq[WME_NUM_AC];
157         struct wpi_tx_ring      cmdq;
158         struct wpi_rx_ring      rxq;
159
160         /* TX Thermal Callibration */
161         struct callout          calib_to;
162         int                     calib_cnt;
163
164         /* Watch dog timer */
165         struct callout          watchdog_to;
166         /* Hardware switch polling timer */
167         struct callout          hwswitch_to;
168
169         struct resource         *irq;
170         struct resource         *mem;
171         bus_space_tag_t         sc_st;
172         bus_space_handle_t      sc_sh;
173         void                    *sc_ih;
174         int                     mem_rid;
175         int                     irq_rid;
176
177         struct wpi_config       config;
178         int                     temp;
179
180
181         int                     sc_tx_timer;
182         int                     sc_scan_timer;
183
184         struct bpf_if           *sc_drvbpf;
185
186         struct wpi_rx_radiotap_header sc_rxtap;
187         struct wpi_tx_radiotap_header sc_txtap;
188
189         /* firmware image */
190         const struct firmware   *fw_fp;
191
192         /* firmware DMA transfer */
193         struct wpi_dma_info     fw_dma;
194
195         /* Tasks used by the driver */
196         struct task             sc_restarttask; /* reset firmware task */
197         struct task             sc_radiotask;   /* reset rf task */
198
199        /* Eeprom info */
200         uint8_t                 cap;
201         uint16_t                rev;
202         uint8_t                 type;
203         struct wpi_power_group  groups[WPI_POWER_GROUPS_COUNT];
204         int8_t                  maxpwr[IEEE80211_CHAN_MAX];
205         char                    domain[4];      /*reglatory domain XXX */
206 };
207 #define WPI_LOCK_INIT(_sc) \
208         lockinit(&(_sc)->sc_lock, device_get_nameunit((_sc)->sc_dev), \
209             0, LK_CANRECURSE)
210 #define WPI_LOCK(_sc)           lockmgr(&(_sc)->sc_lock, LK_EXCLUSIVE)
211 #define WPI_UNLOCK(_sc)         lockmgr(&(_sc)->sc_lock, LK_RELEASE)
212 #define WPI_LOCK_ASSERT(sc)     KKASSERT(lockstatus(&(sc)->sc_lock, curthread) != 0)
213 #define WPI_LOCK_DESTROY(_sc)   lockuninit(&(_sc)->sc_lock)