if_iwi.c revision 1.56 1 1.56 jmcneill /* $NetBSD: if_iwi.c,v 1.56 2006/09/24 03:53:09 jmcneill 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.56 jmcneill __KERNEL_RCSID(0, "$NetBSD: if_iwi.c,v 1.56 2006/09/24 03:53:09 jmcneill 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.48 elad #include <sys/kauth.h>
50 1.1 skrll
51 1.1 skrll #include <machine/bus.h>
52 1.1 skrll #include <machine/endian.h>
53 1.1 skrll #include <machine/intr.h>
54 1.1 skrll
55 1.52 skrll #include <dev/firmload.h>
56 1.52 skrll
57 1.1 skrll #include <dev/pci/pcireg.h>
58 1.1 skrll #include <dev/pci/pcivar.h>
59 1.1 skrll #include <dev/pci/pcidevs.h>
60 1.1 skrll
61 1.1 skrll #if NBPFILTER > 0
62 1.1 skrll #include <net/bpf.h>
63 1.1 skrll #endif
64 1.1 skrll #include <net/if.h>
65 1.1 skrll #include <net/if_arp.h>
66 1.1 skrll #include <net/if_dl.h>
67 1.1 skrll #include <net/if_ether.h>
68 1.1 skrll #include <net/if_media.h>
69 1.1 skrll #include <net/if_types.h>
70 1.1 skrll
71 1.1 skrll #include <net80211/ieee80211_var.h>
72 1.1 skrll #include <net80211/ieee80211_radiotap.h>
73 1.1 skrll
74 1.1 skrll #include <netinet/in.h>
75 1.1 skrll #include <netinet/in_systm.h>
76 1.1 skrll #include <netinet/in_var.h>
77 1.1 skrll #include <netinet/ip.h>
78 1.1 skrll
79 1.1 skrll #include <crypto/arc4/arc4.h>
80 1.1 skrll
81 1.1 skrll #include <dev/pci/if_iwireg.h>
82 1.1 skrll #include <dev/pci/if_iwivar.h>
83 1.1 skrll
84 1.20 skrll #ifdef IWI_DEBUG
85 1.20 skrll #define DPRINTF(x) if (iwi_debug > 0) printf x
86 1.20 skrll #define DPRINTFN(n, x) if (iwi_debug >= (n)) printf x
87 1.20 skrll int iwi_debug = 4;
88 1.20 skrll #else
89 1.20 skrll #define DPRINTF(x)
90 1.20 skrll #define DPRINTFN(n, x)
91 1.20 skrll #endif
92 1.1 skrll
93 1.25 skrll static int iwi_match(struct device *, struct cfdata *, void *);
94 1.25 skrll static void iwi_attach(struct device *, struct device *, void *);
95 1.25 skrll static int iwi_detach(struct device *, int);
96 1.25 skrll
97 1.25 skrll static void iwi_shutdown(void *);
98 1.25 skrll static int iwi_suspend(struct iwi_softc *);
99 1.25 skrll static int iwi_resume(struct iwi_softc *);
100 1.25 skrll static void iwi_powerhook(int, void *);
101 1.15 skrll
102 1.25 skrll static int iwi_alloc_cmd_ring(struct iwi_softc *, struct iwi_cmd_ring *,
103 1.14 skrll int);
104 1.25 skrll static void iwi_reset_cmd_ring(struct iwi_softc *, struct iwi_cmd_ring *);
105 1.25 skrll static void iwi_free_cmd_ring(struct iwi_softc *, struct iwi_cmd_ring *);
106 1.25 skrll static int iwi_alloc_tx_ring(struct iwi_softc *, struct iwi_tx_ring *,
107 1.38 skrll int, bus_addr_t, bus_addr_t);
108 1.25 skrll static void iwi_reset_tx_ring(struct iwi_softc *, struct iwi_tx_ring *);
109 1.25 skrll static void iwi_free_tx_ring(struct iwi_softc *, struct iwi_tx_ring *);
110 1.31 joerg static struct mbuf *
111 1.31 joerg iwi_alloc_rx_buf(struct iwi_softc *sc);
112 1.25 skrll static int iwi_alloc_rx_ring(struct iwi_softc *, struct iwi_rx_ring *,
113 1.14 skrll int);
114 1.25 skrll static void iwi_reset_rx_ring(struct iwi_softc *, struct iwi_rx_ring *);
115 1.25 skrll static void iwi_free_rx_ring(struct iwi_softc *, struct iwi_rx_ring *);
116 1.14 skrll
117 1.38 skrll static struct ieee80211_node *iwi_node_alloc(struct ieee80211_node_table *);
118 1.38 skrll static void iwi_node_free(struct ieee80211_node *);
119 1.38 skrll
120 1.25 skrll static int iwi_media_change(struct ifnet *);
121 1.25 skrll static void iwi_media_status(struct ifnet *, struct ifmediareq *);
122 1.38 skrll static int iwi_wme_update(struct ieee80211com *);
123 1.25 skrll static uint16_t iwi_read_prom_word(struct iwi_softc *, uint8_t);
124 1.25 skrll static int iwi_newstate(struct ieee80211com *, enum ieee80211_state, int);
125 1.25 skrll static void iwi_fix_channel(struct ieee80211com *, struct mbuf *);
126 1.25 skrll static void iwi_frame_intr(struct iwi_softc *, struct iwi_rx_data *, int,
127 1.1 skrll struct iwi_frame *);
128 1.25 skrll static void iwi_notification_intr(struct iwi_softc *, struct iwi_notif *);
129 1.41 skrll static void iwi_cmd_intr(struct iwi_softc *);
130 1.25 skrll static void iwi_rx_intr(struct iwi_softc *);
131 1.38 skrll static void iwi_tx_intr(struct iwi_softc *, struct iwi_tx_ring *);
132 1.25 skrll static int iwi_intr(void *);
133 1.25 skrll static int iwi_cmd(struct iwi_softc *, uint8_t, void *, uint8_t, int);
134 1.38 skrll static void iwi_write_ibssnode(struct iwi_softc *, const struct iwi_node *);
135 1.38 skrll static int iwi_tx_start(struct ifnet *, struct mbuf *, struct ieee80211_node *,
136 1.38 skrll int);
137 1.25 skrll static void iwi_start(struct ifnet *);
138 1.25 skrll static void iwi_watchdog(struct ifnet *);
139 1.38 skrll
140 1.38 skrll static int iwi_alloc_unr(struct iwi_softc *);
141 1.38 skrll static void iwi_free_unr(struct iwi_softc *, int);
142 1.38 skrll
143 1.25 skrll static int iwi_get_table0(struct iwi_softc *, uint32_t *);
144 1.38 skrll
145 1.25 skrll static int iwi_ioctl(struct ifnet *, u_long, caddr_t);
146 1.25 skrll static void iwi_stop_master(struct iwi_softc *);
147 1.25 skrll static int iwi_reset(struct iwi_softc *);
148 1.25 skrll static int iwi_load_ucode(struct iwi_softc *, void *, int);
149 1.25 skrll static int iwi_load_firmware(struct iwi_softc *, void *, int);
150 1.52 skrll static int iwi_cache_firmware(struct iwi_softc *);
151 1.25 skrll static void iwi_free_firmware(struct iwi_softc *);
152 1.25 skrll static int iwi_config(struct iwi_softc *);
153 1.25 skrll static int iwi_set_chan(struct iwi_softc *, struct ieee80211_channel *);
154 1.25 skrll static int iwi_scan(struct iwi_softc *);
155 1.25 skrll static int iwi_auth_and_assoc(struct iwi_softc *);
156 1.25 skrll static int iwi_init(struct ifnet *);
157 1.25 skrll static void iwi_stop(struct ifnet *, int);
158 1.54 skrll static int iwi_getrfkill(struct iwi_softc *);
159 1.42 rpaulo static void iwi_led_set(struct iwi_softc *, uint32_t, int);
160 1.54 skrll static void iwi_sysctlattach(struct iwi_softc *);
161 1.36 skrll static void iwi_error_log(struct iwi_softc *);
162 1.1 skrll
163 1.20 skrll /*
164 1.20 skrll * Supported rates for 802.11a/b/g modes (in 500Kbps unit).
165 1.20 skrll */
166 1.20 skrll static const struct ieee80211_rateset iwi_rateset_11a =
167 1.20 skrll { 8, { 12, 18, 24, 36, 48, 72, 96, 108 } };
168 1.20 skrll
169 1.20 skrll static const struct ieee80211_rateset iwi_rateset_11b =
170 1.20 skrll { 4, { 2, 4, 11, 22 } };
171 1.20 skrll
172 1.20 skrll static const struct ieee80211_rateset iwi_rateset_11g =
173 1.20 skrll { 12, { 2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108 } };
174 1.20 skrll
175 1.44 perry static inline uint8_t
176 1.24 skrll MEM_READ_1(struct iwi_softc *sc, uint32_t addr)
177 1.1 skrll {
178 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_INDIRECT_ADDR, addr);
179 1.1 skrll return CSR_READ_1(sc, IWI_CSR_INDIRECT_DATA);
180 1.1 skrll }
181 1.1 skrll
182 1.44 perry static inline uint32_t
183 1.24 skrll MEM_READ_4(struct iwi_softc *sc, uint32_t addr)
184 1.1 skrll {
185 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_INDIRECT_ADDR, addr);
186 1.1 skrll return CSR_READ_4(sc, IWI_CSR_INDIRECT_DATA);
187 1.1 skrll }
188 1.1 skrll
189 1.36 skrll static void
190 1.36 skrll MEM_CPY(struct iwi_softc *sc, void *dst, uint32_t base, size_t sz)
191 1.36 skrll {
192 1.36 skrll KASSERT(sz % 4 == 0);
193 1.36 skrll int j;
194 1.36 skrll
195 1.36 skrll uint32_t *p = dst;
196 1.36 skrll
197 1.36 skrll for (j = 0; j < sz / 4; j++)
198 1.36 skrll p[j] = MEM_READ_4(sc, base + j * sizeof(uint32_t));
199 1.36 skrll }
200 1.36 skrll
201 1.1 skrll CFATTACH_DECL(iwi, sizeof (struct iwi_softc), iwi_match, iwi_attach,
202 1.1 skrll iwi_detach, NULL);
203 1.1 skrll
204 1.1 skrll static int
205 1.1 skrll iwi_match(struct device *parent, struct cfdata *match, void *aux)
206 1.1 skrll {
207 1.1 skrll struct pci_attach_args *pa = aux;
208 1.5 perry
209 1.1 skrll if (PCI_VENDOR(pa->pa_id) != PCI_VENDOR_INTEL)
210 1.1 skrll return 0;
211 1.1 skrll
212 1.1 skrll if (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_PRO_WL_2200BG ||
213 1.13 skrll PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_PRO_WL_2225BG ||
214 1.13 skrll PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_PRO_WL_2915ABG_1 ||
215 1.13 skrll PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_PRO_WL_2915ABG_2)
216 1.1 skrll return 1;
217 1.5 perry
218 1.1 skrll return 0;
219 1.1 skrll }
220 1.1 skrll
221 1.1 skrll /* Base Address Register */
222 1.1 skrll #define IWI_PCI_BAR0 0x10
223 1.1 skrll
224 1.1 skrll static void
225 1.1 skrll iwi_attach(struct device *parent, struct device *self, void *aux)
226 1.1 skrll {
227 1.1 skrll struct iwi_softc *sc = (struct iwi_softc *)self;
228 1.1 skrll struct ieee80211com *ic = &sc->sc_ic;
229 1.9 dyoung struct ifnet *ifp = &sc->sc_if;
230 1.1 skrll struct pci_attach_args *pa = aux;
231 1.1 skrll const char *intrstr;
232 1.1 skrll char devinfo[256];
233 1.1 skrll bus_space_tag_t memt;
234 1.1 skrll bus_space_handle_t memh;
235 1.1 skrll bus_addr_t base;
236 1.1 skrll pci_intr_handle_t ih;
237 1.1 skrll pcireg_t data;
238 1.24 skrll uint16_t val;
239 1.1 skrll int error, revision, i;
240 1.1 skrll
241 1.1 skrll sc->sc_pct = pa->pa_pc;
242 1.1 skrll sc->sc_pcitag = pa->pa_tag;
243 1.1 skrll
244 1.1 skrll pci_devinfo(pa->pa_id, pa->pa_class, 0, devinfo, sizeof devinfo);
245 1.1 skrll revision = PCI_REVISION(pa->pa_class);
246 1.1 skrll aprint_normal(": %s (rev. 0x%02x)\n", devinfo, revision);
247 1.1 skrll
248 1.1 skrll /* clear device specific PCI configuration register 0x41 */
249 1.1 skrll data = pci_conf_read(sc->sc_pct, sc->sc_pcitag, 0x40);
250 1.1 skrll data &= ~0x0000ff00;
251 1.1 skrll pci_conf_write(sc->sc_pct, sc->sc_pcitag, 0x40, data);
252 1.1 skrll
253 1.38 skrll /* clear unit numbers allocated to IBSS */
254 1.38 skrll sc->sc_unr = 0;
255 1.38 skrll
256 1.50 christos /* power up chip */
257 1.50 christos if ((error = pci_activate(pa->pa_pc, pa->pa_tag, sc,
258 1.50 christos NULL)) && error != EOPNOTSUPP) {
259 1.50 christos aprint_error("%s: cannot activate %d\n", sc->sc_dev.dv_xname,
260 1.50 christos error);
261 1.50 christos return;
262 1.50 christos }
263 1.50 christos
264 1.1 skrll /* enable bus-mastering */
265 1.1 skrll data = pci_conf_read(sc->sc_pct, sc->sc_pcitag, PCI_COMMAND_STATUS_REG);
266 1.1 skrll data |= PCI_COMMAND_MASTER_ENABLE;
267 1.1 skrll pci_conf_write(sc->sc_pct, sc->sc_pcitag, PCI_COMMAND_STATUS_REG, data);
268 1.1 skrll
269 1.1 skrll /* map the register window */
270 1.1 skrll error = pci_mapreg_map(pa, IWI_PCI_BAR0, PCI_MAPREG_TYPE_MEM |
271 1.1 skrll PCI_MAPREG_MEM_TYPE_32BIT, 0, &memt, &memh, &base, &sc->sc_sz);
272 1.1 skrll if (error != 0) {
273 1.1 skrll aprint_error("%s: could not map memory space\n",
274 1.1 skrll sc->sc_dev.dv_xname);
275 1.1 skrll return;
276 1.1 skrll }
277 1.1 skrll
278 1.1 skrll sc->sc_st = memt;
279 1.1 skrll sc->sc_sh = memh;
280 1.1 skrll sc->sc_dmat = pa->pa_dmat;
281 1.1 skrll
282 1.1 skrll /* disable interrupts */
283 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_INTR_MASK, 0);
284 1.1 skrll
285 1.1 skrll if (pci_intr_map(pa, &ih) != 0) {
286 1.1 skrll aprint_error("%s: could not map interrupt\n",
287 1.1 skrll sc->sc_dev.dv_xname);
288 1.1 skrll return;
289 1.1 skrll }
290 1.1 skrll
291 1.1 skrll intrstr = pci_intr_string(sc->sc_pct, ih);
292 1.1 skrll sc->sc_ih = pci_intr_establish(sc->sc_pct, ih, IPL_NET, iwi_intr, sc);
293 1.1 skrll if (sc->sc_ih == NULL) {
294 1.1 skrll aprint_error("%s: could not establish interrupt",
295 1.1 skrll sc->sc_dev.dv_xname);
296 1.1 skrll if (intrstr != NULL)
297 1.1 skrll aprint_error(" at %s", intrstr);
298 1.1 skrll aprint_error("\n");
299 1.1 skrll return;
300 1.1 skrll }
301 1.1 skrll aprint_normal("%s: interrupting at %s\n", sc->sc_dev.dv_xname, intrstr);
302 1.1 skrll
303 1.1 skrll if (iwi_reset(sc) != 0) {
304 1.1 skrll aprint_error("%s: could not reset adapter\n",
305 1.1 skrll sc->sc_dev.dv_xname);
306 1.1 skrll return;
307 1.1 skrll }
308 1.1 skrll
309 1.14 skrll /*
310 1.14 skrll * Allocate rings.
311 1.14 skrll */
312 1.14 skrll if (iwi_alloc_cmd_ring(sc, &sc->cmdq, IWI_CMD_RING_COUNT) != 0) {
313 1.14 skrll aprint_error("%s: could not allocate command ring\n",
314 1.1 skrll sc->sc_dev.dv_xname);
315 1.14 skrll goto fail;
316 1.14 skrll }
317 1.14 skrll
318 1.38 skrll error = iwi_alloc_tx_ring(sc, &sc->txq[0], IWI_TX_RING_COUNT,
319 1.38 skrll IWI_CSR_TX1_RIDX, IWI_CSR_TX1_WIDX);
320 1.38 skrll if (error != 0) {
321 1.38 skrll aprint_error("%s: could not allocate Tx ring 1\n",
322 1.38 skrll sc->sc_dev.dv_xname);
323 1.38 skrll goto fail;
324 1.38 skrll }
325 1.38 skrll
326 1.38 skrll error = iwi_alloc_tx_ring(sc, &sc->txq[1], IWI_TX_RING_COUNT,
327 1.38 skrll IWI_CSR_TX2_RIDX, IWI_CSR_TX2_WIDX);
328 1.38 skrll if (error != 0) {
329 1.38 skrll aprint_error("%s: could not allocate Tx ring 2\n",
330 1.38 skrll sc->sc_dev.dv_xname);
331 1.38 skrll goto fail;
332 1.38 skrll }
333 1.38 skrll
334 1.38 skrll error = iwi_alloc_tx_ring(sc, &sc->txq[2], IWI_TX_RING_COUNT,
335 1.38 skrll IWI_CSR_TX3_RIDX, IWI_CSR_TX3_WIDX);
336 1.38 skrll if (error != 0) {
337 1.38 skrll aprint_error("%s: could not allocate Tx ring 3\n",
338 1.38 skrll sc->sc_dev.dv_xname);
339 1.38 skrll goto fail;
340 1.38 skrll }
341 1.38 skrll
342 1.38 skrll error = iwi_alloc_tx_ring(sc, &sc->txq[3], IWI_TX_RING_COUNT,
343 1.38 skrll IWI_CSR_TX4_RIDX, IWI_CSR_TX4_WIDX);
344 1.38 skrll if (error != 0) {
345 1.38 skrll aprint_error("%s: could not allocate Tx ring 4\n",
346 1.14 skrll sc->sc_dev.dv_xname);
347 1.14 skrll goto fail;
348 1.14 skrll }
349 1.14 skrll
350 1.14 skrll if (iwi_alloc_rx_ring(sc, &sc->rxq, IWI_RX_RING_COUNT) != 0) {
351 1.14 skrll aprint_error("%s: could not allocate Rx ring\n",
352 1.14 skrll sc->sc_dev.dv_xname);
353 1.14 skrll goto fail;
354 1.1 skrll }
355 1.1 skrll
356 1.9 dyoung ic->ic_ifp = ifp;
357 1.38 skrll ic->ic_wme.wme_update = iwi_wme_update;
358 1.12 christos ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */
359 1.12 christos ic->ic_opmode = IEEE80211_M_STA; /* default to BSS mode */
360 1.13 skrll ic->ic_state = IEEE80211_S_INIT;
361 1.1 skrll
362 1.52 skrll sc->sc_fwname = "iwi-bss.fw";
363 1.52 skrll sc->sc_ucname = "iwi-ucode-bss.fw";
364 1.52 skrll
365 1.1 skrll /* set device capabilities */
366 1.38 skrll ic->ic_caps =
367 1.38 skrll IEEE80211_C_IBSS | /* IBSS mode supported */
368 1.38 skrll IEEE80211_C_MONITOR | /* monitor mode supported */
369 1.38 skrll IEEE80211_C_TXPMGT | /* tx power management */
370 1.38 skrll IEEE80211_C_SHPREAMBLE | /* short preamble supported */
371 1.38 skrll IEEE80211_C_WPA | /* 802.11i */
372 1.38 skrll IEEE80211_C_WME; /* 802.11e */
373 1.1 skrll
374 1.1 skrll /* read MAC address from EEPROM */
375 1.1 skrll val = iwi_read_prom_word(sc, IWI_EEPROM_MAC + 0);
376 1.33 skrll ic->ic_myaddr[0] = val & 0xff;
377 1.33 skrll ic->ic_myaddr[1] = val >> 8;
378 1.1 skrll val = iwi_read_prom_word(sc, IWI_EEPROM_MAC + 1);
379 1.33 skrll ic->ic_myaddr[2] = val & 0xff;
380 1.33 skrll ic->ic_myaddr[3] = val >> 8;
381 1.1 skrll val = iwi_read_prom_word(sc, IWI_EEPROM_MAC + 2);
382 1.33 skrll ic->ic_myaddr[4] = val & 0xff;
383 1.33 skrll ic->ic_myaddr[5] = val >> 8;
384 1.1 skrll
385 1.1 skrll aprint_normal("%s: 802.11 address %s\n", sc->sc_dev.dv_xname,
386 1.1 skrll ether_sprintf(ic->ic_myaddr));
387 1.1 skrll
388 1.42 rpaulo /* read the NIC type from EEPROM */
389 1.49 blymn val = iwi_read_prom_word(sc, IWI_EEPROM_NIC_TYPE);
390 1.42 rpaulo sc->nictype = val & 0xff;
391 1.42 rpaulo
392 1.42 rpaulo DPRINTF(("%s: NIC type %d\n", sc->sc_dev.dv_xname, sc->nictype));
393 1.13 skrll
394 1.16 skrll if (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_PRO_WL_2915ABG_1 ||
395 1.16 skrll PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_PRO_WL_2915ABG_2) {
396 1.13 skrll /* set supported .11a rates (2915ABG only) */
397 1.1 skrll ic->ic_sup_rates[IEEE80211_MODE_11A] = iwi_rateset_11a;
398 1.1 skrll
399 1.1 skrll /* set supported .11a channels */
400 1.1 skrll for (i = 36; i <= 64; i += 4) {
401 1.1 skrll ic->ic_channels[i].ic_freq =
402 1.1 skrll ieee80211_ieee2mhz(i, IEEE80211_CHAN_5GHZ);
403 1.1 skrll ic->ic_channels[i].ic_flags = IEEE80211_CHAN_A;
404 1.1 skrll }
405 1.12 christos for (i = 149; i <= 165; i += 4) {
406 1.1 skrll ic->ic_channels[i].ic_freq =
407 1.1 skrll ieee80211_ieee2mhz(i, IEEE80211_CHAN_5GHZ);
408 1.1 skrll ic->ic_channels[i].ic_flags = IEEE80211_CHAN_A;
409 1.1 skrll }
410 1.1 skrll }
411 1.1 skrll
412 1.1 skrll /* set supported .11b and .11g rates */
413 1.1 skrll ic->ic_sup_rates[IEEE80211_MODE_11B] = iwi_rateset_11b;
414 1.1 skrll ic->ic_sup_rates[IEEE80211_MODE_11G] = iwi_rateset_11g;
415 1.1 skrll
416 1.1 skrll /* set supported .11b and .11g channels (1 through 14) */
417 1.1 skrll for (i = 1; i <= 14; i++) {
418 1.1 skrll ic->ic_channels[i].ic_freq =
419 1.1 skrll ieee80211_ieee2mhz(i, IEEE80211_CHAN_2GHZ);
420 1.1 skrll ic->ic_channels[i].ic_flags =
421 1.1 skrll IEEE80211_CHAN_CCK | IEEE80211_CHAN_OFDM |
422 1.1 skrll IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ;
423 1.1 skrll }
424 1.1 skrll
425 1.1 skrll ifp->if_softc = sc;
426 1.1 skrll ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
427 1.1 skrll ifp->if_init = iwi_init;
428 1.1 skrll ifp->if_stop = iwi_stop;
429 1.1 skrll ifp->if_ioctl = iwi_ioctl;
430 1.1 skrll ifp->if_start = iwi_start;
431 1.1 skrll ifp->if_watchdog = iwi_watchdog;
432 1.1 skrll IFQ_SET_READY(&ifp->if_snd);
433 1.1 skrll memcpy(ifp->if_xname, sc->sc_dev.dv_xname, IFNAMSIZ);
434 1.1 skrll
435 1.1 skrll if_attach(ifp);
436 1.9 dyoung ieee80211_ifattach(ic);
437 1.38 skrll /* override default methods */
438 1.38 skrll ic->ic_node_alloc = iwi_node_alloc;
439 1.38 skrll sc->sc_node_free = ic->ic_node_free;
440 1.38 skrll ic->ic_node_free = iwi_node_free;
441 1.1 skrll /* override state transition machine */
442 1.1 skrll sc->sc_newstate = ic->ic_newstate;
443 1.1 skrll ic->ic_newstate = iwi_newstate;
444 1.9 dyoung ieee80211_media_init(ic, iwi_media_change, iwi_media_status);
445 1.1 skrll
446 1.1 skrll #if NBPFILTER > 0
447 1.1 skrll bpfattach2(ifp, DLT_IEEE802_11_RADIO,
448 1.1 skrll sizeof (struct ieee80211_frame) + 64, &sc->sc_drvbpf);
449 1.1 skrll
450 1.1 skrll sc->sc_rxtap_len = sizeof sc->sc_rxtapu;
451 1.1 skrll sc->sc_rxtap.wr_ihdr.it_len = htole16(sc->sc_rxtap_len);
452 1.1 skrll sc->sc_rxtap.wr_ihdr.it_present = htole32(IWI_RX_RADIOTAP_PRESENT);
453 1.1 skrll
454 1.1 skrll sc->sc_txtap_len = sizeof sc->sc_txtapu;
455 1.1 skrll sc->sc_txtap.wt_ihdr.it_len = htole16(sc->sc_txtap_len);
456 1.1 skrll sc->sc_txtap.wt_ihdr.it_present = htole32(IWI_TX_RADIOTAP_PRESENT);
457 1.1 skrll #endif
458 1.15 skrll
459 1.54 skrll iwi_sysctlattach(sc);
460 1.54 skrll
461 1.15 skrll /*
462 1.15 skrll * Make sure the interface is shutdown during reboot.
463 1.15 skrll */
464 1.15 skrll sc->sc_sdhook = shutdownhook_establish(iwi_shutdown, sc);
465 1.15 skrll if (sc->sc_sdhook == NULL)
466 1.15 skrll aprint_error("%s: WARNING: unable to establish shutdown hook\n",
467 1.15 skrll sc->sc_dev.dv_xname);
468 1.56 jmcneill sc->sc_powerhook = powerhook_establish(sc->sc_dev.dv_xname,
469 1.56 jmcneill iwi_powerhook, sc);
470 1.15 skrll if (sc->sc_powerhook == NULL)
471 1.53 skrll aprint_error("%s: WARNING: unable to establish power hook\n",
472 1.15 skrll sc->sc_dev.dv_xname);
473 1.15 skrll
474 1.13 skrll ieee80211_announce(ic);
475 1.14 skrll
476 1.14 skrll return;
477 1.14 skrll
478 1.14 skrll fail: iwi_detach(self, 0);
479 1.1 skrll }
480 1.1 skrll
481 1.1 skrll static int
482 1.1 skrll iwi_detach(struct device* self, int flags)
483 1.1 skrll {
484 1.1 skrll struct iwi_softc *sc = (struct iwi_softc *)self;
485 1.9 dyoung struct ifnet *ifp = &sc->sc_if;
486 1.1 skrll
487 1.47 rpaulo if (ifp != NULL)
488 1.47 rpaulo iwi_stop(ifp, 1);
489 1.47 rpaulo
490 1.1 skrll iwi_free_firmware(sc);
491 1.1 skrll
492 1.1 skrll #if NBPFILTER > 0
493 1.25 skrll if (ifp != NULL)
494 1.25 skrll bpfdetach(ifp);
495 1.1 skrll #endif
496 1.9 dyoung ieee80211_ifdetach(&sc->sc_ic);
497 1.25 skrll if (ifp != NULL)
498 1.25 skrll if_detach(ifp);
499 1.1 skrll
500 1.14 skrll iwi_free_cmd_ring(sc, &sc->cmdq);
501 1.38 skrll iwi_free_tx_ring(sc, &sc->txq[0]);
502 1.38 skrll iwi_free_tx_ring(sc, &sc->txq[1]);
503 1.38 skrll iwi_free_tx_ring(sc, &sc->txq[2]);
504 1.38 skrll iwi_free_tx_ring(sc, &sc->txq[3]);
505 1.14 skrll iwi_free_rx_ring(sc, &sc->rxq);
506 1.1 skrll
507 1.1 skrll if (sc->sc_ih != NULL) {
508 1.1 skrll pci_intr_disestablish(sc->sc_pct, sc->sc_ih);
509 1.1 skrll sc->sc_ih = NULL;
510 1.1 skrll }
511 1.1 skrll
512 1.1 skrll bus_space_unmap(sc->sc_st, sc->sc_sh, sc->sc_sz);
513 1.1 skrll
514 1.18 skrll powerhook_disestablish(sc->sc_powerhook);
515 1.18 skrll shutdownhook_disestablish(sc->sc_sdhook);
516 1.18 skrll
517 1.1 skrll return 0;
518 1.1 skrll }
519 1.1 skrll
520 1.1 skrll static int
521 1.14 skrll iwi_alloc_cmd_ring(struct iwi_softc *sc, struct iwi_cmd_ring *ring,
522 1.14 skrll int count)
523 1.1 skrll {
524 1.14 skrll int error, nsegs;
525 1.14 skrll
526 1.14 skrll ring->count = count;
527 1.14 skrll ring->queued = 0;
528 1.14 skrll ring->cur = ring->next = 0;
529 1.1 skrll
530 1.1 skrll /*
531 1.14 skrll * Allocate and map command ring
532 1.1 skrll */
533 1.1 skrll error = bus_dmamap_create(sc->sc_dmat,
534 1.25 skrll IWI_CMD_DESC_SIZE * count, 1,
535 1.25 skrll IWI_CMD_DESC_SIZE * count, 0,
536 1.14 skrll BUS_DMA_NOWAIT, &ring->desc_map);
537 1.1 skrll if (error != 0) {
538 1.14 skrll aprint_error("%s: could not create command ring DMA map\n",
539 1.1 skrll sc->sc_dev.dv_xname);
540 1.1 skrll goto fail;
541 1.1 skrll }
542 1.1 skrll
543 1.1 skrll error = bus_dmamem_alloc(sc->sc_dmat,
544 1.25 skrll IWI_CMD_DESC_SIZE * count, PAGE_SIZE, 0,
545 1.14 skrll &sc->cmdq.desc_seg, 1, &nsegs, BUS_DMA_NOWAIT);
546 1.1 skrll if (error != 0) {
547 1.14 skrll aprint_error("%s: could not allocate command ring DMA memory\n",
548 1.1 skrll sc->sc_dev.dv_xname);
549 1.1 skrll goto fail;
550 1.1 skrll }
551 1.1 skrll
552 1.14 skrll error = bus_dmamem_map(sc->sc_dmat, &sc->cmdq.desc_seg, nsegs,
553 1.25 skrll IWI_CMD_DESC_SIZE * count,
554 1.14 skrll (caddr_t *)&sc->cmdq.desc, BUS_DMA_NOWAIT);
555 1.1 skrll if (error != 0) {
556 1.14 skrll aprint_error("%s: could not map command ring DMA memory\n",
557 1.1 skrll sc->sc_dev.dv_xname);
558 1.1 skrll goto fail;
559 1.1 skrll }
560 1.1 skrll
561 1.14 skrll error = bus_dmamap_load(sc->sc_dmat, sc->cmdq.desc_map, sc->cmdq.desc,
562 1.25 skrll IWI_CMD_DESC_SIZE * count, NULL,
563 1.1 skrll BUS_DMA_NOWAIT);
564 1.1 skrll if (error != 0) {
565 1.14 skrll aprint_error("%s: could not load command ring DMA map\n",
566 1.1 skrll sc->sc_dev.dv_xname);
567 1.1 skrll goto fail;
568 1.1 skrll }
569 1.1 skrll
570 1.14 skrll memset(sc->cmdq.desc, 0,
571 1.25 skrll IWI_CMD_DESC_SIZE * count);
572 1.14 skrll
573 1.14 skrll return 0;
574 1.14 skrll
575 1.14 skrll fail: iwi_free_cmd_ring(sc, ring);
576 1.14 skrll return error;
577 1.14 skrll }
578 1.14 skrll
579 1.14 skrll static void
580 1.14 skrll iwi_reset_cmd_ring(struct iwi_softc *sc, struct iwi_cmd_ring *ring)
581 1.14 skrll {
582 1.41 skrll int i;
583 1.41 skrll
584 1.41 skrll for (i = ring->next; i != ring->cur;) {
585 1.41 skrll bus_dmamap_sync(sc->sc_dmat, sc->cmdq.desc_map,
586 1.41 skrll i * IWI_CMD_DESC_SIZE, IWI_CMD_DESC_SIZE,
587 1.41 skrll BUS_DMASYNC_POSTWRITE);
588 1.41 skrll
589 1.41 skrll wakeup(&ring->desc[i]);
590 1.41 skrll i = (i + 1) % ring->count;
591 1.41 skrll }
592 1.41 skrll
593 1.14 skrll ring->queued = 0;
594 1.14 skrll ring->cur = ring->next = 0;
595 1.14 skrll }
596 1.14 skrll
597 1.14 skrll static void
598 1.14 skrll iwi_free_cmd_ring(struct iwi_softc *sc, struct iwi_cmd_ring *ring)
599 1.14 skrll {
600 1.14 skrll if (ring->desc_map != NULL) {
601 1.14 skrll if (ring->desc != NULL) {
602 1.14 skrll bus_dmamap_unload(sc->sc_dmat, ring->desc_map);
603 1.14 skrll bus_dmamem_unmap(sc->sc_dmat, (caddr_t)ring->desc,
604 1.25 skrll IWI_CMD_DESC_SIZE * ring->count);
605 1.14 skrll bus_dmamem_free(sc->sc_dmat, &ring->desc_seg, 1);
606 1.14 skrll }
607 1.14 skrll bus_dmamap_destroy(sc->sc_dmat, ring->desc_map);
608 1.14 skrll }
609 1.14 skrll }
610 1.14 skrll
611 1.14 skrll static int
612 1.14 skrll iwi_alloc_tx_ring(struct iwi_softc *sc, struct iwi_tx_ring *ring,
613 1.38 skrll int count, bus_addr_t csr_ridx, bus_addr_t csr_widx)
614 1.14 skrll {
615 1.14 skrll int i, error, nsegs;
616 1.14 skrll
617 1.14 skrll ring->count = count;
618 1.14 skrll ring->queued = 0;
619 1.14 skrll ring->cur = ring->next = 0;
620 1.38 skrll ring->csr_ridx = csr_ridx;
621 1.38 skrll ring->csr_widx = csr_widx;
622 1.1 skrll
623 1.1 skrll /*
624 1.14 skrll * Allocate and map Tx ring
625 1.1 skrll */
626 1.1 skrll error = bus_dmamap_create(sc->sc_dmat,
627 1.25 skrll IWI_TX_DESC_SIZE * count, 1,
628 1.25 skrll IWI_TX_DESC_SIZE * count, 0, BUS_DMA_NOWAIT,
629 1.14 skrll &ring->desc_map);
630 1.1 skrll if (error != 0) {
631 1.14 skrll aprint_error("%s: could not create tx ring DMA map\n",
632 1.1 skrll sc->sc_dev.dv_xname);
633 1.1 skrll goto fail;
634 1.1 skrll }
635 1.1 skrll
636 1.1 skrll error = bus_dmamem_alloc(sc->sc_dmat,
637 1.25 skrll IWI_TX_DESC_SIZE * count, PAGE_SIZE, 0,
638 1.14 skrll &ring->desc_seg, 1, &nsegs, BUS_DMA_NOWAIT);
639 1.1 skrll if (error != 0) {
640 1.14 skrll aprint_error("%s: could not allocate tx ring DMA memory\n",
641 1.1 skrll sc->sc_dev.dv_xname);
642 1.1 skrll goto fail;
643 1.1 skrll }
644 1.1 skrll
645 1.14 skrll error = bus_dmamem_map(sc->sc_dmat, &ring->desc_seg, nsegs,
646 1.25 skrll IWI_TX_DESC_SIZE * count,
647 1.14 skrll (caddr_t *)&ring->desc, BUS_DMA_NOWAIT);
648 1.1 skrll if (error != 0) {
649 1.14 skrll aprint_error("%s: could not map tx ring DMA memory\n",
650 1.1 skrll sc->sc_dev.dv_xname);
651 1.1 skrll goto fail;
652 1.1 skrll }
653 1.1 skrll
654 1.14 skrll error = bus_dmamap_load(sc->sc_dmat, ring->desc_map, ring->desc,
655 1.25 skrll IWI_TX_DESC_SIZE * count, NULL,
656 1.1 skrll BUS_DMA_NOWAIT);
657 1.1 skrll if (error != 0) {
658 1.14 skrll aprint_error("%s: could not load tx ring DMA map\n",
659 1.1 skrll sc->sc_dev.dv_xname);
660 1.1 skrll goto fail;
661 1.1 skrll }
662 1.1 skrll
663 1.25 skrll memset(ring->desc, 0, IWI_TX_DESC_SIZE * count);
664 1.14 skrll
665 1.14 skrll ring->data = malloc(count * sizeof (struct iwi_tx_data), M_DEVBUF,
666 1.14 skrll M_NOWAIT | M_ZERO);
667 1.14 skrll if (ring->data == NULL) {
668 1.14 skrll aprint_error("%s: could not allocate soft data\n",
669 1.14 skrll sc->sc_dev.dv_xname);
670 1.14 skrll error = ENOMEM;
671 1.14 skrll goto fail;
672 1.14 skrll }
673 1.1 skrll
674 1.1 skrll /*
675 1.1 skrll * Allocate Tx buffers DMA maps
676 1.1 skrll */
677 1.14 skrll for (i = 0; i < count; i++) {
678 1.1 skrll error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, IWI_MAX_NSEG,
679 1.14 skrll MCLBYTES, 0, BUS_DMA_NOWAIT, &ring->data[i].map);
680 1.1 skrll if (error != 0) {
681 1.1 skrll aprint_error("%s: could not create tx buf DMA map",
682 1.1 skrll sc->sc_dev.dv_xname);
683 1.1 skrll goto fail;
684 1.1 skrll }
685 1.1 skrll }
686 1.14 skrll return 0;
687 1.14 skrll
688 1.14 skrll fail: iwi_free_tx_ring(sc, ring);
689 1.14 skrll return error;
690 1.14 skrll }
691 1.14 skrll
692 1.14 skrll static void
693 1.14 skrll iwi_reset_tx_ring(struct iwi_softc *sc, struct iwi_tx_ring *ring)
694 1.14 skrll {
695 1.14 skrll struct iwi_tx_data *data;
696 1.14 skrll int i;
697 1.14 skrll
698 1.14 skrll for (i = 0; i < ring->count; i++) {
699 1.14 skrll data = &ring->data[i];
700 1.14 skrll
701 1.14 skrll if (data->m != NULL) {
702 1.14 skrll bus_dmamap_sync(sc->sc_dmat, data->map, 0,
703 1.34 scw data->map->dm_mapsize, BUS_DMASYNC_POSTWRITE);
704 1.14 skrll bus_dmamap_unload(sc->sc_dmat, data->map);
705 1.14 skrll m_freem(data->m);
706 1.14 skrll data->m = NULL;
707 1.14 skrll }
708 1.14 skrll
709 1.14 skrll if (data->ni != NULL) {
710 1.14 skrll ieee80211_free_node(data->ni);
711 1.14 skrll data->ni = NULL;
712 1.14 skrll }
713 1.14 skrll }
714 1.14 skrll
715 1.14 skrll ring->queued = 0;
716 1.14 skrll ring->cur = ring->next = 0;
717 1.14 skrll }
718 1.14 skrll
719 1.14 skrll static void
720 1.14 skrll iwi_free_tx_ring(struct iwi_softc *sc, struct iwi_tx_ring *ring)
721 1.14 skrll {
722 1.14 skrll int i;
723 1.14 skrll
724 1.14 skrll if (ring->desc_map != NULL) {
725 1.14 skrll if (ring->desc != NULL) {
726 1.14 skrll bus_dmamap_unload(sc->sc_dmat, ring->desc_map);
727 1.14 skrll bus_dmamem_unmap(sc->sc_dmat, (caddr_t)ring->desc,
728 1.25 skrll IWI_TX_DESC_SIZE * ring->count);
729 1.14 skrll bus_dmamem_free(sc->sc_dmat, &ring->desc_seg, 1);
730 1.14 skrll }
731 1.14 skrll bus_dmamap_destroy(sc->sc_dmat, ring->desc_map);
732 1.14 skrll }
733 1.14 skrll
734 1.14 skrll for (i = 0; i < ring->count; i++) {
735 1.14 skrll if (ring->data[i].m != NULL) {
736 1.14 skrll bus_dmamap_unload(sc->sc_dmat, ring->data[i].map);
737 1.14 skrll m_freem(ring->data[i].m);
738 1.14 skrll }
739 1.14 skrll bus_dmamap_destroy(sc->sc_dmat, ring->data[i].map);
740 1.14 skrll }
741 1.14 skrll }
742 1.14 skrll
743 1.14 skrll static int
744 1.14 skrll iwi_alloc_rx_ring(struct iwi_softc *sc, struct iwi_rx_ring *ring,
745 1.14 skrll int count)
746 1.14 skrll {
747 1.14 skrll int i, error;
748 1.14 skrll
749 1.14 skrll ring->count = count;
750 1.14 skrll ring->cur = 0;
751 1.14 skrll
752 1.14 skrll ring->data = malloc(count * sizeof (struct iwi_rx_data), M_DEVBUF,
753 1.14 skrll M_NOWAIT | M_ZERO);
754 1.14 skrll if (ring->data == NULL) {
755 1.14 skrll aprint_error("%s: could not allocate soft data\n",
756 1.14 skrll sc->sc_dev.dv_xname);
757 1.14 skrll error = ENOMEM;
758 1.14 skrll goto fail;
759 1.14 skrll }
760 1.1 skrll
761 1.1 skrll /*
762 1.1 skrll * Allocate and map Rx buffers
763 1.1 skrll */
764 1.14 skrll for (i = 0; i < count; i++) {
765 1.1 skrll
766 1.1 skrll error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1, MCLBYTES,
767 1.31 joerg 0, BUS_DMA_WAITOK | BUS_DMA_ALLOCNOW, &ring->data[i].map);
768 1.1 skrll if (error != 0) {
769 1.1 skrll aprint_error("%s: could not create rx buf DMA map",
770 1.1 skrll sc->sc_dev.dv_xname);
771 1.1 skrll goto fail;
772 1.1 skrll }
773 1.1 skrll
774 1.31 joerg if ((ring->data[i].m = iwi_alloc_rx_buf(sc)) == NULL) {
775 1.1 skrll error = ENOMEM;
776 1.1 skrll goto fail;
777 1.1 skrll }
778 1.1 skrll
779 1.34 scw error = bus_dmamap_load_mbuf(sc->sc_dmat, ring->data[i].map,
780 1.34 scw ring->data[i].m, BUS_DMA_READ | BUS_DMA_NOWAIT);
781 1.1 skrll if (error != 0) {
782 1.1 skrll aprint_error("%s: could not load rx buffer DMA map\n",
783 1.1 skrll sc->sc_dev.dv_xname);
784 1.1 skrll goto fail;
785 1.1 skrll }
786 1.41 skrll
787 1.41 skrll bus_dmamap_sync(sc->sc_dmat, ring->data[i].map, 0,
788 1.41 skrll ring->data[i].map->dm_mapsize, BUS_DMASYNC_PREREAD);
789 1.1 skrll }
790 1.1 skrll
791 1.1 skrll return 0;
792 1.1 skrll
793 1.14 skrll fail: iwi_free_rx_ring(sc, ring);
794 1.1 skrll return error;
795 1.1 skrll }
796 1.1 skrll
797 1.1 skrll static void
798 1.14 skrll iwi_reset_rx_ring(struct iwi_softc *sc, struct iwi_rx_ring *ring)
799 1.14 skrll {
800 1.14 skrll ring->cur = 0;
801 1.14 skrll }
802 1.14 skrll
803 1.14 skrll static void
804 1.14 skrll iwi_free_rx_ring(struct iwi_softc *sc, struct iwi_rx_ring *ring)
805 1.1 skrll {
806 1.1 skrll int i;
807 1.1 skrll
808 1.14 skrll for (i = 0; i < ring->count; i++) {
809 1.14 skrll if (ring->data[i].m != NULL) {
810 1.14 skrll bus_dmamap_unload(sc->sc_dmat, ring->data[i].map);
811 1.14 skrll m_freem(ring->data[i].m);
812 1.1 skrll }
813 1.14 skrll bus_dmamap_destroy(sc->sc_dmat, ring->data[i].map);
814 1.1 skrll }
815 1.1 skrll }
816 1.1 skrll
817 1.15 skrll static void
818 1.15 skrll iwi_shutdown(void *arg)
819 1.15 skrll {
820 1.15 skrll struct iwi_softc *sc = (struct iwi_softc *)arg;
821 1.15 skrll struct ifnet *ifp = sc->sc_ic.ic_ifp;
822 1.15 skrll
823 1.15 skrll iwi_stop(ifp, 1);
824 1.15 skrll }
825 1.15 skrll
826 1.15 skrll static int
827 1.15 skrll iwi_suspend(struct iwi_softc *sc)
828 1.15 skrll {
829 1.15 skrll struct ifnet *ifp = sc->sc_ic.ic_ifp;
830 1.15 skrll
831 1.15 skrll iwi_stop(ifp, 1);
832 1.15 skrll
833 1.15 skrll return 0;
834 1.15 skrll }
835 1.15 skrll
836 1.15 skrll static int
837 1.15 skrll iwi_resume(struct iwi_softc *sc)
838 1.15 skrll {
839 1.15 skrll struct ifnet *ifp = sc->sc_ic.ic_ifp;
840 1.15 skrll pcireg_t data;
841 1.15 skrll
842 1.15 skrll /* clear device specific PCI configuration register 0x41 */
843 1.15 skrll data = pci_conf_read(sc->sc_pct, sc->sc_pcitag, 0x40);
844 1.15 skrll data &= ~0x0000ff00;
845 1.15 skrll pci_conf_write(sc->sc_pct, sc->sc_pcitag, 0x40, data);
846 1.15 skrll
847 1.15 skrll if (ifp->if_flags & IFF_UP) {
848 1.15 skrll iwi_init(ifp);
849 1.15 skrll if (ifp->if_flags & IFF_RUNNING)
850 1.15 skrll iwi_start(ifp);
851 1.15 skrll }
852 1.15 skrll
853 1.15 skrll return 0;
854 1.15 skrll }
855 1.15 skrll
856 1.15 skrll static void
857 1.15 skrll iwi_powerhook(int why, void *arg)
858 1.15 skrll {
859 1.15 skrll struct iwi_softc *sc = arg;
860 1.46 jmcneill pci_chipset_tag_t pc = sc->sc_pct;
861 1.46 jmcneill pcitag_t tag = sc->sc_pcitag;
862 1.15 skrll int s;
863 1.15 skrll
864 1.15 skrll s = splnet();
865 1.15 skrll switch (why) {
866 1.15 skrll case PWR_SUSPEND:
867 1.15 skrll case PWR_STANDBY:
868 1.46 jmcneill pci_conf_capture(pc, tag, &sc->sc_pciconf);
869 1.15 skrll break;
870 1.15 skrll case PWR_RESUME:
871 1.46 jmcneill pci_conf_restore(pc, tag, &sc->sc_pciconf);
872 1.15 skrll break;
873 1.15 skrll case PWR_SOFTSUSPEND:
874 1.15 skrll case PWR_SOFTSTANDBY:
875 1.46 jmcneill iwi_suspend(sc);
876 1.46 jmcneill break;
877 1.15 skrll case PWR_SOFTRESUME:
878 1.46 jmcneill iwi_resume(sc);
879 1.15 skrll break;
880 1.15 skrll }
881 1.15 skrll splx(s);
882 1.15 skrll }
883 1.15 skrll
884 1.38 skrll static struct ieee80211_node *
885 1.38 skrll iwi_node_alloc(struct ieee80211_node_table *nt)
886 1.38 skrll {
887 1.38 skrll struct iwi_node *in;
888 1.38 skrll
889 1.38 skrll in = malloc(sizeof (struct iwi_node), M_80211_NODE, M_NOWAIT | M_ZERO);
890 1.38 skrll if (in == NULL)
891 1.38 skrll return NULL;
892 1.38 skrll
893 1.38 skrll in->in_station = -1;
894 1.38 skrll
895 1.38 skrll return &in->in_node;
896 1.38 skrll }
897 1.38 skrll
898 1.38 skrll static int
899 1.38 skrll iwi_alloc_unr(struct iwi_softc *sc)
900 1.38 skrll {
901 1.38 skrll int i;
902 1.38 skrll
903 1.38 skrll for (i = 0; i < IWI_MAX_IBSSNODE - 1; i++)
904 1.38 skrll if ((sc->sc_unr & (1 << i)) == 0) {
905 1.38 skrll sc->sc_unr |= 1 << i;
906 1.38 skrll return i;
907 1.38 skrll }
908 1.38 skrll
909 1.38 skrll return -1;
910 1.38 skrll }
911 1.38 skrll
912 1.38 skrll static void
913 1.38 skrll iwi_free_unr(struct iwi_softc *sc, int r)
914 1.38 skrll {
915 1.38 skrll
916 1.38 skrll sc->sc_unr &= 1 << r;
917 1.38 skrll }
918 1.38 skrll
919 1.38 skrll static void
920 1.38 skrll iwi_node_free(struct ieee80211_node *ni)
921 1.38 skrll {
922 1.38 skrll struct ieee80211com *ic = ni->ni_ic;
923 1.38 skrll struct iwi_softc *sc = ic->ic_ifp->if_softc;
924 1.38 skrll struct iwi_node *in = (struct iwi_node *)ni;
925 1.38 skrll
926 1.38 skrll if (in->in_station != -1)
927 1.38 skrll iwi_free_unr(sc, in->in_station);
928 1.38 skrll
929 1.38 skrll sc->sc_node_free(ni);
930 1.38 skrll }
931 1.38 skrll
932 1.1 skrll static int
933 1.1 skrll iwi_media_change(struct ifnet *ifp)
934 1.1 skrll {
935 1.1 skrll int error;
936 1.1 skrll
937 1.1 skrll error = ieee80211_media_change(ifp);
938 1.1 skrll if (error != ENETRESET)
939 1.1 skrll return error;
940 1.1 skrll
941 1.1 skrll if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) == (IFF_UP | IFF_RUNNING))
942 1.1 skrll iwi_init(ifp);
943 1.1 skrll
944 1.1 skrll return 0;
945 1.1 skrll }
946 1.1 skrll
947 1.20 skrll /*
948 1.38 skrll * The firmware automatically adapts the transmit speed. We report its current
949 1.38 skrll * value here.
950 1.20 skrll */
951 1.1 skrll static void
952 1.1 skrll iwi_media_status(struct ifnet *ifp, struct ifmediareq *imr)
953 1.1 skrll {
954 1.1 skrll struct iwi_softc *sc = ifp->if_softc;
955 1.1 skrll struct ieee80211com *ic = &sc->sc_ic;
956 1.1 skrll #define N(a) (sizeof (a) / sizeof (a[0]))
957 1.1 skrll static const struct {
958 1.24 skrll uint32_t val;
959 1.1 skrll int rate;
960 1.1 skrll } rates[] = {
961 1.1 skrll { IWI_RATE_DS1, 2 },
962 1.1 skrll { IWI_RATE_DS2, 4 },
963 1.1 skrll { IWI_RATE_DS5, 11 },
964 1.1 skrll { IWI_RATE_DS11, 22 },
965 1.1 skrll { IWI_RATE_OFDM6, 12 },
966 1.1 skrll { IWI_RATE_OFDM9, 18 },
967 1.1 skrll { IWI_RATE_OFDM12, 24 },
968 1.1 skrll { IWI_RATE_OFDM18, 36 },
969 1.1 skrll { IWI_RATE_OFDM24, 48 },
970 1.1 skrll { IWI_RATE_OFDM36, 72 },
971 1.1 skrll { IWI_RATE_OFDM48, 96 },
972 1.1 skrll { IWI_RATE_OFDM54, 108 },
973 1.1 skrll };
974 1.24 skrll uint32_t val;
975 1.1 skrll int rate, i;
976 1.1 skrll
977 1.1 skrll imr->ifm_status = IFM_AVALID;
978 1.1 skrll imr->ifm_active = IFM_IEEE80211;
979 1.1 skrll if (ic->ic_state == IEEE80211_S_RUN)
980 1.1 skrll imr->ifm_status |= IFM_ACTIVE;
981 1.1 skrll
982 1.1 skrll /* read current transmission rate from adapter */
983 1.1 skrll val = CSR_READ_4(sc, IWI_CSR_CURRENT_TX_RATE);
984 1.1 skrll
985 1.1 skrll /* convert rate to 802.11 rate */
986 1.1 skrll for (i = 0; i < N(rates) && rates[i].val != val; i++);
987 1.1 skrll rate = (i < N(rates)) ? rates[i].rate : 0;
988 1.1 skrll
989 1.1 skrll imr->ifm_active |= ieee80211_rate2media(ic, rate, ic->ic_curmode);
990 1.1 skrll switch (ic->ic_opmode) {
991 1.1 skrll case IEEE80211_M_STA:
992 1.1 skrll break;
993 1.1 skrll
994 1.1 skrll case IEEE80211_M_IBSS:
995 1.1 skrll imr->ifm_active |= IFM_IEEE80211_ADHOC;
996 1.1 skrll break;
997 1.1 skrll
998 1.1 skrll case IEEE80211_M_MONITOR:
999 1.1 skrll imr->ifm_active |= IFM_IEEE80211_MONITOR;
1000 1.1 skrll break;
1001 1.1 skrll
1002 1.1 skrll case IEEE80211_M_AHDEMO:
1003 1.1 skrll case IEEE80211_M_HOSTAP:
1004 1.1 skrll /* should not get there */
1005 1.1 skrll break;
1006 1.1 skrll }
1007 1.1 skrll #undef N
1008 1.1 skrll }
1009 1.1 skrll
1010 1.1 skrll static int
1011 1.1 skrll iwi_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg)
1012 1.1 skrll {
1013 1.9 dyoung struct iwi_softc *sc = ic->ic_ifp->if_softc;
1014 1.1 skrll
1015 1.1 skrll switch (nstate) {
1016 1.1 skrll case IEEE80211_S_SCAN:
1017 1.12 christos if (sc->flags & IWI_FLAG_SCANNING)
1018 1.12 christos break;
1019 1.12 christos
1020 1.12 christos ieee80211_node_table_reset(&ic->ic_scan);
1021 1.12 christos ic->ic_flags |= IEEE80211_F_SCAN | IEEE80211_F_ASCAN;
1022 1.12 christos sc->flags |= IWI_FLAG_SCANNING;
1023 1.42 rpaulo /* blink the led while scanning */
1024 1.42 rpaulo iwi_led_set(sc, IWI_LED_ASSOCIATED, 1);
1025 1.1 skrll iwi_scan(sc);
1026 1.1 skrll break;
1027 1.1 skrll
1028 1.1 skrll case IEEE80211_S_AUTH:
1029 1.1 skrll iwi_auth_and_assoc(sc);
1030 1.1 skrll break;
1031 1.1 skrll
1032 1.1 skrll case IEEE80211_S_RUN:
1033 1.1 skrll if (ic->ic_opmode == IEEE80211_M_IBSS)
1034 1.1 skrll ieee80211_new_state(ic, IEEE80211_S_AUTH, -1);
1035 1.8 sekiya else if (ic->ic_opmode == IEEE80211_M_MONITOR)
1036 1.8 sekiya iwi_set_chan(sc, ic->ic_ibss_chan);
1037 1.12 christos
1038 1.12 christos return (*sc->sc_newstate)(ic, nstate,
1039 1.12 christos IEEE80211_FC0_SUBTYPE_ASSOC_RESP);
1040 1.1 skrll
1041 1.1 skrll case IEEE80211_S_ASSOC:
1042 1.42 rpaulo iwi_led_set(sc, IWI_LED_ASSOCIATED, 0);
1043 1.12 christos break;
1044 1.12 christos
1045 1.1 skrll case IEEE80211_S_INIT:
1046 1.12 christos sc->flags &= ~IWI_FLAG_SCANNING;
1047 1.19 skrll return (*sc->sc_newstate)(ic, nstate, arg);
1048 1.1 skrll }
1049 1.1 skrll
1050 1.1 skrll ic->ic_state = nstate;
1051 1.1 skrll return 0;
1052 1.1 skrll }
1053 1.1 skrll
1054 1.1 skrll /*
1055 1.38 skrll * WME parameters coming from IEEE 802.11e specification. These values are
1056 1.38 skrll * already declared in ieee80211_proto.c, but they are static so they can't
1057 1.38 skrll * be reused here.
1058 1.38 skrll */
1059 1.38 skrll static const struct wmeParams iwi_wme_cck_params[WME_NUM_AC] = {
1060 1.55 christos { 0, 3, 5, 7, 0, 0, }, /* WME_AC_BE */
1061 1.55 christos { 0, 3, 5, 10, 0, 0, }, /* WME_AC_BK */
1062 1.55 christos { 0, 2, 4, 5, 188, 0, }, /* WME_AC_VI */
1063 1.55 christos { 0, 2, 3, 4, 102, 0, }, /* WME_AC_VO */
1064 1.38 skrll };
1065 1.38 skrll
1066 1.38 skrll static const struct wmeParams iwi_wme_ofdm_params[WME_NUM_AC] = {
1067 1.55 christos { 0, 3, 4, 6, 0, 0, }, /* WME_AC_BE */
1068 1.55 christos { 0, 3, 4, 10, 0, 0, }, /* WME_AC_BK */
1069 1.55 christos { 0, 2, 3, 4, 94, 0, }, /* WME_AC_VI */
1070 1.55 christos { 0, 2, 2, 3, 47, 0, }, /* WME_AC_VO */
1071 1.38 skrll };
1072 1.38 skrll
1073 1.38 skrll static int
1074 1.38 skrll iwi_wme_update(struct ieee80211com *ic)
1075 1.38 skrll {
1076 1.38 skrll #define IWI_EXP2(v) htole16((1 << (v)) - 1)
1077 1.38 skrll #define IWI_USEC(v) htole16(IEEE80211_TXOP_TO_US(v))
1078 1.38 skrll struct iwi_softc *sc = ic->ic_ifp->if_softc;
1079 1.38 skrll struct iwi_wme_params wme[3];
1080 1.38 skrll const struct wmeParams *wmep;
1081 1.38 skrll int ac;
1082 1.38 skrll
1083 1.38 skrll /*
1084 1.38 skrll * We shall not override firmware default WME values if WME is not
1085 1.38 skrll * actually enabled.
1086 1.38 skrll */
1087 1.38 skrll if (!(ic->ic_flags & IEEE80211_F_WME))
1088 1.38 skrll return 0;
1089 1.38 skrll
1090 1.38 skrll for (ac = 0; ac < WME_NUM_AC; ac++) {
1091 1.38 skrll /* set WME values for current operating mode */
1092 1.38 skrll wmep = &ic->ic_wme.wme_chanParams.cap_wmeParams[ac];
1093 1.38 skrll wme[0].aifsn[ac] = wmep->wmep_aifsn;
1094 1.38 skrll wme[0].cwmin[ac] = IWI_EXP2(wmep->wmep_logcwmin);
1095 1.38 skrll wme[0].cwmax[ac] = IWI_EXP2(wmep->wmep_logcwmax);
1096 1.38 skrll wme[0].burst[ac] = IWI_USEC(wmep->wmep_txopLimit);
1097 1.38 skrll wme[0].acm[ac] = wmep->wmep_acm;
1098 1.38 skrll
1099 1.38 skrll /* set WME values for CCK modulation */
1100 1.38 skrll wmep = &iwi_wme_cck_params[ac];
1101 1.38 skrll wme[1].aifsn[ac] = wmep->wmep_aifsn;
1102 1.38 skrll wme[1].cwmin[ac] = IWI_EXP2(wmep->wmep_logcwmin);
1103 1.38 skrll wme[1].cwmax[ac] = IWI_EXP2(wmep->wmep_logcwmax);
1104 1.38 skrll wme[1].burst[ac] = IWI_USEC(wmep->wmep_txopLimit);
1105 1.38 skrll wme[1].acm[ac] = wmep->wmep_acm;
1106 1.38 skrll
1107 1.38 skrll /* set WME values for OFDM modulation */
1108 1.38 skrll wmep = &iwi_wme_ofdm_params[ac];
1109 1.38 skrll wme[2].aifsn[ac] = wmep->wmep_aifsn;
1110 1.38 skrll wme[2].cwmin[ac] = IWI_EXP2(wmep->wmep_logcwmin);
1111 1.38 skrll wme[2].cwmax[ac] = IWI_EXP2(wmep->wmep_logcwmax);
1112 1.38 skrll wme[2].burst[ac] = IWI_USEC(wmep->wmep_txopLimit);
1113 1.38 skrll wme[2].acm[ac] = wmep->wmep_acm;
1114 1.38 skrll }
1115 1.38 skrll
1116 1.38 skrll DPRINTF(("Setting WME parameters\n"));
1117 1.38 skrll return iwi_cmd(sc, IWI_CMD_SET_WME_PARAMS, wme, sizeof wme, 1);
1118 1.38 skrll #undef IWI_USEC
1119 1.38 skrll #undef IWI_EXP2
1120 1.38 skrll }
1121 1.38 skrll
1122 1.38 skrll /*
1123 1.1 skrll * Read 16 bits at address 'addr' from the serial EEPROM.
1124 1.1 skrll */
1125 1.24 skrll static uint16_t
1126 1.24 skrll iwi_read_prom_word(struct iwi_softc *sc, uint8_t addr)
1127 1.1 skrll {
1128 1.24 skrll uint32_t tmp;
1129 1.24 skrll uint16_t val;
1130 1.1 skrll int n;
1131 1.1 skrll
1132 1.1 skrll /* Clock C once before the first command */
1133 1.1 skrll IWI_EEPROM_CTL(sc, 0);
1134 1.1 skrll IWI_EEPROM_CTL(sc, IWI_EEPROM_S);
1135 1.1 skrll IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_C);
1136 1.1 skrll IWI_EEPROM_CTL(sc, IWI_EEPROM_S);
1137 1.1 skrll
1138 1.1 skrll /* Write start bit (1) */
1139 1.1 skrll IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_D);
1140 1.1 skrll IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_D | IWI_EEPROM_C);
1141 1.1 skrll
1142 1.1 skrll /* Write READ opcode (10) */
1143 1.1 skrll IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_D);
1144 1.1 skrll IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_D | IWI_EEPROM_C);
1145 1.1 skrll IWI_EEPROM_CTL(sc, IWI_EEPROM_S);
1146 1.1 skrll IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_C);
1147 1.1 skrll
1148 1.1 skrll /* Write address A7-A0 */
1149 1.1 skrll for (n = 7; n >= 0; n--) {
1150 1.1 skrll IWI_EEPROM_CTL(sc, IWI_EEPROM_S |
1151 1.1 skrll (((addr >> n) & 1) << IWI_EEPROM_SHIFT_D));
1152 1.1 skrll IWI_EEPROM_CTL(sc, IWI_EEPROM_S |
1153 1.1 skrll (((addr >> n) & 1) << IWI_EEPROM_SHIFT_D) | IWI_EEPROM_C);
1154 1.1 skrll }
1155 1.1 skrll
1156 1.1 skrll IWI_EEPROM_CTL(sc, IWI_EEPROM_S);
1157 1.1 skrll
1158 1.1 skrll /* Read data Q15-Q0 */
1159 1.1 skrll val = 0;
1160 1.1 skrll for (n = 15; n >= 0; n--) {
1161 1.1 skrll IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_C);
1162 1.1 skrll IWI_EEPROM_CTL(sc, IWI_EEPROM_S);
1163 1.1 skrll tmp = MEM_READ_4(sc, IWI_MEM_EEPROM_CTL);
1164 1.1 skrll val |= ((tmp & IWI_EEPROM_Q) >> IWI_EEPROM_SHIFT_Q) << n;
1165 1.1 skrll }
1166 1.1 skrll
1167 1.1 skrll IWI_EEPROM_CTL(sc, 0);
1168 1.1 skrll
1169 1.1 skrll /* Clear Chip Select and clock C */
1170 1.1 skrll IWI_EEPROM_CTL(sc, IWI_EEPROM_S);
1171 1.1 skrll IWI_EEPROM_CTL(sc, 0);
1172 1.1 skrll IWI_EEPROM_CTL(sc, IWI_EEPROM_C);
1173 1.1 skrll
1174 1.33 skrll return val;
1175 1.1 skrll }
1176 1.1 skrll
1177 1.1 skrll /*
1178 1.1 skrll * XXX: Hack to set the current channel to the value advertised in beacons or
1179 1.1 skrll * probe responses. Only used during AP detection.
1180 1.1 skrll */
1181 1.1 skrll static void
1182 1.1 skrll iwi_fix_channel(struct ieee80211com *ic, struct mbuf *m)
1183 1.1 skrll {
1184 1.1 skrll struct ieee80211_frame *wh;
1185 1.24 skrll uint8_t subtype;
1186 1.24 skrll uint8_t *frm, *efrm;
1187 1.1 skrll
1188 1.1 skrll wh = mtod(m, struct ieee80211_frame *);
1189 1.1 skrll
1190 1.1 skrll if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) != IEEE80211_FC0_TYPE_MGT)
1191 1.1 skrll return;
1192 1.1 skrll
1193 1.1 skrll subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;
1194 1.1 skrll
1195 1.1 skrll if (subtype != IEEE80211_FC0_SUBTYPE_BEACON &&
1196 1.1 skrll subtype != IEEE80211_FC0_SUBTYPE_PROBE_RESP)
1197 1.1 skrll return;
1198 1.1 skrll
1199 1.24 skrll frm = (uint8_t *)(wh + 1);
1200 1.24 skrll efrm = mtod(m, uint8_t *) + m->m_len;
1201 1.1 skrll
1202 1.1 skrll frm += 12; /* skip tstamp, bintval and capinfo fields */
1203 1.1 skrll while (frm < efrm) {
1204 1.1 skrll if (*frm == IEEE80211_ELEMID_DSPARMS)
1205 1.1 skrll #if IEEE80211_CHAN_MAX < 255
1206 1.1 skrll if (frm[2] <= IEEE80211_CHAN_MAX)
1207 1.1 skrll #endif
1208 1.38 skrll ic->ic_curchan = &ic->ic_channels[frm[2]];
1209 1.1 skrll
1210 1.1 skrll frm += frm[1] + 2;
1211 1.1 skrll }
1212 1.1 skrll }
1213 1.1 skrll
1214 1.31 joerg static struct mbuf *
1215 1.31 joerg iwi_alloc_rx_buf(struct iwi_softc *sc)
1216 1.31 joerg {
1217 1.31 joerg struct mbuf *m;
1218 1.31 joerg
1219 1.31 joerg MGETHDR(m, M_DONTWAIT, MT_DATA);
1220 1.31 joerg if (m == NULL) {
1221 1.31 joerg aprint_error("%s: could not allocate rx mbuf\n",
1222 1.31 joerg sc->sc_dev.dv_xname);
1223 1.31 joerg return NULL;
1224 1.31 joerg }
1225 1.31 joerg
1226 1.31 joerg MCLGET(m, M_DONTWAIT);
1227 1.31 joerg if (!(m->m_flags & M_EXT)) {
1228 1.31 joerg aprint_error("%s: could not allocate rx mbuf cluster\n",
1229 1.31 joerg sc->sc_dev.dv_xname);
1230 1.31 joerg m_freem(m);
1231 1.31 joerg return NULL;
1232 1.31 joerg }
1233 1.31 joerg
1234 1.34 scw m->m_pkthdr.len = m->m_len = m->m_ext.ext_size;
1235 1.31 joerg return m;
1236 1.31 joerg }
1237 1.31 joerg
1238 1.1 skrll static void
1239 1.14 skrll iwi_frame_intr(struct iwi_softc *sc, struct iwi_rx_data *data, int i,
1240 1.1 skrll struct iwi_frame *frame)
1241 1.1 skrll {
1242 1.1 skrll struct ieee80211com *ic = &sc->sc_ic;
1243 1.12 christos struct ifnet *ifp = ic->ic_ifp;
1244 1.31 joerg struct mbuf *m, *m_new;
1245 1.12 christos struct ieee80211_frame *wh;
1246 1.1 skrll struct ieee80211_node *ni;
1247 1.1 skrll int error;
1248 1.1 skrll
1249 1.14 skrll DPRINTFN(5, ("received frame len=%u chan=%u rssi=%u\n",
1250 1.14 skrll le16toh(frame->len), frame->chan, frame->rssi_dbm));
1251 1.1 skrll
1252 1.12 christos if (le16toh(frame->len) < sizeof (struct ieee80211_frame) ||
1253 1.1 skrll le16toh(frame->len) > MCLBYTES) {
1254 1.14 skrll DPRINTF(("%s: bad frame length\n", sc->sc_dev.dv_xname));
1255 1.14 skrll ifp->if_ierrors++;
1256 1.14 skrll return;
1257 1.1 skrll }
1258 1.1 skrll
1259 1.31 joerg /*
1260 1.31 joerg * Try to allocate a new mbuf for this ring element and
1261 1.31 joerg * load it before processing the current mbuf. If the ring
1262 1.31 joerg * element cannot be reloaded, drop the received packet
1263 1.31 joerg * and reuse the old mbuf. In the unlikely case that
1264 1.31 joerg * the old mbuf can't be reloaded either, explicitly panic.
1265 1.31 joerg *
1266 1.31 joerg * XXX Reorganize buffer by moving elements from the logical
1267 1.31 joerg * end of the ring to the front instead of dropping.
1268 1.31 joerg */
1269 1.31 joerg if ((m_new = iwi_alloc_rx_buf(sc)) == NULL) {
1270 1.31 joerg ifp->if_ierrors++;
1271 1.31 joerg return;
1272 1.31 joerg }
1273 1.31 joerg
1274 1.14 skrll bus_dmamap_unload(sc->sc_dmat, data->map);
1275 1.1 skrll
1276 1.34 scw error = bus_dmamap_load_mbuf(sc->sc_dmat, data->map, m_new,
1277 1.34 scw BUS_DMA_READ | BUS_DMA_NOWAIT);
1278 1.31 joerg if (error != 0) {
1279 1.31 joerg aprint_error("%s: could not load rx buf DMA map\n",
1280 1.31 joerg sc->sc_dev.dv_xname);
1281 1.31 joerg m_freem(m_new);
1282 1.31 joerg ifp->if_ierrors++;
1283 1.34 scw error = bus_dmamap_load_mbuf(sc->sc_dmat, data->map,
1284 1.34 scw data->m, BUS_DMA_READ | BUS_DMA_NOWAIT);
1285 1.31 joerg if (error)
1286 1.31 joerg panic("%s: unable to remap rx buf",
1287 1.31 joerg sc->sc_dev.dv_xname);
1288 1.31 joerg return;
1289 1.31 joerg }
1290 1.31 joerg
1291 1.31 joerg /*
1292 1.31 joerg * New mbuf successfully loaded, update RX ring and continue
1293 1.31 joerg * processing.
1294 1.31 joerg */
1295 1.31 joerg m = data->m;
1296 1.31 joerg data->m = m_new;
1297 1.31 joerg CSR_WRITE_4(sc, IWI_CSR_RX_BASE + i * 4, data->map->dm_segs[0].ds_addr);
1298 1.31 joerg
1299 1.1 skrll /* Finalize mbuf */
1300 1.1 skrll m->m_pkthdr.rcvif = ifp;
1301 1.1 skrll m->m_pkthdr.len = m->m_len = sizeof (struct iwi_hdr) +
1302 1.1 skrll sizeof (struct iwi_frame) + le16toh(frame->len);
1303 1.1 skrll
1304 1.1 skrll m_adj(m, sizeof (struct iwi_hdr) + sizeof (struct iwi_frame));
1305 1.1 skrll
1306 1.12 christos if (ic->ic_state == IEEE80211_S_SCAN)
1307 1.12 christos iwi_fix_channel(ic, m);
1308 1.1 skrll
1309 1.1 skrll #if NBPFILTER > 0
1310 1.1 skrll if (sc->sc_drvbpf != NULL) {
1311 1.1 skrll struct iwi_rx_radiotap_header *tap = &sc->sc_rxtap;
1312 1.14 skrll
1313 1.12 christos tap->wr_flags = 0;
1314 1.12 christos tap->wr_rate = frame->rate;
1315 1.12 christos tap->wr_chan_freq =
1316 1.12 christos htole16(ic->ic_channels[frame->chan].ic_freq);
1317 1.12 christos tap->wr_chan_flags =
1318 1.12 christos htole16(ic->ic_channels[frame->chan].ic_flags);
1319 1.12 christos tap->wr_antsignal = frame->signal;
1320 1.12 christos tap->wr_antenna = frame->antenna;
1321 1.1 skrll
1322 1.21 skrll bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_rxtap_len, m);
1323 1.1 skrll }
1324 1.1 skrll #endif
1325 1.1 skrll
1326 1.12 christos wh = mtod(m, struct ieee80211_frame *);
1327 1.12 christos ni = ieee80211_find_rxnode(ic, (struct ieee80211_frame_min *)wh);
1328 1.5 perry
1329 1.1 skrll /* Send the frame to the upper layer */
1330 1.12 christos ieee80211_input(ic, m, ni, frame->rssi_dbm, 0);
1331 1.1 skrll
1332 1.12 christos /* node is no longer needed */
1333 1.9 dyoung ieee80211_free_node(ni);
1334 1.1 skrll }
1335 1.1 skrll
1336 1.1 skrll static void
1337 1.25 skrll iwi_notification_intr(struct iwi_softc *sc, struct iwi_notif *notif)
1338 1.1 skrll {
1339 1.1 skrll struct ieee80211com *ic = &sc->sc_ic;
1340 1.1 skrll struct iwi_notif_scan_channel *chan;
1341 1.1 skrll struct iwi_notif_scan_complete *scan;
1342 1.1 skrll struct iwi_notif_authentication *auth;
1343 1.1 skrll struct iwi_notif_association *assoc;
1344 1.1 skrll
1345 1.1 skrll switch (notif->type) {
1346 1.1 skrll case IWI_NOTIF_TYPE_SCAN_CHANNEL:
1347 1.1 skrll chan = (struct iwi_notif_scan_channel *)(notif + 1);
1348 1.1 skrll
1349 1.23 skrll DPRINTFN(2, ("Finished scanning channel (%u)\n", chan->nchan));
1350 1.1 skrll break;
1351 1.1 skrll
1352 1.1 skrll case IWI_NOTIF_TYPE_SCAN_COMPLETE:
1353 1.1 skrll scan = (struct iwi_notif_scan_complete *)(notif + 1);
1354 1.1 skrll
1355 1.1 skrll DPRINTFN(2, ("Scan completed (%u, %u)\n", scan->nchan,
1356 1.1 skrll scan->status));
1357 1.1 skrll
1358 1.8 sekiya /* monitor mode uses scan to set the channel ... */
1359 1.12 christos if (ic->ic_opmode != IEEE80211_M_MONITOR) {
1360 1.12 christos sc->flags &= ~IWI_FLAG_SCANNING;
1361 1.8 sekiya ieee80211_end_scan(ic);
1362 1.12 christos } else
1363 1.8 sekiya iwi_set_chan(sc, ic->ic_ibss_chan);
1364 1.1 skrll break;
1365 1.1 skrll
1366 1.1 skrll case IWI_NOTIF_TYPE_AUTHENTICATION:
1367 1.1 skrll auth = (struct iwi_notif_authentication *)(notif + 1);
1368 1.1 skrll
1369 1.1 skrll DPRINTFN(2, ("Authentication (%u)\n", auth->state));
1370 1.1 skrll
1371 1.1 skrll switch (auth->state) {
1372 1.1 skrll case IWI_AUTHENTICATED:
1373 1.38 skrll ieee80211_node_authorize(ic->ic_bss);
1374 1.1 skrll ieee80211_new_state(ic, IEEE80211_S_ASSOC, -1);
1375 1.1 skrll break;
1376 1.1 skrll
1377 1.1 skrll case IWI_DEAUTHENTICATED:
1378 1.1 skrll break;
1379 1.1 skrll
1380 1.1 skrll default:
1381 1.1 skrll aprint_error("%s: unknown authentication state %u\n",
1382 1.1 skrll sc->sc_dev.dv_xname, auth->state);
1383 1.1 skrll }
1384 1.1 skrll break;
1385 1.1 skrll
1386 1.1 skrll case IWI_NOTIF_TYPE_ASSOCIATION:
1387 1.1 skrll assoc = (struct iwi_notif_association *)(notif + 1);
1388 1.1 skrll
1389 1.1 skrll DPRINTFN(2, ("Association (%u, %u)\n", assoc->state,
1390 1.1 skrll assoc->status));
1391 1.1 skrll
1392 1.1 skrll switch (assoc->state) {
1393 1.12 christos case IWI_AUTHENTICATED:
1394 1.12 christos /* re-association, do nothing */
1395 1.12 christos break;
1396 1.12 christos
1397 1.1 skrll case IWI_ASSOCIATED:
1398 1.1 skrll ieee80211_new_state(ic, IEEE80211_S_RUN, -1);
1399 1.1 skrll break;
1400 1.1 skrll
1401 1.1 skrll case IWI_DEASSOCIATED:
1402 1.12 christos ieee80211_begin_scan(ic, 1);
1403 1.1 skrll break;
1404 1.1 skrll
1405 1.1 skrll default:
1406 1.1 skrll aprint_error("%s: unknown association state %u\n",
1407 1.1 skrll sc->sc_dev.dv_xname, assoc->state);
1408 1.1 skrll }
1409 1.1 skrll break;
1410 1.1 skrll
1411 1.1 skrll case IWI_NOTIF_TYPE_CALIBRATION:
1412 1.1 skrll case IWI_NOTIF_TYPE_BEACON:
1413 1.1 skrll case IWI_NOTIF_TYPE_NOISE:
1414 1.1 skrll DPRINTFN(5, ("Notification (%u)\n", notif->type));
1415 1.1 skrll break;
1416 1.1 skrll
1417 1.1 skrll default:
1418 1.1 skrll aprint_error("%s: unknown notification type %u\n",
1419 1.1 skrll sc->sc_dev.dv_xname, notif->type);
1420 1.1 skrll }
1421 1.1 skrll }
1422 1.1 skrll
1423 1.1 skrll static void
1424 1.41 skrll iwi_cmd_intr(struct iwi_softc *sc)
1425 1.41 skrll {
1426 1.41 skrll uint32_t hw;
1427 1.41 skrll
1428 1.41 skrll hw = CSR_READ_4(sc, IWI_CSR_CMD_RIDX);
1429 1.41 skrll
1430 1.41 skrll for (; sc->cmdq.next != hw;) {
1431 1.41 skrll bus_dmamap_sync(sc->sc_dmat, sc->cmdq.desc_map,
1432 1.41 skrll sc->cmdq.next * IWI_CMD_DESC_SIZE, IWI_CMD_DESC_SIZE,
1433 1.41 skrll BUS_DMASYNC_POSTWRITE);
1434 1.41 skrll
1435 1.41 skrll wakeup(&sc->cmdq.desc[sc->cmdq.next]);
1436 1.41 skrll sc->cmdq.next = (sc->cmdq.next + 1) % sc->cmdq.count;
1437 1.41 skrll }
1438 1.41 skrll }
1439 1.41 skrll
1440 1.41 skrll static void
1441 1.1 skrll iwi_rx_intr(struct iwi_softc *sc)
1442 1.1 skrll {
1443 1.14 skrll struct iwi_rx_data *data;
1444 1.1 skrll struct iwi_hdr *hdr;
1445 1.14 skrll uint32_t hw;
1446 1.1 skrll
1447 1.14 skrll hw = CSR_READ_4(sc, IWI_CSR_RX_RIDX);
1448 1.1 skrll
1449 1.14 skrll for (; sc->rxq.cur != hw;) {
1450 1.14 skrll data = &sc->rxq.data[sc->rxq.cur];
1451 1.1 skrll
1452 1.14 skrll bus_dmamap_sync(sc->sc_dmat, data->map, 0,
1453 1.34 scw data->map->dm_mapsize, BUS_DMASYNC_POSTREAD);
1454 1.1 skrll
1455 1.14 skrll hdr = mtod(data->m, struct iwi_hdr *);
1456 1.1 skrll
1457 1.1 skrll switch (hdr->type) {
1458 1.1 skrll case IWI_HDR_TYPE_FRAME:
1459 1.14 skrll iwi_frame_intr(sc, data, sc->rxq.cur,
1460 1.1 skrll (struct iwi_frame *)(hdr + 1));
1461 1.1 skrll break;
1462 1.1 skrll
1463 1.1 skrll case IWI_HDR_TYPE_NOTIF:
1464 1.25 skrll iwi_notification_intr(sc,
1465 1.1 skrll (struct iwi_notif *)(hdr + 1));
1466 1.1 skrll break;
1467 1.1 skrll
1468 1.1 skrll default:
1469 1.1 skrll aprint_error("%s: unknown hdr type %u\n",
1470 1.1 skrll sc->sc_dev.dv_xname, hdr->type);
1471 1.1 skrll }
1472 1.14 skrll
1473 1.41 skrll bus_dmamap_sync(sc->sc_dmat, data->map, 0,
1474 1.41 skrll data->map->dm_mapsize, BUS_DMASYNC_PREREAD);
1475 1.41 skrll
1476 1.14 skrll DPRINTFN(15, ("rx done idx=%u\n", sc->rxq.cur));
1477 1.14 skrll
1478 1.14 skrll sc->rxq.cur = (sc->rxq.cur + 1) % sc->rxq.count;
1479 1.1 skrll }
1480 1.1 skrll
1481 1.14 skrll
1482 1.1 skrll /* Tell the firmware what we have processed */
1483 1.14 skrll hw = (hw == 0) ? sc->rxq.count - 1 : hw - 1;
1484 1.14 skrll CSR_WRITE_4(sc, IWI_CSR_RX_WIDX, hw);
1485 1.1 skrll }
1486 1.1 skrll
1487 1.1 skrll static void
1488 1.38 skrll iwi_tx_intr(struct iwi_softc *sc, struct iwi_tx_ring *txq)
1489 1.1 skrll {
1490 1.9 dyoung struct ifnet *ifp = &sc->sc_if;
1491 1.14 skrll struct iwi_tx_data *data;
1492 1.24 skrll uint32_t hw;
1493 1.1 skrll
1494 1.38 skrll hw = CSR_READ_4(sc, txq->csr_ridx);
1495 1.1 skrll
1496 1.38 skrll for (; txq->next != hw;) {
1497 1.38 skrll data = &txq->data[txq->next];
1498 1.1 skrll
1499 1.14 skrll bus_dmamap_sync(sc->sc_dmat, data->map, 0,
1500 1.34 scw data->map->dm_mapsize, BUS_DMASYNC_POSTWRITE);
1501 1.14 skrll bus_dmamap_unload(sc->sc_dmat, data->map);
1502 1.14 skrll m_freem(data->m);
1503 1.14 skrll data->m = NULL;
1504 1.14 skrll ieee80211_free_node(data->ni);
1505 1.14 skrll data->ni = NULL;
1506 1.1 skrll
1507 1.38 skrll DPRINTFN(15, ("tx done idx=%u\n", txq->next));
1508 1.1 skrll
1509 1.12 christos ifp->if_opackets++;
1510 1.1 skrll
1511 1.38 skrll txq->queued--;
1512 1.38 skrll txq->next = (txq->next + 1) % txq->count;
1513 1.1 skrll }
1514 1.1 skrll
1515 1.14 skrll sc->sc_tx_timer = 0;
1516 1.14 skrll ifp->if_flags &= ~IFF_OACTIVE;
1517 1.1 skrll
1518 1.1 skrll /* Call start() since some buffer descriptors have been released */
1519 1.1 skrll (*ifp->if_start)(ifp);
1520 1.1 skrll }
1521 1.1 skrll
1522 1.1 skrll static int
1523 1.1 skrll iwi_intr(void *arg)
1524 1.1 skrll {
1525 1.1 skrll struct iwi_softc *sc = arg;
1526 1.24 skrll uint32_t r;
1527 1.1 skrll
1528 1.1 skrll if ((r = CSR_READ_4(sc, IWI_CSR_INTR)) == 0 || r == 0xffffffff)
1529 1.1 skrll return 0;
1530 1.1 skrll
1531 1.29 skrll /* Acknowledge interrupts */
1532 1.29 skrll CSR_WRITE_4(sc, IWI_CSR_INTR, r);
1533 1.1 skrll
1534 1.1 skrll if (r & (IWI_INTR_FATAL_ERROR | IWI_INTR_PARITY_ERROR)) {
1535 1.1 skrll aprint_error("%s: fatal error\n", sc->sc_dev.dv_xname);
1536 1.36 skrll if (r & IWI_INTR_FATAL_ERROR)
1537 1.36 skrll iwi_error_log(sc);
1538 1.13 skrll sc->sc_ic.ic_ifp->if_flags &= ~IFF_UP;
1539 1.9 dyoung iwi_stop(&sc->sc_if, 1);
1540 1.41 skrll return (1);
1541 1.1 skrll }
1542 1.1 skrll
1543 1.1 skrll if (r & IWI_INTR_FW_INITED) {
1544 1.1 skrll if (!(r & (IWI_INTR_FATAL_ERROR | IWI_INTR_PARITY_ERROR)))
1545 1.1 skrll wakeup(sc);
1546 1.1 skrll }
1547 1.1 skrll
1548 1.1 skrll if (r & IWI_INTR_RADIO_OFF) {
1549 1.1 skrll DPRINTF(("radio transmitter off\n"));
1550 1.13 skrll sc->sc_ic.ic_ifp->if_flags &= ~IFF_UP;
1551 1.9 dyoung iwi_stop(&sc->sc_if, 1);
1552 1.41 skrll return (1);
1553 1.1 skrll }
1554 1.1 skrll
1555 1.14 skrll if (r & IWI_INTR_CMD_DONE)
1556 1.41 skrll iwi_cmd_intr(sc);
1557 1.1 skrll
1558 1.14 skrll if (r & IWI_INTR_TX1_DONE)
1559 1.38 skrll iwi_tx_intr(sc, &sc->txq[0]);
1560 1.38 skrll
1561 1.38 skrll if (r & IWI_INTR_TX2_DONE)
1562 1.38 skrll iwi_tx_intr(sc, &sc->txq[1]);
1563 1.38 skrll
1564 1.38 skrll if (r & IWI_INTR_TX3_DONE)
1565 1.38 skrll iwi_tx_intr(sc, &sc->txq[2]);
1566 1.38 skrll
1567 1.38 skrll if (r & IWI_INTR_TX4_DONE)
1568 1.38 skrll iwi_tx_intr(sc, &sc->txq[3]);
1569 1.38 skrll
1570 1.38 skrll if (r & IWI_INTR_RX_DONE)
1571 1.38 skrll iwi_rx_intr(sc);
1572 1.1 skrll
1573 1.1 skrll return 1;
1574 1.1 skrll }
1575 1.1 skrll
1576 1.1 skrll static int
1577 1.24 skrll iwi_cmd(struct iwi_softc *sc, uint8_t type, void *data, uint8_t len,
1578 1.1 skrll int async)
1579 1.1 skrll {
1580 1.1 skrll struct iwi_cmd_desc *desc;
1581 1.1 skrll
1582 1.14 skrll desc = &sc->cmdq.desc[sc->cmdq.cur];
1583 1.1 skrll
1584 1.1 skrll desc->hdr.type = IWI_HDR_TYPE_COMMAND;
1585 1.1 skrll desc->hdr.flags = IWI_HDR_FLAG_IRQ;
1586 1.1 skrll desc->type = type;
1587 1.1 skrll desc->len = len;
1588 1.1 skrll memcpy(desc->data, data, len);
1589 1.1 skrll
1590 1.14 skrll bus_dmamap_sync(sc->sc_dmat, sc->cmdq.desc_map,
1591 1.25 skrll sc->cmdq.cur * IWI_CMD_DESC_SIZE,
1592 1.25 skrll IWI_CMD_DESC_SIZE, BUS_DMASYNC_PREWRITE);
1593 1.1 skrll
1594 1.25 skrll DPRINTFN(2, ("sending command idx=%u type=%u len=%u\n", sc->cmdq.cur,
1595 1.14 skrll type, len));
1596 1.14 skrll
1597 1.14 skrll sc->cmdq.cur = (sc->cmdq.cur + 1) % sc->cmdq.count;
1598 1.14 skrll CSR_WRITE_4(sc, IWI_CSR_CMD_WIDX, sc->cmdq.cur);
1599 1.1 skrll
1600 1.41 skrll return async ? 0 : tsleep(desc, 0, "iwicmd", hz);
1601 1.1 skrll }
1602 1.1 skrll
1603 1.38 skrll static void
1604 1.38 skrll iwi_write_ibssnode(struct iwi_softc *sc, const struct iwi_node *in)
1605 1.38 skrll {
1606 1.38 skrll struct iwi_ibssnode node;
1607 1.38 skrll
1608 1.38 skrll /* write node information into NIC memory */
1609 1.38 skrll memset(&node, 0, sizeof node);
1610 1.38 skrll IEEE80211_ADDR_COPY(node.bssid, in->in_node.ni_macaddr);
1611 1.38 skrll
1612 1.38 skrll CSR_WRITE_REGION_1(sc,
1613 1.38 skrll IWI_CSR_NODE_BASE + in->in_station * sizeof node,
1614 1.38 skrll (uint8_t *)&node, sizeof node);
1615 1.38 skrll }
1616 1.38 skrll
1617 1.1 skrll static int
1618 1.38 skrll iwi_tx_start(struct ifnet *ifp, struct mbuf *m0, struct ieee80211_node *ni,
1619 1.38 skrll int ac)
1620 1.1 skrll {
1621 1.1 skrll struct iwi_softc *sc = ifp->if_softc;
1622 1.1 skrll struct ieee80211com *ic = &sc->sc_ic;
1623 1.38 skrll struct iwi_node *in = (struct iwi_node *)ni;
1624 1.38 skrll struct ieee80211_frame *wh;
1625 1.12 christos struct ieee80211_key *k;
1626 1.38 skrll const struct chanAccParams *cap;
1627 1.38 skrll struct iwi_tx_ring *txq = &sc->txq[ac];
1628 1.14 skrll struct iwi_tx_data *data;
1629 1.1 skrll struct iwi_tx_desc *desc;
1630 1.1 skrll struct mbuf *mnew;
1631 1.38 skrll int error, hdrlen, i, noack = 0;
1632 1.38 skrll
1633 1.38 skrll wh = mtod(m0, struct ieee80211_frame *);
1634 1.38 skrll
1635 1.38 skrll if (wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_QOS) {
1636 1.38 skrll hdrlen = sizeof (struct ieee80211_qosframe);
1637 1.38 skrll cap = &ic->ic_wme.wme_chanParams;
1638 1.38 skrll noack = cap->cap_wmeParams[ac].wmep_noackPolicy;
1639 1.38 skrll } else
1640 1.38 skrll hdrlen = sizeof (struct ieee80211_frame);
1641 1.38 skrll
1642 1.38 skrll /*
1643 1.38 skrll * This is only used in IBSS mode where the firmware expect an index
1644 1.38 skrll * in a h/w table instead of a destination address.
1645 1.38 skrll */
1646 1.38 skrll if (ic->ic_opmode == IEEE80211_M_IBSS && in->in_station == -1) {
1647 1.38 skrll in->in_station = iwi_alloc_unr(sc);
1648 1.38 skrll
1649 1.38 skrll if (in->in_station == -1) { /* h/w table is full */
1650 1.38 skrll m_freem(m0);
1651 1.38 skrll ieee80211_free_node(ni);
1652 1.38 skrll ifp->if_oerrors++;
1653 1.38 skrll return 0;
1654 1.38 skrll }
1655 1.38 skrll iwi_write_ibssnode(sc, in);
1656 1.38 skrll }
1657 1.1 skrll
1658 1.38 skrll if (wh->i_fc[1] & IEEE80211_FC1_WEP) {
1659 1.12 christos k = ieee80211_crypto_encap(ic, ni, m0);
1660 1.12 christos if (k == NULL) {
1661 1.12 christos m_freem(m0);
1662 1.12 christos return ENOBUFS;
1663 1.12 christos }
1664 1.38 skrll
1665 1.38 skrll /* packet header may have moved, reset our local pointer */
1666 1.38 skrll wh = mtod(m0, struct ieee80211_frame *);
1667 1.12 christos }
1668 1.12 christos
1669 1.1 skrll #if NBPFILTER > 0
1670 1.1 skrll if (sc->sc_drvbpf != NULL) {
1671 1.1 skrll struct iwi_tx_radiotap_header *tap = &sc->sc_txtap;
1672 1.1 skrll
1673 1.1 skrll tap->wt_flags = 0;
1674 1.12 christos tap->wt_chan_freq = htole16(ic->ic_ibss_chan->ic_freq);
1675 1.12 christos tap->wt_chan_flags = htole16(ic->ic_ibss_chan->ic_flags);
1676 1.1 skrll
1677 1.1 skrll bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_txtap_len, m0);
1678 1.1 skrll }
1679 1.1 skrll #endif
1680 1.1 skrll
1681 1.38 skrll data = &txq->data[txq->cur];
1682 1.38 skrll desc = &txq->desc[txq->cur];
1683 1.1 skrll
1684 1.38 skrll /* save and trim IEEE802.11 header */
1685 1.38 skrll m_copydata(m0, 0, hdrlen, (caddr_t)&desc->wh);
1686 1.38 skrll m_adj(m0, hdrlen);
1687 1.1 skrll
1688 1.34 scw error = bus_dmamap_load_mbuf(sc->sc_dmat, data->map, m0,
1689 1.34 scw BUS_DMA_WRITE | BUS_DMA_NOWAIT);
1690 1.1 skrll if (error != 0 && error != EFBIG) {
1691 1.1 skrll aprint_error("%s: could not map mbuf (error %d)\n",
1692 1.1 skrll sc->sc_dev.dv_xname, error);
1693 1.1 skrll m_freem(m0);
1694 1.1 skrll return error;
1695 1.1 skrll }
1696 1.1 skrll if (error != 0) {
1697 1.1 skrll /* too many fragments, linearize */
1698 1.1 skrll
1699 1.1 skrll MGETHDR(mnew, M_DONTWAIT, MT_DATA);
1700 1.1 skrll if (mnew == NULL) {
1701 1.1 skrll m_freem(m0);
1702 1.1 skrll return ENOMEM;
1703 1.1 skrll }
1704 1.1 skrll
1705 1.1 skrll M_COPY_PKTHDR(mnew, m0);
1706 1.34 scw
1707 1.34 scw /* If the data won't fit in the header, get a cluster */
1708 1.34 scw if (m0->m_pkthdr.len > MHLEN) {
1709 1.34 scw MCLGET(mnew, M_DONTWAIT);
1710 1.34 scw if (!(mnew->m_flags & M_EXT)) {
1711 1.34 scw m_freem(m0);
1712 1.34 scw m_freem(mnew);
1713 1.34 scw return ENOMEM;
1714 1.34 scw }
1715 1.1 skrll }
1716 1.1 skrll m_copydata(m0, 0, m0->m_pkthdr.len, mtod(mnew, caddr_t));
1717 1.1 skrll m_freem(m0);
1718 1.1 skrll mnew->m_len = mnew->m_pkthdr.len;
1719 1.1 skrll m0 = mnew;
1720 1.1 skrll
1721 1.14 skrll error = bus_dmamap_load_mbuf(sc->sc_dmat, data->map, m0,
1722 1.34 scw BUS_DMA_WRITE | BUS_DMA_NOWAIT);
1723 1.1 skrll if (error != 0) {
1724 1.1 skrll aprint_error("%s: could not map mbuf (error %d)\n",
1725 1.1 skrll sc->sc_dev.dv_xname, error);
1726 1.1 skrll m_freem(m0);
1727 1.1 skrll return error;
1728 1.1 skrll }
1729 1.1 skrll }
1730 1.1 skrll
1731 1.14 skrll data->m = m0;
1732 1.14 skrll data->ni = ni;
1733 1.1 skrll
1734 1.1 skrll desc->hdr.type = IWI_HDR_TYPE_DATA;
1735 1.1 skrll desc->hdr.flags = IWI_HDR_FLAG_IRQ;
1736 1.38 skrll desc->station =
1737 1.38 skrll (ic->ic_opmode == IEEE80211_M_IBSS) ? in->in_station : 0;
1738 1.1 skrll desc->cmd = IWI_DATA_CMD_TX;
1739 1.1 skrll desc->len = htole16(m0->m_pkthdr.len);
1740 1.1 skrll desc->flags = 0;
1741 1.38 skrll desc->xflags = 0;
1742 1.38 skrll
1743 1.38 skrll if (!noack && !IEEE80211_IS_MULTICAST(desc->wh.i_addr1))
1744 1.1 skrll desc->flags |= IWI_DATA_FLAG_NEED_ACK;
1745 1.1 skrll
1746 1.12 christos #if 0
1747 1.1 skrll if (ic->ic_flags & IEEE80211_F_PRIVACY) {
1748 1.38 skrll desc->wh.i_fc[1] |= IEEE80211_FC1_WEP;
1749 1.12 christos desc->wep_txkey = ic->ic_crypto.cs_def_txkey;
1750 1.1 skrll } else
1751 1.12 christos #endif
1752 1.1 skrll desc->flags |= IWI_DATA_FLAG_NO_WEP;
1753 1.1 skrll
1754 1.1 skrll if (ic->ic_flags & IEEE80211_F_SHPREAMBLE)
1755 1.1 skrll desc->flags |= IWI_DATA_FLAG_SHPREAMBLE;
1756 1.1 skrll
1757 1.38 skrll if (desc->wh.i_fc[0] & IEEE80211_FC0_SUBTYPE_QOS)
1758 1.38 skrll desc->xflags |= IWI_DATA_XFLAG_QOS;
1759 1.38 skrll
1760 1.14 skrll desc->nseg = htole32(data->map->dm_nsegs);
1761 1.14 skrll for (i = 0; i < data->map->dm_nsegs; i++) {
1762 1.14 skrll desc->seg_addr[i] = htole32(data->map->dm_segs[i].ds_addr);
1763 1.32 scw desc->seg_len[i] = htole16(data->map->dm_segs[i].ds_len);
1764 1.1 skrll }
1765 1.1 skrll
1766 1.38 skrll bus_dmamap_sync(sc->sc_dmat, txq->desc_map,
1767 1.38 skrll txq->cur * IWI_TX_DESC_SIZE,
1768 1.25 skrll IWI_TX_DESC_SIZE, BUS_DMASYNC_PREWRITE);
1769 1.1 skrll
1770 1.32 scw bus_dmamap_sync(sc->sc_dmat, data->map, 0, data->map->dm_mapsize,
1771 1.1 skrll BUS_DMASYNC_PREWRITE);
1772 1.1 skrll
1773 1.38 skrll DPRINTFN(5, ("sending data frame txq=%u idx=%u len=%u nseg=%u\n",
1774 1.38 skrll ac, txq->cur, le16toh(desc->len), le32toh(desc->nseg)));
1775 1.1 skrll
1776 1.1 skrll /* Inform firmware about this new packet */
1777 1.38 skrll txq->queued++;
1778 1.38 skrll txq->cur = (txq->cur + 1) % txq->count;
1779 1.38 skrll CSR_WRITE_4(sc, txq->csr_widx, txq->cur);
1780 1.1 skrll
1781 1.1 skrll return 0;
1782 1.1 skrll }
1783 1.1 skrll
1784 1.1 skrll static void
1785 1.1 skrll iwi_start(struct ifnet *ifp)
1786 1.1 skrll {
1787 1.1 skrll struct iwi_softc *sc = ifp->if_softc;
1788 1.1 skrll struct ieee80211com *ic = &sc->sc_ic;
1789 1.1 skrll struct mbuf *m0;
1790 1.12 christos struct ether_header *eh;
1791 1.1 skrll struct ieee80211_node *ni;
1792 1.38 skrll int ac;
1793 1.1 skrll
1794 1.1 skrll if (ic->ic_state != IEEE80211_S_RUN)
1795 1.1 skrll return;
1796 1.1 skrll
1797 1.1 skrll for (;;) {
1798 1.1 skrll IF_DEQUEUE(&ifp->if_snd, m0);
1799 1.1 skrll if (m0 == NULL)
1800 1.1 skrll break;
1801 1.1 skrll
1802 1.14 skrll if (m0->m_len < sizeof (struct ether_header) &&
1803 1.38 skrll (m0 = m_pullup(m0, sizeof (struct ether_header))) == NULL) {
1804 1.38 skrll ifp->if_oerrors++;
1805 1.25 skrll continue;
1806 1.38 skrll }
1807 1.14 skrll
1808 1.12 christos eh = mtod(m0, struct ether_header *);
1809 1.12 christos ni = ieee80211_find_txnode(ic, eh->ether_dhost);
1810 1.12 christos if (ni == NULL) {
1811 1.9 dyoung m_freem(m0);
1812 1.38 skrll ifp->if_oerrors++;
1813 1.9 dyoung continue;
1814 1.9 dyoung }
1815 1.1 skrll
1816 1.38 skrll /* classify mbuf so we can find which tx ring to use */
1817 1.38 skrll if (ieee80211_classify(ic, m0, ni) != 0) {
1818 1.38 skrll m_freem(m0);
1819 1.38 skrll ieee80211_free_node(ni);
1820 1.38 skrll ifp->if_oerrors++;
1821 1.38 skrll continue;
1822 1.38 skrll }
1823 1.38 skrll
1824 1.38 skrll /* no QoS encapsulation for EAPOL frames */
1825 1.38 skrll ac = (eh->ether_type != htons(ETHERTYPE_PAE)) ?
1826 1.38 skrll M_WME_GETAC(m0) : WME_AC_BE;
1827 1.38 skrll
1828 1.38 skrll if (sc->txq[ac].queued > sc->txq[ac].count - 8) {
1829 1.38 skrll /* there is no place left in this ring */
1830 1.38 skrll IF_PREPEND(&ifp->if_snd, m0);
1831 1.38 skrll ifp->if_flags |= IFF_OACTIVE;
1832 1.38 skrll break;
1833 1.38 skrll }
1834 1.39 skrll
1835 1.39 skrll #if NBPFILTER > 0
1836 1.39 skrll if (ifp->if_bpf != NULL)
1837 1.39 skrll bpf_mtap(ifp->if_bpf, m0);
1838 1.38 skrll #endif
1839 1.39 skrll
1840 1.12 christos m0 = ieee80211_encap(ic, m0, ni);
1841 1.12 christos if (m0 == NULL) {
1842 1.12 christos ieee80211_free_node(ni);
1843 1.38 skrll ifp->if_oerrors++;
1844 1.12 christos continue;
1845 1.12 christos }
1846 1.1 skrll
1847 1.25 skrll #if NBPFILTER > 0
1848 1.25 skrll if (ic->ic_rawbpf != NULL)
1849 1.25 skrll bpf_mtap(ic->ic_rawbpf, m0);
1850 1.25 skrll #endif
1851 1.25 skrll
1852 1.38 skrll if (iwi_tx_start(ifp, m0, ni, ac) != 0) {
1853 1.12 christos ieee80211_free_node(ni);
1854 1.12 christos ifp->if_oerrors++;
1855 1.1 skrll break;
1856 1.1 skrll }
1857 1.1 skrll
1858 1.1 skrll /* start watchdog timer */
1859 1.1 skrll sc->sc_tx_timer = 5;
1860 1.1 skrll ifp->if_timer = 1;
1861 1.1 skrll }
1862 1.1 skrll }
1863 1.1 skrll
1864 1.1 skrll static void
1865 1.1 skrll iwi_watchdog(struct ifnet *ifp)
1866 1.1 skrll {
1867 1.1 skrll struct iwi_softc *sc = ifp->if_softc;
1868 1.1 skrll
1869 1.1 skrll ifp->if_timer = 0;
1870 1.1 skrll
1871 1.1 skrll if (sc->sc_tx_timer > 0) {
1872 1.1 skrll if (--sc->sc_tx_timer == 0) {
1873 1.1 skrll aprint_error("%s: device timeout\n",
1874 1.1 skrll sc->sc_dev.dv_xname);
1875 1.12 christos ifp->if_oerrors++;
1876 1.12 christos ifp->if_flags &= ~IFF_UP;
1877 1.1 skrll iwi_stop(ifp, 1);
1878 1.1 skrll return;
1879 1.1 skrll }
1880 1.1 skrll ifp->if_timer = 1;
1881 1.1 skrll }
1882 1.1 skrll
1883 1.9 dyoung ieee80211_watchdog(&sc->sc_ic);
1884 1.1 skrll }
1885 1.1 skrll
1886 1.1 skrll static int
1887 1.24 skrll iwi_get_table0(struct iwi_softc *sc, uint32_t *tbl)
1888 1.1 skrll {
1889 1.24 skrll uint32_t size, buf[128];
1890 1.1 skrll
1891 1.1 skrll if (!(sc->flags & IWI_FLAG_FW_INITED)) {
1892 1.1 skrll memset(buf, 0, sizeof buf);
1893 1.1 skrll return copyout(buf, tbl, sizeof buf);
1894 1.1 skrll }
1895 1.1 skrll
1896 1.1 skrll size = min(CSR_READ_4(sc, IWI_CSR_TABLE0_SIZE), 128 - 1);
1897 1.1 skrll CSR_READ_REGION_4(sc, IWI_CSR_TABLE0_BASE, &buf[1], size);
1898 1.1 skrll
1899 1.1 skrll return copyout(buf, tbl, sizeof buf);
1900 1.1 skrll }
1901 1.1 skrll
1902 1.1 skrll static int
1903 1.1 skrll iwi_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
1904 1.1 skrll {
1905 1.43 skrll #define IS_RUNNING(ifp) \
1906 1.43 skrll ((ifp->if_flags & IFF_UP) && (ifp->if_flags & IFF_RUNNING))
1907 1.43 skrll
1908 1.1 skrll struct iwi_softc *sc = ifp->if_softc;
1909 1.38 skrll struct ieee80211com *ic = &sc->sc_ic;
1910 1.43 skrll struct ifreq *ifr = (struct ifreq *)data;
1911 1.1 skrll int s, error = 0;
1912 1.54 skrll int val;
1913 1.1 skrll
1914 1.1 skrll s = splnet();
1915 1.1 skrll
1916 1.1 skrll switch (cmd) {
1917 1.1 skrll case SIOCSIFFLAGS:
1918 1.1 skrll if (ifp->if_flags & IFF_UP) {
1919 1.1 skrll if (!(ifp->if_flags & IFF_RUNNING))
1920 1.1 skrll iwi_init(ifp);
1921 1.1 skrll } else {
1922 1.1 skrll if (ifp->if_flags & IFF_RUNNING)
1923 1.1 skrll iwi_stop(ifp, 1);
1924 1.1 skrll }
1925 1.1 skrll break;
1926 1.1 skrll
1927 1.43 skrll case SIOCADDMULTI:
1928 1.43 skrll case SIOCDELMULTI:
1929 1.43 skrll error = (cmd == SIOCADDMULTI) ?
1930 1.43 skrll ether_addmulti(ifr, &sc->sc_ec) :
1931 1.43 skrll ether_delmulti(ifr, &sc->sc_ec);
1932 1.43 skrll if (error == ENETRESET) {
1933 1.43 skrll /* setup multicast filter, etc */
1934 1.43 skrll error = 0;
1935 1.43 skrll }
1936 1.43 skrll break;
1937 1.43 skrll
1938 1.1 skrll case SIOCGTABLE0:
1939 1.24 skrll error = iwi_get_table0(sc, (uint32_t *)ifr->ifr_data);
1940 1.1 skrll break;
1941 1.1 skrll
1942 1.1 skrll case SIOCGRADIO:
1943 1.54 skrll val = !iwi_getrfkill(sc);
1944 1.54 skrll error = copyout(&val, (int *)ifr->ifr_data, sizeof val);
1945 1.1 skrll break;
1946 1.1 skrll
1947 1.52 skrll case SIOCSIFMEDIA:
1948 1.52 skrll if (ifr->ifr_media & IFM_IEEE80211_ADHOC) {
1949 1.52 skrll sc->sc_fwname = "iwi-ibss.fw";
1950 1.52 skrll sc->sc_ucname = "iwi-ucode-ibss.fw";
1951 1.52 skrll } else if (ifr->ifr_media & IFM_IEEE80211_MONITOR) {
1952 1.52 skrll sc->sc_fwname = "iwi-sniffer.fw";
1953 1.52 skrll sc->sc_ucname = "iwi-ucode-sniffer.fw";
1954 1.52 skrll } else {
1955 1.52 skrll sc->sc_fwname = "iwi-bss.fw";
1956 1.52 skrll sc->sc_ucname = "iwi-ucode-bss.fw";
1957 1.52 skrll }
1958 1.52 skrll error = iwi_cache_firmware(sc);
1959 1.52 skrll if (error)
1960 1.52 skrll break;
1961 1.52 skrll /* FALLTRHOUGH */
1962 1.1 skrll
1963 1.1 skrll default:
1964 1.9 dyoung error = ieee80211_ioctl(&sc->sc_ic, cmd, data);
1965 1.1 skrll
1966 1.43 skrll if (error == ENETRESET) {
1967 1.43 skrll if (IS_RUNNING(ifp) &&
1968 1.43 skrll (ic->ic_roaming != IEEE80211_ROAMING_MANUAL))
1969 1.43 skrll iwi_init(ifp);
1970 1.43 skrll error = 0;
1971 1.43 skrll }
1972 1.1 skrll }
1973 1.1 skrll
1974 1.1 skrll splx(s);
1975 1.1 skrll return error;
1976 1.43 skrll #undef IS_RUNNING
1977 1.1 skrll }
1978 1.1 skrll
1979 1.1 skrll static void
1980 1.1 skrll iwi_stop_master(struct iwi_softc *sc)
1981 1.1 skrll {
1982 1.1 skrll int ntries;
1983 1.1 skrll
1984 1.1 skrll /* Disable interrupts */
1985 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_INTR_MASK, 0);
1986 1.1 skrll
1987 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_RST, IWI_RST_STOP_MASTER);
1988 1.1 skrll for (ntries = 0; ntries < 5; ntries++) {
1989 1.1 skrll if (CSR_READ_4(sc, IWI_CSR_RST) & IWI_RST_MASTER_DISABLED)
1990 1.1 skrll break;
1991 1.1 skrll DELAY(10);
1992 1.1 skrll }
1993 1.1 skrll if (ntries == 5)
1994 1.1 skrll aprint_error("%s: timeout waiting for master\n",
1995 1.1 skrll sc->sc_dev.dv_xname);
1996 1.1 skrll
1997 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_RST, CSR_READ_4(sc, IWI_CSR_RST) |
1998 1.1 skrll IWI_RST_PRINCETON_RESET);
1999 1.1 skrll
2000 1.1 skrll sc->flags &= ~IWI_FLAG_FW_INITED;
2001 1.1 skrll }
2002 1.1 skrll
2003 1.1 skrll static int
2004 1.1 skrll iwi_reset(struct iwi_softc *sc)
2005 1.1 skrll {
2006 1.1 skrll int i, ntries;
2007 1.1 skrll
2008 1.1 skrll iwi_stop_master(sc);
2009 1.1 skrll
2010 1.1 skrll /* Move adapter to D0 state */
2011 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_CTL, CSR_READ_4(sc, IWI_CSR_CTL) |
2012 1.1 skrll IWI_CTL_INIT);
2013 1.1 skrll
2014 1.1 skrll /* Initialize Phase-Locked Level (PLL) */
2015 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_READ_INT, IWI_READ_INT_INIT_HOST);
2016 1.1 skrll
2017 1.1 skrll /* Wait for clock stabilization */
2018 1.1 skrll for (ntries = 0; ntries < 1000; ntries++) {
2019 1.1 skrll if (CSR_READ_4(sc, IWI_CSR_CTL) & IWI_CTL_CLOCK_READY)
2020 1.1 skrll break;
2021 1.1 skrll DELAY(200);
2022 1.1 skrll }
2023 1.25 skrll if (ntries == 1000) {
2024 1.25 skrll aprint_error("%s: timeout waiting for clock stabilization\n",
2025 1.25 skrll sc->sc_dev.dv_xname);
2026 1.1 skrll return EIO;
2027 1.25 skrll }
2028 1.1 skrll
2029 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_RST, CSR_READ_4(sc, IWI_CSR_RST) |
2030 1.1 skrll IWI_RST_SW_RESET);
2031 1.1 skrll
2032 1.1 skrll DELAY(10);
2033 1.1 skrll
2034 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_CTL, CSR_READ_4(sc, IWI_CSR_CTL) |
2035 1.1 skrll IWI_CTL_INIT);
2036 1.1 skrll
2037 1.1 skrll /* Clear NIC memory */
2038 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_AUTOINC_ADDR, 0);
2039 1.1 skrll for (i = 0; i < 0xc000; i++)
2040 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_AUTOINC_DATA, 0);
2041 1.1 skrll
2042 1.1 skrll return 0;
2043 1.1 skrll }
2044 1.1 skrll
2045 1.1 skrll static int
2046 1.1 skrll iwi_load_ucode(struct iwi_softc *sc, void *uc, int size)
2047 1.1 skrll {
2048 1.24 skrll uint16_t *w;
2049 1.1 skrll int ntries, i;
2050 1.1 skrll
2051 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_RST, CSR_READ_4(sc, IWI_CSR_RST) |
2052 1.1 skrll IWI_RST_STOP_MASTER);
2053 1.1 skrll for (ntries = 0; ntries < 5; ntries++) {
2054 1.1 skrll if (CSR_READ_4(sc, IWI_CSR_RST) & IWI_RST_MASTER_DISABLED)
2055 1.1 skrll break;
2056 1.1 skrll DELAY(10);
2057 1.1 skrll }
2058 1.1 skrll if (ntries == 5) {
2059 1.1 skrll aprint_error("%s: timeout waiting for master\n",
2060 1.1 skrll sc->sc_dev.dv_xname);
2061 1.1 skrll return EIO;
2062 1.1 skrll }
2063 1.1 skrll
2064 1.1 skrll MEM_WRITE_4(sc, 0x3000e0, 0x80000000);
2065 1.1 skrll DELAY(5000);
2066 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_RST, CSR_READ_4(sc, IWI_CSR_RST) &
2067 1.1 skrll ~IWI_RST_PRINCETON_RESET);
2068 1.1 skrll DELAY(5000);
2069 1.1 skrll MEM_WRITE_4(sc, 0x3000e0, 0);
2070 1.1 skrll DELAY(1000);
2071 1.1 skrll MEM_WRITE_4(sc, 0x300004, 1);
2072 1.1 skrll DELAY(1000);
2073 1.1 skrll MEM_WRITE_4(sc, 0x300004, 0);
2074 1.1 skrll DELAY(1000);
2075 1.1 skrll MEM_WRITE_1(sc, 0x200000, 0x00);
2076 1.1 skrll MEM_WRITE_1(sc, 0x200000, 0x40);
2077 1.14 skrll DELAY(1000);
2078 1.1 skrll
2079 1.1 skrll /* Adapter is buggy, we must set the address for each word */
2080 1.1 skrll for (w = uc; size > 0; w++, size -= 2)
2081 1.32 scw MEM_WRITE_2(sc, 0x200010, htole16(*w));
2082 1.1 skrll
2083 1.1 skrll MEM_WRITE_1(sc, 0x200000, 0x00);
2084 1.1 skrll MEM_WRITE_1(sc, 0x200000, 0x80);
2085 1.1 skrll
2086 1.1 skrll /* Wait until we get a response in the uc queue */
2087 1.1 skrll for (ntries = 0; ntries < 100; ntries++) {
2088 1.1 skrll if (MEM_READ_1(sc, 0x200000) & 1)
2089 1.1 skrll break;
2090 1.1 skrll DELAY(100);
2091 1.1 skrll }
2092 1.1 skrll if (ntries == 100) {
2093 1.1 skrll aprint_error("%s: timeout waiting for ucode to initialize\n",
2094 1.1 skrll sc->sc_dev.dv_xname);
2095 1.1 skrll return EIO;
2096 1.1 skrll }
2097 1.1 skrll
2098 1.1 skrll /* Empty the uc queue or the firmware will not initialize properly */
2099 1.1 skrll for (i = 0; i < 7; i++)
2100 1.1 skrll MEM_READ_4(sc, 0x200004);
2101 1.1 skrll
2102 1.1 skrll MEM_WRITE_1(sc, 0x200000, 0x00);
2103 1.1 skrll
2104 1.1 skrll return 0;
2105 1.1 skrll }
2106 1.1 skrll
2107 1.1 skrll /* macro to handle unaligned little endian data in firmware image */
2108 1.1 skrll #define GETLE32(p) ((p)[0] | (p)[1] << 8 | (p)[2] << 16 | (p)[3] << 24)
2109 1.1 skrll static int
2110 1.1 skrll iwi_load_firmware(struct iwi_softc *sc, void *fw, int size)
2111 1.1 skrll {
2112 1.1 skrll bus_dmamap_t map;
2113 1.1 skrll u_char *p, *end;
2114 1.27 skrll uint32_t sentinel, ctl, sum;
2115 1.27 skrll uint32_t cs, sl, cd, cl;
2116 1.1 skrll int ntries, nsegs, error;
2117 1.27 skrll int sn;
2118 1.1 skrll
2119 1.27 skrll nsegs = (size + PAGE_SIZE - 1) / PAGE_SIZE;
2120 1.27 skrll
2121 1.28 skrll /* Create a DMA map for the firmware image */
2122 1.27 skrll error = bus_dmamap_create(sc->sc_dmat, size, nsegs, size, 0,
2123 1.1 skrll BUS_DMA_NOWAIT, &map);
2124 1.1 skrll if (error != 0) {
2125 1.1 skrll aprint_error("%s: could not create firmware DMA map\n",
2126 1.1 skrll sc->sc_dev.dv_xname);
2127 1.1 skrll goto fail1;
2128 1.1 skrll }
2129 1.1 skrll
2130 1.27 skrll error = bus_dmamap_load(sc->sc_dmat, map, fw, size, NULL,
2131 1.27 skrll BUS_DMA_NOWAIT | BUS_DMA_WRITE);
2132 1.1 skrll if (error != 0) {
2133 1.27 skrll aprint_error("%s: could not load fw dma map(%d)\n",
2134 1.27 skrll sc->sc_dev.dv_xname, error);
2135 1.1 skrll goto fail2;
2136 1.1 skrll }
2137 1.1 skrll
2138 1.1 skrll /* Make sure the adapter will get up-to-date values */
2139 1.1 skrll bus_dmamap_sync(sc->sc_dmat, map, 0, size, BUS_DMASYNC_PREWRITE);
2140 1.1 skrll
2141 1.1 skrll /* Tell the adapter where the command blocks are stored */
2142 1.1 skrll MEM_WRITE_4(sc, 0x3000a0, 0x27000);
2143 1.1 skrll
2144 1.1 skrll /*
2145 1.1 skrll * Store command blocks into adapter's internal memory using register
2146 1.1 skrll * indirections. The adapter will read the firmware image through DMA
2147 1.1 skrll * using information stored in command blocks.
2148 1.1 skrll */
2149 1.27 skrll p = fw;
2150 1.1 skrll end = p + size;
2151 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_AUTOINC_ADDR, 0x27000);
2152 1.1 skrll
2153 1.27 skrll sn = 0;
2154 1.27 skrll sl = cl = 0;
2155 1.27 skrll cs = cd = 0;
2156 1.1 skrll while (p < end) {
2157 1.27 skrll if (sl == 0) {
2158 1.27 skrll cs = map->dm_segs[sn].ds_addr;
2159 1.27 skrll sl = map->dm_segs[sn].ds_len;
2160 1.27 skrll sn++;
2161 1.27 skrll }
2162 1.27 skrll if (cl == 0) {
2163 1.27 skrll cd = GETLE32(p); p += 4; cs += 4; sl -= 4;
2164 1.27 skrll cl = GETLE32(p); p += 4; cs += 4; sl -= 4;
2165 1.27 skrll }
2166 1.27 skrll while (sl > 0 && cl > 0) {
2167 1.27 skrll int len = min(cl, sl);
2168 1.27 skrll
2169 1.27 skrll sl -= len;
2170 1.27 skrll cl -= len;
2171 1.27 skrll p += len;
2172 1.27 skrll
2173 1.27 skrll while (len > 0) {
2174 1.27 skrll int mlen = min(len, IWI_CB_MAXDATALEN);
2175 1.27 skrll
2176 1.27 skrll ctl = IWI_CB_DEFAULT_CTL | mlen;
2177 1.27 skrll sum = ctl ^ cs ^ cd;
2178 1.27 skrll
2179 1.27 skrll /* Write a command block */
2180 1.27 skrll CSR_WRITE_4(sc, IWI_CSR_AUTOINC_DATA, ctl);
2181 1.27 skrll CSR_WRITE_4(sc, IWI_CSR_AUTOINC_DATA, cs);
2182 1.27 skrll CSR_WRITE_4(sc, IWI_CSR_AUTOINC_DATA, cd);
2183 1.27 skrll CSR_WRITE_4(sc, IWI_CSR_AUTOINC_DATA, sum);
2184 1.27 skrll
2185 1.27 skrll cs += mlen;
2186 1.27 skrll cd += mlen;
2187 1.27 skrll len -= mlen;
2188 1.27 skrll }
2189 1.1 skrll }
2190 1.1 skrll }
2191 1.1 skrll
2192 1.1 skrll /* Write a fictive final command block (sentinel) */
2193 1.1 skrll sentinel = CSR_READ_4(sc, IWI_CSR_AUTOINC_ADDR);
2194 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_AUTOINC_DATA, 0);
2195 1.1 skrll
2196 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_RST, CSR_READ_4(sc, IWI_CSR_RST) &
2197 1.1 skrll ~(IWI_RST_MASTER_DISABLED | IWI_RST_STOP_MASTER));
2198 1.1 skrll
2199 1.1 skrll /* Tell the adapter to start processing command blocks */
2200 1.1 skrll MEM_WRITE_4(sc, 0x3000a4, 0x540100);
2201 1.1 skrll
2202 1.1 skrll /* Wait until the adapter has processed all command blocks */
2203 1.1 skrll for (ntries = 0; ntries < 400; ntries++) {
2204 1.1 skrll if (MEM_READ_4(sc, 0x3000d0) >= sentinel)
2205 1.1 skrll break;
2206 1.1 skrll DELAY(100);
2207 1.1 skrll }
2208 1.1 skrll if (ntries == 400) {
2209 1.1 skrll aprint_error("%s: timeout processing cb\n",
2210 1.1 skrll sc->sc_dev.dv_xname);
2211 1.1 skrll error = EIO;
2212 1.41 skrll goto fail3;
2213 1.1 skrll }
2214 1.1 skrll
2215 1.1 skrll /* We're done with command blocks processing */
2216 1.1 skrll MEM_WRITE_4(sc, 0x3000a4, 0x540c00);
2217 1.1 skrll
2218 1.1 skrll /* Allow interrupts so we know when the firmware is inited */
2219 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_INTR_MASK, IWI_INTR_MASK);
2220 1.1 skrll
2221 1.1 skrll /* Tell the adapter to initialize the firmware */
2222 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_RST, 0);
2223 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_CTL, CSR_READ_4(sc, IWI_CSR_CTL) |
2224 1.1 skrll IWI_CTL_ALLOW_STANDBY);
2225 1.1 skrll
2226 1.1 skrll /* Wait at most one second for firmware initialization to complete */
2227 1.1 skrll if ((error = tsleep(sc, 0, "iwiinit", hz)) != 0) {
2228 1.1 skrll aprint_error("%s: timeout waiting for firmware initialization "
2229 1.1 skrll "to complete\n", sc->sc_dev.dv_xname);
2230 1.27 skrll goto fail3;
2231 1.1 skrll }
2232 1.1 skrll
2233 1.27 skrll fail3:
2234 1.27 skrll bus_dmamap_sync(sc->sc_dmat, map, 0, size, BUS_DMASYNC_POSTWRITE);
2235 1.1 skrll bus_dmamap_unload(sc->sc_dmat, map);
2236 1.27 skrll fail2:
2237 1.27 skrll bus_dmamap_destroy(sc->sc_dmat, map);
2238 1.5 perry
2239 1.27 skrll fail1:
2240 1.27 skrll return error;
2241 1.1 skrll }
2242 1.1 skrll
2243 1.1 skrll /*
2244 1.1 skrll * Store firmware into kernel memory so we can download it when we need to,
2245 1.1 skrll * e.g when the adapter wakes up from suspend mode.
2246 1.1 skrll */
2247 1.1 skrll static int
2248 1.52 skrll iwi_cache_firmware(struct iwi_softc *sc)
2249 1.1 skrll {
2250 1.1 skrll struct iwi_firmware *kfw = &sc->fw;
2251 1.52 skrll firmware_handle_t fwh;
2252 1.1 skrll int error;
2253 1.1 skrll
2254 1.1 skrll iwi_free_firmware(sc);
2255 1.52 skrll error = firmware_open("if_iwi", "iwi-boot.fw", &fwh);
2256 1.52 skrll if (error != 0)
2257 1.1 skrll goto fail1;
2258 1.1 skrll
2259 1.52 skrll kfw->boot_size = firmware_get_size(fwh);
2260 1.52 skrll kfw->boot = firmware_malloc(kfw->boot_size);
2261 1.1 skrll if (kfw->boot == NULL) {
2262 1.1 skrll error = ENOMEM;
2263 1.52 skrll firmware_close(fwh);
2264 1.1 skrll goto fail1;
2265 1.1 skrll }
2266 1.1 skrll
2267 1.52 skrll error = firmware_read(fwh, sizeof(struct iwi_firmware_hdr),
2268 1.52 skrll kfw->boot, kfw->boot_size - sizeof(struct iwi_firmware_hdr));
2269 1.52 skrll firmware_close(fwh);
2270 1.52 skrll if (error != 0)
2271 1.52 skrll goto fail2;
2272 1.52 skrll
2273 1.52 skrll error = firmware_open("if_iwi", sc->sc_ucname, &fwh);
2274 1.52 skrll if (error != 0)
2275 1.52 skrll goto fail2;
2276 1.52 skrll
2277 1.52 skrll kfw->ucode_size = firmware_get_size(fwh);
2278 1.52 skrll kfw->ucode = firmware_malloc(kfw->ucode_size);
2279 1.1 skrll if (kfw->ucode == NULL) {
2280 1.1 skrll error = ENOMEM;
2281 1.52 skrll firmware_close(fwh);
2282 1.1 skrll goto fail2;
2283 1.1 skrll }
2284 1.1 skrll
2285 1.52 skrll error = firmware_read(fwh, sizeof(struct iwi_firmware_hdr),
2286 1.52 skrll kfw->ucode, kfw->ucode_size - sizeof(struct iwi_firmware_hdr));
2287 1.52 skrll firmware_close(fwh);
2288 1.52 skrll if (error != 0)
2289 1.52 skrll goto fail3;
2290 1.52 skrll
2291 1.52 skrll error = firmware_open("if_iwi", sc->sc_fwname, &fwh);
2292 1.52 skrll if (error != 0)
2293 1.52 skrll goto fail3;
2294 1.52 skrll
2295 1.52 skrll kfw->main_size = firmware_get_size(fwh);
2296 1.52 skrll kfw->main = firmware_malloc(kfw->main_size);
2297 1.1 skrll if (kfw->main == NULL) {
2298 1.1 skrll error = ENOMEM;
2299 1.1 skrll goto fail3;
2300 1.1 skrll }
2301 1.1 skrll
2302 1.52 skrll error = firmware_read(fwh, sizeof(struct iwi_firmware_hdr),
2303 1.52 skrll kfw->main, kfw->main_size - sizeof(struct iwi_firmware_hdr));
2304 1.52 skrll firmware_close(fwh);
2305 1.52 skrll if (error != 0)
2306 1.1 skrll goto fail4;
2307 1.1 skrll
2308 1.1 skrll DPRINTF(("Firmware cached: boot %u, ucode %u, main %u\n",
2309 1.1 skrll kfw->boot_size, kfw->ucode_size, kfw->main_size));
2310 1.1 skrll
2311 1.1 skrll sc->flags |= IWI_FLAG_FW_CACHED;
2312 1.1 skrll
2313 1.1 skrll return 0;
2314 1.1 skrll
2315 1.52 skrll fail4: firmware_free(kfw->main, 0);
2316 1.52 skrll fail3: firmware_free(kfw->ucode, 0);
2317 1.52 skrll fail2: firmware_free(kfw->boot, 0);
2318 1.1 skrll fail1:
2319 1.1 skrll return error;
2320 1.1 skrll }
2321 1.1 skrll
2322 1.1 skrll static void
2323 1.1 skrll iwi_free_firmware(struct iwi_softc *sc)
2324 1.1 skrll {
2325 1.52 skrll struct iwi_firmware *kfw = &sc->fw;
2326 1.52 skrll
2327 1.1 skrll if (!(sc->flags & IWI_FLAG_FW_CACHED))
2328 1.1 skrll return;
2329 1.5 perry
2330 1.52 skrll firmware_free(kfw->main, 0);
2331 1.52 skrll firmware_free(kfw->ucode, 0);
2332 1.52 skrll firmware_free(kfw->boot, 0);
2333 1.1 skrll
2334 1.1 skrll sc->flags &= ~IWI_FLAG_FW_CACHED;
2335 1.1 skrll }
2336 1.1 skrll
2337 1.1 skrll static int
2338 1.1 skrll iwi_config(struct iwi_softc *sc)
2339 1.1 skrll {
2340 1.1 skrll struct ieee80211com *ic = &sc->sc_ic;
2341 1.9 dyoung struct ifnet *ifp = &sc->sc_if;
2342 1.1 skrll struct iwi_configuration config;
2343 1.1 skrll struct iwi_rateset rs;
2344 1.1 skrll struct iwi_txpower power;
2345 1.12 christos struct ieee80211_key *wk;
2346 1.1 skrll struct iwi_wep_key wepkey;
2347 1.24 skrll uint32_t data;
2348 1.1 skrll int error, i;
2349 1.1 skrll
2350 1.1 skrll IEEE80211_ADDR_COPY(ic->ic_myaddr, LLADDR(ifp->if_sadl));
2351 1.1 skrll DPRINTF(("Setting MAC address to %s\n", ether_sprintf(ic->ic_myaddr)));
2352 1.1 skrll error = iwi_cmd(sc, IWI_CMD_SET_MAC_ADDRESS, ic->ic_myaddr,
2353 1.1 skrll IEEE80211_ADDR_LEN, 0);
2354 1.1 skrll if (error != 0)
2355 1.1 skrll return error;
2356 1.1 skrll
2357 1.1 skrll memset(&config, 0, sizeof config);
2358 1.12 christos config.bluetooth_coexistence = sc->bluetooth;
2359 1.12 christos config.antenna = sc->antenna;
2360 1.1 skrll config.multicast_enabled = 1;
2361 1.12 christos config.answer_pbreq = (ic->ic_opmode == IEEE80211_M_IBSS) ? 1 : 0;
2362 1.12 christos config.disable_unicast_decryption = 1;
2363 1.12 christos config.disable_multicast_decryption = 1;
2364 1.1 skrll DPRINTF(("Configuring adapter\n"));
2365 1.1 skrll error = iwi_cmd(sc, IWI_CMD_SET_CONFIGURATION, &config, sizeof config,
2366 1.1 skrll 0);
2367 1.1 skrll if (error != 0)
2368 1.1 skrll return error;
2369 1.1 skrll
2370 1.1 skrll data = htole32(IWI_POWER_MODE_CAM);
2371 1.1 skrll DPRINTF(("Setting power mode to %u\n", le32toh(data)));
2372 1.1 skrll error = iwi_cmd(sc, IWI_CMD_SET_POWER_MODE, &data, sizeof data, 0);
2373 1.1 skrll if (error != 0)
2374 1.1 skrll return error;
2375 1.1 skrll
2376 1.1 skrll data = htole32(ic->ic_rtsthreshold);
2377 1.1 skrll DPRINTF(("Setting RTS threshold to %u\n", le32toh(data)));
2378 1.1 skrll error = iwi_cmd(sc, IWI_CMD_SET_RTS_THRESHOLD, &data, sizeof data, 0);
2379 1.1 skrll if (error != 0)
2380 1.1 skrll return error;
2381 1.1 skrll
2382 1.12 christos data = htole32(ic->ic_fragthreshold);
2383 1.12 christos DPRINTF(("Setting fragmentation threshold to %u\n", le32toh(data)));
2384 1.12 christos error = iwi_cmd(sc, IWI_CMD_SET_FRAG_THRESHOLD, &data, sizeof data, 0);
2385 1.12 christos if (error != 0)
2386 1.12 christos return error;
2387 1.12 christos
2388 1.1 skrll if (ic->ic_opmode == IEEE80211_M_IBSS) {
2389 1.1 skrll power.mode = IWI_MODE_11B;
2390 1.1 skrll power.nchan = 11;
2391 1.1 skrll for (i = 0; i < 11; i++) {
2392 1.1 skrll power.chan[i].chan = i + 1;
2393 1.1 skrll power.chan[i].power = IWI_TXPOWER_MAX;
2394 1.1 skrll }
2395 1.1 skrll DPRINTF(("Setting .11b channels tx power\n"));
2396 1.1 skrll error = iwi_cmd(sc, IWI_CMD_SET_TX_POWER, &power, sizeof power,
2397 1.1 skrll 0);
2398 1.1 skrll if (error != 0)
2399 1.1 skrll return error;
2400 1.1 skrll
2401 1.1 skrll power.mode = IWI_MODE_11G;
2402 1.1 skrll DPRINTF(("Setting .11g channels tx power\n"));
2403 1.1 skrll error = iwi_cmd(sc, IWI_CMD_SET_TX_POWER, &power, sizeof power,
2404 1.1 skrll 0);
2405 1.1 skrll if (error != 0)
2406 1.1 skrll return error;
2407 1.1 skrll }
2408 1.1 skrll
2409 1.1 skrll rs.mode = IWI_MODE_11G;
2410 1.1 skrll rs.type = IWI_RATESET_TYPE_SUPPORTED;
2411 1.1 skrll rs.nrates = ic->ic_sup_rates[IEEE80211_MODE_11G].rs_nrates;
2412 1.1 skrll memcpy(rs.rates, ic->ic_sup_rates[IEEE80211_MODE_11G].rs_rates,
2413 1.1 skrll rs.nrates);
2414 1.1 skrll DPRINTF(("Setting .11bg supported rates (%u)\n", rs.nrates));
2415 1.1 skrll error = iwi_cmd(sc, IWI_CMD_SET_RATES, &rs, sizeof rs, 0);
2416 1.1 skrll if (error != 0)
2417 1.1 skrll return error;
2418 1.1 skrll
2419 1.1 skrll rs.mode = IWI_MODE_11A;
2420 1.1 skrll rs.type = IWI_RATESET_TYPE_SUPPORTED;
2421 1.1 skrll rs.nrates = ic->ic_sup_rates[IEEE80211_MODE_11A].rs_nrates;
2422 1.1 skrll memcpy(rs.rates, ic->ic_sup_rates[IEEE80211_MODE_11A].rs_rates,
2423 1.1 skrll rs.nrates);
2424 1.1 skrll DPRINTF(("Setting .11a supported rates (%u)\n", rs.nrates));
2425 1.1 skrll error = iwi_cmd(sc, IWI_CMD_SET_RATES, &rs, sizeof rs, 0);
2426 1.1 skrll if (error != 0)
2427 1.1 skrll return error;
2428 1.1 skrll
2429 1.38 skrll /* if we have a desired ESSID, set it now */
2430 1.38 skrll if (ic->ic_des_esslen != 0) {
2431 1.38 skrll #ifdef IWI_DEBUG
2432 1.38 skrll if (iwi_debug > 0) {
2433 1.38 skrll printf("Setting desired ESSID to ");
2434 1.38 skrll ieee80211_print_essid(ic->ic_des_essid,
2435 1.38 skrll ic->ic_des_esslen);
2436 1.38 skrll printf("\n");
2437 1.38 skrll }
2438 1.38 skrll #endif
2439 1.38 skrll error = iwi_cmd(sc, IWI_CMD_SET_ESSID, ic->ic_des_essid,
2440 1.38 skrll ic->ic_des_esslen, 0);
2441 1.38 skrll if (error != 0)
2442 1.38 skrll return error;
2443 1.38 skrll }
2444 1.38 skrll
2445 1.1 skrll data = htole32(arc4random());
2446 1.1 skrll DPRINTF(("Setting initialization vector to %u\n", le32toh(data)));
2447 1.1 skrll error = iwi_cmd(sc, IWI_CMD_SET_IV, &data, sizeof data, 0);
2448 1.1 skrll if (error != 0)
2449 1.1 skrll return error;
2450 1.1 skrll
2451 1.12 christos for (i = 0; i < IEEE80211_WEP_NKID; i++) {
2452 1.12 christos wk = &ic->ic_crypto.cs_nw_keys[i];
2453 1.12 christos
2454 1.12 christos wepkey.cmd = IWI_WEP_KEY_CMD_SETKEY;
2455 1.12 christos wepkey.idx = i;
2456 1.12 christos wepkey.len = wk->wk_keylen;
2457 1.12 christos memset(wepkey.key, 0, sizeof wepkey.key);
2458 1.12 christos memcpy(wepkey.key, wk->wk_key, wk->wk_keylen);
2459 1.12 christos DPRINTF(("Setting wep key index %u len %u\n",
2460 1.12 christos wepkey.idx, wepkey.len));
2461 1.12 christos error = iwi_cmd(sc, IWI_CMD_SET_WEP_KEY, &wepkey,
2462 1.12 christos sizeof wepkey, 0);
2463 1.12 christos if (error != 0)
2464 1.12 christos return error;
2465 1.1 skrll }
2466 1.1 skrll
2467 1.1 skrll /* Enable adapter */
2468 1.1 skrll DPRINTF(("Enabling adapter\n"));
2469 1.1 skrll return iwi_cmd(sc, IWI_CMD_ENABLE, NULL, 0, 0);
2470 1.1 skrll }
2471 1.1 skrll
2472 1.1 skrll static int
2473 1.8 sekiya iwi_set_chan(struct iwi_softc *sc, struct ieee80211_channel *chan)
2474 1.8 sekiya {
2475 1.8 sekiya struct ieee80211com *ic = &sc->sc_ic;
2476 1.30 skrll struct iwi_scan_v2 scan;
2477 1.8 sekiya
2478 1.12 christos (void)memset(&scan, 0, sizeof scan);
2479 1.30 skrll
2480 1.30 skrll scan.dwelltime[IWI_SCAN_TYPE_PASSIVE] = htole16(2000);
2481 1.30 skrll scan.channels[0] = 1 |
2482 1.30 skrll (IEEE80211_IS_CHAN_5GHZ(chan) ? IWI_CHAN_5GHZ : IWI_CHAN_2GHZ);
2483 1.8 sekiya scan.channels[1] = ieee80211_chan2ieee(ic, chan);
2484 1.30 skrll iwi_scan_type_set(scan, 1, IWI_SCAN_TYPE_PASSIVE);
2485 1.8 sekiya
2486 1.8 sekiya DPRINTF(("Setting channel to %u\n", ieee80211_chan2ieee(ic, chan)));
2487 1.30 skrll return iwi_cmd(sc, IWI_CMD_SCAN_V2, &scan, sizeof scan, 1);
2488 1.8 sekiya }
2489 1.8 sekiya
2490 1.8 sekiya static int
2491 1.1 skrll iwi_scan(struct iwi_softc *sc)
2492 1.1 skrll {
2493 1.1 skrll struct ieee80211com *ic = &sc->sc_ic;
2494 1.26 skrll struct iwi_scan_v2 scan;
2495 1.26 skrll uint32_t type;
2496 1.24 skrll uint8_t *p;
2497 1.26 skrll int i, count, idx;
2498 1.1 skrll
2499 1.12 christos (void)memset(&scan, 0, sizeof scan);
2500 1.26 skrll scan.dwelltime[IWI_SCAN_TYPE_ACTIVE_BROADCAST] =
2501 1.26 skrll htole16(sc->dwelltime);
2502 1.26 skrll scan.dwelltime[IWI_SCAN_TYPE_ACTIVE_BDIRECT] =
2503 1.26 skrll htole16(sc->dwelltime);
2504 1.26 skrll
2505 1.26 skrll /* tell the firmware about the desired essid */
2506 1.26 skrll if (ic->ic_des_esslen) {
2507 1.26 skrll int error;
2508 1.26 skrll
2509 1.26 skrll DPRINTF(("%s: Setting adapter desired ESSID to %s\n",
2510 1.26 skrll __func__, ic->ic_des_essid));
2511 1.26 skrll
2512 1.26 skrll error = iwi_cmd(sc, IWI_CMD_SET_ESSID,
2513 1.26 skrll ic->ic_des_essid, ic->ic_des_esslen, 1);
2514 1.26 skrll if (error)
2515 1.26 skrll return error;
2516 1.26 skrll
2517 1.26 skrll type = IWI_SCAN_TYPE_ACTIVE_BDIRECT;
2518 1.26 skrll } else {
2519 1.26 skrll type = IWI_SCAN_TYPE_ACTIVE_BROADCAST;
2520 1.26 skrll }
2521 1.1 skrll
2522 1.26 skrll p = &scan.channels[0];
2523 1.26 skrll count = idx = 0;
2524 1.1 skrll for (i = 0; i <= IEEE80211_CHAN_MAX; i++) {
2525 1.1 skrll if (IEEE80211_IS_CHAN_5GHZ(&ic->ic_channels[i]) &&
2526 1.1 skrll isset(ic->ic_chan_active, i)) {
2527 1.1 skrll *++p = i;
2528 1.1 skrll count++;
2529 1.26 skrll idx++;
2530 1.26 skrll iwi_scan_type_set(scan, idx, type);
2531 1.1 skrll }
2532 1.1 skrll }
2533 1.26 skrll if (count) {
2534 1.26 skrll *(p - count) = IWI_CHAN_5GHZ | count;
2535 1.26 skrll p++;
2536 1.26 skrll }
2537 1.1 skrll
2538 1.1 skrll count = 0;
2539 1.1 skrll for (i = 0; i <= IEEE80211_CHAN_MAX; i++) {
2540 1.1 skrll if (IEEE80211_IS_CHAN_2GHZ(&ic->ic_channels[i]) &&
2541 1.1 skrll isset(ic->ic_chan_active, i)) {
2542 1.1 skrll *++p = i;
2543 1.1 skrll count++;
2544 1.26 skrll idx++;
2545 1.26 skrll iwi_scan_type_set(scan, idx, type);
2546 1.1 skrll }
2547 1.1 skrll }
2548 1.1 skrll *(p - count) = IWI_CHAN_2GHZ | count;
2549 1.1 skrll
2550 1.1 skrll DPRINTF(("Start scanning\n"));
2551 1.26 skrll return iwi_cmd(sc, IWI_CMD_SCAN_V2, &scan, sizeof scan, 1);
2552 1.1 skrll }
2553 1.1 skrll
2554 1.1 skrll static int
2555 1.1 skrll iwi_auth_and_assoc(struct iwi_softc *sc)
2556 1.1 skrll {
2557 1.1 skrll struct ieee80211com *ic = &sc->sc_ic;
2558 1.1 skrll struct ieee80211_node *ni = ic->ic_bss;
2559 1.12 christos struct ifnet *ifp = &sc->sc_if;
2560 1.38 skrll struct ieee80211_wme_info wme;
2561 1.1 skrll struct iwi_configuration config;
2562 1.1 skrll struct iwi_associate assoc;
2563 1.1 skrll struct iwi_rateset rs;
2564 1.24 skrll uint16_t capinfo;
2565 1.24 skrll uint32_t data;
2566 1.1 skrll int error;
2567 1.1 skrll
2568 1.1 skrll if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan)) {
2569 1.1 skrll memset(&config, 0, sizeof config);
2570 1.12 christos config.bluetooth_coexistence = sc->bluetooth;
2571 1.12 christos config.antenna = sc->antenna;
2572 1.1 skrll config.multicast_enabled = 1;
2573 1.12 christos config.use_protection = 1;
2574 1.12 christos config.answer_pbreq =
2575 1.12 christos (ic->ic_opmode == IEEE80211_M_IBSS) ? 1 : 0;
2576 1.12 christos config.disable_unicast_decryption = 1;
2577 1.12 christos config.disable_multicast_decryption = 1;
2578 1.1 skrll DPRINTF(("Configuring adapter\n"));
2579 1.1 skrll error = iwi_cmd(sc, IWI_CMD_SET_CONFIGURATION, &config,
2580 1.1 skrll sizeof config, 1);
2581 1.1 skrll if (error != 0)
2582 1.1 skrll return error;
2583 1.1 skrll }
2584 1.1 skrll
2585 1.1 skrll #ifdef IWI_DEBUG
2586 1.1 skrll if (iwi_debug > 0) {
2587 1.1 skrll printf("Setting ESSID to ");
2588 1.1 skrll ieee80211_print_essid(ni->ni_essid, ni->ni_esslen);
2589 1.1 skrll printf("\n");
2590 1.1 skrll }
2591 1.1 skrll #endif
2592 1.1 skrll error = iwi_cmd(sc, IWI_CMD_SET_ESSID, ni->ni_essid, ni->ni_esslen, 1);
2593 1.1 skrll if (error != 0)
2594 1.1 skrll return error;
2595 1.1 skrll
2596 1.22 skrll /* the rate set has already been "negotiated" */
2597 1.1 skrll rs.mode = IEEE80211_IS_CHAN_5GHZ(ni->ni_chan) ? IWI_MODE_11A :
2598 1.1 skrll IWI_MODE_11G;
2599 1.22 skrll rs.type = IWI_RATESET_TYPE_NEGOTIATED;
2600 1.1 skrll rs.nrates = ni->ni_rates.rs_nrates;
2601 1.1 skrll memcpy(rs.rates, ni->ni_rates.rs_rates, rs.nrates);
2602 1.22 skrll DPRINTF(("Setting negotiated rates (%u)\n", rs.nrates));
2603 1.1 skrll error = iwi_cmd(sc, IWI_CMD_SET_RATES, &rs, sizeof rs, 1);
2604 1.1 skrll if (error != 0)
2605 1.1 skrll return error;
2606 1.1 skrll
2607 1.38 skrll if ((ic->ic_flags & IEEE80211_F_WME) && ni->ni_wme_ie != NULL) {
2608 1.38 skrll wme.wme_id = IEEE80211_ELEMID_VENDOR;
2609 1.38 skrll wme.wme_len = sizeof (struct ieee80211_wme_info) - 2;
2610 1.38 skrll wme.wme_oui[0] = 0x00;
2611 1.38 skrll wme.wme_oui[1] = 0x50;
2612 1.38 skrll wme.wme_oui[2] = 0xf2;
2613 1.38 skrll wme.wme_type = WME_OUI_TYPE;
2614 1.38 skrll wme.wme_subtype = WME_INFO_OUI_SUBTYPE;
2615 1.38 skrll wme.wme_version = WME_VERSION;
2616 1.38 skrll wme.wme_info = 0;
2617 1.38 skrll
2618 1.38 skrll DPRINTF(("Setting WME IE (len=%u)\n", wme.wme_len));
2619 1.38 skrll error = iwi_cmd(sc, IWI_CMD_SET_WMEIE, &wme, sizeof wme, 1);
2620 1.38 skrll if (error != 0)
2621 1.38 skrll return error;
2622 1.38 skrll }
2623 1.38 skrll
2624 1.12 christos if (ic->ic_opt_ie != NULL) {
2625 1.12 christos DPRINTF(("Setting optional IE (len=%u)\n", ic->ic_opt_ie_len));
2626 1.12 christos error = iwi_cmd(sc, IWI_CMD_SET_OPTIE, ic->ic_opt_ie,
2627 1.12 christos ic->ic_opt_ie_len, 1);
2628 1.12 christos if (error != 0)
2629 1.12 christos return error;
2630 1.12 christos }
2631 1.1 skrll data = htole32(ni->ni_rssi);
2632 1.1 skrll DPRINTF(("Setting sensitivity to %d\n", (int8_t)ni->ni_rssi));
2633 1.1 skrll error = iwi_cmd(sc, IWI_CMD_SET_SENSITIVITY, &data, sizeof data, 1);
2634 1.1 skrll if (error != 0)
2635 1.1 skrll return error;
2636 1.1 skrll
2637 1.1 skrll memset(&assoc, 0, sizeof assoc);
2638 1.1 skrll assoc.mode = IEEE80211_IS_CHAN_5GHZ(ni->ni_chan) ? IWI_MODE_11A :
2639 1.1 skrll IWI_MODE_11G;
2640 1.1 skrll assoc.chan = ieee80211_chan2ieee(ic, ni->ni_chan);
2641 1.12 christos if (ni->ni_authmode == IEEE80211_AUTH_SHARED)
2642 1.12 christos assoc.auth = (ic->ic_crypto.cs_def_txkey << 4) | IWI_AUTH_SHARED;
2643 1.38 skrll if ((ic->ic_flags & IEEE80211_F_WME) && ni->ni_wme_ie != NULL)
2644 1.38 skrll assoc.policy |= htole16(IWI_POLICY_WME);
2645 1.45 skrll if (ic->ic_flags & IEEE80211_F_WPA)
2646 1.38 skrll assoc.policy |= htole16(IWI_POLICY_WPA);
2647 1.9 dyoung memcpy(assoc.tstamp, ni->ni_tstamp.data, 8);
2648 1.12 christos
2649 1.12 christos if (ic->ic_opmode == IEEE80211_M_IBSS)
2650 1.12 christos capinfo = IEEE80211_CAPINFO_IBSS;
2651 1.12 christos else
2652 1.12 christos capinfo = IEEE80211_CAPINFO_ESS;
2653 1.12 christos if (ic->ic_flags & IEEE80211_F_PRIVACY)
2654 1.12 christos capinfo |= IEEE80211_CAPINFO_PRIVACY;
2655 1.12 christos if ((ic->ic_flags & IEEE80211_F_SHPREAMBLE) &&
2656 1.12 christos IEEE80211_IS_CHAN_2GHZ(ni->ni_chan))
2657 1.12 christos capinfo |= IEEE80211_CAPINFO_SHORT_PREAMBLE;
2658 1.12 christos if (ic->ic_flags & IEEE80211_F_SHSLOT)
2659 1.12 christos capinfo |= IEEE80211_CAPINFO_SHORT_SLOTTIME;
2660 1.12 christos assoc.capinfo = htole16(capinfo);
2661 1.12 christos
2662 1.1 skrll assoc.lintval = htole16(ic->ic_lintval);
2663 1.1 skrll assoc.intval = htole16(ni->ni_intval);
2664 1.1 skrll IEEE80211_ADDR_COPY(assoc.bssid, ni->ni_bssid);
2665 1.12 christos if (ic->ic_opmode == IEEE80211_M_IBSS)
2666 1.12 christos IEEE80211_ADDR_COPY(assoc.dst, ifp->if_broadcastaddr);
2667 1.12 christos else
2668 1.12 christos IEEE80211_ADDR_COPY(assoc.dst, ni->ni_bssid);
2669 1.1 skrll DPRINTF(("Trying to associate to %s channel %u auth %u\n",
2670 1.1 skrll ether_sprintf(assoc.bssid), assoc.chan, assoc.auth));
2671 1.1 skrll return iwi_cmd(sc, IWI_CMD_ASSOCIATE, &assoc, sizeof assoc, 1);
2672 1.1 skrll }
2673 1.1 skrll
2674 1.1 skrll static int
2675 1.1 skrll iwi_init(struct ifnet *ifp)
2676 1.1 skrll {
2677 1.1 skrll struct iwi_softc *sc = ifp->if_softc;
2678 1.1 skrll struct ieee80211com *ic = &sc->sc_ic;
2679 1.1 skrll struct iwi_firmware *fw = &sc->fw;
2680 1.1 skrll int i, error;
2681 1.1 skrll
2682 1.1 skrll /* exit immediately if firmware has not been ioctl'd */
2683 1.1 skrll if (!(sc->flags & IWI_FLAG_FW_CACHED)) {
2684 1.52 skrll if ((error = iwi_cache_firmware(sc)) != 0) {
2685 1.52 skrll aprint_error("%s: could not cache the firmware\n",
2686 1.12 christos sc->sc_dev.dv_xname);
2687 1.52 skrll goto fail;
2688 1.52 skrll }
2689 1.1 skrll }
2690 1.1 skrll
2691 1.12 christos iwi_stop(ifp, 0);
2692 1.12 christos
2693 1.1 skrll if ((error = iwi_reset(sc)) != 0) {
2694 1.1 skrll aprint_error("%s: could not reset adapter\n",
2695 1.1 skrll sc->sc_dev.dv_xname);
2696 1.1 skrll goto fail;
2697 1.1 skrll }
2698 1.1 skrll
2699 1.1 skrll if ((error = iwi_load_firmware(sc, fw->boot, fw->boot_size)) != 0) {
2700 1.1 skrll aprint_error("%s: could not load boot firmware\n",
2701 1.1 skrll sc->sc_dev.dv_xname);
2702 1.1 skrll goto fail;
2703 1.1 skrll }
2704 1.1 skrll
2705 1.1 skrll if ((error = iwi_load_ucode(sc, fw->ucode, fw->ucode_size)) != 0) {
2706 1.1 skrll aprint_error("%s: could not load microcode\n",
2707 1.1 skrll sc->sc_dev.dv_xname);
2708 1.1 skrll goto fail;
2709 1.1 skrll }
2710 1.1 skrll
2711 1.1 skrll iwi_stop_master(sc);
2712 1.1 skrll
2713 1.14 skrll CSR_WRITE_4(sc, IWI_CSR_CMD_BASE, sc->cmdq.desc_map->dm_segs[0].ds_addr);
2714 1.14 skrll CSR_WRITE_4(sc, IWI_CSR_CMD_SIZE, sc->cmdq.count);
2715 1.14 skrll CSR_WRITE_4(sc, IWI_CSR_CMD_WIDX, sc->cmdq.cur);
2716 1.14 skrll
2717 1.38 skrll CSR_WRITE_4(sc, IWI_CSR_TX1_BASE, sc->txq[0].desc_map->dm_segs[0].ds_addr);
2718 1.38 skrll CSR_WRITE_4(sc, IWI_CSR_TX1_SIZE, sc->txq[0].count);
2719 1.38 skrll CSR_WRITE_4(sc, IWI_CSR_TX1_WIDX, sc->txq[0].cur);
2720 1.38 skrll
2721 1.38 skrll CSR_WRITE_4(sc, IWI_CSR_TX2_BASE, sc->txq[1].desc_map->dm_segs[0].ds_addr);
2722 1.38 skrll CSR_WRITE_4(sc, IWI_CSR_TX2_SIZE, sc->txq[1].count);
2723 1.38 skrll CSR_WRITE_4(sc, IWI_CSR_TX2_WIDX, sc->txq[1].cur);
2724 1.38 skrll
2725 1.38 skrll CSR_WRITE_4(sc, IWI_CSR_TX3_BASE, sc->txq[2].desc_map->dm_segs[0].ds_addr);
2726 1.38 skrll CSR_WRITE_4(sc, IWI_CSR_TX3_SIZE, sc->txq[2].count);
2727 1.38 skrll CSR_WRITE_4(sc, IWI_CSR_TX3_WIDX, sc->txq[2].cur);
2728 1.38 skrll
2729 1.38 skrll CSR_WRITE_4(sc, IWI_CSR_TX4_BASE, sc->txq[3].desc_map->dm_segs[0].ds_addr);
2730 1.38 skrll CSR_WRITE_4(sc, IWI_CSR_TX4_SIZE, sc->txq[3].count);
2731 1.38 skrll CSR_WRITE_4(sc, IWI_CSR_TX4_WIDX, sc->txq[3].cur);
2732 1.1 skrll
2733 1.14 skrll for (i = 0; i < sc->rxq.count; i++)
2734 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_RX_BASE + i * 4,
2735 1.14 skrll sc->rxq.data[i].map->dm_segs[0].ds_addr);
2736 1.1 skrll
2737 1.14 skrll CSR_WRITE_4(sc, IWI_CSR_RX_WIDX, sc->rxq.count -1);
2738 1.1 skrll
2739 1.1 skrll if ((error = iwi_load_firmware(sc, fw->main, fw->main_size)) != 0) {
2740 1.1 skrll aprint_error("%s: could not load main firmware\n",
2741 1.1 skrll sc->sc_dev.dv_xname);
2742 1.1 skrll goto fail;
2743 1.1 skrll }
2744 1.1 skrll
2745 1.1 skrll sc->flags |= IWI_FLAG_FW_INITED;
2746 1.1 skrll
2747 1.1 skrll if ((error = iwi_config(sc)) != 0) {
2748 1.1 skrll aprint_error("%s: device configuration failed\n",
2749 1.1 skrll sc->sc_dev.dv_xname);
2750 1.1 skrll goto fail;
2751 1.1 skrll }
2752 1.1 skrll
2753 1.43 skrll ic->ic_state = IEEE80211_S_INIT;
2754 1.43 skrll
2755 1.43 skrll ifp->if_flags &= ~IFF_OACTIVE;
2756 1.43 skrll ifp->if_flags |= IFF_RUNNING;
2757 1.43 skrll
2758 1.38 skrll if (ic->ic_opmode != IEEE80211_M_MONITOR) {
2759 1.38 skrll if (ic->ic_roaming != IEEE80211_ROAMING_MANUAL)
2760 1.38 skrll ieee80211_new_state(ic, IEEE80211_S_SCAN, -1);
2761 1.38 skrll } else
2762 1.12 christos ieee80211_new_state(ic, IEEE80211_S_RUN, -1);
2763 1.1 skrll
2764 1.1 skrll return 0;
2765 1.1 skrll
2766 1.14 skrll fail: ifp->if_flags &= ~IFF_UP;
2767 1.14 skrll iwi_stop(ifp, 0);
2768 1.1 skrll
2769 1.1 skrll return error;
2770 1.1 skrll }
2771 1.1 skrll
2772 1.54 skrll
2773 1.54 skrll /*
2774 1.54 skrll * Return whether or not the radio is enabled in hardware
2775 1.54 skrll * (i.e. the rfkill switch is "off").
2776 1.54 skrll */
2777 1.54 skrll static int
2778 1.54 skrll iwi_getrfkill(struct iwi_softc *sc)
2779 1.54 skrll {
2780 1.54 skrll return (CSR_READ_4(sc, IWI_CSR_IO) & IWI_IO_RADIO_ENABLED) == 0;
2781 1.54 skrll }
2782 1.54 skrll
2783 1.54 skrll static int
2784 1.54 skrll iwi_sysctl_radio(SYSCTLFN_ARGS)
2785 1.54 skrll {
2786 1.54 skrll struct sysctlnode node;
2787 1.54 skrll struct iwi_softc *sc;
2788 1.54 skrll int val, error;
2789 1.54 skrll
2790 1.54 skrll node = *rnode;
2791 1.54 skrll sc = (struct iwi_softc *)node.sysctl_data;
2792 1.54 skrll
2793 1.54 skrll val = !iwi_getrfkill(sc);
2794 1.54 skrll
2795 1.54 skrll node.sysctl_data = &val;
2796 1.54 skrll error = sysctl_lookup(SYSCTLFN_CALL(&node));
2797 1.54 skrll
2798 1.54 skrll if (error || newp == NULL)
2799 1.54 skrll return error;
2800 1.54 skrll
2801 1.54 skrll return 0;
2802 1.54 skrll }
2803 1.54 skrll
2804 1.54 skrll #ifdef IWI_DEBUG
2805 1.54 skrll SYSCTL_SETUP(sysctl_iwi, "sysctl iwi(4) subtree setup")
2806 1.54 skrll {
2807 1.54 skrll int rc;
2808 1.54 skrll const struct sysctlnode *rnode;
2809 1.54 skrll const struct sysctlnode *cnode;
2810 1.54 skrll
2811 1.54 skrll if ((rc = sysctl_createv(clog, 0, NULL, &rnode,
2812 1.54 skrll CTLFLAG_PERMANENT, CTLTYPE_NODE, "hw", NULL,
2813 1.54 skrll NULL, 0, NULL, 0, CTL_HW, CTL_EOL)) != 0)
2814 1.54 skrll goto err;
2815 1.54 skrll
2816 1.54 skrll if ((rc = sysctl_createv(clog, 0, &rnode, &rnode,
2817 1.54 skrll CTLFLAG_PERMANENT, CTLTYPE_NODE, "iwi",
2818 1.54 skrll SYSCTL_DESCR("iwi global controls"),
2819 1.54 skrll NULL, 0, NULL, 0, CTL_CREATE, CTL_EOL)) != 0)
2820 1.54 skrll goto err;
2821 1.54 skrll
2822 1.54 skrll /* control debugging printfs */
2823 1.54 skrll if ((rc = sysctl_createv(clog, 0, &rnode, &cnode,
2824 1.54 skrll CTLFLAG_PERMANENT|CTLFLAG_READWRITE, CTLTYPE_INT,
2825 1.54 skrll "debug", SYSCTL_DESCR("Enable debugging output"),
2826 1.54 skrll NULL, 0, &iwi_debug, 0, CTL_CREATE, CTL_EOL)) != 0)
2827 1.54 skrll goto err;
2828 1.54 skrll
2829 1.54 skrll return;
2830 1.54 skrll err:
2831 1.54 skrll aprint_error("%s: sysctl_createv failed (rc = %d)\n", __func__, rc);
2832 1.54 skrll }
2833 1.54 skrll
2834 1.54 skrll #endif /* IWI_DEBUG */
2835 1.54 skrll
2836 1.54 skrll /*
2837 1.54 skrll * Add sysctl knobs.
2838 1.54 skrll */
2839 1.54 skrll static void
2840 1.54 skrll iwi_sysctlattach(struct iwi_softc *sc)
2841 1.54 skrll {
2842 1.54 skrll int rc;
2843 1.54 skrll const struct sysctlnode *rnode;
2844 1.54 skrll const struct sysctlnode *cnode;
2845 1.54 skrll
2846 1.54 skrll struct sysctllog **clog = &sc->sc_sysctllog;
2847 1.54 skrll
2848 1.54 skrll if ((rc = sysctl_createv(clog, 0, NULL, &rnode,
2849 1.54 skrll CTLFLAG_PERMANENT, CTLTYPE_NODE, "hw", NULL,
2850 1.54 skrll NULL, 0, NULL, 0, CTL_HW, CTL_EOL)) != 0)
2851 1.54 skrll goto err;
2852 1.54 skrll
2853 1.54 skrll if ((rc = sysctl_createv(clog, 0, &rnode, &rnode,
2854 1.54 skrll CTLFLAG_PERMANENT, CTLTYPE_NODE, sc->sc_dev.dv_xname,
2855 1.54 skrll SYSCTL_DESCR("iwi controls and statistics"),
2856 1.54 skrll NULL, 0, NULL, 0, CTL_CREATE, CTL_EOL)) != 0)
2857 1.54 skrll goto err;
2858 1.54 skrll
2859 1.54 skrll if ((rc = sysctl_createv(clog, 0, &rnode, &cnode,
2860 1.54 skrll CTLFLAG_PERMANENT, CTLTYPE_INT, "radio",
2861 1.54 skrll SYSCTL_DESCR("radio transmitter switch state (0=off, 1=on)"),
2862 1.54 skrll iwi_sysctl_radio, 0, sc, 0, CTL_CREATE, CTL_EOL)) != 0)
2863 1.54 skrll goto err;
2864 1.54 skrll
2865 1.54 skrll sc->dwelltime = 100;
2866 1.54 skrll if ((rc = sysctl_createv(clog, 0, &rnode, &cnode,
2867 1.54 skrll CTLFLAG_PERMANENT|CTLFLAG_READWRITE, CTLTYPE_INT,
2868 1.54 skrll "dwell", SYSCTL_DESCR("channel dwell time (ms) for AP/station scanning"),
2869 1.54 skrll NULL, 0, &sc->dwelltime, 0, CTL_CREATE, CTL_EOL)) != 0)
2870 1.54 skrll goto err;
2871 1.54 skrll
2872 1.54 skrll sc->bluetooth = 1;
2873 1.54 skrll if ((rc = sysctl_createv(clog, 0, &rnode, &cnode,
2874 1.54 skrll CTLFLAG_PERMANENT|CTLFLAG_READWRITE, CTLTYPE_INT,
2875 1.54 skrll "bluetooth", SYSCTL_DESCR("bluetooth coexistence"),
2876 1.54 skrll NULL, 0, &sc->bluetooth, 0, CTL_CREATE, CTL_EOL)) != 0)
2877 1.54 skrll goto err;
2878 1.54 skrll
2879 1.54 skrll sc->antenna = 0;
2880 1.54 skrll if ((rc = sysctl_createv(clog, 0, &rnode, &cnode,
2881 1.54 skrll CTLFLAG_PERMANENT|CTLFLAG_READWRITE, CTLTYPE_INT,
2882 1.54 skrll "antenna", SYSCTL_DESCR("antenna (0=auto)"),
2883 1.54 skrll NULL, 0, &sc->antenna, 0, CTL_CREATE, CTL_EOL)) != 0)
2884 1.54 skrll goto err;
2885 1.54 skrll
2886 1.54 skrll return;
2887 1.54 skrll err:
2888 1.54 skrll aprint_error("%s: sysctl_createv failed (rc = %d)\n", __func__, rc);
2889 1.54 skrll }
2890 1.54 skrll
2891 1.1 skrll static void
2892 1.1 skrll iwi_stop(struct ifnet *ifp, int disable)
2893 1.1 skrll {
2894 1.1 skrll struct iwi_softc *sc = ifp->if_softc;
2895 1.1 skrll struct ieee80211com *ic = &sc->sc_ic;
2896 1.1 skrll
2897 1.42 rpaulo IWI_LED_OFF(sc);
2898 1.42 rpaulo
2899 1.1 skrll iwi_stop_master(sc);
2900 1.1 skrll CSR_WRITE_4(sc, IWI_CSR_RST, IWI_RST_SW_RESET);
2901 1.1 skrll
2902 1.14 skrll /* reset rings */
2903 1.14 skrll iwi_reset_cmd_ring(sc, &sc->cmdq);
2904 1.38 skrll iwi_reset_tx_ring(sc, &sc->txq[0]);
2905 1.38 skrll iwi_reset_tx_ring(sc, &sc->txq[1]);
2906 1.38 skrll iwi_reset_tx_ring(sc, &sc->txq[2]);
2907 1.38 skrll iwi_reset_tx_ring(sc, &sc->txq[3]);
2908 1.14 skrll iwi_reset_rx_ring(sc, &sc->rxq);
2909 1.1 skrll
2910 1.1 skrll ifp->if_timer = 0;
2911 1.1 skrll ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
2912 1.1 skrll
2913 1.1 skrll ieee80211_new_state(ic, IEEE80211_S_INIT, -1);
2914 1.1 skrll }
2915 1.36 skrll
2916 1.36 skrll static void
2917 1.42 rpaulo iwi_led_set(struct iwi_softc *sc, uint32_t state, int toggle)
2918 1.42 rpaulo {
2919 1.42 rpaulo uint32_t val;
2920 1.42 rpaulo
2921 1.42 rpaulo val = MEM_READ_4(sc, IWI_MEM_EVENT_CTL);
2922 1.42 rpaulo
2923 1.42 rpaulo switch (sc->nictype) {
2924 1.42 rpaulo case 1:
2925 1.42 rpaulo /* special NIC type: reversed leds */
2926 1.42 rpaulo if (state == IWI_LED_ACTIVITY) {
2927 1.42 rpaulo state &= ~IWI_LED_ACTIVITY;
2928 1.42 rpaulo state |= IWI_LED_ASSOCIATED;
2929 1.42 rpaulo } else if (state == IWI_LED_ASSOCIATED) {
2930 1.42 rpaulo state &= ~IWI_LED_ASSOCIATED;
2931 1.42 rpaulo state |= IWI_LED_ACTIVITY;
2932 1.42 rpaulo }
2933 1.42 rpaulo /* and ignore toggle effect */
2934 1.42 rpaulo val |= state;
2935 1.42 rpaulo break;
2936 1.42 rpaulo case 0:
2937 1.42 rpaulo case 2:
2938 1.42 rpaulo case 3:
2939 1.42 rpaulo case 4:
2940 1.42 rpaulo val = (toggle && (val & state)) ? val & ~state : val | state;
2941 1.42 rpaulo break;
2942 1.42 rpaulo default:
2943 1.42 rpaulo aprint_normal("%s: unknown NIC type %d\n",
2944 1.42 rpaulo sc->sc_dev.dv_xname, sc->nictype);
2945 1.42 rpaulo return;
2946 1.42 rpaulo break;
2947 1.42 rpaulo }
2948 1.42 rpaulo
2949 1.42 rpaulo MEM_WRITE_4(sc, IWI_MEM_EVENT_CTL, val);
2950 1.42 rpaulo
2951 1.42 rpaulo return;
2952 1.42 rpaulo }
2953 1.42 rpaulo
2954 1.42 rpaulo static void
2955 1.36 skrll iwi_error_log(struct iwi_softc *sc)
2956 1.36 skrll {
2957 1.36 skrll uint32_t b, n;
2958 1.36 skrll int i;
2959 1.36 skrll
2960 1.36 skrll static const char *const msg[] = {
2961 1.36 skrll "no error",
2962 1.36 skrll "failed",
2963 1.36 skrll "memory range low",
2964 1.36 skrll "memory range high",
2965 1.36 skrll "bad parameter",
2966 1.36 skrll "checksum",
2967 1.36 skrll "NMI",
2968 1.36 skrll "bad database",
2969 1.36 skrll "allocation failed",
2970 1.36 skrll "DMA underrun",
2971 1.36 skrll "DMA status",
2972 1.36 skrll "DINO",
2973 1.36 skrll "EEPROM",
2974 1.36 skrll "device assert",
2975 1.36 skrll "fatal"
2976 1.36 skrll };
2977 1.36 skrll
2978 1.36 skrll b = CSR_READ_4(sc, IWI_CSR_ERRORLOG);
2979 1.36 skrll n = MEM_READ_4(sc, b);
2980 1.36 skrll
2981 1.36 skrll b += 4;
2982 1.36 skrll
2983 1.36 skrll for (i = 0; i < n ; i++) {
2984 1.36 skrll struct iwi_error fw_error;
2985 1.36 skrll
2986 1.36 skrll MEM_CPY(sc, &fw_error, b, sizeof(fw_error));
2987 1.36 skrll
2988 1.37 skrll printf("%s: %s\n", sc->sc_dev.dv_xname,
2989 1.37 skrll msg[fw_error.type]);
2990 1.36 skrll
2991 1.36 skrll b += sizeof(fw_error);
2992 1.36 skrll }
2993 1.36 skrll }
2994