if_iwi.c revision 1.37 1 1.37 skrll /* $NetBSD: if_iwi.c,v 1.37 2005/11/14 12:07:33 skrll Exp $ */
2 1.1 skrll
3 1.1 skrll /*-
4 1.1 skrll * Copyright (c) 2004, 2005
5 1.1 skrll * Damien Bergamini <damien.bergamini (at) free.fr>. All rights reserved.
6 1.1 skrll *
7 1.1 skrll * Redistribution and use in source and binary forms, with or without
8 1.1 skrll * modification, are permitted provided that the following conditions
9 1.1 skrll * are met:
10 1.1 skrll * 1. Redistributions of source code must retain the above copyright
11 1.1 skrll * notice unmodified, this list of conditions, and the following
12 1.1 skrll * disclaimer.
13 1.1 skrll * 2. Redistributions in binary form must reproduce the above copyright
14 1.1 skrll * notice, this list of conditions and the following disclaimer in the
15 1.1 skrll * documentation and/or other materials provided with the distribution.
16 1.1 skrll *
17 1.1 skrll * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 1.1 skrll * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 1.1 skrll * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 1.1 skrll * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21 1.1 skrll * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 1.1 skrll * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 1.1 skrll * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 1.1 skrll * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 1.1 skrll * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 1.1 skrll * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 1.1 skrll * SUCH DAMAGE.
28 1.1 skrll */
29 1.1 skrll
30 1.1 skrll #include <sys/cdefs.h>
31 1.37 skrll __KERNEL_RCSID(0, "$NetBSD: if_iwi.c,v 1.37 2005/11/14 12:07:33 skrll Exp $");
32 1.1 skrll
33 1.1 skrll /*-
34 1.13 skrll * Intel(R) PRO/Wireless 2200BG/2225BG/2915ABG driver
35 1.1 skrll * http://www.intel.com/network/connectivity/products/wireless/prowireless_mobile.htm
36 1.1 skrll */
37 1.1 skrll
38 1.1 skrll #include "bpfilter.h"
39 1.1 skrll
40 1.1 skrll #include <sys/param.h>
41 1.1 skrll #include <sys/sockio.h>
42 1.1 skrll #include <sys/sysctl.h>
43 1.1 skrll #include <sys/mbuf.h>
44 1.1 skrll #include <sys/kernel.h>
45 1.1 skrll #include <sys/socket.h>
46 1.1 skrll #include <sys/systm.h>
47 1.1 skrll #include <sys/malloc.h>
48 1.1 skrll #include <sys/conf.h>
49 1.1 skrll
50 1.1 skrll #include <machine/bus.h>
51 1.1 skrll #include <machine/endian.h>
52 1.1 skrll #include <machine/intr.h>
53 1.1 skrll
54 1.1 skrll #include <dev/pci/pcireg.h>
55 1.1 skrll #include <dev/pci/pcivar.h>
56 1.1 skrll #include <dev/pci/pcidevs.h>
57 1.1 skrll
58 1.1 skrll #if NBPFILTER > 0
59 1.1 skrll #include <net/bpf.h>
60 1.1 skrll #endif
61 1.1 skrll #include <net/if.h>
62 1.1 skrll #include <net/if_arp.h>
63 1.1 skrll #include <net/if_dl.h>
64 1.1 skrll #include <net/if_ether.h>
65 1.1 skrll #include <net/if_media.h>
66 1.1 skrll #include <net/if_types.h>
67 1.1 skrll
68 1.1 skrll #include <net80211/ieee80211_var.h>
69 1.1 skrll #include <net80211/ieee80211_radiotap.h>
70 1.1 skrll
71 1.1 skrll #include <netinet/in.h>
72 1.1 skrll #include <netinet/in_systm.h>
73 1.1 skrll #include <netinet/in_var.h>
74 1.1 skrll #include <netinet/ip.h>
75 1.1 skrll
76 1.1 skrll #include <crypto/arc4/arc4.h>
77 1.1 skrll
78 1.1 skrll #include <dev/pci/if_iwireg.h>
79 1.1 skrll #include <dev/pci/if_iwivar.h>
80 1.1 skrll
81 1.20 skrll #ifdef IWI_DEBUG
82 1.20 skrll #define DPRINTF(x) if (iwi_debug > 0) printf x
83 1.20 skrll #define DPRINTFN(n, x) if (iwi_debug >= (n)) printf x
84 1.20 skrll int iwi_debug = 4;
85 1.20 skrll #else
86 1.20 skrll #define DPRINTF(x)
87 1.20 skrll #define DPRINTFN(n, x)
88 1.20 skrll #endif
89 1.1 skrll
90 1.25 skrll static int iwi_match(struct device *, struct cfdata *, void *);
91 1.25 skrll static void iwi_attach(struct device *, struct device *, void *);
92 1.25 skrll static int iwi_detach(struct device *, int);
93 1.25 skrll
94 1.25 skrll static void iwi_shutdown(void *);
95 1.25 skrll static int iwi_suspend(struct iwi_softc *);
96 1.25 skrll static int iwi_resume(struct iwi_softc *);
97 1.25 skrll static void iwi_powerhook(int, void *);
98 1.15 skrll
99 1.25 skrll static int iwi_alloc_cmd_ring(struct iwi_softc *, struct iwi_cmd_ring *,
100 1.14 skrll int);
101 1.25 skrll static void iwi_reset_cmd_ring(struct iwi_softc *, struct iwi_cmd_ring *);
102 1.25 skrll static void iwi_free_cmd_ring(struct iwi_softc *, struct iwi_cmd_ring *);
103 1.25 skrll static int iwi_alloc_tx_ring(struct iwi_softc *, struct iwi_tx_ring *,
104 1.14 skrll int);
105 1.25 skrll static void iwi_reset_tx_ring(struct iwi_softc *, struct iwi_tx_ring *);
106 1.25 skrll static void iwi_free_tx_ring(struct iwi_softc *, struct iwi_tx_ring *);
107 1.31 joerg static struct mbuf *
108 1.31 joerg iwi_alloc_rx_buf(struct iwi_softc *sc);
109 1.25 skrll static int iwi_alloc_rx_ring(struct iwi_softc *, struct iwi_rx_ring *,
110 1.14 skrll int);
111 1.25 skrll static void iwi_reset_rx_ring(struct iwi_softc *, struct iwi_rx_ring *);
112 1.25 skrll static void iwi_free_rx_ring(struct iwi_softc *, struct iwi_rx_ring *);
113 1.14 skrll
114 1.25 skrll static int iwi_media_change(struct ifnet *);
115 1.25 skrll static void iwi_media_status(struct ifnet *, struct ifmediareq *);
116 1.25 skrll static uint16_t iwi_read_prom_word(struct iwi_softc *, uint8_t);
117 1.25 skrll static int iwi_newstate(struct ieee80211com *, enum ieee80211_state, int);
118 1.25 skrll static void iwi_fix_channel(struct ieee80211com *, struct mbuf *);
119 1.25 skrll static void iwi_frame_intr(struct iwi_softc *, struct iwi_rx_data *, int,
120 1.1 skrll struct iwi_frame *);
121 1.25 skrll static void iwi_notification_intr(struct iwi_softc *, struct iwi_notif *);
122 1.25 skrll static void iwi_rx_intr(struct iwi_softc *);
123 1.25 skrll static void iwi_tx_intr(struct iwi_softc *);
124 1.25 skrll static int iwi_intr(void *);
125 1.25 skrll static int iwi_cmd(struct iwi_softc *, uint8_t, void *, uint8_t, int);
126 1.25 skrll static int iwi_tx_start(struct ifnet *, struct mbuf *, struct ieee80211_node *);
127 1.25 skrll static void iwi_start(struct ifnet *);
128 1.25 skrll static void iwi_watchdog(struct ifnet *);
129 1.25 skrll static int iwi_get_table0(struct iwi_softc *, uint32_t *);
130 1.25 skrll static int iwi_get_radio(struct iwi_softc *, int *);
131 1.25 skrll static int iwi_ioctl(struct ifnet *, u_long, caddr_t);
132 1.25 skrll static void iwi_stop_master(struct iwi_softc *);
133 1.25 skrll static int iwi_reset(struct iwi_softc *);
134 1.25 skrll static int iwi_load_ucode(struct iwi_softc *, void *, int);
135 1.25 skrll static int iwi_load_firmware(struct iwi_softc *, void *, int);
136 1.25 skrll static int iwi_cache_firmware(struct iwi_softc *, void *);
137 1.25 skrll static void iwi_free_firmware(struct iwi_softc *);
138 1.25 skrll static int iwi_config(struct iwi_softc *);
139 1.25 skrll static int iwi_set_chan(struct iwi_softc *, struct ieee80211_channel *);
140 1.25 skrll static int iwi_scan(struct iwi_softc *);
141 1.25 skrll static int iwi_auth_and_assoc(struct iwi_softc *);
142 1.25 skrll static int iwi_init(struct ifnet *);
143 1.25 skrll static void iwi_stop(struct ifnet *, int);
144 1.36 skrll static void iwi_error_log(struct iwi_softc *);
145 1.1 skrll
146 1.20 skrll /*
147 1.20 skrll * Supported rates for 802.11a/b/g modes (in 500Kbps unit).
148 1.20 skrll */
149 1.20 skrll static const struct ieee80211_rateset iwi_rateset_11a =
150 1.20 skrll { 8, { 12, 18, 24, 36, 48, 72, 96, 108 } };
151 1.20 skrll
152 1.20 skrll static const struct ieee80211_rateset iwi_rateset_11b =
153 1.20 skrll { 4, { 2, 4, 11, 22 } };
154 1.20 skrll
155 1.20 skrll static const struct ieee80211_rateset iwi_rateset_11g =
156 1.20 skrll { 12, { 2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108 } };
157 1.20 skrll
158 1.24 skrll static __inline uint8_t
159 1.24 skrll MEM_READ_1(struct iwi_softc *sc, uint32_t addr)
160 1.1 skrll {
161 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_INDIRECT_ADDR, addr);
162 1.1 skrll return CSR_READ_1(sc, IWI_CSR_INDIRECT_DATA);
163 1.1 skrll }
164 1.1 skrll
165 1.24 skrll static __inline uint32_t
166 1.24 skrll MEM_READ_4(struct iwi_softc *sc, uint32_t addr)
167 1.1 skrll {
168 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_INDIRECT_ADDR, addr);
169 1.1 skrll return CSR_READ_4(sc, IWI_CSR_INDIRECT_DATA);
170 1.1 skrll }
171 1.1 skrll
172 1.36 skrll static void
173 1.36 skrll MEM_CPY(struct iwi_softc *sc, void *dst, uint32_t base, size_t sz)
174 1.36 skrll {
175 1.36 skrll KASSERT(sz % 4 == 0);
176 1.36 skrll int j;
177 1.36 skrll
178 1.36 skrll uint32_t *p = dst;
179 1.36 skrll
180 1.36 skrll for (j = 0; j < sz / 4; j++)
181 1.36 skrll p[j] = MEM_READ_4(sc, base + j * sizeof(uint32_t));
182 1.36 skrll }
183 1.36 skrll
184 1.1 skrll CFATTACH_DECL(iwi, sizeof (struct iwi_softc), iwi_match, iwi_attach,
185 1.1 skrll iwi_detach, NULL);
186 1.1 skrll
187 1.1 skrll static int
188 1.1 skrll iwi_match(struct device *parent, struct cfdata *match, void *aux)
189 1.1 skrll {
190 1.1 skrll struct pci_attach_args *pa = aux;
191 1.5 perry
192 1.1 skrll if (PCI_VENDOR(pa->pa_id) != PCI_VENDOR_INTEL)
193 1.1 skrll return 0;
194 1.1 skrll
195 1.1 skrll if (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_PRO_WL_2200BG ||
196 1.13 skrll PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_PRO_WL_2225BG ||
197 1.13 skrll PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_PRO_WL_2915ABG_1 ||
198 1.13 skrll PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_PRO_WL_2915ABG_2)
199 1.1 skrll return 1;
200 1.5 perry
201 1.1 skrll return 0;
202 1.1 skrll }
203 1.1 skrll
204 1.1 skrll /* Base Address Register */
205 1.1 skrll #define IWI_PCI_BAR0 0x10
206 1.1 skrll
207 1.1 skrll static void
208 1.1 skrll iwi_attach(struct device *parent, struct device *self, void *aux)
209 1.1 skrll {
210 1.1 skrll struct iwi_softc *sc = (struct iwi_softc *)self;
211 1.1 skrll struct ieee80211com *ic = &sc->sc_ic;
212 1.9 dyoung struct ifnet *ifp = &sc->sc_if;
213 1.1 skrll struct pci_attach_args *pa = aux;
214 1.1 skrll const char *intrstr;
215 1.1 skrll char devinfo[256];
216 1.1 skrll bus_space_tag_t memt;
217 1.1 skrll bus_space_handle_t memh;
218 1.1 skrll bus_addr_t base;
219 1.1 skrll pci_intr_handle_t ih;
220 1.1 skrll pcireg_t data;
221 1.24 skrll uint16_t val;
222 1.1 skrll int error, revision, i;
223 1.1 skrll
224 1.1 skrll sc->sc_pct = pa->pa_pc;
225 1.1 skrll sc->sc_pcitag = pa->pa_tag;
226 1.1 skrll
227 1.1 skrll pci_devinfo(pa->pa_id, pa->pa_class, 0, devinfo, sizeof devinfo);
228 1.1 skrll revision = PCI_REVISION(pa->pa_class);
229 1.1 skrll aprint_normal(": %s (rev. 0x%02x)\n", devinfo, revision);
230 1.1 skrll
231 1.1 skrll /* clear device specific PCI configuration register 0x41 */
232 1.1 skrll data = pci_conf_read(sc->sc_pct, sc->sc_pcitag, 0x40);
233 1.1 skrll data &= ~0x0000ff00;
234 1.1 skrll pci_conf_write(sc->sc_pct, sc->sc_pcitag, 0x40, data);
235 1.1 skrll
236 1.1 skrll /* enable bus-mastering */
237 1.1 skrll data = pci_conf_read(sc->sc_pct, sc->sc_pcitag, PCI_COMMAND_STATUS_REG);
238 1.1 skrll data |= PCI_COMMAND_MASTER_ENABLE;
239 1.1 skrll pci_conf_write(sc->sc_pct, sc->sc_pcitag, PCI_COMMAND_STATUS_REG, data);
240 1.1 skrll
241 1.1 skrll /* map the register window */
242 1.1 skrll error = pci_mapreg_map(pa, IWI_PCI_BAR0, PCI_MAPREG_TYPE_MEM |
243 1.1 skrll PCI_MAPREG_MEM_TYPE_32BIT, 0, &memt, &memh, &base, &sc->sc_sz);
244 1.1 skrll if (error != 0) {
245 1.1 skrll aprint_error("%s: could not map memory space\n",
246 1.1 skrll sc->sc_dev.dv_xname);
247 1.1 skrll return;
248 1.1 skrll }
249 1.1 skrll
250 1.1 skrll sc->sc_st = memt;
251 1.1 skrll sc->sc_sh = memh;
252 1.1 skrll sc->sc_dmat = pa->pa_dmat;
253 1.1 skrll
254 1.1 skrll /* disable interrupts */
255 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_INTR_MASK, 0);
256 1.1 skrll
257 1.1 skrll if (pci_intr_map(pa, &ih) != 0) {
258 1.1 skrll aprint_error("%s: could not map interrupt\n",
259 1.1 skrll sc->sc_dev.dv_xname);
260 1.1 skrll return;
261 1.1 skrll }
262 1.1 skrll
263 1.1 skrll intrstr = pci_intr_string(sc->sc_pct, ih);
264 1.1 skrll sc->sc_ih = pci_intr_establish(sc->sc_pct, ih, IPL_NET, iwi_intr, sc);
265 1.1 skrll if (sc->sc_ih == NULL) {
266 1.1 skrll aprint_error("%s: could not establish interrupt",
267 1.1 skrll sc->sc_dev.dv_xname);
268 1.1 skrll if (intrstr != NULL)
269 1.1 skrll aprint_error(" at %s", intrstr);
270 1.1 skrll aprint_error("\n");
271 1.1 skrll return;
272 1.1 skrll }
273 1.1 skrll aprint_normal("%s: interrupting at %s\n", sc->sc_dev.dv_xname, intrstr);
274 1.1 skrll
275 1.1 skrll if (iwi_reset(sc) != 0) {
276 1.1 skrll aprint_error("%s: could not reset adapter\n",
277 1.1 skrll sc->sc_dev.dv_xname);
278 1.1 skrll return;
279 1.1 skrll }
280 1.1 skrll
281 1.14 skrll /*
282 1.14 skrll * Allocate rings.
283 1.14 skrll */
284 1.14 skrll if (iwi_alloc_cmd_ring(sc, &sc->cmdq, IWI_CMD_RING_COUNT) != 0) {
285 1.14 skrll aprint_error("%s: could not allocate command ring\n",
286 1.1 skrll sc->sc_dev.dv_xname);
287 1.14 skrll goto fail;
288 1.14 skrll }
289 1.14 skrll
290 1.14 skrll if (iwi_alloc_tx_ring(sc, &sc->txq, IWI_TX_RING_COUNT) != 0) {
291 1.14 skrll aprint_error("%s: could not allocate Tx ring\n",
292 1.14 skrll sc->sc_dev.dv_xname);
293 1.14 skrll goto fail;
294 1.14 skrll }
295 1.14 skrll
296 1.14 skrll if (iwi_alloc_rx_ring(sc, &sc->rxq, IWI_RX_RING_COUNT) != 0) {
297 1.14 skrll aprint_error("%s: could not allocate Rx ring\n",
298 1.14 skrll sc->sc_dev.dv_xname);
299 1.14 skrll goto fail;
300 1.1 skrll }
301 1.1 skrll
302 1.9 dyoung ic->ic_ifp = ifp;
303 1.12 christos ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */
304 1.12 christos ic->ic_opmode = IEEE80211_M_STA; /* default to BSS mode */
305 1.13 skrll ic->ic_state = IEEE80211_S_INIT;
306 1.1 skrll
307 1.1 skrll /* set device capabilities */
308 1.12 christos ic->ic_caps = IEEE80211_C_WPA | IEEE80211_C_PMGT | IEEE80211_C_TXPMGT |
309 1.12 christos IEEE80211_C_SHPREAMBLE | IEEE80211_C_MONITOR;
310 1.1 skrll
311 1.1 skrll /* read MAC address from EEPROM */
312 1.1 skrll val = iwi_read_prom_word(sc, IWI_EEPROM_MAC + 0);
313 1.33 skrll ic->ic_myaddr[0] = val & 0xff;
314 1.33 skrll ic->ic_myaddr[1] = val >> 8;
315 1.1 skrll val = iwi_read_prom_word(sc, IWI_EEPROM_MAC + 1);
316 1.33 skrll ic->ic_myaddr[2] = val & 0xff;
317 1.33 skrll ic->ic_myaddr[3] = val >> 8;
318 1.1 skrll val = iwi_read_prom_word(sc, IWI_EEPROM_MAC + 2);
319 1.33 skrll ic->ic_myaddr[4] = val & 0xff;
320 1.33 skrll ic->ic_myaddr[5] = val >> 8;
321 1.1 skrll
322 1.1 skrll aprint_normal("%s: 802.11 address %s\n", sc->sc_dev.dv_xname,
323 1.1 skrll ether_sprintf(ic->ic_myaddr));
324 1.1 skrll
325 1.13 skrll
326 1.16 skrll if (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_PRO_WL_2915ABG_1 ||
327 1.16 skrll PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_PRO_WL_2915ABG_2) {
328 1.13 skrll /* set supported .11a rates (2915ABG only) */
329 1.1 skrll ic->ic_sup_rates[IEEE80211_MODE_11A] = iwi_rateset_11a;
330 1.1 skrll
331 1.1 skrll /* set supported .11a channels */
332 1.1 skrll for (i = 36; i <= 64; i += 4) {
333 1.1 skrll ic->ic_channels[i].ic_freq =
334 1.1 skrll ieee80211_ieee2mhz(i, IEEE80211_CHAN_5GHZ);
335 1.1 skrll ic->ic_channels[i].ic_flags = IEEE80211_CHAN_A;
336 1.1 skrll }
337 1.12 christos for (i = 149; i <= 165; i += 4) {
338 1.1 skrll ic->ic_channels[i].ic_freq =
339 1.1 skrll ieee80211_ieee2mhz(i, IEEE80211_CHAN_5GHZ);
340 1.1 skrll ic->ic_channels[i].ic_flags = IEEE80211_CHAN_A;
341 1.1 skrll }
342 1.1 skrll }
343 1.1 skrll
344 1.1 skrll /* set supported .11b and .11g rates */
345 1.1 skrll ic->ic_sup_rates[IEEE80211_MODE_11B] = iwi_rateset_11b;
346 1.1 skrll ic->ic_sup_rates[IEEE80211_MODE_11G] = iwi_rateset_11g;
347 1.1 skrll
348 1.1 skrll /* set supported .11b and .11g channels (1 through 14) */
349 1.1 skrll for (i = 1; i <= 14; i++) {
350 1.1 skrll ic->ic_channels[i].ic_freq =
351 1.1 skrll ieee80211_ieee2mhz(i, IEEE80211_CHAN_2GHZ);
352 1.1 skrll ic->ic_channels[i].ic_flags =
353 1.1 skrll IEEE80211_CHAN_CCK | IEEE80211_CHAN_OFDM |
354 1.1 skrll IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ;
355 1.1 skrll }
356 1.1 skrll
357 1.1 skrll ifp->if_softc = sc;
358 1.1 skrll ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
359 1.1 skrll ifp->if_init = iwi_init;
360 1.1 skrll ifp->if_stop = iwi_stop;
361 1.1 skrll ifp->if_ioctl = iwi_ioctl;
362 1.1 skrll ifp->if_start = iwi_start;
363 1.1 skrll ifp->if_watchdog = iwi_watchdog;
364 1.1 skrll IFQ_SET_READY(&ifp->if_snd);
365 1.1 skrll memcpy(ifp->if_xname, sc->sc_dev.dv_xname, IFNAMSIZ);
366 1.1 skrll
367 1.1 skrll if_attach(ifp);
368 1.9 dyoung ieee80211_ifattach(ic);
369 1.1 skrll /* override state transition machine */
370 1.1 skrll sc->sc_newstate = ic->ic_newstate;
371 1.1 skrll ic->ic_newstate = iwi_newstate;
372 1.9 dyoung ieee80211_media_init(ic, iwi_media_change, iwi_media_status);
373 1.1 skrll
374 1.1 skrll #if NBPFILTER > 0
375 1.1 skrll bpfattach2(ifp, DLT_IEEE802_11_RADIO,
376 1.1 skrll sizeof (struct ieee80211_frame) + 64, &sc->sc_drvbpf);
377 1.1 skrll
378 1.1 skrll sc->sc_rxtap_len = sizeof sc->sc_rxtapu;
379 1.1 skrll sc->sc_rxtap.wr_ihdr.it_len = htole16(sc->sc_rxtap_len);
380 1.1 skrll sc->sc_rxtap.wr_ihdr.it_present = htole32(IWI_RX_RADIOTAP_PRESENT);
381 1.1 skrll
382 1.1 skrll sc->sc_txtap_len = sizeof sc->sc_txtapu;
383 1.1 skrll sc->sc_txtap.wt_ihdr.it_len = htole16(sc->sc_txtap_len);
384 1.1 skrll sc->sc_txtap.wt_ihdr.it_present = htole32(IWI_TX_RADIOTAP_PRESENT);
385 1.1 skrll #endif
386 1.15 skrll
387 1.15 skrll /*
388 1.15 skrll * Make sure the interface is shutdown during reboot.
389 1.15 skrll */
390 1.15 skrll sc->sc_sdhook = shutdownhook_establish(iwi_shutdown, sc);
391 1.15 skrll if (sc->sc_sdhook == NULL)
392 1.15 skrll aprint_error("%s: WARNING: unable to establish shutdown hook\n",
393 1.15 skrll sc->sc_dev.dv_xname);
394 1.15 skrll sc->sc_powerhook = powerhook_establish(iwi_powerhook, sc);
395 1.15 skrll if (sc->sc_powerhook == NULL)
396 1.15 skrll printf("%s: WARNING: unable to establish power hook\n",
397 1.15 skrll sc->sc_dev.dv_xname);
398 1.15 skrll
399 1.13 skrll ieee80211_announce(ic);
400 1.12 christos /*
401 1.12 christos * Add a few sysctl knobs.
402 1.12 christos * XXX: Not yet.
403 1.12 christos */
404 1.12 christos sc->dwelltime = 100;
405 1.12 christos sc->bluetooth = 1;
406 1.12 christos sc->antenna = 0;
407 1.14 skrll
408 1.14 skrll return;
409 1.14 skrll
410 1.14 skrll fail: iwi_detach(self, 0);
411 1.1 skrll }
412 1.1 skrll
413 1.1 skrll static int
414 1.1 skrll iwi_detach(struct device* self, int flags)
415 1.1 skrll {
416 1.1 skrll struct iwi_softc *sc = (struct iwi_softc *)self;
417 1.9 dyoung struct ifnet *ifp = &sc->sc_if;
418 1.1 skrll
419 1.1 skrll iwi_stop(ifp, 1);
420 1.1 skrll iwi_free_firmware(sc);
421 1.1 skrll
422 1.1 skrll #if NBPFILTER > 0
423 1.25 skrll if (ifp != NULL)
424 1.25 skrll bpfdetach(ifp);
425 1.1 skrll #endif
426 1.9 dyoung ieee80211_ifdetach(&sc->sc_ic);
427 1.25 skrll if (ifp != NULL)
428 1.25 skrll if_detach(ifp);
429 1.1 skrll
430 1.14 skrll iwi_free_cmd_ring(sc, &sc->cmdq);
431 1.14 skrll iwi_free_tx_ring(sc, &sc->txq);
432 1.14 skrll iwi_free_rx_ring(sc, &sc->rxq);
433 1.1 skrll
434 1.1 skrll if (sc->sc_ih != NULL) {
435 1.1 skrll pci_intr_disestablish(sc->sc_pct, sc->sc_ih);
436 1.1 skrll sc->sc_ih = NULL;
437 1.1 skrll }
438 1.1 skrll
439 1.1 skrll bus_space_unmap(sc->sc_st, sc->sc_sh, sc->sc_sz);
440 1.1 skrll
441 1.18 skrll powerhook_disestablish(sc->sc_powerhook);
442 1.18 skrll shutdownhook_disestablish(sc->sc_sdhook);
443 1.18 skrll
444 1.1 skrll return 0;
445 1.1 skrll }
446 1.1 skrll
447 1.1 skrll static int
448 1.14 skrll iwi_alloc_cmd_ring(struct iwi_softc *sc, struct iwi_cmd_ring *ring,
449 1.14 skrll int count)
450 1.1 skrll {
451 1.14 skrll int error, nsegs;
452 1.14 skrll
453 1.14 skrll ring->count = count;
454 1.14 skrll ring->queued = 0;
455 1.14 skrll ring->cur = ring->next = 0;
456 1.1 skrll
457 1.1 skrll /*
458 1.14 skrll * Allocate and map command ring
459 1.1 skrll */
460 1.1 skrll error = bus_dmamap_create(sc->sc_dmat,
461 1.25 skrll IWI_CMD_DESC_SIZE * count, 1,
462 1.25 skrll IWI_CMD_DESC_SIZE * count, 0,
463 1.14 skrll BUS_DMA_NOWAIT, &ring->desc_map);
464 1.1 skrll if (error != 0) {
465 1.14 skrll aprint_error("%s: could not create command ring DMA map\n",
466 1.1 skrll sc->sc_dev.dv_xname);
467 1.1 skrll goto fail;
468 1.1 skrll }
469 1.1 skrll
470 1.1 skrll error = bus_dmamem_alloc(sc->sc_dmat,
471 1.25 skrll IWI_CMD_DESC_SIZE * count, PAGE_SIZE, 0,
472 1.14 skrll &sc->cmdq.desc_seg, 1, &nsegs, BUS_DMA_NOWAIT);
473 1.1 skrll if (error != 0) {
474 1.14 skrll aprint_error("%s: could not allocate command ring DMA memory\n",
475 1.1 skrll sc->sc_dev.dv_xname);
476 1.1 skrll goto fail;
477 1.1 skrll }
478 1.1 skrll
479 1.14 skrll error = bus_dmamem_map(sc->sc_dmat, &sc->cmdq.desc_seg, nsegs,
480 1.25 skrll IWI_CMD_DESC_SIZE * count,
481 1.14 skrll (caddr_t *)&sc->cmdq.desc, BUS_DMA_NOWAIT);
482 1.1 skrll if (error != 0) {
483 1.14 skrll aprint_error("%s: could not map command ring DMA memory\n",
484 1.1 skrll sc->sc_dev.dv_xname);
485 1.1 skrll goto fail;
486 1.1 skrll }
487 1.1 skrll
488 1.14 skrll error = bus_dmamap_load(sc->sc_dmat, sc->cmdq.desc_map, sc->cmdq.desc,
489 1.25 skrll IWI_CMD_DESC_SIZE * count, NULL,
490 1.1 skrll BUS_DMA_NOWAIT);
491 1.1 skrll if (error != 0) {
492 1.14 skrll aprint_error("%s: could not load command ring DMA map\n",
493 1.1 skrll sc->sc_dev.dv_xname);
494 1.1 skrll goto fail;
495 1.1 skrll }
496 1.1 skrll
497 1.14 skrll memset(sc->cmdq.desc, 0,
498 1.25 skrll IWI_CMD_DESC_SIZE * count);
499 1.14 skrll
500 1.14 skrll return 0;
501 1.14 skrll
502 1.14 skrll fail: iwi_free_cmd_ring(sc, ring);
503 1.14 skrll return error;
504 1.14 skrll }
505 1.14 skrll
506 1.14 skrll static void
507 1.14 skrll iwi_reset_cmd_ring(struct iwi_softc *sc, struct iwi_cmd_ring *ring)
508 1.14 skrll {
509 1.14 skrll ring->queued = 0;
510 1.14 skrll ring->cur = ring->next = 0;
511 1.14 skrll }
512 1.14 skrll
513 1.14 skrll static void
514 1.14 skrll iwi_free_cmd_ring(struct iwi_softc *sc, struct iwi_cmd_ring *ring)
515 1.14 skrll {
516 1.14 skrll if (ring->desc_map != NULL) {
517 1.14 skrll if (ring->desc != NULL) {
518 1.14 skrll bus_dmamap_unload(sc->sc_dmat, ring->desc_map);
519 1.14 skrll bus_dmamem_unmap(sc->sc_dmat, (caddr_t)ring->desc,
520 1.25 skrll IWI_CMD_DESC_SIZE * ring->count);
521 1.14 skrll bus_dmamem_free(sc->sc_dmat, &ring->desc_seg, 1);
522 1.14 skrll }
523 1.14 skrll bus_dmamap_destroy(sc->sc_dmat, ring->desc_map);
524 1.14 skrll }
525 1.14 skrll }
526 1.14 skrll
527 1.14 skrll static int
528 1.14 skrll iwi_alloc_tx_ring(struct iwi_softc *sc, struct iwi_tx_ring *ring,
529 1.14 skrll int count)
530 1.14 skrll {
531 1.14 skrll int i, error, nsegs;
532 1.14 skrll
533 1.14 skrll ring->count = count;
534 1.14 skrll ring->queued = 0;
535 1.14 skrll ring->cur = ring->next = 0;
536 1.1 skrll
537 1.1 skrll /*
538 1.14 skrll * Allocate and map Tx ring
539 1.1 skrll */
540 1.1 skrll error = bus_dmamap_create(sc->sc_dmat,
541 1.25 skrll IWI_TX_DESC_SIZE * count, 1,
542 1.25 skrll IWI_TX_DESC_SIZE * count, 0, BUS_DMA_NOWAIT,
543 1.14 skrll &ring->desc_map);
544 1.1 skrll if (error != 0) {
545 1.14 skrll aprint_error("%s: could not create tx ring DMA map\n",
546 1.1 skrll sc->sc_dev.dv_xname);
547 1.1 skrll goto fail;
548 1.1 skrll }
549 1.1 skrll
550 1.1 skrll error = bus_dmamem_alloc(sc->sc_dmat,
551 1.25 skrll IWI_TX_DESC_SIZE * count, PAGE_SIZE, 0,
552 1.14 skrll &ring->desc_seg, 1, &nsegs, BUS_DMA_NOWAIT);
553 1.1 skrll if (error != 0) {
554 1.14 skrll aprint_error("%s: could not allocate tx ring DMA memory\n",
555 1.1 skrll sc->sc_dev.dv_xname);
556 1.1 skrll goto fail;
557 1.1 skrll }
558 1.1 skrll
559 1.14 skrll error = bus_dmamem_map(sc->sc_dmat, &ring->desc_seg, nsegs,
560 1.25 skrll IWI_TX_DESC_SIZE * count,
561 1.14 skrll (caddr_t *)&ring->desc, BUS_DMA_NOWAIT);
562 1.1 skrll if (error != 0) {
563 1.14 skrll aprint_error("%s: could not map tx ring DMA memory\n",
564 1.1 skrll sc->sc_dev.dv_xname);
565 1.1 skrll goto fail;
566 1.1 skrll }
567 1.1 skrll
568 1.14 skrll error = bus_dmamap_load(sc->sc_dmat, ring->desc_map, ring->desc,
569 1.25 skrll IWI_TX_DESC_SIZE * count, NULL,
570 1.1 skrll BUS_DMA_NOWAIT);
571 1.1 skrll if (error != 0) {
572 1.14 skrll aprint_error("%s: could not load tx ring DMA map\n",
573 1.1 skrll sc->sc_dev.dv_xname);
574 1.1 skrll goto fail;
575 1.1 skrll }
576 1.1 skrll
577 1.25 skrll memset(ring->desc, 0, IWI_TX_DESC_SIZE * count);
578 1.14 skrll
579 1.14 skrll ring->data = malloc(count * sizeof (struct iwi_tx_data), M_DEVBUF,
580 1.14 skrll M_NOWAIT | M_ZERO);
581 1.14 skrll if (ring->data == NULL) {
582 1.14 skrll aprint_error("%s: could not allocate soft data\n",
583 1.14 skrll sc->sc_dev.dv_xname);
584 1.14 skrll error = ENOMEM;
585 1.14 skrll goto fail;
586 1.14 skrll }
587 1.1 skrll
588 1.1 skrll /*
589 1.1 skrll * Allocate Tx buffers DMA maps
590 1.1 skrll */
591 1.14 skrll for (i = 0; i < count; i++) {
592 1.1 skrll error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, IWI_MAX_NSEG,
593 1.14 skrll MCLBYTES, 0, BUS_DMA_NOWAIT, &ring->data[i].map);
594 1.1 skrll if (error != 0) {
595 1.1 skrll aprint_error("%s: could not create tx buf DMA map",
596 1.1 skrll sc->sc_dev.dv_xname);
597 1.1 skrll goto fail;
598 1.1 skrll }
599 1.1 skrll }
600 1.14 skrll return 0;
601 1.14 skrll
602 1.14 skrll fail: iwi_free_tx_ring(sc, ring);
603 1.14 skrll return error;
604 1.14 skrll }
605 1.14 skrll
606 1.14 skrll static void
607 1.14 skrll iwi_reset_tx_ring(struct iwi_softc *sc, struct iwi_tx_ring *ring)
608 1.14 skrll {
609 1.14 skrll struct iwi_tx_data *data;
610 1.14 skrll int i;
611 1.14 skrll
612 1.14 skrll for (i = 0; i < ring->count; i++) {
613 1.14 skrll data = &ring->data[i];
614 1.14 skrll
615 1.14 skrll if (data->m != NULL) {
616 1.14 skrll bus_dmamap_sync(sc->sc_dmat, data->map, 0,
617 1.34 scw data->map->dm_mapsize, BUS_DMASYNC_POSTWRITE);
618 1.14 skrll bus_dmamap_unload(sc->sc_dmat, data->map);
619 1.14 skrll m_freem(data->m);
620 1.14 skrll data->m = NULL;
621 1.14 skrll }
622 1.14 skrll
623 1.14 skrll if (data->ni != NULL) {
624 1.14 skrll ieee80211_free_node(data->ni);
625 1.14 skrll data->ni = NULL;
626 1.14 skrll }
627 1.14 skrll }
628 1.14 skrll
629 1.14 skrll ring->queued = 0;
630 1.14 skrll ring->cur = ring->next = 0;
631 1.14 skrll }
632 1.14 skrll
633 1.14 skrll static void
634 1.14 skrll iwi_free_tx_ring(struct iwi_softc *sc, struct iwi_tx_ring *ring)
635 1.14 skrll {
636 1.14 skrll int i;
637 1.14 skrll
638 1.14 skrll if (ring->desc_map != NULL) {
639 1.14 skrll if (ring->desc != NULL) {
640 1.14 skrll bus_dmamap_unload(sc->sc_dmat, ring->desc_map);
641 1.14 skrll bus_dmamem_unmap(sc->sc_dmat, (caddr_t)ring->desc,
642 1.25 skrll IWI_TX_DESC_SIZE * ring->count);
643 1.14 skrll bus_dmamem_free(sc->sc_dmat, &ring->desc_seg, 1);
644 1.14 skrll }
645 1.14 skrll bus_dmamap_destroy(sc->sc_dmat, ring->desc_map);
646 1.14 skrll }
647 1.14 skrll
648 1.14 skrll for (i = 0; i < ring->count; i++) {
649 1.14 skrll if (ring->data[i].m != NULL) {
650 1.14 skrll bus_dmamap_unload(sc->sc_dmat, ring->data[i].map);
651 1.14 skrll m_freem(ring->data[i].m);
652 1.14 skrll }
653 1.14 skrll bus_dmamap_destroy(sc->sc_dmat, ring->data[i].map);
654 1.14 skrll }
655 1.14 skrll }
656 1.14 skrll
657 1.14 skrll static int
658 1.14 skrll iwi_alloc_rx_ring(struct iwi_softc *sc, struct iwi_rx_ring *ring,
659 1.14 skrll int count)
660 1.14 skrll {
661 1.14 skrll int i, error;
662 1.14 skrll
663 1.14 skrll ring->count = count;
664 1.14 skrll ring->cur = 0;
665 1.14 skrll
666 1.14 skrll ring->data = malloc(count * sizeof (struct iwi_rx_data), M_DEVBUF,
667 1.14 skrll M_NOWAIT | M_ZERO);
668 1.14 skrll if (ring->data == NULL) {
669 1.14 skrll aprint_error("%s: could not allocate soft data\n",
670 1.14 skrll sc->sc_dev.dv_xname);
671 1.14 skrll error = ENOMEM;
672 1.14 skrll goto fail;
673 1.14 skrll }
674 1.1 skrll
675 1.1 skrll /*
676 1.1 skrll * Allocate and map Rx buffers
677 1.1 skrll */
678 1.14 skrll for (i = 0; i < count; i++) {
679 1.1 skrll
680 1.1 skrll error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1, MCLBYTES,
681 1.31 joerg 0, BUS_DMA_WAITOK | BUS_DMA_ALLOCNOW, &ring->data[i].map);
682 1.1 skrll if (error != 0) {
683 1.1 skrll aprint_error("%s: could not create rx buf DMA map",
684 1.1 skrll sc->sc_dev.dv_xname);
685 1.1 skrll goto fail;
686 1.1 skrll }
687 1.1 skrll
688 1.31 joerg if ((ring->data[i].m = iwi_alloc_rx_buf(sc)) == NULL) {
689 1.1 skrll error = ENOMEM;
690 1.1 skrll goto fail;
691 1.1 skrll }
692 1.1 skrll
693 1.34 scw error = bus_dmamap_load_mbuf(sc->sc_dmat, ring->data[i].map,
694 1.34 scw ring->data[i].m, BUS_DMA_READ | BUS_DMA_NOWAIT);
695 1.1 skrll if (error != 0) {
696 1.1 skrll aprint_error("%s: could not load rx buffer DMA map\n",
697 1.1 skrll sc->sc_dev.dv_xname);
698 1.1 skrll goto fail;
699 1.1 skrll }
700 1.1 skrll }
701 1.1 skrll
702 1.1 skrll return 0;
703 1.1 skrll
704 1.14 skrll fail: iwi_free_rx_ring(sc, ring);
705 1.1 skrll return error;
706 1.1 skrll }
707 1.1 skrll
708 1.1 skrll static void
709 1.14 skrll iwi_reset_rx_ring(struct iwi_softc *sc, struct iwi_rx_ring *ring)
710 1.14 skrll {
711 1.14 skrll ring->cur = 0;
712 1.14 skrll }
713 1.14 skrll
714 1.14 skrll static void
715 1.14 skrll iwi_free_rx_ring(struct iwi_softc *sc, struct iwi_rx_ring *ring)
716 1.1 skrll {
717 1.1 skrll int i;
718 1.1 skrll
719 1.14 skrll for (i = 0; i < ring->count; i++) {
720 1.14 skrll if (ring->data[i].m != NULL) {
721 1.14 skrll bus_dmamap_unload(sc->sc_dmat, ring->data[i].map);
722 1.14 skrll m_freem(ring->data[i].m);
723 1.1 skrll }
724 1.14 skrll bus_dmamap_destroy(sc->sc_dmat, ring->data[i].map);
725 1.1 skrll }
726 1.1 skrll }
727 1.1 skrll
728 1.15 skrll static void
729 1.15 skrll iwi_shutdown(void *arg)
730 1.15 skrll {
731 1.15 skrll struct iwi_softc *sc = (struct iwi_softc *)arg;
732 1.15 skrll struct ifnet *ifp = sc->sc_ic.ic_ifp;
733 1.15 skrll
734 1.15 skrll iwi_stop(ifp, 1);
735 1.15 skrll }
736 1.15 skrll
737 1.15 skrll static int
738 1.15 skrll iwi_suspend(struct iwi_softc *sc)
739 1.15 skrll {
740 1.15 skrll struct ifnet *ifp = sc->sc_ic.ic_ifp;
741 1.15 skrll
742 1.15 skrll iwi_stop(ifp, 1);
743 1.15 skrll
744 1.15 skrll return 0;
745 1.15 skrll }
746 1.15 skrll
747 1.15 skrll static int
748 1.15 skrll iwi_resume(struct iwi_softc *sc)
749 1.15 skrll {
750 1.15 skrll struct ifnet *ifp = sc->sc_ic.ic_ifp;
751 1.15 skrll pcireg_t data;
752 1.15 skrll
753 1.15 skrll /* clear device specific PCI configuration register 0x41 */
754 1.15 skrll data = pci_conf_read(sc->sc_pct, sc->sc_pcitag, 0x40);
755 1.15 skrll data &= ~0x0000ff00;
756 1.15 skrll pci_conf_write(sc->sc_pct, sc->sc_pcitag, 0x40, data);
757 1.15 skrll
758 1.15 skrll if (ifp->if_flags & IFF_UP) {
759 1.15 skrll iwi_init(ifp);
760 1.15 skrll if (ifp->if_flags & IFF_RUNNING)
761 1.15 skrll iwi_start(ifp);
762 1.15 skrll }
763 1.15 skrll
764 1.15 skrll return 0;
765 1.15 skrll }
766 1.15 skrll
767 1.15 skrll static void
768 1.15 skrll iwi_powerhook(int why, void *arg)
769 1.15 skrll {
770 1.15 skrll struct iwi_softc *sc = arg;
771 1.15 skrll int s;
772 1.15 skrll
773 1.15 skrll s = splnet();
774 1.15 skrll switch (why) {
775 1.15 skrll case PWR_SUSPEND:
776 1.15 skrll case PWR_STANDBY:
777 1.15 skrll iwi_suspend(sc);
778 1.15 skrll break;
779 1.15 skrll case PWR_RESUME:
780 1.15 skrll iwi_resume(sc);
781 1.15 skrll break;
782 1.15 skrll case PWR_SOFTSUSPEND:
783 1.15 skrll case PWR_SOFTSTANDBY:
784 1.15 skrll case PWR_SOFTRESUME:
785 1.15 skrll break;
786 1.15 skrll }
787 1.15 skrll splx(s);
788 1.15 skrll }
789 1.15 skrll
790 1.1 skrll static int
791 1.1 skrll iwi_media_change(struct ifnet *ifp)
792 1.1 skrll {
793 1.1 skrll int error;
794 1.1 skrll
795 1.1 skrll error = ieee80211_media_change(ifp);
796 1.1 skrll if (error != ENETRESET)
797 1.1 skrll return error;
798 1.1 skrll
799 1.1 skrll if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) == (IFF_UP | IFF_RUNNING))
800 1.1 skrll iwi_init(ifp);
801 1.1 skrll
802 1.1 skrll return 0;
803 1.1 skrll }
804 1.1 skrll
805 1.20 skrll /*
806 1.20 skrll * The firmware automaticly adapt the transmit speed. We report the current
807 1.20 skrll * transmit speed here.
808 1.20 skrll */
809 1.1 skrll static void
810 1.1 skrll iwi_media_status(struct ifnet *ifp, struct ifmediareq *imr)
811 1.1 skrll {
812 1.1 skrll struct iwi_softc *sc = ifp->if_softc;
813 1.1 skrll struct ieee80211com *ic = &sc->sc_ic;
814 1.1 skrll #define N(a) (sizeof (a) / sizeof (a[0]))
815 1.1 skrll static const struct {
816 1.24 skrll uint32_t val;
817 1.1 skrll int rate;
818 1.1 skrll } rates[] = {
819 1.1 skrll { IWI_RATE_DS1, 2 },
820 1.1 skrll { IWI_RATE_DS2, 4 },
821 1.1 skrll { IWI_RATE_DS5, 11 },
822 1.1 skrll { IWI_RATE_DS11, 22 },
823 1.1 skrll { IWI_RATE_OFDM6, 12 },
824 1.1 skrll { IWI_RATE_OFDM9, 18 },
825 1.1 skrll { IWI_RATE_OFDM12, 24 },
826 1.1 skrll { IWI_RATE_OFDM18, 36 },
827 1.1 skrll { IWI_RATE_OFDM24, 48 },
828 1.1 skrll { IWI_RATE_OFDM36, 72 },
829 1.1 skrll { IWI_RATE_OFDM48, 96 },
830 1.1 skrll { IWI_RATE_OFDM54, 108 },
831 1.1 skrll };
832 1.24 skrll uint32_t val;
833 1.1 skrll int rate, i;
834 1.1 skrll
835 1.1 skrll imr->ifm_status = IFM_AVALID;
836 1.1 skrll imr->ifm_active = IFM_IEEE80211;
837 1.1 skrll if (ic->ic_state == IEEE80211_S_RUN)
838 1.1 skrll imr->ifm_status |= IFM_ACTIVE;
839 1.1 skrll
840 1.1 skrll /* read current transmission rate from adapter */
841 1.1 skrll val = CSR_READ_4(sc, IWI_CSR_CURRENT_TX_RATE);
842 1.1 skrll
843 1.1 skrll /* convert rate to 802.11 rate */
844 1.1 skrll for (i = 0; i < N(rates) && rates[i].val != val; i++);
845 1.1 skrll rate = (i < N(rates)) ? rates[i].rate : 0;
846 1.1 skrll
847 1.1 skrll imr->ifm_active |= ieee80211_rate2media(ic, rate, ic->ic_curmode);
848 1.1 skrll switch (ic->ic_opmode) {
849 1.1 skrll case IEEE80211_M_STA:
850 1.1 skrll break;
851 1.1 skrll
852 1.1 skrll case IEEE80211_M_IBSS:
853 1.1 skrll imr->ifm_active |= IFM_IEEE80211_ADHOC;
854 1.1 skrll break;
855 1.1 skrll
856 1.1 skrll case IEEE80211_M_MONITOR:
857 1.1 skrll imr->ifm_active |= IFM_IEEE80211_MONITOR;
858 1.1 skrll break;
859 1.1 skrll
860 1.1 skrll case IEEE80211_M_AHDEMO:
861 1.1 skrll case IEEE80211_M_HOSTAP:
862 1.1 skrll /* should not get there */
863 1.1 skrll break;
864 1.1 skrll }
865 1.1 skrll #undef N
866 1.1 skrll }
867 1.1 skrll
868 1.1 skrll static int
869 1.1 skrll iwi_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg)
870 1.1 skrll {
871 1.9 dyoung struct iwi_softc *sc = ic->ic_ifp->if_softc;
872 1.1 skrll
873 1.1 skrll switch (nstate) {
874 1.1 skrll case IEEE80211_S_SCAN:
875 1.12 christos if (sc->flags & IWI_FLAG_SCANNING)
876 1.12 christos break;
877 1.12 christos
878 1.12 christos ieee80211_node_table_reset(&ic->ic_scan);
879 1.12 christos ic->ic_flags |= IEEE80211_F_SCAN | IEEE80211_F_ASCAN;
880 1.12 christos sc->flags |= IWI_FLAG_SCANNING;
881 1.1 skrll iwi_scan(sc);
882 1.1 skrll break;
883 1.1 skrll
884 1.1 skrll case IEEE80211_S_AUTH:
885 1.1 skrll iwi_auth_and_assoc(sc);
886 1.1 skrll break;
887 1.1 skrll
888 1.1 skrll case IEEE80211_S_RUN:
889 1.1 skrll if (ic->ic_opmode == IEEE80211_M_IBSS)
890 1.1 skrll ieee80211_new_state(ic, IEEE80211_S_AUTH, -1);
891 1.8 sekiya else if (ic->ic_opmode == IEEE80211_M_MONITOR)
892 1.8 sekiya iwi_set_chan(sc, ic->ic_ibss_chan);
893 1.12 christos
894 1.12 christos return (*sc->sc_newstate)(ic, nstate,
895 1.12 christos IEEE80211_FC0_SUBTYPE_ASSOC_RESP);
896 1.1 skrll
897 1.1 skrll case IEEE80211_S_ASSOC:
898 1.12 christos break;
899 1.12 christos
900 1.1 skrll case IEEE80211_S_INIT:
901 1.12 christos sc->flags &= ~IWI_FLAG_SCANNING;
902 1.19 skrll return (*sc->sc_newstate)(ic, nstate, arg);
903 1.1 skrll }
904 1.1 skrll
905 1.1 skrll ic->ic_state = nstate;
906 1.1 skrll return 0;
907 1.1 skrll }
908 1.1 skrll
909 1.1 skrll /*
910 1.1 skrll * Read 16 bits at address 'addr' from the serial EEPROM.
911 1.1 skrll */
912 1.24 skrll static uint16_t
913 1.24 skrll iwi_read_prom_word(struct iwi_softc *sc, uint8_t addr)
914 1.1 skrll {
915 1.24 skrll uint32_t tmp;
916 1.24 skrll uint16_t val;
917 1.1 skrll int n;
918 1.1 skrll
919 1.1 skrll /* Clock C once before the first command */
920 1.1 skrll IWI_EEPROM_CTL(sc, 0);
921 1.1 skrll IWI_EEPROM_CTL(sc, IWI_EEPROM_S);
922 1.1 skrll IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_C);
923 1.1 skrll IWI_EEPROM_CTL(sc, IWI_EEPROM_S);
924 1.1 skrll
925 1.1 skrll /* Write start bit (1) */
926 1.1 skrll IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_D);
927 1.1 skrll IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_D | IWI_EEPROM_C);
928 1.1 skrll
929 1.1 skrll /* Write READ opcode (10) */
930 1.1 skrll IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_D);
931 1.1 skrll IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_D | IWI_EEPROM_C);
932 1.1 skrll IWI_EEPROM_CTL(sc, IWI_EEPROM_S);
933 1.1 skrll IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_C);
934 1.1 skrll
935 1.1 skrll /* Write address A7-A0 */
936 1.1 skrll for (n = 7; n >= 0; n--) {
937 1.1 skrll IWI_EEPROM_CTL(sc, IWI_EEPROM_S |
938 1.1 skrll (((addr >> n) & 1) << IWI_EEPROM_SHIFT_D));
939 1.1 skrll IWI_EEPROM_CTL(sc, IWI_EEPROM_S |
940 1.1 skrll (((addr >> n) & 1) << IWI_EEPROM_SHIFT_D) | IWI_EEPROM_C);
941 1.1 skrll }
942 1.1 skrll
943 1.1 skrll IWI_EEPROM_CTL(sc, IWI_EEPROM_S);
944 1.1 skrll
945 1.1 skrll /* Read data Q15-Q0 */
946 1.1 skrll val = 0;
947 1.1 skrll for (n = 15; n >= 0; n--) {
948 1.1 skrll IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_C);
949 1.1 skrll IWI_EEPROM_CTL(sc, IWI_EEPROM_S);
950 1.1 skrll tmp = MEM_READ_4(sc, IWI_MEM_EEPROM_CTL);
951 1.1 skrll val |= ((tmp & IWI_EEPROM_Q) >> IWI_EEPROM_SHIFT_Q) << n;
952 1.1 skrll }
953 1.1 skrll
954 1.1 skrll IWI_EEPROM_CTL(sc, 0);
955 1.1 skrll
956 1.1 skrll /* Clear Chip Select and clock C */
957 1.1 skrll IWI_EEPROM_CTL(sc, IWI_EEPROM_S);
958 1.1 skrll IWI_EEPROM_CTL(sc, 0);
959 1.1 skrll IWI_EEPROM_CTL(sc, IWI_EEPROM_C);
960 1.1 skrll
961 1.33 skrll return val;
962 1.1 skrll }
963 1.1 skrll
964 1.1 skrll /*
965 1.1 skrll * XXX: Hack to set the current channel to the value advertised in beacons or
966 1.1 skrll * probe responses. Only used during AP detection.
967 1.1 skrll */
968 1.1 skrll static void
969 1.1 skrll iwi_fix_channel(struct ieee80211com *ic, struct mbuf *m)
970 1.1 skrll {
971 1.1 skrll struct ieee80211_frame *wh;
972 1.24 skrll uint8_t subtype;
973 1.24 skrll uint8_t *frm, *efrm;
974 1.1 skrll
975 1.1 skrll wh = mtod(m, struct ieee80211_frame *);
976 1.1 skrll
977 1.1 skrll if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) != IEEE80211_FC0_TYPE_MGT)
978 1.1 skrll return;
979 1.1 skrll
980 1.1 skrll subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;
981 1.1 skrll
982 1.1 skrll if (subtype != IEEE80211_FC0_SUBTYPE_BEACON &&
983 1.1 skrll subtype != IEEE80211_FC0_SUBTYPE_PROBE_RESP)
984 1.1 skrll return;
985 1.1 skrll
986 1.24 skrll frm = (uint8_t *)(wh + 1);
987 1.24 skrll efrm = mtod(m, uint8_t *) + m->m_len;
988 1.1 skrll
989 1.1 skrll frm += 12; /* skip tstamp, bintval and capinfo fields */
990 1.1 skrll while (frm < efrm) {
991 1.1 skrll if (*frm == IEEE80211_ELEMID_DSPARMS)
992 1.1 skrll #if IEEE80211_CHAN_MAX < 255
993 1.1 skrll if (frm[2] <= IEEE80211_CHAN_MAX)
994 1.1 skrll #endif
995 1.1 skrll ic->ic_bss->ni_chan = &ic->ic_channels[frm[2]];
996 1.1 skrll
997 1.1 skrll frm += frm[1] + 2;
998 1.1 skrll }
999 1.1 skrll }
1000 1.1 skrll
1001 1.31 joerg static struct mbuf *
1002 1.31 joerg iwi_alloc_rx_buf(struct iwi_softc *sc)
1003 1.31 joerg {
1004 1.31 joerg struct mbuf *m;
1005 1.31 joerg
1006 1.31 joerg MGETHDR(m, M_DONTWAIT, MT_DATA);
1007 1.31 joerg if (m == NULL) {
1008 1.31 joerg aprint_error("%s: could not allocate rx mbuf\n",
1009 1.31 joerg sc->sc_dev.dv_xname);
1010 1.31 joerg return NULL;
1011 1.31 joerg }
1012 1.31 joerg
1013 1.31 joerg MCLGET(m, M_DONTWAIT);
1014 1.31 joerg if (!(m->m_flags & M_EXT)) {
1015 1.31 joerg aprint_error("%s: could not allocate rx mbuf cluster\n",
1016 1.31 joerg sc->sc_dev.dv_xname);
1017 1.31 joerg m_freem(m);
1018 1.31 joerg return NULL;
1019 1.31 joerg }
1020 1.31 joerg
1021 1.34 scw m->m_pkthdr.len = m->m_len = m->m_ext.ext_size;
1022 1.31 joerg return m;
1023 1.31 joerg }
1024 1.31 joerg
1025 1.1 skrll static void
1026 1.14 skrll iwi_frame_intr(struct iwi_softc *sc, struct iwi_rx_data *data, int i,
1027 1.1 skrll struct iwi_frame *frame)
1028 1.1 skrll {
1029 1.1 skrll struct ieee80211com *ic = &sc->sc_ic;
1030 1.12 christos struct ifnet *ifp = ic->ic_ifp;
1031 1.31 joerg struct mbuf *m, *m_new;
1032 1.12 christos struct ieee80211_frame *wh;
1033 1.1 skrll struct ieee80211_node *ni;
1034 1.1 skrll int error;
1035 1.1 skrll
1036 1.14 skrll DPRINTFN(5, ("received frame len=%u chan=%u rssi=%u\n",
1037 1.14 skrll le16toh(frame->len), frame->chan, frame->rssi_dbm));
1038 1.1 skrll
1039 1.12 christos if (le16toh(frame->len) < sizeof (struct ieee80211_frame) ||
1040 1.1 skrll le16toh(frame->len) > MCLBYTES) {
1041 1.14 skrll DPRINTF(("%s: bad frame length\n", sc->sc_dev.dv_xname));
1042 1.14 skrll ifp->if_ierrors++;
1043 1.14 skrll return;
1044 1.1 skrll }
1045 1.1 skrll
1046 1.31 joerg /*
1047 1.31 joerg * Try to allocate a new mbuf for this ring element and
1048 1.31 joerg * load it before processing the current mbuf. If the ring
1049 1.31 joerg * element cannot be reloaded, drop the received packet
1050 1.31 joerg * and reuse the old mbuf. In the unlikely case that
1051 1.31 joerg * the old mbuf can't be reloaded either, explicitly panic.
1052 1.31 joerg *
1053 1.31 joerg * XXX Reorganize buffer by moving elements from the logical
1054 1.31 joerg * end of the ring to the front instead of dropping.
1055 1.31 joerg */
1056 1.31 joerg if ((m_new = iwi_alloc_rx_buf(sc)) == NULL) {
1057 1.31 joerg ifp->if_ierrors++;
1058 1.31 joerg return;
1059 1.31 joerg }
1060 1.31 joerg
1061 1.14 skrll bus_dmamap_unload(sc->sc_dmat, data->map);
1062 1.1 skrll
1063 1.34 scw error = bus_dmamap_load_mbuf(sc->sc_dmat, data->map, m_new,
1064 1.34 scw BUS_DMA_READ | BUS_DMA_NOWAIT);
1065 1.31 joerg if (error != 0) {
1066 1.31 joerg aprint_error("%s: could not load rx buf DMA map\n",
1067 1.31 joerg sc->sc_dev.dv_xname);
1068 1.31 joerg m_freem(m_new);
1069 1.31 joerg ifp->if_ierrors++;
1070 1.34 scw error = bus_dmamap_load_mbuf(sc->sc_dmat, data->map,
1071 1.34 scw data->m, BUS_DMA_READ | BUS_DMA_NOWAIT);
1072 1.31 joerg if (error)
1073 1.31 joerg panic("%s: unable to remap rx buf",
1074 1.31 joerg sc->sc_dev.dv_xname);
1075 1.31 joerg return;
1076 1.31 joerg }
1077 1.31 joerg
1078 1.31 joerg /*
1079 1.31 joerg * New mbuf successfully loaded, update RX ring and continue
1080 1.31 joerg * processing.
1081 1.31 joerg */
1082 1.31 joerg m = data->m;
1083 1.31 joerg data->m = m_new;
1084 1.31 joerg CSR_WRITE_4(sc, IWI_CSR_RX_BASE + i * 4, data->map->dm_segs[0].ds_addr);
1085 1.31 joerg
1086 1.1 skrll /* Finalize mbuf */
1087 1.1 skrll m->m_pkthdr.rcvif = ifp;
1088 1.1 skrll m->m_pkthdr.len = m->m_len = sizeof (struct iwi_hdr) +
1089 1.1 skrll sizeof (struct iwi_frame) + le16toh(frame->len);
1090 1.1 skrll
1091 1.1 skrll m_adj(m, sizeof (struct iwi_hdr) + sizeof (struct iwi_frame));
1092 1.1 skrll
1093 1.12 christos if (ic->ic_state == IEEE80211_S_SCAN)
1094 1.12 christos iwi_fix_channel(ic, m);
1095 1.1 skrll
1096 1.1 skrll #if NBPFILTER > 0
1097 1.1 skrll if (sc->sc_drvbpf != NULL) {
1098 1.1 skrll struct iwi_rx_radiotap_header *tap = &sc->sc_rxtap;
1099 1.14 skrll
1100 1.12 christos tap->wr_flags = 0;
1101 1.12 christos tap->wr_rate = frame->rate;
1102 1.12 christos tap->wr_chan_freq =
1103 1.12 christos htole16(ic->ic_channels[frame->chan].ic_freq);
1104 1.12 christos tap->wr_chan_flags =
1105 1.12 christos htole16(ic->ic_channels[frame->chan].ic_flags);
1106 1.12 christos tap->wr_antsignal = frame->signal;
1107 1.12 christos tap->wr_antenna = frame->antenna;
1108 1.1 skrll
1109 1.21 skrll bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_rxtap_len, m);
1110 1.1 skrll }
1111 1.1 skrll #endif
1112 1.1 skrll
1113 1.12 christos wh = mtod(m, struct ieee80211_frame *);
1114 1.12 christos ni = ieee80211_find_rxnode(ic, (struct ieee80211_frame_min *)wh);
1115 1.5 perry
1116 1.1 skrll /* Send the frame to the upper layer */
1117 1.12 christos ieee80211_input(ic, m, ni, frame->rssi_dbm, 0);
1118 1.1 skrll
1119 1.12 christos /* node is no longer needed */
1120 1.9 dyoung ieee80211_free_node(ni);
1121 1.1 skrll }
1122 1.1 skrll
1123 1.1 skrll static void
1124 1.25 skrll iwi_notification_intr(struct iwi_softc *sc, struct iwi_notif *notif)
1125 1.1 skrll {
1126 1.1 skrll struct ieee80211com *ic = &sc->sc_ic;
1127 1.1 skrll struct iwi_notif_scan_channel *chan;
1128 1.1 skrll struct iwi_notif_scan_complete *scan;
1129 1.1 skrll struct iwi_notif_authentication *auth;
1130 1.1 skrll struct iwi_notif_association *assoc;
1131 1.1 skrll
1132 1.1 skrll switch (notif->type) {
1133 1.1 skrll case IWI_NOTIF_TYPE_SCAN_CHANNEL:
1134 1.1 skrll chan = (struct iwi_notif_scan_channel *)(notif + 1);
1135 1.1 skrll
1136 1.23 skrll DPRINTFN(2, ("Finished scanning channel (%u)\n", chan->nchan));
1137 1.1 skrll break;
1138 1.1 skrll
1139 1.1 skrll case IWI_NOTIF_TYPE_SCAN_COMPLETE:
1140 1.1 skrll scan = (struct iwi_notif_scan_complete *)(notif + 1);
1141 1.1 skrll
1142 1.1 skrll DPRINTFN(2, ("Scan completed (%u, %u)\n", scan->nchan,
1143 1.1 skrll scan->status));
1144 1.1 skrll
1145 1.8 sekiya /* monitor mode uses scan to set the channel ... */
1146 1.12 christos if (ic->ic_opmode != IEEE80211_M_MONITOR) {
1147 1.12 christos sc->flags &= ~IWI_FLAG_SCANNING;
1148 1.8 sekiya ieee80211_end_scan(ic);
1149 1.12 christos } else
1150 1.8 sekiya iwi_set_chan(sc, ic->ic_ibss_chan);
1151 1.1 skrll break;
1152 1.1 skrll
1153 1.1 skrll case IWI_NOTIF_TYPE_AUTHENTICATION:
1154 1.1 skrll auth = (struct iwi_notif_authentication *)(notif + 1);
1155 1.1 skrll
1156 1.1 skrll DPRINTFN(2, ("Authentication (%u)\n", auth->state));
1157 1.1 skrll
1158 1.1 skrll switch (auth->state) {
1159 1.1 skrll case IWI_AUTHENTICATED:
1160 1.12 christos ieee80211_node_authorize(ic, ic->ic_bss);
1161 1.1 skrll ieee80211_new_state(ic, IEEE80211_S_ASSOC, -1);
1162 1.1 skrll break;
1163 1.1 skrll
1164 1.1 skrll case IWI_DEAUTHENTICATED:
1165 1.1 skrll break;
1166 1.1 skrll
1167 1.1 skrll default:
1168 1.1 skrll aprint_error("%s: unknown authentication state %u\n",
1169 1.1 skrll sc->sc_dev.dv_xname, auth->state);
1170 1.1 skrll }
1171 1.1 skrll break;
1172 1.1 skrll
1173 1.1 skrll case IWI_NOTIF_TYPE_ASSOCIATION:
1174 1.1 skrll assoc = (struct iwi_notif_association *)(notif + 1);
1175 1.1 skrll
1176 1.1 skrll DPRINTFN(2, ("Association (%u, %u)\n", assoc->state,
1177 1.1 skrll assoc->status));
1178 1.1 skrll
1179 1.1 skrll switch (assoc->state) {
1180 1.12 christos case IWI_AUTHENTICATED:
1181 1.12 christos /* re-association, do nothing */
1182 1.12 christos break;
1183 1.12 christos
1184 1.1 skrll case IWI_ASSOCIATED:
1185 1.1 skrll ieee80211_new_state(ic, IEEE80211_S_RUN, -1);
1186 1.1 skrll break;
1187 1.1 skrll
1188 1.1 skrll case IWI_DEASSOCIATED:
1189 1.12 christos ieee80211_begin_scan(ic, 1);
1190 1.1 skrll break;
1191 1.1 skrll
1192 1.1 skrll default:
1193 1.1 skrll aprint_error("%s: unknown association state %u\n",
1194 1.1 skrll sc->sc_dev.dv_xname, assoc->state);
1195 1.1 skrll }
1196 1.1 skrll break;
1197 1.1 skrll
1198 1.1 skrll case IWI_NOTIF_TYPE_CALIBRATION:
1199 1.1 skrll case IWI_NOTIF_TYPE_BEACON:
1200 1.1 skrll case IWI_NOTIF_TYPE_NOISE:
1201 1.1 skrll DPRINTFN(5, ("Notification (%u)\n", notif->type));
1202 1.1 skrll break;
1203 1.1 skrll
1204 1.1 skrll default:
1205 1.1 skrll aprint_error("%s: unknown notification type %u\n",
1206 1.1 skrll sc->sc_dev.dv_xname, notif->type);
1207 1.1 skrll }
1208 1.1 skrll }
1209 1.1 skrll
1210 1.1 skrll static void
1211 1.1 skrll iwi_rx_intr(struct iwi_softc *sc)
1212 1.1 skrll {
1213 1.14 skrll struct iwi_rx_data *data;
1214 1.1 skrll struct iwi_hdr *hdr;
1215 1.14 skrll uint32_t hw;
1216 1.1 skrll
1217 1.14 skrll hw = CSR_READ_4(sc, IWI_CSR_RX_RIDX);
1218 1.1 skrll
1219 1.14 skrll for (; sc->rxq.cur != hw;) {
1220 1.14 skrll data = &sc->rxq.data[sc->rxq.cur];
1221 1.1 skrll
1222 1.14 skrll bus_dmamap_sync(sc->sc_dmat, data->map, 0,
1223 1.34 scw data->map->dm_mapsize, BUS_DMASYNC_POSTREAD);
1224 1.1 skrll
1225 1.14 skrll hdr = mtod(data->m, struct iwi_hdr *);
1226 1.1 skrll
1227 1.1 skrll switch (hdr->type) {
1228 1.1 skrll case IWI_HDR_TYPE_FRAME:
1229 1.14 skrll iwi_frame_intr(sc, data, sc->rxq.cur,
1230 1.1 skrll (struct iwi_frame *)(hdr + 1));
1231 1.1 skrll break;
1232 1.1 skrll
1233 1.1 skrll case IWI_HDR_TYPE_NOTIF:
1234 1.25 skrll iwi_notification_intr(sc,
1235 1.1 skrll (struct iwi_notif *)(hdr + 1));
1236 1.1 skrll break;
1237 1.1 skrll
1238 1.1 skrll default:
1239 1.1 skrll aprint_error("%s: unknown hdr type %u\n",
1240 1.1 skrll sc->sc_dev.dv_xname, hdr->type);
1241 1.1 skrll }
1242 1.14 skrll
1243 1.14 skrll DPRINTFN(15, ("rx done idx=%u\n", sc->rxq.cur));
1244 1.14 skrll
1245 1.14 skrll sc->rxq.cur = (sc->rxq.cur + 1) % sc->rxq.count;
1246 1.1 skrll }
1247 1.1 skrll
1248 1.14 skrll
1249 1.1 skrll /* Tell the firmware what we have processed */
1250 1.14 skrll hw = (hw == 0) ? sc->rxq.count - 1 : hw - 1;
1251 1.14 skrll CSR_WRITE_4(sc, IWI_CSR_RX_WIDX, hw);
1252 1.1 skrll }
1253 1.1 skrll
1254 1.1 skrll static void
1255 1.1 skrll iwi_tx_intr(struct iwi_softc *sc)
1256 1.1 skrll {
1257 1.9 dyoung struct ifnet *ifp = &sc->sc_if;
1258 1.14 skrll struct iwi_tx_data *data;
1259 1.24 skrll uint32_t hw;
1260 1.1 skrll
1261 1.14 skrll hw = CSR_READ_4(sc, IWI_CSR_TX1_RIDX);
1262 1.1 skrll
1263 1.14 skrll for (; sc->txq.next != hw;) {
1264 1.14 skrll data = &sc->txq.data[sc->txq.next];
1265 1.1 skrll
1266 1.14 skrll bus_dmamap_sync(sc->sc_dmat, data->map, 0,
1267 1.34 scw data->map->dm_mapsize, BUS_DMASYNC_POSTWRITE);
1268 1.14 skrll bus_dmamap_unload(sc->sc_dmat, data->map);
1269 1.14 skrll m_freem(data->m);
1270 1.14 skrll data->m = NULL;
1271 1.14 skrll ieee80211_free_node(data->ni);
1272 1.14 skrll data->ni = NULL;
1273 1.1 skrll
1274 1.14 skrll DPRINTFN(15, ("tx done idx=%u\n", sc->txq.next));
1275 1.1 skrll
1276 1.12 christos ifp->if_opackets++;
1277 1.1 skrll
1278 1.14 skrll sc->txq.queued--;
1279 1.14 skrll sc->txq.next = (sc->txq.next + 1) % sc->txq.count;
1280 1.1 skrll }
1281 1.1 skrll
1282 1.14 skrll sc->sc_tx_timer = 0;
1283 1.14 skrll ifp->if_flags &= ~IFF_OACTIVE;
1284 1.1 skrll
1285 1.1 skrll /* Call start() since some buffer descriptors have been released */
1286 1.1 skrll (*ifp->if_start)(ifp);
1287 1.1 skrll }
1288 1.1 skrll
1289 1.1 skrll static int
1290 1.1 skrll iwi_intr(void *arg)
1291 1.1 skrll {
1292 1.1 skrll struct iwi_softc *sc = arg;
1293 1.24 skrll uint32_t r;
1294 1.1 skrll
1295 1.1 skrll if ((r = CSR_READ_4(sc, IWI_CSR_INTR)) == 0 || r == 0xffffffff)
1296 1.1 skrll return 0;
1297 1.1 skrll
1298 1.29 skrll /* Acknowledge interrupts */
1299 1.29 skrll CSR_WRITE_4(sc, IWI_CSR_INTR, r);
1300 1.1 skrll
1301 1.1 skrll if (r & (IWI_INTR_FATAL_ERROR | IWI_INTR_PARITY_ERROR)) {
1302 1.1 skrll aprint_error("%s: fatal error\n", sc->sc_dev.dv_xname);
1303 1.36 skrll if (r & IWI_INTR_FATAL_ERROR)
1304 1.36 skrll iwi_error_log(sc);
1305 1.13 skrll sc->sc_ic.ic_ifp->if_flags &= ~IFF_UP;
1306 1.9 dyoung iwi_stop(&sc->sc_if, 1);
1307 1.1 skrll }
1308 1.1 skrll
1309 1.1 skrll if (r & IWI_INTR_FW_INITED) {
1310 1.1 skrll if (!(r & (IWI_INTR_FATAL_ERROR | IWI_INTR_PARITY_ERROR)))
1311 1.1 skrll wakeup(sc);
1312 1.1 skrll }
1313 1.1 skrll
1314 1.1 skrll if (r & IWI_INTR_RADIO_OFF) {
1315 1.1 skrll DPRINTF(("radio transmitter off\n"));
1316 1.13 skrll sc->sc_ic.ic_ifp->if_flags &= ~IFF_UP;
1317 1.9 dyoung iwi_stop(&sc->sc_if, 1);
1318 1.1 skrll }
1319 1.1 skrll
1320 1.14 skrll if (r & IWI_INTR_RX_DONE)
1321 1.1 skrll iwi_rx_intr(sc);
1322 1.1 skrll
1323 1.14 skrll if (r & IWI_INTR_CMD_DONE)
1324 1.1 skrll wakeup(sc);
1325 1.1 skrll
1326 1.14 skrll if (r & IWI_INTR_TX1_DONE)
1327 1.1 skrll iwi_tx_intr(sc);
1328 1.1 skrll
1329 1.1 skrll return 1;
1330 1.1 skrll }
1331 1.1 skrll
1332 1.1 skrll static int
1333 1.24 skrll iwi_cmd(struct iwi_softc *sc, uint8_t type, void *data, uint8_t len,
1334 1.1 skrll int async)
1335 1.1 skrll {
1336 1.1 skrll struct iwi_cmd_desc *desc;
1337 1.1 skrll
1338 1.14 skrll desc = &sc->cmdq.desc[sc->cmdq.cur];
1339 1.1 skrll
1340 1.1 skrll desc->hdr.type = IWI_HDR_TYPE_COMMAND;
1341 1.1 skrll desc->hdr.flags = IWI_HDR_FLAG_IRQ;
1342 1.1 skrll desc->type = type;
1343 1.1 skrll desc->len = len;
1344 1.1 skrll memcpy(desc->data, data, len);
1345 1.1 skrll
1346 1.14 skrll bus_dmamap_sync(sc->sc_dmat, sc->cmdq.desc_map,
1347 1.25 skrll sc->cmdq.cur * IWI_CMD_DESC_SIZE,
1348 1.25 skrll IWI_CMD_DESC_SIZE, BUS_DMASYNC_PREWRITE);
1349 1.1 skrll
1350 1.25 skrll DPRINTFN(2, ("sending command idx=%u type=%u len=%u\n", sc->cmdq.cur,
1351 1.14 skrll type, len));
1352 1.14 skrll
1353 1.14 skrll sc->cmdq.cur = (sc->cmdq.cur + 1) % sc->cmdq.count;
1354 1.14 skrll CSR_WRITE_4(sc, IWI_CSR_CMD_WIDX, sc->cmdq.cur);
1355 1.1 skrll
1356 1.1 skrll return async ? 0 : tsleep(sc, 0, "iwicmd", hz);
1357 1.1 skrll }
1358 1.1 skrll
1359 1.1 skrll static int
1360 1.1 skrll iwi_tx_start(struct ifnet *ifp, struct mbuf *m0, struct ieee80211_node *ni)
1361 1.1 skrll {
1362 1.1 skrll struct iwi_softc *sc = ifp->if_softc;
1363 1.1 skrll struct ieee80211com *ic = &sc->sc_ic;
1364 1.12 christos struct ieee80211_frame wh;
1365 1.12 christos struct ieee80211_key *k;
1366 1.14 skrll struct iwi_tx_data *data;
1367 1.1 skrll struct iwi_tx_desc *desc;
1368 1.1 skrll struct mbuf *mnew;
1369 1.1 skrll int error, i;
1370 1.1 skrll
1371 1.12 christos (void)memcpy(&wh, mtod(m0, struct ieee80211_frame *), sizeof(wh));
1372 1.12 christos if (wh.i_fc[1] & IEEE80211_FC1_WEP) {
1373 1.12 christos k = ieee80211_crypto_encap(ic, ni, m0);
1374 1.12 christos if (k == NULL) {
1375 1.12 christos m_freem(m0);
1376 1.12 christos return ENOBUFS;
1377 1.12 christos }
1378 1.12 christos }
1379 1.12 christos
1380 1.1 skrll #if NBPFILTER > 0
1381 1.1 skrll if (sc->sc_drvbpf != NULL) {
1382 1.1 skrll struct iwi_tx_radiotap_header *tap = &sc->sc_txtap;
1383 1.1 skrll
1384 1.1 skrll tap->wt_flags = 0;
1385 1.12 christos tap->wt_chan_freq = htole16(ic->ic_ibss_chan->ic_freq);
1386 1.12 christos tap->wt_chan_flags = htole16(ic->ic_ibss_chan->ic_flags);
1387 1.1 skrll
1388 1.1 skrll bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_txtap_len, m0);
1389 1.1 skrll }
1390 1.1 skrll #endif
1391 1.1 skrll
1392 1.14 skrll data = &sc->txq.data[sc->txq.cur];
1393 1.14 skrll desc = &sc->txq.desc[sc->txq.cur];
1394 1.1 skrll
1395 1.1 skrll /* trim IEEE802.11 header */
1396 1.1 skrll m_adj(m0, sizeof (struct ieee80211_frame));
1397 1.1 skrll
1398 1.34 scw error = bus_dmamap_load_mbuf(sc->sc_dmat, data->map, m0,
1399 1.34 scw BUS_DMA_WRITE | BUS_DMA_NOWAIT);
1400 1.1 skrll if (error != 0 && error != EFBIG) {
1401 1.1 skrll aprint_error("%s: could not map mbuf (error %d)\n",
1402 1.1 skrll sc->sc_dev.dv_xname, error);
1403 1.1 skrll m_freem(m0);
1404 1.1 skrll return error;
1405 1.1 skrll }
1406 1.1 skrll if (error != 0) {
1407 1.1 skrll /* too many fragments, linearize */
1408 1.1 skrll
1409 1.1 skrll MGETHDR(mnew, M_DONTWAIT, MT_DATA);
1410 1.1 skrll if (mnew == NULL) {
1411 1.1 skrll m_freem(m0);
1412 1.1 skrll return ENOMEM;
1413 1.1 skrll }
1414 1.1 skrll
1415 1.1 skrll M_COPY_PKTHDR(mnew, m0);
1416 1.34 scw
1417 1.34 scw /* If the data won't fit in the header, get a cluster */
1418 1.34 scw if (m0->m_pkthdr.len > MHLEN) {
1419 1.34 scw MCLGET(mnew, M_DONTWAIT);
1420 1.34 scw if (!(mnew->m_flags & M_EXT)) {
1421 1.34 scw m_freem(m0);
1422 1.34 scw m_freem(mnew);
1423 1.34 scw return ENOMEM;
1424 1.34 scw }
1425 1.1 skrll }
1426 1.1 skrll m_copydata(m0, 0, m0->m_pkthdr.len, mtod(mnew, caddr_t));
1427 1.1 skrll m_freem(m0);
1428 1.1 skrll mnew->m_len = mnew->m_pkthdr.len;
1429 1.1 skrll m0 = mnew;
1430 1.1 skrll
1431 1.14 skrll error = bus_dmamap_load_mbuf(sc->sc_dmat, data->map, m0,
1432 1.34 scw BUS_DMA_WRITE | BUS_DMA_NOWAIT);
1433 1.1 skrll if (error != 0) {
1434 1.1 skrll aprint_error("%s: could not map mbuf (error %d)\n",
1435 1.1 skrll sc->sc_dev.dv_xname, error);
1436 1.1 skrll m_freem(m0);
1437 1.1 skrll return error;
1438 1.1 skrll }
1439 1.1 skrll }
1440 1.1 skrll
1441 1.14 skrll data->m = m0;
1442 1.14 skrll data->ni = ni;
1443 1.1 skrll
1444 1.1 skrll desc->hdr.type = IWI_HDR_TYPE_DATA;
1445 1.1 skrll desc->hdr.flags = IWI_HDR_FLAG_IRQ;
1446 1.1 skrll desc->cmd = IWI_DATA_CMD_TX;
1447 1.1 skrll desc->len = htole16(m0->m_pkthdr.len);
1448 1.12 christos (void)memcpy(&desc->wh, &wh, sizeof (struct ieee80211_frame));
1449 1.1 skrll desc->flags = 0;
1450 1.12 christos if (!IEEE80211_IS_MULTICAST(wh.i_addr1))
1451 1.1 skrll desc->flags |= IWI_DATA_FLAG_NEED_ACK;
1452 1.1 skrll
1453 1.12 christos #if 0
1454 1.1 skrll if (ic->ic_flags & IEEE80211_F_PRIVACY) {
1455 1.12 christos wh.i_fc[1] |= IEEE80211_FC1_WEP;
1456 1.12 christos desc->wep_txkey = ic->ic_crypto.cs_def_txkey;
1457 1.1 skrll } else
1458 1.12 christos #endif
1459 1.1 skrll desc->flags |= IWI_DATA_FLAG_NO_WEP;
1460 1.1 skrll
1461 1.1 skrll if (ic->ic_flags & IEEE80211_F_SHPREAMBLE)
1462 1.1 skrll desc->flags |= IWI_DATA_FLAG_SHPREAMBLE;
1463 1.1 skrll
1464 1.14 skrll desc->nseg = htole32(data->map->dm_nsegs);
1465 1.14 skrll for (i = 0; i < data->map->dm_nsegs; i++) {
1466 1.14 skrll desc->seg_addr[i] = htole32(data->map->dm_segs[i].ds_addr);
1467 1.32 scw desc->seg_len[i] = htole16(data->map->dm_segs[i].ds_len);
1468 1.1 skrll }
1469 1.1 skrll
1470 1.14 skrll bus_dmamap_sync(sc->sc_dmat, sc->txq.desc_map,
1471 1.25 skrll sc->txq.cur * IWI_TX_DESC_SIZE,
1472 1.25 skrll IWI_TX_DESC_SIZE, BUS_DMASYNC_PREWRITE);
1473 1.1 skrll
1474 1.32 scw bus_dmamap_sync(sc->sc_dmat, data->map, 0, data->map->dm_mapsize,
1475 1.1 skrll BUS_DMASYNC_PREWRITE);
1476 1.1 skrll
1477 1.14 skrll DPRINTFN(5, ("sending data frame len=%u nseg=%u\n",
1478 1.32 scw le16toh(desc->len), le32toh(desc->nseg)));
1479 1.1 skrll
1480 1.1 skrll /* Inform firmware about this new packet */
1481 1.14 skrll sc->txq.queued++;
1482 1.14 skrll sc->txq.cur = (sc->txq.cur + 1) % sc->txq.count;
1483 1.14 skrll CSR_WRITE_4(sc, IWI_CSR_TX1_WIDX, sc->txq.cur);
1484 1.1 skrll
1485 1.1 skrll return 0;
1486 1.1 skrll }
1487 1.1 skrll
1488 1.1 skrll static void
1489 1.1 skrll iwi_start(struct ifnet *ifp)
1490 1.1 skrll {
1491 1.1 skrll struct iwi_softc *sc = ifp->if_softc;
1492 1.1 skrll struct ieee80211com *ic = &sc->sc_ic;
1493 1.1 skrll struct mbuf *m0;
1494 1.12 christos struct ether_header *eh;
1495 1.1 skrll struct ieee80211_node *ni;
1496 1.1 skrll
1497 1.1 skrll if (ic->ic_state != IEEE80211_S_RUN)
1498 1.1 skrll return;
1499 1.1 skrll
1500 1.1 skrll for (;;) {
1501 1.1 skrll IF_DEQUEUE(&ifp->if_snd, m0);
1502 1.1 skrll if (m0 == NULL)
1503 1.1 skrll break;
1504 1.1 skrll
1505 1.14 skrll if (sc->txq.queued >= sc->txq.count - 4) {
1506 1.1 skrll IF_PREPEND(&ifp->if_snd, m0);
1507 1.1 skrll ifp->if_flags |= IFF_OACTIVE;
1508 1.1 skrll break;
1509 1.1 skrll }
1510 1.1 skrll
1511 1.14 skrll if (m0->m_len < sizeof (struct ether_header) &&
1512 1.14 skrll (m0 = m_pullup(m0, sizeof (struct ether_header))) == NULL)
1513 1.25 skrll continue;
1514 1.14 skrll
1515 1.1 skrll #if NBPFILTER > 0
1516 1.1 skrll if (ifp->if_bpf != NULL)
1517 1.1 skrll bpf_mtap(ifp->if_bpf, m0);
1518 1.1 skrll #endif
1519 1.1 skrll
1520 1.12 christos eh = mtod(m0, struct ether_header *);
1521 1.12 christos ni = ieee80211_find_txnode(ic, eh->ether_dhost);
1522 1.12 christos if (ni == NULL) {
1523 1.9 dyoung m_freem(m0);
1524 1.9 dyoung continue;
1525 1.9 dyoung }
1526 1.1 skrll
1527 1.12 christos m0 = ieee80211_encap(ic, m0, ni);
1528 1.12 christos if (m0 == NULL) {
1529 1.12 christos ieee80211_free_node(ni);
1530 1.12 christos continue;
1531 1.12 christos }
1532 1.1 skrll
1533 1.25 skrll #if NBPFILTER > 0
1534 1.25 skrll if (ic->ic_rawbpf != NULL)
1535 1.25 skrll bpf_mtap(ic->ic_rawbpf, m0);
1536 1.25 skrll #endif
1537 1.25 skrll
1538 1.1 skrll if (iwi_tx_start(ifp, m0, ni) != 0) {
1539 1.12 christos ieee80211_free_node(ni);
1540 1.12 christos ifp->if_oerrors++;
1541 1.1 skrll break;
1542 1.1 skrll }
1543 1.1 skrll
1544 1.1 skrll /* start watchdog timer */
1545 1.1 skrll sc->sc_tx_timer = 5;
1546 1.1 skrll ifp->if_timer = 1;
1547 1.1 skrll }
1548 1.1 skrll }
1549 1.1 skrll
1550 1.1 skrll static void
1551 1.1 skrll iwi_watchdog(struct ifnet *ifp)
1552 1.1 skrll {
1553 1.1 skrll struct iwi_softc *sc = ifp->if_softc;
1554 1.1 skrll
1555 1.1 skrll ifp->if_timer = 0;
1556 1.1 skrll
1557 1.1 skrll if (sc->sc_tx_timer > 0) {
1558 1.1 skrll if (--sc->sc_tx_timer == 0) {
1559 1.1 skrll aprint_error("%s: device timeout\n",
1560 1.1 skrll sc->sc_dev.dv_xname);
1561 1.12 christos ifp->if_oerrors++;
1562 1.12 christos ifp->if_flags &= ~IFF_UP;
1563 1.1 skrll iwi_stop(ifp, 1);
1564 1.1 skrll return;
1565 1.1 skrll }
1566 1.1 skrll ifp->if_timer = 1;
1567 1.1 skrll }
1568 1.1 skrll
1569 1.9 dyoung ieee80211_watchdog(&sc->sc_ic);
1570 1.1 skrll }
1571 1.1 skrll
1572 1.1 skrll static int
1573 1.24 skrll iwi_get_table0(struct iwi_softc *sc, uint32_t *tbl)
1574 1.1 skrll {
1575 1.24 skrll uint32_t size, buf[128];
1576 1.1 skrll
1577 1.1 skrll if (!(sc->flags & IWI_FLAG_FW_INITED)) {
1578 1.1 skrll memset(buf, 0, sizeof buf);
1579 1.1 skrll return copyout(buf, tbl, sizeof buf);
1580 1.1 skrll }
1581 1.1 skrll
1582 1.1 skrll size = min(CSR_READ_4(sc, IWI_CSR_TABLE0_SIZE), 128 - 1);
1583 1.1 skrll CSR_READ_REGION_4(sc, IWI_CSR_TABLE0_BASE, &buf[1], size);
1584 1.1 skrll
1585 1.1 skrll return copyout(buf, tbl, sizeof buf);
1586 1.1 skrll }
1587 1.1 skrll
1588 1.1 skrll static int
1589 1.1 skrll iwi_get_radio(struct iwi_softc *sc, int *ret)
1590 1.1 skrll {
1591 1.1 skrll int val;
1592 1.1 skrll
1593 1.1 skrll val = (CSR_READ_4(sc, IWI_CSR_IO) & IWI_IO_RADIO_ENABLED) ? 1 : 0;
1594 1.1 skrll return copyout(&val, ret, sizeof val);
1595 1.1 skrll }
1596 1.1 skrll
1597 1.1 skrll static int
1598 1.1 skrll iwi_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
1599 1.1 skrll {
1600 1.1 skrll struct iwi_softc *sc = ifp->if_softc;
1601 1.1 skrll struct ifreq *ifr;
1602 1.1 skrll int s, error = 0;
1603 1.1 skrll
1604 1.1 skrll s = splnet();
1605 1.1 skrll
1606 1.1 skrll switch (cmd) {
1607 1.1 skrll case SIOCSIFFLAGS:
1608 1.1 skrll if (ifp->if_flags & IFF_UP) {
1609 1.1 skrll if (!(ifp->if_flags & IFF_RUNNING))
1610 1.1 skrll iwi_init(ifp);
1611 1.1 skrll } else {
1612 1.1 skrll if (ifp->if_flags & IFF_RUNNING)
1613 1.1 skrll iwi_stop(ifp, 1);
1614 1.1 skrll }
1615 1.1 skrll break;
1616 1.1 skrll
1617 1.1 skrll case SIOCGTABLE0:
1618 1.1 skrll ifr = (struct ifreq *)data;
1619 1.24 skrll error = iwi_get_table0(sc, (uint32_t *)ifr->ifr_data);
1620 1.1 skrll break;
1621 1.1 skrll
1622 1.1 skrll case SIOCGRADIO:
1623 1.1 skrll ifr = (struct ifreq *)data;
1624 1.1 skrll error = iwi_get_radio(sc, (int *)ifr->ifr_data);
1625 1.1 skrll break;
1626 1.1 skrll
1627 1.1 skrll case SIOCSLOADFW:
1628 1.1 skrll /* only super-user can do that! */
1629 1.1 skrll if ((error = suser(curproc->p_ucred, &curproc->p_acflag)) != 0)
1630 1.1 skrll break;
1631 1.1 skrll
1632 1.1 skrll ifr = (struct ifreq *)data;
1633 1.1 skrll error = iwi_cache_firmware(sc, ifr->ifr_data);
1634 1.1 skrll break;
1635 1.1 skrll
1636 1.1 skrll case SIOCSKILLFW:
1637 1.1 skrll /* only super-user can do that! */
1638 1.1 skrll if ((error = suser(curproc->p_ucred, &curproc->p_acflag)) != 0)
1639 1.1 skrll break;
1640 1.1 skrll
1641 1.12 christos ifp->if_flags &= ~IFF_UP;
1642 1.1 skrll iwi_stop(ifp, 1);
1643 1.1 skrll iwi_free_firmware(sc);
1644 1.1 skrll break;
1645 1.1 skrll
1646 1.1 skrll default:
1647 1.9 dyoung error = ieee80211_ioctl(&sc->sc_ic, cmd, data);
1648 1.1 skrll }
1649 1.1 skrll
1650 1.1 skrll if (error == ENETRESET && cmd != SIOCADDMULTI) {
1651 1.1 skrll if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) ==
1652 1.1 skrll (IFF_UP | IFF_RUNNING))
1653 1.1 skrll iwi_init(ifp);
1654 1.1 skrll error = 0;
1655 1.1 skrll }
1656 1.1 skrll
1657 1.1 skrll splx(s);
1658 1.1 skrll return error;
1659 1.1 skrll }
1660 1.1 skrll
1661 1.1 skrll static void
1662 1.1 skrll iwi_stop_master(struct iwi_softc *sc)
1663 1.1 skrll {
1664 1.1 skrll int ntries;
1665 1.1 skrll
1666 1.1 skrll /* Disable interrupts */
1667 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_INTR_MASK, 0);
1668 1.1 skrll
1669 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_RST, IWI_RST_STOP_MASTER);
1670 1.1 skrll for (ntries = 0; ntries < 5; ntries++) {
1671 1.1 skrll if (CSR_READ_4(sc, IWI_CSR_RST) & IWI_RST_MASTER_DISABLED)
1672 1.1 skrll break;
1673 1.1 skrll DELAY(10);
1674 1.1 skrll }
1675 1.1 skrll if (ntries == 5)
1676 1.1 skrll aprint_error("%s: timeout waiting for master\n",
1677 1.1 skrll sc->sc_dev.dv_xname);
1678 1.1 skrll
1679 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_RST, CSR_READ_4(sc, IWI_CSR_RST) |
1680 1.1 skrll IWI_RST_PRINCETON_RESET);
1681 1.1 skrll
1682 1.1 skrll sc->flags &= ~IWI_FLAG_FW_INITED;
1683 1.1 skrll }
1684 1.1 skrll
1685 1.1 skrll static int
1686 1.1 skrll iwi_reset(struct iwi_softc *sc)
1687 1.1 skrll {
1688 1.1 skrll int i, ntries;
1689 1.1 skrll
1690 1.1 skrll iwi_stop_master(sc);
1691 1.1 skrll
1692 1.1 skrll /* Move adapter to D0 state */
1693 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_CTL, CSR_READ_4(sc, IWI_CSR_CTL) |
1694 1.1 skrll IWI_CTL_INIT);
1695 1.1 skrll
1696 1.1 skrll /* Initialize Phase-Locked Level (PLL) */
1697 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_READ_INT, IWI_READ_INT_INIT_HOST);
1698 1.1 skrll
1699 1.1 skrll /* Wait for clock stabilization */
1700 1.1 skrll for (ntries = 0; ntries < 1000; ntries++) {
1701 1.1 skrll if (CSR_READ_4(sc, IWI_CSR_CTL) & IWI_CTL_CLOCK_READY)
1702 1.1 skrll break;
1703 1.1 skrll DELAY(200);
1704 1.1 skrll }
1705 1.25 skrll if (ntries == 1000) {
1706 1.25 skrll aprint_error("%s: timeout waiting for clock stabilization\n",
1707 1.25 skrll sc->sc_dev.dv_xname);
1708 1.1 skrll return EIO;
1709 1.25 skrll }
1710 1.1 skrll
1711 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_RST, CSR_READ_4(sc, IWI_CSR_RST) |
1712 1.1 skrll IWI_RST_SW_RESET);
1713 1.1 skrll
1714 1.1 skrll DELAY(10);
1715 1.1 skrll
1716 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_CTL, CSR_READ_4(sc, IWI_CSR_CTL) |
1717 1.1 skrll IWI_CTL_INIT);
1718 1.1 skrll
1719 1.1 skrll /* Clear NIC memory */
1720 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_AUTOINC_ADDR, 0);
1721 1.1 skrll for (i = 0; i < 0xc000; i++)
1722 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_AUTOINC_DATA, 0);
1723 1.1 skrll
1724 1.1 skrll return 0;
1725 1.1 skrll }
1726 1.1 skrll
1727 1.1 skrll static int
1728 1.1 skrll iwi_load_ucode(struct iwi_softc *sc, void *uc, int size)
1729 1.1 skrll {
1730 1.24 skrll uint16_t *w;
1731 1.1 skrll int ntries, i;
1732 1.1 skrll
1733 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_RST, CSR_READ_4(sc, IWI_CSR_RST) |
1734 1.1 skrll IWI_RST_STOP_MASTER);
1735 1.1 skrll for (ntries = 0; ntries < 5; ntries++) {
1736 1.1 skrll if (CSR_READ_4(sc, IWI_CSR_RST) & IWI_RST_MASTER_DISABLED)
1737 1.1 skrll break;
1738 1.1 skrll DELAY(10);
1739 1.1 skrll }
1740 1.1 skrll if (ntries == 5) {
1741 1.1 skrll aprint_error("%s: timeout waiting for master\n",
1742 1.1 skrll sc->sc_dev.dv_xname);
1743 1.1 skrll return EIO;
1744 1.1 skrll }
1745 1.1 skrll
1746 1.1 skrll MEM_WRITE_4(sc, 0x3000e0, 0x80000000);
1747 1.1 skrll DELAY(5000);
1748 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_RST, CSR_READ_4(sc, IWI_CSR_RST) &
1749 1.1 skrll ~IWI_RST_PRINCETON_RESET);
1750 1.1 skrll DELAY(5000);
1751 1.1 skrll MEM_WRITE_4(sc, 0x3000e0, 0);
1752 1.1 skrll DELAY(1000);
1753 1.1 skrll MEM_WRITE_4(sc, 0x300004, 1);
1754 1.1 skrll DELAY(1000);
1755 1.1 skrll MEM_WRITE_4(sc, 0x300004, 0);
1756 1.1 skrll DELAY(1000);
1757 1.1 skrll MEM_WRITE_1(sc, 0x200000, 0x00);
1758 1.1 skrll MEM_WRITE_1(sc, 0x200000, 0x40);
1759 1.14 skrll DELAY(1000);
1760 1.1 skrll
1761 1.1 skrll /* Adapter is buggy, we must set the address for each word */
1762 1.1 skrll for (w = uc; size > 0; w++, size -= 2)
1763 1.32 scw MEM_WRITE_2(sc, 0x200010, htole16(*w));
1764 1.1 skrll
1765 1.1 skrll MEM_WRITE_1(sc, 0x200000, 0x00);
1766 1.1 skrll MEM_WRITE_1(sc, 0x200000, 0x80);
1767 1.1 skrll
1768 1.1 skrll /* Wait until we get a response in the uc queue */
1769 1.1 skrll for (ntries = 0; ntries < 100; ntries++) {
1770 1.1 skrll if (MEM_READ_1(sc, 0x200000) & 1)
1771 1.1 skrll break;
1772 1.1 skrll DELAY(100);
1773 1.1 skrll }
1774 1.1 skrll if (ntries == 100) {
1775 1.1 skrll aprint_error("%s: timeout waiting for ucode to initialize\n",
1776 1.1 skrll sc->sc_dev.dv_xname);
1777 1.1 skrll return EIO;
1778 1.1 skrll }
1779 1.1 skrll
1780 1.1 skrll /* Empty the uc queue or the firmware will not initialize properly */
1781 1.1 skrll for (i = 0; i < 7; i++)
1782 1.1 skrll MEM_READ_4(sc, 0x200004);
1783 1.1 skrll
1784 1.1 skrll MEM_WRITE_1(sc, 0x200000, 0x00);
1785 1.1 skrll
1786 1.1 skrll return 0;
1787 1.1 skrll }
1788 1.1 skrll
1789 1.1 skrll /* macro to handle unaligned little endian data in firmware image */
1790 1.1 skrll #define GETLE32(p) ((p)[0] | (p)[1] << 8 | (p)[2] << 16 | (p)[3] << 24)
1791 1.1 skrll static int
1792 1.1 skrll iwi_load_firmware(struct iwi_softc *sc, void *fw, int size)
1793 1.1 skrll {
1794 1.1 skrll bus_dmamap_t map;
1795 1.1 skrll u_char *p, *end;
1796 1.27 skrll uint32_t sentinel, ctl, sum;
1797 1.27 skrll uint32_t cs, sl, cd, cl;
1798 1.1 skrll int ntries, nsegs, error;
1799 1.27 skrll int sn;
1800 1.1 skrll
1801 1.27 skrll nsegs = (size + PAGE_SIZE - 1) / PAGE_SIZE;
1802 1.27 skrll
1803 1.28 skrll /* Create a DMA map for the firmware image */
1804 1.27 skrll error = bus_dmamap_create(sc->sc_dmat, size, nsegs, size, 0,
1805 1.1 skrll BUS_DMA_NOWAIT, &map);
1806 1.1 skrll if (error != 0) {
1807 1.1 skrll aprint_error("%s: could not create firmware DMA map\n",
1808 1.1 skrll sc->sc_dev.dv_xname);
1809 1.1 skrll goto fail1;
1810 1.1 skrll }
1811 1.1 skrll
1812 1.27 skrll error = bus_dmamap_load(sc->sc_dmat, map, fw, size, NULL,
1813 1.27 skrll BUS_DMA_NOWAIT | BUS_DMA_WRITE);
1814 1.1 skrll if (error != 0) {
1815 1.27 skrll aprint_error("%s: could not load fw dma map(%d)\n",
1816 1.27 skrll sc->sc_dev.dv_xname, error);
1817 1.1 skrll goto fail2;
1818 1.1 skrll }
1819 1.1 skrll
1820 1.1 skrll /* Make sure the adapter will get up-to-date values */
1821 1.1 skrll bus_dmamap_sync(sc->sc_dmat, map, 0, size, BUS_DMASYNC_PREWRITE);
1822 1.1 skrll
1823 1.1 skrll /* Tell the adapter where the command blocks are stored */
1824 1.1 skrll MEM_WRITE_4(sc, 0x3000a0, 0x27000);
1825 1.1 skrll
1826 1.1 skrll /*
1827 1.1 skrll * Store command blocks into adapter's internal memory using register
1828 1.1 skrll * indirections. The adapter will read the firmware image through DMA
1829 1.1 skrll * using information stored in command blocks.
1830 1.1 skrll */
1831 1.27 skrll p = fw;
1832 1.1 skrll end = p + size;
1833 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_AUTOINC_ADDR, 0x27000);
1834 1.1 skrll
1835 1.27 skrll sn = 0;
1836 1.27 skrll sl = cl = 0;
1837 1.27 skrll cs = cd = 0;
1838 1.1 skrll while (p < end) {
1839 1.27 skrll if (sl == 0) {
1840 1.27 skrll cs = map->dm_segs[sn].ds_addr;
1841 1.27 skrll sl = map->dm_segs[sn].ds_len;
1842 1.27 skrll sn++;
1843 1.27 skrll }
1844 1.27 skrll if (cl == 0) {
1845 1.27 skrll cd = GETLE32(p); p += 4; cs += 4; sl -= 4;
1846 1.27 skrll cl = GETLE32(p); p += 4; cs += 4; sl -= 4;
1847 1.27 skrll }
1848 1.27 skrll while (sl > 0 && cl > 0) {
1849 1.27 skrll int len = min(cl, sl);
1850 1.27 skrll
1851 1.27 skrll sl -= len;
1852 1.27 skrll cl -= len;
1853 1.27 skrll p += len;
1854 1.27 skrll
1855 1.27 skrll while (len > 0) {
1856 1.27 skrll int mlen = min(len, IWI_CB_MAXDATALEN);
1857 1.27 skrll
1858 1.27 skrll ctl = IWI_CB_DEFAULT_CTL | mlen;
1859 1.27 skrll sum = ctl ^ cs ^ cd;
1860 1.27 skrll
1861 1.27 skrll /* Write a command block */
1862 1.27 skrll CSR_WRITE_4(sc, IWI_CSR_AUTOINC_DATA, ctl);
1863 1.27 skrll CSR_WRITE_4(sc, IWI_CSR_AUTOINC_DATA, cs);
1864 1.27 skrll CSR_WRITE_4(sc, IWI_CSR_AUTOINC_DATA, cd);
1865 1.27 skrll CSR_WRITE_4(sc, IWI_CSR_AUTOINC_DATA, sum);
1866 1.27 skrll
1867 1.27 skrll cs += mlen;
1868 1.27 skrll cd += mlen;
1869 1.27 skrll len -= mlen;
1870 1.27 skrll }
1871 1.1 skrll }
1872 1.1 skrll }
1873 1.1 skrll
1874 1.1 skrll /* Write a fictive final command block (sentinel) */
1875 1.1 skrll sentinel = CSR_READ_4(sc, IWI_CSR_AUTOINC_ADDR);
1876 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_AUTOINC_DATA, 0);
1877 1.1 skrll
1878 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_RST, CSR_READ_4(sc, IWI_CSR_RST) &
1879 1.1 skrll ~(IWI_RST_MASTER_DISABLED | IWI_RST_STOP_MASTER));
1880 1.1 skrll
1881 1.1 skrll /* Tell the adapter to start processing command blocks */
1882 1.1 skrll MEM_WRITE_4(sc, 0x3000a4, 0x540100);
1883 1.1 skrll
1884 1.1 skrll /* Wait until the adapter has processed all command blocks */
1885 1.1 skrll for (ntries = 0; ntries < 400; ntries++) {
1886 1.1 skrll if (MEM_READ_4(sc, 0x3000d0) >= sentinel)
1887 1.1 skrll break;
1888 1.1 skrll DELAY(100);
1889 1.1 skrll }
1890 1.1 skrll if (ntries == 400) {
1891 1.1 skrll aprint_error("%s: timeout processing cb\n",
1892 1.1 skrll sc->sc_dev.dv_xname);
1893 1.1 skrll error = EIO;
1894 1.27 skrll goto fail2;
1895 1.1 skrll }
1896 1.1 skrll
1897 1.1 skrll /* We're done with command blocks processing */
1898 1.1 skrll MEM_WRITE_4(sc, 0x3000a4, 0x540c00);
1899 1.1 skrll
1900 1.1 skrll /* Allow interrupts so we know when the firmware is inited */
1901 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_INTR_MASK, IWI_INTR_MASK);
1902 1.1 skrll
1903 1.1 skrll /* Tell the adapter to initialize the firmware */
1904 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_RST, 0);
1905 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_CTL, CSR_READ_4(sc, IWI_CSR_CTL) |
1906 1.1 skrll IWI_CTL_ALLOW_STANDBY);
1907 1.1 skrll
1908 1.1 skrll /* Wait at most one second for firmware initialization to complete */
1909 1.1 skrll if ((error = tsleep(sc, 0, "iwiinit", hz)) != 0) {
1910 1.1 skrll aprint_error("%s: timeout waiting for firmware initialization "
1911 1.1 skrll "to complete\n", sc->sc_dev.dv_xname);
1912 1.27 skrll goto fail3;
1913 1.1 skrll }
1914 1.1 skrll
1915 1.27 skrll fail3:
1916 1.27 skrll bus_dmamap_sync(sc->sc_dmat, map, 0, size, BUS_DMASYNC_POSTWRITE);
1917 1.1 skrll bus_dmamap_unload(sc->sc_dmat, map);
1918 1.27 skrll fail2:
1919 1.27 skrll bus_dmamap_destroy(sc->sc_dmat, map);
1920 1.5 perry
1921 1.27 skrll fail1:
1922 1.27 skrll return error;
1923 1.1 skrll }
1924 1.1 skrll
1925 1.1 skrll /*
1926 1.1 skrll * Store firmware into kernel memory so we can download it when we need to,
1927 1.1 skrll * e.g when the adapter wakes up from suspend mode.
1928 1.1 skrll */
1929 1.1 skrll static int
1930 1.1 skrll iwi_cache_firmware(struct iwi_softc *sc, void *data)
1931 1.1 skrll {
1932 1.1 skrll struct iwi_firmware *kfw = &sc->fw;
1933 1.1 skrll struct iwi_firmware ufw;
1934 1.1 skrll int error;
1935 1.1 skrll
1936 1.1 skrll iwi_free_firmware(sc);
1937 1.1 skrll
1938 1.1 skrll if ((error = copyin(data, &ufw, sizeof ufw)) != 0)
1939 1.1 skrll goto fail1;
1940 1.1 skrll
1941 1.1 skrll kfw->boot_size = ufw.boot_size;
1942 1.1 skrll kfw->ucode_size = ufw.ucode_size;
1943 1.1 skrll kfw->main_size = ufw.main_size;
1944 1.1 skrll
1945 1.1 skrll kfw->boot = malloc(kfw->boot_size, M_DEVBUF, M_NOWAIT);
1946 1.1 skrll if (kfw->boot == NULL) {
1947 1.1 skrll error = ENOMEM;
1948 1.1 skrll goto fail1;
1949 1.1 skrll }
1950 1.1 skrll
1951 1.1 skrll kfw->ucode = malloc(kfw->ucode_size, M_DEVBUF, M_NOWAIT);
1952 1.1 skrll if (kfw->ucode == NULL) {
1953 1.1 skrll error = ENOMEM;
1954 1.1 skrll goto fail2;
1955 1.1 skrll }
1956 1.1 skrll
1957 1.1 skrll kfw->main = malloc(kfw->main_size, M_DEVBUF, M_NOWAIT);
1958 1.1 skrll if (kfw->main == NULL) {
1959 1.1 skrll error = ENOMEM;
1960 1.1 skrll goto fail3;
1961 1.1 skrll }
1962 1.1 skrll
1963 1.1 skrll if ((error = copyin(ufw.boot, kfw->boot, kfw->boot_size)) != 0)
1964 1.1 skrll goto fail4;
1965 1.1 skrll
1966 1.1 skrll if ((error = copyin(ufw.ucode, kfw->ucode, kfw->ucode_size)) != 0)
1967 1.1 skrll goto fail4;
1968 1.1 skrll
1969 1.1 skrll if ((error = copyin(ufw.main, kfw->main, kfw->main_size)) != 0)
1970 1.1 skrll goto fail4;
1971 1.1 skrll
1972 1.1 skrll DPRINTF(("Firmware cached: boot %u, ucode %u, main %u\n",
1973 1.1 skrll kfw->boot_size, kfw->ucode_size, kfw->main_size));
1974 1.1 skrll
1975 1.1 skrll sc->flags |= IWI_FLAG_FW_CACHED;
1976 1.1 skrll
1977 1.1 skrll return 0;
1978 1.1 skrll
1979 1.1 skrll fail4: free(kfw->boot, M_DEVBUF);
1980 1.1 skrll fail3: free(kfw->ucode, M_DEVBUF);
1981 1.1 skrll fail2: free(kfw->main, M_DEVBUF);
1982 1.1 skrll fail1:
1983 1.1 skrll return error;
1984 1.1 skrll }
1985 1.1 skrll
1986 1.1 skrll static void
1987 1.1 skrll iwi_free_firmware(struct iwi_softc *sc)
1988 1.1 skrll {
1989 1.1 skrll if (!(sc->flags & IWI_FLAG_FW_CACHED))
1990 1.1 skrll return;
1991 1.5 perry
1992 1.1 skrll free(sc->fw.boot, M_DEVBUF);
1993 1.1 skrll free(sc->fw.ucode, M_DEVBUF);
1994 1.1 skrll free(sc->fw.main, M_DEVBUF);
1995 1.1 skrll
1996 1.1 skrll sc->flags &= ~IWI_FLAG_FW_CACHED;
1997 1.1 skrll }
1998 1.1 skrll
1999 1.1 skrll static int
2000 1.1 skrll iwi_config(struct iwi_softc *sc)
2001 1.1 skrll {
2002 1.1 skrll struct ieee80211com *ic = &sc->sc_ic;
2003 1.9 dyoung struct ifnet *ifp = &sc->sc_if;
2004 1.1 skrll struct iwi_configuration config;
2005 1.1 skrll struct iwi_rateset rs;
2006 1.1 skrll struct iwi_txpower power;
2007 1.12 christos struct ieee80211_key *wk;
2008 1.1 skrll struct iwi_wep_key wepkey;
2009 1.24 skrll uint32_t data;
2010 1.1 skrll int error, i;
2011 1.1 skrll
2012 1.1 skrll IEEE80211_ADDR_COPY(ic->ic_myaddr, LLADDR(ifp->if_sadl));
2013 1.1 skrll DPRINTF(("Setting MAC address to %s\n", ether_sprintf(ic->ic_myaddr)));
2014 1.1 skrll error = iwi_cmd(sc, IWI_CMD_SET_MAC_ADDRESS, ic->ic_myaddr,
2015 1.1 skrll IEEE80211_ADDR_LEN, 0);
2016 1.1 skrll if (error != 0)
2017 1.1 skrll return error;
2018 1.1 skrll
2019 1.1 skrll memset(&config, 0, sizeof config);
2020 1.12 christos config.bluetooth_coexistence = sc->bluetooth;
2021 1.12 christos config.antenna = sc->antenna;
2022 1.1 skrll config.multicast_enabled = 1;
2023 1.12 christos config.answer_pbreq = (ic->ic_opmode == IEEE80211_M_IBSS) ? 1 : 0;
2024 1.12 christos config.disable_unicast_decryption = 1;
2025 1.12 christos config.disable_multicast_decryption = 1;
2026 1.1 skrll DPRINTF(("Configuring adapter\n"));
2027 1.1 skrll error = iwi_cmd(sc, IWI_CMD_SET_CONFIGURATION, &config, sizeof config,
2028 1.1 skrll 0);
2029 1.1 skrll if (error != 0)
2030 1.1 skrll return error;
2031 1.1 skrll
2032 1.1 skrll data = htole32(IWI_POWER_MODE_CAM);
2033 1.1 skrll DPRINTF(("Setting power mode to %u\n", le32toh(data)));
2034 1.1 skrll error = iwi_cmd(sc, IWI_CMD_SET_POWER_MODE, &data, sizeof data, 0);
2035 1.1 skrll if (error != 0)
2036 1.1 skrll return error;
2037 1.1 skrll
2038 1.1 skrll data = htole32(ic->ic_rtsthreshold);
2039 1.1 skrll DPRINTF(("Setting RTS threshold to %u\n", le32toh(data)));
2040 1.1 skrll error = iwi_cmd(sc, IWI_CMD_SET_RTS_THRESHOLD, &data, sizeof data, 0);
2041 1.1 skrll if (error != 0)
2042 1.1 skrll return error;
2043 1.1 skrll
2044 1.12 christos data = htole32(ic->ic_fragthreshold);
2045 1.12 christos DPRINTF(("Setting fragmentation threshold to %u\n", le32toh(data)));
2046 1.12 christos error = iwi_cmd(sc, IWI_CMD_SET_FRAG_THRESHOLD, &data, sizeof data, 0);
2047 1.12 christos if (error != 0)
2048 1.12 christos return error;
2049 1.12 christos
2050 1.1 skrll if (ic->ic_opmode == IEEE80211_M_IBSS) {
2051 1.1 skrll power.mode = IWI_MODE_11B;
2052 1.1 skrll power.nchan = 11;
2053 1.1 skrll for (i = 0; i < 11; i++) {
2054 1.1 skrll power.chan[i].chan = i + 1;
2055 1.1 skrll power.chan[i].power = IWI_TXPOWER_MAX;
2056 1.1 skrll }
2057 1.1 skrll DPRINTF(("Setting .11b channels tx power\n"));
2058 1.1 skrll error = iwi_cmd(sc, IWI_CMD_SET_TX_POWER, &power, sizeof power,
2059 1.1 skrll 0);
2060 1.1 skrll if (error != 0)
2061 1.1 skrll return error;
2062 1.1 skrll
2063 1.1 skrll power.mode = IWI_MODE_11G;
2064 1.1 skrll DPRINTF(("Setting .11g channels tx power\n"));
2065 1.1 skrll error = iwi_cmd(sc, IWI_CMD_SET_TX_POWER, &power, sizeof power,
2066 1.1 skrll 0);
2067 1.1 skrll if (error != 0)
2068 1.1 skrll return error;
2069 1.1 skrll }
2070 1.1 skrll
2071 1.1 skrll rs.mode = IWI_MODE_11G;
2072 1.1 skrll rs.type = IWI_RATESET_TYPE_SUPPORTED;
2073 1.1 skrll rs.nrates = ic->ic_sup_rates[IEEE80211_MODE_11G].rs_nrates;
2074 1.1 skrll memcpy(rs.rates, ic->ic_sup_rates[IEEE80211_MODE_11G].rs_rates,
2075 1.1 skrll rs.nrates);
2076 1.1 skrll DPRINTF(("Setting .11bg supported rates (%u)\n", rs.nrates));
2077 1.1 skrll error = iwi_cmd(sc, IWI_CMD_SET_RATES, &rs, sizeof rs, 0);
2078 1.1 skrll if (error != 0)
2079 1.1 skrll return error;
2080 1.1 skrll
2081 1.1 skrll rs.mode = IWI_MODE_11A;
2082 1.1 skrll rs.type = IWI_RATESET_TYPE_SUPPORTED;
2083 1.1 skrll rs.nrates = ic->ic_sup_rates[IEEE80211_MODE_11A].rs_nrates;
2084 1.1 skrll memcpy(rs.rates, ic->ic_sup_rates[IEEE80211_MODE_11A].rs_rates,
2085 1.1 skrll rs.nrates);
2086 1.1 skrll DPRINTF(("Setting .11a supported rates (%u)\n", rs.nrates));
2087 1.1 skrll error = iwi_cmd(sc, IWI_CMD_SET_RATES, &rs, sizeof rs, 0);
2088 1.1 skrll if (error != 0)
2089 1.1 skrll return error;
2090 1.1 skrll
2091 1.1 skrll data = htole32(arc4random());
2092 1.1 skrll DPRINTF(("Setting initialization vector to %u\n", le32toh(data)));
2093 1.1 skrll error = iwi_cmd(sc, IWI_CMD_SET_IV, &data, sizeof data, 0);
2094 1.1 skrll if (error != 0)
2095 1.1 skrll return error;
2096 1.1 skrll
2097 1.12 christos for (i = 0; i < IEEE80211_WEP_NKID; i++) {
2098 1.12 christos wk = &ic->ic_crypto.cs_nw_keys[i];
2099 1.12 christos
2100 1.12 christos wepkey.cmd = IWI_WEP_KEY_CMD_SETKEY;
2101 1.12 christos wepkey.idx = i;
2102 1.12 christos wepkey.len = wk->wk_keylen;
2103 1.12 christos memset(wepkey.key, 0, sizeof wepkey.key);
2104 1.12 christos memcpy(wepkey.key, wk->wk_key, wk->wk_keylen);
2105 1.12 christos DPRINTF(("Setting wep key index %u len %u\n",
2106 1.12 christos wepkey.idx, wepkey.len));
2107 1.12 christos error = iwi_cmd(sc, IWI_CMD_SET_WEP_KEY, &wepkey,
2108 1.12 christos sizeof wepkey, 0);
2109 1.12 christos if (error != 0)
2110 1.12 christos return error;
2111 1.1 skrll }
2112 1.1 skrll
2113 1.1 skrll /* Enable adapter */
2114 1.1 skrll DPRINTF(("Enabling adapter\n"));
2115 1.1 skrll return iwi_cmd(sc, IWI_CMD_ENABLE, NULL, 0, 0);
2116 1.1 skrll }
2117 1.1 skrll
2118 1.1 skrll static int
2119 1.8 sekiya iwi_set_chan(struct iwi_softc *sc, struct ieee80211_channel *chan)
2120 1.8 sekiya {
2121 1.8 sekiya struct ieee80211com *ic = &sc->sc_ic;
2122 1.30 skrll struct iwi_scan_v2 scan;
2123 1.8 sekiya
2124 1.12 christos (void)memset(&scan, 0, sizeof scan);
2125 1.30 skrll
2126 1.30 skrll scan.dwelltime[IWI_SCAN_TYPE_PASSIVE] = htole16(2000);
2127 1.30 skrll scan.channels[0] = 1 |
2128 1.30 skrll (IEEE80211_IS_CHAN_5GHZ(chan) ? IWI_CHAN_5GHZ : IWI_CHAN_2GHZ);
2129 1.8 sekiya scan.channels[1] = ieee80211_chan2ieee(ic, chan);
2130 1.30 skrll iwi_scan_type_set(scan, 1, IWI_SCAN_TYPE_PASSIVE);
2131 1.8 sekiya
2132 1.8 sekiya DPRINTF(("Setting channel to %u\n", ieee80211_chan2ieee(ic, chan)));
2133 1.30 skrll return iwi_cmd(sc, IWI_CMD_SCAN_V2, &scan, sizeof scan, 1);
2134 1.8 sekiya }
2135 1.8 sekiya
2136 1.8 sekiya static int
2137 1.1 skrll iwi_scan(struct iwi_softc *sc)
2138 1.1 skrll {
2139 1.1 skrll struct ieee80211com *ic = &sc->sc_ic;
2140 1.26 skrll struct iwi_scan_v2 scan;
2141 1.26 skrll uint32_t type;
2142 1.24 skrll uint8_t *p;
2143 1.26 skrll int i, count, idx;
2144 1.1 skrll
2145 1.12 christos (void)memset(&scan, 0, sizeof scan);
2146 1.26 skrll scan.dwelltime[IWI_SCAN_TYPE_ACTIVE_BROADCAST] =
2147 1.26 skrll htole16(sc->dwelltime);
2148 1.26 skrll scan.dwelltime[IWI_SCAN_TYPE_ACTIVE_BDIRECT] =
2149 1.26 skrll htole16(sc->dwelltime);
2150 1.26 skrll
2151 1.26 skrll /* tell the firmware about the desired essid */
2152 1.26 skrll if (ic->ic_des_esslen) {
2153 1.26 skrll int error;
2154 1.26 skrll
2155 1.26 skrll DPRINTF(("%s: Setting adapter desired ESSID to %s\n",
2156 1.26 skrll __func__, ic->ic_des_essid));
2157 1.26 skrll
2158 1.26 skrll error = iwi_cmd(sc, IWI_CMD_SET_ESSID,
2159 1.26 skrll ic->ic_des_essid, ic->ic_des_esslen, 1);
2160 1.26 skrll if (error)
2161 1.26 skrll return error;
2162 1.26 skrll
2163 1.26 skrll type = IWI_SCAN_TYPE_ACTIVE_BDIRECT;
2164 1.26 skrll } else {
2165 1.26 skrll type = IWI_SCAN_TYPE_ACTIVE_BROADCAST;
2166 1.26 skrll }
2167 1.1 skrll
2168 1.26 skrll p = &scan.channels[0];
2169 1.26 skrll count = idx = 0;
2170 1.1 skrll for (i = 0; i <= IEEE80211_CHAN_MAX; i++) {
2171 1.1 skrll if (IEEE80211_IS_CHAN_5GHZ(&ic->ic_channels[i]) &&
2172 1.1 skrll isset(ic->ic_chan_active, i)) {
2173 1.1 skrll *++p = i;
2174 1.1 skrll count++;
2175 1.26 skrll idx++;
2176 1.26 skrll iwi_scan_type_set(scan, idx, type);
2177 1.1 skrll }
2178 1.1 skrll }
2179 1.26 skrll if (count) {
2180 1.26 skrll *(p - count) = IWI_CHAN_5GHZ | count;
2181 1.26 skrll p++;
2182 1.26 skrll }
2183 1.1 skrll
2184 1.1 skrll count = 0;
2185 1.1 skrll for (i = 0; i <= IEEE80211_CHAN_MAX; i++) {
2186 1.1 skrll if (IEEE80211_IS_CHAN_2GHZ(&ic->ic_channels[i]) &&
2187 1.1 skrll isset(ic->ic_chan_active, i)) {
2188 1.1 skrll *++p = i;
2189 1.1 skrll count++;
2190 1.26 skrll idx++;
2191 1.26 skrll iwi_scan_type_set(scan, idx, type);
2192 1.1 skrll }
2193 1.1 skrll }
2194 1.1 skrll *(p - count) = IWI_CHAN_2GHZ | count;
2195 1.1 skrll
2196 1.1 skrll DPRINTF(("Start scanning\n"));
2197 1.26 skrll return iwi_cmd(sc, IWI_CMD_SCAN_V2, &scan, sizeof scan, 1);
2198 1.1 skrll }
2199 1.1 skrll
2200 1.1 skrll static int
2201 1.1 skrll iwi_auth_and_assoc(struct iwi_softc *sc)
2202 1.1 skrll {
2203 1.1 skrll struct ieee80211com *ic = &sc->sc_ic;
2204 1.1 skrll struct ieee80211_node *ni = ic->ic_bss;
2205 1.12 christos struct ifnet *ifp = &sc->sc_if;
2206 1.1 skrll struct iwi_configuration config;
2207 1.1 skrll struct iwi_associate assoc;
2208 1.1 skrll struct iwi_rateset rs;
2209 1.24 skrll uint16_t capinfo;
2210 1.24 skrll uint32_t data;
2211 1.1 skrll int error;
2212 1.1 skrll
2213 1.1 skrll if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan)) {
2214 1.1 skrll memset(&config, 0, sizeof config);
2215 1.12 christos config.bluetooth_coexistence = sc->bluetooth;
2216 1.12 christos config.antenna = sc->antenna;
2217 1.1 skrll config.multicast_enabled = 1;
2218 1.12 christos config.use_protection = 1;
2219 1.12 christos config.answer_pbreq =
2220 1.12 christos (ic->ic_opmode == IEEE80211_M_IBSS) ? 1 : 0;
2221 1.12 christos config.disable_unicast_decryption = 1;
2222 1.12 christos config.disable_multicast_decryption = 1;
2223 1.1 skrll DPRINTF(("Configuring adapter\n"));
2224 1.1 skrll error = iwi_cmd(sc, IWI_CMD_SET_CONFIGURATION, &config,
2225 1.1 skrll sizeof config, 1);
2226 1.1 skrll if (error != 0)
2227 1.1 skrll return error;
2228 1.1 skrll }
2229 1.1 skrll
2230 1.1 skrll #ifdef IWI_DEBUG
2231 1.1 skrll if (iwi_debug > 0) {
2232 1.1 skrll printf("Setting ESSID to ");
2233 1.1 skrll ieee80211_print_essid(ni->ni_essid, ni->ni_esslen);
2234 1.1 skrll printf("\n");
2235 1.1 skrll }
2236 1.1 skrll #endif
2237 1.1 skrll error = iwi_cmd(sc, IWI_CMD_SET_ESSID, ni->ni_essid, ni->ni_esslen, 1);
2238 1.1 skrll if (error != 0)
2239 1.1 skrll return error;
2240 1.1 skrll
2241 1.22 skrll /* the rate set has already been "negotiated" */
2242 1.1 skrll rs.mode = IEEE80211_IS_CHAN_5GHZ(ni->ni_chan) ? IWI_MODE_11A :
2243 1.1 skrll IWI_MODE_11G;
2244 1.22 skrll rs.type = IWI_RATESET_TYPE_NEGOTIATED;
2245 1.1 skrll rs.nrates = ni->ni_rates.rs_nrates;
2246 1.1 skrll memcpy(rs.rates, ni->ni_rates.rs_rates, rs.nrates);
2247 1.22 skrll DPRINTF(("Setting negotiated rates (%u)\n", rs.nrates));
2248 1.1 skrll error = iwi_cmd(sc, IWI_CMD_SET_RATES, &rs, sizeof rs, 1);
2249 1.1 skrll if (error != 0)
2250 1.1 skrll return error;
2251 1.1 skrll
2252 1.12 christos if (ic->ic_opt_ie != NULL) {
2253 1.12 christos DPRINTF(("Setting optional IE (len=%u)\n", ic->ic_opt_ie_len));
2254 1.12 christos error = iwi_cmd(sc, IWI_CMD_SET_OPTIE, ic->ic_opt_ie,
2255 1.12 christos ic->ic_opt_ie_len, 1);
2256 1.12 christos if (error != 0)
2257 1.12 christos return error;
2258 1.12 christos }
2259 1.1 skrll data = htole32(ni->ni_rssi);
2260 1.1 skrll DPRINTF(("Setting sensitivity to %d\n", (int8_t)ni->ni_rssi));
2261 1.1 skrll error = iwi_cmd(sc, IWI_CMD_SET_SENSITIVITY, &data, sizeof data, 1);
2262 1.1 skrll if (error != 0)
2263 1.1 skrll return error;
2264 1.1 skrll
2265 1.1 skrll memset(&assoc, 0, sizeof assoc);
2266 1.1 skrll assoc.mode = IEEE80211_IS_CHAN_5GHZ(ni->ni_chan) ? IWI_MODE_11A :
2267 1.1 skrll IWI_MODE_11G;
2268 1.1 skrll assoc.chan = ieee80211_chan2ieee(ic, ni->ni_chan);
2269 1.12 christos if (ni->ni_authmode == IEEE80211_AUTH_SHARED)
2270 1.12 christos assoc.auth = (ic->ic_crypto.cs_def_txkey << 4) | IWI_AUTH_SHARED;
2271 1.12 christos if (ic->ic_opt_ie != NULL)
2272 1.12 christos assoc.policy |= htole16(IWI_POLICY_OPTIE);
2273 1.9 dyoung memcpy(assoc.tstamp, ni->ni_tstamp.data, 8);
2274 1.12 christos
2275 1.12 christos if (ic->ic_opmode == IEEE80211_M_IBSS)
2276 1.12 christos capinfo = IEEE80211_CAPINFO_IBSS;
2277 1.12 christos else
2278 1.12 christos capinfo = IEEE80211_CAPINFO_ESS;
2279 1.12 christos if (ic->ic_flags & IEEE80211_F_PRIVACY)
2280 1.12 christos capinfo |= IEEE80211_CAPINFO_PRIVACY;
2281 1.12 christos if ((ic->ic_flags & IEEE80211_F_SHPREAMBLE) &&
2282 1.12 christos IEEE80211_IS_CHAN_2GHZ(ni->ni_chan))
2283 1.12 christos capinfo |= IEEE80211_CAPINFO_SHORT_PREAMBLE;
2284 1.12 christos if (ic->ic_flags & IEEE80211_F_SHSLOT)
2285 1.12 christos capinfo |= IEEE80211_CAPINFO_SHORT_SLOTTIME;
2286 1.12 christos assoc.capinfo = htole16(capinfo);
2287 1.12 christos
2288 1.1 skrll assoc.lintval = htole16(ic->ic_lintval);
2289 1.1 skrll assoc.intval = htole16(ni->ni_intval);
2290 1.1 skrll IEEE80211_ADDR_COPY(assoc.bssid, ni->ni_bssid);
2291 1.12 christos if (ic->ic_opmode == IEEE80211_M_IBSS)
2292 1.12 christos IEEE80211_ADDR_COPY(assoc.dst, ifp->if_broadcastaddr);
2293 1.12 christos else
2294 1.12 christos IEEE80211_ADDR_COPY(assoc.dst, ni->ni_bssid);
2295 1.1 skrll DPRINTF(("Trying to associate to %s channel %u auth %u\n",
2296 1.1 skrll ether_sprintf(assoc.bssid), assoc.chan, assoc.auth));
2297 1.1 skrll return iwi_cmd(sc, IWI_CMD_ASSOCIATE, &assoc, sizeof assoc, 1);
2298 1.1 skrll }
2299 1.1 skrll
2300 1.1 skrll static int
2301 1.1 skrll iwi_init(struct ifnet *ifp)
2302 1.1 skrll {
2303 1.1 skrll struct iwi_softc *sc = ifp->if_softc;
2304 1.1 skrll struct ieee80211com *ic = &sc->sc_ic;
2305 1.1 skrll struct iwi_firmware *fw = &sc->fw;
2306 1.1 skrll int i, error;
2307 1.1 skrll
2308 1.1 skrll /* exit immediately if firmware has not been ioctl'd */
2309 1.1 skrll if (!(sc->flags & IWI_FLAG_FW_CACHED)) {
2310 1.12 christos if (!(sc->flags & IWI_FLAG_FW_WARNED))
2311 1.12 christos aprint_error("%s: Firmware not loaded\n",
2312 1.12 christos sc->sc_dev.dv_xname);
2313 1.12 christos sc->flags |= IWI_FLAG_FW_WARNED;
2314 1.1 skrll ifp->if_flags &= ~IFF_UP;
2315 1.1 skrll return EIO;
2316 1.1 skrll }
2317 1.1 skrll
2318 1.12 christos iwi_stop(ifp, 0);
2319 1.12 christos
2320 1.1 skrll if ((error = iwi_reset(sc)) != 0) {
2321 1.1 skrll aprint_error("%s: could not reset adapter\n",
2322 1.1 skrll sc->sc_dev.dv_xname);
2323 1.1 skrll goto fail;
2324 1.1 skrll }
2325 1.1 skrll
2326 1.1 skrll if ((error = iwi_load_firmware(sc, fw->boot, fw->boot_size)) != 0) {
2327 1.1 skrll aprint_error("%s: could not load boot firmware\n",
2328 1.1 skrll sc->sc_dev.dv_xname);
2329 1.1 skrll goto fail;
2330 1.1 skrll }
2331 1.1 skrll
2332 1.1 skrll if ((error = iwi_load_ucode(sc, fw->ucode, fw->ucode_size)) != 0) {
2333 1.1 skrll aprint_error("%s: could not load microcode\n",
2334 1.1 skrll sc->sc_dev.dv_xname);
2335 1.1 skrll goto fail;
2336 1.1 skrll }
2337 1.1 skrll
2338 1.1 skrll iwi_stop_master(sc);
2339 1.1 skrll
2340 1.14 skrll CSR_WRITE_4(sc, IWI_CSR_CMD_BASE, sc->cmdq.desc_map->dm_segs[0].ds_addr);
2341 1.14 skrll CSR_WRITE_4(sc, IWI_CSR_CMD_SIZE, sc->cmdq.count);
2342 1.14 skrll CSR_WRITE_4(sc, IWI_CSR_CMD_WIDX, sc->cmdq.cur);
2343 1.14 skrll
2344 1.14 skrll CSR_WRITE_4(sc, IWI_CSR_TX1_BASE, sc->txq.desc_map->dm_segs[0].ds_addr);
2345 1.14 skrll CSR_WRITE_4(sc, IWI_CSR_TX1_SIZE, sc->txq.count);
2346 1.14 skrll CSR_WRITE_4(sc, IWI_CSR_TX1_WIDX, sc->txq.cur);
2347 1.14 skrll
2348 1.14 skrll CSR_WRITE_4(sc, IWI_CSR_TX2_BASE, sc->txq.desc_map->dm_segs[0].ds_addr);
2349 1.14 skrll CSR_WRITE_4(sc, IWI_CSR_TX2_SIZE, sc->txq.count);
2350 1.14 skrll CSR_WRITE_4(sc, IWI_CSR_TX2_WIDX, sc->txq.cur);
2351 1.14 skrll
2352 1.14 skrll CSR_WRITE_4(sc, IWI_CSR_TX3_BASE, sc->txq.desc_map->dm_segs[0].ds_addr);
2353 1.14 skrll CSR_WRITE_4(sc, IWI_CSR_TX3_SIZE, sc->txq.count);
2354 1.14 skrll CSR_WRITE_4(sc, IWI_CSR_TX3_WIDX, sc->txq.cur);
2355 1.14 skrll
2356 1.14 skrll CSR_WRITE_4(sc, IWI_CSR_TX4_BASE, sc->txq.desc_map->dm_segs[0].ds_addr);
2357 1.14 skrll CSR_WRITE_4(sc, IWI_CSR_TX4_SIZE, sc->txq.count);
2358 1.14 skrll CSR_WRITE_4(sc, IWI_CSR_TX4_WIDX, sc->txq.cur);
2359 1.1 skrll
2360 1.14 skrll for (i = 0; i < sc->rxq.count; i++)
2361 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_RX_BASE + i * 4,
2362 1.14 skrll sc->rxq.data[i].map->dm_segs[0].ds_addr);
2363 1.1 skrll
2364 1.14 skrll CSR_WRITE_4(sc, IWI_CSR_RX_WIDX, sc->rxq.count -1);
2365 1.1 skrll
2366 1.1 skrll if ((error = iwi_load_firmware(sc, fw->main, fw->main_size)) != 0) {
2367 1.1 skrll aprint_error("%s: could not load main firmware\n",
2368 1.1 skrll sc->sc_dev.dv_xname);
2369 1.1 skrll goto fail;
2370 1.1 skrll }
2371 1.1 skrll
2372 1.1 skrll sc->flags |= IWI_FLAG_FW_INITED;
2373 1.1 skrll
2374 1.1 skrll if ((error = iwi_config(sc)) != 0) {
2375 1.1 skrll aprint_error("%s: device configuration failed\n",
2376 1.1 skrll sc->sc_dev.dv_xname);
2377 1.1 skrll goto fail;
2378 1.1 skrll }
2379 1.1 skrll
2380 1.12 christos if (ic->ic_opmode == IEEE80211_M_MONITOR)
2381 1.12 christos ieee80211_new_state(ic, IEEE80211_S_RUN, -1);
2382 1.8 sekiya else
2383 1.12 christos ieee80211_new_state(ic, IEEE80211_S_SCAN, -1);
2384 1.1 skrll
2385 1.1 skrll ifp->if_flags &= ~IFF_OACTIVE;
2386 1.1 skrll ifp->if_flags |= IFF_RUNNING;
2387 1.1 skrll
2388 1.1 skrll return 0;
2389 1.1 skrll
2390 1.14 skrll fail: ifp->if_flags &= ~IFF_UP;
2391 1.14 skrll iwi_stop(ifp, 0);
2392 1.1 skrll
2393 1.1 skrll return error;
2394 1.1 skrll }
2395 1.1 skrll
2396 1.1 skrll static void
2397 1.1 skrll iwi_stop(struct ifnet *ifp, int disable)
2398 1.1 skrll {
2399 1.1 skrll struct iwi_softc *sc = ifp->if_softc;
2400 1.1 skrll struct ieee80211com *ic = &sc->sc_ic;
2401 1.1 skrll
2402 1.1 skrll iwi_stop_master(sc);
2403 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_RST, IWI_RST_SW_RESET);
2404 1.1 skrll
2405 1.14 skrll /* reset rings */
2406 1.14 skrll iwi_reset_cmd_ring(sc, &sc->cmdq);
2407 1.14 skrll iwi_reset_tx_ring(sc, &sc->txq);
2408 1.14 skrll iwi_reset_rx_ring(sc, &sc->rxq);
2409 1.1 skrll
2410 1.1 skrll ifp->if_timer = 0;
2411 1.1 skrll ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
2412 1.1 skrll
2413 1.1 skrll ieee80211_new_state(ic, IEEE80211_S_INIT, -1);
2414 1.1 skrll }
2415 1.36 skrll
2416 1.36 skrll static void
2417 1.36 skrll iwi_error_log(struct iwi_softc *sc)
2418 1.36 skrll {
2419 1.36 skrll uint32_t b, n;
2420 1.36 skrll int i;
2421 1.36 skrll
2422 1.36 skrll static const char *const msg[] = {
2423 1.36 skrll "no error",
2424 1.36 skrll "failed",
2425 1.36 skrll "memory range low",
2426 1.36 skrll "memory range high",
2427 1.36 skrll "bad parameter",
2428 1.36 skrll "checksum",
2429 1.36 skrll "NMI",
2430 1.36 skrll "bad database",
2431 1.36 skrll "allocation failed",
2432 1.36 skrll "DMA underrun",
2433 1.36 skrll "DMA status",
2434 1.36 skrll "DINO",
2435 1.36 skrll "EEPROM",
2436 1.36 skrll "device assert",
2437 1.36 skrll "fatal"
2438 1.36 skrll };
2439 1.36 skrll
2440 1.36 skrll b = CSR_READ_4(sc, IWI_CSR_ERRORLOG);
2441 1.36 skrll n = MEM_READ_4(sc, b);
2442 1.36 skrll
2443 1.36 skrll b += 4;
2444 1.36 skrll
2445 1.36 skrll for (i = 0; i < n ; i++) {
2446 1.36 skrll struct iwi_error fw_error;
2447 1.36 skrll
2448 1.36 skrll MEM_CPY(sc, &fw_error, b, sizeof(fw_error));
2449 1.36 skrll
2450 1.37 skrll printf("%s: %s\n", sc->sc_dev.dv_xname,
2451 1.37 skrll msg[fw_error.type]);
2452 1.36 skrll
2453 1.36 skrll b += sizeof(fw_error);
2454 1.36 skrll }
2455 1.36 skrll }
2456