]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/wpi/if_wpivar.h
This commit was generated by cvs2svn to compensate for changes in r173682,
[FreeBSD/FreeBSD.git] / sys / dev / wpi / if_wpivar.h
1 /*      $FreeBSD$       */
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 #if ( __FreeBSD_version > 700000 )
20 #include <net80211/ieee80211_amrr.h>
21 #else
22 #include <dev/wpi/ieee80211_amrr.h>
23 #endif
24
25 /* DMA mapping */
26 struct wpi_mapping {
27         int nsegs;
28         bus_dma_segment_t segs[WPI_MAX_SCATTER];
29 };
30
31 struct wpi_rx_radiotap_header {
32         struct ieee80211_radiotap_header wr_ihdr;
33         uint64_t        wr_tsft;
34         uint8_t         wr_flags;
35         uint8_t         wr_rate;
36         uint16_t        wr_chan_freq;
37         uint16_t        wr_chan_flags;
38         int8_t          wr_dbm_antsignal;
39         int8_t          wr_dbm_antnoise;
40         uint8_t         wr_antenna;
41 };
42
43 #define WPI_RX_RADIOTAP_PRESENT                                         \
44         ((1 << IEEE80211_RADIOTAP_TSFT) |                               \
45          (1 << IEEE80211_RADIOTAP_FLAGS) |                              \
46          (1 << IEEE80211_RADIOTAP_RATE) |                               \
47          (1 << IEEE80211_RADIOTAP_CHANNEL) |                            \
48          (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) |                      \
49          (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE) |                       \
50          (1 << IEEE80211_RADIOTAP_ANTENNA))
51
52 struct wpi_tx_radiotap_header {
53         struct ieee80211_radiotap_header wt_ihdr;
54         uint8_t         wt_flags;
55         uint8_t         wt_rate;
56         uint16_t        wt_chan_freq;
57         uint16_t        wt_chan_flags;
58         uint8_t         wt_hwqueue;
59 };
60
61 #define WPI_TX_RADIOTAP_PRESENT                                         \
62         ((1 << IEEE80211_RADIOTAP_FLAGS) |                              \
63          (1 << IEEE80211_RADIOTAP_RATE) |                               \
64          (1 << IEEE80211_RADIOTAP_CHANNEL))
65
66 struct wpi_dma_info {
67         bus_dma_tag_t           tag;
68         bus_dmamap_t            map;
69         bus_addr_t              paddr;
70         caddr_t                 vaddr;
71         bus_size_t              size;
72 };
73
74 struct wpi_tx_data {
75         bus_dmamap_t            map;
76         struct mbuf             *m;
77         struct ieee80211_node   *ni;
78 };
79
80 struct wpi_tx_ring {
81         struct wpi_dma_info     desc_dma;
82         struct wpi_dma_info     cmd_dma;
83         struct wpi_tx_desc      *desc;
84         struct wpi_tx_cmd       *cmd;
85         struct wpi_tx_data      *data;
86         bus_dma_tag_t           data_dmat;
87         int                     qid;
88         int                     count;
89         int                     queued;
90         int                     cur;
91 };
92
93 #define WPI_RBUF_COUNT ( WPI_RX_RING_COUNT + 16 )
94
95 struct wpi_softc;
96
97 struct wpi_rbuf {
98         struct wpi_softc        *sc;
99         bus_addr_t              paddr;
100         caddr_t                 vaddr;
101         SLIST_ENTRY(wpi_rbuf)   next;
102 };
103
104 struct wpi_rx_data {
105         struct mbuf     *m;
106 };
107
108 struct wpi_rx_ring {
109         struct wpi_dma_info     desc_dma;
110         struct wpi_dma_info     buf_dma;
111         uint32_t                *desc;
112         struct wpi_rx_data      data[WPI_RX_RING_COUNT];
113         struct wpi_rbuf         rbuf[WPI_RBUF_COUNT];
114         SLIST_HEAD(, wpi_rbuf)  freelist;
115         int                     cur;
116 };
117
118 struct wpi_amrr {
119         struct  ieee80211_node ni;      /* must be the first */
120         int     txcnt;
121         int     retrycnt;
122         int     success;
123         int     success_threshold;
124         int     recovery;
125 };
126
127 struct wpi_node {
128         struct  ieee80211_node ni;      /* must be the first */
129         struct  ieee80211_amrr_node     amn;
130 };
131
132 struct wpi_power_sample {
133         uint8_t index;
134         int8_t  power;
135 };
136
137 struct wpi_power_group {
138 #define WPI_SAMPLES_COUNT       5
139     struct wpi_power_sample samples[WPI_SAMPLES_COUNT];
140     uint8_t     chan;
141     int8_t      maxpwr;
142     int16_t     temp;
143 };
144
145 struct wpi_softc {
146         device_t                sc_dev;
147         struct ifnet            *sc_ifp;
148
149         /* net80211 driver specifics */
150         struct ieee80211com     sc_ic;
151         int                     (*sc_newstate)(struct ieee80211com *,
152                                     enum ieee80211_state, int);
153         unsigned long           maxdwell; /* Max dwell time whilst scanning */
154
155         struct mtx              sc_mtx;
156
157         struct ieee80211_amrr   amrr;
158
159         /* Flags indicating the current state the driver
160          * expects the hardware to be in
161          */
162         uint32_t                flags;
163 #define WPI_FLAG_HW_RADIO_OFF   (1 << 0)
164 #define WPI_FLAG_SCANNING       (1 << 1)
165 #define WPI_FLAG_BUSY           (1 << 2)
166 #define WPI_FLAG_AUTH           (1 << 3)
167
168         /* Flags indicating the state of the firmware */
169         uint32_t                fw_state;
170 #define WPI_FW_IDLE             (1 << 0 )
171
172         /* shared area */
173         struct wpi_dma_info     shared_dma;
174         struct wpi_shared       *shared;
175
176         struct wpi_tx_ring      txq[WME_NUM_AC];
177         struct wpi_tx_ring      cmdq;
178         struct wpi_rx_ring      rxq;
179
180         /* TX Thermal Callibration */
181         struct callout          calib_to;
182         int                     calib_cnt;
183
184         /* Watch dog timer */
185         struct callout          watchdog_to;
186         int                     watchdog_cnt;
187
188         struct resource         *irq;
189         struct resource         *mem;
190         bus_space_tag_t         sc_st;
191         bus_space_handle_t      sc_sh;
192         void                    *sc_ih;
193         int                     mem_rid;
194         int                     irq_rid;
195
196         struct wpi_config       config;
197         int                     temp;
198
199
200         int                     sc_tx_timer;
201
202         struct bpf_if           *sc_drvbpf;
203
204         struct wpi_rx_radiotap_header sc_rxtap;
205         int                     sc_rxtap_len;
206         struct wpi_tx_radiotap_header sc_txtap;
207         int                     sc_txtap_len;
208
209         /* firmware image */
210         const struct firmware   *fw_fp;
211
212         /* firmware DMA transfer */
213         struct wpi_dma_info     fw_dma;
214
215         /* command queue related variables */
216         #define WPI_CMD_MAXOPS          10
217         #define WPI_SCAN_START          (1<<0)
218         #define WPI_SCAN_CURCHAN        (1<<1)
219         #define WPI_SCAN_STOP           (1<<2)
220         #define WPI_SET_CHAN            (1<<3)
221         #define WPI_AUTH                (1<<4)
222         #define WPI_SCAN_NEXT           (1<<5)
223         int                     sc_cmd[WPI_CMD_MAXOPS];
224         int                     sc_cmd_cur;    /* current queued scan task */
225         int                     sc_cmd_next;   /* last queued scan task */
226         struct mtx              sc_cmdlock;
227
228        /* Task queues used to control the driver */
229        struct taskqueue         *sc_tq; /* Main command task queue */
230        struct taskqueue         *sc_tq2;/* firmware reset task queue */
231
232        /* Tasks used by the driver */
233        struct task              sc_radioontask; /* enable rf transmitter task*/
234        struct task              sc_radioofftask;/* disable rf transmitter task*/
235         struct task             sc_opstask; /* operation handling task */
236         struct task             sc_restarttask; /* reset firmware task */
237
238        /* Eeprom info */
239         uint8_t                 cap;
240         uint16_t                rev;
241         uint8_t                 type;
242         struct wpi_power_group  groups[WPI_POWER_GROUPS_COUNT];
243         int8_t                  maxpwr[IEEE80211_CHAN_MAX];
244         char                    domain[4]; //reglatory domain //XXX
245 };
246 #define WPI_LOCK_INIT(_sc) \
247         mtx_init(&(_sc)->sc_mtx, device_get_nameunit((_sc)->sc_dev), \
248             MTX_NETWORK_LOCK, MTX_DEF)
249 #define WPI_LOCK_DECL   int     __waslocked = 0
250 #define WPI_LOCK(_sc) do {\
251       if (!(__waslocked = mtx_owned(&(_sc)->sc_mtx)))  \
252                 mtx_lock(&(_sc)->sc_mtx);                \
253 }    while(0)
254 #define WPI_UNLOCK(_sc) do {                    \
255     if (!__waslocked)                       \
256     mtx_unlock(&(_sc)->sc_mtx);      \
257 } while (0)
258
259 #define WPI_LOCK_DESTROY(_sc)   mtx_destroy(&(_sc)->sc_mtx)
260 #define WPI_CMD_LOCK_INIT(_sc)  \
261         mtx_init(&(_sc)->sc_cmdlock, device_get_nameunit((_sc)->sc_dev), NULL, MTX_DEF);
262 #define WPI_CMD_LOCK_DESTROY(_sc)        mtx_destroy(&(_sc)->sc_cmdlock)
263 #define WPI_CMD_LOCK(_sc)                mtx_lock(&(_sc)->sc_cmdlock)
264 #define WPI_CMD_UNLOCK(_sc)              mtx_unlock(&(_sc)->sc_cmdlock)
265 #if defined(INVARIANTS) || defined(INVARIANT_SUPPORT)
266 #define WPI_LOCK_ASSERT(sc)     mtx_assert(&(sc)->sc_mtx, MA_OWNED)
267 #else
268 #define WPI_LOCK_ASSERT(sc)
269 #endif