if_iwnvar.h revision 1.5 1 1.5 blymn /* $NetBSD: if_iwnvar.h,v 1.5 2008/12/22 11:32:04 blymn Exp $ */
2 1.3 skrll /* OpenBSD: if_iwnvar.h,v 1.2 2007/11/19 19:34:25 damien Exp */
3 1.1 ober
4 1.1 ober /*-
5 1.1 ober * Copyright (c) 2007
6 1.1 ober * Damien Bergamini <damien.bergamini (at) free.fr>
7 1.1 ober *
8 1.1 ober * Permission to use, copy, modify, and distribute this software for any
9 1.1 ober * purpose with or without fee is hereby granted, provided that the above
10 1.1 ober * copyright notice and this permission notice appear in all copies.
11 1.1 ober *
12 1.1 ober * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13 1.1 ober * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14 1.1 ober * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15 1.1 ober * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16 1.1 ober * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 1.1 ober * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 1.1 ober * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 1.1 ober */
20 1.1 ober
21 1.1 ober struct iwn_rx_radiotap_header {
22 1.1 ober struct ieee80211_radiotap_header wr_ihdr;
23 1.1 ober uint64_t wr_tsft;
24 1.1 ober uint8_t wr_flags;
25 1.1 ober uint8_t wr_rate;
26 1.1 ober uint16_t wr_chan_freq;
27 1.1 ober uint16_t wr_chan_flags;
28 1.1 ober int8_t wr_dbm_antsignal;
29 1.1 ober int8_t wr_dbm_antnoise;
30 1.1 ober } __packed;
31 1.1 ober
32 1.1 ober #define IWN_RX_RADIOTAP_PRESENT \
33 1.1 ober ((1 << IEEE80211_RADIOTAP_TSFT) | \
34 1.2 ober (1 << IEEE80211_RADIOTAP_FLAGS) | \
35 1.2 ober (1 << IEEE80211_RADIOTAP_RATE) | \
36 1.2 ober (1 << IEEE80211_RADIOTAP_CHANNEL) | \
37 1.2 ober (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | \
38 1.2 ober (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE))
39 1.1 ober
40 1.1 ober struct iwn_tx_radiotap_header {
41 1.1 ober struct ieee80211_radiotap_header wt_ihdr;
42 1.1 ober uint8_t wt_flags;
43 1.1 ober uint8_t wt_rate;
44 1.1 ober uint16_t wt_chan_freq;
45 1.1 ober uint16_t wt_chan_flags;
46 1.1 ober uint8_t wt_hwqueue;
47 1.1 ober } __packed;
48 1.1 ober
49 1.1 ober #define IWN_TX_RADIOTAP_PRESENT \
50 1.1 ober ((1 << IEEE80211_RADIOTAP_FLAGS) | \
51 1.2 ober (1 << IEEE80211_RADIOTAP_RATE) | \
52 1.2 ober (1 << IEEE80211_RADIOTAP_CHANNEL))
53 1.1 ober
54 1.1 ober struct iwn_dma_info {
55 1.1 ober bus_dma_tag_t tag;
56 1.1 ober bus_dmamap_t map;
57 1.1 ober bus_dma_segment_t seg;
58 1.1 ober bus_addr_t paddr;
59 1.1 ober void * vaddr;
60 1.1 ober bus_size_t size;
61 1.1 ober };
62 1.1 ober
63 1.1 ober struct iwn_tx_data {
64 1.1 ober bus_dmamap_t map;
65 1.1 ober struct mbuf *m;
66 1.1 ober struct ieee80211_node *ni;
67 1.1 ober };
68 1.1 ober
69 1.1 ober struct iwn_tx_ring {
70 1.1 ober struct iwn_dma_info desc_dma;
71 1.1 ober struct iwn_dma_info cmd_dma;
72 1.1 ober struct iwn_tx_desc *desc;
73 1.1 ober struct iwn_tx_cmd *cmd;
74 1.1 ober struct iwn_tx_data *data;
75 1.1 ober int qid;
76 1.1 ober int queued;
77 1.1 ober int count;
78 1.1 ober int cur;
79 1.1 ober };
80 1.1 ober
81 1.1 ober #define IWN_RBUF_COUNT (IWN_RX_RING_COUNT + 32)
82 1.1 ober
83 1.1 ober struct iwn_softc;
84 1.1 ober
85 1.1 ober struct iwn_rbuf {
86 1.1 ober struct iwn_softc *sc;
87 1.1 ober void * vaddr;
88 1.1 ober bus_addr_t paddr;
89 1.1 ober SLIST_ENTRY(iwn_rbuf) next;
90 1.1 ober };
91 1.1 ober
92 1.1 ober struct iwn_rx_data {
93 1.1 ober struct mbuf *m;
94 1.1 ober };
95 1.1 ober
96 1.1 ober struct iwn_rx_ring {
97 1.1 ober struct iwn_dma_info desc_dma;
98 1.1 ober struct iwn_dma_info buf_dma;
99 1.1 ober uint32_t *desc;
100 1.1 ober struct iwn_rx_data data[IWN_RX_RING_COUNT];
101 1.1 ober struct iwn_rbuf rbuf[IWN_RBUF_COUNT];
102 1.1 ober SLIST_HEAD(, iwn_rbuf) freelist;
103 1.4 cube kmutex_t freelist_mtx;
104 1.1 ober int nb_free_entries;
105 1.1 ober int cur;
106 1.1 ober };
107 1.1 ober
108 1.1 ober struct iwn_node {
109 1.1 ober struct ieee80211_node ni; /* must be the first */
110 1.1 ober struct ieee80211_amrr_node amn;
111 1.1 ober };
112 1.1 ober
113 1.1 ober struct iwn_calib_state {
114 1.1 ober uint8_t state;
115 1.1 ober #define IWN_CALIB_STATE_INIT 0
116 1.1 ober #define IWN_CALIB_STATE_ASSOC 1
117 1.1 ober #define IWN_CALIB_STATE_RUN 2
118 1.1 ober
119 1.1 ober u_int nbeacons;
120 1.1 ober uint32_t noise[3];
121 1.1 ober uint32_t rssi[3];
122 1.1 ober uint32_t corr_ofdm_x1;
123 1.1 ober uint32_t corr_ofdm_mrc_x1;
124 1.1 ober uint32_t corr_ofdm_x4;
125 1.1 ober uint32_t corr_ofdm_mrc_x4;
126 1.1 ober uint32_t corr_cck_x4;
127 1.1 ober uint32_t corr_cck_mrc_x4;
128 1.1 ober uint32_t bad_plcp_ofdm;
129 1.1 ober uint32_t fa_ofdm;
130 1.1 ober uint32_t bad_plcp_cck;
131 1.1 ober uint32_t fa_cck;
132 1.1 ober uint32_t low_fa;
133 1.1 ober uint8_t cck_state;
134 1.1 ober #define IWN_CCK_STATE_INIT 0
135 1.1 ober #define IWN_CCK_STATE_LOFA 1
136 1.1 ober #define IWN_CCK_STATE_HIFA 2
137 1.1 ober
138 1.1 ober uint8_t noise_samples[20];
139 1.1 ober u_int cur_noise_sample;
140 1.1 ober uint8_t noise_ref;
141 1.1 ober uint32_t energy_samples[10];
142 1.1 ober u_int cur_energy_sample;
143 1.1 ober uint32_t energy_cck;
144 1.1 ober };
145 1.1 ober
146 1.1 ober struct iwn_softc {
147 1.1 ober device_t sc_dev;
148 1.1 ober struct ethercom sc_ec;
149 1.1 ober struct ieee80211com sc_ic;
150 1.1 ober int (*sc_newstate)(struct ieee80211com *,
151 1.2 ober enum ieee80211_state, int);
152 1.1 ober
153 1.1 ober struct ieee80211_amrr amrr;
154 1.1 ober
155 1.1 ober bus_dma_tag_t sc_dmat;
156 1.1 ober
157 1.1 ober /* shared area */
158 1.1 ober struct iwn_dma_info shared_dma;
159 1.1 ober struct iwn_shared *shared;
160 1.1 ober
161 1.1 ober /* "keep warm" page */
162 1.1 ober struct iwn_dma_info kw_dma;
163 1.1 ober
164 1.1 ober /* firmware DMA transfer */
165 1.1 ober struct iwn_dma_info fw_dma;
166 1.1 ober
167 1.1 ober /* rings */
168 1.1 ober struct iwn_tx_ring txq[IWN_NTXQUEUES];
169 1.1 ober struct iwn_rx_ring rxq;
170 1.1 ober
171 1.1 ober bus_space_tag_t sc_st;
172 1.1 ober bus_space_handle_t sc_sh;
173 1.1 ober void *sc_ih;
174 1.1 ober pci_chipset_tag_t sc_pct;
175 1.1 ober pcitag_t sc_pcitag;
176 1.1 ober bus_size_t sc_sz;
177 1.1 ober
178 1.1 ober struct callout calib_to;
179 1.1 ober int calib_cnt;
180 1.1 ober struct iwn_calib_state calib;
181 1.1 ober
182 1.1 ober struct iwn_rx_stat last_rx_stat;
183 1.1 ober int last_rx_valid;
184 1.1 ober struct iwn_ucode_info ucode_info;
185 1.1 ober struct iwn_config config;
186 1.1 ober uint32_t rawtemp;
187 1.1 ober int temp;
188 1.1 ober int noise;
189 1.1 ober uint8_t antmsk;
190 1.1 ober
191 1.1 ober struct iwn_eeprom_band bands[IWN_NBANDS];
192 1.1 ober int16_t eeprom_voltage;
193 1.1 ober int8_t maxpwr2GHz;
194 1.1 ober int8_t maxpwr5GHz;
195 1.1 ober int8_t maxpwr[IEEE80211_CHAN_MAX];
196 1.1 ober
197 1.1 ober int sc_tx_timer;
198 1.1 ober
199 1.1 ober #if NBPFILTER > 0
200 1.1 ober void * sc_drvbpf;
201 1.1 ober
202 1.1 ober union {
203 1.1 ober struct iwn_rx_radiotap_header th;
204 1.1 ober uint8_t pad[IEEE80211_RADIOTAP_HDRLEN];
205 1.1 ober } sc_rxtapu;
206 1.1 ober #define sc_rxtap sc_rxtapu.th
207 1.1 ober int sc_rxtap_len;
208 1.1 ober
209 1.1 ober union {
210 1.1 ober struct iwn_tx_radiotap_header th;
211 1.1 ober uint8_t pad[IEEE80211_RADIOTAP_HDRLEN];
212 1.1 ober } sc_txtapu;
213 1.1 ober #define sc_txtap sc_txtapu.th
214 1.1 ober int sc_txtap_len;
215 1.1 ober #endif
216 1.1 ober
217 1.1 ober bool is_scanning;
218 1.5 blymn bool sc_radio;
219 1.1 ober };
220