]> CyberLeo.Net >> Repos - FreeBSD/releng/8.0.git/blob - sys/dev/wpi/if_wpivar.h
Adjust to reflect 8.0-RELEASE.
[FreeBSD/releng/8.0.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 #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 mtx              sc_mtx;
141
142         /* Flags indicating the current state the driver
143          * expects the hardware to be in
144          */
145         uint32_t                flags;
146 #define WPI_FLAG_HW_RADIO_OFF   (1 << 0)
147 #define WPI_FLAG_BUSY           (1 << 1)
148 #define WPI_FLAG_AUTH           (1 << 2)
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         struct wpi_tx_radiotap_header sc_txtap;
186
187         /* firmware image */
188         const struct firmware   *fw_fp;
189
190         /* firmware DMA transfer */
191         struct wpi_dma_info     fw_dma;
192
193         /* Tasks used by the driver */
194         struct task             sc_restarttask; /* reset firmware task */
195         struct task             sc_radiotask;   /* reset rf task */
196
197        /* Eeprom info */
198         uint8_t                 cap;
199         uint16_t                rev;
200         uint8_t                 type;
201         struct wpi_power_group  groups[WPI_POWER_GROUPS_COUNT];
202         int8_t                  maxpwr[IEEE80211_CHAN_MAX];
203         char                    domain[4];      /*reglatory domain XXX */
204 };
205 #define WPI_LOCK_INIT(_sc) \
206         mtx_init(&(_sc)->sc_mtx, device_get_nameunit((_sc)->sc_dev), \
207             MTX_NETWORK_LOCK, MTX_DEF)
208 #define WPI_LOCK(_sc)           mtx_lock(&(_sc)->sc_mtx)
209 #define WPI_UNLOCK(_sc)         mtx_unlock(&(_sc)->sc_mtx)
210 #define WPI_LOCK_ASSERT(sc)     mtx_assert(&(sc)->sc_mtx, MA_OWNED)
211 #define WPI_LOCK_DESTROY(_sc)   mtx_destroy(&(_sc)->sc_mtx)