]> CyberLeo.Net >> Repos - FreeBSD/releng/7.2.git/blob - sys/dev/wpi/if_wpivar.h
Create releng/7.2 from stable/7 in preparation for 7.2-RELEASE.
[FreeBSD/releng/7.2.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 #include <net80211/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
114 struct wpi_power_sample {
115         uint8_t index;
116         int8_t  power;
117 };
118
119 struct wpi_power_group {
120 #define WPI_SAMPLES_COUNT       5
121     struct wpi_power_sample samples[WPI_SAMPLES_COUNT];
122     uint8_t     chan;
123     int8_t      maxpwr;
124     int16_t     temp;
125 };
126
127 struct wpi_softc {
128         device_t                sc_dev;
129         struct ifnet            *sc_ifp;
130
131         /* net80211 driver specifics */
132         struct ieee80211com     sc_ic;
133         int                     (*sc_newstate)(struct ieee80211com *,
134                                     enum ieee80211_state, int);
135         unsigned long           maxdwell; /* Max dwell time whilst scanning */
136
137         struct mtx              sc_mtx;
138
139         struct ieee80211_amrr   amrr;
140
141         /* Flags indicating the current state the driver
142          * expects the hardware to be in
143          */
144         uint32_t                flags;
145 #define WPI_FLAG_HW_RADIO_OFF   (1 << 0)
146 #define WPI_FLAG_SCANNING       (1 << 1)
147 #define WPI_FLAG_BUSY           (1 << 2)
148 #define WPI_FLAG_AUTH           (1 << 3)
149
150         /* shared area */
151         struct wpi_dma_info     shared_dma;
152         struct wpi_shared       *shared;
153
154         struct wpi_tx_ring      txq[WME_NUM_AC];
155         struct wpi_tx_ring      cmdq;
156         struct wpi_rx_ring      rxq;
157
158         /* TX Thermal Callibration */
159         struct callout          calib_to;
160         int                     calib_cnt;
161
162         /* Watch dog timer */
163         struct callout          watchdog_to;
164         /* Hardware switch polling timer */
165         struct callout          hwswitch_to;
166
167         struct resource         *irq;
168         struct resource         *mem;
169         bus_space_tag_t         sc_st;
170         bus_space_handle_t      sc_sh;
171         void                    *sc_ih;
172         int                     mem_rid;
173         int                     irq_rid;
174
175         struct wpi_config       config;
176         int                     temp;
177
178
179         int                     sc_tx_timer;
180         int                     sc_scan_timer;
181
182         struct bpf_if           *sc_drvbpf;
183
184         struct wpi_rx_radiotap_header sc_rxtap;
185         int                     sc_rxtap_len;
186         struct wpi_tx_radiotap_header sc_txtap;
187         int                     sc_txtap_len;
188
189         /* firmware image */
190         const struct firmware   *fw_fp;
191
192         /* firmware DMA transfer */
193         struct wpi_dma_info     fw_dma;
194
195         /* command queue related variables */
196 #define WPI_SCAN_START          (1<<0)
197 #define WPI_SCAN_CURCHAN        (1<<1)
198 #define WPI_SCAN_STOP           (1<<2)
199 #define WPI_SET_CHAN            (1<<3)
200 #define WPI_AUTH                (1<<4)
201 #define WPI_RUN                 (1<<5)
202 #define WPI_SCAN_NEXT           (1<<6)
203 #define WPI_RESTART             (1<<7)
204 #define WPI_RF_RESTART          (1<<8)
205 #define WPI_CMD_MAXOPS          10
206         /* command queuing request type */
207 #define WPI_QUEUE_NORMAL        0
208 #define WPI_QUEUE_CLEAR         1
209         int                     sc_cmd[WPI_CMD_MAXOPS];
210         int                     sc_cmd_arg[WPI_CMD_MAXOPS];
211         int                     sc_cmd_cur;    /* current queued scan task */
212         int                     sc_cmd_next;   /* last queued scan task */
213         struct mtx              sc_cmdlock;
214
215        /* Task queues used to control the driver */
216        struct taskqueue         *sc_tq; /* Main command task queue */
217        struct taskqueue         *sc_tq2;/* firmware reset task queue */
218
219        /* Tasks used by the driver */
220        struct task              sc_radioontask; /* enable rf transmitter task*/
221        struct task              sc_radioofftask;/* disable rf transmitter task*/
222         struct task             sc_opstask; /* operation handling task */
223         struct task             sc_restarttask; /* reset firmware task */
224
225        /* Eeprom info */
226         uint8_t                 cap;
227         uint16_t                rev;
228         uint8_t                 type;
229         struct wpi_power_group  groups[WPI_POWER_GROUPS_COUNT];
230         int8_t                  maxpwr[IEEE80211_CHAN_MAX];
231         char                    domain[4]; //reglatory domain //XXX
232 };
233 #define WPI_LOCK_INIT(_sc) \
234         mtx_init(&(_sc)->sc_mtx, device_get_nameunit((_sc)->sc_dev), \
235             MTX_NETWORK_LOCK, MTX_DEF)
236 #define WPI_LOCK(_sc)           mtx_lock(&(_sc)->sc_mtx)
237 #define WPI_UNLOCK(_sc)         mtx_unlock(&(_sc)->sc_mtx)
238 #define WPI_LOCK_ASSERT(sc)     mtx_assert(&(sc)->sc_mtx, MA_OWNED)
239 #define WPI_LOCK_OWNED(_sc)     mtx_owned(&(_sc)->sc_mtx)
240 #define WPI_LOCK_DESTROY(_sc)   mtx_destroy(&(_sc)->sc_mtx)
241
242 #define WPI_CMD_LOCK_INIT(_sc)  \
243         mtx_init(&(_sc)->sc_cmdlock, device_get_nameunit((_sc)->sc_dev), \
244             NULL, MTX_DEF)
245 #define WPI_CMD_LOCK_DESTROY(_sc)        mtx_destroy(&(_sc)->sc_cmdlock)
246 #define WPI_CMD_LOCK(_sc)                mtx_lock(&(_sc)->sc_cmdlock)
247 #define WPI_CMD_UNLOCK(_sc)              mtx_unlock(&(_sc)->sc_cmdlock)