1 /*
2  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
3  * Use is subject to license terms.
4  */
5 
6 /*
7  * Copyright(c) 2004
8  *	Damien Bergamini <damien.bergamini@free.fr>. All rights reserved.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice unmodified, this list of conditions, and the following
15  *    disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25  * DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30  * SUCH DAMAGE.
31  */
32 
33 #ifndef _SYS_IPW2100_IMPL_H
34 #define	_SYS_IPW2100_IMPL_H
35 
36 #pragma ident	"%Z%%M%	%I%	%E% SMI"
37 
38 #ifdef __cplusplus
39 extern "C" {
40 #endif
41 
42 /*
43  * Intel Wireless PRO/2100 mini-PCI adapter driver
44  * ipw2100_impl.h includes:
45  * 	. implementation of ipw2100
46  * 	. hardware operation and interface define for ipw2100
47  * 	. firmware operation and interface define for ipw2100
48  */
49 #include <sys/ddi.h>
50 #include <sys/sunddi.h>
51 #include <sys/mac.h>
52 #include <sys/net80211.h>
53 
54 /*
55  * Implementation of ipw2100
56  */
57 #define	IPW2100_NODENAME	"ipw"
58 
59 #define	IPW2100_PCI_CFG_RNUM	(0) /* pci config space */
60 #define	IPW2100_PCI_CSR_RNUM	(1) /* device CSR space */
61 
62 #define	IPW2100_NUM_TXBD    (128)
63 #define	IPW2100_TXBD_SIZE   (IPW2100_NUM_TXBD * sizeof (struct ipw2100_bd))
64 #define	IPW2100_NUM_TXBUF   (IPW2100_NUM_TXBD/2)  /* ipw2100_txb number */
65 #define	IPW2100_TXBUF_SIZE  (sizeof (struct ipw2100_txb))
66 
67 #define	IPW2100_NUM_RXBD    (128)
68 #define	IPW2100_STATUS_SIZE (IPW2100_NUM_RXBD * sizeof (struct ipw2100_status))
69 #define	IPW2100_RXBD_SIZE   (IPW2100_NUM_RXBD * sizeof (struct ipw2100_bd))
70 #define	IPW2100_NUM_RXBUF   (IPW2100_NUM_RXBD)
71 #define	IPW2100_RXBUF_SIZE  (sizeof (struct ipw2100_rxb))
72 
73 #define	IPW2100_CMD_SIZE    (sizeof (struct ipw2100_cmd))
74 
75 struct dma_region {
76 	ddi_dma_handle_t	dr_hnd;
77 	ddi_acc_handle_t	dr_acc;
78 	ddi_dma_cookie_t	dr_cookie;
79 	uint_t			dr_ccnt;
80 	uint32_t		dr_pbase;
81 	caddr_t			dr_base;
82 	size_t			dr_size;
83 	const char		*dr_name;
84 };
85 
86 struct ipw2100_firmware {
87 	uint8_t			*bin_base; /* image */
88 	size_t			bin_size;
89 	uint8_t			*fw_base; /* firmware code */
90 	size_t			fw_size;
91 	uint8_t			*uc_base; /* u-controller code */
92 	size_t			uc_size;
93 };
94 
95 /*
96  * per-instance soft-state structure
97  */
98 struct ipw2100_softc {
99 	struct ieee80211com	sc_ic;
100 	dev_info_t		*sc_dip;
101 	int	(*sc_newstate)(struct ieee80211com *,
102 	    enum ieee80211_state, int);
103 	int			sc_authmode;
104 	/* CSR */
105 	ddi_acc_handle_t	sc_ioh;
106 	caddr_t			sc_regs;
107 	/* interrupt */
108 	ddi_iblock_cookie_t	sc_iblk;
109 	/* soft interrupt */
110 	ddi_softintr_t		sc_link_softint;
111 	/* link state */
112 	int32_t			sc_linkstate;
113 	/* mutex to protect interrupt handler */
114 	kmutex_t		sc_ilock;
115 	kcondvar_t		sc_fw_cond;
116 	/* flags */
117 	uint_t			sc_flags;
118 #define	IPW2100_FLAG_FW_CACHED		(1 << 0)
119 #define	IPW2100_FLAG_FW_INITED		(1 << 1)
120 #define	IPW2100_FLAG_RUNNING		(1 << 2)
121 #define	IPW2100_FLAG_LINK_CHANGE	(1 << 3)
122 #define	IPW2100_FLAG_TX_SCHED		(1 << 4)
123 #define	IPW2100_FLAG_CMD_WAIT		(1 << 5)
124 #define	IPW2100_FLAG_SCAN_COMPLETE	(1 << 6)
125 #define	IPW2100_FLAG_HW_ERR_RECOVER	(1 << 7)
126 #define	IPW2100_FLAG_HAS_RADIO_SWITCH	(1 << 16)
127 	/* command */
128 	struct ipw2100_cmd	*sc_cmd;
129 	int			sc_done; /* command is done */
130 	kcondvar_t		sc_cmd_cond;
131 	/* reschedule lock */
132 	kmutex_t		sc_resched_lock;
133 	/* tx ring, bd->hdr&buf */
134 	kmutex_t		sc_tx_lock;
135 	kcondvar_t		sc_tx_cond;
136 	uint32_t		sc_tx_cur;
137 	uint32_t		sc_tx_free;
138 	struct ipw2100_bd	*sc_txbd;
139 	struct ipw2100_txb	*sc_txbufs[IPW2100_NUM_TXBUF];
140 	/* rx ring, status, bd->buf */
141 	uint32_t		sc_rx_cur;
142 	uint32_t		sc_rx_free;
143 	struct ipw2100_status	*sc_status;
144 	struct ipw2100_bd	*sc_rxbd;
145 	struct ipw2100_rxb	*sc_rxbufs[IPW2100_NUM_RXBUF];
146 	/* DMA resources */
147 	struct dma_region	sc_dma_txbd; /* tx buffer descriptor */
148 	struct dma_region	sc_dma_txbufs[IPW2100_NUM_TXBUF];
149 	struct dma_region	sc_dma_rxbd; /* rx buffer descriptor */
150 	struct dma_region	sc_dma_rxbufs[IPW2100_NUM_RXBUF];
151 	struct dma_region	sc_dma_status;
152 	struct dma_region	sc_dma_cmd; /* command */
153 	/* hw configuration values */
154 	uint8_t			sc_macaddr[IEEE80211_ADDR_LEN];
155 	uint16_t		sc_chmask;
156 	/* MAC address string */
157 	char			sc_macstr[32];
158 	/* tables */
159 	uint32_t		sc_table1_base;
160 	uint32_t		sc_table2_base;
161 	/* firmware */
162 	struct			ipw2100_firmware sc_fw;
163 	/* mfthread related */
164 	kmutex_t		sc_mflock;
165 	kcondvar_t		sc_mfthread_cv;
166 	kcondvar_t		sc_scan_cv; /* used for active scan */
167 	kthread_t		*sc_mf_thread;
168 	uint32_t		sc_mfthread_switch; /* 0/1 indicate off/on */
169 
170 	int			if_flags;
171 #define	IFF_DEBUG		(0x0004)
172 #define	IFF_PROMISC		(0x0100)
173 #define	IFF_SIMPLEX		(0x0800)
174 
175 };
176 
177 /*
178  * RING_BACKWARD  - move 'x' backward 's' steps in a 'b'-sized ring
179  * RING_FORWARD   - move 'x' forward 's' steps in a 'b'-sized ring
180  *
181  * note that there must be 0 <= 'x' < 'b' && 0 <= 's' < 'b'
182  */
183 #define	RING_FLEN(x, y, b)	((((x) > (y)) ? ((b)+(y)-(x)) : ((y)-(x))))
184 #define	RING_FORWARD(x, s, b)	(((x)+(s))%(b))
185 #define	RING_BACKWARD(x, s, b)	RING_FORWARD((x), (b)-(s), (b))
186 
187 /*
188  * field_offset
189  */
190 #define	OFFSETOF(s, m)		((size_t)(&(((s *)0)->m)))
191 
192 extern int ipw2100_init(struct ipw2100_softc *sc);
193 extern int ipw2100_disable(struct ipw2100_softc *sc);
194 
195 /*
196  * Below structure and functions will be used for statistic
197  */
198 struct statistic {
199 	int		index;
200 	const char	*desc;
201 	int		unit;
202 #define	INT		1
203 #define	HEX		2
204 #define	MASK		HEX
205 #define	PERCENTAGE	3
206 #define	BOOL		4
207 };
208 extern void ipw2100_get_statistics(struct ipw2100_softc *sc);
209 
210 /*
211  * Hardware related definations and interfaces.
212  */
213 #define	IPW2100_CSR_INTR		(0x0008)
214 #define	IPW2100_CSR_INTR_MASK		(0x000c)
215 #define	IPW2100_CSR_INDIRECT_ADDR	(0x0010)
216 #define	IPW2100_CSR_INDIRECT_DATA	(0x0014)
217 #define	IPW2100_CSR_AUTOINC_ADDR	(0x0018)
218 #define	IPW2100_CSR_AUTOINC_DATA	(0x001c)
219 #define	IPW2100_CSR_RST			(0x0020)
220 #define	IPW2100_CSR_CTL			(0x0024)
221 #define	IPW2100_CSR_IO			(0x0030)
222 #define	IPW2100_CSR_DEBUG_AREA		(0x0090)
223 
224 #define	IPW2100_CSR_TX_BD_BASE		(0x0200)
225 #define	IPW2100_CSR_TX_BD_SIZE		(0x0204)
226 #define	IPW2100_CSR_RX_BD_BASE		(0x0240)
227 #define	IPW2100_CSR_RX_STATUS_BASE	(0x0244)
228 #define	IPW2100_CSR_RX_BD_SIZE		(0x0248)
229 #define	IPW2100_CSR_TABLE1_BASE		(0x0380)
230 #define	IPW2100_CSR_TABLE2_BASE		(0x0384)
231 /*
232  * tx-rd-index  the entry to be processed by HW, i.e. empty tx buffer
233  * tx-wr-index  the entry just being filled by SW with new data to transmit
234  */
235 #define	IPW2100_CSR_TX_READ_INDEX	(0x0280)
236 #define	IPW2100_CSR_TX_WRITE_INDEX	(0x0f80)
237 /*
238  * rx-rd-index  the entry just being processed by HW, i.e. new received data
239  * rx-wr-index  the entry just being set by SW to empty buffer to receive
240  */
241 #define	IPW2100_CSR_RX_READ_INDEX	(0x02a0)
242 #define	IPW2100_CSR_RX_WRITE_INDEX	(0x0fa0)
243 
244 /*
245  * CSR flags: IPW2100_CSR_INTR
246  * The interrupt register is used to indicate the h/w status
247  */
248 #define	IPW2100_INTR_TX_TRANSFER	(0x00000001)
249 #define	IPW2100_INTR_RX_TRANSFER	(0x00000002)
250 #define	IPW2100_INTR_STATUS_CHANGE	(0x00000010)
251 #define	IPW2100_INTR_COMMAND_DONE	(0x00010000)
252 #define	IPW2100_INTR_FW_INIT_DONE	(0x01000000)
253 #define	IPW2100_INTR_FATAL_ERROR	(0x40000000)
254 #define	IPW2100_INTR_PARITY_ERROR	(0x80000000)
255 #define	IPW2100_INTR_MASK_ALL	(IPW2100_INTR_TX_TRANSFER | \
256 				IPW2100_INTR_RX_TRANSFER | \
257 				IPW2100_INTR_STATUS_CHANGE | \
258 				IPW2100_INTR_COMMAND_DONE | \
259 				IPW2100_INTR_FW_INIT_DONE | \
260 				IPW2100_INTR_FATAL_ERROR | \
261 				IPW2100_INTR_PARITY_ERROR)
262 #define	IPW2100_INTR_MASK_ERR	(IPW2100_INTR_FATAL_ERROR | \
263 				IPW2100_INTR_PARITY_ERROR)
264 
265 /*
266  * CSR flags: IPW2100_CSR_RST
267  * The reset register is used to reset hardware
268  */
269 #define	IPW2100_RST_PRINCETON_RESET	(0x00000001)
270 #define	IPW2100_RST_SW_RESET		(0x00000080)
271 #define	IPW2100_RST_MASTER_DISABLED	(0x00000100)
272 #define	IPW2100_RST_STOP_MASTER		(0x00000200)
273 
274 /*
275  * CSR flags: IPW2100_CSR_CTL
276  */
277 #define	IPW2100_CTL_CLOCK_READY		(0x00000001)
278 #define	IPW2100_CTL_ALLOW_STANDBY	(0x00000002)
279 #define	IPW2100_CTL_INIT		(0x00000004)
280 
281 /*
282  * CSR flags: IPW2100_CSR_IO
283  */
284 #define	IPW2100_IO_GPIO1_ENABLE		(0x00000008)
285 #define	IPW2100_IO_GPIO1_MASK		(0x0000000c)
286 #define	IPW2100_IO_GPIO3_MASK		(0x000000c0)
287 #define	IPW2100_IO_LED_OFF		(0x00002000)
288 #define	IPW2100_IO_RADIO_DISABLED	(0x00010000)
289 
290 /*
291  * States code
292  */
293 #define	IPW2100_STATE_ASSOCIATED	(0x0004)
294 #define	IPW2100_STATE_ASSOCIATION_LOST	(0x0008)
295 #define	IPW2100_STATE_SCAN_COMPLETE	(0x0020)
296 #define	IPW2100_STATE_RADIO_DISABLED	(0x0100)
297 #define	IPW2100_STATE_DISABLED		(0x0200)
298 #define	IPW2100_STATE_SCANNING		(0x0800)
299 
300 /*
301  * table1 offsets
302  */
303 #define	IPW2100_INFO_LOCK		(480)
304 #define	IPW2100_INFO_APS_CNT		(604)
305 #define	IPW2100_INFO_APS_BASE		(608)
306 #define	IPW2100_INFO_CARD_DISABLED	(628)
307 #define	IPW2100_INFO_CURRENT_CHANNEL	(756)
308 #define	IPW2100_INFO_CURRENT_TX_RATE	(768)
309 
310 /*
311  * table2 offsets
312  */
313 #define	IPW2100_INFO_CURRENT_SSID	(48)
314 #define	IPW2100_INFO_CURRENT_BSSID	(112)
315 
316 /*
317  * supported rates
318  */
319 #define	IPW2100_RATE_DS1		(1)
320 #define	IPW2100_RATE_DS2		(2)
321 #define	IPW2100_RATE_DS5		(4)
322 #define	IPW2100_RATE_DS11		(8)
323 
324 /* hw structures, packed */
325 #pragma pack(1)
326 /*
327  * firmware binary image header
328  */
329 struct ipw2100_firmware_hdr {
330 	uint32_t	version;
331 	uint32_t	fw_size;
332 	uint32_t	uc_size;
333 };
334 
335 /*
336  * buffer descriptor
337  */
338 struct ipw2100_bd {
339 	uint32_t	phyaddr;
340 	uint32_t	len;
341 	uint8_t		flags;
342 /* flags */
343 #define	IPW2100_BD_FLAG_TX_LAST_FRAGMENT	(0x08)
344 #define	IPW2100_BD_FLAG_TX_NOT_LAST_FRAGMENT	(0x01)
345 /* data content */
346 #define	IPW2100_BD_FLAG_TX_FRAME_802_3		(0x00)
347 #define	IPW2100_BD_FLAG_TX_FRAME_COMMAND	(0x02)
348 #define	IPW2100_BD_FLAG_TX_FRAME_802_11		(0x04)
349 	/* number of fragments, only 1st BD is needed */
350 	uint8_t		nfrag;
351 	uint8_t		reserved[6];
352 };
353 
354 /*
355  * status descriptor
356  */
357 struct ipw2100_status {
358 	uint32_t	len;
359 	uint16_t	code;
360 #define	IPW2100_STATUS_CODE_COMMAND		(0)
361 #define	IPW2100_STATUS_CODE_NEWSTATE		(1)
362 #define	IPW2100_STATUS_CODE_DATA_802_11		(2)
363 #define	IPW2100_STATUS_CODE_DATA_802_3		(3)
364 #define	IPW2100_STATUS_CODE_NOTIFICATION	(4)
365 	uint8_t		flags;
366 #define	IPW2100_STATUS_FLAG_DECRYPTED		(0x01)
367 #define	IPW2100_STATUS_FLAG_WEP_ENCRYPTED	(0x02)
368 #define	IPW2100_STATUS_FLAG_CRC_ERROR		(0x04)
369 	/* received signal strength indicator */
370 	uint8_t		rssi;
371 };
372 
373 /*
374  * data header
375  */
376 struct ipw2100_hdr {
377 	uint32_t	type;
378 	uint32_t	subtype;
379 	uint8_t		encrypted;
380 	uint8_t		encrypt;
381 	uint8_t		keyidx;
382 	uint8_t		keysz;
383 	uint8_t		key[IEEE80211_KEYBUF_SIZE];
384 	uint8_t		reserved[10];
385 	uint8_t		saddr[IEEE80211_ADDR_LEN];
386 	uint8_t		daddr[IEEE80211_ADDR_LEN];
387 	uint16_t	fragsz;
388 };
389 
390 /*
391  * command
392  */
393 struct ipw2100_cmd {
394 	uint32_t	type;
395 #define	IPW2100_CMD_ENABLE			(2)
396 #define	IPW2100_CMD_SET_CONFIGURATION		(6)
397 #define	IPW2100_CMD_SET_ESSID			(8)
398 #define	IPW2100_CMD_SET_MANDATORY_BSSID		(9)
399 #define	IPW2100_CMD_SET_AUTH_TYPE		(10)
400 #define	IPW2100_CMD_SET_MAC_ADDRESS		(11)
401 #define	IPW2100_CMD_SET_MODE			(12)
402 #define	IPW2100_CMD_SET_I18N_MODE		(13)
403 #define	IPW2100_CMD_SET_CHANNEL			(14)
404 #define	IPW2100_CMD_SET_RTS_THRESHOLD		(15)
405 #define	IPW2100_CMD_SET_FRAG_THRESHOLD		(16)
406 #define	IPW2100_CMD_SET_POWER_MODE		(17)
407 #define	IPW2100_CMD_SET_TX_RATES		(18)
408 #define	IPW2100_CMD_SET_BASIC_TX_RATES		(19)
409 #define	IPW2100_CMD_SET_WEP_KEY			(20)
410 #define	IPW2100_CMD_SET_WEP_KEY_INDEX		(25)
411 #define	IPW2100_CMD_SET_WEP_FLAGS		(26)
412 #define	IPW2100_CMD_ADD_MULTICAST		(27)
413 #define	IPW2100_CMD_CLR_MULTICAST		(28)
414 #define	IPW2100_CMD_SET_BEACON_INTERVAL		(29)
415 #define	IPW2100_CMD_CLR_STATISTICS		(31)
416 #define	IPW2100_CMD_SEND			(33)
417 #define	IPW2100_CMD_SET_TX_POWER_INDEX		(36)
418 #define	IPW2100_CMD_BROADCAST_SCAN		(43)
419 #define	IPW2100_CMD_DISABLE			(44)
420 #define	IPW2100_CMD_SET_DESIRED_BSSID		(45)
421 #define	IPW2100_CMD_SET_SCAN_OPTIONS		(46)
422 #define	IPW2100_CMD_PREPARE_POWER_DOWN		(58)
423 #define	IPW2100_CMD_DISABLE_PHY			(61)
424 #define	IPW2100_CMD_SET_SECURITY_INFORMATION	(67)
425 #define	IPW2100_CMD_SET_WPA_IE			(69)
426 	uint32_t	subtype;
427 	uint32_t	seq;
428 	uint32_t	len;
429 	uint8_t		data[400];
430 	uint32_t	status;
431 	uint8_t		reserved[68];
432 };
433 
434 /*
435  * IPW2100_CMD_SET_POWER_MODE
436  */
437 #define	IPW2100_POWER_MODE_CAM	(0)
438 #define	IPW2100_POWER_AUTOMATIC	(6)
439 
440 /*
441  * IPW2100_CMD_SET_MODE
442  */
443 #define	IPW2100_MODE_BSS	(0)
444 #define	IPW2100_MODE_IBSS	(1)
445 #define	IPW2100_MODE_MONITOR	(2)
446 
447 /*
448  * structure for IPW2100_CMD_SET_WEP_KEY
449  */
450 struct ipw2100_wep_key {
451 	uint8_t		idx;
452 	uint8_t		len;
453 	uint8_t		key[13];
454 };
455 
456 /*
457  * structure for IPW2100_CMD_SET_SECURITY_INFORMATION
458  */
459 struct ipw2100_security {
460 	uint32_t	ciphers;
461 #define	IPW2100_CIPHER_NONE	(0x00000001)
462 #define	IPW2100_CIPHER_WEP40	(0x00000002)
463 #define	IPW2100_CIPHER_WEP104	(0x00000020)
464 	uint16_t	version;
465 	uint8_t		authmode;
466 #define	IPW2100_AUTH_OPEN	(0)
467 #define	IPW2100_AUTH_SHARED	(1)
468 	uint8_t		replay_counters_number;
469 	uint8_t		unicast_using_group;
470 };
471 
472 /*
473  * structure for IPW2100_CMD_SET_SCAN_OPTIONS
474  */
475 struct ipw2100_scan_options {
476 	uint32_t	flags;
477 #define	IPW2100_SCAN_DO_NOT_ASSOCIATE	(0x00000001)
478 #define	IPW2100_SCAN_PASSIVE		(0x00000008)
479 	uint32_t	channels;
480 };
481 
482 /*
483  * structure for IPW2100_CMD_SET_CONFIGURATION
484  */
485 struct ipw2100_configuration {
486 	uint32_t	flags;
487 #define	IPW2100_CFG_PROMISCUOUS		(0x00000004)
488 #define	IPW2100_CFG_PREAMBLE_AUTO	(0x00000010)
489 #define	IPW2100_CFG_IBSS_AUTO_START	(0x00000020)
490 #define	IPW2100_CFG_802_1x_ENABLE	(0x00004000)
491 #define	IPW2100_CFG_BSS_MASK		(0x00008000)
492 #define	IPW2100_CFG_IBSS_MASK		(0x00010000)
493 	uint32_t	bss_chan;
494 	uint32_t	ibss_chan;
495 };
496 
497 /*
498  * element in AP table
499  */
500 struct ipw2100_node {
501 	uint32_t	reserved_1[2];
502 	uint8_t		bssid[IEEE80211_ADDR_LEN];
503 	uint8_t		chan;
504 	uint8_t		rates;
505 	uint16_t	reserved_2;
506 	uint16_t	capinfo;
507 	uint16_t	reserved_3;
508 	uint16_t	intval;
509 	uint8_t		reserved_4[28];
510 	uint8_t		essid[IEEE80211_NWID_LEN];
511 	uint16_t	reserved_5;
512 	uint8_t		esslen;
513 	uint8_t		reserved_6[7];
514 	uint8_t		rssi;
515 };
516 #pragma pack()
517 
518 /*
519  * transmit buffer block
520  */
521 struct ipw2100_txb {
522 	struct ipw2100_hdr	txb_hdr; /* header */
523 	uint8_t			txb_dat[IEEE80211_MAX_LEN]; /* payload */
524 };
525 
526 /*
527  * maximum frame header lenght: 4 MAC addresses + 1 fc + 1 id + 1 seqctl
528  */
529 #define	IEEE80211_MAX_FHLEN	(4*6+2+2+2)
530 
531 /*
532  * receive buffer block
533  */
534 struct ipw2100_rxb {
535 	uint8_t		rxb_dat[IEEE80211_MAX_FHLEN   /* frame */
536 				+ IEEE80211_MAX_LEN   /* payload */
537 				+ IEEE80211_CRC_LEN]; /* FCS */
538 };
539 
540 /*
541  * ROM entries
542  */
543 #define	IPW2100_ROM_RADIO		(0x11)
544 #define	IPW2100_ROM_MAC			(0x21)
545 #define	IPW2100_ROM_CHANNEL_LIST	(0x37)
546 
547 /*
548  * EEPROM controls
549  */
550 #define	IPW2100_IMEM_EEPROM_CTL		(0x00300040)
551 #define	IPW2100_EEPROM_DELAY		(1)
552 
553 /*
554  * CSR access routines
555  */
556 extern uint8_t ipw2100_csr_get8(struct ipw2100_softc *sc, uint32_t off);
557 extern uint16_t ipw2100_csr_get16(struct ipw2100_softc *sc, uint32_t off);
558 extern uint32_t ipw2100_csr_get32(struct ipw2100_softc *sc, uint32_t off);
559 extern void ipw2100_csr_rep_get16(struct ipw2100_softc *sc, uint32_t off,
560     uint16_t *buf, size_t cnt);
561 extern void ipw2100_csr_put8(struct ipw2100_softc *sc, uint32_t off,
562     uint8_t val);
563 extern void ipw2100_csr_put16(struct ipw2100_softc *sc,
564     uint32_t off, uint16_t val);
565 extern void ipw2100_csr_put32(struct ipw2100_softc *sc,
566     uint32_t off, uint32_t val);
567 extern void ipw2100_csr_rep_put8(struct ipw2100_softc *sc,
568     uint32_t off, uint8_t *buf, size_t cnt);
569 extern uint8_t ipw2100_imem_get8(struct ipw2100_softc *sc, int32_t addr);
570 extern uint16_t ipw2100_imem_get16(struct ipw2100_softc *sc,
571     uint32_t addr);
572 extern uint32_t ipw2100_imem_get32(struct ipw2100_softc *sc,
573     uint32_t addr);
574 extern void ipw2100_imem_rep_get16(struct ipw2100_softc *sc,
575     uint32_t addr, uint16_t *buf, size_t cnt);
576 extern void ipw2100_imem_put8(struct ipw2100_softc *sc,
577     uint32_t addr, uint8_t val);
578 extern void ipw2100_imem_put16(struct ipw2100_softc *sc,
579     uint32_t addr, uint16_t val);
580 extern void ipw2100_imem_put32(struct ipw2100_softc *sc,
581     uint32_t addr, uint32_t val);
582 extern void ipw2100_imem_rep_put8(struct ipw2100_softc *sc,
583     uint32_t addr, uint8_t *buf, size_t cnt);
584 extern void ipw2100_imem_getbuf(struct ipw2100_softc *sc,
585     uint32_t addr, uint8_t *buf, size_t cnt);
586 extern void ipw2100_imem_putbuf(struct ipw2100_softc *sc,
587     uint32_t addr, uint8_t *buf, size_t cnt);
588 extern void ipw2100_rom_control(struct ipw2100_softc *sc, uint32_t val);
589 extern uint8_t ipw2100_table1_get8(struct ipw2100_softc *sc, uint32_t off);
590 extern uint32_t ipw2100_table1_get32(struct ipw2100_softc *sc,
591     uint32_t off);
592 extern void ipw2100_table1_put32(struct ipw2100_softc *sc,
593     uint32_t off, uint32_t val);
594 extern int ipw2100_table2_getbuf(struct ipw2100_softc *sc,
595     uint32_t off, uint8_t *buf, uint32_t *len);
596 
597 extern uint16_t ipw2100_rom_get16(struct ipw2100_softc *sc, uint8_t addr);
598 
599 /*
600  * Firmware related definations and interfaces.
601  */
602 extern int ipw2100_cache_firmware(struct ipw2100_softc *sc);
603 extern int ipw2100_free_firmware(struct ipw2100_softc *sc);
604 extern int ipw2100_load_uc(struct ipw2100_softc *sc);
605 extern int ipw2100_load_fw(struct ipw2100_softc *sc);
606 
607 #ifdef __cplusplus
608 }
609 #endif
610 
611 #endif /* _SYS_IPW2100_IMPL_H */
612