View | Details | Raw Unified | Return to bug 197143 | Differences between
and this patch

Collapse All | Expand All

(-)sys/dev/wpi/if_wpi.c (-2262 / +3448 lines)
Lines 16-23 Link Here
16
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
 */
17
 */
18
18
19
#define VERSION "20071127"
20
21
#include <sys/cdefs.h>
19
#include <sys/cdefs.h>
22
__FBSDID("$FreeBSD$");
20
__FBSDID("$FreeBSD$");
23
21
Lines 60-65 Link Here
60
 */
58
 */
61
59
62
#include "opt_wlan.h"
60
#include "opt_wlan.h"
61
#include "opt_wpi.h"
63
62
64
#include <sys/param.h>
63
#include <sys/param.h>
65
#include <sys/sysctl.h>
64
#include <sys/sysctl.h>
Lines 93-144 Link Here
93
#include <net/if_media.h>
92
#include <net/if_media.h>
94
#include <net/if_types.h>
93
#include <net/if_types.h>
95
94
95
#include <netinet/in.h>
96
#include <netinet/in_systm.h>
97
#include <netinet/in_var.h>
98
#include <netinet/if_ether.h>
99
#include <netinet/ip.h>
100
96
#include <net80211/ieee80211_var.h>
101
#include <net80211/ieee80211_var.h>
97
#include <net80211/ieee80211_radiotap.h>
102
#include <net80211/ieee80211_radiotap.h>
98
#include <net80211/ieee80211_regdomain.h>
103
#include <net80211/ieee80211_regdomain.h>
99
#include <net80211/ieee80211_ratectl.h>
104
#include <net80211/ieee80211_ratectl.h>
100
105
101
#include <netinet/in.h>
102
#include <netinet/in_systm.h>
103
#include <netinet/in_var.h>
104
#include <netinet/ip.h>
105
#include <netinet/if_ether.h>
106
107
#include <dev/wpi/if_wpireg.h>
106
#include <dev/wpi/if_wpireg.h>
108
#include <dev/wpi/if_wpivar.h>
107
#include <dev/wpi/if_wpivar.h>
108
#include <dev/wpi/if_wpi_debug.h>
109
109
110
#define WPI_DEBUG
111
112
#ifdef WPI_DEBUG
113
#define DPRINTF(x)	do { if (wpi_debug != 0) printf x; } while (0)
114
#define DPRINTFN(n, x)	do { if (wpi_debug & n) printf x; } while (0)
115
#define	WPI_DEBUG_SET	(wpi_debug != 0)
116
117
enum {
118
	WPI_DEBUG_UNUSED	= 0x00000001,   /* Unused */
119
	WPI_DEBUG_HW		= 0x00000002,   /* Stage 1 (eeprom) debugging */
120
	WPI_DEBUG_TX		= 0x00000004,   /* Stage 2 TX intrp debugging*/
121
	WPI_DEBUG_RX		= 0x00000008,   /* Stage 2 RX intrp debugging */
122
	WPI_DEBUG_CMD		= 0x00000010,   /* Stage 2 CMD intrp debugging*/
123
	WPI_DEBUG_FIRMWARE	= 0x00000020,   /* firmware(9) loading debug  */
124
	WPI_DEBUG_DMA		= 0x00000040,   /* DMA (de)allocations/syncs  */
125
	WPI_DEBUG_SCANNING	= 0x00000080,   /* Stage 2 Scanning debugging */
126
	WPI_DEBUG_NOTIFY	= 0x00000100,   /* State 2 Noftif intr debug */
127
	WPI_DEBUG_TEMP		= 0x00000200,   /* TXPower/Temp Calibration */
128
	WPI_DEBUG_OPS		= 0x00000400,   /* wpi_ops taskq debug */
129
	WPI_DEBUG_WATCHDOG	= 0x00000800,   /* Watch dog debug */
130
	WPI_DEBUG_ANY		= 0xffffffff
131
};
132
133
static int wpi_debug;
134
SYSCTL_INT(_debug, OID_AUTO, wpi, CTLFLAG_RWTUN, &wpi_debug, 0, "wpi debug level");
135
136
#else
137
#define DPRINTF(x)
138
#define DPRINTFN(n, x)
139
#define WPI_DEBUG_SET	0
140
#endif
141
142
struct wpi_ident {
110
struct wpi_ident {
143
	uint16_t	vendor;
111
	uint16_t	vendor;
144
	uint16_t	device;
112
	uint16_t	device;
Lines 158-257 Link Here
158
	{ 0, 0, 0, NULL }
126
	{ 0, 0, 0, NULL }
159
};
127
};
160
128
129
static int	wpi_probe(device_t);
130
static int	wpi_attach(device_t);
131
static void	wpi_radiotap_attach(struct wpi_softc *);
132
static void	wpi_sysctlattach(struct wpi_softc *);
161
static struct ieee80211vap *wpi_vap_create(struct ieee80211com *,
133
static struct ieee80211vap *wpi_vap_create(struct ieee80211com *,
162
		    const char [IFNAMSIZ], int, enum ieee80211_opmode, int,
134
		    const char [IFNAMSIZ], int, enum ieee80211_opmode, int,
163
		    const uint8_t [IEEE80211_ADDR_LEN],
135
		    const uint8_t [IEEE80211_ADDR_LEN],
164
		    const uint8_t [IEEE80211_ADDR_LEN]);
136
		    const uint8_t [IEEE80211_ADDR_LEN]);
165
static void	wpi_vap_delete(struct ieee80211vap *);
137
static void	wpi_vap_delete(struct ieee80211vap *);
138
static int	wpi_detach(device_t);
139
static int	wpi_shutdown(device_t);
140
static int	wpi_suspend(device_t);
141
static int	wpi_resume(device_t);
142
static int	wpi_nic_lock(struct wpi_softc *);
143
static int	wpi_read_prom_data(struct wpi_softc *, uint32_t, void *, int);
144
static void	wpi_dma_map_addr(void *, bus_dma_segment_t *, int, int);
166
static int	wpi_dma_contig_alloc(struct wpi_softc *, struct wpi_dma_info *,
145
static int	wpi_dma_contig_alloc(struct wpi_softc *, struct wpi_dma_info *,
167
		    void **, bus_size_t, bus_size_t, int);
146
		    void **, bus_size_t, bus_size_t);
168
static void	wpi_dma_contig_free(struct wpi_dma_info *);
147
static void	wpi_dma_contig_free(struct wpi_dma_info *);
169
static void	wpi_dma_map_addr(void *, bus_dma_segment_t *, int, int);
170
static int	wpi_alloc_shared(struct wpi_softc *);
148
static int	wpi_alloc_shared(struct wpi_softc *);
171
static void	wpi_free_shared(struct wpi_softc *);
149
static void	wpi_free_shared(struct wpi_softc *);
172
static int	wpi_alloc_rx_ring(struct wpi_softc *, struct wpi_rx_ring *);
150
static int	wpi_alloc_fwmem(struct wpi_softc *);
173
static void	wpi_reset_rx_ring(struct wpi_softc *, struct wpi_rx_ring *);
151
static void	wpi_free_fwmem(struct wpi_softc *);
174
static void	wpi_free_rx_ring(struct wpi_softc *, struct wpi_rx_ring *);
152
static int	wpi_alloc_rx_ring(struct wpi_softc *);
153
static void	wpi_update_rx_ring(struct wpi_softc *);
154
static void	wpi_reset_rx_ring(struct wpi_softc *);
155
static void	wpi_free_rx_ring(struct wpi_softc *);
175
static int	wpi_alloc_tx_ring(struct wpi_softc *, struct wpi_tx_ring *,
156
static int	wpi_alloc_tx_ring(struct wpi_softc *, struct wpi_tx_ring *,
176
		    int, int);
157
		    int);
158
static void	wpi_update_tx_ring(struct wpi_softc *, struct wpi_tx_ring *);
177
static void	wpi_reset_tx_ring(struct wpi_softc *, struct wpi_tx_ring *);
159
static void	wpi_reset_tx_ring(struct wpi_softc *, struct wpi_tx_ring *);
178
static void	wpi_free_tx_ring(struct wpi_softc *, struct wpi_tx_ring *);
160
static void	wpi_free_tx_ring(struct wpi_softc *, struct wpi_tx_ring *);
161
static int	wpi_read_eeprom(struct wpi_softc *,
162
		    uint8_t macaddr[IEEE80211_ADDR_LEN]);
163
static uint32_t	wpi_eeprom_channel_flags(struct wpi_eeprom_chan *);
164
static void	wpi_read_eeprom_band(struct wpi_softc *, int);
165
static int	wpi_read_eeprom_channels(struct wpi_softc *, int);
166
static struct wpi_eeprom_chan *wpi_find_eeprom_channel(struct wpi_softc *,
167
		    struct ieee80211_channel *);
168
static int	wpi_setregdomain(struct ieee80211com *,
169
		    struct ieee80211_regdomain *, int,
170
		    struct ieee80211_channel[]);
171
static int	wpi_read_eeprom_group(struct wpi_softc *, int);
172
static void	wpi_node_free(struct ieee80211_node *);
173
static struct ieee80211_node *wpi_node_alloc(struct ieee80211vap *,
174
		    const uint8_t mac[IEEE80211_ADDR_LEN]);
179
static int	wpi_newstate(struct ieee80211vap *, enum ieee80211_state, int);
175
static int	wpi_newstate(struct ieee80211vap *, enum ieee80211_state, int);
180
static void	wpi_mem_lock(struct wpi_softc *);
176
static void	wpi_calib_timeout(void *);
181
static void	wpi_mem_unlock(struct wpi_softc *);
177
static void	wpi_rx_done(struct wpi_softc *, struct wpi_rx_desc *,
182
static uint32_t	wpi_mem_read(struct wpi_softc *, uint16_t);
183
static void	wpi_mem_write(struct wpi_softc *, uint16_t, uint32_t);
184
static void	wpi_mem_write_region_4(struct wpi_softc *, uint16_t,
185
		    const uint32_t *, int);
186
static uint16_t	wpi_read_prom_data(struct wpi_softc *, uint32_t, void *, int);
187
static int	wpi_alloc_fwmem(struct wpi_softc *);
188
static void	wpi_free_fwmem(struct wpi_softc *);
189
static int	wpi_load_firmware(struct wpi_softc *);
190
static void	wpi_unload_firmware(struct wpi_softc *);
191
static int	wpi_load_microcode(struct wpi_softc *, const uint8_t *, int);
192
static void	wpi_rx_intr(struct wpi_softc *, struct wpi_rx_desc *,
193
		    struct wpi_rx_data *);
178
		    struct wpi_rx_data *);
194
static void	wpi_tx_intr(struct wpi_softc *, struct wpi_rx_desc *);
179
static void	wpi_rx_statistics(struct wpi_softc *, struct wpi_rx_desc *,
195
static void	wpi_cmd_intr(struct wpi_softc *, struct wpi_rx_desc *);
180
		    struct wpi_rx_data *);
181
static void	wpi_tx_done(struct wpi_softc *, struct wpi_rx_desc *);
182
static void	wpi_cmd_done(struct wpi_softc *, struct wpi_rx_desc *);
196
static void	wpi_notif_intr(struct wpi_softc *);
183
static void	wpi_notif_intr(struct wpi_softc *);
184
static void	wpi_wakeup_intr(struct wpi_softc *);
185
static void	wpi_fatal_intr(struct wpi_softc *);
197
static void	wpi_intr(void *);
186
static void	wpi_intr(void *);
198
static uint8_t	wpi_plcp_signal(int);
187
static int	wpi_cmd2(struct wpi_softc *, struct wpi_buf *);
199
static void	wpi_watchdog(void *);
200
static int	wpi_tx_data(struct wpi_softc *, struct mbuf *,
188
static int	wpi_tx_data(struct wpi_softc *, struct mbuf *,
201
		    struct ieee80211_node *, int);
189
		    struct ieee80211_node *);
190
static int	wpi_tx_data_raw(struct wpi_softc *, struct mbuf *,
191
		    struct ieee80211_node *,
192
		    const struct ieee80211_bpf_params *);
193
static int	wpi_raw_xmit(struct ieee80211_node *, struct mbuf *,
194
		    const struct ieee80211_bpf_params *);
202
static void	wpi_start(struct ifnet *);
195
static void	wpi_start(struct ifnet *);
203
static void	wpi_start_locked(struct ifnet *);
196
static void	wpi_start_locked(struct ifnet *);
204
static int	wpi_raw_xmit(struct ieee80211_node *, struct mbuf *,
197
static void	wpi_watchdog_rfkill(void *);
205
		    const struct ieee80211_bpf_params *);
198
static void	wpi_watchdog(void *);
206
static void	wpi_scan_start(struct ieee80211com *);
207
static void	wpi_scan_end(struct ieee80211com *);
208
static void	wpi_set_channel(struct ieee80211com *);
209
static void	wpi_scan_curchan(struct ieee80211_scan_state *, unsigned long);
210
static void	wpi_scan_mindwell(struct ieee80211_scan_state *);
211
static int	wpi_ioctl(struct ifnet *, u_long, caddr_t);
199
static int	wpi_ioctl(struct ifnet *, u_long, caddr_t);
212
static void	wpi_read_eeprom(struct wpi_softc *,
200
static int	wpi_cmd(struct wpi_softc *, int, const void *, size_t, int);
213
		    uint8_t macaddr[IEEE80211_ADDR_LEN]);
214
static void	wpi_read_eeprom_channels(struct wpi_softc *, int);
215
static void	wpi_read_eeprom_group(struct wpi_softc *, int);
216
static int	wpi_cmd(struct wpi_softc *, int, const void *, int, int);
217
static int	wpi_wme_update(struct ieee80211com *);
218
static int	wpi_mrr_setup(struct wpi_softc *);
201
static int	wpi_mrr_setup(struct wpi_softc *);
202
static int	wpi_add_node(struct wpi_softc *, struct ieee80211_node *);
203
static int	wpi_add_broadcast_node(struct wpi_softc *, int);
204
static int	wpi_add_ibss_node(struct wpi_softc *, struct ieee80211_node *);
205
static void	wpi_del_node(struct wpi_softc *, struct ieee80211_node *);
206
static int	wpi_updateedca(struct ieee80211com *);
207
static void	wpi_set_promisc(struct wpi_softc *);
208
static void	wpi_update_promisc(struct ifnet *);
209
static void	wpi_update_mcast(struct ifnet *);
219
static void	wpi_set_led(struct wpi_softc *, uint8_t, uint8_t, uint8_t);
210
static void	wpi_set_led(struct wpi_softc *, uint8_t, uint8_t, uint8_t);
220
static void	wpi_enable_tsf(struct wpi_softc *, struct ieee80211_node *);
211
static int	wpi_set_timing(struct wpi_softc *, struct ieee80211_node *);
221
#if 0
212
static void	wpi_power_calibration(struct wpi_softc *);
213
static int	wpi_set_txpower(struct wpi_softc *, int);
214
static int	wpi_get_power_index(struct wpi_softc *,
215
		    struct wpi_power_group *, struct ieee80211_channel *, int);
216
static int	wpi_set_pslevel(struct wpi_softc *, uint8_t, int, int);
217
static int	wpi_send_btcoex(struct wpi_softc *);
218
static int	wpi_send_rxon(struct wpi_softc *, int, int);
219
static int	wpi_config(struct wpi_softc *);
220
static uint16_t	wpi_get_active_dwell_time(struct wpi_softc *,
221
		    struct ieee80211_channel *, uint8_t);
222
static uint16_t	wpi_limit_dwell(struct wpi_softc *, uint16_t);
223
static uint16_t	wpi_get_passive_dwell_time(struct wpi_softc *,
224
		    struct ieee80211_channel *);
225
static int	wpi_scan(struct wpi_softc *, struct ieee80211_channel *);
226
static int	wpi_auth(struct wpi_softc *, struct ieee80211vap *);
227
static void	wpi_update_beacon(struct ieee80211vap *, int);
222
static int	wpi_setup_beacon(struct wpi_softc *, struct ieee80211_node *);
228
static int	wpi_setup_beacon(struct wpi_softc *, struct ieee80211_node *);
223
#endif
224
static int	wpi_auth(struct wpi_softc *, struct ieee80211vap *);
225
static int	wpi_run(struct wpi_softc *, struct ieee80211vap *);
229
static int	wpi_run(struct wpi_softc *, struct ieee80211vap *);
226
static int	wpi_scan(struct wpi_softc *);
230
static int	wpi_key_alloc(struct ieee80211vap *, struct ieee80211_key *,
227
static int	wpi_config(struct wpi_softc *);
231
		    ieee80211_keyix *, ieee80211_keyix *);
228
static void	wpi_stop_master(struct wpi_softc *);
232
static int	wpi_key_set(struct ieee80211vap *,
229
static int	wpi_power_up(struct wpi_softc *);
233
		    const struct ieee80211_key *,
230
static int	wpi_reset(struct wpi_softc *);
234
		    const uint8_t mac[IEEE80211_ADDR_LEN]);
231
static void	wpi_hwreset(void *, int);
235
static int	wpi_key_delete(struct ieee80211vap *,
232
static void	wpi_rfreset(void *, int);
236
		    const struct ieee80211_key *);
233
static void	wpi_hw_config(struct wpi_softc *);
237
static int	wpi_post_alive(struct wpi_softc *);
238
static int	wpi_load_bootcode(struct wpi_softc *, const uint8_t *, int);
239
static int	wpi_load_firmware(struct wpi_softc *);
240
static int	wpi_read_firmware(struct wpi_softc *);
241
static void	wpi_unload_firmware(struct wpi_softc *);
242
static int	wpi_clock_wait(struct wpi_softc *);
243
static int	wpi_apm_init(struct wpi_softc *);
244
static void	wpi_apm_stop_master(struct wpi_softc *);
245
static void	wpi_apm_stop(struct wpi_softc *);
246
static void	wpi_nic_config(struct wpi_softc *);
247
static int	wpi_hw_init(struct wpi_softc *);
248
static void	wpi_hw_stop(struct wpi_softc *);
249
static void	wpi_radio_on(void *, int);
250
static void	wpi_radio_off(void *, int);
251
static void	wpi_init_locked(struct wpi_softc *);
234
static void	wpi_init(void *);
252
static void	wpi_init(void *);
235
static void	wpi_init_locked(struct wpi_softc *, int);
253
static void	wpi_stop_locked(struct wpi_softc *);
236
static void	wpi_stop(struct wpi_softc *);
254
static void	wpi_stop(struct wpi_softc *);
237
static void	wpi_stop_locked(struct wpi_softc *);
255
static void	wpi_scan_start(struct ieee80211com *);
256
static void	wpi_scan_end(struct ieee80211com *);
257
static void	wpi_set_channel(struct ieee80211com *);
258
static void	wpi_scan_curchan(struct ieee80211_scan_state *, unsigned long);
259
static void	wpi_scan_mindwell(struct ieee80211_scan_state *);
260
static void	wpi_hw_reset(void *, int);
238
261
239
static int	wpi_set_txpower(struct wpi_softc *, struct ieee80211_channel *,
240
		    int);
241
static void	wpi_calib_timeout(void *);
242
static void	wpi_power_calibration(struct wpi_softc *, int);
243
static int	wpi_get_power_index(struct wpi_softc *,
244
		    struct wpi_power_group *, struct ieee80211_channel *, int);
245
#ifdef WPI_DEBUG
246
static const char *wpi_cmd_str(int);
247
#endif
248
static int wpi_probe(device_t);
249
static int wpi_attach(device_t);
250
static int wpi_detach(device_t);
251
static int wpi_shutdown(device_t);
252
static int wpi_suspend(device_t);
253
static int wpi_resume(device_t);
254
255
static device_method_t wpi_methods[] = {
262
static device_method_t wpi_methods[] = {
256
	/* Device interface */
263
	/* Device interface */
257
	DEVMETHOD(device_probe,		wpi_probe),
264
	DEVMETHOD(device_probe,		wpi_probe),
Lines 269-275 Link Here
269
	wpi_methods,
276
	wpi_methods,
270
	sizeof (struct wpi_softc)
277
	sizeof (struct wpi_softc)
271
};
278
};
272
273
static devclass_t wpi_devclass;
279
static devclass_t wpi_devclass;
274
280
275
DRIVER_MODULE(wpi, pci, wpi_driver, wpi_devclass, NULL, NULL);
281
DRIVER_MODULE(wpi, pci, wpi_driver, wpi_devclass, NULL, NULL);
Lines 276-294 Link Here
276
282
277
MODULE_VERSION(wpi, 1);
283
MODULE_VERSION(wpi, 1);
278
284
279
static const uint8_t wpi_ridx_to_plcp[] = {
285
MODULE_DEPEND(wpi, pci,  1, 1, 1);
280
	/* OFDM: IEEE Std 802.11a-1999, pp. 14 Table 80 */
286
MODULE_DEPEND(wpi, wlan, 1, 1, 1);
281
	/* R1-R4 (ral/ural is R4-R1) */
287
MODULE_DEPEND(wpi, firmware, 1, 1, 1);
282
	0xd, 0xf, 0x5, 0x7, 0x9, 0xb, 0x1, 0x3,
283
	/* CCK: device-dependent */
284
	10, 20, 55, 110
285
};
286
288
287
static const uint8_t wpi_ridx_to_rate[] = {
288
	12, 18, 24, 36, 48, 72, 96, 108, /* OFDM */
289
	2, 4, 11, 22 /*CCK */
290
};
291
292
static int
289
static int
293
wpi_probe(device_t dev)
290
wpi_probe(device_t dev)
294
{
291
{
Lines 304-507 Link Here
304
	return ENXIO;
301
	return ENXIO;
305
}
302
}
306
303
307
/**
308
 * Load the firmare image from disk to the allocated dma buffer.
309
 * we also maintain the reference to the firmware pointer as there
310
 * is times where we may need to reload the firmware but we are not
311
 * in a context that can access the filesystem (ie taskq cause by restart)
312
 *
313
 * @return 0 on success, an errno on failure
314
 */
315
static int
304
static int
316
wpi_load_firmware(struct wpi_softc *sc)
317
{
318
	const struct firmware *fp;
319
	struct wpi_dma_info *dma = &sc->fw_dma;
320
	const struct wpi_firmware_hdr *hdr;
321
	const uint8_t *itext, *idata, *rtext, *rdata, *btext;
322
	uint32_t itextsz, idatasz, rtextsz, rdatasz, btextsz;
323
	int error;
324
325
	DPRINTFN(WPI_DEBUG_FIRMWARE,
326
	    ("Attempting Loading Firmware from wpi_fw module\n"));
327
328
	WPI_UNLOCK(sc);
329
330
	if (sc->fw_fp == NULL && (sc->fw_fp = firmware_get("wpifw")) == NULL) {
331
		device_printf(sc->sc_dev,
332
		    "could not load firmware image 'wpifw'\n");
333
		error = ENOENT;
334
		WPI_LOCK(sc);
335
		goto fail;
336
	}
337
338
	fp = sc->fw_fp;
339
340
	WPI_LOCK(sc);
341
342
	/* Validate the firmware is minimum a particular version */
343
	if (fp->version < WPI_FW_MINVERSION) {
344
	    device_printf(sc->sc_dev,
345
			   "firmware version is too old. Need %d, got %d\n",
346
			   WPI_FW_MINVERSION,
347
			   fp->version);
348
	    error = ENXIO;
349
	    goto fail;
350
	}
351
352
	if (fp->datasize < sizeof (struct wpi_firmware_hdr)) {
353
		device_printf(sc->sc_dev,
354
		    "firmware file too short: %zu bytes\n", fp->datasize);
355
		error = ENXIO;
356
		goto fail;
357
	}
358
359
	hdr = (const struct wpi_firmware_hdr *)fp->data;
360
361
	/*     |  RUNTIME FIRMWARE   |    INIT FIRMWARE    | BOOT FW  |
362
	   |HDR|<--TEXT-->|<--DATA-->|<--TEXT-->|<--DATA-->|<--TEXT-->| */
363
364
	rtextsz = le32toh(hdr->rtextsz);
365
	rdatasz = le32toh(hdr->rdatasz);
366
	itextsz = le32toh(hdr->itextsz);
367
	idatasz = le32toh(hdr->idatasz);
368
	btextsz = le32toh(hdr->btextsz);
369
370
	/* check that all firmware segments are present */
371
	if (fp->datasize < sizeof (struct wpi_firmware_hdr) +
372
		rtextsz + rdatasz + itextsz + idatasz + btextsz) {
373
		device_printf(sc->sc_dev,
374
		    "firmware file too short: %zu bytes\n", fp->datasize);
375
		error = ENXIO; /* XXX appropriate error code? */
376
		goto fail;
377
	}
378
379
	/* get pointers to firmware segments */
380
	rtext = (const uint8_t *)(hdr + 1);
381
	rdata = rtext + rtextsz;
382
	itext = rdata + rdatasz;
383
	idata = itext + itextsz;
384
	btext = idata + idatasz;
385
386
	DPRINTFN(WPI_DEBUG_FIRMWARE,
387
	    ("Firmware Version: Major %d, Minor %d, Driver %d, \n"
388
	     "runtime (text: %u, data: %u) init (text: %u, data %u) boot (text %u)\n",
389
	     (le32toh(hdr->version) & 0xff000000) >> 24,
390
	     (le32toh(hdr->version) & 0x00ff0000) >> 16,
391
	     (le32toh(hdr->version) & 0x0000ffff),
392
	     rtextsz, rdatasz,
393
	     itextsz, idatasz, btextsz));
394
395
	DPRINTFN(WPI_DEBUG_FIRMWARE,("rtext 0x%x\n", *(const uint32_t *)rtext));
396
	DPRINTFN(WPI_DEBUG_FIRMWARE,("rdata 0x%x\n", *(const uint32_t *)rdata));
397
	DPRINTFN(WPI_DEBUG_FIRMWARE,("itext 0x%x\n", *(const uint32_t *)itext));
398
	DPRINTFN(WPI_DEBUG_FIRMWARE,("idata 0x%x\n", *(const uint32_t *)idata));
399
	DPRINTFN(WPI_DEBUG_FIRMWARE,("btext 0x%x\n", *(const uint32_t *)btext));
400
401
	/* sanity checks */
402
	if (rtextsz > WPI_FW_MAIN_TEXT_MAXSZ ||
403
	    rdatasz > WPI_FW_MAIN_DATA_MAXSZ ||
404
	    itextsz > WPI_FW_INIT_TEXT_MAXSZ ||
405
	    idatasz > WPI_FW_INIT_DATA_MAXSZ ||
406
	    btextsz > WPI_FW_BOOT_TEXT_MAXSZ ||
407
	    (btextsz & 3) != 0) {
408
		device_printf(sc->sc_dev, "firmware invalid\n");
409
		error = EINVAL;
410
		goto fail;
411
	}
412
413
	/* copy initialization images into pre-allocated DMA-safe memory */
414
	memcpy(dma->vaddr, idata, idatasz);
415
	memcpy(dma->vaddr + WPI_FW_INIT_DATA_MAXSZ, itext, itextsz);
416
417
	bus_dmamap_sync(dma->tag, dma->map, BUS_DMASYNC_PREWRITE);
418
419
	/* tell adapter where to find initialization images */
420
	wpi_mem_lock(sc);
421
	wpi_mem_write(sc, WPI_MEM_DATA_BASE, dma->paddr);
422
	wpi_mem_write(sc, WPI_MEM_DATA_SIZE, idatasz);
423
	wpi_mem_write(sc, WPI_MEM_TEXT_BASE,
424
	    dma->paddr + WPI_FW_INIT_DATA_MAXSZ);
425
	wpi_mem_write(sc, WPI_MEM_TEXT_SIZE, itextsz);
426
	wpi_mem_unlock(sc);
427
428
	/* load firmware boot code */
429
	if ((error = wpi_load_microcode(sc, btext, btextsz)) != 0) {
430
	    device_printf(sc->sc_dev, "Failed to load microcode\n");
431
	    goto fail;
432
	}
433
434
	/* now press "execute" */
435
	WPI_WRITE(sc, WPI_RESET, 0);
436
437
	/* wait at most one second for the first alive notification */
438
	if ((error = msleep(sc, &sc->sc_mtx, PCATCH, "wpiinit", hz)) != 0) {
439
		device_printf(sc->sc_dev,
440
		    "timeout waiting for adapter to initialize\n");
441
		goto fail;
442
	}
443
444
	/* copy runtime images into pre-allocated DMA-sage memory */
445
	memcpy(dma->vaddr, rdata, rdatasz);
446
	memcpy(dma->vaddr + WPI_FW_MAIN_DATA_MAXSZ, rtext, rtextsz);
447
	bus_dmamap_sync(dma->tag, dma->map, BUS_DMASYNC_PREWRITE);
448
449
	/* tell adapter where to find runtime images */
450
	wpi_mem_lock(sc);
451
	wpi_mem_write(sc, WPI_MEM_DATA_BASE, dma->paddr);
452
	wpi_mem_write(sc, WPI_MEM_DATA_SIZE, rdatasz);
453
	wpi_mem_write(sc, WPI_MEM_TEXT_BASE,
454
	    dma->paddr + WPI_FW_MAIN_DATA_MAXSZ);
455
	wpi_mem_write(sc, WPI_MEM_TEXT_SIZE, WPI_FW_UPDATED | rtextsz);
456
	wpi_mem_unlock(sc);
457
458
	/* wait at most one second for the first alive notification */
459
	if ((error = msleep(sc, &sc->sc_mtx, PCATCH, "wpiinit", hz)) != 0) {
460
		device_printf(sc->sc_dev,
461
		    "timeout waiting for adapter to initialize2\n");
462
		goto fail;
463
	}
464
465
	DPRINTFN(WPI_DEBUG_FIRMWARE,
466
	    ("Firmware loaded to driver successfully\n"));
467
	return error;
468
fail:
469
	wpi_unload_firmware(sc);
470
	return error;
471
}
472
473
/**
474
 * Free the referenced firmware image
475
 */
476
static void
477
wpi_unload_firmware(struct wpi_softc *sc)
478
{
479
480
	if (sc->fw_fp) {
481
		WPI_UNLOCK(sc);
482
		firmware_put(sc->fw_fp, FIRMWARE_UNLOAD);
483
		WPI_LOCK(sc);
484
		sc->fw_fp = NULL;
485
	}
486
}
487
488
static int
489
wpi_attach(device_t dev)
305
wpi_attach(device_t dev)
490
{
306
{
491
	struct wpi_softc *sc = device_get_softc(dev);
307
	struct wpi_softc *sc = (struct wpi_softc *)device_get_softc(dev);
308
	struct ieee80211com *ic;
492
	struct ifnet *ifp;
309
	struct ifnet *ifp;
493
	struct ieee80211com *ic;
310
	int i, error, rid, supportsa = 1;
494
	int ac, error, rid, supportsa = 1;
495
	uint32_t tmp;
496
	const struct wpi_ident *ident;
311
	const struct wpi_ident *ident;
497
	uint8_t macaddr[IEEE80211_ADDR_LEN];
312
	uint8_t macaddr[IEEE80211_ADDR_LEN];
498
313
499
	sc->sc_dev = dev;
314
	sc->sc_dev = dev;
500
315
501
	if (bootverbose || WPI_DEBUG_SET)
316
#ifdef	WPI_DEBUG
502
	    device_printf(sc->sc_dev,"Driver Revision %s\n", VERSION);
317
	error = resource_int_value(device_get_name(sc->sc_dev),
318
	    device_get_unit(sc->sc_dev), "debug", &(sc->sc_debug));
319
	if (error != 0)
320
		sc->sc_debug = 0;
321
#else
322
	sc->sc_debug = 0;
323
#endif
503
324
325
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_BEGIN, __func__);
326
504
	/*
327
	/*
328
	 * Get the offset of the PCI Express Capability Structure in PCI
329
	 * Configuration Space.
330
	 */
331
	error = pci_find_cap(dev, PCIY_EXPRESS, &sc->sc_cap_off);
332
	if (error != 0) {
333
		device_printf(dev, "PCIe capability structure not found!\n");
334
		return error;
335
	}
336
337
	/*
505
	 * Some card's only support 802.11b/g not a, check to see if
338
	 * Some card's only support 802.11b/g not a, check to see if
506
	 * this is one such card. A 0x0 in the subdevice table indicates
339
	 * this is one such card. A 0x0 in the subdevice table indicates
507
	 * the entire subdevice range is to be ignored.
340
	 * the entire subdevice range is to be ignored.
Lines 514-532 Link Here
514
		}
347
		}
515
	}
348
	}
516
349
517
	/* Create the tasks that can be queued */
350
	/* Clear device-specific "PCI retry timeout" register (41h). */
518
	TASK_INIT(&sc->sc_restarttask, 0, wpi_hwreset, sc);
519
	TASK_INIT(&sc->sc_radiotask, 0, wpi_rfreset, sc);
520
521
	WPI_LOCK_INIT(sc);
522
523
	callout_init_mtx(&sc->calib_to, &sc->sc_mtx, 0);
524
	callout_init_mtx(&sc->watchdog_to, &sc->sc_mtx, 0);
525
526
	/* disable the retry timeout register */
527
	pci_write_config(dev, 0x41, 0, 1);
351
	pci_write_config(dev, 0x41, 0, 1);
528
352
529
	/* enable bus-mastering */
353
	/* Enable bus-mastering. */
530
	pci_enable_busmaster(dev);
354
	pci_enable_busmaster(dev);
531
355
532
	rid = PCIR_BAR(0);
356
	rid = PCIR_BAR(0);
Lines 533-644 Link Here
533
	sc->mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
357
	sc->mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
534
	    RF_ACTIVE);
358
	    RF_ACTIVE);
535
	if (sc->mem == NULL) {
359
	if (sc->mem == NULL) {
536
		device_printf(dev, "could not allocate memory resource\n");
360
		device_printf(dev, "can't map mem space\n");
537
		error = ENOMEM;
361
		error = ENOMEM;
538
		goto fail;
362
		return error;
539
	}
363
	}
540
541
	sc->sc_st = rman_get_bustag(sc->mem);
364
	sc->sc_st = rman_get_bustag(sc->mem);
542
	sc->sc_sh = rman_get_bushandle(sc->mem);
365
	sc->sc_sh = rman_get_bushandle(sc->mem);
543
366
367
	i = 1;
544
	rid = 0;
368
	rid = 0;
545
	sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
369
	if (pci_alloc_msi(dev, &i) == 0)
546
	    RF_ACTIVE | RF_SHAREABLE);
370
		rid = 1;
371
	/* Install interrupt handler. */
372
	sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE |
373
	    (rid != 0 ? 0 : RF_SHAREABLE));
547
	if (sc->irq == NULL) {
374
	if (sc->irq == NULL) {
548
		device_printf(dev, "could not allocate interrupt resource\n");
375
		device_printf(dev, "can't map interrupt\n");
549
		error = ENOMEM;
376
		error = ENOMEM;
550
		goto fail;
377
		goto fail;
551
	}
378
	}
552
379
553
	/*
380
	WPI_LOCK_INIT(sc);
554
	 * Allocate DMA memory for firmware transfers.
381
555
	 */
382
	sc->sc_unr = new_unrhdr(WPI_ID_IBSS_MIN, WPI_ID_IBSS_MAX, &sc->sc_mtx);
383
384
	/* Allocate DMA memory for firmware transfers. */
556
	if ((error = wpi_alloc_fwmem(sc)) != 0) {
385
	if ((error = wpi_alloc_fwmem(sc)) != 0) {
557
		printf(": could not allocate firmware memory\n");
386
		device_printf(dev,
558
		error = ENOMEM;
387
		    "could not allocate memory for firmware, error %d\n",
388
		    error);
559
		goto fail;
389
		goto fail;
560
	}
390
	}
561
391
562
	/*
392
	/* Allocate shared page. */
563
	 * Put adapter into a known state.
564
	 */
565
	if ((error = wpi_reset(sc)) != 0) {
566
		device_printf(dev, "could not reset adapter\n");
567
		goto fail;
568
	}
569
570
	wpi_mem_lock(sc);
571
	tmp = wpi_mem_read(sc, WPI_MEM_PCIDEV);
572
	if (bootverbose || WPI_DEBUG_SET)
573
	    device_printf(sc->sc_dev, "Hardware Revision (0x%X)\n", tmp);
574
575
	wpi_mem_unlock(sc);
576
577
	/* Allocate shared page */
578
	if ((error = wpi_alloc_shared(sc)) != 0) {
393
	if ((error = wpi_alloc_shared(sc)) != 0) {
579
		device_printf(dev, "could not allocate shared page\n");
394
		device_printf(dev, "could not allocate shared page\n");
580
		goto fail;
395
		goto fail;
581
	}
396
	}
582
397
583
	/* tx data queues  - 4 for QoS purposes */
398
	/* Allocate TX rings - 4 for QoS purposes, 1 for commands. */
584
	for (ac = 0; ac < WME_NUM_AC; ac++) {
399
	for (i = 0; i < WPI_NTXQUEUES; i++) {
585
		error = wpi_alloc_tx_ring(sc, &sc->txq[ac], WPI_TX_RING_COUNT, ac);
400
		if ((error = wpi_alloc_tx_ring(sc, &sc->txq[i], i)) != 0) {
586
		if (error != 0) {
401
			device_printf(dev,
587
		    device_printf(dev, "could not allocate Tx ring %d\n",ac);
402
			    "could not allocate TX ring %d, error %d\n", i,
588
		    goto fail;
403
			    error);
404
			goto fail;
589
		}
405
		}
590
	}
406
	}
591
407
592
	/* command queue to talk to the card's firmware */
408
	/* Allocate RX ring. */
593
	error = wpi_alloc_tx_ring(sc, &sc->cmdq, WPI_CMD_RING_COUNT, 4);
409
	if ((error = wpi_alloc_rx_ring(sc)) != 0) {
594
	if (error != 0) {
410
		device_printf(dev, "could not allocate RX ring, error %d\n",
595
		device_printf(dev, "could not allocate command ring\n");
411
		    error);
596
		goto fail;
412
		goto fail;
597
	}
413
	}
598
414
599
	/* receive data queue */
415
	/* Clear pending interrupts. */
600
	error = wpi_alloc_rx_ring(sc, &sc->rxq);
416
	WPI_WRITE(sc, WPI_INT, 0xffffffff);
601
	if (error != 0) {
602
		device_printf(dev, "could not allocate Rx ring\n");
603
		goto fail;
604
	}
605
417
606
	ifp = sc->sc_ifp = if_alloc(IFT_IEEE80211);
418
	ifp = sc->sc_ifp = if_alloc(IFT_IEEE80211);
607
	if (ifp == NULL) {
419
	if (ifp == NULL) {
608
		device_printf(dev, "can not if_alloc()\n");
420
		device_printf(dev, "can not allocate ifnet structure\n");
609
		error = ENOMEM;
610
		goto fail;
421
		goto fail;
611
	}
422
	}
423
612
	ic = ifp->if_l2com;
424
	ic = ifp->if_l2com;
613
614
	ic->ic_ifp = ifp;
425
	ic->ic_ifp = ifp;
615
	ic->ic_phytype = IEEE80211_T_OFDM;	/* not only, but not used */
426
	ic->ic_phytype = IEEE80211_T_OFDM;	/* not only, but not used */
616
	ic->ic_opmode = IEEE80211_M_STA;	/* default to BSS mode */
427
	ic->ic_opmode = IEEE80211_M_STA;	/* default to BSS mode */
617
428
618
	/* set device capabilities */
429
	/* Set device capabilities. */
619
	ic->ic_caps =
430
	ic->ic_caps =
620
		  IEEE80211_C_STA		/* station mode supported */
431
		  IEEE80211_C_STA		/* station mode supported */
432
		| IEEE80211_C_IBSS		/* IBSS mode supported */
621
		| IEEE80211_C_MONITOR		/* monitor mode supported */
433
		| IEEE80211_C_MONITOR		/* monitor mode supported */
434
		| IEEE80211_C_AHDEMO		/* adhoc demo mode */
435
		| IEEE80211_C_BGSCAN		/* capable of bg scanning */
622
		| IEEE80211_C_TXPMGT		/* tx power management */
436
		| IEEE80211_C_TXPMGT		/* tx power management */
623
		| IEEE80211_C_SHSLOT		/* short slot time supported */
437
		| IEEE80211_C_SHSLOT		/* short slot time supported */
438
		| IEEE80211_C_WPA		/* 802.11i */
624
		| IEEE80211_C_SHPREAMBLE	/* short preamble supported */
439
		| IEEE80211_C_SHPREAMBLE	/* short preamble supported */
625
		| IEEE80211_C_WPA		/* 802.11i */
626
/* XXX looks like WME is partly supported? */
627
#if 0
440
#if 0
628
		| IEEE80211_C_IBSS		/* IBSS mode support */
629
		| IEEE80211_C_BGSCAN		/* capable of bg scanning */
630
		| IEEE80211_C_WME		/* 802.11e */
631
		| IEEE80211_C_HOSTAP		/* Host access point mode */
441
		| IEEE80211_C_HOSTAP		/* Host access point mode */
632
#endif
442
#endif
443
		| IEEE80211_C_WME		/* 802.11e */
444
		| IEEE80211_C_PMGT		/* Station-side power mgmt */
633
		;
445
		;
634
446
447
	ic->ic_cryptocaps =
448
		  IEEE80211_CRYPTO_AES_CCM;
449
635
	/*
450
	/*
636
	 * Read in the eeprom and also setup the channels for
451
	 * Read in the eeprom and also setup the channels for
637
	 * net80211. We don't set the rates as net80211 does this for us
452
	 * net80211. We don't set the rates as net80211 does this for us
638
	 */
453
	 */
639
	wpi_read_eeprom(sc, macaddr);
454
	if ((error = wpi_read_eeprom(sc, macaddr)) != 0) {
455
		device_printf(dev, "could not read EEPROM, error %d\n",
456
		    error);
457
		goto fail;
458
        }
640
459
641
	if (bootverbose || WPI_DEBUG_SET) {
460
#ifdef	WPI_DEBUG
461
	if (bootverbose) {
642
	    device_printf(sc->sc_dev, "Regulatory Domain: %.4s\n", sc->domain);
462
	    device_printf(sc->sc_dev, "Regulatory Domain: %.4s\n", sc->domain);
643
	    device_printf(sc->sc_dev, "Hardware Type: %c\n",
463
	    device_printf(sc->sc_dev, "Hardware Type: %c\n",
644
			  sc->type > 1 ? 'B': '?');
464
			  sc->type > 1 ? 'B': '?');
Lines 650-655 Link Here
650
	    /* XXX hw_config uses the PCIDEV for the Hardware rev. Must check
470
	    /* XXX hw_config uses the PCIDEV for the Hardware rev. Must check
651
	       what sc->rev really represents - benjsc 20070615 */
471
	       what sc->rev really represents - benjsc 20070615 */
652
	}
472
	}
473
#endif
653
474
654
	if_initname(ifp, device_get_name(dev), device_get_unit(dev));
475
	if_initname(ifp, device_get_name(dev), device_get_unit(dev));
655
	ifp->if_softc = sc;
476
	ifp->if_softc = sc;
Lines 662-706 Link Here
662
	IFQ_SET_READY(&ifp->if_snd);
483
	IFQ_SET_READY(&ifp->if_snd);
663
484
664
	ieee80211_ifattach(ic, macaddr);
485
	ieee80211_ifattach(ic, macaddr);
665
	/* override default methods */
486
	ic->ic_vap_create = wpi_vap_create;
487
	ic->ic_vap_delete = wpi_vap_delete;
666
	ic->ic_raw_xmit = wpi_raw_xmit;
488
	ic->ic_raw_xmit = wpi_raw_xmit;
667
	ic->ic_wme.wme_update = wpi_wme_update;
489
	ic->ic_node_alloc = wpi_node_alloc;
490
	sc->sc_node_free = ic->ic_node_free;
491
	ic->ic_node_free = wpi_node_free;
492
	ic->ic_wme.wme_update = wpi_updateedca;
493
	ic->ic_update_promisc = wpi_update_promisc;
494
	ic->ic_update_mcast = wpi_update_mcast;
668
	ic->ic_scan_start = wpi_scan_start;
495
	ic->ic_scan_start = wpi_scan_start;
669
	ic->ic_scan_end = wpi_scan_end;
496
	ic->ic_scan_end = wpi_scan_end;
670
	ic->ic_set_channel = wpi_set_channel;
497
	ic->ic_set_channel = wpi_set_channel;
498
	sc->sc_scan_curchan = ic->ic_scan_curchan;
671
	ic->ic_scan_curchan = wpi_scan_curchan;
499
	ic->ic_scan_curchan = wpi_scan_curchan;
672
	ic->ic_scan_mindwell = wpi_scan_mindwell;
500
	ic->ic_scan_mindwell = wpi_scan_mindwell;
501
	ic->ic_setregdomain = wpi_setregdomain;
673
502
674
	ic->ic_vap_create = wpi_vap_create;
503
	wpi_radiotap_attach(sc);
675
	ic->ic_vap_delete = wpi_vap_delete;
676
504
677
	ieee80211_radiotap_attach(ic,
505
	callout_init_mtx(&sc->calib_to, &sc->sc_mtx, 0);
678
	    &sc->sc_txtap.wt_ihdr, sizeof(sc->sc_txtap),
506
	callout_init_mtx(&sc->watchdog_to, &sc->sc_mtx, 0);
679
		WPI_TX_RADIOTAP_PRESENT,
507
	callout_init_mtx(&sc->watchdog_rfkill, &sc->sc_mtx, 0);
680
	    &sc->sc_rxtap.wr_ihdr, sizeof(sc->sc_rxtap),
508
	TASK_INIT(&sc->sc_reinittask, 0, wpi_hw_reset, sc);
681
		WPI_RX_RADIOTAP_PRESENT);
509
	TASK_INIT(&sc->sc_radiooff_task, 0, wpi_radio_off, sc);
510
	TASK_INIT(&sc->sc_radioon_task, 0, wpi_radio_on, sc);
682
511
512
	wpi_sysctlattach(sc);
513
683
	/*
514
	/*
684
	 * Hook our interrupt after all initialization is complete.
515
	 * Hook our interrupt after all initialization is complete.
685
	 */
516
	 */
686
	error = bus_setup_intr(dev, sc->irq, INTR_TYPE_NET |INTR_MPSAFE,
517
	error = bus_setup_intr(dev, sc->irq, INTR_TYPE_NET | INTR_MPSAFE,
687
	    NULL, wpi_intr, sc, &sc->sc_ih);
518
	    NULL, wpi_intr, sc, &sc->sc_ih);
688
	if (error != 0) {
519
	if (error != 0) {
689
		device_printf(dev, "could not set up interrupt\n");
520
		device_printf(dev, "can't establish interrupt, error %d\n",
521
		    error);
690
		goto fail;
522
		goto fail;
691
	}
523
	}
692
524
693
	if (bootverbose)
525
	if (bootverbose)
694
		ieee80211_announce(ic);
526
		ieee80211_announce(ic);
695
#ifdef XXX_DEBUG
527
696
	ieee80211_announce_channels(ic);
528
#ifdef WPI_DEBUG
529
	if (sc->sc_debug & WPI_DEBUG_HW)
530
		ieee80211_announce_channels(ic);
697
#endif
531
#endif
532
533
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END, __func__);
698
	return 0;
534
	return 0;
699
535
700
fail:	wpi_detach(dev);
536
fail:	wpi_detach(dev);
701
	return ENXIO;
537
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END_ERR, __func__);
538
	return error;
702
}
539
}
703
540
541
/*
542
 * Attach the interface to 802.11 radiotap.
543
 */
544
static void
545
wpi_radiotap_attach(struct wpi_softc *sc)
546
{
547
	struct ifnet *ifp = sc->sc_ifp;
548
	struct ieee80211com *ic = ifp->if_l2com;
549
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_BEGIN, __func__);
550
	ieee80211_radiotap_attach(ic,
551
	    &sc->sc_txtap.wt_ihdr, sizeof(sc->sc_txtap),
552
		WPI_TX_RADIOTAP_PRESENT,
553
	    &sc->sc_rxtap.wr_ihdr, sizeof(sc->sc_rxtap),
554
		WPI_RX_RADIOTAP_PRESENT);
555
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END, __func__);
556
}
557
558
static void
559
wpi_sysctlattach(struct wpi_softc *sc)
560
{
561
#ifdef  WPI_DEBUG
562
	struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->sc_dev);
563
	struct sysctl_oid *tree = device_get_sysctl_tree(sc->sc_dev);
564
565
	SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
566
	    "debug", CTLFLAG_RW, &sc->sc_debug, sc->sc_debug,
567
		"control debugging printfs");
568
#endif
569
}
570
571
static struct ieee80211vap *
572
wpi_vap_create(struct ieee80211com *ic, const char name[IFNAMSIZ], int unit,
573
    enum ieee80211_opmode opmode, int flags,
574
    const uint8_t bssid[IEEE80211_ADDR_LEN],
575
    const uint8_t mac[IEEE80211_ADDR_LEN])
576
{
577
	struct wpi_vap *wvp;
578
	struct wpi_buf *bcn;
579
	struct ieee80211vap *vap;
580
581
	if (!TAILQ_EMPTY(&ic->ic_vaps))		/* only one at a time */
582
		return NULL;
583
584
	wvp = (struct wpi_vap *) malloc(sizeof(struct wpi_vap),
585
	    M_80211_VAP, M_NOWAIT | M_ZERO);
586
	if (wvp == NULL)
587
		return NULL;
588
	vap = &wvp->vap;
589
	ieee80211_vap_setup(ic, vap, name, unit, opmode, flags, bssid, mac);
590
591
	bcn = &wvp->wv_bcbuf;
592
	bcn->data = NULL;
593
594
	/* Override with driver methods. */
595
	wvp->newstate = vap->iv_newstate;
596
	vap->iv_key_alloc = wpi_key_alloc;
597
	vap->iv_key_set = wpi_key_set;
598
	vap->iv_key_delete = wpi_key_delete;
599
	vap->iv_newstate = wpi_newstate;
600
	vap->iv_update_beacon = wpi_update_beacon;
601
602
	ieee80211_ratectl_init(vap);
603
	/* Complete setup. */
604
	ieee80211_vap_attach(vap, ieee80211_media_change, ieee80211_media_status);
605
	ic->ic_opmode = opmode;
606
	return vap;
607
}
608
609
static void
610
wpi_vap_delete(struct ieee80211vap *vap)
611
{
612
	struct wpi_vap *wvp = WPI_VAP(vap);
613
	struct wpi_buf *bcn = &wvp->wv_bcbuf;
614
615
	ieee80211_ratectl_deinit(vap);
616
	ieee80211_vap_detach(vap);
617
618
	if (bcn->data != NULL)
619
		free(bcn->data, M_DEVBUF);
620
	free(wvp, M_80211_VAP);
621
}
622
704
static int
623
static int
705
wpi_detach(device_t dev)
624
wpi_detach(device_t dev)
706
{
625
{
Lines 707-749 Link Here
707
	struct wpi_softc *sc = device_get_softc(dev);
626
	struct wpi_softc *sc = device_get_softc(dev);
708
	struct ifnet *ifp = sc->sc_ifp;
627
	struct ifnet *ifp = sc->sc_ifp;
709
	struct ieee80211com *ic;
628
	struct ieee80211com *ic;
710
	int ac;
629
	int qid;
711
630
712
	if (sc->irq != NULL)
631
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_BEGIN, __func__);
713
		bus_teardown_intr(dev, sc->irq, sc->sc_ih);
714
632
715
	if (ifp != NULL) {
633
	if (ifp != NULL) {
716
		ic = ifp->if_l2com;
634
		ic = ifp->if_l2com;
717
635
718
		ieee80211_draintask(ic, &sc->sc_restarttask);
636
		ieee80211_draintask(ic, &sc->sc_reinittask);
719
		ieee80211_draintask(ic, &sc->sc_radiotask);
637
		ieee80211_draintask(ic, &sc->sc_radiooff_task);
638
720
		wpi_stop(sc);
639
		wpi_stop(sc);
640
721
		callout_drain(&sc->watchdog_to);
641
		callout_drain(&sc->watchdog_to);
642
		callout_drain(&sc->watchdog_rfkill);
722
		callout_drain(&sc->calib_to);
643
		callout_drain(&sc->calib_to);
723
		ieee80211_ifdetach(ic);
644
		ieee80211_ifdetach(ic);
724
	}
645
	}
725
646
726
	WPI_LOCK(sc);
647
	/* Uninstall interrupt handler. */
648
	if (sc->irq != NULL) {
649
		bus_teardown_intr(dev, sc->irq, sc->sc_ih);
650
		bus_release_resource(dev, SYS_RES_IRQ, rman_get_rid(sc->irq),
651
		    sc->irq);
652
		pci_release_msi(dev);
653
	}
654
727
	if (sc->txq[0].data_dmat) {
655
	if (sc->txq[0].data_dmat) {
728
		for (ac = 0; ac < WME_NUM_AC; ac++)
656
		/* Free DMA resources. */
729
			wpi_free_tx_ring(sc, &sc->txq[ac]);
657
		for (qid = 0; qid < WPI_NTXQUEUES; qid++)
658
			wpi_free_tx_ring(sc, &sc->txq[qid]);
730
659
731
		wpi_free_tx_ring(sc, &sc->cmdq);
660
		wpi_free_rx_ring(sc);
732
		wpi_free_rx_ring(sc, &sc->rxq);
733
		wpi_free_shared(sc);
661
		wpi_free_shared(sc);
734
	}
662
	}
735
663
736
	if (sc->fw_fp != NULL) {
737
		wpi_unload_firmware(sc);
738
	}
739
740
	if (sc->fw_dma.tag)
664
	if (sc->fw_dma.tag)
741
		wpi_free_fwmem(sc);
665
		wpi_free_fwmem(sc);
742
	WPI_UNLOCK(sc);
666
		
743
744
	if (sc->irq != NULL)
745
		bus_release_resource(dev, SYS_RES_IRQ, rman_get_rid(sc->irq),
746
		    sc->irq);
747
	if (sc->mem != NULL)
667
	if (sc->mem != NULL)
748
		bus_release_resource(dev, SYS_RES_MEMORY,
668
		bus_release_resource(dev, SYS_RES_MEMORY,
749
		    rman_get_rid(sc->mem), sc->mem);
669
		    rman_get_rid(sc->mem), sc->mem);
Lines 751-898 Link Here
751
	if (ifp != NULL)
671
	if (ifp != NULL)
752
		if_free(ifp);
672
		if_free(ifp);
753
673
674
	delete_unrhdr(sc->sc_unr);
675
676
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END, __func__);
754
	WPI_LOCK_DESTROY(sc);
677
	WPI_LOCK_DESTROY(sc);
678
	return 0;
679
}
755
680
681
static int
682
wpi_shutdown(device_t dev)
683
{
684
	struct wpi_softc *sc = device_get_softc(dev);
685
686
	wpi_stop(sc);
756
	return 0;
687
	return 0;
757
}
688
}
758
689
759
static struct ieee80211vap *
690
static int
760
wpi_vap_create(struct ieee80211com *ic, const char name[IFNAMSIZ], int unit,
691
wpi_suspend(device_t dev)
761
    enum ieee80211_opmode opmode, int flags,
762
    const uint8_t bssid[IEEE80211_ADDR_LEN],
763
    const uint8_t mac[IEEE80211_ADDR_LEN])
764
{
692
{
765
	struct wpi_vap *wvp;
693
	struct wpi_softc *sc = device_get_softc(dev);
766
	struct ieee80211vap *vap;
694
	struct ieee80211com *ic = sc->sc_ifp->if_l2com;
767
695
768
	if (!TAILQ_EMPTY(&ic->ic_vaps))		/* only one at a time */
696
	ieee80211_suspend_all(ic);
769
		return NULL;
697
	return 0;
770
	wvp = (struct wpi_vap *) malloc(sizeof(struct wpi_vap),
698
}
771
	    M_80211_VAP, M_NOWAIT | M_ZERO);
772
	if (wvp == NULL)
773
		return NULL;
774
	vap = &wvp->vap;
775
	ieee80211_vap_setup(ic, vap, name, unit, opmode, flags, bssid, mac);
776
	/* override with driver methods */
777
	wvp->newstate = vap->iv_newstate;
778
	vap->iv_newstate = wpi_newstate;
779
699
780
	ieee80211_ratectl_init(vap);
700
static int
781
	/* complete setup */
701
wpi_resume(device_t dev)
782
	ieee80211_vap_attach(vap, ieee80211_media_change, ieee80211_media_status);
702
{
783
	ic->ic_opmode = opmode;
703
	struct wpi_softc *sc = device_get_softc(dev);
784
	return vap;
704
	struct ieee80211com *ic = sc->sc_ifp->if_l2com;
705
706
	/* Clear device-specific "PCI retry timeout" register (41h). */
707
	pci_write_config(dev, 0x41, 0, 1);
708
709
	ieee80211_resume_all(ic);
710
	return 0;
785
}
711
}
786
712
787
static void
713
/*
788
wpi_vap_delete(struct ieee80211vap *vap)
714
 * Grab exclusive access to NIC memory.
715
 */
716
static int
717
wpi_nic_lock(struct wpi_softc *sc)
789
{
718
{
790
	struct wpi_vap *wvp = WPI_VAP(vap);
719
	int ntries;
791
720
792
	ieee80211_ratectl_deinit(vap);
721
	/* Request exclusive access to NIC. */
793
	ieee80211_vap_detach(vap);
722
	WPI_SETBITS(sc, WPI_GP_CNTRL, WPI_GP_CNTRL_MAC_ACCESS_REQ);
794
	free(wvp, M_80211_VAP);
723
724
	/* Spin until we actually get the lock. */
725
	for (ntries = 0; ntries < 1000; ntries++) {
726
		if ((WPI_READ(sc, WPI_GP_CNTRL) &
727
		     (WPI_GP_CNTRL_MAC_ACCESS_ENA | WPI_GP_CNTRL_SLEEP)) ==
728
		    WPI_GP_CNTRL_MAC_ACCESS_ENA)
729
			return 0;
730
		DELAY(10);
731
	}
732
733
	device_printf(sc->sc_dev, "could not lock memory\n");
734
735
	return ETIMEDOUT;
795
}
736
}
796
737
738
/*
739
 * Release lock on NIC memory.
740
 */
741
static __inline void
742
wpi_nic_unlock(struct wpi_softc *sc)
743
{
744
	WPI_CLRBITS(sc, WPI_GP_CNTRL, WPI_GP_CNTRL_MAC_ACCESS_REQ);
745
}
746
747
static __inline uint32_t
748
wpi_prph_read(struct wpi_softc *sc, uint32_t addr)
749
{
750
	WPI_WRITE(sc, WPI_PRPH_RADDR, WPI_PRPH_DWORD | addr);
751
	WPI_BARRIER_READ_WRITE(sc);
752
	return WPI_READ(sc, WPI_PRPH_RDATA);
753
}
754
755
static __inline void
756
wpi_prph_write(struct wpi_softc *sc, uint32_t addr, uint32_t data)
757
{
758
	WPI_WRITE(sc, WPI_PRPH_WADDR, WPI_PRPH_DWORD | addr);
759
	WPI_BARRIER_WRITE(sc);
760
	WPI_WRITE(sc, WPI_PRPH_WDATA, data);
761
}
762
763
static __inline void
764
wpi_prph_setbits(struct wpi_softc *sc, uint32_t addr, uint32_t mask)
765
{
766
	wpi_prph_write(sc, addr, wpi_prph_read(sc, addr) | mask);
767
}
768
769
static __inline void
770
wpi_prph_clrbits(struct wpi_softc *sc, uint32_t addr, uint32_t mask)
771
{
772
	wpi_prph_write(sc, addr, wpi_prph_read(sc, addr) & ~mask);
773
}
774
775
static __inline void
776
wpi_prph_write_region_4(struct wpi_softc *sc, uint32_t addr,
777
    const uint32_t *data, int count)
778
{
779
	for (; count > 0; count--, data++, addr += 4)
780
		wpi_prph_write(sc, addr, *data);
781
}
782
783
static __inline uint32_t
784
wpi_mem_read(struct wpi_softc *sc, uint32_t addr)
785
{
786
	WPI_WRITE(sc, WPI_MEM_RADDR, addr);
787
	WPI_BARRIER_READ_WRITE(sc);
788
	return WPI_READ(sc, WPI_MEM_RDATA);
789
}
790
791
static __inline void
792
wpi_mem_read_region_4(struct wpi_softc *sc, uint32_t addr, uint32_t *data,
793
    int count)
794
{
795
	for (; count > 0; count--, addr += 4)
796
		*data++ = wpi_mem_read(sc, addr);
797
}
798
799
static int
800
wpi_read_prom_data(struct wpi_softc *sc, uint32_t addr, void *data, int count)
801
{
802
	uint8_t *out = data;
803
	uint32_t val;
804
	int error, ntries;
805
806
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_BEGIN, __func__);
807
808
	if ((error = wpi_nic_lock(sc)) != 0)
809
		return error;
810
811
	for (; count > 0; count -= 2, addr++) {
812
		WPI_WRITE(sc, WPI_EEPROM, addr << 2);
813
		for (ntries = 0; ntries < 10; ntries++) {
814
			val = WPI_READ(sc, WPI_EEPROM);
815
			if (val & WPI_EEPROM_READ_VALID)
816
				break;
817
			DELAY(5);
818
		}
819
		if (ntries == 10) {
820
			device_printf(sc->sc_dev,
821
			    "timeout reading ROM at 0x%x\n", addr);
822
			return ETIMEDOUT;
823
		}
824
		*out++= val >> 16;
825
		if (count > 1)
826
			*out ++= val >> 24;
827
	}
828
829
	wpi_nic_unlock(sc);
830
831
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END, __func__);
832
833
	return 0;
834
}
835
797
static void
836
static void
798
wpi_dma_map_addr(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
837
wpi_dma_map_addr(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
799
{
838
{
800
	if (error != 0)
839
	if (error != 0)
801
		return;
840
		return;
802
803
	KASSERT(nsegs == 1, ("too many DMA segments, %d should be 1", nsegs));
841
	KASSERT(nsegs == 1, ("too many DMA segments, %d should be 1", nsegs));
804
805
	*(bus_addr_t *)arg = segs[0].ds_addr;
842
	*(bus_addr_t *)arg = segs[0].ds_addr;
806
}
843
}
807
844
808
/*
845
/*
809
 * Allocates a contiguous block of dma memory of the requested size and
846
 * Allocates a contiguous block of dma memory of the requested size and
810
 * alignment. Due to limitations of the FreeBSD dma subsystem as of 20071217,
847
 * alignment.
811
 * allocations greater than 4096 may fail. Hence if the requested alignment is
812
 * greater we allocate 'alignment' size extra memory and shift the vaddr and
813
 * paddr after the dma load. This bypasses the problem at the cost of a little
814
 * more memory.
815
 */
848
 */
816
static int
849
static int
817
wpi_dma_contig_alloc(struct wpi_softc *sc, struct wpi_dma_info *dma,
850
wpi_dma_contig_alloc(struct wpi_softc *sc, struct wpi_dma_info *dma,
818
    void **kvap, bus_size_t size, bus_size_t alignment, int flags)
851
    void **kvap, bus_size_t size, bus_size_t alignment)
819
{
852
{
820
	int error;
853
	int error;
821
	bus_size_t align;
822
	bus_size_t reqsize;
823
854
824
	DPRINTFN(WPI_DEBUG_DMA,
855
	dma->tag = NULL;
825
	    ("Size: %zd - alignment %zd\n", size, alignment));
826
827
	dma->size = size;
856
	dma->size = size;
828
	dma->tag = NULL;
829
857
830
	if (alignment > 4096) {
858
	error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), alignment,
831
		align = PAGE_SIZE;
859
	    0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, size,
832
		reqsize = size + alignment;
860
	    1, size, BUS_DMA_NOWAIT, NULL, NULL, &dma->tag);
833
	} else {
861
	if (error != 0)
834
		align = alignment;
835
		reqsize = size;
836
	}
837
	error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), align,
838
	    0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR,
839
	    NULL, NULL, reqsize,
840
	    1, reqsize, flags,
841
	    NULL, NULL, &dma->tag);
842
	if (error != 0) {
843
		device_printf(sc->sc_dev,
844
		    "could not create shared page DMA tag\n");
845
		goto fail;
862
		goto fail;
846
	}
863
847
	error = bus_dmamem_alloc(dma->tag, (void **)&dma->vaddr_start,
864
	error = bus_dmamem_alloc(dma->tag, (void **)&dma->vaddr,
848
	    flags | BUS_DMA_ZERO, &dma->map);
865
	    BUS_DMA_NOWAIT | BUS_DMA_ZERO | BUS_DMA_COHERENT, &dma->map);
849
	if (error != 0) {
866
	if (error != 0)
850
		device_printf(sc->sc_dev,
851
		    "could not allocate shared page DMA memory\n");
852
		goto fail;
867
		goto fail;
853
	}
854
868
855
	error = bus_dmamap_load(dma->tag, dma->map, dma->vaddr_start,
869
	error = bus_dmamap_load(dma->tag, dma->map, dma->vaddr, size,
856
	    reqsize,  wpi_dma_map_addr, &dma->paddr_start, flags);
870
	    wpi_dma_map_addr, &dma->paddr, BUS_DMA_NOWAIT);
871
	if (error != 0)
872
		goto fail;
857
873
858
	/* Save the original pointers so we can free all the memory */
874
	bus_dmamap_sync(dma->tag, dma->map, BUS_DMASYNC_PREWRITE);
859
	dma->paddr = dma->paddr_start;
860
	dma->vaddr = dma->vaddr_start;
861
875
862
	/*
863
	 * Check the alignment and increment by 4096 until we get the
864
	 * requested alignment. Fail if can't obtain the alignment
865
	 * we requested.
866
	 */
867
	if ((dma->paddr & (alignment -1 )) != 0) {
868
		int i;
869
870
		for (i = 0; i < alignment / 4096; i++) {
871
			if ((dma->paddr & (alignment - 1 )) == 0)
872
				break;
873
			dma->paddr += 4096;
874
			dma->vaddr += 4096;
875
		}
876
		if (i == alignment / 4096) {
877
			device_printf(sc->sc_dev,
878
			    "alignment requirement was not satisfied\n");
879
			goto fail;
880
		}
881
	}
882
883
	if (error != 0) {
884
		device_printf(sc->sc_dev,
885
		    "could not load shared page DMA map\n");
886
		goto fail;
887
	}
888
889
	if (kvap != NULL)
876
	if (kvap != NULL)
890
		*kvap = dma->vaddr;
877
		*kvap = dma->vaddr;
891
878
892
	return 0;
879
	return 0;
893
880
894
fail:
881
fail:	wpi_dma_contig_free(dma);
895
	wpi_dma_contig_free(dma);
896
	return error;
882
	return error;
897
}
883
}
898
884
Lines 899-914 Link Here
899
static void
885
static void
900
wpi_dma_contig_free(struct wpi_dma_info *dma)
886
wpi_dma_contig_free(struct wpi_dma_info *dma)
901
{
887
{
902
	if (dma->tag) {
888
	if (dma->vaddr != NULL) {
903
		if (dma->vaddr_start != NULL) {
889
		bus_dmamap_sync(dma->tag, dma->map,
904
			if (dma->paddr_start != 0) {
890
		    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
905
				bus_dmamap_sync(dma->tag, dma->map,
891
		bus_dmamap_unload(dma->tag, dma->map);
906
				    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
892
		bus_dmamem_free(dma->tag, dma->vaddr, dma->map);
907
				bus_dmamap_unload(dma->tag, dma->map);
893
		dma->vaddr = NULL;
908
			}
894
	}
909
			bus_dmamem_free(dma->tag, dma->vaddr_start, dma->map);
895
	if (dma->tag != NULL) {
910
		}
911
		bus_dma_tag_destroy(dma->tag);
896
		bus_dma_tag_destroy(dma->tag);
897
		dma->tag = NULL;
912
	}
898
	}
913
}
899
}
914
900
Lines 918-936 Link Here
918
static int
904
static int
919
wpi_alloc_shared(struct wpi_softc *sc)
905
wpi_alloc_shared(struct wpi_softc *sc)
920
{
906
{
921
	int error;
907
	/* Shared buffer must be aligned on a 4KB boundary. */
922
908
	return wpi_dma_contig_alloc(sc, &sc->shared_dma,
923
	error = wpi_dma_contig_alloc(sc, &sc->shared_dma,
909
	    (void **)&sc->shared, sizeof (struct wpi_shared), 4096);
924
	    (void **)&sc->shared, sizeof (struct wpi_shared),
925
	    PAGE_SIZE,
926
	    BUS_DMA_NOWAIT);
927
928
	if (error != 0) {
929
		device_printf(sc->sc_dev,
930
		    "could not allocate shared area DMA memory\n");
931
	}
932
933
	return error;
934
}
910
}
935
911
936
static void
912
static void
Lines 939-1052 Link Here
939
	wpi_dma_contig_free(&sc->shared_dma);
915
	wpi_dma_contig_free(&sc->shared_dma);
940
}
916
}
941
917
918
/*
919
 * Allocate DMA-safe memory for firmware transfer.
920
 */
942
static int
921
static int
943
wpi_alloc_rx_ring(struct wpi_softc *sc, struct wpi_rx_ring *ring)
922
wpi_alloc_fwmem(struct wpi_softc *sc)
944
{
923
{
924
	/* Must be aligned on a 16-byte boundary. */
925
	return wpi_dma_contig_alloc(sc, &sc->fw_dma, NULL,
926
	    WPI_FW_TEXT_MAXSZ + WPI_FW_DATA_MAXSZ, 16);
927
}
945
928
929
static void
930
wpi_free_fwmem(struct wpi_softc *sc)
931
{
932
	wpi_dma_contig_free(&sc->fw_dma);
933
}
934
935
static int
936
wpi_alloc_rx_ring(struct wpi_softc *sc)
937
{
938
	struct wpi_rx_ring *ring = &sc->rxq;
939
	bus_size_t size;
946
	int i, error;
940
	int i, error;
947
941
948
	ring->cur = 0;
942
	ring->cur = 0;
943
	ring->update = 0;
949
944
945
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_BEGIN, __func__);
946
947
	/* Allocate RX descriptors (16KB aligned.) */
948
	size = WPI_RX_RING_COUNT * sizeof (uint32_t);
950
	error = wpi_dma_contig_alloc(sc, &ring->desc_dma,
949
	error = wpi_dma_contig_alloc(sc, &ring->desc_dma,
951
	    (void **)&ring->desc, WPI_RX_RING_COUNT * sizeof (uint32_t),
950
	    (void **)&ring->desc, size, WPI_RING_DMA_ALIGN);
952
	    WPI_RING_DMA_ALIGN, BUS_DMA_NOWAIT);
953
954
	if (error != 0) {
951
	if (error != 0) {
955
		device_printf(sc->sc_dev,
952
		device_printf(sc->sc_dev,
956
		    "%s: could not allocate rx ring DMA memory, error %d\n",
953
		    "%s: could not allocate RX ring DMA memory, error %d\n",
957
		    __func__, error);
954
		    __func__, error);
958
		goto fail;
955
		goto fail;
959
	}
956
	}
960
957
958
	/* Create RX buffer DMA tag. */
961
        error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0, 
959
        error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0, 
962
	    BUS_SPACE_MAXADDR_32BIT,
960
	    BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
963
            BUS_SPACE_MAXADDR, NULL, NULL, MJUMPAGESIZE, 1,
961
	    MJUMPAGESIZE, 1, MJUMPAGESIZE, BUS_DMA_NOWAIT, NULL, NULL,
964
            MJUMPAGESIZE, BUS_DMA_NOWAIT, NULL, NULL, &ring->data_dmat);
962
	    &ring->data_dmat);
965
        if (error != 0) {
963
        if (error != 0) {
966
                device_printf(sc->sc_dev,
964
                device_printf(sc->sc_dev,
967
		    "%s: bus_dma_tag_create_failed, error %d\n",
965
		    "%s: could not create RX buf DMA tag, error %d\n",
968
		    __func__, error);
966
		    __func__, error);
969
                goto fail;
967
                goto fail;
970
        }
968
        }
971
969
972
	/*
970
	/*
973
	 * Setup Rx buffers.
971
	 * Allocate and map RX buffers.
974
	 */
972
	 */
975
	for (i = 0; i < WPI_RX_RING_COUNT; i++) {
973
	for (i = 0; i < WPI_RX_RING_COUNT; i++) {
976
		struct wpi_rx_data *data = &ring->data[i];
974
		struct wpi_rx_data *data = &ring->data[i];
977
		struct mbuf *m;
978
		bus_addr_t paddr;
975
		bus_addr_t paddr;
979
976
980
		error = bus_dmamap_create(ring->data_dmat, 0, &data->map);
977
		error = bus_dmamap_create(ring->data_dmat, 0, &data->map);
981
		if (error != 0) {
978
		if (error != 0) {
982
			device_printf(sc->sc_dev,
979
			device_printf(sc->sc_dev,
983
			    "%s: bus_dmamap_create failed, error %d\n",
980
			    "%s: could not create RX buf DMA map, error %d\n",
984
			    __func__, error);
981
			    __func__, error);
985
			goto fail;
982
			goto fail;
986
		}
983
		}
987
		m = m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR, MJUMPAGESIZE);
984
988
		if (m == NULL) {
985
		data->m = m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR, MJUMPAGESIZE);
986
		if (data->m == NULL) {
989
			device_printf(sc->sc_dev,
987
			device_printf(sc->sc_dev,
990
			   "%s: could not allocate rx mbuf\n", __func__);
988
			    "%s: could not allocate RX mbuf\n", __func__);
991
			error = ENOMEM;
989
			error = ENOBUFS;
992
			goto fail;
990
			goto fail;
993
		}
991
		}
994
		/* map page */
992
995
		error = bus_dmamap_load(ring->data_dmat, data->map,
993
		error = bus_dmamap_load(ring->data_dmat, data->map,
996
		    mtod(m, caddr_t), MJUMPAGESIZE,
994
		    mtod(data->m, void *), MJUMPAGESIZE, wpi_dma_map_addr,
997
		    wpi_dma_map_addr, &paddr, BUS_DMA_NOWAIT);
995
		    &paddr, BUS_DMA_NOWAIT);
998
		if (error != 0 && error != EFBIG) {
996
		if (error != 0 && error != EFBIG) {
999
			device_printf(sc->sc_dev,
997
			device_printf(sc->sc_dev,
1000
			    "%s: bus_dmamap_load failed, error %d\n",
998
			    "%s: can't map mbuf (error %d)\n", __func__,
1001
			    __func__, error);
999
			    error);
1002
			m_freem(m);
1003
			error = ENOMEM;	/* XXX unique code */
1004
			goto fail;
1000
			goto fail;
1005
		}
1001
		}
1006
		bus_dmamap_sync(ring->data_dmat, data->map, 
1007
		    BUS_DMASYNC_PREWRITE);
1008
1002
1009
		data->m = m;
1003
		/* Set physical address of RX buffer. */
1010
		ring->desc[i] = htole32(paddr);
1004
		ring->desc[i] = htole32(paddr);
1011
	}
1005
	}
1006
1012
	bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map,
1007
	bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map,
1013
	    BUS_DMASYNC_PREWRITE);
1008
	    BUS_DMASYNC_PREWRITE);
1009
1010
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END, __func__);
1011
1014
	return 0;
1012
	return 0;
1015
fail:
1013
1016
	wpi_free_rx_ring(sc, ring);
1014
fail:	wpi_free_rx_ring(sc);
1015
1016
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END_ERR, __func__);
1017
1017
	return error;
1018
	return error;
1018
}
1019
}
1019
1020
1020
static void
1021
static void
1021
wpi_reset_rx_ring(struct wpi_softc *sc, struct wpi_rx_ring *ring)
1022
wpi_update_rx_ring(struct wpi_softc *sc)
1022
{
1023
{
1023
	int ntries;
1024
	struct wpi_rx_ring *ring = &sc->rxq;
1024
1025
1025
	wpi_mem_lock(sc);
1026
	if (WPI_READ(sc, WPI_UCODE_GP1) & WPI_UCODE_GP1_MAC_SLEEP) {
1027
		DPRINTF(sc, WPI_DEBUG_PWRSAVE, "%s: wakeup request\n",
1028
		    __func__);
1026
1029
1027
	WPI_WRITE(sc, WPI_RX_CONFIG, 0);
1030
		WPI_SETBITS(sc, WPI_GP_CNTRL, WPI_GP_CNTRL_MAC_ACCESS_REQ);
1031
		ring->update = 1;
1032
	} else
1033
		WPI_WRITE(sc, WPI_FH_RX_WPTR, ring->cur & ~7);
1034
}
1028
1035
1029
	for (ntries = 0; ntries < 100; ntries++) {
1036
static void
1030
		if (WPI_READ(sc, WPI_RX_STATUS) & WPI_RX_IDLE)
1037
wpi_reset_rx_ring(struct wpi_softc *sc)
1031
			break;
1038
{
1032
		DELAY(10);
1039
	struct wpi_rx_ring *ring = &sc->rxq;
1033
	}
1040
	int ntries;
1034
1041
1035
	wpi_mem_unlock(sc);
1042
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_DOING, __func__);
1036
1043
1044
	if (wpi_nic_lock(sc) == 0) {
1045
		WPI_WRITE(sc, WPI_FH_RX_CONFIG, 0);
1046
		for (ntries = 0; ntries < 1000; ntries++) {
1047
			if (WPI_READ(sc, WPI_FH_RX_STATUS) &
1048
			    WPI_FH_RX_STATUS_IDLE)
1049
				break;
1050
			DELAY(10);
1051
		}
1037
#ifdef WPI_DEBUG
1052
#ifdef WPI_DEBUG
1038
	if (ntries == 100 && wpi_debug > 0)
1053
		if (ntries == 1000) {
1039
		device_printf(sc->sc_dev, "timeout resetting Rx ring\n");
1054
			device_printf(sc->sc_dev,
1055
			    "timeout resetting Rx ring\n");
1056
		}
1040
#endif
1057
#endif
1058
		wpi_nic_unlock(sc);
1059
	}
1041
1060
1042
	ring->cur = 0;
1061
	ring->cur = 0;
1062
	ring->update = 0;
1043
}
1063
}
1044
1064
1045
static void
1065
static void
1046
wpi_free_rx_ring(struct wpi_softc *sc, struct wpi_rx_ring *ring)
1066
wpi_free_rx_ring(struct wpi_softc *sc)
1047
{
1067
{
1068
	struct wpi_rx_ring *ring = &sc->rxq;
1048
	int i;
1069
	int i;
1049
1070
1071
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_DOING, __func__);
1072
1050
	wpi_dma_contig_free(&ring->desc_dma);
1073
	wpi_dma_contig_free(&ring->desc_dma);
1051
1074
1052
	for (i = 0; i < WPI_RX_RING_COUNT; i++) {
1075
	for (i = 0; i < WPI_RX_RING_COUNT; i++) {
Lines 1057-1238 Link Here
1057
			    BUS_DMASYNC_POSTREAD);
1080
			    BUS_DMASYNC_POSTREAD);
1058
			bus_dmamap_unload(ring->data_dmat, data->map);
1081
			bus_dmamap_unload(ring->data_dmat, data->map);
1059
			m_freem(data->m);
1082
			m_freem(data->m);
1083
			data->m = NULL;
1060
		}
1084
		}
1061
		if (data->map != NULL)
1085
		if (data->map != NULL)
1062
			bus_dmamap_destroy(ring->data_dmat, data->map);
1086
			bus_dmamap_destroy(ring->data_dmat, data->map);
1063
	}
1087
	}
1088
	if (ring->data_dmat != NULL) {
1089
		bus_dma_tag_destroy(ring->data_dmat);
1090
		ring->data_dmat = NULL;
1091
	}
1064
}
1092
}
1065
1093
1066
static int
1094
static int
1067
wpi_alloc_tx_ring(struct wpi_softc *sc, struct wpi_tx_ring *ring, int count,
1095
wpi_alloc_tx_ring(struct wpi_softc *sc, struct wpi_tx_ring *ring, int qid)
1068
	int qid)
1069
{
1096
{
1070
	struct wpi_tx_data *data;
1097
	bus_addr_t paddr;
1098
	bus_size_t size;
1071
	int i, error;
1099
	int i, error;
1072
1100
1073
	ring->qid = qid;
1101
	ring->qid = qid;
1074
	ring->count = count;
1075
	ring->queued = 0;
1102
	ring->queued = 0;
1076
	ring->cur = 0;
1103
	ring->cur = 0;
1077
	ring->data = NULL;
1104
	ring->update = 0;
1078
1105
1079
	error = wpi_dma_contig_alloc(sc, &ring->desc_dma,
1106
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_BEGIN, __func__);
1080
		(void **)&ring->desc, count * sizeof (struct wpi_tx_desc),
1081
		WPI_RING_DMA_ALIGN, BUS_DMA_NOWAIT);
1082
1107
1108
	/* Allocate TX descriptors (16KB aligned.) */
1109
	size = WPI_TX_RING_COUNT * sizeof (struct wpi_tx_desc);
1110
	error = wpi_dma_contig_alloc(sc, &ring->desc_dma, (void **)&ring->desc,
1111
	    size, WPI_RING_DMA_ALIGN);
1083
	if (error != 0) {
1112
	if (error != 0) {
1084
	    device_printf(sc->sc_dev, "could not allocate tx dma memory\n");
1113
		device_printf(sc->sc_dev,
1085
	    goto fail;
1114
		    "%s: could not allocate TX ring DMA memory, error %d\n",
1115
		    __func__, error);
1116
		goto fail;
1086
	}
1117
	}
1087
1118
1088
	/* update shared page with ring's base address */
1119
	/* Update shared area with ring physical address. */
1089
	sc->shared->txbase[qid] = htole32(ring->desc_dma.paddr);
1120
	sc->shared->txbase[qid] = htole32(ring->desc_dma.paddr);
1121
	bus_dmamap_sync(sc->shared_dma.tag, sc->shared_dma.map,
1122
	    BUS_DMASYNC_PREWRITE);
1090
1123
1124
	/*
1125
	 * We only use rings 0 through 4 (4 EDCA + cmd) so there is no need
1126
	 * to allocate commands space for other rings.
1127
	 * XXX Do we really need to allocate descriptors for other rings?
1128
	 */
1129
	if (qid > 4)
1130
		return 0;
1131
1132
	size = WPI_TX_RING_COUNT * sizeof (struct wpi_tx_cmd);
1091
	error = wpi_dma_contig_alloc(sc, &ring->cmd_dma, (void **)&ring->cmd,
1133
	error = wpi_dma_contig_alloc(sc, &ring->cmd_dma, (void **)&ring->cmd,
1092
		count * sizeof (struct wpi_tx_cmd), WPI_RING_DMA_ALIGN,
1134
	    size, 4);
1093
		BUS_DMA_NOWAIT);
1094
1095
	if (error != 0) {
1135
	if (error != 0) {
1096
		device_printf(sc->sc_dev,
1136
		device_printf(sc->sc_dev,
1097
		    "could not allocate tx command DMA memory\n");
1137
		    "%s: could not allocate TX cmd DMA memory, error %d\n",
1138
		    __func__, error);
1098
		goto fail;
1139
		goto fail;
1099
	}
1140
	}
1100
1141
1101
	ring->data = malloc(count * sizeof (struct wpi_tx_data), M_DEVBUF,
1102
	    M_NOWAIT | M_ZERO);
1103
	if (ring->data == NULL) {
1104
		device_printf(sc->sc_dev,
1105
		    "could not allocate tx data slots\n");
1106
		goto fail;
1107
	}
1108
1109
	error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0,
1142
	error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0,
1110
	    BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, MCLBYTES,
1143
	    BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, MCLBYTES,
1111
	    WPI_MAX_SCATTER - 1, MCLBYTES, BUS_DMA_NOWAIT, NULL, NULL,
1144
	    WPI_MAX_SCATTER - 1, MCLBYTES, BUS_DMA_NOWAIT, NULL, NULL,
1112
	    &ring->data_dmat);
1145
	    &ring->data_dmat);
1113
	if (error != 0) {
1146
	if (error != 0) {
1114
		device_printf(sc->sc_dev, "could not create data DMA tag\n");
1147
		device_printf(sc->sc_dev,
1148
		    "%s: could not create TX buf DMA tag, error %d\n",
1149
		    __func__, error);
1115
		goto fail;
1150
		goto fail;
1116
	}
1151
	}
1117
1152
1118
	for (i = 0; i < count; i++) {
1153
	paddr = ring->cmd_dma.paddr;
1119
		data = &ring->data[i];
1154
	for (i = 0; i < WPI_TX_RING_COUNT; i++) {
1155
		struct wpi_tx_data *data = &ring->data[i];
1120
1156
1157
		data->cmd_paddr = paddr;
1158
		paddr += sizeof (struct wpi_tx_cmd);
1159
1121
		error = bus_dmamap_create(ring->data_dmat, 0, &data->map);
1160
		error = bus_dmamap_create(ring->data_dmat, 0, &data->map);
1122
		if (error != 0) {
1161
		if (error != 0) {
1123
			device_printf(sc->sc_dev,
1162
			device_printf(sc->sc_dev,
1124
			    "could not create tx buf DMA map\n");
1163
			    "%s: could not create TX buf DMA map, error %d\n",
1164
			    __func__, error);
1125
			goto fail;
1165
			goto fail;
1126
		}
1166
		}
1127
		bus_dmamap_sync(ring->data_dmat, data->map,
1128
		    BUS_DMASYNC_PREWRITE);
1129
	}
1167
	}
1130
1168
1169
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END, __func__);
1170
1131
	return 0;
1171
	return 0;
1132
1172
1133
fail:
1173
fail:	wpi_free_tx_ring(sc, ring);
1134
	wpi_free_tx_ring(sc, ring);
1174
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END_ERR, __func__);
1135
	return error;
1175
	return error;
1136
}
1176
}
1137
1177
1138
static void
1178
static void
1179
wpi_update_tx_ring(struct wpi_softc *sc, struct wpi_tx_ring *ring)
1180
{
1181
	if (WPI_READ(sc, WPI_UCODE_GP1) & WPI_UCODE_GP1_MAC_SLEEP) {
1182
		DPRINTF(sc, WPI_DEBUG_PWRSAVE, "%s (%d): requesting wakeup\n",
1183
		    __func__, ring->qid);
1184
1185
		WPI_SETBITS(sc, WPI_GP_CNTRL, WPI_GP_CNTRL_MAC_ACCESS_REQ);
1186
		ring->update = 1;
1187
	} else
1188
		WPI_WRITE(sc, WPI_HBUS_TARG_WRPTR, ring->qid << 8 | ring->cur);
1189
}
1190
1191
static void
1139
wpi_reset_tx_ring(struct wpi_softc *sc, struct wpi_tx_ring *ring)
1192
wpi_reset_tx_ring(struct wpi_softc *sc, struct wpi_tx_ring *ring)
1140
{
1193
{
1141
	struct wpi_tx_data *data;
1194
	int i;
1142
	int i, ntries;
1143
1195
1144
	wpi_mem_lock(sc);
1196
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_DOING, __func__);
1145
1197
1146
	WPI_WRITE(sc, WPI_TX_CONFIG(ring->qid), 0);
1198
	for (i = 0; i < WPI_TX_RING_COUNT; i++) {
1147
	for (ntries = 0; ntries < 100; ntries++) {
1199
		struct wpi_tx_data *data = &ring->data[i];
1148
		if (WPI_READ(sc, WPI_TX_STATUS) & WPI_TX_IDLE(ring->qid))
1149
			break;
1150
		DELAY(10);
1151
	}
1152
#ifdef WPI_DEBUG
1153
	if (ntries == 100 && wpi_debug > 0)
1154
		device_printf(sc->sc_dev, "timeout resetting Tx ring %d\n",
1155
		    ring->qid);
1156
#endif
1157
	wpi_mem_unlock(sc);
1158
1200
1159
	for (i = 0; i < ring->count; i++) {
1160
		data = &ring->data[i];
1161
1162
		if (data->m != NULL) {
1201
		if (data->m != NULL) {
1202
			bus_dmamap_sync(ring->data_dmat, data->map,
1203
			    BUS_DMASYNC_POSTWRITE);
1163
			bus_dmamap_unload(ring->data_dmat, data->map);
1204
			bus_dmamap_unload(ring->data_dmat, data->map);
1164
			m_freem(data->m);
1205
			m_freem(data->m);
1165
			data->m = NULL;
1206
			data->m = NULL;
1166
		}
1207
		}
1167
	}
1208
	}
1168
1209
	/* Clear TX descriptors. */
1210
	memset(ring->desc, 0, ring->desc_dma.size);
1211
	bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map,
1212
	    BUS_DMASYNC_PREWRITE);
1213
	sc->qfullmsk &= ~(1 << ring->qid);
1169
	ring->queued = 0;
1214
	ring->queued = 0;
1170
	ring->cur = 0;
1215
	ring->cur = 0;
1216
	ring->update = 0;
1171
}
1217
}
1172
1218
1173
static void
1219
static void
1174
wpi_free_tx_ring(struct wpi_softc *sc, struct wpi_tx_ring *ring)
1220
wpi_free_tx_ring(struct wpi_softc *sc, struct wpi_tx_ring *ring)
1175
{
1221
{
1176
	struct wpi_tx_data *data;
1177
	int i;
1222
	int i;
1178
1223
1224
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_DOING, __func__);
1225
1179
	wpi_dma_contig_free(&ring->desc_dma);
1226
	wpi_dma_contig_free(&ring->desc_dma);
1180
	wpi_dma_contig_free(&ring->cmd_dma);
1227
	wpi_dma_contig_free(&ring->cmd_dma);
1181
1228
1182
	if (ring->data != NULL) {
1229
	for (i = 0; i < WPI_TX_RING_COUNT; i++) {
1183
		for (i = 0; i < ring->count; i++) {
1230
		struct wpi_tx_data *data = &ring->data[i];
1184
			data = &ring->data[i];
1185
1231
1186
			if (data->m != NULL) {
1232
		if (data->m != NULL) {
1187
				bus_dmamap_sync(ring->data_dmat, data->map,
1233
			bus_dmamap_sync(ring->data_dmat, data->map,
1188
				    BUS_DMASYNC_POSTWRITE);
1234
			    BUS_DMASYNC_POSTWRITE);
1189
				bus_dmamap_unload(ring->data_dmat, data->map);
1235
			bus_dmamap_unload(ring->data_dmat, data->map);
1190
				m_freem(data->m);
1236
			m_freem(data->m);
1191
				data->m = NULL;
1192
			}
1193
		}
1237
		}
1194
		free(ring->data, M_DEVBUF);
1238
		if (data->map != NULL)
1239
			bus_dmamap_destroy(ring->data_dmat, data->map);
1195
	}
1240
	}
1196
1241
	if (ring->data_dmat != NULL) {
1197
	if (ring->data_dmat != NULL)
1198
		bus_dma_tag_destroy(ring->data_dmat);
1242
		bus_dma_tag_destroy(ring->data_dmat);
1243
		ring->data_dmat = NULL;
1244
	}
1199
}
1245
}
1200
1246
1247
/*
1248
 * Extract various information from EEPROM.
1249
 */
1201
static int
1250
static int
1202
wpi_shutdown(device_t dev)
1251
wpi_read_eeprom(struct wpi_softc *sc, uint8_t macaddr[IEEE80211_ADDR_LEN])
1203
{
1252
{
1204
	struct wpi_softc *sc = device_get_softc(dev);
1253
#define WPI_CHK(res) do {		\
1254
	if ((error = res) != 0)		\
1255
		goto fail;		\
1256
} while (0)
1257
	int error, i;
1205
1258
1206
	WPI_LOCK(sc);
1259
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_BEGIN, __func__);
1207
	wpi_stop_locked(sc);
1208
	wpi_unload_firmware(sc);
1209
	WPI_UNLOCK(sc);
1210
1260
1261
	/* Adapter has to be powered on for EEPROM access to work. */
1262
	if ((error = wpi_apm_init(sc)) != 0) {
1263
		device_printf(sc->sc_dev,
1264
		    "%s: could not power ON adapter, error %d\n", __func__,
1265
		    error);
1266
		return error;
1267
	}
1268
1269
	if ((WPI_READ(sc, WPI_EEPROM_GP) & 0x6) == 0) {
1270
		device_printf(sc->sc_dev, "bad EEPROM signature\n");
1271
		error = EIO;
1272
		goto fail;
1273
	}
1274
	/* Clear HW ownership of EEPROM. */
1275
	WPI_CLRBITS(sc, WPI_EEPROM_GP, WPI_EEPROM_GP_IF_OWNER);
1276
1277
	/* Read the hardware capabilities, revision and SKU type. */
1278
	WPI_CHK(wpi_read_prom_data(sc, WPI_EEPROM_SKU_CAP, &sc->cap,
1279
	    sizeof(sc->cap)));
1280
	WPI_CHK(wpi_read_prom_data(sc, WPI_EEPROM_REVISION, &sc->rev,
1281
	    sizeof(sc->rev)));
1282
	WPI_CHK(wpi_read_prom_data(sc, WPI_EEPROM_TYPE, &sc->type,
1283
	    sizeof(sc->type)));
1284
1285
	DPRINTF(sc, WPI_DEBUG_EEPROM, "cap=%x rev=%x type=%x\n", sc->cap, le16toh(sc->rev),
1286
	    sc->type);
1287
1288
	/* Read the regulatory domain (4 ASCII characters.) */
1289
	WPI_CHK(wpi_read_prom_data(sc, WPI_EEPROM_DOMAIN, sc->domain,
1290
	    sizeof(sc->domain)));
1291
1292
	/* Read MAC address. */
1293
	WPI_CHK(wpi_read_prom_data(sc, WPI_EEPROM_MAC, macaddr,
1294
	    IEEE80211_ADDR_LEN));
1295
1296
	/* Read the list of authorized channels. */
1297
	for (i = 0; i < WPI_CHAN_BANDS_COUNT; i++)
1298
		WPI_CHK(wpi_read_eeprom_channels(sc, i));
1299
1300
	/* Read the list of TX power groups. */
1301
	for (i = 0; i < WPI_POWER_GROUPS_COUNT; i++)
1302
		WPI_CHK(wpi_read_eeprom_group(sc, i));
1303
1304
fail:	wpi_apm_stop(sc);	/* Power OFF adapter. */
1305
1306
	DPRINTF(sc, WPI_DEBUG_TRACE, error ? TRACE_STR_END_ERR : TRACE_STR_END,
1307
	    __func__);
1308
1309
	return error;
1310
#undef WPI_CHK
1311
}
1312
1313
/*
1314
 * Translate EEPROM flags to net80211.
1315
 */
1316
static uint32_t
1317
wpi_eeprom_channel_flags(struct wpi_eeprom_chan *channel)
1318
{
1319
	uint32_t nflags;
1320
1321
	nflags = 0;
1322
	if ((channel->flags & WPI_EEPROM_CHAN_ACTIVE) == 0)
1323
		nflags |= IEEE80211_CHAN_PASSIVE;
1324
	if ((channel->flags & WPI_EEPROM_CHAN_IBSS) == 0)
1325
		nflags |= IEEE80211_CHAN_NOADHOC;
1326
	if (channel->flags & WPI_EEPROM_CHAN_RADAR) {
1327
		nflags |= IEEE80211_CHAN_DFS;
1328
		/* XXX apparently IBSS may still be marked */
1329
		nflags |= IEEE80211_CHAN_NOADHOC;
1330
	}
1331
1332
	return nflags;
1333
}
1334
1335
static void
1336
wpi_read_eeprom_band(struct wpi_softc *sc, int n)
1337
{
1338
	struct ifnet *ifp = sc->sc_ifp;
1339
	struct ieee80211com *ic = ifp->if_l2com;
1340
	struct wpi_eeprom_chan *channels = sc->eeprom_channels[n];
1341
	const struct wpi_chan_band *band = &wpi_bands[n];
1342
	struct ieee80211_channel *c;
1343
	uint8_t chan;
1344
	int i, nflags;
1345
1346
	for (i = 0; i < band->nchan; i++) {
1347
		if (!(channels[i].flags & WPI_EEPROM_CHAN_VALID)) {
1348
			DPRINTF(sc, WPI_DEBUG_HW,
1349
			    "Channel Not Valid: %d, band %d\n",
1350
			     band->chan[i],n);
1351
			continue;
1352
		}
1353
1354
		chan = band->chan[i];
1355
		nflags = wpi_eeprom_channel_flags(&channels[i]);
1356
1357
		c = &ic->ic_channels[ic->ic_nchans++];
1358
		c->ic_ieee = chan;
1359
		c->ic_maxregpower = channels[i].maxpwr;
1360
		c->ic_maxpower = 2*c->ic_maxregpower;
1361
1362
		if (n == 0) {	/* 2GHz band */
1363
			c->ic_freq = ieee80211_ieee2mhz(chan, IEEE80211_CHAN_G);
1364
			/* G =>'s B is supported */
1365
			c->ic_flags = IEEE80211_CHAN_B | nflags;
1366
			c = &ic->ic_channels[ic->ic_nchans++];
1367
			c[0] = c[-1];
1368
			c->ic_flags = IEEE80211_CHAN_G | nflags;
1369
		} else {	/* 5GHz band */
1370
			c->ic_freq = ieee80211_ieee2mhz(chan, IEEE80211_CHAN_A);
1371
			c->ic_flags = IEEE80211_CHAN_A | nflags;
1372
		}
1373
1374
		/* Save maximum allowed TX power for this channel. */
1375
		sc->maxpwr[chan] = channels[i].maxpwr;
1376
1377
		DPRINTF(sc, WPI_DEBUG_EEPROM,
1378
		    "adding chan %d (%dMHz) flags=0x%x maxpwr=%d passive=%d,"
1379
		    " offset %d\n", chan, c->ic_freq,
1380
		    channels[i].flags, sc->maxpwr[chan],
1381
		    (c->ic_flags & IEEE80211_CHAN_PASSIVE) != 0,
1382
		    ic->ic_nchans);
1383
	}
1384
}
1385
1386
/**
1387
 * Read the eeprom to find out what channels are valid for the given
1388
 * band and update net80211 with what we find.
1389
 */
1390
static int
1391
wpi_read_eeprom_channels(struct wpi_softc *sc, int n)
1392
{
1393
	struct ifnet *ifp = sc->sc_ifp;
1394
	struct ieee80211com *ic = ifp->if_l2com;
1395
	const struct wpi_chan_band *band = &wpi_bands[n];
1396
	int error;
1397
1398
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_BEGIN, __func__);
1399
1400
	error = wpi_read_prom_data(sc, band->addr, &sc->eeprom_channels[n],
1401
	    band->nchan * sizeof (struct wpi_eeprom_chan));
1402
	if (error != 0) {
1403
		DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END_ERR, __func__);
1404
		return error;
1405
	}
1406
1407
	wpi_read_eeprom_band(sc, n);
1408
1409
	ieee80211_sort_channels(ic->ic_channels, ic->ic_nchans);
1410
1411
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END, __func__);
1412
1211
	return 0;
1413
	return 0;
1212
}
1414
}
1213
1415
1416
static struct wpi_eeprom_chan *
1417
wpi_find_eeprom_channel(struct wpi_softc *sc, struct ieee80211_channel *c)
1418
{
1419
	int i, j;
1420
1421
	for (j = 0; j < WPI_CHAN_BANDS_COUNT; j++)
1422
		for (i = 0; i < wpi_bands[j].nchan; i++)
1423
			if (wpi_bands[j].chan[i] == c->ic_ieee)
1424
				return &sc->eeprom_channels[j][i];
1425
1426
	return NULL;
1427
}
1428
1429
/*
1430
 * Enforce flags read from EEPROM.
1431
 */
1214
static int
1432
static int
1215
wpi_suspend(device_t dev)
1433
wpi_setregdomain(struct ieee80211com *ic, struct ieee80211_regdomain *rd,
1434
    int nchan, struct ieee80211_channel chans[])
1216
{
1435
{
1217
	struct wpi_softc *sc = device_get_softc(dev);
1436
	struct ifnet *ifp = ic->ic_ifp;
1218
	struct ieee80211com *ic = sc->sc_ifp->if_l2com;
1437
	struct wpi_softc *sc = ifp->if_softc;
1438
	int i;
1219
1439
1220
	ieee80211_suspend_all(ic);
1440
	for (i = 0; i < nchan; i++) {
1441
		struct ieee80211_channel *c = &chans[i];
1442
		struct wpi_eeprom_chan *channel;
1443
1444
		channel = wpi_find_eeprom_channel(sc, c);
1445
		if (channel == NULL) {
1446
			if_printf(ic->ic_ifp,
1447
			    "%s: invalid channel %u freq %u/0x%x\n",
1448
			    __func__, c->ic_ieee, c->ic_freq, c->ic_flags);
1449
			return EINVAL;
1450
		}
1451
		c->ic_flags |= wpi_eeprom_channel_flags(channel);
1452
	}
1453
1221
	return 0;
1454
	return 0;
1222
}
1455
}
1223
1456
1224
static int
1457
static int
1225
wpi_resume(device_t dev)
1458
wpi_read_eeprom_group(struct wpi_softc *sc, int n)
1226
{
1459
{
1227
	struct wpi_softc *sc = device_get_softc(dev);
1460
	struct wpi_power_group *group = &sc->groups[n];
1228
	struct ieee80211com *ic = sc->sc_ifp->if_l2com;
1461
	struct wpi_eeprom_group rgroup;
1462
	int i, error;
1229
1463
1230
	pci_write_config(dev, 0x41, 0, 1);
1464
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_BEGIN, __func__);
1231
1465
1232
	ieee80211_resume_all(ic);
1466
	if ((error = wpi_read_prom_data(sc, WPI_EEPROM_POWER_GRP + n * 32,
1467
	    &rgroup, sizeof rgroup)) != 0) {
1468
		DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END_ERR, __func__);
1469
		return error;
1470
	}
1471
1472
	/* Save TX power group information. */
1473
	group->chan   = rgroup.chan;
1474
	group->maxpwr = rgroup.maxpwr;
1475
	/* Retrieve temperature at which the samples were taken. */
1476
	group->temp   = (int16_t)le16toh(rgroup.temp);
1477
1478
	DPRINTF(sc, WPI_DEBUG_EEPROM,
1479
	    "power group %d: chan=%d maxpwr=%d temp=%d\n", n, group->chan,
1480
	    group->maxpwr, group->temp);
1481
1482
	for (i = 0; i < WPI_SAMPLES_COUNT; i++) {
1483
		group->samples[i].index = rgroup.samples[i].index;
1484
		group->samples[i].power = rgroup.samples[i].power;
1485
1486
		DPRINTF(sc, WPI_DEBUG_EEPROM,
1487
		    "\tsample %d: index=%d power=%d\n", i,
1488
		    group->samples[i].index, group->samples[i].power);
1489
	}
1490
1491
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END, __func__);
1492
1233
	return 0;
1493
	return 0;
1234
}
1494
}
1235
1495
1496
static struct ieee80211_node *
1497
wpi_node_alloc(struct ieee80211vap *vap, const uint8_t mac[IEEE80211_ADDR_LEN])
1498
{
1499
	struct wpi_node *wn;
1500
1501
	wn = malloc(sizeof (struct wpi_node), M_80211_NODE,
1502
	    M_NOWAIT | M_ZERO);
1503
1504
	if (wn == NULL)
1505
		return NULL;
1506
1507
	wn->id = WPI_ID_UNDEFINED;
1508
1509
	return &wn->ni;
1510
}
1511
1512
static void
1513
wpi_node_free(struct ieee80211_node *ni)
1514
{
1515
	struct ieee80211com *ic = ni->ni_ic;
1516
	struct wpi_softc *sc = ic->ic_ifp->if_softc;
1517
	struct wpi_node *wn = (struct wpi_node *)ni;
1518
1519
	if (wn->id >= WPI_ID_IBSS_MIN && wn->id <= WPI_ID_IBSS_MAX) {
1520
		free_unr(sc->sc_unr, wn->id);
1521
1522
		WPI_LOCK(sc);
1523
		if (sc->rxon.filter & htole32(WPI_FILTER_BSS))
1524
			wpi_del_node(sc, ni);
1525
		WPI_UNLOCK(sc);
1526
	}
1527
1528
	sc->sc_node_free(ni);
1529
}
1530
1236
/**
1531
/**
1237
 * Called by net80211 when ever there is a change to 80211 state machine
1532
 * Called by net80211 when ever there is a change to 80211 state machine
1238
 */
1533
 */
Lines 1243-1465 Link Here
1243
	struct ieee80211com *ic = vap->iv_ic;
1538
	struct ieee80211com *ic = vap->iv_ic;
1244
	struct ifnet *ifp = ic->ic_ifp;
1539
	struct ifnet *ifp = ic->ic_ifp;
1245
	struct wpi_softc *sc = ifp->if_softc;
1540
	struct wpi_softc *sc = ifp->if_softc;
1246
	int error;
1541
	int error = 0;
1247
1542
1248
	DPRINTF(("%s: %s -> %s flags 0x%x\n", __func__,
1543
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_BEGIN, __func__);
1544
1545
	DPRINTF(sc, WPI_DEBUG_STATE, "%s: %s -> %s\n", __func__,
1249
		ieee80211_state_name[vap->iv_state],
1546
		ieee80211_state_name[vap->iv_state],
1250
		ieee80211_state_name[nstate], sc->flags));
1547
		ieee80211_state_name[nstate]);
1251
1548
1252
	IEEE80211_UNLOCK(ic);
1549
	IEEE80211_UNLOCK(ic);
1253
	WPI_LOCK(sc);
1550
	WPI_LOCK(sc);
1254
	if (nstate == IEEE80211_S_SCAN && vap->iv_state != IEEE80211_S_INIT) {
1551
	switch (nstate) {
1255
		/*
1552
	case IEEE80211_S_SCAN:
1256
		 * On !INIT -> SCAN transitions, we need to clear any possible
1553
		if ((vap->iv_opmode == IEEE80211_M_IBSS ||
1257
		 * knowledge about associations.
1554
		    vap->iv_opmode == IEEE80211_M_AHDEMO) &&
1258
		 */
1555
		    (sc->rxon.filter & htole32(WPI_FILTER_BSS))) {
1259
		error = wpi_config(sc);
1556
			sc->rxon.filter &= ~htole32(WPI_FILTER_BSS);
1260
		if (error != 0) {
1557
			if ((error = wpi_send_rxon(sc, 0, 1)) != 0) {
1261
			device_printf(sc->sc_dev,
1558
				device_printf(sc->sc_dev,
1262
			    "%s: device config failed, error %d\n",
1559
				    "%s: could not send RXON\n", __func__);
1263
			    __func__, error);
1560
			}
1264
		}
1561
		}
1265
	}
1562
		break;
1266
	if (nstate == IEEE80211_S_AUTH ||
1563
1267
	    (nstate == IEEE80211_S_ASSOC && vap->iv_state == IEEE80211_S_RUN)) {
1564
	case IEEE80211_S_ASSOC:
1565
		if (vap->iv_state != IEEE80211_S_RUN)
1566
			break;
1567
		/* FALLTHROUGH */
1568
	case IEEE80211_S_AUTH:
1268
		/*
1569
		/*
1269
		 * The node must be registered in the firmware before auth.
1570
		 * The node must be registered in the firmware before auth.
1270
		 * Also the associd must be cleared on RUN -> ASSOC
1571
		 * Also the associd must be cleared on RUN -> ASSOC
1271
		 * transitions.
1572
		 * transitions.
1272
		 */
1573
		 */
1273
		error = wpi_auth(sc, vap);
1574
		if ((error = wpi_auth(sc, vap)) != 0) {
1274
		if (error != 0) {
1275
			device_printf(sc->sc_dev,
1575
			device_printf(sc->sc_dev,
1276
			    "%s: could not move to auth state, error %d\n",
1576
			    "%s: could not move to AUTH state, error %d\n",
1277
			    __func__, error);
1577
			    __func__, error);
1278
		}
1578
		}
1279
	}
1579
		break;
1280
	if (nstate == IEEE80211_S_RUN && vap->iv_state != IEEE80211_S_RUN) {
1580
1281
		error = wpi_run(sc, vap);
1581
	case IEEE80211_S_RUN:
1282
		if (error != 0) {
1582
		/*
1583
		 * RUN -> RUN transition; Just restart the timers.
1584
		 */
1585
		if (vap->iv_state == IEEE80211_S_RUN) {
1586
			wpi_calib_timeout(sc);
1587
			break;
1588
		}
1589
1590
		/*
1591
		 * !RUN -> RUN requires setting the association id
1592
		 * which is done with a firmware cmd.  We also defer
1593
		 * starting the timers until that work is done.
1594
		 */
1595
		if ((error = wpi_run(sc, vap)) != 0) {
1283
			device_printf(sc->sc_dev,
1596
			device_printf(sc->sc_dev,
1284
			    "%s: could not move to run state, error %d\n",
1597
			    "%s: could not move to RUN state\n", __func__);
1285
			    __func__, error);
1286
		}
1598
		}
1599
		break;
1600
1601
	default:
1602
		break;
1287
	}
1603
	}
1288
	if (nstate == IEEE80211_S_RUN) {
1289
		/* RUN -> RUN transition; just restart the timers */
1290
		wpi_calib_timeout(sc);
1291
		/* XXX split out rate control timer */
1292
	}
1293
	WPI_UNLOCK(sc);
1604
	WPI_UNLOCK(sc);
1294
	IEEE80211_LOCK(ic);
1605
	IEEE80211_LOCK(ic);
1295
	return wvp->newstate(vap, nstate, arg);
1606
	if (error != 0) {
1296
}
1607
		DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END_ERR, __func__);
1608
		return error;
1609
	}
1297
1610
1298
/*
1611
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END, __func__);
1299
 * Grab exclusive access to NIC memory.
1300
 */
1301
static void
1302
wpi_mem_lock(struct wpi_softc *sc)
1303
{
1304
	int ntries;
1305
	uint32_t tmp;
1306
1612
1307
	tmp = WPI_READ(sc, WPI_GPIO_CTL);
1613
	return wvp->newstate(vap, nstate, arg);
1308
	WPI_WRITE(sc, WPI_GPIO_CTL, tmp | WPI_GPIO_MAC);
1309
1310
	/* spin until we actually get the lock */
1311
	for (ntries = 0; ntries < 100; ntries++) {
1312
		if ((WPI_READ(sc, WPI_GPIO_CTL) &
1313
			(WPI_GPIO_CLOCK | WPI_GPIO_SLEEP)) == WPI_GPIO_CLOCK)
1314
			break;
1315
		DELAY(10);
1316
	}
1317
	if (ntries == 100)
1318
		device_printf(sc->sc_dev, "could not lock memory\n");
1319
}
1614
}
1320
1615
1321
/*
1322
 * Release lock on NIC memory.
1323
 */
1324
static void
1616
static void
1325
wpi_mem_unlock(struct wpi_softc *sc)
1617
wpi_calib_timeout(void *arg)
1326
{
1618
{
1327
	uint32_t tmp = WPI_READ(sc, WPI_GPIO_CTL);
1619
	struct wpi_softc *sc = arg;
1328
	WPI_WRITE(sc, WPI_GPIO_CTL, tmp & ~WPI_GPIO_MAC);
1620
	struct ifnet *ifp = sc->sc_ifp;
1329
}
1621
	struct ieee80211com *ic = ifp->if_l2com;
1622
	struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
1330
1623
1331
static uint32_t
1624
	if (vap->iv_state != IEEE80211_S_RUN)
1332
wpi_mem_read(struct wpi_softc *sc, uint16_t addr)
1625
		return;
1333
{
1334
	WPI_WRITE(sc, WPI_READ_MEM_ADDR, WPI_MEM_4 | addr);
1335
	return WPI_READ(sc, WPI_READ_MEM_DATA);
1336
}
1337
1626
1338
static void
1627
	wpi_power_calibration(sc);
1339
wpi_mem_write(struct wpi_softc *sc, uint16_t addr, uint32_t data)
1340
{
1341
	WPI_WRITE(sc, WPI_WRITE_MEM_ADDR, WPI_MEM_4 | addr);
1342
	WPI_WRITE(sc, WPI_WRITE_MEM_DATA, data);
1343
}
1344
1628
1345
static void
1629
	callout_reset(&sc->calib_to, 60*hz, wpi_calib_timeout, sc);
1346
wpi_mem_write_region_4(struct wpi_softc *sc, uint16_t addr,
1347
    const uint32_t *data, int wlen)
1348
{
1349
	for (; wlen > 0; wlen--, data++, addr+=4)
1350
		wpi_mem_write(sc, addr, *data);
1351
}
1630
}
1352
1631
1353
/*
1632
static __inline uint8_t
1354
 * Read data from the EEPROM.  We access EEPROM through the MAC instead of
1633
rate2plcp(const uint8_t rate)
1355
 * using the traditional bit-bang method. Data is read up until len bytes have
1356
 * been obtained.
1357
 */
1358
static uint16_t
1359
wpi_read_prom_data(struct wpi_softc *sc, uint32_t addr, void *data, int len)
1360
{
1634
{
1361
	int ntries;
1635
	switch (rate) {
1362
	uint32_t val;
1636
	case 12:	return 0xd;
1363
	uint8_t *out = data;
1637
	case 18:	return 0xf;
1364
1638
	case 24:	return 0x5;
1365
	wpi_mem_lock(sc);
1639
	case 36:	return 0x7;
1366
1640
	case 48:	return 0x9;
1367
	for (; len > 0; len -= 2, addr++) {
1641
	case 72:	return 0xb;
1368
		WPI_WRITE(sc, WPI_EEPROM_CTL, addr << 2);
1642
	case 96:	return 0x1;
1369
1643
	case 108:	return 0x3;
1370
		for (ntries = 0; ntries < 10; ntries++) {
1644
	case 2:		return 10;
1371
			if ((val = WPI_READ(sc, WPI_EEPROM_CTL)) & WPI_EEPROM_READY)
1645
	case 4:		return 20;
1372
				break;
1646
	case 11:	return 55;
1373
			DELAY(5);
1647
	case 22:	return 110;
1374
		}
1648
	default:	return 0;
1375
1376
		if (ntries == 10) {
1377
			device_printf(sc->sc_dev, "could not read EEPROM\n");
1378
			return ETIMEDOUT;
1379
		}
1380
1381
		*out++= val >> 16;
1382
		if (len > 1)
1383
			*out ++= val >> 24;
1384
	}
1649
	}
1385
1386
	wpi_mem_unlock(sc);
1387
1388
	return 0;
1389
}
1650
}
1390
1651
1391
/*
1652
static __inline uint8_t
1392
 * The firmware text and data segments are transferred to the NIC using DMA.
1653
plcp2rate(const uint8_t plcp)
1393
 * The driver just copies the firmware into DMA-safe memory and tells the NIC
1394
 * where to find it.  Once the NIC has copied the firmware into its internal
1395
 * memory, we can free our local copy in the driver.
1396
 */
1397
static int
1398
wpi_load_microcode(struct wpi_softc *sc, const uint8_t *fw, int size)
1399
{
1654
{
1400
	int error, ntries;
1655
	switch (plcp) {
1401
1656
	case 0xd:	return 12;
1402
	DPRINTFN(WPI_DEBUG_HW,("Loading microcode  size 0x%x\n", size));
1657
	case 0xf:	return 18;
1403
1658
	case 0x5:	return 24;
1404
	size /= sizeof(uint32_t);
1659
	case 0x7:	return 36;
1405
1660
	case 0x9:	return 48;
1406
	wpi_mem_lock(sc);
1661
	case 0xb:	return 72;
1407
1662
	case 0x1:	return 96;
1408
	wpi_mem_write_region_4(sc, WPI_MEM_UCODE_BASE,
1663
	case 0x3:	return 108;
1409
	    (const uint32_t *)fw, size);
1664
	case 10:	return 2;
1410
1665
	case 20:	return 4;
1411
	wpi_mem_write(sc, WPI_MEM_UCODE_SRC, 0);
1666
	case 55:	return 11;
1412
	wpi_mem_write(sc, WPI_MEM_UCODE_DST, WPI_FW_TEXT);
1667
	case 110:	return 22;
1413
	wpi_mem_write(sc, WPI_MEM_UCODE_SIZE, size);
1668
	default:	return 0;
1414
1415
	/* run microcode */
1416
	wpi_mem_write(sc, WPI_MEM_UCODE_CTL, WPI_UC_RUN);
1417
1418
	/* wait while the adapter is busy copying the firmware */
1419
	for (error = 0, ntries = 0; ntries < 1000; ntries++) {
1420
		uint32_t status = WPI_READ(sc, WPI_TX_STATUS);
1421
		DPRINTFN(WPI_DEBUG_HW,
1422
		    ("firmware status=0x%x, val=0x%x, result=0x%x\n", status,
1423
		     WPI_TX_IDLE(6), status & WPI_TX_IDLE(6)));
1424
		if (status & WPI_TX_IDLE(6)) {
1425
			DPRINTFN(WPI_DEBUG_HW,
1426
			    ("Status Match! - ntries = %d\n", ntries));
1427
			break;
1428
		}
1429
		DELAY(10);
1430
	}
1669
	}
1431
	if (ntries == 1000) {
1670
}
1432
		device_printf(sc->sc_dev, "timeout transferring firmware\n");
1433
		error = ETIMEDOUT;
1434
	}
1435
1671
1436
	/* start the microcode executing */
1672
/* Quickly determine if a given rate is CCK or OFDM. */
1437
	wpi_mem_write(sc, WPI_MEM_UCODE_CTL, WPI_UC_ENABLE);
1673
#define WPI_RATE_IS_OFDM(rate)	((rate) >= 12 && (rate) != 22)
1438
1674
1439
	wpi_mem_unlock(sc);
1440
1441
	return (error);
1442
}
1443
1444
static void
1675
static void
1445
wpi_rx_intr(struct wpi_softc *sc, struct wpi_rx_desc *desc,
1676
wpi_rx_done(struct wpi_softc *sc, struct wpi_rx_desc *desc,
1446
	struct wpi_rx_data *data)
1677
    struct wpi_rx_data *data)
1447
{
1678
{
1448
	struct ifnet *ifp = sc->sc_ifp;
1679
	struct ifnet *ifp = sc->sc_ifp;
1680
	const struct ieee80211_cipher *cip = NULL;
1449
	struct ieee80211com *ic = ifp->if_l2com;
1681
	struct ieee80211com *ic = ifp->if_l2com;
1450
	struct wpi_rx_ring *ring = &sc->rxq;
1682
	struct wpi_rx_ring *ring = &sc->rxq;
1451
	struct wpi_rx_stat *stat;
1683
	struct wpi_rx_stat *stat;
1452
	struct wpi_rx_head *head;
1684
	struct wpi_rx_head *head;
1453
	struct wpi_rx_tail *tail;
1685
	struct wpi_rx_tail *tail;
1686
	struct ieee80211_frame *wh;
1454
	struct ieee80211_node *ni;
1687
	struct ieee80211_node *ni;
1455
	struct mbuf *m, *mnew;
1688
	struct mbuf *m, *m1;
1456
	bus_addr_t paddr;
1689
	bus_addr_t paddr;
1690
	uint32_t flags;
1691
	uint16_t len;
1457
	int error;
1692
	int error;
1458
1693
1459
	stat = (struct wpi_rx_stat *)(desc + 1);
1694
	stat = (struct wpi_rx_stat *)(desc + 1);
1460
1695
1461
	if (stat->len > WPI_STAT_MAXLEN) {
1696
	if (stat->len > WPI_STAT_MAXLEN) {
1462
		device_printf(sc->sc_dev, "invalid rx statistic header\n");
1697
		device_printf(sc->sc_dev, "invalid RX statistic header\n");
1463
		if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
1698
		if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
1464
		return;
1699
		return;
1465
	}
1700
	}
Lines 1466-1638 Link Here
1466
1701
1467
	bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_POSTREAD);
1702
	bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_POSTREAD);
1468
	head = (struct wpi_rx_head *)((caddr_t)(stat + 1) + stat->len);
1703
	head = (struct wpi_rx_head *)((caddr_t)(stat + 1) + stat->len);
1469
	tail = (struct wpi_rx_tail *)((caddr_t)(head + 1) + le16toh(head->len));
1704
	len = le16toh(head->len);
1705
	tail = (struct wpi_rx_tail *)((caddr_t)(head + 1) + len);
1706
	flags = le32toh(tail->flags);
1470
1707
1471
	DPRINTFN(WPI_DEBUG_RX, ("rx intr: idx=%d len=%d stat len=%d rssi=%d "
1708
	DPRINTF(sc, WPI_DEBUG_RECV, "%s: idx %d len %d stat len %u rssi %d"
1472
	    "rate=%x chan=%d tstamp=%ju\n", ring->cur, le32toh(desc->len),
1709
	    " rate %x chan %d tstamp %ju\n", __func__, ring->cur,
1473
	    le16toh(head->len), (int8_t)stat->rssi, head->rate, head->chan,
1710
	    le32toh(desc->len), len, (int8_t)stat->rssi,
1474
	    (uintmax_t)le64toh(tail->tstamp)));
1711
	    head->plcp, head->chan, (uintmax_t)le64toh(tail->tstamp));
1475
1712
1476
	/* discard Rx frames with bad CRC early */
1713
	/* Discard frames with a bad FCS early. */
1477
	if ((le32toh(tail->flags) & WPI_RX_NOERROR) != WPI_RX_NOERROR) {
1714
	if ((flags & WPI_RX_NOERROR) != WPI_RX_NOERROR) {
1478
		DPRINTFN(WPI_DEBUG_RX, ("%s: rx flags error %x\n", __func__,
1715
		DPRINTF(sc, WPI_DEBUG_RECV, "%s: RX flags error %x\n",
1479
		    le32toh(tail->flags)));
1716
		    __func__, flags);
1480
		if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
1717
		if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
1481
		return;
1718
		return;
1482
	}
1719
	}
1483
	if (le16toh(head->len) < sizeof (struct ieee80211_frame)) {
1720
	/* Discard frames that are too short. */
1484
		DPRINTFN(WPI_DEBUG_RX, ("%s: frame too short: %d\n", __func__,
1721
	if (len < sizeof (*wh)) {
1485
		    le16toh(head->len)));
1722
		DPRINTF(sc, WPI_DEBUG_RECV, "%s: frame too short: %d\n",
1723
		    __func__, len);
1486
		if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
1724
		if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
1487
		return;
1725
		return;
1488
	}
1726
	}
1489
1727
1490
	/* XXX don't need mbuf, just dma buffer */
1728
	m1 = m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR, MJUMPAGESIZE);
1491
	mnew = m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR, MJUMPAGESIZE);
1729
	if (m1 == NULL) {
1492
	if (mnew == NULL) {
1730
		DPRINTF(sc, WPI_DEBUG_ANY, "%s: no mbuf to restock ring\n",
1493
		DPRINTFN(WPI_DEBUG_RX, ("%s: no mbuf to restock ring\n",
1731
		    __func__);
1494
		    __func__));
1495
		if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
1732
		if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
1496
		return;
1733
		return;
1497
	}
1734
	}
1498
	bus_dmamap_unload(ring->data_dmat, data->map);
1735
	bus_dmamap_unload(ring->data_dmat, data->map);
1499
1736
1500
	error = bus_dmamap_load(ring->data_dmat, data->map,
1737
	error = bus_dmamap_load(ring->data_dmat, data->map, mtod(m1, void *),
1501
	    mtod(mnew, caddr_t), MJUMPAGESIZE,
1738
	    MJUMPAGESIZE, wpi_dma_map_addr, &paddr, BUS_DMA_NOWAIT);
1502
	    wpi_dma_map_addr, &paddr, BUS_DMA_NOWAIT);
1503
	if (error != 0 && error != EFBIG) {
1739
	if (error != 0 && error != EFBIG) {
1504
		device_printf(sc->sc_dev,
1740
		device_printf(sc->sc_dev,
1505
		    "%s: bus_dmamap_load failed, error %d\n", __func__, error);
1741
		    "%s: bus_dmamap_load failed, error %d\n", __func__, error);
1506
		m_freem(mnew);
1742
		m_freem(m1);
1743
1744
		/* Try to reload the old mbuf. */
1745
		error = bus_dmamap_load(ring->data_dmat, data->map,
1746
		    mtod(data->m, void *), MJUMPAGESIZE, wpi_dma_map_addr,
1747
		    &paddr, BUS_DMA_NOWAIT);
1748
		if (error != 0 && error != EFBIG) {
1749
			panic("%s: could not load old RX mbuf", __func__);
1750
		}
1751
		/* Physical address may have changed. */
1752
		ring->desc[ring->cur] = htole32(paddr);
1753
		bus_dmamap_sync(ring->data_dmat, ring->desc_dma.map,
1754
		    BUS_DMASYNC_PREWRITE);
1507
		if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
1755
		if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
1508
		return;
1756
		return;
1509
	}
1757
	}
1510
	bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_PREWRITE);
1511
1758
1512
	/* finalize mbuf and swap in new one */
1513
	m = data->m;
1759
	m = data->m;
1760
	data->m = m1;
1761
	/* Update RX descriptor. */
1762
	ring->desc[ring->cur] = htole32(paddr);
1763
	bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map,
1764
	    BUS_DMASYNC_PREWRITE);
1765
1766
	/* Finalize mbuf. */
1514
	m->m_pkthdr.rcvif = ifp;
1767
	m->m_pkthdr.rcvif = ifp;
1515
	m->m_data = (caddr_t)(head + 1);
1768
	m->m_data = (caddr_t)(head + 1);
1516
	m->m_pkthdr.len = m->m_len = le16toh(head->len);
1769
	m->m_pkthdr.len = m->m_len = len;
1517
1770
1518
	data->m = mnew;
1771
	/* Grab a reference to the source node. */
1519
	/* update Rx descriptor */
1772
	wh = mtod(m, struct ieee80211_frame *);
1520
	ring->desc[ring->cur] = htole32(paddr);
1773
	ni = ieee80211_find_rxnode(ic, (struct ieee80211_frame_min *)wh);
1521
1774
1775
	if (ni != NULL)
1776
		cip = ni->ni_ucastkey.wk_cipher;
1777
	if ((wh->i_fc[1] & IEEE80211_FC1_PROTECTED) &&
1778
	    !IEEE80211_IS_MULTICAST(wh->i_addr1) &&
1779
	    cip != NULL && cip->ic_cipher == IEEE80211_CIPHER_AES_CCM) {
1780
		if ((flags & WPI_RX_CIPHER_MASK) != WPI_RX_CIPHER_CCMP) {
1781
			if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
1782
			m_freem(m);
1783
			return;
1784
		}
1785
		/* Check whether decryption was successful or not. */
1786
		if ((flags & WPI_RX_DECRYPT_MASK) != WPI_RX_DECRYPT_OK) {
1787
			DPRINTF(sc, WPI_DEBUG_RECV,
1788
			    "CCMP decryption failed 0x%x\n", flags);
1789
			if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
1790
			m_freem(m);
1791
			return;
1792
		}
1793
		m->m_flags |= M_WEP;
1794
	}
1795
1522
	if (ieee80211_radiotap_active(ic)) {
1796
	if (ieee80211_radiotap_active(ic)) {
1523
		struct wpi_rx_radiotap_header *tap = &sc->sc_rxtap;
1797
		struct wpi_rx_radiotap_header *tap = &sc->sc_rxtap;
1524
1798
1525
		tap->wr_flags = 0;
1799
		tap->wr_flags = 0;
1526
		tap->wr_chan_freq =
1800
		if (head->flags & htole16(WPI_STAT_FLAG_SHPREAMBLE))
1527
			htole16(ic->ic_channels[head->chan].ic_freq);
1801
			tap->wr_flags |= IEEE80211_RADIOTAP_F_SHORTPRE;
1528
		tap->wr_chan_flags =
1529
			htole16(ic->ic_channels[head->chan].ic_flags);
1530
		tap->wr_dbm_antsignal = (int8_t)(stat->rssi - WPI_RSSI_OFFSET);
1802
		tap->wr_dbm_antsignal = (int8_t)(stat->rssi - WPI_RSSI_OFFSET);
1531
		tap->wr_dbm_antnoise = (int8_t)le16toh(stat->noise);
1803
		tap->wr_dbm_antnoise = (int8_t)le16toh(stat->noise);
1532
		tap->wr_tsft = tail->tstamp;
1804
		tap->wr_tsft = tail->tstamp;
1533
		tap->wr_antenna = (le16toh(head->flags) >> 4) & 0xf;
1805
		tap->wr_antenna = (le16toh(head->flags) >> 4) & 0xf;
1534
		switch (head->rate) {
1806
		tap->wr_rate = plcp2rate(head->plcp);
1535
		/* CCK rates */
1536
		case  10: tap->wr_rate =   2; break;
1537
		case  20: tap->wr_rate =   4; break;
1538
		case  55: tap->wr_rate =  11; break;
1539
		case 110: tap->wr_rate =  22; break;
1540
		/* OFDM rates */
1541
		case 0xd: tap->wr_rate =  12; break;
1542
		case 0xf: tap->wr_rate =  18; break;
1543
		case 0x5: tap->wr_rate =  24; break;
1544
		case 0x7: tap->wr_rate =  36; break;
1545
		case 0x9: tap->wr_rate =  48; break;
1546
		case 0xb: tap->wr_rate =  72; break;
1547
		case 0x1: tap->wr_rate =  96; break;
1548
		case 0x3: tap->wr_rate = 108; break;
1549
		/* unknown rate: should not happen */
1550
		default:  tap->wr_rate =   0;
1551
		}
1552
		if (le16toh(head->flags) & 0x4)
1553
			tap->wr_flags |= IEEE80211_RADIOTAP_F_SHORTPRE;
1554
	}
1807
	}
1555
1808
1556
	WPI_UNLOCK(sc);
1809
	WPI_UNLOCK(sc);
1557
1810
1558
	ni = ieee80211_find_rxnode(ic, mtod(m, struct ieee80211_frame_min *));
1811
	/* Send the frame to the 802.11 layer. */
1559
	if (ni != NULL) {
1812
	if (ni != NULL) {
1560
		(void) ieee80211_input(ni, m, stat->rssi, 0);
1813
		(void)ieee80211_input(ni, m, stat->rssi, -WPI_RSSI_OFFSET);
1814
		/* Node is no longer needed. */
1561
		ieee80211_free_node(ni);
1815
		ieee80211_free_node(ni);
1562
	} else
1816
	} else
1563
		(void) ieee80211_input_all(ic, m, stat->rssi, 0);
1817
		(void)ieee80211_input_all(ic, m, stat->rssi, -WPI_RSSI_OFFSET);
1564
1818
1565
	WPI_LOCK(sc);
1819
	WPI_LOCK(sc);
1566
}
1820
}
1567
1821
1568
static void
1822
static void
1569
wpi_tx_intr(struct wpi_softc *sc, struct wpi_rx_desc *desc)
1823
wpi_rx_statistics(struct wpi_softc *sc, struct wpi_rx_desc *desc,
1824
    struct wpi_rx_data *data)
1570
{
1825
{
1826
	/* Ignore */
1827
}
1828
1829
static void
1830
wpi_tx_done(struct wpi_softc *sc, struct wpi_rx_desc *desc)
1831
{
1571
	struct ifnet *ifp = sc->sc_ifp;
1832
	struct ifnet *ifp = sc->sc_ifp;
1572
	struct wpi_tx_ring *ring = &sc->txq[desc->qid & 0x3];
1833
	struct wpi_tx_ring *ring = &sc->txq[desc->qid & 0x3];
1573
	struct wpi_tx_data *txdata = &ring->data[desc->idx];
1834
	struct wpi_tx_data *data = &ring->data[desc->idx];
1574
	struct wpi_tx_stat *stat = (struct wpi_tx_stat *)(desc + 1);
1835
	struct wpi_tx_stat *stat = (struct wpi_tx_stat *)(desc + 1);
1575
	struct ieee80211_node *ni = txdata->ni;
1836
	struct mbuf *m;
1576
	struct ieee80211vap *vap = ni->ni_vap;
1837
	struct ieee80211_node *ni;
1577
	int retrycnt = 0;
1838
	struct ieee80211vap *vap;
1839
	int status = le32toh(stat->status);
1578
1840
1579
	DPRINTFN(WPI_DEBUG_TX, ("tx done: qid=%d idx=%d retries=%d nkill=%d "
1841
	KASSERT(data->ni != NULL, ("no node"));
1580
	    "rate=%x duration=%d status=%x\n", desc->qid, desc->idx,
1581
	    stat->ntries, stat->nkill, stat->rate, le32toh(stat->duration),
1582
	    le32toh(stat->status)));
1583
1842
1843
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_BEGIN, __func__);
1844
1845
	DPRINTF(sc, WPI_DEBUG_XMIT, "%s: "
1846
	    "qid %d idx %d retries %d btkillcnt %d rate %x duration %d "
1847
	    "status %x\n", __func__, desc->qid, desc->idx, stat->ackfailcnt,
1848
	    stat->btkillcnt, stat->rate, le32toh(stat->duration), status);
1849
1850
	/* Unmap and free mbuf. */
1851
	bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_POSTWRITE);
1852
	bus_dmamap_unload(ring->data_dmat, data->map);
1853
	m = data->m, data->m = NULL;
1854
	ni = data->ni, data->ni = NULL;
1855
	vap = ni->ni_vap;
1856
1584
	/*
1857
	/*
1585
	 * Update rate control statistics for the node.
1858
	 * Update rate control statistics for the node.
1586
	 * XXX we should not count mgmt frames since they're always sent at
1587
	 * the lowest available bit-rate.
1588
	 * XXX frames w/o ACK shouldn't be used either
1589
	 */
1859
	 */
1590
	if (stat->ntries > 0) {
1860
	WPI_UNLOCK(sc);
1591
		DPRINTFN(WPI_DEBUG_TX, ("%d retries\n", stat->ntries));
1861
	if ((status & 0xff) != 1) {
1592
		retrycnt = 1;
1593
	}
1594
	ieee80211_ratectl_tx_complete(vap, ni, IEEE80211_RATECTL_TX_SUCCESS,
1595
	    &retrycnt, NULL);
1596
1597
	/* XXX oerrors should only count errors !maxtries */
1598
	if ((le32toh(stat->status) & 0xff) != 1)
1599
		if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
1862
		if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
1600
	else
1863
		ieee80211_ratectl_tx_complete(vap, ni,
1864
		    IEEE80211_RATECTL_TX_FAILURE, &stat->ackfailcnt, NULL);
1865
	} else {
1601
		if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
1866
		if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
1867
		ieee80211_ratectl_tx_complete(vap, ni,
1868
		    IEEE80211_RATECTL_TX_SUCCESS, &stat->ackfailcnt, NULL);
1869
	}
1602
1870
1603
	bus_dmamap_sync(ring->data_dmat, txdata->map, BUS_DMASYNC_POSTWRITE);
1871
	ieee80211_tx_complete(ni, m, (status & 0xff) != 1);
1604
	bus_dmamap_unload(ring->data_dmat, txdata->map);
1872
	WPI_LOCK(sc);
1605
	/* XXX handle M_TXCB? */
1606
	m_freem(txdata->m);
1607
	txdata->m = NULL;
1608
	ieee80211_free_node(txdata->ni);
1609
	txdata->ni = NULL;
1610
1873
1611
	ring->queued--;
1874
	sc->sc_tx_timer = 0;
1875
	if (--ring->queued < WPI_TX_RING_LOMARK) {
1876
		sc->qfullmsk &= ~(1 << ring->qid);
1877
		if (sc->qfullmsk == 0 &&
1878
		    (ifp->if_drv_flags & IFF_DRV_OACTIVE)) {
1879
			ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
1880
			wpi_start_locked(ifp);
1881
		}
1882
	}
1612
1883
1613
	sc->sc_tx_timer = 0;
1884
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END, __func__);
1614
	ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
1615
	wpi_start_locked(ifp);
1616
}
1885
}
1617
1886
1887
/*
1888
 * Process a "command done" firmware notification.  This is where we wakeup
1889
 * processes waiting for a synchronous command completion.
1890
 */
1618
static void
1891
static void
1619
wpi_cmd_intr(struct wpi_softc *sc, struct wpi_rx_desc *desc)
1892
wpi_cmd_done(struct wpi_softc *sc, struct wpi_rx_desc *desc)
1620
{
1893
{
1621
	struct wpi_tx_ring *ring = &sc->cmdq;
1894
	struct wpi_tx_ring *ring = &sc->txq[4];
1622
	struct wpi_tx_data *data;
1895
	struct wpi_tx_data *data;
1623
1896
1624
	DPRINTFN(WPI_DEBUG_CMD, ("cmd notification qid=%x idx=%d flags=%x "
1897
	DPRINTF(sc, WPI_DEBUG_CMD, "cmd notification qid=%x idx=%d flags=%x "
1625
				 "type=%s len=%d\n", desc->qid, desc->idx,
1898
				   "type=%s len=%d\n", desc->qid, desc->idx,
1626
				 desc->flags, wpi_cmd_str(desc->type),
1899
				   desc->flags, wpi_cmd_str(desc->type),
1627
				 le32toh(desc->len)));
1900
				   le32toh(desc->len));
1628
1901
1629
	if ((desc->qid & 7) != 4)
1902
	if ((desc->qid & 7) != 4)
1630
		return;	/* not a command ack */
1903
		return;	/* Not a command ack. */
1631
1904
1632
	data = &ring->data[desc->idx];
1905
	data = &ring->data[desc->idx];
1633
1906
1634
	/* if the command was mapped in a mbuf, free it */
1907
	/* If the command was mapped in an mbuf, free it. */
1635
	if (data->m != NULL) {
1908
	if (data->m != NULL) {
1909
		bus_dmamap_sync(ring->data_dmat, data->map,
1910
		    BUS_DMASYNC_POSTWRITE);
1636
		bus_dmamap_unload(ring->data_dmat, data->map);
1911
		bus_dmamap_unload(ring->data_dmat, data->map);
1637
		m_freem(data->m);
1912
		m_freem(data->m);
1638
		data->m = NULL;
1913
		data->m = NULL;
Lines 1647-1698 Link Here
1647
{
1922
{
1648
	struct ifnet *ifp = sc->sc_ifp;
1923
	struct ifnet *ifp = sc->sc_ifp;
1649
	struct ieee80211com *ic = ifp->if_l2com;
1924
	struct ieee80211com *ic = ifp->if_l2com;
1650
	struct wpi_rx_desc *desc;
1925
	struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
1651
	struct wpi_rx_data *data;
1926
	int hw;
1652
	uint32_t hw;
1653
1927
1654
	bus_dmamap_sync(sc->shared_dma.tag, sc->shared_dma.map,
1928
	bus_dmamap_sync(sc->shared_dma.tag, sc->shared_dma.map,
1655
	    BUS_DMASYNC_POSTREAD);
1929
	    BUS_DMASYNC_POSTREAD);
1656
1930
1657
	hw = le32toh(sc->shared->next);
1931
	hw = le32toh(sc->shared->next);
1658
	while (sc->rxq.cur != hw) {
1932
	hw = (hw == 0) ? WPI_RX_RING_COUNT - 1 : hw - 1;
1659
		data = &sc->rxq.data[sc->rxq.cur];
1660
1933
1934
	if (sc->rxq.cur == hw)
1935
		return;
1936
1937
	do {
1938
		sc->rxq.cur = (sc->rxq.cur + 1) % WPI_RX_RING_COUNT;
1939
1940
		struct wpi_rx_data *data = &sc->rxq.data[sc->rxq.cur];
1941
		struct wpi_rx_desc *desc;
1942
1661
		bus_dmamap_sync(sc->rxq.data_dmat, data->map,
1943
		bus_dmamap_sync(sc->rxq.data_dmat, data->map,
1662
		    BUS_DMASYNC_POSTREAD);
1944
		    BUS_DMASYNC_POSTREAD);
1663
		desc = (void *)data->m->m_ext.ext_buf;
1945
		desc = mtod(data->m, struct wpi_rx_desc *);
1664
1946
1665
		DPRINTFN(WPI_DEBUG_NOTIFY,
1947
		DPRINTF(sc, WPI_DEBUG_NOTIFY,
1666
			 ("notify qid=%x idx=%d flags=%x type=%d len=%d\n",
1948
		    "%s: cur=%d; qid %x idx %d flags %x type %d(%s) len %d\n",
1667
			  desc->qid,
1949
		    __func__, sc->rxq.cur, desc->qid, desc->idx, desc->flags,
1668
			  desc->idx,
1950
		    desc->type, wpi_cmd_str(desc->type), le32toh(desc->len));
1669
			  desc->flags,
1670
			  desc->type,
1671
			  le32toh(desc->len)));
1672
1951
1673
		if (!(desc->qid & 0x80))	/* reply to a command */
1952
		if (!(desc->qid & 0x80))	/* Reply to a command. */
1674
			wpi_cmd_intr(sc, desc);
1953
			wpi_cmd_done(sc, desc);
1675
1954
1676
		switch (desc->type) {
1955
		switch (desc->type) {
1677
		case WPI_RX_DONE:
1956
		case WPI_RX_DONE:
1678
			/* a 802.11 frame was received */
1957
			/* An 802.11 frame has been received. */
1679
			wpi_rx_intr(sc, desc, data);
1958
			wpi_rx_done(sc, desc, data);
1680
			break;
1959
			break;
1681
1960
1682
		case WPI_TX_DONE:
1961
		case WPI_TX_DONE:
1683
			/* a 802.11 frame has been transmitted */
1962
			/* An 802.11 frame has been transmitted. */
1684
			wpi_tx_intr(sc, desc);
1963
			wpi_tx_done(sc, desc);
1685
			break;
1964
			break;
1686
1965
1966
		case WPI_RX_STATISTICS:
1967
		case WPI_BEACON_STATISTICS:
1968
			wpi_rx_statistics(sc, desc, data);
1969
			break;
1970
1971
		case WPI_BEACON_MISSED:
1972
		{
1973
			struct wpi_beacon_missed *miss =
1974
			    (struct wpi_beacon_missed *)(desc + 1);
1975
			int misses;
1976
1977
			bus_dmamap_sync(sc->rxq.data_dmat, data->map,
1978
			    BUS_DMASYNC_POSTREAD);
1979
			misses = le32toh(miss->consecutive);
1980
1981
			DPRINTF(sc, WPI_DEBUG_STATE,
1982
			    "%s: beacons missed %d/%d\n", __func__, misses,
1983
			    le32toh(miss->total));
1984
1985
			if (vap->iv_state == IEEE80211_S_RUN &&
1986
			    (ic->ic_flags & IEEE80211_S_SCAN) == 0) {
1987
				if (misses >=  vap->iv_bmissthreshold) {
1988
					WPI_UNLOCK(sc);
1989
					ieee80211_beacon_miss(ic);
1990
					WPI_LOCK(sc);
1991
				}
1992
			}
1993
			break;
1994
		}
1687
		case WPI_UC_READY:
1995
		case WPI_UC_READY:
1688
		{
1996
		{
1689
			struct wpi_ucode_info *uc =
1997
			struct wpi_ucode_info *uc =
1690
				(struct wpi_ucode_info *)(desc + 1);
1998
			    (struct wpi_ucode_info *)(desc + 1);
1691
1999
1692
			/* the microcontroller is ready */
2000
			/* The microcontroller is ready. */
1693
			DPRINTF(("microcode alive notification version %x "
2001
			bus_dmamap_sync(sc->rxq.data_dmat, data->map,
1694
				"alive %x\n", le32toh(uc->version),
2002
			    BUS_DMASYNC_POSTREAD);
1695
				le32toh(uc->valid)));
2003
			DPRINTF(sc, WPI_DEBUG_RESET,
2004
			    "microcode alive notification version=%d.%d "
2005
			    "subtype=%x alive=%x\n", uc->major, uc->minor,
2006
			    uc->subtype, le32toh(uc->valid));
1696
2007
1697
			if (le32toh(uc->valid) != 1) {
2008
			if (le32toh(uc->valid) != 1) {
1698
				device_printf(sc->sc_dev,
2009
				device_printf(sc->sc_dev,
Lines 1699-1774 Link Here
1699
				    "microcontroller initialization failed\n");
2010
				    "microcontroller initialization failed\n");
1700
				wpi_stop_locked(sc);
2011
				wpi_stop_locked(sc);
1701
			}
2012
			}
2013
			/* Save the address of the error log in SRAM. */
2014
			sc->errptr = le32toh(uc->errptr);
1702
			break;
2015
			break;
1703
		}
2016
		}
1704
		case WPI_STATE_CHANGED:
2017
		case WPI_STATE_CHANGED:
1705
		{
2018
		{
2019
                        bus_dmamap_sync(sc->rxq.data_dmat, data->map,
2020
                            BUS_DMASYNC_POSTREAD);
2021
1706
			uint32_t *status = (uint32_t *)(desc + 1);
2022
			uint32_t *status = (uint32_t *)(desc + 1);
1707
2023
#ifdef WPI_DEBUG
1708
			/* enabled/disabled notification */
2024
			DPRINTF(sc, WPI_DEBUG_STATE, "state changed to %x\n",
1709
			DPRINTF(("state changed to %x\n", le32toh(*status)));
2025
			    le32toh(*status));
1710
2026
#endif
1711
			if (le32toh(*status) & 1) {
2027
			if (le32toh(*status) & 1) {
1712
				device_printf(sc->sc_dev,
2028
				ieee80211_runtask(ic, &sc->sc_radiooff_task);
1713
				    "Radio transmitter is switched off\n");
2029
				return;
1714
				sc->flags |= WPI_FLAG_HW_RADIO_OFF;
1715
				ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
1716
				/* Disable firmware commands */
1717
				WPI_WRITE(sc, WPI_UCODE_SET, WPI_DISABLE_CMD);
1718
			}
2030
			}
1719
			break;
2031
			break;
1720
		}
2032
		}
1721
		case WPI_START_SCAN:
2033
		case WPI_START_SCAN:
1722
		{
2034
		{
2035
			bus_dmamap_sync(sc->rxq.data_dmat, data->map,
2036
			    BUS_DMASYNC_POSTREAD);
1723
#ifdef WPI_DEBUG
2037
#ifdef WPI_DEBUG
1724
			struct wpi_start_scan *scan =
2038
			struct wpi_start_scan *scan =
1725
				(struct wpi_start_scan *)(desc + 1);
2039
			    (struct wpi_start_scan *)(desc + 1);
2040
			DPRINTF(sc, WPI_DEBUG_SCAN,
2041
			    "%s: scanning channel %d status %x\n",
2042
			    __func__, scan->chan, le32toh(scan->status));
1726
#endif
2043
#endif
1727
1728
			DPRINTFN(WPI_DEBUG_SCANNING,
1729
				 ("scanning channel %d status %x\n",
1730
			    scan->chan, le32toh(scan->status)));
1731
			break;
2044
			break;
1732
		}
2045
		}
1733
		case WPI_STOP_SCAN:
2046
		case WPI_STOP_SCAN:
1734
		{
2047
		{
2048
			bus_dmamap_sync(sc->rxq.data_dmat, data->map,
2049
			    BUS_DMASYNC_POSTREAD);
1735
#ifdef WPI_DEBUG
2050
#ifdef WPI_DEBUG
1736
			struct wpi_stop_scan *scan =
2051
			struct wpi_stop_scan *scan =
1737
				(struct wpi_stop_scan *)(desc + 1);
2052
			    (struct wpi_stop_scan *)(desc + 1);
2053
			DPRINTF(sc, WPI_DEBUG_SCAN,
2054
			    "scan finished nchan=%d status=%d chan=%d\n",
2055
			    scan->nchan, scan->status, scan->chan);
1738
#endif
2056
#endif
1739
			struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
1740
1741
			DPRINTFN(WPI_DEBUG_SCANNING,
1742
			    ("scan finished nchan=%d status=%d chan=%d\n",
1743
			     scan->nchan, scan->status, scan->chan));
1744
1745
			sc->sc_scan_timer = 0;
2057
			sc->sc_scan_timer = 0;
2058
			WPI_UNLOCK(sc);
1746
			ieee80211_scan_next(vap);
2059
			ieee80211_scan_next(vap);
2060
			WPI_LOCK(sc);
1747
			break;
2061
			break;
1748
		}
2062
		}
1749
		case WPI_MISSED_BEACON:
2063
		}
1750
		{
2064
	} while (sc->rxq.cur != hw);
1751
			struct wpi_missed_beacon *beacon =
1752
				(struct wpi_missed_beacon *)(desc + 1);
1753
			struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
1754
2065
1755
			if (le32toh(beacon->consecutive) >=
2066
	/* Tell the firmware what we have processed. */
1756
			    vap->iv_bmissthreshold) {
2067
	wpi_update_rx_ring(sc);
1757
				DPRINTF(("Beacon miss: %u >= %u\n",
2068
}
1758
					 le32toh(beacon->consecutive),
2069
1759
					 vap->iv_bmissthreshold));
2070
/*
1760
				ieee80211_beacon_miss(ic);
2071
 * Process an INT_WAKEUP interrupt raised when the microcontroller wakes up
1761
			}
2072
 * from power-down sleep mode.
1762
			break;
2073
 */
2074
static void     
2075
wpi_wakeup_intr(struct wpi_softc *sc)
2076
{
2077
	int qid;
2078
2079
	DPRINTF(sc, WPI_DEBUG_PWRSAVE,
2080
	    "%s: ucode wakeup from power-down sleep\n", __func__);
2081
2082
	/* Wakeup RX and TX rings. */
2083
	if (sc->rxq.update) {
2084
		wpi_update_rx_ring(sc);
2085
		sc->rxq.update = 0;
2086
	}
2087
	for (qid = 0; qid < WPI_NTXQUEUES; qid++) {
2088
		struct wpi_tx_ring *ring = &sc->txq[qid];
2089
2090
		if (ring->update) {
2091
			wpi_update_tx_ring(sc, ring);
2092
			ring->update = 0;
1763
		}
2093
		}
1764
		}
2094
	}
1765
2095
1766
		sc->rxq.cur = (sc->rxq.cur + 1) % WPI_RX_RING_COUNT;
2096
	WPI_CLRBITS(sc, WPI_GP_CNTRL, WPI_GP_CNTRL_MAC_ACCESS_REQ);
2097
}
2098
2099
/*
2100
 * Dump the error log of the firmware when a firmware panic occurs.  Although
2101
 * we can't debug the firmware because it is neither open source nor free, it
2102
 * can help us to identify certain classes of problems.
2103
 */
2104
static void
2105
wpi_fatal_intr(struct wpi_softc *sc)
2106
{
2107
	struct wpi_fw_dump dump;
2108
	uint32_t i, offset, count;
2109
	const uint32_t size_errmsg =
2110
	    (sizeof (wpi_fw_errmsg) / sizeof ((wpi_fw_errmsg)[0]));
2111
2112
	/* Check that the error log address is valid. */
2113
	if (sc->errptr < WPI_FW_DATA_BASE ||
2114
	    sc->errptr + sizeof (dump) >
2115
	    WPI_FW_DATA_BASE + WPI_FW_DATA_MAXSZ) {
2116
		printf("%s: bad firmware error log address 0x%08x\n", __func__,
2117
		    sc->errptr);
2118
                return;
2119
        }
2120
	if (wpi_nic_lock(sc) != 0) {
2121
		printf("%s: could not read firmware error log\n", __func__);
2122
                return;
2123
        }
2124
	/* Read number of entries in the log. */
2125
	count = wpi_mem_read(sc, sc->errptr);
2126
	if (count == 0 || count * sizeof (dump) > WPI_FW_DATA_MAXSZ) {
2127
		printf("%s: invalid count field (count = %u)\n", __func__,
2128
		    count);
2129
		wpi_nic_unlock(sc);
2130
		return;
1767
	}
2131
	}
2132
	/* Skip "count" field. */
2133
	offset = sc->errptr + sizeof (uint32_t);
2134
	printf("firmware error log (count = %u):\n", count);
2135
	for (i = 0; i < count; i++) {
2136
		wpi_mem_read_region_4(sc, offset, (uint32_t *)&dump,
2137
		    sizeof (dump) / sizeof (uint32_t));
1768
2138
1769
	/* tell the firmware what we have processed */
2139
		printf("  error type = \"%s\" (0x%08X)\n",
1770
	hw = (hw == 0) ? WPI_RX_RING_COUNT - 1 : hw - 1;
2140
		    (dump.desc < size_errmsg) ?
1771
	WPI_WRITE(sc, WPI_RX_WIDX, hw & ~7);
2141
		        wpi_fw_errmsg[dump.desc] : "UNKNOWN",
2142
		    dump.desc);
2143
		printf("  error data      = 0x%08X\n",
2144
		    dump.data);
2145
		printf("  branch link     = 0x%08X%08X\n",
2146
		    dump.blink[0], dump.blink[1]);
2147
		printf("  interrupt link  = 0x%08X%08X\n",
2148
		    dump.ilink[0], dump.ilink[1]);
2149
		printf("  time            = %u\n", dump.time);
2150
2151
		offset += sizeof (dump);
2152
	}
2153
	wpi_nic_unlock(sc);
2154
	/* Dump driver status (TX and RX rings) while we're here. */
2155
	printf("driver status:\n");
2156
	for (i = 0; i < WPI_NTXQUEUES; i++) {
2157
		struct wpi_tx_ring *ring = &sc->txq[i];
2158
		printf("  tx ring %2d: qid=%-2d cur=%-3d queued=%-3d\n",
2159
		    i, ring->qid, ring->cur, ring->queued);
2160
	}
2161
	printf("  rx ring: cur=%d\n", sc->rxq.cur);
1772
}
2162
}
1773
2163
1774
static void
2164
static void
Lines 1775-2021 Link Here
1775
wpi_intr(void *arg)
2165
wpi_intr(void *arg)
1776
{
2166
{
1777
	struct wpi_softc *sc = arg;
2167
	struct wpi_softc *sc = arg;
1778
	uint32_t r;
2168
	struct ifnet *ifp = sc->sc_ifp;
2169
	uint32_t r1, r2;
1779
2170
1780
	WPI_LOCK(sc);
2171
	WPI_LOCK(sc);
1781
2172
1782
	r = WPI_READ(sc, WPI_INTR);
2173
	/* Disable interrupts. */
1783
	if (r == 0 || r == 0xffffffff) {
2174
	WPI_WRITE(sc, WPI_INT_MASK, 0);
2175
2176
	r1 = WPI_READ(sc, WPI_INT);
2177
2178
	if (r1 == 0xffffffff || (r1 & 0xfffffff0) == 0xa5a5a5a0) {
1784
		WPI_UNLOCK(sc);
2179
		WPI_UNLOCK(sc);
1785
		return;
2180
		return;	/* Hardware gone! */
1786
	}
2181
	}
1787
2182
1788
	/* disable interrupts */
2183
	r2 = WPI_READ(sc, WPI_FH_INT);
1789
	WPI_WRITE(sc, WPI_MASK, 0);
1790
	/* ack interrupts */
1791
	WPI_WRITE(sc, WPI_INTR, r);
1792
2184
1793
	if (r & (WPI_SW_ERROR | WPI_HW_ERROR)) {
2185
	DPRINTF(sc, WPI_DEBUG_INTR, "%s: reg1=0x%08x reg2=0x%08x\n", __func__,
1794
		struct ifnet *ifp = sc->sc_ifp;
2186
	    r1, r2);
2187
2188
	if (r1 == 0 && r2 == 0)
2189
		goto done;	/* Interrupt not for us. */
2190
2191
	/* Acknowledge interrupts. */
2192
	WPI_WRITE(sc, WPI_INT, r1);
2193
	WPI_WRITE(sc, WPI_FH_INT, r2);
2194
2195
	if (r1 & (WPI_INT_SW_ERR | WPI_INT_HW_ERR)) {
1795
		struct ieee80211com *ic = ifp->if_l2com;
2196
		struct ieee80211com *ic = ifp->if_l2com;
1796
		struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
1797
2197
1798
		device_printf(sc->sc_dev, "fatal firmware error\n");
2198
		device_printf(sc->sc_dev, "fatal firmware error\n");
1799
		DPRINTFN(6,("(%s)\n", (r & WPI_SW_ERROR) ? "(Software Error)" :
2199
		wpi_fatal_intr(sc);
1800
				"(Hardware Error)"));
2200
		DPRINTF(sc, WPI_DEBUG_HW,
1801
		if (vap != NULL)
2201
		    "(%s)\n", (r1 & WPI_INT_SW_ERR) ? "(Software Error)" :
1802
			ieee80211_cancel_scan(vap);
2202
		    "(Hardware Error)");
1803
		ieee80211_runtask(ic, &sc->sc_restarttask);
2203
		ieee80211_runtask(ic, &sc->sc_reinittask);
1804
		sc->flags &= ~WPI_FLAG_BUSY;
2204
		sc->flags &= ~WPI_FLAG_BUSY;
1805
		WPI_UNLOCK(sc);
2205
		WPI_UNLOCK(sc);
1806
		return;
2206
		return;
1807
	}
2207
	}
1808
2208
1809
	if (r & WPI_RX_INTR)
2209
	if ((r1 & (WPI_INT_FH_RX | WPI_INT_SW_RX)) ||
2210
	    (r2 & WPI_FH_INT_RX))
1810
		wpi_notif_intr(sc);
2211
		wpi_notif_intr(sc);
1811
2212
1812
	if (r & WPI_ALIVE_INTR)	/* firmware initialized */
2213
	if (r1 & WPI_INT_ALIVE)
1813
		wakeup(sc);
2214
		wakeup(sc);	/* Firmware is alive. */
1814
2215
1815
	/* re-enable interrupts */
2216
	if (r1 & WPI_INT_WAKEUP)
1816
	if (sc->sc_ifp->if_flags & IFF_UP)
2217
		wpi_wakeup_intr(sc);
1817
		WPI_WRITE(sc, WPI_MASK, WPI_INTR_MASK);
1818
2218
2219
done:
2220
	/* Re-enable interrupts. */
2221
	if (ifp->if_flags & IFF_UP)
2222
		WPI_WRITE(sc, WPI_INT_MASK, WPI_INT_MASK_DEF);
2223
1819
	WPI_UNLOCK(sc);
2224
	WPI_UNLOCK(sc);
1820
}
2225
}
1821
2226
1822
static uint8_t
2227
static int
1823
wpi_plcp_signal(int rate)
2228
wpi_cmd2(struct wpi_softc *sc, struct wpi_buf *buf)
1824
{
2229
{
1825
	switch (rate) {
2230
	struct ieee80211_frame *wh;
1826
	/* CCK rates (returned values are device-dependent) */
2231
	struct wpi_tx_cmd *cmd;
1827
	case 2:		return 10;
2232
	struct wpi_tx_data *data;
1828
	case 4:		return 20;
2233
	struct wpi_tx_desc *desc;
1829
	case 11:	return 55;
2234
	struct wpi_tx_ring *ring;
1830
	case 22:	return 110;
2235
	struct mbuf *m1;
2236
	bus_dma_segment_t *seg, segs[WPI_MAX_SCATTER];
2237
	u_int hdrlen;
2238
	int error, i, nsegs, pad, totlen;
1831
2239
1832
	/* OFDM rates (cf IEEE Std 802.11a-1999, pp. 14 Table 80) */
2240
	WPI_LOCK_ASSERT(sc);
1833
	/* R1-R4 (ral/ural is R4-R1) */
1834
	case 12:	return 0xd;
1835
	case 18:	return 0xf;
1836
	case 24:	return 0x5;
1837
	case 36:	return 0x7;
1838
	case 48:	return 0x9;
1839
	case 72:	return 0xb;
1840
	case 96:	return 0x1;
1841
	case 108:	return 0x3;
1842
2241
1843
	/* unsupported rates (should not get there) */
2242
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_BEGIN, __func__);
1844
	default:	return 0;
2243
2244
	wh = mtod(buf->m, struct ieee80211_frame *);
2245
	hdrlen = ieee80211_anyhdrsize(wh);
2246
	totlen = buf->m->m_pkthdr.len;
2247
2248
	if (hdrlen & 3) {
2249
		/* First segment length must be a multiple of 4. */
2250
		pad = 4 - (hdrlen & 3);
2251
	} else
2252
		pad = 0;
2253
2254
	ring = &sc->txq[buf->ac];
2255
	desc = &ring->desc[ring->cur];
2256
	data = &ring->data[ring->cur];
2257
2258
	/* Prepare TX firmware command. */
2259
	cmd = &ring->cmd[ring->cur];
2260
	cmd->code = buf->code;
2261
	cmd->flags = 0;
2262
	cmd->qid = ring->qid;
2263
	cmd->idx = ring->cur;
2264
2265
	memcpy(cmd->data, buf->data, buf->size);
2266
2267
	/* Save and trim IEEE802.11 header. */
2268
	memcpy((uint8_t *)(cmd->data + buf->size), wh, hdrlen);
2269
	m_adj(buf->m, hdrlen);
2270
2271
	error = bus_dmamap_load_mbuf_sg(ring->data_dmat, data->map, buf->m,
2272
	    segs, &nsegs, BUS_DMA_NOWAIT);
2273
	if (error != 0 && error != EFBIG) {
2274
		device_printf(sc->sc_dev,
2275
		    "%s: can't map mbuf (error %d)\n", __func__, error);
2276
		m_freem(buf->m);
2277
		return error;
1845
	}
2278
	}
2279
	if (error != 0) {
2280
		/* Too many DMA segments, linearize mbuf. */
2281
		m1 = m_collapse(buf->m, M_NOWAIT, WPI_MAX_SCATTER);
2282
		if (m1 == NULL) {
2283
			device_printf(sc->sc_dev,
2284
			    "%s: could not defrag mbuf\n", __func__);
2285
			m_freem(buf->m);
2286
			return ENOBUFS;
2287
		}
2288
		buf->m = m1;
2289
2290
		error = bus_dmamap_load_mbuf_sg(ring->data_dmat, data->map,
2291
		    buf->m, segs, &nsegs, BUS_DMA_NOWAIT);
2292
		if (error != 0) {
2293
			device_printf(sc->sc_dev,
2294
			    "%s: can't map mbuf (error %d)\n", __func__, error);
2295
			m_freem(buf->m);
2296
			return error;
2297
		}
2298
	}
2299
2300
	data->m = buf->m;
2301
	data->ni = buf->ni;
2302
2303
	DPRINTF(sc, WPI_DEBUG_XMIT, "%s: qid %d idx %d len %d nsegs %d\n",
2304
	    __func__, ring->qid, ring->cur, totlen, nsegs);
2305
2306
	/* Fill TX descriptor. */
2307
	desc->nsegs = WPI_PAD32(totlen + pad) << 4 | (1 + nsegs);
2308
	/* First DMA segment is used by the TX command. */
2309
	desc->segs[0].addr = htole32(data->cmd_paddr);
2310
	desc->segs[0].len  = htole32(4 + buf->size + hdrlen + pad);
2311
	/* Other DMA segments are for data payload. */
2312
	seg = &segs[0];
2313
	for (i = 1; i <= nsegs; i++) {
2314
		desc->segs[i].addr = htole32(seg->ds_addr);
2315
		desc->segs[i].len  = htole32(seg->ds_len);
2316
		seg++;
2317
	}
2318
2319
	bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_PREWRITE);
2320
	bus_dmamap_sync(ring->data_dmat, ring->cmd_dma.map,
2321
	    BUS_DMASYNC_PREWRITE);
2322
	bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map,
2323
	    BUS_DMASYNC_PREWRITE);
2324
2325
	/* Kick TX ring. */
2326
	ring->cur = (ring->cur + 1) % WPI_TX_RING_COUNT;
2327
	wpi_update_tx_ring(sc, ring);
2328
2329
	/* Mark TX ring as full if we reach a certain threshold. */
2330
	if (++ring->queued > WPI_TX_RING_HIMARK)
2331
		sc->qfullmsk |= 1 << ring->qid;
2332
2333
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END, __func__);
2334
2335
	return 0;
1846
}
2336
}
1847
2337
1848
/* quickly determine if a given rate is CCK or OFDM */
1849
#define WPI_RATE_IS_OFDM(rate) ((rate) >= 12 && (rate) != 22)
1850
1851
/*
2338
/*
1852
 * Construct the data packet for a transmit buffer and acutally put
2339
 * Construct the data packet for a transmit buffer.
1853
 * the buffer onto the transmit ring, kicking the card to process the
1854
 * the buffer.
1855
 */
2340
 */
1856
static int
2341
static int
1857
wpi_tx_data(struct wpi_softc *sc, struct mbuf *m0, struct ieee80211_node *ni,
2342
wpi_tx_data(struct wpi_softc *sc, struct mbuf *m, struct ieee80211_node *ni)
1858
	int ac)
1859
{
2343
{
2344
	const struct ieee80211_txparam *tp;
1860
	struct ieee80211vap *vap = ni->ni_vap;
2345
	struct ieee80211vap *vap = ni->ni_vap;
1861
	struct ifnet *ifp = sc->sc_ifp;
2346
	struct ieee80211com *ic = ni->ni_ic;
1862
	struct ieee80211com *ic = ifp->if_l2com;
2347
	struct wpi_node *wn = (void *)ni;
1863
	const struct chanAccParams *cap = &ic->ic_wme.wme_chanParams;
2348
	struct ieee80211_channel *chan;
1864
	struct wpi_tx_ring *ring = &sc->txq[ac];
1865
	struct wpi_tx_desc *desc;
1866
	struct wpi_tx_data *data;
1867
	struct wpi_tx_cmd *cmd;
1868
	struct wpi_cmd_data *tx;
1869
	struct ieee80211_frame *wh;
2349
	struct ieee80211_frame *wh;
1870
	const struct ieee80211_txparam *tp;
2350
	struct ieee80211_key *k = NULL;
1871
	struct ieee80211_key *k;
2351
	struct wpi_cmd_data tx;
1872
	struct mbuf *mnew;
2352
	struct wpi_buf tx_data;
1873
	int i, error, nsegs, rate, hdrlen, ismcast;
2353
	uint32_t flags;
1874
	bus_dma_segment_t segs[WPI_MAX_SCATTER];
2354
	uint16_t qos;
2355
	uint8_t tid, type;
2356
	int ac, error, rate, ismcast, totlen;
1875
2357
1876
	desc = &ring->desc[ring->cur];
2358
	wh = mtod(m, struct ieee80211_frame *);
1877
	data = &ring->data[ring->cur];
2359
	type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
2360
	ismcast = IEEE80211_IS_MULTICAST(wh->i_addr1);
1878
2361
1879
	wh = mtod(m0, struct ieee80211_frame *);
2362
	/* Select EDCA Access Category and TX ring for this frame. */
2363
	if (IEEE80211_QOS_HAS_SEQ(wh)) {
2364
 		qos = ((const struct ieee80211_qosframe *)wh)->i_qos[0];
2365
		tid = qos & IEEE80211_QOS_TID;
2366
	} else {
2367
		qos = 0;
2368
		tid = 0;
2369
        }
2370
	ac = M_WME_GETAC(m);
1880
2371
1881
	hdrlen = ieee80211_hdrsize(wh);
2372
	chan = (ni->ni_chan != IEEE80211_CHAN_ANYC) ?
1882
	ismcast = IEEE80211_IS_MULTICAST(wh->i_addr1);
2373
		ni->ni_chan : ic->ic_curchan;
2374
	tp = &vap->iv_txparms[ieee80211_chan2mode(chan)];
1883
2375
2376
	/* Choose a TX rate index. */
2377
	if (type == IEEE80211_FC0_TYPE_MGT)
2378
		rate = tp->mgmtrate;
2379
	else if (ismcast)
2380
		rate = tp->mcastrate;
2381
	else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE)
2382
		rate = tp->ucastrate;
2383
	else if (m->m_flags & M_EAPOL)
2384
		rate = tp->mgmtrate;
2385
	else {
2386
		/* XXX pass pktlen */
2387
		(void) ieee80211_ratectl_rate(ni, NULL, 0);
2388
		rate = ni->ni_txrate;
2389
	}
2390
2391
	/* Encrypt the frame if need be. */
1884
	if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
2392
	if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
1885
		k = ieee80211_crypto_encap(ni, m0);
2393
		/* Retrieve key for TX. */
2394
		k = ieee80211_crypto_encap(ni, m);
1886
		if (k == NULL) {
2395
		if (k == NULL) {
1887
			m_freem(m0);
2396
			error = ENOBUFS;
1888
			return ENOBUFS;
2397
			goto fail;
1889
		}
2398
		}
1890
		/* packet header may have moved, reset our local pointer */
2399
		/* 802.11 header may have moved. */
1891
		wh = mtod(m0, struct ieee80211_frame *);
2400
		wh = mtod(m, struct ieee80211_frame *);
1892
	}
2401
	}
2402
	totlen = m->m_pkthdr.len;
1893
2403
1894
	cmd = &ring->cmd[ring->cur];
2404
	if (ieee80211_radiotap_active_vap(vap)) {
1895
	cmd->code = WPI_CMD_TX_DATA;
2405
		struct wpi_tx_radiotap_header *tap = &sc->sc_txtap;
1896
	cmd->flags = 0;
1897
	cmd->qid = ring->qid;
1898
	cmd->idx = ring->cur;
1899
2406
1900
	tx = (struct wpi_cmd_data *)cmd->data;
2407
		tap->wt_flags = 0;
1901
	tx->flags = htole32(WPI_TX_AUTO_SEQ);
2408
		tap->wt_rate = rate;
1902
	tx->timeout = htole16(0);
2409
		if (k != NULL)
1903
	tx->ofdm_mask = 0xff;
2410
			tap->wt_flags |= IEEE80211_RADIOTAP_F_WEP;
1904
	tx->cck_mask = 0x0f;
1905
	tx->lifetime = htole32(WPI_LIFETIME_INFINITE);
1906
	tx->id = ismcast ? WPI_ID_BROADCAST : WPI_ID_BSS;
1907
	tx->len = htole16(m0->m_pkthdr.len);
1908
2411
2412
		ieee80211_radiotap_tx(vap, m);
2413
	}
2414
2415
	flags = 0;
1909
	if (!ismcast) {
2416
	if (!ismcast) {
1910
		if ((ni->ni_flags & IEEE80211_NODE_QOS) == 0 ||
2417
		/* Unicast frame, check if an ACK is expected. */
1911
		    !cap->cap_wmeParams[ac].wmep_noackPolicy)
2418
		if (!qos || (qos & IEEE80211_QOS_ACKPOLICY) !=
1912
			tx->flags |= htole32(WPI_TX_NEED_ACK);
2419
		    IEEE80211_QOS_ACKPOLICY_NOACK)
1913
		if (m0->m_pkthdr.len + IEEE80211_CRC_LEN > vap->iv_rtsthreshold) {
2420
			flags |= WPI_TX_NEED_ACK;
1914
			tx->flags |= htole32(WPI_TX_NEED_RTS|WPI_TX_FULL_TXOP);
2421
	}
1915
			tx->rts_ntries = 7;
2422
2423
	/* Check if frame must be protected using RTS/CTS or CTS-to-self. */
2424
	if (!ismcast) {
2425
		/* NB: Group frames are sent using CCK in 802.11b/g. */
2426
		if (totlen + IEEE80211_CRC_LEN > vap->iv_rtsthreshold) {
2427
			flags |= WPI_TX_NEED_RTS;
2428
		} else if ((ic->ic_flags & IEEE80211_F_USEPROT) &&
2429
		    WPI_RATE_IS_OFDM(rate)) {
2430
			if (ic->ic_protmode == IEEE80211_PROT_CTSONLY)
2431
				flags |= WPI_TX_NEED_CTS;
2432
			else if (ic->ic_protmode == IEEE80211_PROT_RTSCTS)
2433
				flags |= WPI_TX_NEED_RTS;
1916
		}
2434
		}
2435
2436
		if (flags & (WPI_TX_NEED_RTS | WPI_TX_NEED_CTS))
2437
			flags |= WPI_TX_FULL_TXOP;
1917
	}
2438
	}
1918
	/* pick a rate */
2439
1919
	tp = &vap->iv_txparms[ieee80211_chan2mode(ni->ni_chan)];
2440
	memset(&tx, 0, sizeof (struct wpi_cmd_data));
1920
	if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_MGT) {
2441
	if (type == IEEE80211_FC0_TYPE_MGT) {
1921
		uint8_t subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;
2442
		uint8_t subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;
1922
		/* tell h/w to set timestamp in probe responses */
2443
2444
		/* Tell HW to set timestamp in probe responses. */
1923
		if (subtype == IEEE80211_FC0_SUBTYPE_PROBE_RESP)
2445
		if (subtype == IEEE80211_FC0_SUBTYPE_PROBE_RESP)
1924
			tx->flags |= htole32(WPI_TX_INSERT_TSTAMP);
2446
			flags |= WPI_TX_INSERT_TSTAMP;
1925
		if (subtype == IEEE80211_FC0_SUBTYPE_ASSOC_REQ ||
2447
		if (subtype == IEEE80211_FC0_SUBTYPE_ASSOC_REQ ||
1926
		    subtype == IEEE80211_FC0_SUBTYPE_REASSOC_REQ)
2448
		    subtype == IEEE80211_FC0_SUBTYPE_REASSOC_REQ)
1927
			tx->timeout = htole16(3);
2449
			tx.timeout = htole16(3);
1928
		else
2450
		else
1929
			tx->timeout = htole16(2);
2451
			tx.timeout = htole16(2);
1930
		rate = tp->mgmtrate;
1931
	} else if (ismcast) {
1932
		rate = tp->mcastrate;
1933
	} else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) {
1934
		rate = tp->ucastrate;
1935
	} else {
1936
		(void) ieee80211_ratectl_rate(ni, NULL, 0);
1937
		rate = ni->ni_txrate;
1938
	}
2452
	}
1939
	tx->rate = wpi_plcp_signal(rate);
1940
2453
1941
	/* be very persistant at sending frames out */
2454
	if (ismcast || type != IEEE80211_FC0_TYPE_DATA)
1942
#if 0
2455
		tx.id = WPI_ID_BROADCAST;
1943
	tx->data_ntries = tp->maxretry;
2456
	else {
1944
#else
2457
		if (wn->id == WPI_ID_UNDEFINED &&
1945
	tx->data_ntries = 15;		/* XXX way too high */
2458
		    (vap->iv_opmode == IEEE80211_M_IBSS ||
1946
#endif
2459
		    vap->iv_opmode == IEEE80211_M_AHDEMO)) {
2460
			error = wpi_add_ibss_node(sc, ni);
2461
			if (error != 0) {
2462
				device_printf(sc->sc_dev,
2463
				    "%s: could not add IBSS node, error %d\n",
2464
				    __func__, error);
2465
				goto fail;
2466
			}
2467
		}
1947
2468
2469
		if (wn->id == WPI_ID_UNDEFINED) {
2470
			device_printf(sc->sc_dev,
2471
			    "%s: undefined node id\n", __func__);
2472
			error = EINVAL;
2473
			goto fail;
2474
		}
2475
2476
		tx.id = wn->id;
2477
	}
2478
2479
	if (type != IEEE80211_FC0_TYPE_MGT)
2480
		tx.data_ntries = tp->maxretry;
2481
2482
	tx.len = htole16(totlen);
2483
	tx.flags = htole32(flags);
2484
	tx.plcp = rate2plcp(rate);
2485
	tx.tid = tid;
2486
	tx.lifetime = htole32(WPI_LIFETIME_INFINITE);
2487
	tx.ofdm_mask = 0xff;
2488
	tx.cck_mask = 0x0f;
2489
	tx.rts_ntries = 7;
2490
2491
	if (k != NULL && k->wk_cipher->ic_cipher == IEEE80211_CIPHER_AES_CCM) {
2492
		if (!(k->wk_flags & IEEE80211_KEY_SWCRYPT)) {
2493
			tx.security = WPI_CIPHER_CCMP;
2494
			memcpy(tx.key, k->wk_key, k->wk_keylen);
2495
		}
2496
	}
2497
2498
	tx_data.data = &tx;
2499
	tx_data.ni = ni;
2500
	tx_data.m = m;
2501
	tx_data.size = sizeof(tx);
2502
	tx_data.code = WPI_CMD_TX_DATA;
2503
	tx_data.ac = ac;
2504
2505
	return wpi_cmd2(sc, &tx_data);
2506
2507
fail:	m_freem(m);
2508
	return error;
2509
}
2510
2511
static int
2512
wpi_tx_data_raw(struct wpi_softc *sc, struct mbuf *m, struct ieee80211_node *ni,
2513
    const struct ieee80211_bpf_params *params)
2514
{
2515
	struct ieee80211vap *vap = ni->ni_vap;
2516
	struct ieee80211_frame *wh;
2517
	struct wpi_cmd_data tx;
2518
	struct wpi_buf tx_data;
2519
	uint32_t flags;
2520
	uint8_t type;
2521
	int ac, rate, totlen;
2522
2523
	wh = mtod(m, struct ieee80211_frame *);
2524
	type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
2525
	totlen = m->m_pkthdr.len;
2526
2527
	ac = params->ibp_pri & 3;
2528
2529
	/* Choose a TX rate index. */
2530
	rate = params->ibp_rate0;
2531
2532
	flags = 0;
2533
	if ((params->ibp_flags & IEEE80211_BPF_NOACK) == 0)
2534
		flags |= WPI_TX_NEED_ACK;
2535
	if (params->ibp_flags & IEEE80211_BPF_RTS)
2536
		flags |= WPI_TX_NEED_RTS;
2537
	if (params->ibp_flags & IEEE80211_BPF_CTS)
2538
		flags |= WPI_TX_NEED_CTS;
2539
	if (flags & (WPI_TX_NEED_RTS | WPI_TX_NEED_CTS))
2540
		flags |= WPI_TX_FULL_TXOP;
2541
1948
	if (ieee80211_radiotap_active_vap(vap)) {
2542
	if (ieee80211_radiotap_active_vap(vap)) {
1949
		struct wpi_tx_radiotap_header *tap = &sc->sc_txtap;
2543
		struct wpi_tx_radiotap_header *tap = &sc->sc_txtap;
2544
1950
		tap->wt_flags = 0;
2545
		tap->wt_flags = 0;
1951
		tap->wt_rate = rate;
2546
		tap->wt_rate = rate;
1952
		tap->wt_hwqueue = ac;
1953
		if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED)
1954
			tap->wt_flags |= IEEE80211_RADIOTAP_F_WEP;
1955
2547
1956
		ieee80211_radiotap_tx(vap, m0);
2548
		ieee80211_radiotap_tx(vap, m);
1957
	}
2549
	}
1958
2550
1959
	/* save and trim IEEE802.11 header */
2551
	memset(&tx, 0, sizeof (struct wpi_cmd_data));
1960
	m_copydata(m0, 0, hdrlen, (caddr_t)&tx->wh);
2552
	if (type == IEEE80211_FC0_TYPE_MGT) {
1961
	m_adj(m0, hdrlen);
2553
		uint8_t subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;
1962
2554
1963
	error = bus_dmamap_load_mbuf_sg(ring->data_dmat, data->map, m0, segs,
2555
		/* Tell HW to set timestamp in probe responses. */
1964
	    &nsegs, BUS_DMA_NOWAIT);
2556
		if (subtype == IEEE80211_FC0_SUBTYPE_PROBE_RESP)
1965
	if (error != 0 && error != EFBIG) {
2557
			flags |= WPI_TX_INSERT_TSTAMP;
1966
		device_printf(sc->sc_dev, "could not map mbuf (error %d)\n",
2558
		if (subtype == IEEE80211_FC0_SUBTYPE_ASSOC_REQ ||
1967
		    error);
2559
		    subtype == IEEE80211_FC0_SUBTYPE_REASSOC_REQ)
1968
		m_freem(m0);
2560
			tx.timeout = htole16(3);
1969
		return error;
2561
		else
2562
			tx.timeout = htole16(2);
1970
	}
2563
	}
1971
	if (error != 0) {
1972
		/* XXX use m_collapse */
1973
		mnew = m_defrag(m0, M_NOWAIT);
1974
		if (mnew == NULL) {
1975
			device_printf(sc->sc_dev,
1976
			    "could not defragment mbuf\n");
1977
			m_freem(m0);
1978
			return ENOBUFS;
1979
		}
1980
		m0 = mnew;
1981
2564
1982
		error = bus_dmamap_load_mbuf_sg(ring->data_dmat, data->map,
2565
	tx.len = htole16(totlen);
1983
		    m0, segs, &nsegs, BUS_DMA_NOWAIT);
2566
	tx.flags = htole32(flags);
1984
		if (error != 0) {
2567
	tx.plcp = rate2plcp(rate);
1985
			device_printf(sc->sc_dev,
2568
	tx.id = WPI_ID_BROADCAST;
1986
			    "could not map mbuf (error %d)\n", error);
2569
	tx.lifetime = htole32(WPI_LIFETIME_INFINITE);
1987
			m_freem(m0);
2570
	tx.rts_ntries = params->ibp_try1;
1988
			return error;
2571
	tx.data_ntries = params->ibp_try0;
1989
		}
2572
2573
	tx_data.data = &tx;
2574
	tx_data.ni = ni;
2575
	tx_data.m = m;
2576
	tx_data.size = sizeof(tx);
2577
	tx_data.code = WPI_CMD_TX_DATA;
2578
	tx_data.ac = ac;
2579
2580
	return wpi_cmd2(sc, &tx_data);
2581
}
2582
2583
static int
2584
wpi_raw_xmit(struct ieee80211_node *ni, struct mbuf *m,
2585
    const struct ieee80211_bpf_params *params)
2586
{
2587
	struct ieee80211com *ic = ni->ni_ic;
2588
	struct ifnet *ifp = ic->ic_ifp;
2589
	struct wpi_softc *sc = ifp->if_softc;
2590
	int error = 0;
2591
2592
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_BEGIN, __func__);
2593
2594
	if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
2595
		ieee80211_free_node(ni);
2596
		m_freem(m);
2597
		return ENETDOWN;
1990
	}
2598
	}
1991
2599
1992
	data->m = m0;
2600
	WPI_LOCK(sc);
1993
	data->ni = ni;
2601
	if (params == NULL) {
2602
		/*
2603
		 * Legacy path; interpret frame contents to decide
2604
		 * precisely how to send the frame.
2605
		 */
2606
		error = wpi_tx_data(sc, m, ni);
2607
	} else {
2608
		/*
2609
		 * Caller supplied explicit parameters to use in
2610
		 * sending the frame.
2611
		 */
2612
		error = wpi_tx_data_raw(sc, m, ni, params);
2613
	}
2614
	WPI_UNLOCK(sc);
1994
2615
1995
	DPRINTFN(WPI_DEBUG_TX, ("sending data: qid=%d idx=%d len=%d nsegs=%d\n",
2616
	if (error != 0) {
1996
	    ring->qid, ring->cur, m0->m_pkthdr.len, nsegs));
2617
		/* NB: m is reclaimed on tx failure */
2618
		ieee80211_free_node(ni);
2619
		if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
1997
2620
1998
	/* first scatter/gather segment is used by the tx data command */
2621
		DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END_ERR, __func__);
1999
	desc->flags = htole32(WPI_PAD32(m0->m_pkthdr.len) << 28 |
2622
2000
	    (1 + nsegs) << 24);
2623
		return error;
2001
	desc->segs[0].addr = htole32(ring->cmd_dma.paddr +
2002
	    ring->cur * sizeof (struct wpi_tx_cmd));
2003
	desc->segs[0].len  = htole32(4 + sizeof (struct wpi_cmd_data));
2004
	for (i = 1; i <= nsegs; i++) {
2005
		desc->segs[i].addr = htole32(segs[i - 1].ds_addr);
2006
		desc->segs[i].len  = htole32(segs[i - 1].ds_len);
2007
	}
2624
	}
2008
2625
2009
	bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_PREWRITE);
2626
	sc->sc_tx_timer = 5;
2010
	bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map,
2011
	    BUS_DMASYNC_PREWRITE);
2012
2627
2013
	ring->queued++;
2628
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END, __func__);
2014
2629
2015
	/* kick ring */
2016
	ring->cur = (ring->cur + 1) % WPI_TX_RING_COUNT;
2017
	WPI_WRITE(sc, WPI_TX_WIDX, ring->qid << 8 | ring->cur);
2018
2019
	return 0;
2630
	return 0;
2020
}
2631
}
2021
2632
Lines 2038-2109 Link Here
2038
	struct wpi_softc *sc = ifp->if_softc;
2649
	struct wpi_softc *sc = ifp->if_softc;
2039
	struct ieee80211_node *ni;
2650
	struct ieee80211_node *ni;
2040
	struct mbuf *m;
2651
	struct mbuf *m;
2041
	int ac;
2042
2652
2043
	WPI_LOCK_ASSERT(sc);
2653
	WPI_LOCK_ASSERT(sc);
2044
2654
2045
	if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
2655
	DPRINTF(sc, WPI_DEBUG_XMIT, "%s: called\n", __func__);
2656
2657
	if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0 ||
2658
	    (ifp->if_drv_flags & IFF_DRV_OACTIVE))
2046
		return;
2659
		return;
2047
2660
2048
	for (;;) {
2661
	for (;;) {
2662
		if (sc->qfullmsk != 0) {
2663
			ifp->if_drv_flags |= IFF_DRV_OACTIVE;
2664
			break;
2665
		}
2049
		IFQ_DRV_DEQUEUE(&ifp->if_snd, m);
2666
		IFQ_DRV_DEQUEUE(&ifp->if_snd, m);
2050
		if (m == NULL)
2667
		if (m == NULL)
2051
			break;
2668
			break;
2052
		ac = M_WME_GETAC(m);
2669
		ni = (struct ieee80211_node *)m->m_pkthdr.rcvif;
2053
		if (sc->txq[ac].queued > sc->txq[ac].count - 8) {
2670
		if (wpi_tx_data(sc, m, ni) != 0) {
2054
			/* there is no place left in this ring */
2671
			WPI_UNLOCK(sc);
2055
			IFQ_DRV_PREPEND(&ifp->if_snd, m);
2056
			ifp->if_drv_flags |= IFF_DRV_OACTIVE;
2057
			break;
2058
		}
2059
		ni = (struct ieee80211_node *) m->m_pkthdr.rcvif;
2060
		if (wpi_tx_data(sc, m, ni, ac) != 0) {
2061
			ieee80211_free_node(ni);
2672
			ieee80211_free_node(ni);
2673
			WPI_LOCK(sc);
2062
			if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
2674
			if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
2063
			break;
2675
		} else
2064
		}
2676
			sc->sc_tx_timer = 5;
2065
		sc->sc_tx_timer = 5;
2066
	}
2677
	}
2678
2679
	DPRINTF(sc, WPI_DEBUG_XMIT, "%s: done\n", __func__);
2067
}
2680
}
2068
2681
2069
static int
2682
static void
2070
wpi_raw_xmit(struct ieee80211_node *ni, struct mbuf *m,
2683
wpi_watchdog_rfkill(void *arg)
2071
	const struct ieee80211_bpf_params *params)
2072
{
2684
{
2073
	struct ieee80211com *ic = ni->ni_ic;
2685
	struct wpi_softc *sc = arg;
2074
	struct ifnet *ifp = ic->ic_ifp;
2686
	struct ifnet *ifp = sc->sc_ifp;
2075
	struct wpi_softc *sc = ifp->if_softc;
2687
	struct ieee80211com *ic = ifp->if_l2com;
2076
2688
2077
	/* prevent management frames from being sent if we're not ready */
2689
	DPRINTF(sc, WPI_DEBUG_WATCHDOG, "RFkill Watchdog: tick\n");
2078
	if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
2690
2079
		m_freem(m);
2691
	/* No need to lock firmware memory. */
2080
		ieee80211_free_node(ni);
2692
	if ((wpi_prph_read(sc, WPI_APMG_RFKILL) & 0x1) == 0) {
2081
		return ENETDOWN;
2693
		/* Radio kill switch is still off. */
2694
		callout_reset(&sc->watchdog_rfkill, hz, wpi_watchdog_rfkill,
2695
		    sc);
2696
	} else
2697
		ieee80211_runtask(ic, &sc->sc_radioon_task);
2698
}
2699
2700
/**
2701
 * Called every second, wpi_watchdog used by the watch dog timer
2702
 * to check that the card is still alive
2703
 */
2704
static void
2705
wpi_watchdog(void *arg)
2706
{
2707
	struct wpi_softc *sc = arg;
2708
	struct ifnet *ifp = sc->sc_ifp;
2709
	struct ieee80211com *ic = ifp->if_l2com;
2710
2711
	DPRINTF(sc, WPI_DEBUG_WATCHDOG, "Watchdog: tick\n");
2712
2713
	if (sc->sc_tx_timer > 0) {
2714
		if (--sc->sc_tx_timer == 0) {
2715
			if_printf(ifp, "device timeout\n");
2716
			if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
2717
			ieee80211_runtask(ic, &sc->sc_reinittask);
2718
		}
2082
	}
2719
	}
2083
	WPI_LOCK(sc);
2084
2720
2085
	/* management frames go into ring 0 */
2721
	if (sc->sc_scan_timer > 0) {
2086
	if (sc->txq[0].queued > sc->txq[0].count - 8) {
2722
		struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
2087
		ifp->if_drv_flags |= IFF_DRV_OACTIVE;
2723
		if (--sc->sc_scan_timer == 0 && vap != NULL) {
2088
		m_freem(m);
2724
			if_printf(ifp, "scan timeout\n");
2089
		WPI_UNLOCK(sc);
2725
			ieee80211_cancel_scan(vap);
2090
		ieee80211_free_node(ni);
2726
			ieee80211_runtask(ic, &sc->sc_reinittask);
2091
		return ENOBUFS;		/* XXX */
2727
		}
2092
	}
2728
	}
2093
2729
2094
	if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
2730
	if (ifp->if_drv_flags & IFF_DRV_RUNNING)
2095
	if (wpi_tx_data(sc, m, ni, 0) != 0)
2731
		callout_reset(&sc->watchdog_to, hz, wpi_watchdog, sc);
2096
		goto bad;
2097
	sc->sc_tx_timer = 5;
2098
	callout_reset(&sc->watchdog_to, hz, wpi_watchdog, sc);
2099
2100
	WPI_UNLOCK(sc);
2101
	return 0;
2102
bad:
2103
	if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
2104
	WPI_UNLOCK(sc);
2105
	ieee80211_free_node(ni);
2106
	return EIO;		/* XXX */
2107
}
2732
}
2108
2733
2109
static int
2734
static int
Lines 2111-2140 Link Here
2111
{
2736
{
2112
	struct wpi_softc *sc = ifp->if_softc;
2737
	struct wpi_softc *sc = ifp->if_softc;
2113
	struct ieee80211com *ic = ifp->if_l2com;
2738
	struct ieee80211com *ic = ifp->if_l2com;
2739
	struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
2114
	struct ifreq *ifr = (struct ifreq *) data;
2740
	struct ifreq *ifr = (struct ifreq *) data;
2115
	int error = 0, startall = 0;
2741
	int error = 0, startall = 0, stop = 0;
2116
2742
2117
	switch (cmd) {
2743
	switch (cmd) {
2744
	case SIOCGIFADDR:
2745
		error = ether_ioctl(ifp, cmd, data);
2746
		break;
2118
	case SIOCSIFFLAGS:
2747
	case SIOCSIFFLAGS:
2119
		WPI_LOCK(sc);
2748
		WPI_LOCK(sc);
2120
		if ((ifp->if_flags & IFF_UP)) {
2749
		if (ifp->if_flags & IFF_UP) {
2121
			if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
2750
			if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
2122
				wpi_init_locked(sc, 0);
2751
				wpi_init_locked(sc);
2123
				startall = 1;
2752
				if (WPI_READ(sc, WPI_GP_CNTRL) &
2753
				    WPI_GP_CNTRL_RFKILL)
2754
					startall = 1;
2755
				else
2756
					stop = 1;
2124
			}
2757
			}
2125
		} else if ((ifp->if_drv_flags & IFF_DRV_RUNNING) ||
2758
		} else if (ifp->if_drv_flags & IFF_DRV_RUNNING)
2126
			   (sc->flags & WPI_FLAG_HW_RADIO_OFF))
2127
			wpi_stop_locked(sc);
2759
			wpi_stop_locked(sc);
2128
		WPI_UNLOCK(sc);
2760
		WPI_UNLOCK(sc);
2129
		if (startall)
2761
		if (startall)
2130
			ieee80211_start_all(ic);
2762
			ieee80211_start_all(ic);
2763
		else if (vap != NULL && stop)
2764
			ieee80211_stop(vap);
2131
		break;
2765
		break;
2132
	case SIOCGIFMEDIA:
2766
	case SIOCGIFMEDIA:
2133
		error = ifmedia_ioctl(ifp, ifr, &ic->ic_media, cmd);
2767
		error = ifmedia_ioctl(ifp, ifr, &ic->ic_media, cmd);
2134
		break;
2768
		break;
2135
	case SIOCGIFADDR:
2136
		error = ether_ioctl(ifp, cmd, data);
2137
		break;
2138
	default:
2769
	default:
2139
		error = EINVAL;
2770
		error = EINVAL;
2140
		break;
2771
		break;
Lines 2143-2193 Link Here
2143
}
2774
}
2144
2775
2145
/*
2776
/*
2146
 * Extract various information from EEPROM.
2147
 */
2148
static void
2149
wpi_read_eeprom(struct wpi_softc *sc, uint8_t macaddr[IEEE80211_ADDR_LEN])
2150
{
2151
	int i;
2152
2153
	/* read the hardware capabilities, revision and SKU type */
2154
	wpi_read_prom_data(sc, WPI_EEPROM_CAPABILITIES, &sc->cap,1);
2155
	wpi_read_prom_data(sc, WPI_EEPROM_REVISION, &sc->rev,2);
2156
	wpi_read_prom_data(sc, WPI_EEPROM_TYPE, &sc->type, 1);
2157
2158
	/* read the regulatory domain */
2159
	wpi_read_prom_data(sc, WPI_EEPROM_DOMAIN, sc->domain, 4);
2160
2161
	/* read in the hw MAC address */
2162
	wpi_read_prom_data(sc, WPI_EEPROM_MAC, macaddr, 6);
2163
2164
	/* read the list of authorized channels */
2165
	for (i = 0; i < WPI_CHAN_BANDS_COUNT; i++)
2166
		wpi_read_eeprom_channels(sc,i);
2167
2168
	/* read the power level calibration info for each group */
2169
	for (i = 0; i < WPI_POWER_GROUPS_COUNT; i++)
2170
		wpi_read_eeprom_group(sc,i);
2171
}
2172
2173
/*
2174
 * Send a command to the firmware.
2777
 * Send a command to the firmware.
2175
 */
2778
 */
2176
static int
2779
static int
2177
wpi_cmd(struct wpi_softc *sc, int code, const void *buf, int size, int async)
2780
wpi_cmd(struct wpi_softc *sc, int code, const void *buf, size_t size,
2781
    int async)
2178
{
2782
{
2179
	struct wpi_tx_ring *ring = &sc->cmdq;
2783
	struct wpi_tx_ring *ring = &sc->txq[4];
2180
	struct wpi_tx_desc *desc;
2784
	struct wpi_tx_desc *desc;
2785
	struct wpi_tx_data *data;
2181
	struct wpi_tx_cmd *cmd;
2786
	struct wpi_tx_cmd *cmd;
2787
	struct mbuf *m;
2788
	bus_addr_t paddr;
2789
	int totlen, error;
2182
2790
2183
#ifdef WPI_DEBUG
2791
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_BEGIN, __func__);
2184
	if (!async) {
2792
2793
	if (async == 0)
2185
		WPI_LOCK_ASSERT(sc);
2794
		WPI_LOCK_ASSERT(sc);
2186
	}
2187
#endif
2188
2795
2189
	DPRINTFN(WPI_DEBUG_CMD,("wpi_cmd %d size %d async %d\n", code, size,
2796
	DPRINTF(sc, WPI_DEBUG_CMD, "wpi_cmd %s size %zu async %d\n",
2190
		    async));
2797
	    wpi_cmd_str(code), size, async);
2191
2798
2192
	if (sc->flags & WPI_FLAG_BUSY) {
2799
	if (sc->flags & WPI_FLAG_BUSY) {
2193
		device_printf(sc->sc_dev, "%s: cmd %d not sent, busy\n",
2800
		device_printf(sc->sc_dev, "%s: cmd %d not sent, busy\n",
Lines 2194-2207 Link Here
2194
		    __func__, code);
2801
		    __func__, code);
2195
		return EAGAIN;
2802
		return EAGAIN;
2196
	}
2803
	}
2197
	sc->flags|= WPI_FLAG_BUSY;
2804
	sc->flags |= WPI_FLAG_BUSY;
2198
2805
2199
	KASSERT(size <= sizeof cmd->data, ("command %d too large: %d bytes",
2200
	    code, size));
2201
2202
	desc = &ring->desc[ring->cur];
2806
	desc = &ring->desc[ring->cur];
2203
	cmd = &ring->cmd[ring->cur];
2807
	data = &ring->data[ring->cur];
2808
	totlen = 4 + size;
2204
2809
2810
	if (size > sizeof cmd->data) {
2811
		/* Command is too large to fit in a descriptor. */
2812
		if (totlen > MCLBYTES)
2813
			return EINVAL;
2814
		m = m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR, MJUMPAGESIZE);
2815
		if (m == NULL)
2816
			return ENOMEM;
2817
		cmd = mtod(m, struct wpi_tx_cmd *);
2818
		error = bus_dmamap_load(ring->data_dmat, data->map, cmd,
2819
		    totlen, wpi_dma_map_addr, &paddr, BUS_DMA_NOWAIT);
2820
		if (error != 0) {
2821
			m_freem(m);
2822
			return error;
2823
		}
2824
		data->m = m;
2825
	} else {
2826
		cmd = &ring->cmd[ring->cur];
2827
		paddr = data->cmd_paddr;
2828
	}
2829
2205
	cmd->code = code;
2830
	cmd->code = code;
2206
	cmd->flags = 0;
2831
	cmd->flags = 0;
2207
	cmd->qid = ring->qid;
2832
	cmd->qid = ring->qid;
Lines 2208-2224 Link Here
2208
	cmd->idx = ring->cur;
2833
	cmd->idx = ring->cur;
2209
	memcpy(cmd->data, buf, size);
2834
	memcpy(cmd->data, buf, size);
2210
2835
2211
	desc->flags = htole32(WPI_PAD32(size) << 28 | 1 << 24);
2836
	desc->nsegs = 1 + (WPI_PAD32(size) << 4);
2212
	desc->segs[0].addr = htole32(ring->cmd_dma.paddr +
2837
	desc->segs[0].addr = htole32(paddr);
2213
		ring->cur * sizeof (struct wpi_tx_cmd));
2838
	desc->segs[0].len  = htole32(totlen);
2214
	desc->segs[0].len  = htole32(4 + size);
2215
2839
2216
	/* kick cmd ring */
2840
	if (size > sizeof cmd->data) {
2217
	ring->cur = (ring->cur + 1) % WPI_CMD_RING_COUNT;
2841
		bus_dmamap_sync(ring->data_dmat, data->map,
2218
	WPI_WRITE(sc, WPI_TX_WIDX, ring->qid << 8 | ring->cur);
2842
		    BUS_DMASYNC_PREWRITE);
2843
	} else {
2844
		bus_dmamap_sync(ring->data_dmat, ring->cmd_dma.map,
2845
		    BUS_DMASYNC_PREWRITE);
2846
	}
2847
	bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map,
2848
	    BUS_DMASYNC_PREWRITE);
2219
2849
2850
	/* Kick command ring. */
2851
	ring->cur = (ring->cur + 1) % WPI_TX_RING_COUNT;
2852
	wpi_update_tx_ring(sc, ring);
2853
2854
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END, __func__);
2855
2220
	if (async) {
2856
	if (async) {
2221
		sc->flags &= ~ WPI_FLAG_BUSY;
2857
		sc->flags &= ~WPI_FLAG_BUSY;
2222
		return 0;
2858
		return 0;
2223
	}
2859
	}
2224
2860
Lines 2225-2263 Link Here
2225
	return msleep(cmd, &sc->sc_mtx, PCATCH, "wpicmd", hz);
2861
	return msleep(cmd, &sc->sc_mtx, PCATCH, "wpicmd", hz);
2226
}
2862
}
2227
2863
2228
static int
2229
wpi_wme_update(struct ieee80211com *ic)
2230
{
2231
#define WPI_EXP2(v)	htole16((1 << (v)) - 1)
2232
#define WPI_USEC(v)	htole16(IEEE80211_TXOP_TO_US(v))
2233
	struct wpi_softc *sc = ic->ic_ifp->if_softc;
2234
	const struct wmeParams *wmep;
2235
	struct wpi_wme_setup wme;
2236
	int ac;
2237
2238
	/* don't override default WME values if WME is not actually enabled */
2239
	if (!(ic->ic_flags & IEEE80211_F_WME))
2240
		return 0;
2241
2242
	wme.flags = 0;
2243
	for (ac = 0; ac < WME_NUM_AC; ac++) {
2244
		wmep = &ic->ic_wme.wme_chanParams.cap_wmeParams[ac];
2245
		wme.ac[ac].aifsn = wmep->wmep_aifsn;
2246
		wme.ac[ac].cwmin = WPI_EXP2(wmep->wmep_logcwmin);
2247
		wme.ac[ac].cwmax = WPI_EXP2(wmep->wmep_logcwmax);
2248
		wme.ac[ac].txop  = WPI_USEC(wmep->wmep_txopLimit);
2249
2250
		DPRINTF(("setting WME for queue %d aifsn=%d cwmin=%d cwmax=%d "
2251
		    "txop=%d\n", ac, wme.ac[ac].aifsn, wme.ac[ac].cwmin,
2252
		    wme.ac[ac].cwmax, wme.ac[ac].txop));
2253
	}
2254
	return wpi_cmd(sc, WPI_CMD_SET_WME, &wme, sizeof wme, 1);
2255
#undef WPI_USEC
2256
#undef WPI_EXP2
2257
}
2258
2259
/*
2864
/*
2260
 * Configure h/w multi-rate retries.
2865
 * Configure HW multi-rate retries.
2261
 */
2866
 */
2262
static int
2867
static int
2263
wpi_mrr_setup(struct wpi_softc *sc)
2868
wpi_mrr_setup(struct wpi_softc *sc)
Lines 2267-2300 Link Here
2267
	struct wpi_mrr_setup mrr;
2872
	struct wpi_mrr_setup mrr;
2268
	int i, error;
2873
	int i, error;
2269
2874
2270
	memset(&mrr, 0, sizeof (struct wpi_mrr_setup));
2875
	/* CCK rates (not used with 802.11a). */
2271
2876
	for (i = WPI_RIDX_CCK1; i <= WPI_RIDX_CCK11; i++) {
2272
	/* CCK rates (not used with 802.11a) */
2273
	for (i = WPI_CCK1; i <= WPI_CCK11; i++) {
2274
		mrr.rates[i].flags = 0;
2877
		mrr.rates[i].flags = 0;
2275
		mrr.rates[i].signal = wpi_ridx_to_plcp[i];
2878
		mrr.rates[i].plcp = wpi_ridx_to_plcp[i];
2276
		/* fallback to the immediate lower CCK rate (if any) */
2879
		/* Fallback to the immediate lower CCK rate (if any.) */
2277
		mrr.rates[i].next = (i == WPI_CCK1) ? WPI_CCK1 : i - 1;
2880
		mrr.rates[i].next =
2278
		/* try one time at this rate before falling back to "next" */
2881
		    (i == WPI_RIDX_CCK1) ? WPI_RIDX_CCK1 : i - 1;
2882
		/* Try one time at this rate before falling back to "next". */
2279
		mrr.rates[i].ntries = 1;
2883
		mrr.rates[i].ntries = 1;
2280
	}
2884
	}
2281
2885
	/* OFDM rates (not used with 802.11b). */
2282
	/* OFDM rates (not used with 802.11b) */
2886
	for (i = WPI_RIDX_OFDM6; i <= WPI_RIDX_OFDM54; i++) {
2283
	for (i = WPI_OFDM6; i <= WPI_OFDM54; i++) {
2284
		mrr.rates[i].flags = 0;
2887
		mrr.rates[i].flags = 0;
2285
		mrr.rates[i].signal = wpi_ridx_to_plcp[i];
2888
		mrr.rates[i].plcp = wpi_ridx_to_plcp[i];
2286
		/* fallback to the immediate lower OFDM rate (if any) */
2889
		/* Fallback to the immediate lower rate (if any.) */
2287
		/* we allow fallback from OFDM/6 to CCK/2 in 11b/g mode */
2890
		/* We allow fallback from OFDM/6 to CCK/2 in 11b/g mode. */
2288
		mrr.rates[i].next = (i == WPI_OFDM6) ?
2891
		mrr.rates[i].next = (i == WPI_RIDX_OFDM6) ?
2289
		    ((ic->ic_curmode == IEEE80211_MODE_11A) ?
2892
		    ((ic->ic_curmode == IEEE80211_MODE_11A) ?
2290
			WPI_OFDM6 : WPI_CCK2) :
2893
			WPI_RIDX_OFDM6 : WPI_RIDX_CCK2) :
2291
		    i - 1;
2894
		    i - 1;
2292
		/* try one time at this rate before falling back to "next" */
2895
		/* Try one time at this rate before falling back to "next". */
2293
		mrr.rates[i].ntries = 1;
2896
		mrr.rates[i].ntries = 1;
2294
	}
2897
	}
2295
2898
	/* Setup MRR for control frames. */
2296
	/* setup MRR for control frames */
2899
	mrr.which = htole32(WPI_MRR_CTL);
2297
	mrr.which = WPI_MRR_CTL;
2298
	error = wpi_cmd(sc, WPI_CMD_MRR_SETUP, &mrr, sizeof mrr, 0);
2900
	error = wpi_cmd(sc, WPI_CMD_MRR_SETUP, &mrr, sizeof mrr, 0);
2299
	if (error != 0) {
2901
	if (error != 0) {
2300
		device_printf(sc->sc_dev,
2902
		device_printf(sc->sc_dev,
Lines 2301-2309 Link Here
2301
		    "could not setup MRR for control frames\n");
2903
		    "could not setup MRR for control frames\n");
2302
		return error;
2904
		return error;
2303
	}
2905
	}
2304
2906
	/* Setup MRR for data frames. */
2305
	/* setup MRR for data frames */
2907
	mrr.which = htole32(WPI_MRR_DATA);
2306
	mrr.which = WPI_MRR_DATA;
2307
	error = wpi_cmd(sc, WPI_CMD_MRR_SETUP, &mrr, sizeof mrr, 0);
2908
	error = wpi_cmd(sc, WPI_CMD_MRR_SETUP, &mrr, sizeof mrr, 0);
2308
	if (error != 0) {
2909
	if (error != 0) {
2309
		device_printf(sc->sc_dev,
2910
		device_printf(sc->sc_dev,
Lines 2310-2626 Link Here
2310
		    "could not setup MRR for data frames\n");
2911
		    "could not setup MRR for data frames\n");
2311
		return error;
2912
		return error;
2312
	}
2913
	}
2313
2314
	return 0;
2914
	return 0;
2315
}
2915
}
2316
2916
2917
static int
2918
wpi_add_node(struct wpi_softc *sc, struct ieee80211_node *ni)
2919
{
2920
	struct ieee80211com *ic = ni->ni_ic;
2921
	struct wpi_node *wn = (void *)ni;
2922
	struct wpi_node_info node;
2923
2924
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_DOING, __func__);
2925
2926
	if (wn->id == WPI_ID_UNDEFINED)
2927
		return EINVAL;
2928
2929
	memset(&node, 0, sizeof node);
2930
	IEEE80211_ADDR_COPY(node.macaddr, ni->ni_bssid);
2931
	node.id = wn->id;
2932
	node.plcp = (ic->ic_curmode == IEEE80211_MODE_11A) ?
2933
	    wpi_ridx_to_plcp[WPI_RIDX_OFDM6] : wpi_ridx_to_plcp[WPI_RIDX_CCK1];
2934
	node.action = htole32(WPI_ACTION_SET_RATE);
2935
	node.antenna = WPI_ANTENNA_BOTH;
2936
2937
	return wpi_cmd(sc, WPI_CMD_ADD_NODE, &node, sizeof node, 1);
2938
}
2939
2940
/*
2941
 * Broadcast node is used to send group-addressed and management frames.
2942
 */
2943
static int
2944
wpi_add_broadcast_node(struct wpi_softc *sc, int async)
2945
{
2946
	struct ifnet *ifp = sc->sc_ifp;
2947
	struct ieee80211com *ic = ifp->if_l2com;
2948
	struct wpi_node_info node;
2949
2950
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_DOING, __func__);
2951
2952
	memset(&node, 0, sizeof node);
2953
	IEEE80211_ADDR_COPY(node.macaddr, ifp->if_broadcastaddr);
2954
	node.id = WPI_ID_BROADCAST;
2955
	node.plcp = (ic->ic_curmode == IEEE80211_MODE_11A) ?
2956
	    wpi_ridx_to_plcp[WPI_RIDX_OFDM6] : wpi_ridx_to_plcp[WPI_RIDX_CCK1];
2957
	node.action = htole32(WPI_ACTION_SET_RATE);
2958
	node.antenna = WPI_ANTENNA_BOTH;
2959
2960
	return wpi_cmd(sc, WPI_CMD_ADD_NODE, &node, sizeof node, async);
2961
}
2962
2963
static int
2964
wpi_add_ibss_node(struct wpi_softc *sc, struct ieee80211_node *ni)
2965
{
2966
	struct wpi_node *wn = (void *)ni;
2967
2968
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_DOING, __func__);
2969
2970
	if (wn->id != WPI_ID_UNDEFINED)
2971
		return EINVAL;
2972
2973
	wn->id = alloc_unrl(sc->sc_unr);
2974
2975
	if (wn->id == (uint8_t)-1)
2976
		return ENOBUFS;
2977
2978
	return wpi_add_node(sc, ni);
2979
}
2980
2317
static void
2981
static void
2982
wpi_del_node(struct wpi_softc *sc, struct ieee80211_node *ni)
2983
{
2984
	struct wpi_node *wn = (void *)ni;
2985
	struct wpi_cmd_del_node node;
2986
	int error;
2987
2988
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_DOING, __func__);
2989
2990
	if (wn->id == WPI_ID_UNDEFINED) {
2991
		device_printf(sc->sc_dev, "%s: undefined node id passed\n",
2992
		    __func__);
2993
		return;
2994
	}
2995
2996
	memset(&node, 0, sizeof node);
2997
	IEEE80211_ADDR_COPY(node.macaddr, ni->ni_bssid);
2998
	node.count = 1;
2999
3000
	error = wpi_cmd(sc, WPI_CMD_DEL_NODE, &node, sizeof node, 1);
3001
	if (error != 0) {
3002
		device_printf(sc->sc_dev,
3003
		    "%s: could not delete node %u, error %d\n", __func__,
3004
		    wn->id, error);
3005
	}
3006
}
3007
3008
static int
3009
wpi_updateedca(struct ieee80211com *ic)
3010
{
3011
#define WPI_EXP2(x)	((1 << (x)) - 1)	/* CWmin = 2^ECWmin - 1 */
3012
	struct wpi_softc *sc = ic->ic_ifp->if_softc;
3013
	struct wpi_edca_params cmd;
3014
	int aci, error;
3015
3016
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_BEGIN, __func__);
3017
3018
	memset(&cmd, 0, sizeof cmd);
3019
	cmd.flags = htole32(WPI_EDCA_UPDATE);
3020
	for (aci = 0; aci < WME_NUM_AC; aci++) {
3021
		const struct wmeParams *ac =
3022
		    &ic->ic_wme.wme_chanParams.cap_wmeParams[aci];
3023
		cmd.ac[aci].aifsn = ac->wmep_aifsn;
3024
		cmd.ac[aci].cwmin = htole16(WPI_EXP2(ac->wmep_logcwmin));
3025
		cmd.ac[aci].cwmax = htole16(WPI_EXP2(ac->wmep_logcwmax));
3026
		cmd.ac[aci].txoplimit = 
3027
		    htole16(IEEE80211_TXOP_TO_US(ac->wmep_txopLimit));
3028
3029
		DPRINTF(sc, WPI_DEBUG_EDCA,
3030
		    "setting WME for queue %d aifsn=%d cwmin=%d cwmax=%d "
3031
		    "txoplimit=%d\n", aci, cmd.ac[aci].aifsn,
3032
		    cmd.ac[aci].cwmin, cmd.ac[aci].cwmax,
3033
		    cmd.ac[aci].txoplimit);
3034
	}
3035
	IEEE80211_UNLOCK(ic);
3036
	WPI_LOCK(sc);
3037
	error = wpi_cmd(sc, WPI_CMD_EDCA_PARAMS, &cmd, sizeof cmd, 1);
3038
	WPI_UNLOCK(sc);
3039
	IEEE80211_LOCK(ic);
3040
3041
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END, __func__);
3042
3043
	return error;
3044
#undef WPI_EXP2
3045
}
3046
3047
static void
3048
wpi_set_promisc(struct wpi_softc *sc)
3049
{
3050
	struct ifnet *ifp = sc->sc_ifp;
3051
	uint32_t promisc_filter;
3052
3053
	promisc_filter = WPI_FILTER_PROMISC | WPI_FILTER_CTL;
3054
3055
	if (ifp->if_flags & IFF_PROMISC)
3056
		sc->rxon.filter |= htole32(promisc_filter);
3057
	else
3058
		sc->rxon.filter &= ~htole32(promisc_filter);
3059
}
3060
3061
static void
3062
wpi_update_promisc(struct ifnet *ifp)
3063
{
3064
	struct wpi_softc *sc = ifp->if_softc;
3065
3066
	wpi_set_promisc(sc);
3067
3068
	WPI_LOCK(sc);
3069
	if (wpi_send_rxon(sc, 1, 1) != 0) {
3070
		device_printf(sc->sc_dev, "%s: could not send RXON\n",
3071
		    __func__);
3072
	}
3073
	WPI_UNLOCK(sc);
3074
}
3075
3076
static void
3077
wpi_update_mcast(struct ifnet *ifp)
3078
{
3079
	/* Ignore */
3080
}
3081
3082
static void
2318
wpi_set_led(struct wpi_softc *sc, uint8_t which, uint8_t off, uint8_t on)
3083
wpi_set_led(struct wpi_softc *sc, uint8_t which, uint8_t off, uint8_t on)
2319
{
3084
{
2320
	struct wpi_cmd_led led;
3085
	struct wpi_cmd_led led;
2321
3086
3087
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_DOING, __func__);
3088
2322
	led.which = which;
3089
	led.which = which;
2323
	led.unit = htole32(100000);	/* on/off in unit of 100ms */
3090
	led.unit = htole32(100000);	/* on/off in unit of 100ms */
2324
	led.off = off;
3091
	led.off = off;
2325
	led.on = on;
3092
	led.on = on;
2326
2327
	(void)wpi_cmd(sc, WPI_CMD_SET_LED, &led, sizeof led, 1);
3093
	(void)wpi_cmd(sc, WPI_CMD_SET_LED, &led, sizeof led, 1);
2328
}
3094
}
2329
3095
2330
static void
3096
static int
2331
wpi_enable_tsf(struct wpi_softc *sc, struct ieee80211_node *ni)
3097
wpi_set_timing(struct wpi_softc *sc, struct ieee80211_node *ni)
2332
{
3098
{
2333
	struct wpi_cmd_tsf tsf;
3099
	struct wpi_cmd_timing cmd;
2334
	uint64_t val, mod;
3100
	uint64_t val, mod;
2335
3101
2336
	memset(&tsf, 0, sizeof tsf);
3102
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_DOING, __func__);
2337
	memcpy(&tsf.tstamp, ni->ni_tstamp.data, 8);
2338
	tsf.bintval = htole16(ni->ni_intval);
2339
	tsf.lintval = htole16(10);
2340
3103
2341
	/* compute remaining time until next beacon */
3104
	memset(&cmd, 0, sizeof cmd);
2342
	val = (uint64_t)ni->ni_intval  * 1024;	/* msec -> usec */
3105
	memcpy(&cmd.tstamp, ni->ni_tstamp.data, sizeof (uint64_t));
2343
	mod = le64toh(tsf.tstamp) % val;
3106
	cmd.bintval = htole16(ni->ni_intval);
2344
	tsf.binitval = htole32((uint32_t)(val - mod));
3107
	cmd.lintval = htole16(10);
2345
3108
2346
	if (wpi_cmd(sc, WPI_CMD_TSF, &tsf, sizeof tsf, 1) != 0)
3109
	/* Compute remaining time until next beacon. */
2347
		device_printf(sc->sc_dev, "could not enable TSF\n");
3110
	val = (uint64_t)ni->ni_intval * IEEE80211_DUR_TU;
3111
	mod = le64toh(cmd.tstamp) % val;
3112
	cmd.binitval = htole32((uint32_t)(val - mod));
3113
3114
	DPRINTF(sc, WPI_DEBUG_RESET, "timing bintval=%u tstamp=%ju, init=%u\n",
3115
	    ni->ni_intval, le64toh(cmd.tstamp), (uint32_t)(val - mod));
3116
3117
	return wpi_cmd(sc, WPI_CMD_TIMING, &cmd, sizeof cmd, 1);
2348
}
3118
}
2349
3119
2350
#if 0
2351
/*
3120
/*
2352
 * Build a beacon frame that the firmware will broadcast periodically in
3121
 * This function is called periodically (every 60 seconds) to adjust output
2353
 * IBSS or HostAP modes.
3122
 * power to temperature changes.
2354
 */
3123
 */
3124
static void
3125
wpi_power_calibration(struct wpi_softc *sc)
3126
{
3127
	int temp;
3128
3129
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_DOING, __func__);
3130
3131
	/* Update sensor data. */
3132
	temp = (int)WPI_READ(sc, WPI_UCODE_GP2);
3133
	DPRINTF(sc, WPI_DEBUG_TEMP, "Temp in calibration is: %d\n", temp);
3134
3135
	/* Sanity-check read value. */
3136
	if (temp < -260 || temp > 25) {
3137
		/* This can't be correct, ignore. */
3138
		DPRINTF(sc, WPI_DEBUG_TEMP,
3139
		    "out-of-range temperature reported: %d\n", temp);
3140
		return;
3141
	}
3142
3143
	DPRINTF(sc, WPI_DEBUG_TEMP, "temperature %d->%d\n", sc->temp, temp);
3144
3145
	/* Adjust Tx power if need be. */
3146
	if (abs(temp - sc->temp) <= 6)
3147
		return;
3148
3149
	sc->temp = temp;
3150
3151
	if (wpi_set_txpower(sc, 1) != 0) {
3152
		/* just warn, too bad for the automatic calibration... */
3153
		device_printf(sc->sc_dev,"could not adjust Tx power\n");
3154
	}
3155
}
3156
3157
/*
3158
 * Set TX power for current channel.
3159
 */
2355
static int
3160
static int
2356
wpi_setup_beacon(struct wpi_softc *sc, struct ieee80211_node *ni)
3161
wpi_set_txpower(struct wpi_softc *sc, int async)
2357
{
3162
{
2358
	struct ifnet *ifp = sc->sc_ifp;
3163
	struct ifnet *ifp = sc->sc_ifp;
2359
	struct ieee80211com *ic = ifp->if_l2com;
3164
	struct ieee80211com *ic = ifp->if_l2com;
2360
	struct wpi_tx_ring *ring = &sc->cmdq;
3165
	struct ieee80211_channel *ch;
2361
	struct wpi_tx_desc *desc;
3166
	struct wpi_power_group *group;
2362
	struct wpi_tx_data *data;
3167
	struct wpi_cmd_txpower cmd;
2363
	struct wpi_tx_cmd *cmd;
3168
	uint8_t chan;
2364
	struct wpi_cmd_beacon *bcn;
3169
	int idx, i;
2365
	struct ieee80211_beacon_offsets bo;
2366
	struct mbuf *m0;
2367
	bus_addr_t physaddr;
2368
	int error;
2369
3170
2370
	desc = &ring->desc[ring->cur];
3171
	/* Retrieve current channel from last RXON. */
2371
	data = &ring->data[ring->cur];
3172
	chan = sc->rxon.chan;
3173
	ch = &ic->ic_channels[chan];
2372
3174
2373
	m0 = ieee80211_beacon_alloc(ic, ni, &bo);
3175
	/* Find the TX power group to which this channel belongs. */
2374
	if (m0 == NULL) {
3176
	if (IEEE80211_IS_CHAN_5GHZ(ch)) {
2375
		device_printf(sc->sc_dev, "could not allocate beacon frame\n");
3177
		for (group = &sc->groups[1]; group < &sc->groups[4]; group++)
2376
		return ENOMEM;
3178
			if (chan <= group->chan)
3179
				break;
3180
	} else
3181
		group = &sc->groups[0];
3182
3183
	memset(&cmd, 0, sizeof cmd);
3184
	cmd.band = IEEE80211_IS_CHAN_5GHZ(ch) ? 0 : 1;
3185
	cmd.chan = htole16(chan);
3186
3187
	/* Set TX power for all OFDM and CCK rates. */
3188
	for (i = 0; i <= WPI_RIDX_MAX ; i++) {
3189
		/* Retrieve TX power for this channel/rate. */
3190
		idx = wpi_get_power_index(sc, group, ch, i);
3191
3192
		cmd.rates[i].plcp = wpi_ridx_to_plcp[i];
3193
3194
		if (IEEE80211_IS_CHAN_5GHZ(ch)) {
3195
			cmd.rates[i].rf_gain = wpi_rf_gain_5ghz[idx];
3196
			cmd.rates[i].dsp_gain = wpi_dsp_gain_5ghz[idx];
3197
		} else {
3198
			cmd.rates[i].rf_gain = wpi_rf_gain_2ghz[idx];
3199
			cmd.rates[i].dsp_gain = wpi_dsp_gain_2ghz[idx];
3200
		}
3201
		DPRINTF(sc, WPI_DEBUG_TEMP,
3202
		    "chan %d/ridx %d: power index %d\n", chan, i, idx);
2377
	}
3203
	}
2378
3204
2379
	cmd = &ring->cmd[ring->cur];
3205
	return wpi_cmd(sc, WPI_CMD_TXPOWER, &cmd, sizeof cmd, async);
2380
	cmd->code = WPI_CMD_SET_BEACON;
3206
}
2381
	cmd->flags = 0;
2382
	cmd->qid = ring->qid;
2383
	cmd->idx = ring->cur;
2384
3207
2385
	bcn = (struct wpi_cmd_beacon *)cmd->data;
3208
/*
2386
	memset(bcn, 0, sizeof (struct wpi_cmd_beacon));
3209
 * Determine Tx power index for a given channel/rate combination.
2387
	bcn->id = WPI_ID_BROADCAST;
3210
 * This takes into account the regulatory information from EEPROM and the
2388
	bcn->ofdm_mask = 0xff;
3211
 * current temperature.
2389
	bcn->cck_mask = 0x0f;
3212
 */
2390
	bcn->lifetime = htole32(WPI_LIFETIME_INFINITE);
3213
static int
2391
	bcn->len = htole16(m0->m_pkthdr.len);
3214
wpi_get_power_index(struct wpi_softc *sc, struct wpi_power_group *group,
2392
	bcn->rate = (ic->ic_curmode == IEEE80211_MODE_11A) ?
3215
    struct ieee80211_channel *c, int ridx)
2393
		wpi_plcp_signal(12) : wpi_plcp_signal(2);
3216
{
2394
	bcn->flags = htole32(WPI_TX_AUTO_SEQ | WPI_TX_INSERT_TSTAMP);
3217
/* Fixed-point arithmetic division using a n-bit fractional part. */
3218
#define fdivround(a, b, n)      \
3219
	((((1 << n) * (a)) / (b) + (1 << n) / 2) / (1 << n))
2395
3220
2396
	/* save and trim IEEE802.11 header */
3221
/* Linear interpolation. */
2397
	m_copydata(m0, 0, sizeof (struct ieee80211_frame), (caddr_t)&bcn->wh);
3222
#define interpolate(x, x1, y1, x2, y2, n)       \
2398
	m_adj(m0, sizeof (struct ieee80211_frame));
3223
	((y1) + fdivround(((x) - (x1)) * ((y2) - (y1)), (x2) - (x1), n))
2399
3224
2400
	/* assume beacon frame is contiguous */
3225
	struct ifnet *ifp = sc->sc_ifp;
2401
	error = bus_dmamap_load(ring->data_dmat, data->map, mtod(m0, void *),
3226
	struct ieee80211com *ic = ifp->if_l2com;
2402
	    m0->m_pkthdr.len, wpi_dma_map_addr, &physaddr, 0);
3227
	struct wpi_power_sample *sample;
2403
	if (error != 0) {
3228
	int pwr, idx;
2404
		device_printf(sc->sc_dev, "could not map beacon\n");
3229
	u_int chan;
2405
		m_freem(m0);
3230
2406
		return error;
3231
	/* Get channel number. */
3232
	chan = ieee80211_chan2ieee(ic, c);
3233
3234
	/* Default TX power is group maximum TX power minus 3dB. */
3235
	pwr = group->maxpwr / 2;
3236
3237
	/* Decrease TX power for highest OFDM rates to reduce distortion. */
3238
	switch (ridx) {
3239
	case WPI_RIDX_OFDM36:
3240
		pwr -= IEEE80211_IS_CHAN_2GHZ(c) ? 0 :  5;
3241
		break;
3242
	case WPI_RIDX_OFDM48:
3243
		pwr -= IEEE80211_IS_CHAN_2GHZ(c) ? 7 : 10;
3244
		break;
3245
	case WPI_RIDX_OFDM54:
3246
		pwr -= IEEE80211_IS_CHAN_2GHZ(c) ? 9 : 12;
3247
		break;
2407
	}
3248
	}
2408
3249
2409
	data->m = m0;
3250
	/* Never exceed the channel maximum allowed TX power. */
3251
	pwr = min(pwr, sc->maxpwr[chan]);
2410
3252
2411
	/* first scatter/gather segment is used by the beacon command */
3253
	/* Retrieve TX power index into gain tables from samples. */
2412
	desc->flags = htole32(WPI_PAD32(m0->m_pkthdr.len) << 28 | 2 << 24);
3254
	for (sample = group->samples; sample < &group->samples[3]; sample++)
2413
	desc->segs[0].addr = htole32(ring->cmd_dma.paddr +
3255
		if (pwr > sample[1].power)
2414
		ring->cur * sizeof (struct wpi_tx_cmd));
3256
			break;
2415
	desc->segs[0].len  = htole32(4 + sizeof (struct wpi_cmd_beacon));
3257
	/* Fixed-point linear interpolation using a 19-bit fractional part. */
2416
	desc->segs[1].addr = htole32(physaddr);
3258
	idx = interpolate(pwr, sample[0].power, sample[0].index,
2417
	desc->segs[1].len  = htole32(m0->m_pkthdr.len);
3259
	    sample[1].power, sample[1].index, 19);
2418
3260
2419
	/* kick cmd ring */
3261
	/*-
2420
	ring->cur = (ring->cur + 1) % WPI_CMD_RING_COUNT;
3262
	 * Adjust power index based on current temperature:
2421
	WPI_WRITE(sc, WPI_TX_WIDX, ring->qid << 8 | ring->cur);
3263
	 * - if cooler than factory-calibrated: decrease output power
3264
	 * - if warmer than factory-calibrated: increase output power
3265
	 */
3266
	idx -= (sc->temp - group->temp) * 11 / 100;
2422
3267
2423
	return 0;
3268
	/* Decrease TX power for CCK rates (-5dB). */
3269
	if (ridx >= WPI_RIDX_CCK1)
3270
		idx += 10;
3271
3272
	/* Make sure idx stays in a valid range. */
3273
	if (idx < 0)
3274
		return 0;
3275
	if (idx > WPI_MAX_PWR_INDEX)
3276
		return WPI_MAX_PWR_INDEX;
3277
	return idx;
3278
3279
#undef interpolate
3280
#undef fdivround
2424
}
3281
}
2425
#endif
2426
3282
3283
/*
3284
 * Set STA mode power saving level (between 0 and 5).
3285
 * Level 0 is CAM (Continuously Aware Mode), 5 is for maximum power saving.
3286
 */
2427
static int
3287
static int
2428
wpi_auth(struct wpi_softc *sc, struct ieee80211vap *vap)
3288
wpi_set_pslevel(struct wpi_softc *sc, uint8_t dtim, int level, int async)
2429
{
3289
{
2430
	struct ieee80211com *ic = vap->iv_ic;
3290
	struct wpi_pmgt_cmd cmd;
2431
	struct ieee80211_node *ni = vap->iv_bss;
3291
	const struct wpi_pmgt *pmgt;
2432
	struct wpi_node_info node;
3292
	uint32_t max, skip_dtim;
3293
	uint32_t reg;
3294
	int i;
3295
3296
	DPRINTF(sc, WPI_DEBUG_PWRSAVE,
3297
	    "%s: dtim=%d, level=%d, async=%d\n",
3298
	    __func__, dtim, level, async);
3299
3300
	/* Select which PS parameters to use. */
3301
	if (dtim <= 10)
3302
		pmgt = &wpi_pmgt[0][level];
3303
	else
3304
		pmgt = &wpi_pmgt[1][level];
3305
3306
	memset(&cmd, 0, sizeof cmd);
3307
	if (level != 0)	/* not CAM */
3308
		cmd.flags |= htole16(WPI_PS_ALLOW_SLEEP);
3309
	/* Retrieve PCIe Active State Power Management (ASPM). */
3310
	reg = pci_read_config(sc->sc_dev, sc->sc_cap_off + 0x10, 1);
3311
	if (!(reg & 0x1))	/* L0s Entry disabled. */
3312
		cmd.flags |= htole16(WPI_PS_PCI_PMGT);
3313
3314
	cmd.rxtimeout = htole32(pmgt->rxtimeout * IEEE80211_DUR_TU);
3315
	cmd.txtimeout = htole32(pmgt->txtimeout * IEEE80211_DUR_TU);
3316
3317
	if (dtim == 0) {
3318
		dtim = 1;
3319
		skip_dtim = 0;
3320
	} else
3321
		skip_dtim = pmgt->skip_dtim;
3322
3323
	if (skip_dtim != 0) {
3324
		cmd.flags |= htole16(WPI_PS_SLEEP_OVER_DTIM);
3325
		max = pmgt->intval[4];
3326
		if (max == (uint32_t)-1)
3327
			max = dtim * (skip_dtim + 1);
3328
		else if (max > dtim)
3329
			max = (max / dtim) * dtim;
3330
	} else
3331
		max = dtim;
3332
3333
	for (i = 0; i < 5; i++)
3334
		cmd.intval[i] = htole32(MIN(max, pmgt->intval[i]));
3335
3336
	return wpi_cmd(sc, WPI_CMD_SET_POWER_MODE, &cmd, sizeof cmd, async);
3337
}
3338
3339
static int      
3340
wpi_send_btcoex(struct wpi_softc *sc)
3341
{
3342
	struct wpi_bluetooth cmd;
3343
3344
        memset(&cmd, 0, sizeof cmd);
3345
        cmd.flags = WPI_BT_COEX_MODE_4WIRE;
3346
        cmd.lead_time = WPI_BT_LEAD_TIME_DEF;
3347
        cmd.max_kill = WPI_BT_MAX_KILL_DEF;
3348
	DPRINTF(sc, WPI_DEBUG_RESET, "%s: configuring bluetooth coexistence\n",
3349
	    __func__);
3350
        return wpi_cmd(sc, WPI_CMD_BT_COEX, &cmd, sizeof(cmd), 0);
3351
}
3352
3353
static int
3354
wpi_send_rxon(struct wpi_softc *sc, int assoc, int async)
3355
{
2433
	int error;
3356
	int error;
2434
3357
3358
	if (assoc && (sc->rxon.filter & htole32(WPI_FILTER_BSS))) {
3359
		struct wpi_assoc rxon_assoc;
2435
3360
2436
	/* update adapter's configuration */
3361
		rxon_assoc.flags = sc->rxon.flags;
2437
	sc->config.associd = 0;
3362
		rxon_assoc.filter = sc->rxon.filter;
2438
	sc->config.filter &= ~htole32(WPI_FILTER_BSS);
3363
		rxon_assoc.ofdm_mask = sc->rxon.ofdm_mask;
2439
	IEEE80211_ADDR_COPY(sc->config.bssid, ni->ni_bssid);
3364
		rxon_assoc.cck_mask = sc->rxon.cck_mask;
2440
	sc->config.chan = ieee80211_chan2ieee(ic, ni->ni_chan);
3365
		rxon_assoc.reserved = 0;
2441
	if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan)) {
3366
2442
		sc->config.flags |= htole32(WPI_CONFIG_AUTO |
3367
		error = wpi_cmd(sc, WPI_CMD_RXON_ASSOC, &rxon_assoc,
2443
		    WPI_CONFIG_24GHZ);
3368
		    sizeof (struct wpi_assoc), async);
2444
	} else {
3369
	} else {
2445
		sc->config.flags &= ~htole32(WPI_CONFIG_AUTO |
3370
		error = wpi_cmd(sc, WPI_CMD_RXON, &sc->rxon,
2446
		    WPI_CONFIG_24GHZ);
3371
		    sizeof (struct wpi_rxon), async);
2447
	}
3372
	}
2448
	if (IEEE80211_IS_CHAN_A(ni->ni_chan)) {
2449
		sc->config.cck_mask  = 0;
2450
		sc->config.ofdm_mask = 0x15;
2451
	} else if (IEEE80211_IS_CHAN_B(ni->ni_chan)) {
2452
		sc->config.cck_mask  = 0x03;
2453
		sc->config.ofdm_mask = 0;
2454
	} else {
2455
		/* XXX assume 802.11b/g */
2456
		sc->config.cck_mask  = 0x0f;
2457
		sc->config.ofdm_mask = 0x15;
2458
	}
2459
2460
	DPRINTF(("config chan %d flags %x cck %x ofdm %x\n", sc->config.chan,
2461
		sc->config.flags, sc->config.cck_mask, sc->config.ofdm_mask));
2462
	error = wpi_cmd(sc, WPI_CMD_CONFIGURE, &sc->config,
2463
		sizeof (struct wpi_config), 1);
2464
	if (error != 0) {
3373
	if (error != 0) {
2465
		device_printf(sc->sc_dev, "could not configure\n");
3374
		device_printf(sc->sc_dev, "RXON command failed, error %d\n",
3375
		    error);
2466
		return error;
3376
		return error;
2467
	}
3377
	}
2468
3378
2469
	/* configuration has changed, set Tx power accordingly */
3379
	/* Configuration has changed, set Tx power accordingly. */
2470
	if ((error = wpi_set_txpower(sc, ni->ni_chan, 1)) != 0) {
3380
	if ((error = wpi_set_txpower(sc, async)) != 0) {
2471
		device_printf(sc->sc_dev, "could not set Tx power\n");
3381
		device_printf(sc->sc_dev,
3382
		    "%s: could not set TX power, error %d\n", __func__, error);
2472
		return error;
3383
		return error;
2473
	}
3384
	}
2474
3385
2475
	/* add default node */
3386
	if (!(sc->rxon.filter & htole32(WPI_FILTER_BSS))) {
2476
	memset(&node, 0, sizeof node);
3387
		/* Add broadcast node. */
2477
	IEEE80211_ADDR_COPY(node.bssid, ni->ni_bssid);
3388
		error = wpi_add_broadcast_node(sc, async);
2478
	node.id = WPI_ID_BSS;
3389
		if (error != 0) {
2479
	node.rate = (ic->ic_curmode == IEEE80211_MODE_11A) ?
3390
			device_printf(sc->sc_dev,
2480
	    wpi_plcp_signal(12) : wpi_plcp_signal(2);
3391
			    "could not add broadcast node, error %d\n", error);
2481
	node.action = htole32(WPI_ACTION_SET_RATE);
3392
			return error;
2482
	node.antenna = WPI_ANTENNA_BOTH;
3393
		}
2483
	error = wpi_cmd(sc, WPI_CMD_ADD_NODE, &node, sizeof node, 1);
3394
	}
2484
	if (error != 0)
2485
		device_printf(sc->sc_dev, "could not add BSS node\n");
2486
3395
2487
	return (error);
3396
	return 0;
2488
}
3397
}
2489
3398
3399
/**
3400
 * Configure the card to listen to a particular channel, this transisions the
3401
 * card in to being able to receive frames from remote devices.
3402
 */
2490
static int
3403
static int
2491
wpi_run(struct wpi_softc *sc, struct ieee80211vap *vap)
3404
wpi_config(struct wpi_softc *sc)
2492
{
3405
{
2493
	struct ieee80211com *ic = vap->iv_ic;
3406
	struct ifnet *ifp = sc->sc_ifp;
2494
	struct ieee80211_node *ni = vap->iv_bss;
3407
	struct ieee80211com *ic = ifp->if_l2com;
3408
	uint32_t flags;
2495
	int error;
3409
	int error;
2496
3410
2497
	if (vap->iv_opmode == IEEE80211_M_MONITOR) {
3411
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_BEGIN, __func__);
2498
		/* link LED blinks while monitoring */
3412
2499
		wpi_set_led(sc, WPI_LED_LINK, 5, 5);
3413
	/* Set power saving level to CAM during initialization. */
2500
		return 0;
3414
	if ((error = wpi_set_pslevel(sc, 0, 0, 0)) != 0) {
3415
		device_printf(sc->sc_dev,
3416
		    "%s: could not set power saving level\n", __func__);
3417
		return error;
2501
	}
3418
	}
2502
3419
2503
	wpi_enable_tsf(sc, ni);
3420
	/* Configure bluetooth coexistence. */
3421
	if ((error = wpi_send_btcoex(sc)) != 0) {
3422
		device_printf(sc->sc_dev,
3423
		    "could not configure bluetooth coexistence\n");
3424
		return error;
3425
	}
2504
3426
2505
	/* update adapter's configuration */
3427
	/* Configure adapter. */
2506
	sc->config.associd = htole16(ni->ni_associd & ~0xc000);
3428
	memset(&sc->rxon, 0, sizeof (struct wpi_rxon));
2507
	/* short preamble/slot time are negotiated when associating */
3429
	IEEE80211_ADDR_COPY(sc->rxon.myaddr, IF_LLADDR(ifp));
2508
	sc->config.flags &= ~htole32(WPI_CONFIG_SHPREAMBLE |
2509
	    WPI_CONFIG_SHSLOT);
2510
	if (ic->ic_flags & IEEE80211_F_SHSLOT)
2511
		sc->config.flags |= htole32(WPI_CONFIG_SHSLOT);
2512
	if (ic->ic_flags & IEEE80211_F_SHPREAMBLE)
2513
		sc->config.flags |= htole32(WPI_CONFIG_SHPREAMBLE);
2514
	sc->config.filter |= htole32(WPI_FILTER_BSS);
2515
3430
2516
	/* XXX put somewhere HC_QOS_SUPPORT_ASSOC + HC_IBSS_START */
3431
	/* Set default channel. */
3432
	sc->rxon.chan = ieee80211_chan2ieee(ic, ic->ic_curchan);
3433
	sc->rxon.flags = htole32(WPI_RXON_TSF | WPI_RXON_CTS_TO_SELF);
3434
	if (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan))
3435
		sc->rxon.flags |= htole32(WPI_RXON_AUTO | WPI_RXON_24GHZ);
2517
3436
2518
	DPRINTF(("config chan %d flags %x\n", sc->config.chan,
3437
	switch (ic->ic_opmode) {
2519
		    sc->config.flags));
3438
	case IEEE80211_M_STA:
2520
	error = wpi_cmd(sc, WPI_CMD_CONFIGURE, &sc->config, sizeof (struct
3439
		sc->rxon.mode = WPI_MODE_STA;
2521
		    wpi_config), 1);
3440
		sc->rxon.filter = htole32(WPI_FILTER_MULTICAST);
2522
	if (error != 0) {
3441
		break;
2523
		device_printf(sc->sc_dev, "could not update configuration\n");
3442
	case IEEE80211_M_IBSS:
3443
		sc->rxon.mode = WPI_MODE_IBSS;
3444
		sc->rxon.filter = htole32(WPI_FILTER_BEACON |
3445
		    WPI_FILTER_MULTICAST);
3446
		break;
3447
	/* XXX workaround for passive channels selection */
3448
	case IEEE80211_M_AHDEMO:
3449
		sc->rxon.filter = htole32(WPI_FILTER_MULTICAST);
3450
		/* FALLTHROUGH */
3451
	case IEEE80211_M_HOSTAP:
3452
		sc->rxon.mode = WPI_MODE_HOSTAP;
3453
		break;
3454
	case IEEE80211_M_MONITOR:
3455
		sc->rxon.mode = WPI_MODE_MONITOR;
3456
		sc->rxon.filter = htole32(WPI_FILTER_MULTICAST);
3457
		break;
3458
	default:
3459
		device_printf(sc->sc_dev, "unknown opmode %d\n", ic->ic_opmode);
3460
		return EINVAL;
3461
	}
3462
	wpi_set_promisc(sc);
3463
	sc->rxon.cck_mask  = 0x0f;	/* not yet negotiated */
3464
	sc->rxon.ofdm_mask = 0xff;	/* not yet negotiated */
3465
3466
	if ((error = wpi_send_rxon(sc, 0, 0)) != 0) {
3467
		device_printf(sc->sc_dev, "%s: could not send RXON\n",
3468
		    __func__);
2524
		return error;
3469
		return error;
2525
	}
3470
	}
2526
3471
2527
	error = wpi_set_txpower(sc, ni->ni_chan, 1);
3472
	/* Setup rate scalling. */
3473
	if ((error = wpi_mrr_setup(sc)) != 0) {
3474
		device_printf(sc->sc_dev, "could not setup MRR, error %d\n",
3475
		    error);
3476
		return error;
3477
	}
3478
3479
	/* Disable beacon notifications (unused). */
3480
	flags = WPI_STATISTICS_BEACON_DISABLE;
3481
	error = wpi_cmd(sc, WPI_CMD_GET_STATISTICS, &flags, sizeof flags, 1);
2528
	if (error != 0) {
3482
	if (error != 0) {
2529
		device_printf(sc->sc_dev, "could set txpower\n");
3483
		device_printf(sc->sc_dev,
3484
		    "could not disable beacon statistics, error %d\n", error);
2530
		return error;
3485
		return error;
2531
	}
3486
	}
2532
3487
2533
	/* link LED always on while associated */
3488
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END, __func__);
2534
	wpi_set_led(sc, WPI_LED_LINK, 0, 1);
2535
3489
2536
	/* start automatic rate control timer */
3490
	return 0;
2537
	callout_reset(&sc->calib_to, 60*hz, wpi_calib_timeout, sc);
3491
}
2538
3492
2539
	return (error);
3493
static uint16_t
3494
wpi_get_active_dwell_time(struct wpi_softc *sc,
3495
    struct ieee80211_channel *c, uint8_t n_probes)
3496
{
3497
	/* No channel? Default to 2GHz settings. */
3498
	if (c == NULL || IEEE80211_IS_CHAN_2GHZ(c)) {
3499
		return (WPI_ACTIVE_DWELL_TIME_2GHZ +
3500
		WPI_ACTIVE_DWELL_FACTOR_2GHZ * (n_probes + 1));
3501
	}
3502
3503
	/* 5GHz dwell time. */
3504
	return (WPI_ACTIVE_DWELL_TIME_5GHZ +
3505
	    WPI_ACTIVE_DWELL_FACTOR_5GHZ * (n_probes + 1));
2540
}
3506
}
2541
3507
2542
/*
3508
/*
2543
 * Send a scan request to the firmware.  Since this command is huge, we map it
3509
 * Limit the total dwell time to 85% of the beacon interval.
2544
 * into a mbufcluster instead of using the pre-allocated set of commands. Note,
3510
 *
2545
 * much of this code is similar to that in wpi_cmd but because we must manually
3511
 * Returns the dwell time in milliseconds.
2546
 * construct the probe & channels, we duplicate what's needed here. XXX In the
2547
 * future, this function should be modified to use wpi_cmd to help cleanup the
2548
 * code base.
2549
 */
3512
 */
3513
static uint16_t
3514
wpi_limit_dwell(struct wpi_softc *sc, uint16_t dwell_time)
3515
{
3516
	struct ieee80211com *ic = sc->sc_ifp->if_l2com;
3517
	struct ieee80211vap *vap = NULL;
3518
	int bintval = 0;
3519
3520
	/* bintval is in TU (1.024mS) */
3521
	if (! TAILQ_EMPTY(&ic->ic_vaps)) {
3522
		vap = TAILQ_FIRST(&ic->ic_vaps);
3523
		bintval = vap->iv_bss->ni_intval;
3524
	}
3525
3526
	/*
3527
	 * If it's non-zero, we should calculate the minimum of
3528
	 * it and the DWELL_BASE.
3529
	 *
3530
	 * XXX Yes, the math should take into account that bintval
3531
	 * is 1.024mS, not 1mS..
3532
	 */
3533
	if (bintval > 0) {
3534
		DPRINTF(sc, WPI_DEBUG_SCAN, "%s: bintval=%d\n", __func__,
3535
		    bintval);
3536
		return (MIN(WPI_PASSIVE_DWELL_BASE, ((bintval * 85) / 100)));
3537
	}
3538
3539
	/* No association context? Default. */
3540
	return (WPI_PASSIVE_DWELL_BASE);
3541
}
3542
3543
static uint16_t
3544
wpi_get_passive_dwell_time(struct wpi_softc *sc, struct ieee80211_channel *c)
3545
{
3546
	uint16_t passive;
3547
3548
	if (c == NULL || IEEE80211_IS_CHAN_2GHZ(c))
3549
		passive = WPI_PASSIVE_DWELL_BASE + WPI_PASSIVE_DWELL_TIME_2GHZ;
3550
	else
3551
		passive = WPI_PASSIVE_DWELL_BASE + WPI_PASSIVE_DWELL_TIME_5GHZ;
3552
3553
	/* Clamp to the beacon interval if we're associated. */
3554
	return (wpi_limit_dwell(sc, passive));
3555
}
3556
3557
/*
3558
 * Send a scan request to the firmware.
3559
 */
2550
static int
3560
static int
2551
wpi_scan(struct wpi_softc *sc)
3561
wpi_scan(struct wpi_softc *sc, struct ieee80211_channel *c)
2552
{
3562
{
2553
	struct ifnet *ifp = sc->sc_ifp;
3563
	struct ifnet *ifp = sc->sc_ifp;
2554
	struct ieee80211com *ic = ifp->if_l2com;
3564
	struct ieee80211com *ic = ifp->if_l2com;
2555
	struct ieee80211_scan_state *ss = ic->ic_scan;
3565
	struct ieee80211_scan_state *ss = ic->ic_scan;
2556
	struct wpi_tx_ring *ring = &sc->cmdq;
2557
	struct wpi_tx_desc *desc;
2558
	struct wpi_tx_data *data;
2559
	struct wpi_tx_cmd *cmd;
2560
	struct wpi_scan_hdr *hdr;
3566
	struct wpi_scan_hdr *hdr;
3567
	struct wpi_cmd_data *tx;
3568
	struct wpi_scan_essid *essids;
2561
	struct wpi_scan_chan *chan;
3569
	struct wpi_scan_chan *chan;
2562
	struct ieee80211_frame *wh;
3570
	struct ieee80211_frame *wh;
2563
	struct ieee80211_rateset *rs;
3571
	struct ieee80211_rateset *rs;
2564
	struct ieee80211_channel *c;
3572
	uint16_t dwell_active, dwell_passive;
2565
	enum ieee80211_phymode mode;
3573
	uint8_t *buf, *frm;
2566
	uint8_t *frm;
3574
	int buflen, error, i, nssid;
2567
	int pktlen, error, i, nssid;
2568
	bus_addr_t physaddr;
2569
3575
2570
	desc = &ring->desc[ring->cur];
3576
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_BEGIN, __func__);
2571
	data = &ring->data[ring->cur];
2572
3577
2573
	data->m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
3578
	/*
2574
	if (data->m == NULL) {
3579
	 * We are absolutely not allowed to send a scan command when another
3580
	 * scan command is pending.
3581
	 */
3582
	if (sc->sc_scan_timer) {
3583
		device_printf(sc->sc_dev, "%s: called whilst scanning!\n",
3584
		    __func__);
3585
		return (EAGAIN);
3586
	}
3587
3588
	buf = malloc(WPI_SCAN_MAXSZ, M_DEVBUF, M_NOWAIT | M_ZERO);
3589
	if (buf == NULL) {
2575
		device_printf(sc->sc_dev,
3590
		device_printf(sc->sc_dev,
2576
		    "could not allocate mbuf for scan command\n");
3591
		    "%s: could not allocate buffer for scan command\n",
3592
		    __func__);
2577
		return ENOMEM;
3593
		return ENOMEM;
2578
	}
3594
	}
3595
	hdr = (struct wpi_scan_hdr *)buf;
2579
3596
2580
	cmd = mtod(data->m, struct wpi_tx_cmd *);
2581
	cmd->code = WPI_CMD_SCAN;
2582
	cmd->flags = 0;
2583
	cmd->qid = ring->qid;
2584
	cmd->idx = ring->cur;
2585
2586
	hdr = (struct wpi_scan_hdr *)cmd->data;
2587
	memset(hdr, 0, sizeof(struct wpi_scan_hdr));
2588
2589
	/*
3597
	/*
2590
	 * Move to the next channel if no packets are received within 5 msecs
3598
	 * Move to the next channel if no packets are received within 10 msecs
2591
	 * after sending the probe request (this helps to reduce the duration
3599
	 * after sending the probe request.
2592
	 * of active scans).
2593
	 */
3600
	 */
2594
	hdr->quiet = htole16(5);
3601
	hdr->quiet_time = htole16(10);		/* timeout in milliseconds */
2595
	hdr->threshold = htole16(1);
3602
	hdr->quiet_threshold = htole16(1);	/* min # of packets */
3603
	/*
3604
	 * Max needs to be greater than active and passive and quiet!
3605
	 * It's also in microseconds!
3606
	 */
3607
	hdr->max_svc = htole32(250 * IEEE80211_DUR_TU);
3608
	hdr->pause_svc = htole32((4 << 24) |
3609
	    (100 * IEEE80211_DUR_TU));	/* Hardcode for now */
3610
	hdr->filter = htole32(WPI_FILTER_MULTICAST | WPI_FILTER_BEACON);
2596
3611
2597
	if (IEEE80211_IS_CHAN_A(ic->ic_curchan)) {
3612
	tx = (struct wpi_cmd_data *)(hdr + 1);
2598
		/* send probe requests at 6Mbps */
3613
	tx->flags = htole32(WPI_TX_AUTO_SEQ);
2599
		hdr->tx.rate = wpi_ridx_to_plcp[WPI_OFDM6];
3614
	tx->id = WPI_ID_BROADCAST;
3615
	tx->lifetime = htole32(WPI_LIFETIME_INFINITE);
2600
3616
2601
		/* Enable crc checking */
3617
	if (IEEE80211_IS_CHAN_5GHZ(c)) {
2602
		hdr->promotion = htole16(1);
3618
		/* Send probe requests at 6Mbps. */
3619
		tx->plcp = wpi_ridx_to_plcp[WPI_RIDX_OFDM6];
3620
		rs = &ic->ic_sup_rates[IEEE80211_MODE_11A];
2603
	} else {
3621
	} else {
2604
		hdr->flags = htole32(WPI_CONFIG_24GHZ | WPI_CONFIG_AUTO);
3622
		hdr->flags = htole32(WPI_RXON_24GHZ | WPI_RXON_AUTO);
2605
		/* send probe requests at 1Mbps */
3623
		/* Send probe requests at 1Mbps. */
2606
		hdr->tx.rate = wpi_ridx_to_plcp[WPI_CCK1];
3624
		tx->plcp = wpi_ridx_to_plcp[WPI_RIDX_CCK1];
3625
		rs = &ic->ic_sup_rates[IEEE80211_MODE_11G];
2607
	}
3626
	}
2608
	hdr->tx.id = WPI_ID_BROADCAST;
2609
	hdr->tx.lifetime = htole32(WPI_LIFETIME_INFINITE);
2610
	hdr->tx.flags = htole32(WPI_TX_AUTO_SEQ);
2611
3627
2612
	memset(hdr->scan_essids, 0, sizeof(hdr->scan_essids));
3628
	essids = (struct wpi_scan_essid *)(tx + 1);
2613
	nssid = MIN(ss->ss_nssid, WPI_SCAN_MAX_ESSIDS);
3629
	nssid = MIN(ss->ss_nssid, WPI_SCAN_MAX_ESSIDS);
2614
	for (i = 0; i < nssid; i++) {
3630
	for (i = 0; i < nssid; i++) {
2615
		hdr->scan_essids[i].id = IEEE80211_ELEMID_SSID;
3631
		essids[i].id = IEEE80211_ELEMID_SSID;
2616
		hdr->scan_essids[i].esslen = MIN(ss->ss_ssid[i].len, IEEE80211_NWID_LEN);
3632
		essids[i].len = MIN(ss->ss_ssid[i].len, IEEE80211_NWID_LEN);
2617
		memcpy(hdr->scan_essids[i].essid, ss->ss_ssid[i].ssid,
3633
		memcpy(essids[i].data, ss->ss_ssid[i].ssid, essids[i].len);
2618
		    hdr->scan_essids[i].esslen);
2619
#ifdef WPI_DEBUG
3634
#ifdef WPI_DEBUG
2620
		if (wpi_debug & WPI_DEBUG_SCANNING) {
3635
		if (sc->sc_debug & WPI_DEBUG_SCAN) {
2621
			printf("Scanning Essid: ");
3636
			printf("Scanning Essid: ");
2622
			ieee80211_print_essid(hdr->scan_essids[i].essid,
3637
			ieee80211_print_essid(essids[i].data, essids[i].len);
2623
			    hdr->scan_essids[i].esslen);
2624
			printf("\n");
3638
			printf("\n");
2625
		}
3639
		}
2626
#endif
3640
#endif
Lines 2630-2636 Link Here
2630
	 * Build a probe request frame.  Most of the following code is a
3644
	 * Build a probe request frame.  Most of the following code is a
2631
	 * copy & paste of what is done in net80211.
3645
	 * copy & paste of what is done in net80211.
2632
	 */
3646
	 */
2633
	wh = (struct ieee80211_frame *)&hdr->scan_essids[WPI_SCAN_MAX_ESSIDS];
3647
	wh = (struct ieee80211_frame *)(essids + WPI_SCAN_MAX_ESSIDS);
2634
	wh->i_fc[0] = IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_MGT |
3648
	wh->i_fc[0] = IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_MGT |
2635
		IEEE80211_FC0_SUBTYPE_PROBE_REQ;
3649
		IEEE80211_FC0_SUBTYPE_PROBE_REQ;
2636
	wh->i_fc[1] = IEEE80211_FC1_DIR_NODS;
3650
	wh->i_fc[1] = IEEE80211_FC1_DIR_NODS;
Lines 2637-2656 Link Here
2637
	IEEE80211_ADDR_COPY(wh->i_addr1, ifp->if_broadcastaddr);
3651
	IEEE80211_ADDR_COPY(wh->i_addr1, ifp->if_broadcastaddr);
2638
	IEEE80211_ADDR_COPY(wh->i_addr2, IF_LLADDR(ifp));
3652
	IEEE80211_ADDR_COPY(wh->i_addr2, IF_LLADDR(ifp));
2639
	IEEE80211_ADDR_COPY(wh->i_addr3, ifp->if_broadcastaddr);
3653
	IEEE80211_ADDR_COPY(wh->i_addr3, ifp->if_broadcastaddr);
2640
	*(u_int16_t *)&wh->i_dur[0] = 0;	/* filled by h/w */
3654
	*(uint16_t *)&wh->i_dur[0] = 0;	/* filled by h/w */
2641
	*(u_int16_t *)&wh->i_seq[0] = 0;	/* filled by h/w */
3655
	*(uint16_t *)&wh->i_seq[0] = 0;	/* filled by h/w */
2642
3656
2643
	frm = (uint8_t *)(wh + 1);
3657
	frm = (uint8_t *)(wh + 1);
2644
2645
	mode = ieee80211_chan2mode(ic->ic_curchan);
2646
	rs = &ic->ic_sup_rates[mode];
2647
2648
	frm = ieee80211_add_ssid(frm, NULL, 0);
3658
	frm = ieee80211_add_ssid(frm, NULL, 0);
2649
	frm = ieee80211_add_rates(frm, rs);
3659
	frm = ieee80211_add_rates(frm, rs);
2650
	frm = ieee80211_add_xrates(frm, rs);
3660
	if (rs->rs_nrates > IEEE80211_RATE_SIZE)
3661
		frm = ieee80211_add_xrates(frm, rs);
2651
3662
2652
	/* setup length of probe request */
3663
	/* Set length of probe request. */
2653
	hdr->tx.len = htole16(frm - (uint8_t *)wh);
3664
	tx->len = htole16(frm - (uint8_t *)wh);
2654
3665
2655
	/*
3666
	/*
2656
	 * Construct information about the channel that we
3667
	 * Construct information about the channel that we
Lines 2657-2999 Link Here
2657
	 * want to scan. The firmware expects this to be directly
3668
	 * want to scan. The firmware expects this to be directly
2658
	 * after the scan probe request
3669
	 * after the scan probe request
2659
	 */
3670
	 */
2660
	c = ic->ic_curchan;
2661
	chan = (struct wpi_scan_chan *)frm;
3671
	chan = (struct wpi_scan_chan *)frm;
2662
	chan->chan = ieee80211_chan2ieee(ic, c);
3672
	chan->chan = htole16(ieee80211_chan2ieee(ic, c));
2663
	chan->flags = 0;
3673
	chan->flags = 0;
2664
	if (!(c->ic_flags & IEEE80211_CHAN_PASSIVE)) {
3674
	if (nssid) {
3675
		hdr->crc_threshold = WPI_SCAN_CRC_TH_DEFAULT;
3676
		chan->flags |= WPI_CHAN_NPBREQS(nssid);
3677
	} else
3678
		hdr->crc_threshold = WPI_SCAN_CRC_TH_NEVER;
3679
3680
	if (!(c->ic_flags & IEEE80211_CHAN_PASSIVE))
2665
		chan->flags |= WPI_CHAN_ACTIVE;
3681
		chan->flags |= WPI_CHAN_ACTIVE;
2666
		if (nssid != 0)
2667
			chan->flags |= WPI_CHAN_DIRECT;
2668
	}
2669
	chan->gain_dsp = 0x6e; /* Default level */
2670
	if (IEEE80211_IS_CHAN_5GHZ(c)) {
2671
		chan->active = htole16(10);
2672
		chan->passive = htole16(ss->ss_maxdwell);
2673
		chan->gain_radio = 0x3b;
2674
	} else {
2675
		chan->active = htole16(20);
2676
		chan->passive = htole16(ss->ss_maxdwell);
2677
		chan->gain_radio = 0x28;
2678
	}
2679
3682
2680
	DPRINTFN(WPI_DEBUG_SCANNING,
3683
	/*
2681
	    ("Scanning %u Passive: %d\n",
3684
	 * Calculate the active/passive dwell times.
2682
	     chan->chan,
3685
	 */
2683
	     c->ic_flags & IEEE80211_CHAN_PASSIVE));
2684
3686
3687
	dwell_active = wpi_get_active_dwell_time(sc, c, nssid);
3688
	dwell_passive = wpi_get_passive_dwell_time(sc, c);
3689
3690
	/* Make sure they're valid. */
3691
	if (dwell_passive <= dwell_active)
3692
		dwell_passive = dwell_active + 1;
3693
3694
	chan->active = htole16(dwell_active);
3695
	chan->passive = htole16(dwell_passive);
3696
3697
	chan->dsp_gain = 0x6e;  /* Default level */
3698
3699
	if (IEEE80211_IS_CHAN_5GHZ(c))
3700
		chan->rf_gain = 0x3b;
3701
	else
3702
		chan->rf_gain = 0x28;
3703
3704
	DPRINTF(sc, WPI_DEBUG_SCAN, "Scanning %u Passive: %d\n",
3705
	     chan->chan, (c->ic_flags & IEEE80211_CHAN_PASSIVE) ? 1 : 0);
3706
2685
	hdr->nchan++;
3707
	hdr->nchan++;
2686
	chan++;
3708
	chan++;
2687
3709
2688
	frm += sizeof (struct wpi_scan_chan);
3710
	buflen = (uint8_t *)chan - buf;
2689
#if 0
3711
	hdr->len = htole16(buflen);
2690
	// XXX All Channels....
2691
	for (c  = &ic->ic_channels[1];
2692
	     c <= &ic->ic_channels[IEEE80211_CHAN_MAX]; c++) {
2693
		if ((c->ic_flags & ic->ic_curchan->ic_flags) != ic->ic_curchan->ic_flags)
2694
			continue;
2695
3712
2696
		chan->chan = ieee80211_chan2ieee(ic, c);
3713
	DPRINTF(sc, WPI_DEBUG_CMD, "sending scan command nchan=%d\n",
2697
		chan->flags = 0;
3714
	    hdr->nchan);
2698
		if (!(c->ic_flags & IEEE80211_CHAN_PASSIVE)) {
3715
	error = wpi_cmd(sc, WPI_CMD_SCAN, buf, buflen, 1);
2699
		    chan->flags |= WPI_CHAN_ACTIVE;
3716
	free(buf, M_DEVBUF);
2700
		    if (ic->ic_des_ssid[0].len != 0)
2701
			chan->flags |= WPI_CHAN_DIRECT;
2702
		}
2703
		chan->gain_dsp = 0x6e; /* Default level */
2704
		if (IEEE80211_IS_CHAN_5GHZ(c)) {
2705
			chan->active = htole16(10);
2706
			chan->passive = htole16(110);
2707
			chan->gain_radio = 0x3b;
2708
		} else {
2709
			chan->active = htole16(20);
2710
			chan->passive = htole16(120);
2711
			chan->gain_radio = 0x28;
2712
		}
2713
3717
2714
		DPRINTFN(WPI_DEBUG_SCANNING,
3718
	sc->sc_scan_timer = 5;
2715
			 ("Scanning %u Passive: %d\n",
2716
			  chan->chan,
2717
			  c->ic_flags & IEEE80211_CHAN_PASSIVE));
2718
3719
2719
		hdr->nchan++;
3720
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END, __func__);
2720
		chan++;
2721
3721
2722
		frm += sizeof (struct wpi_scan_chan);
3722
	return error;
2723
	}
3723
}
2724
#endif
2725
3724
2726
	hdr->len = htole16(frm - (uint8_t *)hdr);
3725
static int
2727
	pktlen = frm - (uint8_t *)cmd;
3726
wpi_auth(struct wpi_softc *sc, struct ieee80211vap *vap)
3727
{
3728
	struct ieee80211com *ic = vap->iv_ic;
3729
	struct ieee80211_node *ni = vap->iv_bss;
3730
	int error;
2728
3731
2729
	error = bus_dmamap_load(ring->data_dmat, data->map, cmd, pktlen,
3732
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_BEGIN, __func__);
2730
	    wpi_dma_map_addr, &physaddr, BUS_DMA_NOWAIT);
3733
2731
	if (error != 0) {
3734
	/* Update adapter configuration. */
2732
		device_printf(sc->sc_dev, "could not map scan command\n");
3735
	sc->rxon.associd = 0;
2733
		m_freem(data->m);
3736
	sc->rxon.filter &= ~htole32(WPI_FILTER_BSS);
2734
		data->m = NULL;
3737
	IEEE80211_ADDR_COPY(sc->rxon.bssid, ni->ni_bssid);
2735
		return error;
3738
	sc->rxon.chan = ieee80211_chan2ieee(ic, ni->ni_chan);
3739
	sc->rxon.flags = htole32(WPI_RXON_TSF | WPI_RXON_CTS_TO_SELF);
3740
	if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan))
3741
		sc->rxon.flags |= htole32(WPI_RXON_AUTO | WPI_RXON_24GHZ);
3742
	if (ic->ic_flags & IEEE80211_F_SHSLOT)
3743
		sc->rxon.flags |= htole32(WPI_RXON_SHSLOT);
3744
	if (ic->ic_flags & IEEE80211_F_SHPREAMBLE)
3745
		sc->rxon.flags |= htole32(WPI_RXON_SHPREAMBLE);
3746
	if (IEEE80211_IS_CHAN_A(ni->ni_chan)) {
3747
		sc->rxon.cck_mask  = 0;
3748
		sc->rxon.ofdm_mask = 0x15;
3749
	} else if (IEEE80211_IS_CHAN_B(ni->ni_chan)) {
3750
		sc->rxon.cck_mask  = 0x03;
3751
		sc->rxon.ofdm_mask = 0;
3752
	} else {
3753
		/* Assume 802.11b/g. */
3754
		sc->rxon.cck_mask  = 0x0f;
3755
		sc->rxon.ofdm_mask = 0x15;
2736
	}
3756
	}
2737
3757
2738
	desc->flags = htole32(WPI_PAD32(pktlen) << 28 | 1 << 24);
3758
	DPRINTF(sc, WPI_DEBUG_STATE, "rxon chan %d flags %x cck %x ofdm %x\n",
2739
	desc->segs[0].addr = htole32(physaddr);
3759
	    sc->rxon.chan, sc->rxon.flags, sc->rxon.cck_mask,
2740
	desc->segs[0].len  = htole32(pktlen);
3760
	    sc->rxon.ofdm_mask);
2741
3761
2742
	bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map,
3762
	if ((error = wpi_send_rxon(sc, 0, 1)) != 0) {
2743
	    BUS_DMASYNC_PREWRITE);
3763
		device_printf(sc->sc_dev, "%s: could not send RXON\n",
2744
	bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_PREWRITE);
3764
		    __func__);
3765
	}
2745
3766
2746
	/* kick cmd ring */
3767
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END, __func__);
2747
	ring->cur = (ring->cur + 1) % WPI_CMD_RING_COUNT;
2748
	WPI_WRITE(sc, WPI_TX_WIDX, ring->qid << 8 | ring->cur);
2749
3768
2750
	sc->sc_scan_timer = 5;
3769
	return error;
2751
	return 0;	/* will be notified async. of failure/success */
2752
}
3770
}
2753
3771
2754
/**
2755
 * Configure the card to listen to a particular channel, this transisions the
2756
 * card in to being able to receive frames from remote devices.
2757
 */
2758
static int
3772
static int
2759
wpi_config(struct wpi_softc *sc)
3773
wpi_setup_beacon(struct wpi_softc *sc, struct ieee80211_node *ni)
2760
{
3774
{
2761
	struct ifnet *ifp = sc->sc_ifp;
3775
	struct ifnet *ifp = sc->sc_ifp;
2762
	struct ieee80211com *ic = ifp->if_l2com;
3776
	struct ieee80211com *ic = ifp->if_l2com;
2763
	struct wpi_power power;
3777
	struct ieee80211vap *vap = ni->ni_vap;
2764
	struct wpi_bluetooth bluetooth;
3778
	struct wpi_vap *wvp = WPI_VAP(vap);
2765
	struct wpi_node_info node;
3779
	struct wpi_buf *bcn = &wvp->wv_bcbuf;
2766
	int error;
3780
	struct ieee80211_beacon_offsets bo;
3781
	struct wpi_cmd_beacon *cmd;
3782
	struct mbuf *m;
3783
	int totlen;
2767
3784
2768
	/* set power mode */
3785
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_DOING, __func__);
2769
	memset(&power, 0, sizeof power);
3786
2770
	power.flags = htole32(WPI_POWER_CAM|0x8);
3787
	if (ni->ni_chan == IEEE80211_CHAN_ANYC)
2771
	error = wpi_cmd(sc, WPI_CMD_SET_POWER_MODE, &power, sizeof power, 0);
3788
		return EINVAL;
2772
	if (error != 0) {
3789
2773
		device_printf(sc->sc_dev, "could not set power mode\n");
3790
	m = ieee80211_beacon_alloc(ni, &bo);
2774
		return error;
3791
	if (m == NULL) {
3792
		device_printf(sc->sc_dev,
3793
		    "%s: could not allocate beacon frame\n", __func__);
3794
		return ENOMEM;
2775
	}
3795
	}
3796
	totlen = m->m_pkthdr.len;
2776
3797
2777
	/* configure bluetooth coexistence */
3798
	if (bcn->data == NULL) {
2778
	memset(&bluetooth, 0, sizeof bluetooth);
3799
		cmd = malloc(sizeof(struct wpi_cmd_beacon), M_DEVBUF,
2779
	bluetooth.flags = 3;
3800
		    M_NOWAIT | M_ZERO);
2780
	bluetooth.lead = 0xaa;
3801
2781
	bluetooth.kill = 1;
3802
		if (cmd == NULL) {
2782
	error = wpi_cmd(sc, WPI_CMD_BLUETOOTH, &bluetooth, sizeof bluetooth,
3803
			device_printf(sc->sc_dev,
2783
	    0);
3804
			    "could not allocate buffer for beacon command\n");
2784
	if (error != 0) {
3805
			m_freem(m);
3806
			return ENOMEM;
3807
		}
3808
3809
		cmd->id = WPI_ID_BROADCAST;
3810
		cmd->ofdm_mask = 0xff;
3811
		cmd->cck_mask = 0x0f;
3812
		cmd->lifetime = htole32(WPI_LIFETIME_INFINITE);
3813
		cmd->flags = htole32(WPI_TX_AUTO_SEQ | WPI_TX_INSERT_TSTAMP);
3814
3815
		bcn->data = cmd;
3816
		bcn->ni = NULL;
3817
		bcn->code = WPI_CMD_SET_BEACON;
3818
		bcn->ac = 4;
3819
		bcn->size = sizeof(struct wpi_cmd_beacon);
3820
	} else
3821
		cmd = bcn->data;
3822
3823
	cmd->len = htole16(totlen);
3824
	cmd->plcp = (ic->ic_curmode == IEEE80211_MODE_11A) ?
3825
	    wpi_ridx_to_plcp[WPI_RIDX_OFDM6] : wpi_ridx_to_plcp[WPI_RIDX_CCK1];
3826
3827
	/* NB: m will be freed in wpi_cmd_done() */
3828
	bcn->m = m;
3829
3830
	return wpi_cmd2(sc, bcn);
3831
}
3832
3833
static void
3834
wpi_update_beacon(struct ieee80211vap *vap, int item)
3835
{
3836
	struct ieee80211_node *ni = vap->iv_bss;
3837
	struct ifnet *ifp = vap->iv_ifp;
3838
	struct wpi_softc *sc = ifp->if_softc;
3839
	int error;
3840
3841
	if ((error = wpi_setup_beacon(sc, ni)) != 0) {
2785
		device_printf(sc->sc_dev,
3842
		device_printf(sc->sc_dev,
2786
		    "could not configure bluetooth coexistence\n");
3843
		    "%s: could not update beacon frame, error %d", __func__,
2787
		return error;
3844
		    error);
2788
	}
3845
	}
3846
}
2789
3847
2790
	/* configure adapter */
3848
static int
2791
	memset(&sc->config, 0, sizeof (struct wpi_config));
3849
wpi_run(struct wpi_softc *sc, struct ieee80211vap *vap)
2792
	IEEE80211_ADDR_COPY(sc->config.myaddr, IF_LLADDR(ifp));
3850
{
2793
	/*set default channel*/
3851
	struct ieee80211com *ic = vap->iv_ic;
2794
	sc->config.chan = htole16(ieee80211_chan2ieee(ic, ic->ic_curchan));
3852
	struct ieee80211_node *ni = vap->iv_bss;
2795
	sc->config.flags = htole32(WPI_CONFIG_TSF);
3853
	int error;
2796
	if (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan)) {
3854
2797
		sc->config.flags |= htole32(WPI_CONFIG_AUTO |
3855
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_BEGIN, __func__);
2798
		    WPI_CONFIG_24GHZ);
3856
3857
	if (vap->iv_opmode == IEEE80211_M_MONITOR) {
3858
		/* Link LED blinks while monitoring. */
3859
		wpi_set_led(sc, WPI_LED_LINK, 5, 5);
3860
		return 0;
2799
	}
3861
	}
2800
	sc->config.filter = 0;
3862
2801
	switch (ic->ic_opmode) {
3863
	/* XXX kernel panic workaround */
2802
	case IEEE80211_M_STA:
3864
	if (ni->ni_chan == IEEE80211_CHAN_ANYC) {
2803
	case IEEE80211_M_WDS:	/* No know setup, use STA for now */
3865
		device_printf(sc->sc_dev, "%s: incomplete configuration\n",
2804
		sc->config.mode = WPI_MODE_STA;
3866
		    __func__);
2805
		sc->config.filter |= htole32(WPI_FILTER_MULTICAST);
2806
		break;
2807
	case IEEE80211_M_IBSS:
2808
	case IEEE80211_M_AHDEMO:
2809
		sc->config.mode = WPI_MODE_IBSS;
2810
		sc->config.filter |= htole32(WPI_FILTER_BEACON |
2811
					     WPI_FILTER_MULTICAST);
2812
		break;
2813
	case IEEE80211_M_HOSTAP:
2814
		sc->config.mode = WPI_MODE_HOSTAP;
2815
		break;
2816
	case IEEE80211_M_MONITOR:
2817
		sc->config.mode = WPI_MODE_MONITOR;
2818
		sc->config.filter |= htole32(WPI_FILTER_MULTICAST |
2819
			WPI_FILTER_CTL | WPI_FILTER_PROMISC);
2820
		break;
2821
	default:
2822
		device_printf(sc->sc_dev, "unknown opmode %d\n", ic->ic_opmode);
2823
		return EINVAL;
3867
		return EINVAL;
2824
	}
3868
	}
2825
	sc->config.cck_mask  = 0x0f;	/* not yet negotiated */
3869
2826
	sc->config.ofdm_mask = 0xff;	/* not yet negotiated */
3870
	if ((error = wpi_set_timing(sc, ni)) != 0) {
2827
	error = wpi_cmd(sc, WPI_CMD_CONFIGURE, &sc->config,
3871
		device_printf(sc->sc_dev,
2828
		sizeof (struct wpi_config), 0);
3872
		    "%s: could not set timing, error %d\n", __func__, error);
2829
	if (error != 0) {
2830
		device_printf(sc->sc_dev, "configure command failed\n");
2831
		return error;
3873
		return error;
2832
	}
3874
	}
2833
3875
2834
	/* configuration has changed, set Tx power accordingly */
3876
	/* Update adapter configuration. */
2835
	if ((error = wpi_set_txpower(sc, ic->ic_curchan, 0)) != 0) {
3877
	IEEE80211_ADDR_COPY(sc->rxon.bssid, ni->ni_bssid);
2836
	    device_printf(sc->sc_dev, "could not set Tx power\n");
3878
	sc->rxon.associd = htole16(IEEE80211_NODE_AID(ni));
2837
	    return error;
3879
	sc->rxon.chan = ieee80211_chan2ieee(ic, ni->ni_chan);
3880
	sc->rxon.flags = htole32(WPI_RXON_TSF | WPI_RXON_CTS_TO_SELF);
3881
	if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan))
3882
		sc->rxon.flags |= htole32(WPI_RXON_AUTO | WPI_RXON_24GHZ);
3883
	/* Short preamble and slot time are negotiated when associating. */
3884
	sc->rxon.flags &= ~htole32(WPI_RXON_SHPREAMBLE | WPI_RXON_SHSLOT);
3885
	if (ic->ic_flags & IEEE80211_F_SHSLOT)
3886
		sc->rxon.flags |= htole32(WPI_RXON_SHSLOT);
3887
	if (ic->ic_flags & IEEE80211_F_SHPREAMBLE)
3888
		sc->rxon.flags |= htole32(WPI_RXON_SHPREAMBLE);
3889
	if (IEEE80211_IS_CHAN_A(ni->ni_chan)) {
3890
		sc->rxon.cck_mask  = 0;
3891
		sc->rxon.ofdm_mask = 0x15;
3892
	} else if (IEEE80211_IS_CHAN_B(ni->ni_chan)) {
3893
		sc->rxon.cck_mask  = 0x03;
3894
		sc->rxon.ofdm_mask = 0;
3895
	} else {
3896
		/* Assume 802.11b/g. */
3897
		sc->rxon.cck_mask  = 0x0f;
3898
		sc->rxon.ofdm_mask = 0x15;
2838
	}
3899
	}
3900
	sc->rxon.filter |= htole32(WPI_FILTER_BSS);
2839
3901
2840
	/* add broadcast node */
3902
	/* XXX put somewhere HC_QOS_SUPPORT_ASSOC + HC_IBSS_START */
2841
	memset(&node, 0, sizeof node);
3903
2842
	IEEE80211_ADDR_COPY(node.bssid, ifp->if_broadcastaddr);
3904
	DPRINTF(sc, WPI_DEBUG_STATE, "rxon chan %d flags %x\n",
2843
	node.id = WPI_ID_BROADCAST;
3905
	    sc->rxon.chan, sc->rxon.flags);
2844
	node.rate = wpi_plcp_signal(2);
3906
2845
	error = wpi_cmd(sc, WPI_CMD_ADD_NODE, &node, sizeof node, 0);
3907
	if ((error = wpi_send_rxon(sc, 0, 1)) != 0) {
2846
	if (error != 0) {
3908
		device_printf(sc->sc_dev, "%s: could not send RXON\n",
2847
		device_printf(sc->sc_dev, "could not add broadcast node\n");
3909
		    __func__);
2848
		return error;
3910
		return error;
2849
	}
3911
	}
2850
3912
2851
	/* Setup rate scalling */
3913
	if (vap->iv_opmode == IEEE80211_M_IBSS) {
2852
	error = wpi_mrr_setup(sc);
3914
		if ((error = wpi_setup_beacon(sc, ni)) != 0) {
2853
	if (error != 0) {
3915
			device_printf(sc->sc_dev,
2854
		device_printf(sc->sc_dev, "could not setup MRR\n");
3916
			    "%s: could not setup beacon, error %d\n", __func__,
2855
		return error;
3917
			    error);
3918
			return error;
3919
		}
2856
	}
3920
	}
2857
3921
2858
	return 0;
3922
	if (vap->iv_opmode == IEEE80211_M_STA) {
2859
}
3923
		/* Add BSS node. */
3924
		((struct wpi_node *)ni)->id = WPI_ID_BSS;
3925
		if ((error = wpi_add_node(sc, ni)) != 0) {
3926
			device_printf(sc->sc_dev,
3927
			    "%s: could not add BSS node, error %d\n", __func__,
3928
			    error);
3929
			return error;
3930
		}
3931
	}
2860
3932
2861
static void
3933
	/* Link LED always on while associated. */
2862
wpi_stop_master(struct wpi_softc *sc)
3934
	wpi_set_led(sc, WPI_LED_LINK, 0, 1);
2863
{
2864
	uint32_t tmp;
2865
	int ntries;
2866
3935
2867
	DPRINTFN(WPI_DEBUG_HW,("Disabling Firmware execution\n"));
3936
	/* Start periodic calibration timer. */
3937
	callout_reset(&sc->calib_to, 60*hz, wpi_calib_timeout, sc);
2868
3938
2869
	tmp = WPI_READ(sc, WPI_RESET);
3939
	/* Enable power-saving mode if requested by user. */
2870
	WPI_WRITE(sc, WPI_RESET, tmp | WPI_STOP_MASTER | WPI_NEVO_RESET);
3940
	if (vap->iv_flags & IEEE80211_F_PMGTON)
3941
		(void)wpi_set_pslevel(sc, 0, 3, 1);
2871
3942
2872
	tmp = WPI_READ(sc, WPI_GPIO_CTL);
3943
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END, __func__);
2873
	if ((tmp & WPI_GPIO_PWR_STATUS) == WPI_GPIO_PWR_SLEEP)
2874
		return;	/* already asleep */
2875
3944
2876
	for (ntries = 0; ntries < 100; ntries++) {
3945
	return 0;
2877
		if (WPI_READ(sc, WPI_RESET) & WPI_MASTER_DISABLED)
2878
			break;
2879
		DELAY(10);
2880
	}
2881
	if (ntries == 100) {
2882
		device_printf(sc->sc_dev, "timeout waiting for master\n");
2883
	}
2884
}
3946
}
2885
3947
2886
static int
3948
static int
2887
wpi_power_up(struct wpi_softc *sc)
3949
wpi_key_alloc(struct ieee80211vap *vap, struct ieee80211_key *k,
3950
    ieee80211_keyix *keyix, ieee80211_keyix *rxkeyix)
2888
{
3951
{
2889
	uint32_t tmp;
3952
	struct ifnet *ifp = vap->iv_ifp;
2890
	int ntries;
3953
	struct wpi_softc *sc = ifp->if_softc;
2891
3954
2892
	wpi_mem_lock(sc);
3955
	if (!(&vap->iv_nw_keys[0] <= k &&
2893
	tmp = wpi_mem_read(sc, WPI_MEM_POWER);
3956
	    k < &vap->iv_nw_keys[IEEE80211_WEP_NKID])) {
2894
	wpi_mem_write(sc, WPI_MEM_POWER, tmp & ~0x03000000);
3957
		if (k->wk_flags & IEEE80211_KEY_GROUP) {
2895
	wpi_mem_unlock(sc);
3958
			/* should not happen */
3959
			DPRINTF(sc, WPI_DEBUG_KEY, "%s: bogus group key\n",
3960
			    __func__);
3961
			return 0;
3962
		}
3963
		*keyix = 0;	/* NB: use key index 0 for ucast key */
3964
	} else {
3965
		*keyix = *rxkeyix = k - vap->iv_nw_keys;
2896
3966
2897
	for (ntries = 0; ntries < 5000; ntries++) {
3967
		if (k->wk_cipher->ic_cipher == IEEE80211_CIPHER_AES_CCM)
2898
		if (WPI_READ(sc, WPI_GPIO_STATUS) & WPI_POWERED)
3968
			k->wk_flags |= IEEE80211_KEY_SWCRYPT;
2899
			break;
2900
		DELAY(10);
2901
	}
3969
	}
2902
	if (ntries == 5000) {
3970
	return 1;
2903
		device_printf(sc->sc_dev,
2904
		    "timeout waiting for NIC to power up\n");
2905
		return ETIMEDOUT;
2906
	}
2907
	return 0;
2908
}
3971
}
2909
3972
2910
static int
3973
static int
2911
wpi_reset(struct wpi_softc *sc)
3974
wpi_key_set(struct ieee80211vap *vap, const struct ieee80211_key *k,
3975
    const uint8_t mac[IEEE80211_ADDR_LEN])
2912
{
3976
{
2913
	uint32_t tmp;
3977
	const struct ieee80211_cipher *cip = k->wk_cipher;
2914
	int ntries;
3978
	struct ieee80211com *ic = vap->iv_ic;
3979
	struct ieee80211_node *ni = vap->iv_bss;
3980
	struct wpi_softc *sc = ic->ic_ifp->if_softc;
3981
	struct wpi_node *wn = (void *)ni;
3982
	struct wpi_node_info node;
3983
	uint16_t kflags;
3984
	int error;
2915
3985
2916
	DPRINTFN(WPI_DEBUG_HW,
3986
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_DOING, __func__);
2917
	    ("Resetting the card - clearing any uploaded firmware\n"));
2918
3987
2919
	/* clear any pending interrupts */
3988
	switch (cip->ic_cipher) {
2920
	WPI_WRITE(sc, WPI_INTR, 0xffffffff);
3989
	case IEEE80211_CIPHER_AES_CCM:
3990
		if (k->wk_flags & IEEE80211_KEY_GROUP)
3991
			return 1;
2921
3992
2922
	tmp = WPI_READ(sc, WPI_PLL_CTL);
3993
		kflags = WPI_KFLAG_CCMP;
2923
	WPI_WRITE(sc, WPI_PLL_CTL, tmp | WPI_PLL_INIT);
3994
		break;
3995
	default:
3996
		/* null_key_set() */
3997
		return 1;
3998
	}
2924
3999
2925
	tmp = WPI_READ(sc, WPI_CHICKEN);
4000
	if (wn->id == WPI_ID_UNDEFINED)
2926
	WPI_WRITE(sc, WPI_CHICKEN, tmp | WPI_CHICKEN_RXNOLOS);
4001
		return 0;
2927
4002
2928
	tmp = WPI_READ(sc, WPI_GPIO_CTL);
4003
	kflags |= WPI_KFLAG_KID(k->wk_keyix);
2929
	WPI_WRITE(sc, WPI_GPIO_CTL, tmp | WPI_GPIO_INIT);
4004
	if (k->wk_flags & IEEE80211_KEY_GROUP)
4005
		kflags |= WPI_KFLAG_MULTICAST;
2930
4006
2931
	/* wait for clock stabilization */
4007
	memset(&node, 0, sizeof node);
2932
	for (ntries = 0; ntries < 25000; ntries++) {
4008
	node.id = wn->id;
2933
		if (WPI_READ(sc, WPI_GPIO_CTL) & WPI_GPIO_CLOCK)
4009
	node.control = WPI_NODE_UPDATE;
2934
			break;
4010
	node.flags = WPI_FLAG_KEY_SET;
2935
		DELAY(10);
4011
	node.kflags = htole16(kflags);
2936
	}
4012
	memcpy(node.key, k->wk_key, k->wk_keylen);
2937
	if (ntries == 25000) {
2938
		device_printf(sc->sc_dev,
2939
		    "timeout waiting for clock stabilization\n");
2940
		return ETIMEDOUT;
2941
	}
2942
4013
2943
	/* initialize EEPROM */
4014
	DPRINTF(sc, WPI_DEBUG_KEY, "set key id=%d for node %d\n", k->wk_keyix,
2944
	tmp = WPI_READ(sc, WPI_EEPROM_STATUS);
4015
	    node.id);
2945
4016
2946
	if ((tmp & WPI_EEPROM_VERSION) == 0) {
4017
	error = wpi_cmd(sc, WPI_CMD_ADD_NODE, &node, sizeof node, 1);
2947
		device_printf(sc->sc_dev, "EEPROM not found\n");
4018
	if (error != 0) {
2948
		return EIO;
4019
		device_printf(sc->sc_dev, "can't update node info, error %d\n",
4020
		    error);
4021
		return 0;
2949
	}
4022
	}
2950
	WPI_WRITE(sc, WPI_EEPROM_STATUS, tmp & ~WPI_EEPROM_LOCKED);
2951
4023
2952
	return 0;
4024
	return 1;
2953
}
4025
}
2954
4026
2955
static void
4027
static int
2956
wpi_hw_config(struct wpi_softc *sc)
4028
wpi_key_delete(struct ieee80211vap *vap, const struct ieee80211_key *k)
2957
{
4029
{
2958
	uint32_t rev, hw;
4030
	const struct ieee80211_cipher *cip = k->wk_cipher;
4031
	struct ieee80211com *ic = vap->iv_ic;
4032
	struct ieee80211_node *ni = vap->iv_bss;
4033
	struct wpi_softc *sc = ic->ic_ifp->if_softc;
4034
	struct wpi_node *wn = (void *)ni;
4035
	struct wpi_node_info node;
2959
4036
2960
	/* voodoo from the Linux "driver".. */
4037
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_DOING, __func__);
2961
	hw = WPI_READ(sc, WPI_HWCONFIG);
2962
4038
2963
	rev = pci_read_config(sc->sc_dev, PCIR_REVID, 1);
4039
	switch (cip->ic_cipher) {
2964
	if ((rev & 0xc0) == 0x40)
4040
	case IEEE80211_CIPHER_AES_CCM:
2965
		hw |= WPI_HW_ALM_MB;
4041
		break;
2966
	else if (!(rev & 0x80))
4042
	default:
2967
		hw |= WPI_HW_ALM_MM;
4043
		/* null_key_delete() */
4044
		return 1;
4045
	}
2968
4046
2969
	if (sc->cap == 0x80)
4047
	if (vap->iv_state != IEEE80211_S_RUN ||
2970
		hw |= WPI_HW_SKU_MRC;
4048
	    (k->wk_flags & IEEE80211_KEY_GROUP))
4049
		return 1; /* Nothing to do. */
2971
4050
2972
	hw &= ~WPI_HW_REV_D;
4051
	memset(&node, 0, sizeof node);
2973
	if ((le16toh(sc->rev) & 0xf0) == 0xd0)
4052
	node.id = wn->id;
2974
		hw |= WPI_HW_REV_D;
4053
	node.control = WPI_NODE_UPDATE;
4054
	node.flags = WPI_FLAG_KEY_SET;
2975
4055
2976
	if (sc->type > 1)
4056
	DPRINTF(sc, WPI_DEBUG_KEY, "delete keys for node %d\n", node.id);
2977
		hw |= WPI_HW_TYPE_B;
4057
	(void)wpi_cmd(sc, WPI_CMD_ADD_NODE, &node, sizeof node, 1);
2978
4058
2979
	WPI_WRITE(sc, WPI_HWCONFIG, hw);
4059
	return 1;
2980
}
4060
}
2981
4061
2982
static void
4062
/*
2983
wpi_rfkill_resume(struct wpi_softc *sc)
4063
 * This function is called after the runtime firmware notifies us of its
4064
 * readiness (called in a process context).
4065
 */
4066
static int
4067
wpi_post_alive(struct wpi_softc *sc)
2984
{
4068
{
2985
	struct ifnet *ifp = sc->sc_ifp;
4069
	int ntries, error;
2986
	struct ieee80211com *ic = ifp->if_l2com;
2987
	struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
2988
	int ntries;
2989
4070
2990
	/* enable firmware again */
4071
	/* Check (again) that the radio is not disabled. */
2991
	WPI_WRITE(sc, WPI_UCODE_CLR, WPI_RADIO_OFF);
4072
	if ((error = wpi_nic_lock(sc)) != 0)
2992
	WPI_WRITE(sc, WPI_UCODE_CLR, WPI_DISABLE_CMD);
4073
		return error;
2993
4074
2994
	/* wait for thermal sensors to calibrate */
4075
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_DOING, __func__);
4076
4077
	/* NB: Runtime firmware must be up and running. */
4078
	if (!(wpi_prph_read(sc, WPI_APMG_RFKILL) & 1)) {
4079
 		device_printf(sc->sc_dev,
4080
		    "RF switch: radio disabled (%s)\n", __func__);
4081
		wpi_nic_unlock(sc);
4082
		return EPERM;   /* :-) */
4083
	}
4084
	wpi_nic_unlock(sc);
4085
4086
	/* Wait for thermal sensor to calibrate. */
2995
	for (ntries = 0; ntries < 1000; ntries++) {
4087
	for (ntries = 0; ntries < 1000; ntries++) {
2996
		if ((sc->temp = (int)WPI_READ(sc, WPI_TEMPERATURE)) != 0)
4088
		if ((sc->temp = (int)WPI_READ(sc, WPI_UCODE_GP2)) != 0)
2997
			break;
4089
			break;
2998
		DELAY(10);
4090
		DELAY(10);
2999
	}
4091
	}
Lines 3000-3506 Link Here
3000
4092
3001
	if (ntries == 1000) {
4093
	if (ntries == 1000) {
3002
		device_printf(sc->sc_dev,
4094
		device_printf(sc->sc_dev,
3003
		    "timeout waiting for thermal calibration\n");
4095
		    "timeout waiting for thermal sensor calibration\n");
3004
		return;
4096
                return ETIMEDOUT;
3005
	}
4097
        }
3006
	DPRINTFN(WPI_DEBUG_TEMP,("temperature %d\n", sc->temp));
3007
4098
3008
	if (wpi_config(sc) != 0) {
4099
        DPRINTF(sc, WPI_DEBUG_TEMP, "temperature %d\n", sc->temp);
3009
		device_printf(sc->sc_dev, "device config failed\n");
4100
        return 0;
3010
		return;
4101
}
3011
	}
3012
4102
3013
	ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
4103
/*
3014
	ifp->if_drv_flags |= IFF_DRV_RUNNING;
4104
 * The firmware boot code is small and is intended to be copied directly into
3015
	sc->flags &= ~WPI_FLAG_HW_RADIO_OFF;
4105
 * the NIC internal memory (no DMA transfer).
4106
 */
4107
static int
4108
wpi_load_bootcode(struct wpi_softc *sc, const uint8_t *ucode, int size)
4109
{
4110
	int error, ntries;
3016
4111
3017
	if (vap != NULL) {
4112
	DPRINTF(sc, WPI_DEBUG_HW, "Loading microcode size 0x%x\n", size);
3018
		if ((ic->ic_flags & IEEE80211_F_SCAN) == 0) {
4113
3019
			if (vap->iv_opmode != IEEE80211_M_MONITOR) {
4114
	size /= sizeof (uint32_t);
3020
				ieee80211_beacon_miss(ic);
4115
3021
				wpi_set_led(sc, WPI_LED_LINK, 0, 1);
4116
	if ((error = wpi_nic_lock(sc)) != 0)
3022
			} else
4117
		return error;
3023
				wpi_set_led(sc, WPI_LED_LINK, 5, 5);
4118
3024
		} else {
4119
	/* Copy microcode image into NIC memory. */
3025
			ieee80211_scan_next(vap);
4120
	wpi_prph_write_region_4(sc, WPI_BSM_SRAM_BASE,
3026
			wpi_set_led(sc, WPI_LED_LINK, 20, 2);
4121
	    (const uint32_t *)ucode, size);
4122
4123
	wpi_prph_write(sc, WPI_BSM_WR_MEM_SRC, 0);
4124
	wpi_prph_write(sc, WPI_BSM_WR_MEM_DST, WPI_FW_TEXT_BASE);
4125
	wpi_prph_write(sc, WPI_BSM_WR_DWCOUNT, size);
4126
4127
	/* Start boot load now. */
4128
	wpi_prph_write(sc, WPI_BSM_WR_CTRL, WPI_BSM_WR_CTRL_START);
4129
4130
	/* Wait for transfer to complete. */
4131
	for (ntries = 0; ntries < 1000; ntries++) {
4132
		uint32_t status = WPI_READ(sc, WPI_FH_TX_STATUS);
4133
		DPRINTF(sc, WPI_DEBUG_HW,
4134
		    "firmware status=0x%x, val=0x%x, result=0x%x\n", status,
4135
		    WPI_FH_TX_STATUS_IDLE(6),
4136
		    status & WPI_FH_TX_STATUS_IDLE(6));
4137
		if (status & WPI_FH_TX_STATUS_IDLE(6)) {
4138
			DPRINTF(sc, WPI_DEBUG_HW,
4139
			    "Status Match! - ntries = %d\n", ntries);
4140
			break;
3027
		}
4141
		}
4142
		DELAY(10);
3028
	}
4143
	}
4144
	if (ntries == 1000) {
4145
		device_printf(sc->sc_dev, "%s: could not load boot firmware\n",
4146
		    __func__);
4147
		wpi_nic_unlock(sc);
4148
		return ETIMEDOUT;
4149
	}
3029
4150
3030
	callout_reset(&sc->watchdog_to, hz, wpi_watchdog, sc);
4151
	/* Enable boot after power up. */
4152
	wpi_prph_write(sc, WPI_BSM_WR_CTRL, WPI_BSM_WR_CTRL_START_EN);
4153
4154
	wpi_nic_unlock(sc);
4155
	return 0;
3031
}
4156
}
3032
4157
3033
static void
4158
static int
3034
wpi_init_locked(struct wpi_softc *sc, int force)
4159
wpi_load_firmware(struct wpi_softc *sc)
3035
{
4160
{
3036
	struct ifnet *ifp = sc->sc_ifp;
4161
	struct wpi_fw_info *fw = &sc->fw;
3037
	uint32_t tmp;
4162
	struct wpi_dma_info *dma = &sc->fw_dma;
3038
	int ntries, qid;
4163
	int error;
3039
4164
3040
	wpi_stop_locked(sc);
4165
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_DOING, __func__);
3041
	(void)wpi_reset(sc);
3042
4166
3043
	wpi_mem_lock(sc);
4167
	/* Copy initialization sections into pre-allocated DMA-safe memory. */
3044
	wpi_mem_write(sc, WPI_MEM_CLOCK1, 0xa00);
4168
	memcpy(dma->vaddr, fw->init.data, fw->init.datasz);
3045
	DELAY(20);
4169
	bus_dmamap_sync(dma->tag, dma->map, BUS_DMASYNC_PREWRITE);
3046
	tmp = wpi_mem_read(sc, WPI_MEM_PCIDEV);
4170
	memcpy(dma->vaddr + WPI_FW_DATA_MAXSZ, fw->init.text, fw->init.textsz);
3047
	wpi_mem_write(sc, WPI_MEM_PCIDEV, tmp | 0x800);
4171
	bus_dmamap_sync(dma->tag, dma->map, BUS_DMASYNC_PREWRITE);
3048
	wpi_mem_unlock(sc);
3049
4172
3050
	(void)wpi_power_up(sc);
4173
	/* Tell adapter where to find initialization sections. */
3051
	wpi_hw_config(sc);
4174
	if ((error = wpi_nic_lock(sc)) != 0)
4175
		return error;
4176
	wpi_prph_write(sc, WPI_BSM_DRAM_DATA_ADDR, dma->paddr);
4177
	wpi_prph_write(sc, WPI_BSM_DRAM_DATA_SIZE, fw->init.datasz);
4178
	wpi_prph_write(sc, WPI_BSM_DRAM_TEXT_ADDR,
4179
	    dma->paddr + WPI_FW_DATA_MAXSZ);
4180
	wpi_prph_write(sc, WPI_BSM_DRAM_TEXT_SIZE, fw->init.textsz);
4181
	wpi_nic_unlock(sc);
3052
4182
3053
	/* init Rx ring */
4183
	/* Load firmware boot code. */
3054
	wpi_mem_lock(sc);
4184
	error = wpi_load_bootcode(sc, fw->boot.text, fw->boot.textsz);
3055
	WPI_WRITE(sc, WPI_RX_BASE, sc->rxq.desc_dma.paddr);
4185
	if (error != 0) {
3056
	WPI_WRITE(sc, WPI_RX_RIDX_PTR, sc->shared_dma.paddr +
4186
		device_printf(sc->sc_dev, "%s: could not load boot firmware\n",
3057
	    offsetof(struct wpi_shared, next));
4187
		    __func__);
3058
	WPI_WRITE(sc, WPI_RX_WIDX, (WPI_RX_RING_COUNT - 1) & ~7);
4188
		return error;
3059
	WPI_WRITE(sc, WPI_RX_CONFIG, 0xa9601010);
4189
	}
3060
	wpi_mem_unlock(sc);
3061
4190
3062
	/* init Tx rings */
4191
	/* Now press "execute". */
3063
	wpi_mem_lock(sc);
4192
	WPI_WRITE(sc, WPI_RESET, 0);
3064
	wpi_mem_write(sc, WPI_MEM_MODE, 2); /* bypass mode */
3065
	wpi_mem_write(sc, WPI_MEM_RA, 1);   /* enable RA0 */
3066
	wpi_mem_write(sc, WPI_MEM_TXCFG, 0x3f); /* enable all 6 Tx rings */
3067
	wpi_mem_write(sc, WPI_MEM_BYPASS1, 0x10000);
3068
	wpi_mem_write(sc, WPI_MEM_BYPASS2, 0x30002);
3069
	wpi_mem_write(sc, WPI_MEM_MAGIC4, 4);
3070
	wpi_mem_write(sc, WPI_MEM_MAGIC5, 5);
3071
4193
3072
	WPI_WRITE(sc, WPI_TX_BASE_PTR, sc->shared_dma.paddr);
4194
	/* Wait at most one second for first alive notification. */
3073
	WPI_WRITE(sc, WPI_MSG_CONFIG, 0xffff05a5);
4195
	if ((error = msleep(sc, &sc->sc_mtx, PCATCH, "wpiinit", hz)) != 0) {
3074
4196
		device_printf(sc->sc_dev,
3075
	for (qid = 0; qid < 6; qid++) {
4197
		    "%s: timeout waiting for adapter to initialize, error %d\n",
3076
		WPI_WRITE(sc, WPI_TX_CTL(qid), 0);
4198
		    __func__, error);
3077
		WPI_WRITE(sc, WPI_TX_BASE(qid), 0);
4199
		return error;
3078
		WPI_WRITE(sc, WPI_TX_CONFIG(qid), 0x80200008);
3079
	}
4200
	}
3080
	wpi_mem_unlock(sc);
3081
4201
3082
	/* clear "radio off" and "disable command" bits (reversed logic) */
4202
	/* Copy runtime sections into pre-allocated DMA-safe memory. */
3083
	WPI_WRITE(sc, WPI_UCODE_CLR, WPI_RADIO_OFF);
4203
	memcpy(dma->vaddr, fw->main.data, fw->main.datasz);
3084
	WPI_WRITE(sc, WPI_UCODE_CLR, WPI_DISABLE_CMD);
4204
	bus_dmamap_sync(dma->tag, dma->map, BUS_DMASYNC_PREWRITE);
3085
	sc->flags &= ~WPI_FLAG_HW_RADIO_OFF;
4205
	memcpy(dma->vaddr + WPI_FW_DATA_MAXSZ, fw->main.text, fw->main.textsz);
4206
	bus_dmamap_sync(dma->tag, dma->map, BUS_DMASYNC_PREWRITE);
3086
4207
3087
	/* clear any pending interrupts */
4208
	/* Tell adapter where to find runtime sections. */
3088
	WPI_WRITE(sc, WPI_INTR, 0xffffffff);
4209
	if ((error = wpi_nic_lock(sc)) != 0)
4210
		return error;
4211
	wpi_prph_write(sc, WPI_BSM_DRAM_DATA_ADDR, dma->paddr);
4212
	wpi_prph_write(sc, WPI_BSM_DRAM_DATA_SIZE, fw->main.datasz);
4213
	wpi_prph_write(sc, WPI_BSM_DRAM_TEXT_ADDR,
4214
	    dma->paddr + WPI_FW_DATA_MAXSZ);
4215
	wpi_prph_write(sc, WPI_BSM_DRAM_TEXT_SIZE,
4216
	    WPI_FW_UPDATED | fw->main.textsz);
4217
	wpi_nic_unlock(sc);
3089
4218
3090
	/* enable interrupts */
4219
	return 0;
3091
	WPI_WRITE(sc, WPI_MASK, WPI_INTR_MASK);
4220
}
3092
4221
3093
	WPI_WRITE(sc, WPI_UCODE_CLR, WPI_RADIO_OFF);
4222
static int
3094
	WPI_WRITE(sc, WPI_UCODE_CLR, WPI_RADIO_OFF);
4223
wpi_read_firmware(struct wpi_softc *sc)
4224
{
4225
	const struct firmware *fp;
4226
	struct wpi_fw_info *fw = &sc->fw;
4227
	const struct wpi_firmware_hdr *hdr;
4228
	int error;
3095
4229
3096
	if ((wpi_load_firmware(sc)) != 0) {
4230
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_DOING, __func__);
3097
	    device_printf(sc->sc_dev,
4231
3098
		"A problem occurred loading the firmware to the driver\n");
4232
	DPRINTF(sc, WPI_DEBUG_FIRMWARE,
3099
	    return;
4233
	    "Attempting Loading Firmware from %s module\n", WPI_FW_NAME);
4234
4235
	WPI_UNLOCK(sc);
4236
	fp = firmware_get(WPI_FW_NAME);
4237
	WPI_LOCK(sc);
4238
4239
	if (fp == NULL) {
4240
		device_printf(sc->sc_dev,
4241
		    "could not load firmware image '%s'\n", WPI_FW_NAME);
4242
		return EINVAL;
3100
	}
4243
	}
3101
4244
3102
	/* At this point the firmware is up and running. If the hardware
4245
	sc->fw_fp = fp;
3103
	 * RF switch is turned off thermal calibration will fail, though
3104
	 * the card is still happy to continue to accept commands, catch
3105
	 * this case and schedule a task to watch for it to be turned on.
3106
	 */
3107
	wpi_mem_lock(sc);
3108
	tmp = wpi_mem_read(sc, WPI_MEM_HW_RADIO_OFF);
3109
	wpi_mem_unlock(sc);
3110
4246
3111
	if (!(tmp & 0x1)) {
4247
	if (fp->datasize < sizeof (struct wpi_firmware_hdr)) {
3112
		sc->flags |= WPI_FLAG_HW_RADIO_OFF;
4248
		device_printf(sc->sc_dev,
3113
		device_printf(sc->sc_dev,"Radio Transmitter is switched off\n");
4249
		    "firmware file too short: %zu bytes\n", fp->datasize);
3114
		goto out;
4250
		error = EINVAL;
4251
		goto fail;
3115
	}
4252
	}
3116
4253
3117
	/* wait for thermal sensors to calibrate */
4254
	fw->size = fp->datasize;
3118
	for (ntries = 0; ntries < 1000; ntries++) {
4255
	fw->data = (const uint8_t *)fp->data;
3119
		if ((sc->temp = (int)WPI_READ(sc, WPI_TEMPERATURE)) != 0)
4256
3120
			break;
4257
	/* Extract firmware header information. */
3121
		DELAY(10);
4258
	hdr = (const struct wpi_firmware_hdr *)fw->data;
4259
4260
	/*     |  RUNTIME FIRMWARE   |    INIT FIRMWARE    | BOOT FW  |
4261
	   |HDR|<--TEXT-->|<--DATA-->|<--TEXT-->|<--DATA-->|<--TEXT-->| */
4262
4263
	fw->main.textsz = le32toh(hdr->rtextsz);
4264
	fw->main.datasz = le32toh(hdr->rdatasz);
4265
	fw->init.textsz = le32toh(hdr->itextsz);
4266
	fw->init.datasz = le32toh(hdr->idatasz);
4267
	fw->boot.textsz = le32toh(hdr->btextsz);
4268
	fw->boot.datasz = 0;
4269
4270
	/* Sanity-check firmware header. */
4271
	if (fw->main.textsz > WPI_FW_TEXT_MAXSZ ||
4272
	    fw->main.datasz > WPI_FW_DATA_MAXSZ ||
4273
	    fw->init.textsz > WPI_FW_TEXT_MAXSZ ||
4274
	    fw->init.datasz > WPI_FW_DATA_MAXSZ ||
4275
	    fw->boot.textsz > WPI_FW_BOOT_TEXT_MAXSZ ||
4276
	    (fw->boot.textsz & 3) != 0) {
4277
		device_printf(sc->sc_dev, "invalid firmware header\n");
4278
		error = EINVAL;
4279
		goto fail;
3122
	}
4280
	}
3123
4281
3124
	if (ntries == 1000) {
4282
	/* Check that all firmware sections fit. */
4283
	if (fw->size < sizeof (*hdr) + fw->main.textsz + fw->main.datasz +
4284
	    fw->init.textsz + fw->init.datasz + fw->boot.textsz) {
3125
		device_printf(sc->sc_dev,
4285
		device_printf(sc->sc_dev,
3126
		    "timeout waiting for thermal sensors calibration\n");
4286
		    "firmware file too short: %zu bytes\n", fw->size);
3127
		return;
4287
		error = EINVAL;
4288
		goto fail;
3128
	}
4289
	}
3129
	DPRINTFN(WPI_DEBUG_TEMP,("temperature %d\n", sc->temp));
3130
4290
3131
	if (wpi_config(sc) != 0) {
4291
	/* Get pointers to firmware sections. */
3132
		device_printf(sc->sc_dev, "device config failed\n");
4292
	fw->main.text = (const uint8_t *)(hdr + 1);
3133
		return;
4293
	fw->main.data = fw->main.text + fw->main.textsz;
3134
	}
4294
	fw->init.text = fw->main.data + fw->main.datasz;
4295
	fw->init.data = fw->init.text + fw->init.textsz;
4296
	fw->boot.text = fw->init.data + fw->init.datasz;
3135
4297
3136
	ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
4298
	DPRINTF(sc, WPI_DEBUG_FIRMWARE,
3137
	ifp->if_drv_flags |= IFF_DRV_RUNNING;
4299
	    "Firmware Version: Major %d, Minor %d, Driver %d, \n"
3138
out:
4300
	    "runtime (text: %u, data: %u) init (text: %u, data %u) boot (text %u)\n",
3139
	callout_reset(&sc->watchdog_to, hz, wpi_watchdog, sc);
4301
	    hdr->major, hdr->minor, le32toh(hdr->driver),
4302
	    fw->main.textsz, fw->main.datasz,
4303
	    fw->init.textsz, fw->init.datasz, fw->boot.textsz);
4304
4305
	DPRINTF(sc, WPI_DEBUG_FIRMWARE, "fw->main.text %p\n", fw->main.text);
4306
	DPRINTF(sc, WPI_DEBUG_FIRMWARE, "fw->main.data %p\n", fw->main.data);
4307
	DPRINTF(sc, WPI_DEBUG_FIRMWARE, "fw->init.text %p\n", fw->init.text);
4308
	DPRINTF(sc, WPI_DEBUG_FIRMWARE, "fw->init.data %p\n", fw->init.data);
4309
	DPRINTF(sc, WPI_DEBUG_FIRMWARE, "fw->boot.text %p\n", fw->boot.text);
4310
4311
	return 0;
4312
4313
fail:	wpi_unload_firmware(sc);
4314
	return error;
3140
}
4315
}
3141
4316
4317
/**
4318
 * Free the referenced firmware image
4319
 */
3142
static void
4320
static void
3143
wpi_init(void *arg)
4321
wpi_unload_firmware(struct wpi_softc *sc)
3144
{
4322
{
3145
	struct wpi_softc *sc = arg;
4323
	if (sc->fw_fp != NULL) {
3146
	struct ifnet *ifp = sc->sc_ifp;
4324
		firmware_put(sc->fw_fp, FIRMWARE_UNLOAD);
3147
	struct ieee80211com *ic = ifp->if_l2com;
4325
		sc->fw_fp = NULL;
4326
	}
4327
}
3148
4328
3149
	WPI_LOCK(sc);
4329
static int
3150
	wpi_init_locked(sc, 0);
4330
wpi_clock_wait(struct wpi_softc *sc)
3151
	WPI_UNLOCK(sc);
4331
{
4332
	int ntries;
3152
4333
3153
	if (ifp->if_drv_flags & IFF_DRV_RUNNING)
4334
	/* Set "initialization complete" bit. */
3154
		ieee80211_start_all(ic);		/* start all vaps */
4335
	WPI_SETBITS(sc, WPI_GP_CNTRL, WPI_GP_CNTRL_INIT_DONE);
4336
4337
	/* Wait for clock stabilization. */
4338
	for (ntries = 0; ntries < 2500; ntries++) {
4339
		if (WPI_READ(sc, WPI_GP_CNTRL) & WPI_GP_CNTRL_MAC_CLOCK_READY)
4340
			return 0;
4341
		DELAY(100);
4342
	}
4343
	device_printf(sc->sc_dev,
4344
	    "%s: timeout waiting for clock stabilization\n", __func__);
4345
4346
	return ETIMEDOUT;
3155
}
4347
}
3156
4348
3157
static void
4349
static int
3158
wpi_stop_locked(struct wpi_softc *sc)
4350
wpi_apm_init(struct wpi_softc *sc)
3159
{
4351
{
3160
	struct ifnet *ifp = sc->sc_ifp;
4352
	uint32_t reg;
3161
	uint32_t tmp;
4353
	int error;
3162
	int ac;
3163
4354
3164
	sc->sc_tx_timer = 0;
4355
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_DOING, __func__);
3165
	sc->sc_scan_timer = 0;
3166
	ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
3167
	sc->flags &= ~WPI_FLAG_HW_RADIO_OFF;
3168
	callout_stop(&sc->watchdog_to);
3169
	callout_stop(&sc->calib_to);
3170
4356
3171
	/* disable interrupts */
4357
	/* Disable L0s exit timer (NMI bug workaround). */
3172
	WPI_WRITE(sc, WPI_MASK, 0);
4358
	WPI_SETBITS(sc, WPI_GIO_CHICKEN, WPI_GIO_CHICKEN_DIS_L0S_TIMER);
3173
	WPI_WRITE(sc, WPI_INTR, WPI_INTR_MASK);
4359
	/* Don't wait for ICH L0s (ICH bug workaround). */
3174
	WPI_WRITE(sc, WPI_INTR_STATUS, 0xff);
4360
	WPI_SETBITS(sc, WPI_GIO_CHICKEN, WPI_GIO_CHICKEN_L1A_NO_L0S_RX);
3175
	WPI_WRITE(sc, WPI_INTR_STATUS, 0x00070000);
3176
4361
3177
	wpi_mem_lock(sc);
4362
	/* Set FH wait threshold to max (HW bug under stress workaround). */
3178
	wpi_mem_write(sc, WPI_MEM_MODE, 0);
4363
	WPI_SETBITS(sc, WPI_DBG_HPET_MEM, 0xffff0000);
3179
	wpi_mem_unlock(sc);
3180
4364
3181
	/* reset all Tx rings */
4365
	/* Retrieve PCIe Active State Power Management (ASPM). */
3182
	for (ac = 0; ac < 4; ac++)
4366
	reg = pci_read_config(sc->sc_dev, sc->sc_cap_off + 0x10, 1);
3183
		wpi_reset_tx_ring(sc, &sc->txq[ac]);
4367
	/* Workaround for HW instability in PCIe L0->L0s->L1 transition. */
3184
	wpi_reset_tx_ring(sc, &sc->cmdq);
4368
	if (reg & 0x02)	/* L1 Entry enabled. */
4369
		WPI_SETBITS(sc, WPI_GIO, WPI_GIO_L0S_ENA);
4370
	else
4371
		WPI_CLRBITS(sc, WPI_GIO, WPI_GIO_L0S_ENA);
3185
4372
3186
	/* reset Rx ring */
4373
	WPI_SETBITS(sc, WPI_ANA_PLL, WPI_ANA_PLL_INIT);
3187
	wpi_reset_rx_ring(sc, &sc->rxq);
3188
4374
3189
	wpi_mem_lock(sc);
4375
	/* Wait for clock stabilization before accessing prph. */
3190
	wpi_mem_write(sc, WPI_MEM_CLOCK2, 0x200);
4376
	if ((error = wpi_clock_wait(sc)) != 0)
3191
	wpi_mem_unlock(sc);
4377
		return error;
3192
4378
3193
	DELAY(5);
4379
	if ((error = wpi_nic_lock(sc)) != 0)
4380
		return error;
4381
	/* Enable DMA and BSM (Bootstrap State Machine). */
4382
	wpi_prph_write(sc, WPI_APMG_CLK_EN,
4383
	    WPI_APMG_CLK_CTRL_DMA_CLK_RQT | WPI_APMG_CLK_CTRL_BSM_CLK_RQT);
4384
	DELAY(20);
4385
	/* Disable L1-Active. */
4386
	wpi_prph_setbits(sc, WPI_APMG_PCI_STT, WPI_APMG_PCI_STT_L1A_DIS);
4387
	wpi_nic_unlock(sc);
3194
4388
3195
	wpi_stop_master(sc);
4389
	return 0;
4390
}
3196
4391
3197
	tmp = WPI_READ(sc, WPI_RESET);
4392
static void
3198
	WPI_WRITE(sc, WPI_RESET, tmp | WPI_SW_RESET);
4393
wpi_apm_stop_master(struct wpi_softc *sc)
3199
	sc->flags &= ~WPI_FLAG_BUSY;
4394
{
4395
	int ntries;
4396
4397
	/* Stop busmaster DMA activity. */
4398
	WPI_SETBITS(sc, WPI_RESET, WPI_RESET_STOP_MASTER);
4399
 	 
4400
	if ((WPI_READ(sc, WPI_GP_CNTRL) & WPI_GP_CNTRL_PS_MASK) ==
4401
	    WPI_GP_CNTRL_MAC_PS)
4402
		return; /* Already asleep. */
4403
4404
	for (ntries = 0; ntries < 100; ntries++) {
4405
		if (WPI_READ(sc, WPI_RESET) & WPI_RESET_MASTER_DISABLED)
4406
			return;
4407
		DELAY(10);
4408
	}
4409
	device_printf(sc->sc_dev, "%s: timeout waiting for master\n", __func__);
3200
}
4410
}
3201
4411
3202
static void
4412
static void
3203
wpi_stop(struct wpi_softc *sc)
4413
wpi_apm_stop(struct wpi_softc *sc)
3204
{
4414
{
3205
	WPI_LOCK(sc);
4415
	wpi_apm_stop_master(sc);
3206
	wpi_stop_locked(sc);
4416
3207
	WPI_UNLOCK(sc);
4417
	/* Reset the entire device. */
4418
	WPI_SETBITS(sc, WPI_RESET, WPI_RESET_SW);
4419
	DELAY(10);
4420
	/* Clear "initialization complete" bit. */
4421
	WPI_CLRBITS(sc, WPI_GP_CNTRL, WPI_GP_CNTRL_INIT_DONE);
3208
}
4422
}
3209
4423
3210
static void
4424
static void
3211
wpi_calib_timeout(void *arg)
4425
wpi_nic_config(struct wpi_softc *sc)
3212
{
4426
{
3213
	struct wpi_softc *sc = arg;
4427
	uint32_t rev;
3214
	struct ifnet *ifp = sc->sc_ifp;
3215
	struct ieee80211com *ic = ifp->if_l2com;
3216
	struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
3217
	int temp;
3218
4428
3219
	if (vap->iv_state != IEEE80211_S_RUN)
4429
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_DOING, __func__);
3220
		return;
3221
4430
3222
	/* update sensor data */
4431
	/* voodoo from the Linux "driver".. */
3223
	temp = (int)WPI_READ(sc, WPI_TEMPERATURE);
4432
	rev = pci_read_config(sc->sc_dev, PCIR_REVID, 1);
3224
	DPRINTFN(WPI_DEBUG_TEMP,("Temp in calibration is: %d\n", temp));
4433
	if ((rev & 0xc0) == 0x40)
4434
		WPI_SETBITS(sc, WPI_HW_IF_CONFIG, WPI_HW_IF_CONFIG_ALM_MB);
4435
	else if (!(rev & 0x80))
4436
		WPI_SETBITS(sc, WPI_HW_IF_CONFIG, WPI_HW_IF_CONFIG_ALM_MM);
3225
4437
3226
	wpi_power_calibration(sc, temp);
4438
	if (sc->cap == 0x80)
4439
		WPI_SETBITS(sc, WPI_HW_IF_CONFIG, WPI_HW_IF_CONFIG_SKU_MRC);
3227
4440
3228
	callout_reset(&sc->calib_to, 60*hz, wpi_calib_timeout, sc);
4441
	if ((le16toh(sc->rev) & 0xf0) == 0xd0)
4442
		WPI_SETBITS(sc, WPI_HW_IF_CONFIG, WPI_HW_IF_CONFIG_REV_D);
4443
	else
4444
		WPI_CLRBITS(sc, WPI_HW_IF_CONFIG, WPI_HW_IF_CONFIG_REV_D);
4445
4446
	if (sc->type > 1)
4447
		WPI_SETBITS(sc, WPI_HW_IF_CONFIG, WPI_HW_IF_CONFIG_TYPE_B);
3229
}
4448
}
3230
4449
3231
/*
4450
static int
3232
 * This function is called periodically (every 60 seconds) to adjust output
4451
wpi_hw_init(struct wpi_softc *sc)
3233
 * power to temperature changes.
3234
 */
3235
static void
3236
wpi_power_calibration(struct wpi_softc *sc, int temp)
3237
{
4452
{
3238
	struct ifnet *ifp = sc->sc_ifp;
4453
	int chnl, ntries, error;
3239
	struct ieee80211com *ic = ifp->if_l2com;
3240
	struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
3241
4454
3242
	/* sanity-check read value */
4455
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_BEGIN, __func__);
3243
	if (temp < -260 || temp > 25) {
4456
3244
		/* this can't be correct, ignore */
4457
	/* Clear pending interrupts. */
3245
		DPRINTFN(WPI_DEBUG_TEMP,
4458
	WPI_WRITE(sc, WPI_INT, 0xffffffff);
3246
		    ("out-of-range temperature reported: %d\n", temp));
4459
3247
		return;
4460
	if ((error = wpi_apm_init(sc)) != 0) {
4461
		device_printf(sc->sc_dev,
4462
		    "%s: could not power ON adapter, error %d\n", __func__,
4463
		    error);
4464
		return error;
3248
	}
4465
	}
3249
4466
3250
	DPRINTFN(WPI_DEBUG_TEMP,("temperature %d->%d\n", sc->temp, temp));
4467
	/* Select VMAIN power source. */
4468
	if ((error = wpi_nic_lock(sc)) != 0)
4469
		return error;
4470
	wpi_prph_clrbits(sc, WPI_APMG_PS, WPI_APMG_PS_PWR_SRC_MASK);
4471
	wpi_nic_unlock(sc);
4472
	/* Spin until VMAIN gets selected. */
4473
	for (ntries = 0; ntries < 5000; ntries++) {
4474
		if (WPI_READ(sc, WPI_GPIO_IN) & WPI_GPIO_IN_VMAIN)
4475
			break;
4476
		DELAY(10);
4477
	}
4478
	if (ntries == 5000) {
4479
		device_printf(sc->sc_dev, "timeout selecting power source\n");
4480
		return ETIMEDOUT;
4481
	}
3251
4482
3252
	/* adjust Tx power if need be */
4483
	/* Perform adapter initialization. */
3253
	if (abs(temp - sc->temp) <= 6)
4484
	wpi_nic_config(sc);
3254
		return;
3255
4485
3256
	sc->temp = temp;
4486
	/* Initialize RX ring. */
4487
	if ((error = wpi_nic_lock(sc)) != 0)
4488
		return error;
4489
	/* Set physical address of RX ring. */
4490
	WPI_WRITE(sc, WPI_FH_RX_BASE, sc->rxq.desc_dma.paddr);
4491
	/* Set physical address of RX read pointer. */
4492
	WPI_WRITE(sc, WPI_FH_RX_RPTR_ADDR, sc->shared_dma.paddr +
4493
	    offsetof(struct wpi_shared, next));
4494
	WPI_WRITE(sc, WPI_FH_RX_WPTR, 0);
4495
	/* Enable RX. */
4496
	WPI_WRITE(sc, WPI_FH_RX_CONFIG,
4497
	    WPI_FH_RX_CONFIG_DMA_ENA |
4498
	    WPI_FH_RX_CONFIG_RDRBD_ENA |
4499
	    WPI_FH_RX_CONFIG_WRSTATUS_ENA |
4500
	    WPI_FH_RX_CONFIG_MAXFRAG |
4501
	    WPI_FH_RX_CONFIG_NRBD(WPI_RX_RING_COUNT_LOG) |
4502
	    WPI_FH_RX_CONFIG_IRQ_DST_HOST |
4503
	    WPI_FH_RX_CONFIG_IRQ_TIMEOUT(1));
4504
	(void)WPI_READ(sc, WPI_FH_RSSR_TBL);	/* barrier */
4505
	wpi_nic_unlock(sc);
4506
	WPI_WRITE(sc, WPI_FH_RX_WPTR, (WPI_RX_RING_COUNT - 1) & ~7);
3257
4507
3258
	if (wpi_set_txpower(sc, vap->iv_bss->ni_chan, 1) != 0) {
4508
	/* Initialize TX rings. */
3259
		/* just warn, too bad for the automatic calibration... */
4509
	if ((error = wpi_nic_lock(sc)) != 0)
3260
		device_printf(sc->sc_dev,"could not adjust Tx power\n");
4510
		return error;
4511
	wpi_prph_write(sc, WPI_ALM_SCHED_MODE, 2);	/* bypass mode */
4512
	wpi_prph_write(sc, WPI_ALM_SCHED_ARASTAT, 1);	/* enable RA0 */
4513
	/* Enable all 6 TX rings. */
4514
	wpi_prph_write(sc, WPI_ALM_SCHED_TXFACT, 0x3f);
4515
	wpi_prph_write(sc, WPI_ALM_SCHED_SBYPASS_MODE1, 0x10000);
4516
	wpi_prph_write(sc, WPI_ALM_SCHED_SBYPASS_MODE2, 0x30002);
4517
	wpi_prph_write(sc, WPI_ALM_SCHED_TXF4MF, 4);
4518
	wpi_prph_write(sc, WPI_ALM_SCHED_TXF5MF, 5);
4519
	/* Set physical address of TX rings. */
4520
	WPI_WRITE(sc, WPI_FH_TX_BASE, sc->shared_dma.paddr);
4521
	WPI_WRITE(sc, WPI_FH_MSG_CONFIG, 0xffff05a5);
4522
4523
	/* Enable all DMA channels. */
4524
	for (chnl = 0; chnl < WPI_NDMACHNLS; chnl++) {
4525
		WPI_WRITE(sc, WPI_FH_CBBC_CTRL(chnl), 0);
4526
		WPI_WRITE(sc, WPI_FH_CBBC_BASE(chnl), 0);
4527
		WPI_WRITE(sc, WPI_FH_TX_CONFIG(chnl), 0x80200008);
3261
	}
4528
	}
4529
	wpi_nic_unlock(sc);
4530
	(void)WPI_READ(sc, WPI_FH_TX_BASE);	/* barrier */
4531
4532
	/* Clear "radio off" and "commands blocked" bits. */
4533
	WPI_WRITE(sc, WPI_UCODE_GP1_CLR, WPI_UCODE_GP1_RFKILL);
4534
	WPI_WRITE(sc, WPI_UCODE_GP1_CLR, WPI_UCODE_GP1_CMD_BLOCKED);
4535
4536
	/* Clear pending interrupts. */
4537
	WPI_WRITE(sc, WPI_INT, 0xffffffff);
4538
	/* Enable interrupts. */
4539
	WPI_WRITE(sc, WPI_INT_MASK, WPI_INT_MASK_DEF);
4540
4541
	/* _Really_ make sure "radio off" bit is cleared! */
4542
	WPI_WRITE(sc, WPI_UCODE_GP1_CLR, WPI_UCODE_GP1_RFKILL);
4543
	WPI_WRITE(sc, WPI_UCODE_GP1_CLR, WPI_UCODE_GP1_RFKILL);
4544
4545
	if ((error = wpi_load_firmware(sc)) != 0) {
4546
		device_printf(sc->sc_dev,
4547
		    "%s: could not load firmware, error %d\n", __func__,
4548
		    error);
4549
		return error;
4550
	}
4551
	/* Wait at most one second for firmware alive notification. */
4552
	if ((error = msleep(sc, &sc->sc_mtx, PCATCH, "wpiinit", hz)) != 0) {
4553
		device_printf(sc->sc_dev,
4554
		    "%s: timeout waiting for adapter to initialize, error %d\n",
4555
		    __func__, error);
4556
		return error;
4557
	}
4558
4559
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END, __func__);
4560
4561
	/* Do post-firmware initialization. */
4562
	return wpi_post_alive(sc);
3262
}
4563
}
3263
4564
3264
/**
3265
 * Read the eeprom to find out what channels are valid for the given
3266
 * band and update net80211 with what we find.
3267
 */
3268
static void
4565
static void
3269
wpi_read_eeprom_channels(struct wpi_softc *sc, int n)
4566
wpi_hw_stop(struct wpi_softc *sc)
3270
{
4567
{
3271
	struct ifnet *ifp = sc->sc_ifp;
4568
	int chnl, qid, ntries;
3272
	struct ieee80211com *ic = ifp->if_l2com;
3273
	const struct wpi_chan_band *band = &wpi_bands[n];
3274
	struct wpi_eeprom_chan channels[WPI_MAX_CHAN_PER_BAND];
3275
	struct ieee80211_channel *c;
3276
	int chan, i, passive;
3277
4569
3278
	wpi_read_prom_data(sc, band->addr, channels,
4570
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_DOING, __func__);
3279
	    band->nchan * sizeof (struct wpi_eeprom_chan));
3280
4571
3281
	for (i = 0; i < band->nchan; i++) {
4572
	if (WPI_READ(sc, WPI_UCODE_GP1) & WPI_UCODE_GP1_MAC_SLEEP)
3282
		if (!(channels[i].flags & WPI_EEPROM_CHAN_VALID)) {
4573
		wpi_nic_lock(sc);
3283
			DPRINTFN(WPI_DEBUG_HW,
3284
			    ("Channel Not Valid: %d, band %d\n",
3285
			     band->chan[i],n));
3286
			continue;
3287
		}
3288
4574
3289
		passive = 0;
4575
	WPI_WRITE(sc, WPI_RESET, WPI_RESET_NEVO);
3290
		chan = band->chan[i];
3291
		c = &ic->ic_channels[ic->ic_nchans++];
3292
4576
3293
		/* is active scan allowed on this channel? */
4577
	/* Disable interrupts. */
3294
		if (!(channels[i].flags & WPI_EEPROM_CHAN_ACTIVE)) {
4578
	WPI_WRITE(sc, WPI_INT_MASK, 0);
3295
			passive = IEEE80211_CHAN_PASSIVE;
4579
	WPI_WRITE(sc, WPI_INT, 0xffffffff);
3296
		}
4580
	WPI_WRITE(sc, WPI_FH_INT, 0xffffffff);
3297
4581
3298
		if (n == 0) {	/* 2GHz band */
4582
	/* Make sure we no longer hold the NIC lock. */
3299
			c->ic_ieee = chan;
4583
	wpi_nic_unlock(sc);
3300
			c->ic_freq = ieee80211_ieee2mhz(chan,
3301
			    IEEE80211_CHAN_2GHZ);
3302
			c->ic_flags = IEEE80211_CHAN_B | passive;
3303
4584
3304
			c = &ic->ic_channels[ic->ic_nchans++];
4585
	if (wpi_nic_lock(sc) == 0) {
3305
			c->ic_ieee = chan;
4586
		/* Stop TX scheduler. */
3306
			c->ic_freq = ieee80211_ieee2mhz(chan,
4587
		wpi_prph_write(sc, WPI_ALM_SCHED_MODE, 0);
3307
			    IEEE80211_CHAN_2GHZ);
4588
		wpi_prph_write(sc, WPI_ALM_SCHED_TXFACT, 0);
3308
			c->ic_flags = IEEE80211_CHAN_G | passive;
3309
4589
3310
		} else {	/* 5GHz band */
4590
		/* Stop all DMA channels. */
3311
			/*
4591
		for (chnl = 0; chnl < WPI_NDMACHNLS; chnl++) {
3312
			 * Some 3945ABG adapters support channels 7, 8, 11
4592
			WPI_WRITE(sc, WPI_FH_TX_CONFIG(chnl), 0);
3313
			 * and 12 in the 2GHz *and* 5GHz bands.
4593
			for (ntries = 0; ntries < 200; ntries++) {
3314
			 * Because of limitations in our net80211(9) stack,
4594
				if (WPI_READ(sc, WPI_FH_TX_STATUS) &
3315
			 * we can't support these channels in 5GHz band.
4595
				    WPI_FH_TX_STATUS_IDLE(chnl))
3316
			 * XXX not true; just need to map to proper frequency
4596
					break;
3317
			 */
4597
				DELAY(10);
3318
			if (chan <= 14)
4598
			}
3319
				continue;
3320
3321
			c->ic_ieee = chan;
3322
			c->ic_freq = ieee80211_ieee2mhz(chan,
3323
			    IEEE80211_CHAN_5GHZ);
3324
			c->ic_flags = IEEE80211_CHAN_A | passive;
3325
		}
4599
		}
4600
		wpi_nic_unlock(sc);
4601
	}
3326
4602
3327
		/* save maximum allowed power for this channel */
4603
	/* Stop RX ring. */
3328
		sc->maxpwr[chan] = channels[i].maxpwr;
4604
	wpi_reset_rx_ring(sc);
3329
4605
3330
#if 0
4606
	/* Reset all TX rings. */
3331
		// XXX We can probably use this an get rid of maxpwr - ben 20070617
4607
	for (qid = 0; qid < WPI_NTXQUEUES; qid++)
3332
		ic->ic_channels[chan].ic_maxpower = channels[i].maxpwr;
4608
		wpi_reset_tx_ring(sc, &sc->txq[qid]);
3333
		//ic->ic_channels[chan].ic_minpower...
3334
		//ic->ic_channels[chan].ic_maxregtxpower...
3335
#endif
3336
4609
3337
		DPRINTF(("adding chan %d (%dMHz) flags=0x%x maxpwr=%d"
4610
	if (wpi_nic_lock(sc) == 0) {
3338
		    " passive=%d, offset %d\n", chan, c->ic_freq,
4611
		wpi_prph_write(sc, WPI_APMG_CLK_DIS,
3339
		    channels[i].flags, sc->maxpwr[chan],
4612
		    WPI_APMG_CLK_CTRL_DMA_CLK_RQT);
3340
		    (c->ic_flags & IEEE80211_CHAN_PASSIVE) != 0,
4613
		wpi_nic_unlock(sc);
3341
		    ic->ic_nchans));
3342
	}
4614
	}
4615
	DELAY(5);
4616
	/* Power OFF adapter. */
4617
	wpi_apm_stop(sc);
3343
}
4618
}
3344
4619
3345
static void
4620
static void
3346
wpi_read_eeprom_group(struct wpi_softc *sc, int n)
4621
wpi_radio_on(void *arg0, int pending)
3347
{
4622
{
3348
	struct wpi_power_group *group = &sc->groups[n];
4623
	struct wpi_softc *sc = arg0;
3349
	struct wpi_eeprom_group rgroup;
4624
	struct ifnet *ifp = sc->sc_ifp;
3350
	int i;
4625
	struct ieee80211com *ic = ifp->if_l2com;
4626
	struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
3351
4627
3352
	wpi_read_prom_data(sc, WPI_EEPROM_POWER_GRP + n * 32, &rgroup,
4628
	device_printf(sc->sc_dev, "RF switch: radio enabled\n");
3353
	    sizeof rgroup);
3354
4629
3355
	/* save power group information */
4630
	if (vap != NULL) {
3356
	group->chan   = rgroup.chan;
4631
		wpi_init(sc);
3357
	group->maxpwr = rgroup.maxpwr;
4632
		ieee80211_init(vap);
3358
	/* temperature at which the samples were taken */
4633
	}
3359
	group->temp   = (int16_t)le16toh(rgroup.temp);
3360
4634
3361
	DPRINTF(("power group %d: chan=%d maxpwr=%d temp=%d\n", n,
4635
	if (WPI_READ(sc, WPI_GP_CNTRL) & WPI_GP_CNTRL_RFKILL) {
3362
		    group->chan, group->maxpwr, group->temp));
4636
		WPI_LOCK(sc);
3363
4637
		callout_stop(&sc->watchdog_rfkill);
3364
	for (i = 0; i < WPI_SAMPLES_COUNT; i++) {
4638
		WPI_UNLOCK(sc);
3365
		group->samples[i].index = rgroup.samples[i].index;
3366
		group->samples[i].power = rgroup.samples[i].power;
3367
3368
		DPRINTF(("\tsample %d: index=%d power=%d\n", i,
3369
			    group->samples[i].index, group->samples[i].power));
3370
	}
4639
	}
3371
}
4640
}
3372
4641
3373
/*
4642
static void
3374
 * Update Tx power to match what is defined for channel `c'.
4643
wpi_radio_off(void *arg0, int pending)
3375
 */
3376
static int
3377
wpi_set_txpower(struct wpi_softc *sc, struct ieee80211_channel *c, int async)
3378
{
4644
{
4645
	struct wpi_softc *sc = arg0;
3379
	struct ifnet *ifp = sc->sc_ifp;
4646
	struct ifnet *ifp = sc->sc_ifp;
3380
	struct ieee80211com *ic = ifp->if_l2com;
4647
	struct ieee80211com *ic = ifp->if_l2com;
3381
	struct wpi_power_group *group;
4648
	struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
3382
	struct wpi_cmd_txpower txpower;
3383
	u_int chan;
3384
	int i;
3385
4649
3386
	/* get channel number */
4650
	device_printf(sc->sc_dev, "RF switch: radio disabled\n");
3387
	chan = ieee80211_chan2ieee(ic, c);
3388
4651
3389
	/* find the power group to which this channel belongs */
4652
	wpi_stop(sc);
3390
	if (IEEE80211_IS_CHAN_5GHZ(c)) {
4653
	if (vap != NULL)
3391
		for (group = &sc->groups[1]; group < &sc->groups[4]; group++)
4654
		ieee80211_stop(vap);
3392
			if (chan <= group->chan)
3393
				break;
3394
	} else
3395
		group = &sc->groups[0];
3396
4655
3397
	memset(&txpower, 0, sizeof txpower);
4656
	callout_reset(&sc->watchdog_rfkill, hz, wpi_watchdog_rfkill, sc);
3398
	txpower.band = IEEE80211_IS_CHAN_5GHZ(c) ? 0 : 1;
4657
}
3399
	txpower.channel = htole16(chan);
3400
4658
3401
	/* set Tx power for all OFDM and CCK rates */
4659
static void
3402
	for (i = 0; i <= 11 ; i++) {
4660
wpi_init_locked(struct wpi_softc *sc)
3403
		/* retrieve Tx power for this channel/rate combination */
4661
{
3404
		int idx = wpi_get_power_index(sc, group, c,
4662
	struct ifnet *ifp = sc->sc_ifp;
3405
		    wpi_ridx_to_rate[i]);
4663
	int error;
3406
4664
3407
		txpower.rates[i].rate = wpi_ridx_to_plcp[i];
4665
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_BEGIN, __func__);
3408
4666
3409
		if (IEEE80211_IS_CHAN_5GHZ(c)) {
4667
	WPI_LOCK_ASSERT(sc);
3410
			txpower.rates[i].gain_radio = wpi_rf_gain_5ghz[idx];
4668
3411
			txpower.rates[i].gain_dsp = wpi_dsp_gain_5ghz[idx];
4669
	/* Check that the radio is not disabled by hardware switch. */
3412
		} else {
4670
	if (!(WPI_READ(sc, WPI_GP_CNTRL) & WPI_GP_CNTRL_RFKILL)) {
3413
			txpower.rates[i].gain_radio = wpi_rf_gain_2ghz[idx];
4671
		device_printf(sc->sc_dev,
3414
			txpower.rates[i].gain_dsp = wpi_dsp_gain_2ghz[idx];
4672
		    "RF switch: radio disabled (%s)\n", __func__);
3415
		}
4673
		callout_reset(&sc->watchdog_rfkill, hz, wpi_watchdog_rfkill,
3416
		DPRINTFN(WPI_DEBUG_TEMP,("chan %d/rate %d: power index %d\n",
4674
		    sc);
3417
			    chan, wpi_ridx_to_rate[i], idx));
4675
		return;
3418
	}
4676
	}
3419
4677
3420
	return wpi_cmd(sc, WPI_CMD_TXPOWER, &txpower, sizeof txpower, async);
4678
	/* Read firmware images from the filesystem. */
3421
}
4679
	if ((error = wpi_read_firmware(sc)) != 0) {
4680
		device_printf(sc->sc_dev,
4681
		    "%s: could not read firmware, error %d\n", __func__,
4682
		    error);
4683
		goto fail;
4684
	}
3422
4685
3423
/*
4686
	/* Initialize hardware and upload firmware. */
3424
 * Determine Tx power index for a given channel/rate combination.
4687
	error = wpi_hw_init(sc);
3425
 * This takes into account the regulatory information from EEPROM and the
4688
	wpi_unload_firmware(sc);
3426
 * current temperature.
4689
	if (error != 0) {
3427
 */
4690
		device_printf(sc->sc_dev,
3428
static int
4691
		    "%s: could not initialize hardware, error %d\n", __func__,
3429
wpi_get_power_index(struct wpi_softc *sc, struct wpi_power_group *group,
4692
		    error);
3430
    struct ieee80211_channel *c, int rate)
4693
		goto fail;
3431
{
4694
	}
3432
/* fixed-point arithmetic division using a n-bit fractional part */
3433
#define fdivround(a, b, n)      \
3434
	((((1 << n) * (a)) / (b) + (1 << n) / 2) / (1 << n))
3435
4695
3436
/* linear interpolation */
4696
	/* Configure adapter now that it is ready. */
3437
#define interpolate(x, x1, y1, x2, y2, n)       \
4697
	if ((error = wpi_config(sc)) != 0) {
3438
	((y1) + fdivround(((x) - (x1)) * ((y2) - (y1)), (x2) - (x1), n))
4698
		device_printf(sc->sc_dev,
4699
		    "%s: could not configure device, error %d\n", __func__,
4700
		    error);
4701
		goto fail;
4702
	}
3439
4703
3440
	struct ifnet *ifp = sc->sc_ifp;
4704
	ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
3441
	struct ieee80211com *ic = ifp->if_l2com;
4705
	ifp->if_drv_flags |= IFF_DRV_RUNNING;
3442
	struct wpi_power_sample *sample;
3443
	int pwr, idx;
3444
	u_int chan;
3445
4706
3446
	/* get channel number */
4707
	callout_reset(&sc->watchdog_to, hz, wpi_watchdog, sc);
3447
	chan = ieee80211_chan2ieee(ic, c);
3448
4708
3449
	/* default power is group's maximum power - 3dB */
4709
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END, __func__);
3450
	pwr = group->maxpwr / 2;
3451
4710
3452
	/* decrease power for highest OFDM rates to reduce distortion */
4711
	return;
3453
	switch (rate) {
3454
		case 72:	/* 36Mb/s */
3455
			pwr -= IEEE80211_IS_CHAN_2GHZ(c) ? 0 :  5;
3456
			break;
3457
		case 96:	/* 48Mb/s */
3458
			pwr -= IEEE80211_IS_CHAN_2GHZ(c) ? 7 : 10;
3459
			break;
3460
		case 108:	/* 54Mb/s */
3461
			pwr -= IEEE80211_IS_CHAN_2GHZ(c) ? 9 : 12;
3462
			break;
3463
	}
3464
4712
3465
	/* never exceed channel's maximum allowed Tx power */
4713
fail:	wpi_stop_locked(sc);
3466
	pwr = min(pwr, sc->maxpwr[chan]);
4714
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END_ERR, __func__);
4715
}
3467
4716
3468
	/* retrieve power index into gain tables from samples */
4717
static void
3469
	for (sample = group->samples; sample < &group->samples[3]; sample++)
4718
wpi_init(void *arg)
3470
		if (pwr > sample[1].power)
4719
{
3471
			break;
4720
	struct wpi_softc *sc = arg;
3472
	/* fixed-point linear interpolation using a 19-bit fractional part */
4721
	struct ifnet *ifp = sc->sc_ifp;
3473
	idx = interpolate(pwr, sample[0].power, sample[0].index,
4722
	struct ieee80211com *ic = ifp->if_l2com;
3474
	    sample[1].power, sample[1].index, 19);
3475
4723
3476
	/*
4724
	WPI_LOCK(sc);
3477
	 *  Adjust power index based on current temperature
4725
	wpi_init_locked(sc);
3478
	 *	- if colder than factory-calibrated: decreate output power
4726
	WPI_UNLOCK(sc);
3479
	 *	- if warmer than factory-calibrated: increase output power
3480
	 */
3481
	idx -= (sc->temp - group->temp) * 11 / 100;
3482
4727
3483
	/* decrease power for CCK rates (-5dB) */
4728
	if (ifp->if_drv_flags & IFF_DRV_RUNNING)
3484
	if (!WPI_RATE_IS_OFDM(rate))
4729
		ieee80211_start_all(ic);
3485
		idx += 10;
4730
}
3486
4731
3487
	/* keep power index in a valid range */
4732
static void
3488
	if (idx < 0)
4733
wpi_stop_locked(struct wpi_softc *sc)
3489
		return 0;
4734
{
3490
	if (idx > WPI_MAX_PWR_INDEX)
4735
	struct ifnet *ifp = sc->sc_ifp;
3491
		return WPI_MAX_PWR_INDEX;
3492
	return idx;
3493
4736
3494
#undef interpolate
4737
	WPI_LOCK_ASSERT(sc);
3495
#undef fdivround
4738
4739
	sc->sc_scan_timer = 0;
4740
	sc->sc_tx_timer = 0;
4741
	callout_stop(&sc->watchdog_to);
4742
	callout_stop(&sc->calib_to);
4743
	ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
4744
4745
	/* Power OFF hardware. */
4746
	wpi_hw_stop(sc);
3496
}
4747
}
3497
4748
3498
/**
4749
static void
3499
 * Called by net80211 framework to indicate that a scan
4750
wpi_stop(struct wpi_softc *sc)
3500
 * is starting. This function doesn't actually do the scan,
4751
{
3501
 * wpi_scan_curchan starts things off. This function is more
4752
	WPI_LOCK(sc);
3502
 * of an early warning from the framework we should get ready
4753
	wpi_stop_locked(sc);
3503
 * for the scan.
4754
	WPI_UNLOCK(sc);
4755
}
4756
4757
/*
4758
 * Callback from net80211 to start a scan.
3504
 */
4759
 */
3505
static void
4760
static void
3506
wpi_scan_start(struct ieee80211com *ic)
4761
wpi_scan_start(struct ieee80211com *ic)
Lines 3513-3527 Link Here
3513
	WPI_UNLOCK(sc);
4768
	WPI_UNLOCK(sc);
3514
}
4769
}
3515
4770
3516
/**
4771
/*
3517
 * Called by the net80211 framework, indicates that the
4772
 * Callback from net80211 to terminate a scan.
3518
 * scan has ended. If there is a scan in progress on the card
3519
 * then it should be aborted.
3520
 */
4773
 */
3521
static void
4774
static void
3522
wpi_scan_end(struct ieee80211com *ic)
4775
wpi_scan_end(struct ieee80211com *ic)
3523
{
4776
{
3524
	/* XXX ignore */
4777
	struct ifnet *ifp = ic->ic_ifp;
4778
	struct wpi_softc *sc = ifp->if_softc;
4779
	struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
4780
4781
	if (vap->iv_state == IEEE80211_S_RUN) {
4782
		WPI_LOCK(sc);
4783
		wpi_set_led(sc, WPI_LED_LINK, 0, 1);
4784
		WPI_UNLOCK(sc);
4785
	}
3525
}
4786
}
3526
4787
3527
/**
4788
/**
Lines 3531-3552 Link Here
3531
static void
4792
static void
3532
wpi_set_channel(struct ieee80211com *ic)
4793
wpi_set_channel(struct ieee80211com *ic)
3533
{
4794
{
4795
	const struct ieee80211_channel *c = ic->ic_curchan;
3534
	struct ifnet *ifp = ic->ic_ifp;
4796
	struct ifnet *ifp = ic->ic_ifp;
3535
	struct wpi_softc *sc = ifp->if_softc;
4797
	struct wpi_softc *sc = ifp->if_softc;
3536
	int error;
4798
	int error;
3537
4799
4800
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_DOING, __func__);
4801
4802
	WPI_LOCK(sc);
4803
	sc->sc_rxtap.wr_chan_freq = htole16(c->ic_freq);
4804
	sc->sc_rxtap.wr_chan_flags = htole16(c->ic_flags);
4805
	sc->sc_txtap.wt_chan_freq = htole16(c->ic_freq);
4806
	sc->sc_txtap.wt_chan_flags = htole16(c->ic_flags);
4807
3538
	/*
4808
	/*
3539
	 * Only need to set the channel in Monitor mode. AP scanning and auth
4809
	 * Only need to set the channel in Monitor mode. AP scanning and auth
3540
	 * are already taken care of by their respective firmware commands.
4810
	 * are already taken care of by their respective firmware commands.
3541
	 */
4811
	 */
3542
	if (ic->ic_opmode == IEEE80211_M_MONITOR) {
4812
	if (ic->ic_opmode == IEEE80211_M_MONITOR) {
3543
		WPI_LOCK(sc);
4813
		sc->rxon.chan = ieee80211_chan2ieee(ic, c);
3544
		error = wpi_config(sc);
4814
		if (IEEE80211_IS_CHAN_2GHZ(c)) {
3545
		WPI_UNLOCK(sc);
4815
			sc->rxon.flags |= htole32(WPI_RXON_AUTO |
3546
		if (error != 0)
4816
			    WPI_RXON_24GHZ);
4817
		} else {
4818
			sc->rxon.flags &= ~htole32(WPI_RXON_AUTO |
4819
			    WPI_RXON_24GHZ);
4820
		}
4821
		if ((error = wpi_send_rxon(sc, 0, 0)) != 0)
3547
			device_printf(sc->sc_dev,
4822
			device_printf(sc->sc_dev,
3548
			    "error %d settting channel\n", error);
4823
			    "%s: error %d settting channel\n", __func__,
4824
			    error);
3549
	}
4825
	}
4826
	WPI_UNLOCK(sc);
3550
}
4827
}
3551
4828
3552
/**
4829
/**
Lines 3558-3570 Link Here
3558
wpi_scan_curchan(struct ieee80211_scan_state *ss, unsigned long maxdwell)
4835
wpi_scan_curchan(struct ieee80211_scan_state *ss, unsigned long maxdwell)
3559
{
4836
{
3560
	struct ieee80211vap *vap = ss->ss_vap;
4837
	struct ieee80211vap *vap = ss->ss_vap;
3561
	struct ifnet *ifp = vap->iv_ic->ic_ifp;
4838
	struct ieee80211com *ic = vap->iv_ic;
4839
	struct ifnet *ifp = ic->ic_ifp;
3562
	struct wpi_softc *sc = ifp->if_softc;
4840
	struct wpi_softc *sc = ifp->if_softc;
4841
	int error;
3563
4842
3564
	WPI_LOCK(sc);
4843
	if (sc->rxon.chan != ieee80211_chan2ieee(ic, ic->ic_curchan)) {
3565
	if (wpi_scan(sc))
4844
		WPI_LOCK(sc);
3566
		ieee80211_cancel_scan(vap);
4845
		error = wpi_scan(sc, ic->ic_curchan);
3567
	WPI_UNLOCK(sc);
4846
		WPI_UNLOCK(sc);
4847
		if (error != 0)
4848
			ieee80211_cancel_scan(vap);
4849
	} else {
4850
		/* Send probe request when associated. */
4851
		sc->sc_scan_curchan(ss, maxdwell);
4852
	}
3568
}
4853
}
3569
4854
3570
/**
4855
/**
Lines 3580-3697 Link Here
3580
}
4865
}
3581
4866
3582
static void
4867
static void
3583
wpi_hwreset(void *arg, int pending)
4868
wpi_hw_reset(void *arg, int pending)
3584
{
4869
{
3585
	struct wpi_softc *sc = arg;
4870
	struct wpi_softc *sc = arg;
3586
3587
	WPI_LOCK(sc);
3588
	wpi_init_locked(sc, 0);
3589
	WPI_UNLOCK(sc);
3590
}
3591
3592
static void
3593
wpi_rfreset(void *arg, int pending)
3594
{
3595
	struct wpi_softc *sc = arg;
3596
3597
	WPI_LOCK(sc);
3598
	wpi_rfkill_resume(sc);
3599
	WPI_UNLOCK(sc);
3600
}
3601
3602
/*
3603
 * Allocate DMA-safe memory for firmware transfer.
3604
 */
3605
static int
3606
wpi_alloc_fwmem(struct wpi_softc *sc)
3607
{
3608
	/* allocate enough contiguous space to store text and data */
3609
	return wpi_dma_contig_alloc(sc, &sc->fw_dma, NULL,
3610
	    WPI_FW_MAIN_TEXT_MAXSZ + WPI_FW_MAIN_DATA_MAXSZ, 1,
3611
	    BUS_DMA_NOWAIT);
3612
}
3613
3614
static void
3615
wpi_free_fwmem(struct wpi_softc *sc)
3616
{
3617
	wpi_dma_contig_free(&sc->fw_dma);
3618
}
3619
3620
/**
3621
 * Called every second, wpi_watchdog used by the watch dog timer
3622
 * to check that the card is still alive
3623
 */
3624
static void
3625
wpi_watchdog(void *arg)
3626
{
3627
	struct wpi_softc *sc = arg;
3628
	struct ifnet *ifp = sc->sc_ifp;
4871
	struct ifnet *ifp = sc->sc_ifp;
3629
	struct ieee80211com *ic = ifp->if_l2com;
4872
	struct ieee80211com *ic = ifp->if_l2com;
3630
	uint32_t tmp;
4873
	struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
3631
4874
3632
	DPRINTFN(WPI_DEBUG_WATCHDOG,("Watchdog: tick\n"));
4875
	DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_DOING, __func__);
3633
4876
3634
	if (sc->flags & WPI_FLAG_HW_RADIO_OFF) {
4877
	wpi_stop(sc);
3635
		/* No need to lock firmware memory */
4878
	if (vap != NULL)
3636
		tmp = wpi_mem_read(sc, WPI_MEM_HW_RADIO_OFF);
4879
		ieee80211_stop(vap);
3637
4880
	wpi_init(sc);
3638
		if ((tmp & 0x1) == 0) {
4881
	if (vap != NULL)
3639
			/* Radio kill switch is still off */
4882
		ieee80211_init(vap);
3640
			callout_reset(&sc->watchdog_to, hz, wpi_watchdog, sc);
3641
			return;
3642
		}
3643
3644
		device_printf(sc->sc_dev, "Hardware Switch Enabled\n");
3645
		ieee80211_runtask(ic, &sc->sc_radiotask);
3646
		return;
3647
	}
3648
3649
	if (sc->sc_tx_timer > 0) {
3650
		if (--sc->sc_tx_timer == 0) {
3651
			device_printf(sc->sc_dev,"device timeout\n");
3652
			if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
3653
			ieee80211_runtask(ic, &sc->sc_restarttask);
3654
		}
3655
	}
3656
	if (sc->sc_scan_timer > 0) {
3657
		struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
3658
		if (--sc->sc_scan_timer == 0 && vap != NULL) {
3659
			device_printf(sc->sc_dev,"scan timeout\n");
3660
			ieee80211_cancel_scan(vap);
3661
			ieee80211_runtask(ic, &sc->sc_restarttask);
3662
		}
3663
	}
3664
3665
	if (ifp->if_drv_flags & IFF_DRV_RUNNING)
3666
		callout_reset(&sc->watchdog_to, hz, wpi_watchdog, sc);
3667
}
4883
}
3668
3669
#ifdef WPI_DEBUG
3670
static const char *wpi_cmd_str(int cmd)
3671
{
3672
	switch (cmd) {
3673
	case WPI_DISABLE_CMD:	return "WPI_DISABLE_CMD";
3674
	case WPI_CMD_CONFIGURE:	return "WPI_CMD_CONFIGURE";
3675
	case WPI_CMD_ASSOCIATE:	return "WPI_CMD_ASSOCIATE";
3676
	case WPI_CMD_SET_WME:	return "WPI_CMD_SET_WME";
3677
	case WPI_CMD_TSF:	return "WPI_CMD_TSF";
3678
	case WPI_CMD_ADD_NODE:	return "WPI_CMD_ADD_NODE";
3679
	case WPI_CMD_TX_DATA:	return "WPI_CMD_TX_DATA";
3680
	case WPI_CMD_MRR_SETUP:	return "WPI_CMD_MRR_SETUP";
3681
	case WPI_CMD_SET_LED:	return "WPI_CMD_SET_LED";
3682
	case WPI_CMD_SET_POWER_MODE: return "WPI_CMD_SET_POWER_MODE";
3683
	case WPI_CMD_SCAN:	return "WPI_CMD_SCAN";
3684
	case WPI_CMD_SET_BEACON:return "WPI_CMD_SET_BEACON";
3685
	case WPI_CMD_TXPOWER:	return "WPI_CMD_TXPOWER";
3686
	case WPI_CMD_BLUETOOTH:	return "WPI_CMD_BLUETOOTH";
3687
3688
	default:
3689
		KASSERT(1, ("Unknown Command: %d\n", cmd));
3690
		return "UNKNOWN CMD";	/* Make the compiler happy */
3691
	}
3692
}
3693
#endif
3694
3695
MODULE_DEPEND(wpi, pci,  1, 1, 1);
3696
MODULE_DEPEND(wpi, wlan, 1, 1, 1);
3697
MODULE_DEPEND(wpi, firmware, 1, 1, 1);
(-)sys/dev/wpi/if_wpi_debug.h (+98 lines)
Line 0 Link Here
1
/*-
2
 * Copyright (c) 2006,2007
3
 *	Damien Bergamini <damien.bergamini@free.fr>
4
 *	Benjamin Close <Benjamin.Close@clearchain.com>
5
 *
6
 * Permission to use, copy, modify, and distribute this software for any
7
 * purpose with or without fee is hereby granted, provided that the above
8
 * copyright notice and this permission notice appear in all copies.
9
 *
10
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
 *
18
 * $FreeBSD$
19
 */
20
21
#ifndef __IF_WPI_DEBUG_H__
22
#define __IF_WPI_DEBUG_H__
23
24
#ifdef WPI_DEBUG
25
enum {
26
	WPI_DEBUG_XMIT		= 0x00000001,	/* basic xmit operation */
27
	WPI_DEBUG_RECV		= 0x00000002,	/* basic recv operation */
28
	WPI_DEBUG_STATE		= 0x00000004,	/* 802.11 state transitions */
29
	WPI_DEBUG_HW		= 0x00000008,	/* Stage 1 (eeprom) debugging */
30
	WPI_DEBUG_RESET		= 0x00000010,	/* reset processing */
31
	WPI_DEBUG_FIRMWARE	= 0x00000020,	/* firmware(9) loading debug */
32
	WPI_DEBUG_BEACON	= 0x00000040,	/* beacon handling */
33
	WPI_DEBUG_WATCHDOG	= 0x00000080,	/* watchdog timeout */
34
	WPI_DEBUG_INTR		= 0x00000100,	/* ISR */
35
	WPI_DEBUG_SCAN		= 0x00000200,	/* Scan related operations */
36
	WPI_DEBUG_NOTIFY	= 0x00000400,	/* State 2 Notif intr debug */
37
	WPI_DEBUG_TEMP		= 0x00000800,	/* TXPower/Temp Calibration */
38
	WPI_DEBUG_CMD		= 0x00001000,	/* cmd submission */
39
	WPI_DEBUG_TRACE		= 0x00002000,	/* Print begin and start driver function */
40
	WPI_DEBUG_PWRSAVE	= 0x00004000,	/* Power save operations */
41
	WPI_DEBUG_EEPROM	= 0x00008000,	/* EEPROM info */
42
	WPI_DEBUG_KEY		= 0x00010000,	/* node key management */
43
	WPI_DEBUG_EDCA		= 0x00020000,	/* WME info */
44
	WPI_DEBUG_ANY		= 0xffffffff
45
};
46
47
#define DPRINTF(sc, m, ...) do {		\
48
	if (sc->sc_debug & (m))			\
49
		printf(__VA_ARGS__);		\
50
} while (0)
51
52
#define TRACE_STR_BEGIN		"->%s: begin\n"
53
#define TRACE_STR_DOING		"->Doing %s\n"
54
#define TRACE_STR_END		"->%s: end\n"
55
#define TRACE_STR_END_ERR	"->%s: end in error\n"
56
57
static const char *wpi_cmd_str(int cmd)
58
{
59
	switch (cmd) {
60
	/* Notifications */
61
	case WPI_UC_READY:		return "UC_READY";
62
	case WPI_RX_DONE:		return "RX_DONE";
63
	case WPI_START_SCAN:		return "START_SCAN";
64
	case WPI_SCAN_RESULTS:		return "SCAN_RESULTS";
65
	case WPI_STOP_SCAN:		return "STOP_SCAN";
66
	case WPI_BEACON_SENT:		return "BEACON_SENT";
67
	case WPI_RX_STATISTICS:		return "RX_STATS";
68
	case WPI_BEACON_STATISTICS:	return "BEACON_STATS";
69
	case WPI_STATE_CHANGED:		return "STATE_CHANGED";
70
	case WPI_BEACON_MISSED:		return "BEACON_MISSED";
71
72
	/* Command notifications */
73
	case WPI_CMD_RXON:		return "WPI_CMD_RXON";
74
	case WPI_CMD_RXON_ASSOC:	return "WPI_CMD_RXON_ASSOC";
75
	case WPI_CMD_EDCA_PARAMS:	return "WPI_CMD_EDCA_PARAMS";
76
	case WPI_CMD_TIMING:		return "WPI_CMD_TIMING";
77
	case WPI_CMD_ADD_NODE:		return "WPI_CMD_ADD_NODE";
78
	case WPI_CMD_DEL_NODE:		return "WPI_CMD_DEL_NODE";
79
	case WPI_CMD_TX_DATA:		return "WPI_CMD_TX_DATA";
80
	case WPI_CMD_MRR_SETUP:		return "WPI_CMD_MRR_SETUP";
81
	case WPI_CMD_SET_LED:		return "WPI_CMD_SET_LED";
82
	case WPI_CMD_SET_POWER_MODE:	return "WPI_CMD_SET_POWER_MODE";
83
	case WPI_CMD_SCAN:		return "WPI_CMD_SCAN";
84
	case WPI_CMD_SET_BEACON:	return "WPI_CMD_SET_BEACON";
85
	case WPI_CMD_TXPOWER:		return "WPI_CMD_TXPOWER";
86
	case WPI_CMD_BT_COEX:		return "WPI_CMD_BT_COEX";
87
88
	default:
89
		KASSERT(1, ("Unknown Command: %d\n", cmd));
90
		return "UNKNOWN CMD";
91
	}
92
}
93
94
#else
95
#define DPRINTF(sc, m, ...)	do { (void) sc; } while (0)
96
#endif
97
98
#endif	/* __IF_WPI_DEBUG_H__ */
(-)sys/dev/wpi/if_wpireg.h (-336 / +593 lines)
Lines 18-173 Link Here
18
 */
18
 */
19
19
20
#define WPI_TX_RING_COUNT	256
20
#define WPI_TX_RING_COUNT	256
21
#define WPI_CMD_RING_COUNT	256
21
#define WPI_TX_RING_LOMARK	192
22
#define WPI_RX_RING_COUNT	64
22
#define WPI_TX_RING_HIMARK	224
23
#define WPI_RX_RING_COUNT_LOG	6
24
#define WPI_RX_RING_COUNT	(1 << WPI_RX_RING_COUNT_LOG)
23
25
26
#define WPI_NTXQUEUES		8
27
#define WPI_NDMACHNLS		6
28
29
/* Maximum scatter/gather. */
30
#define WPI_MAX_SCATTER	4
31
24
/*
32
/*
25
 * Rings must be aligned on a 16K boundary.
33
 * Rings must be aligned on a 16K boundary.
26
 */
34
 */
27
#define WPI_RING_DMA_ALIGN	0x4000
35
#define WPI_RING_DMA_ALIGN	0x4000
28
36
29
/* maximum scatter/gather */
37
/* Maximum Rx buffer size. */
30
#define WPI_MAX_SCATTER	4
31
32
/* maximum Rx buffer size */
33
#define WPI_RBUF_SIZE ( 3 * 1024 ) /* XXX 3000 but must be aligned */
38
#define WPI_RBUF_SIZE ( 3 * 1024 ) /* XXX 3000 but must be aligned */
34
39
35
/*
40
/*
36
 * Control and status registers.
41
 * Control and status registers.
37
 */
42
 */
38
#define WPI_HWCONFIG		0x000
43
#define WPI_HW_IF_CONFIG	0x000
39
#define WPI_INTR		0x008
44
#define WPI_INT			0x008
40
#define WPI_MASK		0x00c
45
#define WPI_INT_MASK		0x00c
41
#define WPI_INTR_STATUS		0x010
46
#define WPI_FH_INT		0x010
42
#define WPI_GPIO_STATUS		0x018
47
#define WPI_GPIO_IN		0x018
43
#define WPI_RESET		0x020
48
#define WPI_RESET		0x020
44
#define WPI_GPIO_CTL		0x024
49
#define WPI_GP_CNTRL		0x024
45
#define WPI_EEPROM_CTL		0x02c
50
#define WPI_EEPROM		0x02c
46
#define WPI_EEPROM_STATUS	0x030
51
#define WPI_EEPROM_GP		0x030
47
#define WPI_UCODE_SET		0x058
52
#define WPI_GIO			0x03c
48
#define WPI_UCODE_CLR		0x05c
53
#define WPI_UCODE_GP1		0x054
49
#define WPI_TEMPERATURE		0x060
54
#define WPI_UCODE_GP1_SET	0x058
50
#define WPI_CHICKEN		0x100
55
#define WPI_UCODE_GP1_CLR	0x05c
51
#define WPI_PLL_CTL		0x20c
56
#define WPI_UCODE_GP2		0x060
52
#define WPI_WRITE_MEM_ADDR	0x444
57
#define WPI_GIO_CHICKEN		0x100
53
#define WPI_READ_MEM_ADDR	0x448
58
#define WPI_ANA_PLL		0x20c
54
#define WPI_WRITE_MEM_DATA	0x44c
59
#define WPI_DBG_HPET_MEM	0x240
55
#define WPI_READ_MEM_DATA	0x450
60
#define WPI_MEM_RADDR		0x40c
56
#define WPI_TX_WIDX		0x460
61
#define WPI_MEM_WADDR		0x410
57
#define WPI_TX_CTL(qid)		(0x940 + (qid) * 8)
62
#define WPI_MEM_WDATA		0x418
58
#define WPI_TX_BASE(qid)	(0x944 + (qid) * 8)
63
#define WPI_MEM_RDATA		0x41c
59
#define WPI_TX_DESC(qid)	(0x980 + (qid) * 80)
64
#define WPI_PRPH_WADDR		0x444
60
#define WPI_RX_CONFIG		0xc00
65
#define WPI_PRPH_RADDR		0x448
61
#define WPI_RX_BASE		0xc04
66
#define WPI_PRPH_WDATA		0x44c
62
#define WPI_RX_WIDX		0xc20
67
#define WPI_PRPH_RDATA		0x450
63
#define WPI_RX_RIDX_PTR		0xc24
68
#define WPI_HBUS_TARG_WRPTR	0x460
64
#define WPI_RX_CTL		0xcc0
65
#define WPI_RX_STATUS		0xcc4
66
#define WPI_TX_CONFIG(qid)	(0xd00 + (qid) * 32)
67
#define WPI_TX_CREDIT(qid)	(0xd04 + (qid) * 32)
68
#define WPI_TX_STATE(qid)	(0xd08 + (qid) * 32)
69
#define WPI_TX_BASE_PTR		0xe80
70
#define WPI_MSG_CONFIG		0xe88
71
#define WPI_TX_STATUS		0xe90
72
69
70
/*
71
 * Flow-Handler registers.
72
 */
73
#define WPI_FH_CBBC_CTRL(qid)	(0x940 + (qid) * 8)
74
#define WPI_FH_CBBC_BASE(qid)	(0x944 + (qid) * 8)
75
#define WPI_FH_RX_CONFIG	0xc00
76
#define WPI_FH_RX_BASE		0xc04
77
#define WPI_FH_RX_WPTR		0xc20
78
#define WPI_FH_RX_RPTR_ADDR	0xc24
79
#define WPI_FH_RSSR_TBL		0xcc0
80
#define WPI_FH_RX_STATUS	0xcc4
81
#define WPI_FH_TX_CONFIG(qid)	(0xd00 + (qid) * 32)
82
#define WPI_FH_TX_BASE		0xe80
83
#define WPI_FH_MSG_CONFIG	0xe88
84
#define WPI_FH_TX_STATUS	0xe90
73
85
86
74
/*
87
/*
75
 * NIC internal memory offsets.
88
 * NIC internal memory offsets.
76
 */
89
 */
77
#define WPI_MEM_MODE		0x2e00
90
#define WPI_ALM_SCHED_MODE		0x2e00
78
#define WPI_MEM_RA		0x2e04
91
#define WPI_ALM_SCHED_ARASTAT		0x2e04
79
#define WPI_MEM_TXCFG		0x2e10
92
#define WPI_ALM_SCHED_TXFACT		0x2e10
80
#define WPI_MEM_MAGIC4		0x2e14
93
#define WPI_ALM_SCHED_TXF4MF		0x2e14
81
#define WPI_MEM_MAGIC5		0x2e20
94
#define WPI_ALM_SCHED_TXF5MF		0x2e20
82
#define WPI_MEM_BYPASS1		0x2e2c
95
#define WPI_ALM_SCHED_SBYPASS_MODE1	0x2e2c
83
#define WPI_MEM_BYPASS2		0x2e30
96
#define WPI_ALM_SCHED_SBYPASS_MODE2	0x2e30
84
#define WPI_MEM_CLOCK1		0x3004
97
#define WPI_APMG_CLK_EN			0x3004
85
#define WPI_MEM_CLOCK2		0x3008
98
#define WPI_APMG_CLK_DIS		0x3008
86
#define WPI_MEM_POWER		0x300c
99
#define WPI_APMG_PS			0x300c
87
#define WPI_MEM_PCIDEV		0x3010
100
#define WPI_APMG_PCI_STT		0x3010
88
#define WPI_MEM_HW_RADIO_OFF	0x3014
101
#define WPI_APMG_RFKILL			0x3014
89
#define WPI_MEM_UCODE_CTL	0x3400
102
#define WPI_BSM_WR_CTRL			0x3400
90
#define WPI_MEM_UCODE_SRC	0x3404
103
#define WPI_BSM_WR_MEM_SRC		0x3404
91
#define WPI_MEM_UCODE_DST	0x3408
104
#define WPI_BSM_WR_MEM_DST		0x3408
92
#define WPI_MEM_UCODE_SIZE	0x340c
105
#define WPI_BSM_WR_DWCOUNT		0x340c
93
#define WPI_MEM_UCODE_BASE	0x3800
106
#define WPI_BSM_DRAM_TEXT_ADDR		0x3490
107
#define WPI_BSM_DRAM_TEXT_SIZE		0x3494
108
#define WPI_BSM_DRAM_DATA_ADDR		0x3498
109
#define WPI_BSM_DRAM_DATA_SIZE		0x349c
110
#define WPI_BSM_SRAM_BASE		0x3800
94
111
95
#define WPI_MEM_TEXT_BASE	0x3490
96
#define WPI_MEM_TEXT_SIZE	0x3494
97
#define WPI_MEM_DATA_BASE	0x3498
98
#define WPI_MEM_DATA_SIZE	0x349c
99
112
113
/* Possible flags for register WPI_HW_IF_CONFIG. */
114
#define WPI_HW_IF_CONFIG_ALM_MB		(1 << 8)
115
#define WPI_HW_IF_CONFIG_ALM_MM		(1 << 9)
116
#define WPI_HW_IF_CONFIG_SKU_MRC	(1 << 10)
117
#define WPI_HW_IF_CONFIG_REV_D		(1 << 11)
118
#define WPI_HW_IF_CONFIG_TYPE_B		(1 << 12)
100
119
101
/* possible flags for register WPI_HWCONFIG */
120
/* Possible flags for registers WPI_PRPH_RADDR/WPI_PRPH_WADDR. */
102
#define WPI_HW_ALM_MB	(1 << 8)
121
#define WPI_PRPH_DWORD	((sizeof (uint32_t) - 1) << 24)
103
#define WPI_HW_ALM_MM	(1 << 9)
104
#define WPI_HW_SKU_MRC	(1 << 10)
105
#define WPI_HW_REV_D	(1 << 11)
106
#define WPI_HW_TYPE_B	(1 << 12)
107
122
108
/* possible flags for registers WPI_READ_MEM_ADDR/WPI_WRITE_MEM_ADDR */
123
/* Possible values for WPI_BSM_WR_MEM_DST. */
109
#define WPI_MEM_4	((sizeof (uint32_t) - 1) << 24)
124
#define WPI_FW_TEXT_BASE	0x00000000
125
#define WPI_FW_DATA_BASE	0x00800000
110
126
111
/* possible values for WPI_MEM_UCODE_DST */
127
/* Possible flags for WPI_GPIO_IN. */
112
#define WPI_FW_TEXT	0x00000000
128
#define WPI_GPIO_IN_VMAIN	(1 << 9)
113
129
114
/* possible flags for WPI_GPIO_STATUS */
130
/* Possible flags for register WPI_RESET. */
115
#define WPI_POWERED		(1 << 9)
131
#define WPI_RESET_NEVO			(1 << 0)
132
#define WPI_RESET_SW			(1 << 7)
133
#define WPI_RESET_MASTER_DISABLED	(1 << 8)
134
#define WPI_RESET_STOP_MASTER		(1 << 9)
116
135
117
/* possible flags for register WPI_RESET */
136
/* Possible flags for register WPI_GP_CNTRL. */
118
#define WPI_NEVO_RESET		(1 << 0)
137
#define WPI_GP_CNTRL_MAC_ACCESS_ENA	(1 <<  0)
119
#define WPI_SW_RESET		(1 << 7)
138
#define WPI_GP_CNTRL_MAC_CLOCK_READY	(1 <<  0)
120
#define WPI_MASTER_DISABLED	(1 << 8)
139
#define WPI_GP_CNTRL_INIT_DONE		(1 <<  2)
121
#define WPI_STOP_MASTER		(1 << 9)
140
#define WPI_GP_CNTRL_MAC_ACCESS_REQ	(1 <<  3)
141
#define WPI_GP_CNTRL_SLEEP		(1 <<  4)
142
#define WPI_GP_CNTRL_PS_MASK		(7 << 24)
143
#define WPI_GP_CNTRL_MAC_PS		(4 << 24)
144
#define WPI_GP_CNTRL_RFKILL		(1 << 27)
122
145
123
/* possible flags for register WPI_GPIO_CTL */
146
/* Possible flags for register WPI_GIO_CHICKEN. */
124
#define WPI_GPIO_CLOCK		(1 << 0)
147
#define WPI_GIO_CHICKEN_L1A_NO_L0S_RX	(1 << 23)
125
#define WPI_GPIO_INIT		(1 << 2)
148
#define WPI_GIO_CHICKEN_DIS_L0S_TIMER	(1 << 29)
126
#define WPI_GPIO_MAC		(1 << 3)
127
#define WPI_GPIO_SLEEP		(1 << 4)
128
#define WPI_GPIO_PWR_STATUS	0x07000000
129
#define WPI_GPIO_PWR_SLEEP	(4 << 24)
130
149
131
/* possible flags for register WPI_CHICKEN */
150
/* Possible flags for register WPI_GIO. */
132
#define WPI_CHICKEN_RXNOLOS	(1 << 23)
151
#define WPI_GIO_L0S_ENA			(1 << 1)
133
152
134
/* possible flags for register WPI_PLL_CTL */
153
/* Possible flags for register WPI_FH_RX_CONFIG. */
135
#define WPI_PLL_INIT		(1 << 24)
154
#define WPI_FH_RX_CONFIG_DMA_ENA	(1U  << 31)
155
#define WPI_FH_RX_CONFIG_RDRBD_ENA	(1   << 29)
156
#define WPI_FH_RX_CONFIG_WRSTATUS_ENA	(1   << 27)
157
#define WPI_FH_RX_CONFIG_MAXFRAG	(1   << 24)
158
#define WPI_FH_RX_CONFIG_NRBD(x)	((x) << 20)
159
#define WPI_FH_RX_CONFIG_IRQ_DST_HOST	(1   << 12)
160
#define WPI_FH_RX_CONFIG_IRQ_TIMEOUT(x)	((x) <<  4)
136
161
137
/* possible flags for register WPI_UCODE_CLR */
162
/* Possible flags for register WPI_ANA_PLL. */
138
#define WPI_RADIO_OFF		(1 << 1)
163
#define WPI_ANA_PLL_INIT	(1 << 24)
139
#define WPI_DISABLE_CMD		(1 << 2)
140
164
141
/* possible flags for WPI_RX_STATUS */
165
/* Possible flags for register WPI_UCODE_GP1*. */
142
#define	WPI_RX_IDLE	(1 << 24)
166
#define WPI_UCODE_GP1_MAC_SLEEP		(1 << 0)
167
#define WPI_UCODE_GP1_RFKILL		(1 << 1)
168
#define WPI_UCODE_GP1_CMD_BLOCKED	(1 << 2)
143
169
144
/* possible flags for register WPI_UC_CTL */
170
/* Possible flags for register WPI_FH_RX_STATUS. */
145
#define WPI_UC_ENABLE	(1 << 30)
171
#define	WPI_FH_RX_STATUS_IDLE	(1 << 24)
146
#define WPI_UC_RUN	(1U << 31)
147
172
148
/* possible flags for register WPI_INTR_CSR */
173
/* Possible flags for register WPI_BSM_WR_CTRL. */
149
#define WPI_ALIVE_INTR	(1 << 0)
174
#define WPI_BSM_WR_CTRL_START_EN	(1  << 30)
150
#define WPI_WAKEUP_INTR	(1 << 1)
175
#define WPI_BSM_WR_CTRL_START		(1U << 31)
151
#define WPI_SW_ERROR	(1 << 25)
152
#define WPI_TX_INTR	(1 << 27)
153
#define WPI_HW_ERROR	(1 << 29)
154
#define WPI_RX_INTR	(1U << 31)
155
176
156
#define WPI_INTR_MASK							\
177
/* Possible flags for register WPI_INT. */
157
	(WPI_SW_ERROR | WPI_HW_ERROR | WPI_TX_INTR | WPI_RX_INTR |	\
178
#define WPI_INT_ALIVE		(1  <<  0)
158
	 WPI_ALIVE_INTR | WPI_WAKEUP_INTR)
179
#define WPI_INT_WAKEUP		(1  <<  1)
180
#define WPI_INT_SW_RX		(1  <<  3)
181
#define WPI_INT_SW_ERR		(1  << 25)
182
#define WPI_INT_FH_TX		(1  << 27)
183
#define WPI_INT_HW_ERR		(1  << 29)
184
#define WPI_INT_FH_RX		(1U << 31)
159
185
160
/* possible flags for register WPI_TX_STATUS */
186
/* Shortcut. */
161
#define WPI_TX_IDLE(qid)	(1 << ((qid) + 24) | 1 << ((qid) + 16))
187
#define WPI_INT_MASK_DEF					\
188
	(WPI_INT_SW_ERR | WPI_INT_HW_ERR | WPI_INT_FH_TX  |	\
189
	 WPI_INT_FH_RX  | WPI_INT_ALIVE  | WPI_INT_WAKEUP |	\
190
	 WPI_INT_SW_RX)
162
191
163
/* possible flags for register WPI_EEPROM_CTL */
192
/* Possible flags for register WPI_FH_INT. */
164
#define WPI_EEPROM_READY	(1 << 0)
193
#define WPI_FH_INT_RX_CHNL(x)	(1 << ((x) + 16))
194
#define WPI_FH_INT_HI_PRIOR	(1 << 30)
195
/* Shortcuts for the above. */
196
#define WPI_FH_INT_RX			\
197
	(WPI_FH_INT_RX_CHNL(0) |	\
198
	 WPI_FH_INT_RX_CHNL(1) |	\
199
	 WPI_FH_INT_RX_CHNL(2) |	\
200
	 WPI_FH_INT_HI_PRIOR)
165
201
166
/* possible flags for register WPI_EEPROM_STATUS */
202
/* Possible flags for register WPI_FH_TX_STATUS. */
203
#define WPI_FH_TX_STATUS_IDLE(qid)	\
204
	(1 << ((qid) + 24) | 1 << ((qid) + 16))
205
206
/* Possible flags for register WPI_EEPROM. */
207
#define WPI_EEPROM_READ_VALID	(1 << 0)
208
209
/* Possible flags for register WPI_EEPROM_GP. */
167
#define WPI_EEPROM_VERSION	0x00000007
210
#define WPI_EEPROM_VERSION	0x00000007
168
#define WPI_EEPROM_LOCKED	0x00000180
211
#define WPI_EEPROM_GP_IF_OWNER	0x00000180
169
212
213
/* Possible flags for register WPI_APMG_PS. */
214
#define WPI_APMG_PS_PWR_SRC_MASK	(3 << 24)
170
215
216
/* Possible flags for registers WPI_APMG_CLK_*. */
217
#define WPI_APMG_CLK_CTRL_DMA_CLK_RQT	(1 <<  9)
218
#define WPI_APMG_CLK_CTRL_BSM_CLK_RQT	(1 << 11)
219
220
/* Possible flags for register WPI_APMG_PCI_STT. */
221
#define WPI_APMG_PCI_STT_L1A_DIS	(1 << 11)
222
171
struct wpi_shared {
223
struct wpi_shared {
172
	uint32_t	txbase[8];
224
	uint32_t	txbase[8];
173
	uint32_t	next;
225
	uint32_t	next;
Lines 176-195 Link Here
176
228
177
#define WPI_MAX_SEG_LEN	65520
229
#define WPI_MAX_SEG_LEN	65520
178
struct wpi_tx_desc {
230
struct wpi_tx_desc {
179
	uint32_t	flags;
231
	uint8_t		reserved1[3];
232
	uint8_t		nsegs;
180
#define WPI_PAD32(x)	(roundup2(x, 4) - (x))
233
#define WPI_PAD32(x)	(roundup2(x, 4) - (x))
181
234
182
	struct {
235
	struct {
183
		uint32_t	addr;
236
		uint32_t	addr;
184
		uint32_t	len;
237
		uint32_t	len;
185
	} __attribute__((__packed__))	segs[WPI_MAX_SCATTER];
238
	} __packed	segs[WPI_MAX_SCATTER];
186
	uint8_t		reserved[28];
239
	uint8_t		reserved2[28];
187
} __packed;
240
} __packed;
188
241
189
struct wpi_tx_stat {
242
struct wpi_tx_stat {
190
	uint8_t		nrts;
243
	uint8_t		rtsfailcnt;
191
	uint8_t		ntries;
244
	uint8_t		ackfailcnt;
192
	uint8_t		nkill;
245
	uint8_t		btkillcnt;
193
	uint8_t		rate;
246
	uint8_t		rate;
194
	uint32_t	duration;
247
	uint32_t	duration;
195
	uint32_t	status;
248
	uint32_t	status;
Lines 204-211 Link Here
204
#define WPI_START_SCAN		130
257
#define WPI_START_SCAN		130
205
#define WPI_SCAN_RESULTS	131
258
#define WPI_SCAN_RESULTS	131
206
#define WPI_STOP_SCAN		132
259
#define WPI_STOP_SCAN		132
260
#define WPI_BEACON_SENT		144
261
#define WPI_RX_STATISTICS	156
262
#define WPI_BEACON_STATISTICS	157
207
#define WPI_STATE_CHANGED	161
263
#define WPI_STATE_CHANGED	161
208
#define WPI_MISSED_BEACON	162
264
#define WPI_BEACON_MISSED	162
209
265
210
	uint8_t		flags;
266
	uint8_t		flags;
211
	uint8_t		idx;
267
	uint8_t		idx;
Lines 228-235 Link Here
228
struct wpi_rx_head {
284
struct wpi_rx_head {
229
	uint16_t	chan;
285
	uint16_t	chan;
230
	uint16_t	flags;
286
	uint16_t	flags;
287
#define WPI_STAT_FLAG_SHPREAMBLE	(1 << 2)
288
231
	uint8_t		reserved;
289
	uint8_t		reserved;
232
	uint8_t		rate;
290
	uint8_t		plcp;
233
	uint16_t	len;
291
	uint16_t	len;
234
} __packed;
292
} __packed;
235
293
Lines 239-244 Link Here
239
#define WPI_RX_NO_OVFL_ERR	(1 << 1)
297
#define WPI_RX_NO_OVFL_ERR	(1 << 1)
240
/* shortcut for the above */
298
/* shortcut for the above */
241
#define WPI_RX_NOERROR		(WPI_RX_NO_CRC_ERR | WPI_RX_NO_OVFL_ERR)
299
#define WPI_RX_NOERROR		(WPI_RX_NO_CRC_ERR | WPI_RX_NO_OVFL_ERR)
300
#define WPI_RX_CIPHER_MASK	(7 <<  8)
301
#define WPI_RX_CIPHER_CCMP	(2 <<  8)
302
#define WPI_RX_DECRYPT_MASK	(3 << 11)
303
#define WPI_RX_DECRYPT_OK	(3 << 11)
304
242
	uint64_t	tstamp;
305
	uint64_t	tstamp;
243
	uint32_t	tbeacon;
306
	uint32_t	tbeacon;
244
} __packed;
307
} __packed;
Lines 245-255 Link Here
245
308
246
struct wpi_tx_cmd {
309
struct wpi_tx_cmd {
247
	uint8_t	code;
310
	uint8_t	code;
248
#define WPI_CMD_CONFIGURE	 16
311
#define WPI_CMD_RXON		 16
249
#define WPI_CMD_ASSOCIATE	 17
312
#define WPI_CMD_RXON_ASSOC	 17
250
#define WPI_CMD_SET_WME          19
313
#define WPI_CMD_EDCA_PARAMS	 19
251
#define WPI_CMD_TSF		 20
314
#define WPI_CMD_TIMING		 20
252
#define WPI_CMD_ADD_NODE	 24
315
#define WPI_CMD_ADD_NODE	 24
316
#define WPI_CMD_DEL_NODE	 25
253
#define WPI_CMD_TX_DATA		 28
317
#define WPI_CMD_TX_DATA		 28
254
#define WPI_CMD_MRR_SETUP	 71
318
#define WPI_CMD_MRR_SETUP	 71
255
#define WPI_CMD_SET_LED		 72
319
#define WPI_CMD_SET_LED		 72
Lines 257-277 Link Here
257
#define WPI_CMD_SCAN		128
321
#define WPI_CMD_SCAN		128
258
#define WPI_CMD_SET_BEACON	145
322
#define WPI_CMD_SET_BEACON	145
259
#define WPI_CMD_TXPOWER		151
323
#define WPI_CMD_TXPOWER		151
260
#define WPI_CMD_BLUETOOTH	155
324
#define WPI_CMD_BT_COEX		155
325
#define WPI_CMD_GET_STATISTICS	156
261
326
262
	uint8_t	flags;
327
	uint8_t	flags;
263
	uint8_t	idx;
328
	uint8_t	idx;
264
	uint8_t	qid;
329
	uint8_t	qid;
265
	uint8_t	data[360];
330
	uint8_t	data[124];
266
} __packed;
331
} __packed;
267
332
268
/* structure for WPI_CMD_CONFIGURE */
333
/* Structure for command WPI_CMD_RXON. */
269
struct wpi_config {
334
struct wpi_rxon {
270
	uint8_t		myaddr[IEEE80211_ADDR_LEN];
335
	uint8_t		myaddr[IEEE80211_ADDR_LEN];
271
	uint16_t	reserved1;
336
	uint16_t	reserved1;
272
	uint8_t		bssid[IEEE80211_ADDR_LEN];
337
	uint8_t		bssid[IEEE80211_ADDR_LEN];
273
	uint16_t	reserved2;
338
	uint16_t	reserved2;
274
	uint8_t		wlap_bssid_addr[6];
339
	uint8_t		wlap[IEEE80211_ADDR_LEN];
275
	uint16_t	reserved3;
340
	uint16_t	reserved3;
276
	uint8_t		mode;
341
	uint8_t		mode;
277
#define WPI_MODE_HOSTAP		1
342
#define WPI_MODE_HOSTAP		1
Lines 279-299 Link Here
279
#define WPI_MODE_IBSS		4
344
#define WPI_MODE_IBSS		4
280
#define WPI_MODE_MONITOR	6
345
#define WPI_MODE_MONITOR	6
281
346
282
	uint8_t		air_propogation;
347
	uint8_t		air;
283
	uint16_t	reserved4;
348
	uint16_t	reserved4;
284
	uint8_t		ofdm_mask;
349
	uint8_t		ofdm_mask;
285
	uint8_t		cck_mask;
350
	uint8_t		cck_mask;
286
	uint16_t	associd;
351
	uint16_t	associd;
287
	uint32_t	flags;
352
	uint32_t	flags;
288
#define WPI_CONFIG_24GHZ	(1 << 0)
353
#define WPI_RXON_24GHZ		(1 <<  0)
289
#define WPI_CONFIG_CCK		(1 << 1)
354
#define WPI_RXON_CCK		(1 <<  1)
290
#define WPI_CONFIG_AUTO		(1 << 2)
355
#define WPI_RXON_AUTO		(1 <<  2)
291
#define WPI_CONFIG_SHSLOT	(1 << 4)
356
#define WPI_RXON_SHSLOT		(1 <<  4)
292
#define WPI_CONFIG_SHPREAMBLE	(1 << 5)
357
#define WPI_RXON_SHPREAMBLE	(1 <<  5)
293
#define WPI_CONFIG_NODIVERSITY	(1 << 7)
358
#define WPI_RXON_NODIVERSITY	(1 <<  7)
294
#define WPI_CONFIG_ANTENNA_A	(1 << 8)
359
#define WPI_RXON_ANTENNA_A	(1 <<  8)
295
#define WPI_CONFIG_ANTENNA_B	(1 << 9)
360
#define WPI_RXON_ANTENNA_B	(1 <<  9)
296
#define WPI_CONFIG_TSF		(1 << 15)
361
#define WPI_RXON_TSF		(1 << 15)
362
#define WPI_RXON_CTS_TO_SELF	(1 << 30)
297
363
298
	uint32_t	filter;
364
	uint32_t	filter;
299
#define WPI_FILTER_PROMISC	(1 << 0)
365
#define WPI_FILTER_PROMISC	(1 << 0)
Lines 304-313 Link Here
304
#define WPI_FILTER_BEACON	(1 << 6)
370
#define WPI_FILTER_BEACON	(1 << 6)
305
371
306
	uint8_t		chan;
372
	uint8_t		chan;
307
	uint16_t	reserved6;
373
	uint16_t	reserved5;
308
} __packed;
374
} __packed;
309
375
310
/* structure for command WPI_CMD_ASSOCIATE */
376
/* Structure for command WPI_CMD_RXON_ASSOC. */
311
struct wpi_assoc {
377
struct wpi_assoc {
312
	uint32_t	flags;
378
	uint32_t	flags;
313
	uint32_t	filter;
379
	uint32_t	filter;
Lines 316-335 Link Here
316
	uint16_t	reserved;
382
	uint16_t	reserved;
317
} __packed;
383
} __packed;
318
384
319
/* structure for command WPI_CMD_SET_WME */
385
/* Structure for command WPI_CMD_EDCA_PARAMS. */
320
struct wpi_wme_setup {
386
struct wpi_edca_params {
321
	uint32_t	flags;
387
	uint32_t	flags;
388
#define WPI_EDCA_UPDATE	(1 << 0)
389
322
	struct {
390
	struct {
323
		uint16_t	cwmin;
391
		uint16_t	cwmin;
324
		uint16_t	cwmax;
392
		uint16_t	cwmax;
325
		uint8_t		aifsn;
393
		uint8_t		aifsn;
326
		uint8_t		reserved;
394
		uint8_t		reserved;
327
		uint16_t	txop;
395
		uint16_t	txoplimit;
328
	} __packed	ac[WME_NUM_AC];
396
	} __packed	ac[WME_NUM_AC];
329
} __packed;
397
} __packed;
330
398
331
/* structure for command WPI_CMD_TSF */
399
/* Structure for command WPI_CMD_TIMING. */
332
struct wpi_cmd_tsf {
400
struct wpi_cmd_timing {
333
	uint64_t	tstamp;
401
	uint64_t	tstamp;
334
	uint16_t	bintval;
402
	uint16_t	bintval;
335
	uint16_t	atim;
403
	uint16_t	atim;
Lines 338-378 Link Here
338
	uint16_t	reserved;
406
	uint16_t	reserved;
339
} __packed;
407
} __packed;
340
408
341
/* structure for WPI_CMD_ADD_NODE */
409
/* Structure for command WPI_CMD_ADD_NODE. */
342
struct wpi_node_info {
410
struct wpi_node_info {
343
	uint8_t		control;
411
	uint8_t		control;
344
#define WPI_NODE_UPDATE	(1 << 0)
412
#define WPI_NODE_UPDATE		(1 << 0)
345
413
346
	uint8_t		reserved1[3];
414
	uint8_t		reserved1[3];
347
	uint8_t		bssid[IEEE80211_ADDR_LEN];
415
	uint8_t		macaddr[IEEE80211_ADDR_LEN];
348
	uint16_t	reserved2;
416
	uint16_t	reserved2;
349
	uint8_t		id;
417
	uint8_t		id;
350
#define WPI_ID_BSS		0
418
#define WPI_ID_BSS		0
419
#define WPI_ID_IBSS_MIN		2
420
#define WPI_ID_IBSS_MAX		23
351
#define WPI_ID_BROADCAST	24
421
#define WPI_ID_BROADCAST	24
422
#define WPI_ID_UNDEFINED	(uint8_t)-1
352
423
353
	uint8_t		flags;
424
	uint8_t		flags;
425
#define WPI_FLAG_KEY_SET	(1 << 0)
426
354
	uint16_t	reserved3;
427
	uint16_t	reserved3;
355
	uint16_t	key_flags;
428
	uint16_t	kflags;
356
	uint8_t		tkip;
429
#define WPI_KFLAG_CCMP		(1 <<  1)
430
#define WPI_KFLAG_KID(kid)	((kid) << 8)
431
#define WPI_KFLAG_MULTICAST	(1 << 14)
432
433
	uint8_t		tsc2;
357
	uint8_t		reserved4;
434
	uint8_t		reserved4;
358
	uint16_t	ttak[5];
435
	uint16_t	ttak[5];
359
	uint16_t	reserved5;
436
	uint16_t	reserved5;
360
	uint8_t		key[IEEE80211_KEYBUF_SIZE];
437
	uint8_t		key[IEEE80211_KEYBUF_SIZE];
361
	uint32_t	action;
438
	uint32_t	action;
362
#define WPI_ACTION_SET_RATE	4
439
#define WPI_ACTION_SET_RATE	(1 << 2)
440
363
	uint32_t	mask;
441
	uint32_t	mask;
364
	uint16_t	tid;
442
	uint16_t	tid;
365
	uint8_t		rate;
443
	uint8_t		plcp;
366
	uint8_t		antenna;
444
	uint8_t		antenna;
367
#define WPI_ANTENNA_A	(1<<6)
445
#define WPI_ANTENNA_A		(1 << 6)
368
#define WPI_ANTENNA_B	(1<<7)
446
#define WPI_ANTENNA_B		(1 << 7)
369
#define WPI_ANTENNA_BOTH	(WPI_ANTENNA_A|WPI_ANTENNA_B)
447
#define WPI_ANTENNA_BOTH	(WPI_ANTENNA_A | WPI_ANTENNA_B)
448
370
	uint8_t		add_imm;
449
	uint8_t		add_imm;
371
	uint8_t		del_imm;
450
	uint8_t		del_imm;
372
	uint16_t	add_imm_start;
451
	uint16_t	add_imm_start;
373
} __packed;
452
} __packed;
374
453
375
/* structure for command WPI_CMD_TX_DATA */
454
/* Structure for command WPI_CMD_DEL_NODE. */
455
struct wpi_cmd_del_node {
456
	uint8_t		count;
457
	uint8_t		reserved1[3];
458
	uint8_t		macaddr[IEEE80211_ADDR_LEN];
459
	uint16_t	reserved2;
460
} __packed;
461
462
/* Structure for command WPI_CMD_TX_DATA. */
376
struct wpi_cmd_data {
463
struct wpi_cmd_data {
377
	uint16_t	len;
464
	uint16_t	len;
378
	uint16_t	lnext;
465
	uint16_t	lnext;
Lines 381-399 Link Here
381
#define WPI_TX_NEED_CTS         (1 <<  2)
468
#define WPI_TX_NEED_CTS         (1 <<  2)
382
#define WPI_TX_NEED_ACK		(1 <<  3)
469
#define WPI_TX_NEED_ACK		(1 <<  3)
383
#define WPI_TX_FULL_TXOP	(1 <<  7)
470
#define WPI_TX_FULL_TXOP	(1 <<  7)
384
#define WPI_TX_BT_DISABLE	(1 << 12) /* bluetooth coexistence */
471
#define WPI_TX_BT_DISABLE	(1 << 12) 	/* bluetooth coexistence */
385
#define WPI_TX_AUTO_SEQ		(1 << 13)
472
#define WPI_TX_AUTO_SEQ		(1 << 13)
386
#define WPI_TX_INSERT_TSTAMP	(1 << 16)
473
#define WPI_TX_INSERT_TSTAMP	(1 << 16)
387
474
388
	uint8_t		rate;
475
	uint8_t		plcp;
389
	uint8_t		id;
476
	uint8_t		id;
390
	uint8_t		tid;
477
	uint8_t		tid;
391
	uint8_t		security;
478
	uint8_t		security;
479
#define WPI_CIPHER_WEP		1
480
#define WPI_CIPHER_CCMP		2
481
#define WPI_CIPHER_TKIP		3
482
#define WPI_CIPHER_WEP104	9
483
392
	uint8_t		key[IEEE80211_KEYBUF_SIZE];
484
	uint8_t		key[IEEE80211_KEYBUF_SIZE];
393
	uint8_t		tkip[IEEE80211_WEP_MICLEN];
485
	uint8_t		tkip[IEEE80211_WEP_MICLEN];
394
	uint32_t	fnext;
486
	uint32_t	fnext;
395
	uint32_t	lifetime;
487
	uint32_t	lifetime;
396
#define WPI_LIFETIME_INFINITE	0xffffffff
488
#define WPI_LIFETIME_INFINITE	0xffffffff
489
397
	uint8_t		ofdm_mask;
490
	uint8_t		ofdm_mask;
398
	uint8_t		cck_mask;
491
	uint8_t		cck_mask;
399
	uint8_t		rts_ntries;
492
	uint8_t		rts_ntries;
Lines 400-414 Link Here
400
	uint8_t		data_ntries;
493
	uint8_t		data_ntries;
401
	uint16_t	timeout;
494
	uint16_t	timeout;
402
	uint16_t	txop;
495
	uint16_t	txop;
403
	struct          ieee80211_frame wh;
404
} __packed;
496
} __packed;
405
497
406
/* structure for command WPI_CMD_SET_BEACON */
498
/* Structure for command WPI_CMD_SET_BEACON. */
407
struct wpi_cmd_beacon {
499
struct wpi_cmd_beacon {
408
	uint16_t	len;
500
	uint16_t	len;
409
	uint16_t	reserved1;
501
	uint16_t	reserved1;
410
	uint32_t	flags;	/* same as wpi_cmd_data */
502
	uint32_t	flags;	/* same as wpi_cmd_data */
411
	uint8_t		rate;
503
	uint8_t		plcp;
412
	uint8_t		id;
504
	uint8_t		id;
413
	uint8_t		reserved2[30];
505
	uint8_t		reserved2[30];
414
	uint32_t	lifetime;
506
	uint32_t	lifetime;
Lines 418-428 Link Here
418
	uint16_t	tim;
510
	uint16_t	tim;
419
	uint8_t		timsz;
511
	uint8_t		timsz;
420
	uint8_t		reserved4;
512
	uint8_t		reserved4;
421
	struct		ieee80211_frame wh;
422
} __packed;
513
} __packed;
423
514
424
/* structure for notification WPI_MISSED_BEACON */
515
/* Structure for notification WPI_BEACON_MISSED. */
425
struct wpi_missed_beacon {
516
struct wpi_beacon_missed {
426
    uint32_t consecutive;
517
    uint32_t consecutive;
427
    uint32_t total;
518
    uint32_t total;
428
    uint32_t expected;
519
    uint32_t expected;
Lines 430-458 Link Here
430
} __packed;
521
} __packed;
431
522
432
523
433
/* structure for WPI_CMD_MRR_SETUP */
524
/* Structure for command WPI_CMD_MRR_SETUP. */
525
#define WPI_RIDX_MAX	11
434
struct wpi_mrr_setup {
526
struct wpi_mrr_setup {
435
	uint8_t	which;
527
	uint32_t	which;
436
#define WPI_MRR_CTL	0
528
#define WPI_MRR_CTL	0
437
#define WPI_MRR_DATA	1
529
#define WPI_MRR_DATA	1
438
530
439
	uint8_t		reserved[3];
440
441
	struct {
531
	struct {
442
		uint8_t	signal;
532
		uint8_t	plcp;
443
		uint8_t	flags;
533
		uint8_t	flags;
444
		uint8_t	ntries;
534
		uint8_t	ntries;
445
		uint8_t	next;
535
		uint8_t	next;
446
#define WPI_OFDM6	0
536
	} __packed	rates[WPI_RIDX_MAX + 1];
447
#define WPI_OFDM54	7
448
#define WPI_CCK1	8
449
#define WPI_CCK2	9
450
#define WPI_CCK11	11
451
452
	} __attribute__((__packed__))	rates[WPI_CCK11 + 1];
453
} __packed;
537
} __packed;
454
538
455
/* structure for WPI_CMD_SET_LED */
539
/* Structure for command WPI_CMD_SET_LED. */
456
struct wpi_cmd_led {
540
struct wpi_cmd_led {
457
	uint32_t	unit;	/* multiplier (in usecs) */
541
	uint32_t	unit;	/* multiplier (in usecs) */
458
	uint8_t		which;
542
	uint8_t		which;
Lines 464-599 Link Here
464
	uint8_t		reserved;
548
	uint8_t		reserved;
465
} __packed;
549
} __packed;
466
550
467
/* structure for WPI_CMD_SET_POWER_MODE */
551
/* Structure for command WPI_CMD_SET_POWER_MODE. */
468
struct wpi_power {
552
struct wpi_pmgt_cmd {
469
	uint32_t	flags;
553
	uint16_t	flags;
470
#define WPI_POWER_CAM	0	/* constantly awake mode */
554
#define WPI_PS_ALLOW_SLEEP	(1 << 0)
471
	uint32_t	rx_timeout;
555
#define WPI_PS_NOTIFY		(1 << 1)
472
	uint32_t	tx_timeout;
556
#define WPI_PS_SLEEP_OVER_DTIM	(1 << 2)
473
	uint32_t	sleep[5];
557
#define WPI_PS_PCI_PMGT		(1 << 3)
558
559
	uint8_t		reserved[2];
560
	uint32_t	rxtimeout;
561
	uint32_t	txtimeout;
562
	uint32_t	intval[5];
474
} __packed;
563
} __packed;
475
564
476
/* structure for command WPI_CMD_SCAN */
565
/* Structures for command WPI_CMD_SCAN. */
566
#define WPI_SCAN_MAX_ESSIDS	4
567
struct wpi_scan_essid {
568
	uint8_t	id;
569
	uint8_t	len;
570
	uint8_t	data[IEEE80211_NWID_LEN];
571
} __packed;
572
477
struct wpi_scan_hdr {
573
struct wpi_scan_hdr {
478
	uint16_t	len;
574
	uint16_t	len;
479
	uint8_t		reserved1;
575
	uint8_t		reserved1;
480
	uint8_t		nchan;
576
	uint8_t		nchan;
481
	uint16_t	quiet;
577
	uint16_t	quiet_time;
482
	uint16_t	threshold;
578
	uint16_t	quiet_threshold;
483
	uint16_t	promotion;
579
	uint16_t	crc_threshold;
484
	uint16_t	reserved2;
580
	uint16_t	reserved2;
485
	uint32_t	maxtimeout;
581
	uint32_t	max_svc;	/* background scans */
486
	uint32_t	suspend;
582
	uint32_t	pause_svc;	/* background scans */
487
	uint32_t	flags;
583
	uint32_t	flags;
488
	uint32_t	filter;
584
	uint32_t	filter;
489
585
490
struct {
586
	/* Followed by a struct wpi_cmd_data. */
491
	uint16_t	len;
587
	/* Followed by an array of 4 structs wpi_scan_essid. */
492
	uint16_t	lnext;
588
	/* Followed by probe request body. */
493
	uint32_t	flags;
589
	/* Followed by an array of ``nchan'' structs wpi_scan_chan. */
494
	uint8_t		rate;
495
	uint8_t		id;
496
	uint8_t		tid;
497
	uint8_t		security;
498
	uint8_t		key[IEEE80211_KEYBUF_SIZE];
499
	uint8_t		tkip[IEEE80211_WEP_MICLEN];
500
	uint32_t	fnext;
501
	uint32_t	lifetime;
502
	uint8_t		ofdm_mask;
503
	uint8_t		cck_mask;
504
	uint8_t		rts_ntries;
505
	uint8_t		data_ntries;
506
	uint16_t	timeout;
507
	uint16_t	txop;
508
}	tx __attribute__((__packed__));
509
510
#define WPI_SCAN_MAX_ESSIDS	4
511
	struct {
512
	    uint8_t		id;
513
	    uint8_t		esslen;
514
	    uint8_t		essid[IEEE80211_NWID_LEN];
515
	}scan_essids[WPI_SCAN_MAX_ESSIDS];
516
	/* followed by probe request body */
517
	/* followed by nchan x wpi_scan_chan */
518
} __packed;
590
} __packed;
519
591
520
struct wpi_scan_chan {
592
struct wpi_scan_chan {
521
	uint8_t		flags;
593
	uint8_t		flags;
594
#define WPI_CHAN_ACTIVE		(1 << 0)
595
#define WPI_CHAN_NPBREQS(x)	(((1 << (x)) - 1) << 1)
596
522
	uint8_t		chan;
597
	uint8_t		chan;
523
#define WPI_CHAN_ACTIVE	(1 << 0)
598
	uint8_t		rf_gain;
524
#define WPI_CHAN_DIRECT (1 << 1)
599
	uint8_t		dsp_gain;
525
	uint8_t		gain_radio;
526
	uint8_t		gain_dsp;
527
	uint16_t	active;		/* msecs */
600
	uint16_t	active;		/* msecs */
528
	uint16_t	passive;	/* msecs */
601
	uint16_t	passive;	/* msecs */
529
} __packed;
602
} __packed;
530
603
531
/* structure for WPI_CMD_BLUETOOTH */
604
#define WPI_SCAN_CRC_TH_DEFAULT		htole16(1)
532
struct wpi_bluetooth {
605
#define WPI_SCAN_CRC_TH_NEVER		htole16(0xffff)
533
	uint8_t		flags;
534
	uint8_t		lead;
535
	uint8_t		kill;
536
	uint8_t		reserved;
537
	uint32_t	ack;
538
	uint32_t	cts;
539
} __packed;
540
606
541
/* structure for command WPI_CMD_TXPOWER */
607
/* Maximum size of a scan command. */
608
#define WPI_SCAN_MAXSZ	(MCLBYTES - 4)
609
610
#define WPI_ACTIVE_DWELL_TIME_2GHZ	(30)	/* all times in msec */
611
#define WPI_ACTIVE_DWELL_TIME_5GHZ	(20)
612
#define WPI_ACTIVE_DWELL_FACTOR_2GHZ	( 3)
613
#define WPI_ACTIVE_DWELL_FACTOR_5GHZ	( 2)
614
615
#define WPI_PASSIVE_DWELL_TIME_2GHZ	( 20)
616
#define WPI_PASSIVE_DWELL_TIME_5GHZ	( 10)
617
#define WPI_PASSIVE_DWELL_BASE		(100)
618
619
/* Structure for command WPI_CMD_TXPOWER. */
542
struct wpi_cmd_txpower {
620
struct wpi_cmd_txpower {
621
	uint8_t		band;
622
#define WPI_BAND_5GHZ	0
623
#define WPI_BAND_2GHZ	1
543
624
544
	uint8_t		band;
545
#define WPI_RATE_5GHZ	0
546
#define WPI_RATE_2GHZ	1
547
	uint8_t		reserved;
625
	uint8_t		reserved;
548
	uint16_t	channel;
626
	uint16_t	chan;
549
627
550
#define WPI_RATE_MAPPING_COUNT 12
551
	struct {
628
	struct {
552
	    uint8_t	rate;
629
		uint8_t	plcp;
553
	    uint8_t	gain_radio;
630
		uint8_t	rf_gain;
554
	    uint8_t	gain_dsp;
631
		uint8_t	dsp_gain;
555
	    uint8_t	reserved;
632
		uint8_t	reserved;
556
	} __packed rates [WPI_RATE_MAPPING_COUNT];
633
	} __packed	rates[WPI_RIDX_MAX + 1];
557
634
558
} __packed;
635
} __packed;
559
636
637
/* Structure for command WPI_CMD_BT_COEX. */
638
struct wpi_bluetooth {
639
	uint8_t		flags;
640
#define WPI_BT_COEX_DISABLE	0
641
#define WPI_BT_COEX_MODE_2WIRE	1
642
#define WPI_BT_COEX_MODE_3WIRE	2
643
#define WPI_BT_COEX_MODE_4WIRE	3
560
644
645
	uint8_t		lead_time;
646
#define WPI_BT_LEAD_TIME_DEF	30
561
647
562
#define WPI_FW_MAIN_TEXT_MAXSZ (80 * 1024 )
648
	uint8_t		max_kill;
563
#define WPI_FW_MAIN_DATA_MAXSZ (32 * 1024 )
649
#define WPI_BT_MAX_KILL_DEF	5
564
#define WPI_FW_INIT_TEXT_MAXSZ (80 * 1024 )
565
#define WPI_FW_INIT_DATA_MAXSZ (32 * 1024 )
566
#define WPI_FW_BOOT_TEXT_MAXSZ 1024
567
650
568
#define WPI_FW_UPDATED	(1 << 31 )
651
	uint8_t		reserved;
569
652
	uint32_t	kill_ack;
570
/* firmware image header */
653
	uint32_t	kill_cts;
571
struct wpi_firmware_hdr {
572
573
#define WPI_FW_MINVERSION 2144
574
575
	uint32_t	version;
576
	uint32_t	rtextsz;
577
	uint32_t	rdatasz;
578
	uint32_t	itextsz;
579
	uint32_t	idatasz;
580
	uint32_t	btextsz;
581
} __packed;
654
} __packed;
582
655
583
/* structure for WPI_UC_READY notification */
656
/* Structure for WPI_UC_READY notification. */
584
struct wpi_ucode_info {
657
struct wpi_ucode_info {
585
	uint32_t	version;
658
	uint8_t		minor;
659
	uint8_t		major;
660
	uint16_t	reserved1;
586
	uint8_t		revision[8];
661
	uint8_t		revision[8];
587
	uint8_t		type;
662
	uint8_t		type;
588
	uint8_t		subtype;
663
	uint8_t		subtype;
589
	uint16_t	reserved;
664
	uint16_t	reserved2;
590
	uint32_t	logptr;
665
	uint32_t	logptr;
591
	uint32_t	errorptr;
666
	uint32_t	errptr;
592
	uint32_t	timestamp;
667
	uint32_t	tstamp;
593
	uint32_t	valid;
668
	uint32_t	valid;
594
} __packed;
669
} __packed;
595
670
596
/* structure for WPI_START_SCAN notification */
671
/* Structure for WPI_START_SCAN notification. */
597
struct wpi_start_scan {
672
struct wpi_start_scan {
598
	uint64_t	tstamp;
673
	uint64_t	tstamp;
599
	uint32_t	tbeacon;
674
	uint32_t	tbeacon;
Lines 603-609 Link Here
603
	uint32_t	status;
678
	uint32_t	status;
604
} __packed;
679
} __packed;
605
680
606
/* structure for WPI_STOP_SCAN notification */
681
/* Structure for WPI_STOP_SCAN notification. */
607
struct wpi_stop_scan {
682
struct wpi_stop_scan {
608
	uint8_t		nchan;
683
	uint8_t		nchan;
609
	uint8_t		status;
684
	uint8_t		status;
Lines 612-620 Link Here
612
	uint64_t	tsf;
687
	uint64_t	tsf;
613
} __packed;
688
} __packed;
614
689
690
/* Structures for WPI_{RX,BEACON}_STATISTICS notification. */
691
struct wpi_rx_phy_stats {
692
	uint32_t	ina;
693
	uint32_t	fina;
694
	uint32_t	bad_plcp;
695
	uint32_t	bad_crc32;
696
	uint32_t	overrun;
697
	uint32_t	eoverrun;
698
	uint32_t	good_crc32;
699
	uint32_t	fa;
700
	uint32_t	bad_fina_sync;
701
	uint32_t	sfd_timeout;
702
	uint32_t	fina_timeout;
703
	uint32_t	no_rts_ack;
704
	uint32_t	rxe_limit;
705
	uint32_t	ack;
706
	uint32_t	cts;
707
} __packed;
708
709
struct wpi_rx_general_stats {
710
	uint32_t	bad_cts;
711
	uint32_t	bad_ack;
712
	uint32_t	not_bss;
713
	uint32_t	filtered;
714
	uint32_t	bad_chan;
715
} __packed;
716
717
struct wpi_rx_stats {
718
	struct wpi_rx_phy_stats		ofdm;
719
	struct wpi_rx_phy_stats		cck;
720
	struct wpi_rx_general_stats	general;
721
} __packed;
722
723
struct wpi_tx_stats {
724
	uint32_t	preamble;
725
	uint32_t	rx_detected;
726
	uint32_t	bt_defer;
727
	uint32_t	bt_kill;
728
	uint32_t	short_len;
729
	uint32_t	cts_timeout;
730
	uint32_t	ack_timeout;
731
	uint32_t	exp_ack;
732
	uint32_t	ack;
733
} __packed;
734
735
struct wpi_general_stats {
736
	uint32_t	temp;
737
	uint32_t	burst_check;
738
	uint32_t	burst;
739
	uint32_t	reserved[4];
740
	uint32_t	sleep;
741
	uint32_t	slot_out;
742
	uint32_t	slot_idle;
743
	uint32_t	ttl_tstamp;
744
	uint32_t	tx_ant_a;
745
	uint32_t	tx_ant_b;
746
	uint32_t	exec;
747
	uint32_t	probe;
748
} __packed;
749
750
struct wpi_stats {
751
	uint32_t			flags;
752
	struct wpi_rx_stats		rx;
753
	struct wpi_tx_stats		tx;
754
	struct wpi_general_stats	general;
755
} __packed;
756
757
/* Possible flags for command WPI_CMD_GET_STATISTICS. */
758
#define WPI_STATISTICS_BEACON_DISABLE	(1 << 1)
759
760
761
/* Firmware error dump entry. */
762
struct wpi_fw_dump {
763
	uint32_t	desc;
764
	uint32_t	time;
765
	uint32_t	blink[2];
766
	uint32_t	ilink[2];
767
	uint32_t	data;
768
} __packed;
769
770
/* Firmware image file header. */
771
struct wpi_firmware_hdr {
772
773
#define WPI_FW_MINVERSION 2144
774
#define WPI_FW_NAME "wpifw"
775
776
	uint16_t	driver;
777
	uint8_t		minor;
778
	uint8_t		major;
779
	uint32_t	rtextsz;
780
	uint32_t	rdatasz;
781
	uint32_t	itextsz;
782
	uint32_t	idatasz;
783
	uint32_t	btextsz;
784
} __packed;
785
786
#define WPI_FW_TEXT_MAXSZ	 ( 80 * 1024 )
787
#define WPI_FW_DATA_MAXSZ	 ( 32 * 1024 )
788
#define WPI_FW_BOOT_TEXT_MAXSZ		1024
789
790
#define WPI_FW_UPDATED	(1U << 31 )
791
792
/*
793
 * Offsets into EEPROM.
794
 */
615
#define WPI_EEPROM_MAC		0x015
795
#define WPI_EEPROM_MAC		0x015
616
#define WPI_EEPROM_REVISION	0x035
796
#define WPI_EEPROM_REVISION	0x035
617
#define WPI_EEPROM_CAPABILITIES	0x045
797
#define WPI_EEPROM_SKU_CAP	0x045
618
#define WPI_EEPROM_TYPE		0x04a
798
#define WPI_EEPROM_TYPE		0x04a
619
#define WPI_EEPROM_DOMAIN	0x060
799
#define WPI_EEPROM_DOMAIN	0x060
620
#define WPI_EEPROM_BAND1	0x063
800
#define WPI_EEPROM_BAND1	0x063
Lines 626-676 Link Here
626
806
627
struct wpi_eeprom_chan {
807
struct wpi_eeprom_chan {
628
	uint8_t	flags;
808
	uint8_t	flags;
629
#define WPI_EEPROM_CHAN_VALID	(1<<0)
809
#define WPI_EEPROM_CHAN_VALID	(1 << 0)
630
#define	WPI_EEPROM_CHAN_IBSS	(1<<1)
810
#define	WPI_EEPROM_CHAN_IBSS	(1 << 1)
631
#define WPI_EEPROM_CHAN_ACTIVE	(1<<3)
811
#define WPI_EEPROM_CHAN_ACTIVE	(1 << 3)
632
#define WPI_EEPROM_CHAN_RADAR	(1<<4)
812
#define WPI_EEPROM_CHAN_RADAR	(1 << 4)
633
813
634
	int8_t	maxpwr;
814
	int8_t	maxpwr;
635
} __packed;
815
} __packed;
636
816
637
struct wpi_eeprom_sample {
817
struct wpi_eeprom_sample {
638
    uint8_t	index;
818
	uint8_t		index;
639
    int8_t	power;
819
	int8_t		power;
640
    uint16_t	volt;
820
	uint16_t	volt;
641
};
821
} __packed;
642
822
643
#define WPI_POWER_GROUPS_COUNT	5
823
#define WPI_POWER_GROUPS_COUNT	5
644
645
struct wpi_eeprom_group {
824
struct wpi_eeprom_group {
646
    struct	wpi_eeprom_sample samples[5];
825
	struct		wpi_eeprom_sample samples[5];
647
    int32_t	coef[5];
826
	int32_t		coef[5];
648
    int32_t	corr[5];
827
	int32_t		corr[5];
649
    int8_t	maxpwr;
828
	int8_t		maxpwr;
650
    uint8_t	chan;
829
	uint8_t		chan;
651
    int16_t	temp;
830
	int16_t		temp;
652
} __packed;
831
} __packed;
653
832
654
#define WPI_CHAN_BANDS_COUNT	5
833
#define WPI_CHAN_BANDS_COUNT	 5
655
#define WPI_MAX_CHAN_PER_BAND	14
834
#define WPI_MAX_CHAN_PER_BAND	14
656
657
static const struct wpi_chan_band {
835
static const struct wpi_chan_band {
658
    uint32_t	addr;	/* offset in EEPROM */
836
	uint32_t	addr;	/* offset in EEPROM */
659
    uint8_t	nchan;
837
	uint8_t		nchan;
660
    uint8_t	chan[WPI_MAX_CHAN_PER_BAND];
838
	uint8_t		chan[WPI_MAX_CHAN_PER_BAND];
661
} wpi_bands[5] = {
839
} wpi_bands[] = {
662
    { WPI_EEPROM_BAND1, 14,
840
	/* 20MHz channels, 2GHz band. */
663
	{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 }},
841
	{ WPI_EEPROM_BAND1, 14,
664
    { WPI_EEPROM_BAND2, 13,
842
	    { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 } },
665
	{ 183, 184, 185, 187, 188, 189, 192, 196, 7, 8, 11, 12, 16 }},
843
	/* 20MHz channels, 5GHz band. */
666
    { WPI_EEPROM_BAND3, 12,
844
	{ WPI_EEPROM_BAND2, 13,
667
	{ 34, 36, 38, 40, 42, 44, 46, 48, 52, 56, 60, 64 }},
845
	    { 183, 184, 185, 187, 188, 189, 192, 196, 7, 8, 11, 12, 16 } },
668
    { WPI_EEPROM_BAND4, 11,
846
	{ WPI_EEPROM_BAND3, 12,
669
	{ 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140 }},
847
	    { 34, 36, 38, 40, 42, 44, 46, 48, 52, 56, 60, 64 } },
670
    { WPI_EEPROM_BAND5, 6,
848
	{ WPI_EEPROM_BAND4, 11,
671
	{ 145, 149, 153, 157, 161, 165 }}
849
	    { 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140 } },
850
	{ WPI_EEPROM_BAND5, 6,
851
	    { 145, 149, 153, 157, 161, 165 } }
672
};
852
};
673
853
854
/* HW rate indices. */
855
#define WPI_RIDX_OFDM6	 0
856
#define WPI_RIDX_OFDM36	 5
857
#define WPI_RIDX_OFDM48	 6
858
#define WPI_RIDX_OFDM54	 7
859
#define WPI_RIDX_CCK1	 8
860
#define WPI_RIDX_CCK2	 9
861
#define WPI_RIDX_CCK11	11
862
863
static const uint8_t wpi_ridx_to_plcp[] = {
864
	/* OFDM: IEEE Std 802.11a-1999, pp. 14 Table 80 */
865
	/* R1-R4 (ral/ural is R4-R1) */
866
	0xd, 0xf, 0x5, 0x7, 0x9, 0xb, 0x1, 0x3,
867
	/* CCK: device-dependent */
868
	10, 20, 55, 110
869
};
870
674
#define WPI_MAX_PWR_INDEX	77
871
#define WPI_MAX_PWR_INDEX	77
675
872
676
/*
873
/*
Lines 678-702 Link Here
678
 * the reference driver.)
875
 * the reference driver.)
679
 */
876
 */
680
static const uint8_t wpi_rf_gain_2ghz[WPI_MAX_PWR_INDEX + 1] = {
877
static const uint8_t wpi_rf_gain_2ghz[WPI_MAX_PWR_INDEX + 1] = {
681
    0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xbb, 0xbb, 0xbb,
878
	0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xbb, 0xbb, 0xbb,
682
    0xbb, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xd3, 0xd3, 0xb3, 0xb3, 0xb3,
879
	0xbb, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xd3, 0xd3, 0xb3, 0xb3, 0xb3,
683
    0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x73, 0xeb, 0xeb, 0xeb,
880
	0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x73, 0xeb, 0xeb, 0xeb,
684
    0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xab, 0xab, 0xab, 0x8b,
881
	0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xab, 0xab, 0xab, 0x8b,
685
    0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xc3, 0xc3, 0xc3, 0xc3, 0xa3,
882
	0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xc3, 0xc3, 0xc3, 0xc3, 0xa3,
686
    0xa3, 0xa3, 0xa3, 0x83, 0x83, 0x83, 0x83, 0x63, 0x63, 0x63, 0x63,
883
	0xa3, 0xa3, 0xa3, 0x83, 0x83, 0x83, 0x83, 0x63, 0x63, 0x63, 0x63,
687
    0x43, 0x43, 0x43, 0x43, 0x23, 0x23, 0x23, 0x23, 0x03, 0x03, 0x03,
884
	0x43, 0x43, 0x43, 0x43, 0x23, 0x23, 0x23, 0x23, 0x03, 0x03, 0x03,
688
    0x03
885
	0x03
689
};
886
};
690
887
691
static const uint8_t wpi_rf_gain_5ghz[WPI_MAX_PWR_INDEX + 1] = {
888
static const uint8_t wpi_rf_gain_5ghz[WPI_MAX_PWR_INDEX + 1] = {
692
    0xfb, 0xfb, 0xfb, 0xdb, 0xdb, 0xbb, 0xbb, 0x9b, 0x9b, 0x7b, 0x7b,
889
	0xfb, 0xfb, 0xfb, 0xdb, 0xdb, 0xbb, 0xbb, 0x9b, 0x9b, 0x7b, 0x7b,
693
    0x7b, 0x7b, 0x5b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x1b, 0x1b,
890
	0x7b, 0x7b, 0x5b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x1b, 0x1b,
694
    0x1b, 0x73, 0x73, 0x73, 0x53, 0x53, 0x53, 0x53, 0x53, 0x33, 0x33,
891
	0x1b, 0x73, 0x73, 0x73, 0x53, 0x53, 0x53, 0x53, 0x53, 0x33, 0x33,
695
    0x33, 0x33, 0x13, 0x13, 0x13, 0x13, 0x13, 0xab, 0xab, 0xab, 0x8b,
892
	0x33, 0x33, 0x13, 0x13, 0x13, 0x13, 0x13, 0xab, 0xab, 0xab, 0x8b,
696
    0x8b, 0x8b, 0x8b, 0x6b, 0x6b, 0x6b, 0x6b, 0x4b, 0x4b, 0x4b, 0x4b,
893
	0x8b, 0x8b, 0x8b, 0x6b, 0x6b, 0x6b, 0x6b, 0x4b, 0x4b, 0x4b, 0x4b,
697
    0x2b, 0x2b, 0x2b, 0x2b, 0x0b, 0x0b, 0x0b, 0x0b, 0x83, 0x83, 0x63,
894
	0x2b, 0x2b, 0x2b, 0x2b, 0x0b, 0x0b, 0x0b, 0x0b, 0x83, 0x83, 0x63,
698
    0x63, 0x63, 0x63, 0x43, 0x43, 0x43, 0x43, 0x23, 0x23, 0x23, 0x23,
895
	0x63, 0x63, 0x63, 0x43, 0x43, 0x43, 0x43, 0x23, 0x23, 0x23, 0x23,
699
    0x03
896
	0x03
700
};
897
};
701
898
702
/*
899
/*
Lines 704-737 Link Here
704
 * from the reference driver.)
901
 * from the reference driver.)
705
 */
902
 */
706
static const uint8_t wpi_dsp_gain_2ghz[WPI_MAX_PWR_INDEX + 1] = {
903
static const uint8_t wpi_dsp_gain_2ghz[WPI_MAX_PWR_INDEX + 1] = {
707
    0x7f, 0x7f, 0x7f, 0x7f, 0x7d, 0x6e, 0x69, 0x62, 0x7d, 0x73, 0x6c,
904
	0x7f, 0x7f, 0x7f, 0x7f, 0x7d, 0x6e, 0x69, 0x62, 0x7d, 0x73, 0x6c,
708
    0x63, 0x77, 0x6f, 0x69, 0x61, 0x5c, 0x6a, 0x64, 0x78, 0x71, 0x6b,
905
	0x63, 0x77, 0x6f, 0x69, 0x61, 0x5c, 0x6a, 0x64, 0x78, 0x71, 0x6b,
709
    0x7d, 0x77, 0x70, 0x6a, 0x65, 0x61, 0x5b, 0x6b, 0x79, 0x73, 0x6d,
906
	0x7d, 0x77, 0x70, 0x6a, 0x65, 0x61, 0x5b, 0x6b, 0x79, 0x73, 0x6d,
710
    0x7f, 0x79, 0x73, 0x6c, 0x66, 0x60, 0x5c, 0x6e, 0x68, 0x62, 0x74,
907
	0x7f, 0x79, 0x73, 0x6c, 0x66, 0x60, 0x5c, 0x6e, 0x68, 0x62, 0x74,
711
    0x7d, 0x77, 0x71, 0x6b, 0x65, 0x60, 0x71, 0x6a, 0x66, 0x5f, 0x71,
908
	0x7d, 0x77, 0x71, 0x6b, 0x65, 0x60, 0x71, 0x6a, 0x66, 0x5f, 0x71,
712
    0x6a, 0x66, 0x5f, 0x71, 0x6a, 0x66, 0x5f, 0x71, 0x6a, 0x66, 0x5f,
909
	0x6a, 0x66, 0x5f, 0x71, 0x6a, 0x66, 0x5f, 0x71, 0x6a, 0x66, 0x5f,
713
    0x71, 0x6a, 0x66, 0x5f, 0x71, 0x6a, 0x66, 0x5f, 0x71, 0x6a, 0x66,
910
	0x71, 0x6a, 0x66, 0x5f, 0x71, 0x6a, 0x66, 0x5f, 0x71, 0x6a, 0x66,
714
    0x5f
911
	0x5f
715
};
912
};
716
913
717
static const uint8_t wpi_dsp_gain_5ghz[WPI_MAX_PWR_INDEX + 1] = {
914
static const uint8_t wpi_dsp_gain_5ghz[WPI_MAX_PWR_INDEX + 1] = {
718
    0x7f, 0x78, 0x72, 0x77, 0x65, 0x71, 0x66, 0x72, 0x67, 0x75, 0x6b,
915
	0x7f, 0x78, 0x72, 0x77, 0x65, 0x71, 0x66, 0x72, 0x67, 0x75, 0x6b,
719
    0x63, 0x5c, 0x6c, 0x7d, 0x76, 0x6d, 0x66, 0x60, 0x5a, 0x68, 0x62,
916
	0x63, 0x5c, 0x6c, 0x7d, 0x76, 0x6d, 0x66, 0x60, 0x5a, 0x68, 0x62,
720
    0x5c, 0x76, 0x6f, 0x68, 0x7e, 0x79, 0x71, 0x69, 0x63, 0x76, 0x6f,
917
	0x5c, 0x76, 0x6f, 0x68, 0x7e, 0x79, 0x71, 0x69, 0x63, 0x76, 0x6f,
721
    0x68, 0x62, 0x74, 0x6d, 0x66, 0x62, 0x5d, 0x71, 0x6b, 0x63, 0x78,
918
	0x68, 0x62, 0x74, 0x6d, 0x66, 0x62, 0x5d, 0x71, 0x6b, 0x63, 0x78,
722
    0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63,
919
	0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63,
723
    0x78, 0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63, 0x6b, 0x63, 0x78,
920
	0x78, 0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63, 0x6b, 0x63, 0x78,
724
    0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63,
921
	0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63,
725
    0x78
922
	0x78
726
};
923
};
727
924
925
/*
926
 * Power saving settings (values obtained from the reference driver.)
927
 */
928
#define WPI_NDTIMRANGES		2
929
#define WPI_NPOWERLEVELS	6
930
static const struct wpi_pmgt {
931
	uint32_t	rxtimeout;
932
	uint32_t	txtimeout;
933
	uint32_t	intval[5];
934
	int		skip_dtim;
935
} wpi_pmgt[WPI_NDTIMRANGES][WPI_NPOWERLEVELS] = {
936
	/* DTIM <= 10 */
937
	{
938
	{   0,   0, {  0,  0,  0,  0,  0 }, 0 },	/* CAM */
939
	{ 200, 500, {  1,  2,  3,  4,  4 }, 0 },	/* PS level 1 */
940
	{ 200, 300, {  2,  4,  6,  7,  7 }, 0 },	/* PS level 2 */
941
	{  50, 100, {  2,  6,  9,  9, 10 }, 0 },	/* PS level 3 */
942
	{  50,  25, {  2,  7,  9,  9, 10 }, 1 },	/* PS level 4 */
943
	{  25,  25, {  4,  7, 10, 10, 10 }, 1 }		/* PS level 5 */
944
	},
945
	/* DTIM >= 11 */
946
	{
947
	{   0,   0, {  0,  0,  0,  0,  0 }, 0 },	/* CAM */
948
	{ 200, 500, {  1,  2,  3,  4, -1 }, 0 },	/* PS level 1 */
949
	{ 200, 300, {  2,  4,  6,  7, -1 }, 0 },	/* PS level 2 */
950
	{  50, 100, {  2,  6,  9,  9, -1 }, 0 },	/* PS level 3 */
951
	{  50,  25, {  2,  7,  9,  9, -1 }, 0 },	/* PS level 4 */
952
	{  25,  25, {  4,  7, 10, 10, -1 }, 0 }		/* PS level 5 */
953
	}
954
};
728
955
956
/* Firmware errors. */
957
static const char * const wpi_fw_errmsg[] = {
958
	"OK",
959
	"FAIL",
960
	"BAD_PARAM",
961
	"BAD_CHECKSUM",
962
	"NMI_INTERRUPT",
963
	"SYSASSERT",
964
	"FATAL_ERROR"
965
};
966
967
/* XXX description for some error codes (error data). */
968
/* 0x00000074 - wrong totlen field */
969
/* 0x000003B3 - powersave error */
970
/* 0x00000447 - wrong channel selected */
971
729
#define WPI_READ(sc, reg)						\
972
#define WPI_READ(sc, reg)						\
730
    bus_space_read_4((sc)->sc_st, (sc)->sc_sh, (reg))
973
	bus_space_read_4((sc)->sc_st, (sc)->sc_sh, (reg))
731
974
732
#define WPI_WRITE(sc, reg, val)						\
975
#define WPI_WRITE(sc, reg, val)						\
733
    bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (reg), (val))
976
	bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (reg), (val))
734
977
735
#define WPI_WRITE_REGION_4(sc, offset, datap, count)			\
978
#define WPI_WRITE_REGION_4(sc, offset, datap, count)			\
736
    bus_space_write_region_4((sc)->sc_st, (sc)->sc_sh, (offset),	\
979
	bus_space_write_region_4((sc)->sc_st, (sc)->sc_sh, (offset),	\
737
			     (datap), (count))
980
	    (datap), (count))
981
982
#define WPI_SETBITS(sc, reg, mask)					\
983
	WPI_WRITE(sc, reg, WPI_READ(sc, reg) | (mask))
984
985
#define WPI_CLRBITS(sc, reg, mask)					\
986
	WPI_WRITE(sc, reg, WPI_READ(sc, reg) & ~(mask))
987
988
#define WPI_BARRIER_WRITE(sc)						\
989
	bus_space_barrier((sc)->sc_st, (sc)->sc_sh, 0, (sc)->sc_sz,	\
990
	    BUS_SPACE_BARRIER_WRITE)
991
992
#define WPI_BARRIER_READ_WRITE(sc)					\
993
	bus_space_barrier((sc)->sc_st, (sc)->sc_sh, 0, (sc)->sc_sz,	\
994
	    BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE)
(-)sys/dev/wpi/if_wpivar.h (-42 / +70 lines)
Lines 16-23 Link Here
16
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18
 */
18
 */
19
#include <net80211/ieee80211_amrr.h>
20
21
struct wpi_rx_radiotap_header {
19
struct wpi_rx_radiotap_header {
22
	struct ieee80211_radiotap_header wr_ihdr;
20
	struct ieee80211_radiotap_header wr_ihdr;
23
	uint64_t	wr_tsft;
21
	uint64_t	wr_tsft;
Lines 28-34 Link Here
28
	int8_t		wr_dbm_antsignal;
26
	int8_t		wr_dbm_antsignal;
29
	int8_t		wr_dbm_antnoise;
27
	int8_t		wr_dbm_antnoise;
30
	uint8_t		wr_antenna;
28
	uint8_t		wr_antenna;
31
};
29
} __packed;
32
30
33
#define WPI_RX_RADIOTAP_PRESENT						\
31
#define WPI_RX_RADIOTAP_PRESENT						\
34
	((1 << IEEE80211_RADIOTAP_TSFT) |				\
32
	((1 << IEEE80211_RADIOTAP_TSFT) |				\
Lines 45-52 Link Here
45
	uint8_t		wt_rate;
43
	uint8_t		wt_rate;
46
	uint16_t	wt_chan_freq;
44
	uint16_t	wt_chan_freq;
47
	uint16_t	wt_chan_flags;
45
	uint16_t	wt_chan_flags;
48
	uint8_t		wt_hwqueue;
46
} __packed;
49
};
50
47
51
#define WPI_TX_RADIOTAP_PRESENT						\
48
#define WPI_TX_RADIOTAP_PRESENT						\
52
	((1 << IEEE80211_RADIOTAP_FLAGS) |				\
49
	((1 << IEEE80211_RADIOTAP_FLAGS) |				\
Lines 56-70 Link Here
56
struct wpi_dma_info {
53
struct wpi_dma_info {
57
	bus_dma_tag_t		tag;
54
	bus_dma_tag_t		tag;
58
	bus_dmamap_t            map;
55
	bus_dmamap_t            map;
59
	bus_addr_t		paddr;	      /* aligned p address */
56
	bus_addr_t		paddr;
60
	bus_addr_t		paddr_start;  /* possibly unaligned p start*/
57
	caddr_t			vaddr;
61
	caddr_t			vaddr;	      /* aligned v address */
62
	caddr_t			vaddr_start;  /* possibly unaligned v start */
63
	bus_size_t		size;
58
	bus_size_t		size;
64
};
59
};
65
60
66
struct wpi_tx_data {
61
struct wpi_tx_data {
67
	bus_dmamap_t		map;
62
	bus_dmamap_t		map;
63
	bus_addr_t		cmd_paddr;
68
	struct mbuf		*m;
64
	struct mbuf		*m;
69
	struct ieee80211_node	*ni;
65
	struct ieee80211_node	*ni;
70
};
66
};
Lines 74-92 Link Here
74
	struct wpi_dma_info	cmd_dma;
70
	struct wpi_dma_info	cmd_dma;
75
	struct wpi_tx_desc	*desc;
71
	struct wpi_tx_desc	*desc;
76
	struct wpi_tx_cmd	*cmd;
72
	struct wpi_tx_cmd	*cmd;
77
	struct wpi_tx_data	*data;
73
	struct wpi_tx_data	data[WPI_TX_RING_COUNT];
78
	bus_dma_tag_t		data_dmat;
74
	bus_dma_tag_t		data_dmat;
79
	int			qid;
75
	int			qid;
80
	int			count;
81
	int			queued;
76
	int			queued;
82
	int			cur;
77
	int			cur;
78
	int			update;
83
};
79
};
84
80
85
#define WPI_RBUF_COUNT ( WPI_RX_RING_COUNT + 16 )
86
87
struct wpi_rx_data {
81
struct wpi_rx_data {
88
	bus_dmamap_t		map;
82
	struct mbuf	*m;
89
	struct mbuf		*m;
83
	bus_dmamap_t	map;
90
};
84
};
91
85
92
struct wpi_rx_ring {
86
struct wpi_rx_ring {
Lines 95-109 Link Here
95
	struct wpi_rx_data	data[WPI_RX_RING_COUNT];
89
	struct wpi_rx_data	data[WPI_RX_RING_COUNT];
96
	bus_dma_tag_t		data_dmat;
90
	bus_dma_tag_t		data_dmat;
97
	int			cur;
91
	int			cur;
92
	int			update;
98
};
93
};
99
94
100
struct wpi_amrr {
95
struct wpi_node {
101
	struct	ieee80211_node ni;	/* must be the first */
96
	struct ieee80211_node	ni;	/* must be the first */
102
	int	txcnt;
97
	uint8_t			id;
103
	int	retrycnt;
104
	int	success;
105
	int	success_threshold;
106
	int	recovery;
107
};
98
};
108
99
109
struct wpi_power_sample {
100
struct wpi_power_sample {
Lines 119-126 Link Here
119
	int16_t	temp;
110
	int16_t	temp;
120
};
111
};
121
112
113
struct wpi_buf {
114
	void			*data;
115
	struct ieee80211_node	*ni;
116
	struct mbuf		*m;
117
	size_t			size;
118
	int			code;
119
	int			ac;
120
};
121
122
struct wpi_vap {
122
struct wpi_vap {
123
	struct ieee80211vap	vap;
123
	struct ieee80211vap	vap;
124
	struct wpi_buf		wv_bcbuf;
124
125
125
	int			(*newstate)(struct ieee80211vap *,
126
	int			(*newstate)(struct ieee80211vap *,
126
				    enum ieee80211_state, int);
127
				    enum ieee80211_state, int);
Lines 127-198 Link Here
127
};
128
};
128
#define	WPI_VAP(vap)	((struct wpi_vap *)(vap))
129
#define	WPI_VAP(vap)	((struct wpi_vap *)(vap))
129
130
131
struct wpi_fw_part {
132
	const uint8_t	*text;
133
	uint32_t	textsz;
134
	const uint8_t	*data;
135
	uint32_t	datasz;
136
};
137
138
struct wpi_fw_info {
139
	const uint8_t		*data;
140
	size_t			size;
141
	struct wpi_fw_part	init;
142
	struct wpi_fw_part	main;
143
	struct wpi_fw_part	boot;
144
};
145
130
struct wpi_softc {
146
struct wpi_softc {
131
	device_t		sc_dev;
147
	device_t		sc_dev;
148
132
	struct ifnet		*sc_ifp;
149
	struct ifnet		*sc_ifp;
150
	int			sc_debug;
151
133
	struct mtx		sc_mtx;
152
	struct mtx		sc_mtx;
153
	struct unrhdr		*sc_unr;
134
154
135
	/* Flags indicating the current state the driver
155
	/* Flags indicating the current state the driver
136
	 * expects the hardware to be in
156
	 * expects the hardware to be in
137
	 */
157
	 */
138
	uint32_t		flags;
158
	uint32_t		flags;
139
#define WPI_FLAG_HW_RADIO_OFF	(1 << 0)
159
#define WPI_FLAG_BUSY		(1 << 0)
140
#define WPI_FLAG_BUSY		(1 << 1)
141
#define WPI_FLAG_AUTH		(1 << 2)
142
160
143
	/* shared area */
161
	/* Shared area. */
144
	struct wpi_dma_info	shared_dma;
162
	struct wpi_dma_info	shared_dma;
145
	struct wpi_shared	*shared;
163
	struct wpi_shared	*shared;
146
164
147
	struct wpi_tx_ring	txq[WME_NUM_AC];
165
	struct wpi_tx_ring	txq[WPI_NTXQUEUES];
148
	struct wpi_tx_ring	cmdq;
149
	struct wpi_rx_ring	rxq;
166
	struct wpi_rx_ring	rxq;
150
167
151
	/* TX Thermal Callibration */
168
	/* TX Thermal Callibration. */
152
	struct callout		calib_to;
169
	struct callout		calib_to;
153
	int			calib_cnt;
170
	int			calib_cnt;
154
171
155
	/* Watch dog timer */
172
	/* Watch dog timers. */
156
	struct callout		watchdog_to;
173
	struct callout		watchdog_to;
157
	/* Hardware switch polling timer */
174
	struct callout		watchdog_rfkill;
158
	struct callout		hwswitch_to;
159
175
176
	/* Firmware image. */
177
	struct wpi_fw_info	fw;
178
	uint32_t		errptr;
179
160
	struct resource		*irq;
180
	struct resource		*irq;
161
	struct resource		*mem;
181
	struct resource		*mem;
162
	bus_space_tag_t		sc_st;
182
	bus_space_tag_t		sc_st;
163
	bus_space_handle_t	sc_sh;
183
	bus_space_handle_t	sc_sh;
164
	void			*sc_ih;
184
	void			*sc_ih;
185
	bus_size_t		sc_sz;
186
	int			sc_cap_off;     /* PCIe Capabilities. */
165
187
166
	struct wpi_config	config;
188
	struct wpi_rxon		rxon;
167
	int			temp;
189
	int			temp;
190
	uint32_t		qfullmsk;
168
191
169
170
	int			sc_tx_timer;
192
	int			sc_tx_timer;
171
	int			sc_scan_timer;
193
	int			sc_scan_timer;
172
194
173
	struct bpf_if		*sc_drvbpf;
195
	void			(*sc_node_free)(struct ieee80211_node *);
196
	void			(*sc_scan_curchan)(struct ieee80211_scan_state *,
197
				    unsigned long);
174
198
175
	struct wpi_rx_radiotap_header sc_rxtap;
199
	struct wpi_rx_radiotap_header sc_rxtap;
176
	struct wpi_tx_radiotap_header sc_txtap;
200
	struct wpi_tx_radiotap_header sc_txtap;
177
201
178
	/* firmware image */
202
	/* Firmware image. */
179
	const struct firmware	*fw_fp;
203
	const struct firmware	*fw_fp;
180
204
181
	/* firmware DMA transfer */
205
	/* Firmware DMA transfer. */
182
	struct wpi_dma_info	fw_dma;
206
	struct wpi_dma_info	fw_dma;
183
207
184
	/* Tasks used by the driver */
208
	/* Tasks used by the driver. */
185
	struct task		sc_restarttask;	/* reset firmware task */
209
	struct task		sc_reinittask;
186
	struct task		sc_radiotask;	/* reset rf task */
210
	struct task		sc_radiooff_task;
211
	struct task		sc_radioon_task;
187
212
188
       /* Eeprom info */
213
	/* Eeprom info. */
189
	uint8_t			cap;
214
	uint8_t			cap;
190
	uint16_t		rev;
215
	uint16_t		rev;
191
	uint8_t			type;
216
	uint8_t			type;
217
	struct wpi_eeprom_chan
218
	    eeprom_channels[WPI_CHAN_BANDS_COUNT][WPI_MAX_CHAN_PER_BAND];
192
	struct wpi_power_group	groups[WPI_POWER_GROUPS_COUNT];
219
	struct wpi_power_group	groups[WPI_POWER_GROUPS_COUNT];
193
	int8_t			maxpwr[IEEE80211_CHAN_MAX];
220
	int8_t			maxpwr[IEEE80211_CHAN_MAX];
194
	char			domain[4];	/*reglatory domain XXX */
221
	char			domain[4];	/* Regulatory domain. */
195
};
222
};
223
196
#define WPI_LOCK_INIT(_sc) \
224
#define WPI_LOCK_INIT(_sc) \
197
	mtx_init(&(_sc)->sc_mtx, device_get_nameunit((_sc)->sc_dev), \
225
	mtx_init(&(_sc)->sc_mtx, device_get_nameunit((_sc)->sc_dev), \
198
            MTX_NETWORK_LOCK, MTX_DEF)
226
            MTX_NETWORK_LOCK, MTX_DEF)
(-)sys/conf/options (+3 lines)
Lines 845-850 Link Here
845
# Options for the Intel 802.11n wireless driver
845
# Options for the Intel 802.11n wireless driver
846
IWN_DEBUG		opt_iwn.h
846
IWN_DEBUG		opt_iwn.h
847
847
848
# Options for the Intel 3945ABG wireless driver
849
WPI_DEBUG		opt_wpi.h
850
848
# dcons options 
851
# dcons options 
849
DCONS_BUF_SIZE		opt_dcons.h
852
DCONS_BUF_SIZE		opt_dcons.h
850
DCONS_POLL_HZ		opt_dcons.h
853
DCONS_POLL_HZ		opt_dcons.h
(-)sys/modules/wpi/Makefile (-1 / +1 lines)
Lines 3-8 Link Here
3
.PATH:  ${.CURDIR}/../../dev/wpi
3
.PATH:  ${.CURDIR}/../../dev/wpi
4
4
5
KMOD    = if_wpi
5
KMOD    = if_wpi
6
SRCS    = if_wpi.c device_if.h bus_if.h pci_if.h opt_wlan.h
6
SRCS    = if_wpi.c device_if.h bus_if.h pci_if.h opt_wpi.h opt_wlan.h
7
7
8
.include <bsd.kmod.mk>
8
.include <bsd.kmod.mk>

Return to bug 197143