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