xref: /illumos-gate/usr/src/uts/common/io/zyd/zyd.h (revision e8da18d8)
1*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /*
2*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
3*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * Use is subject to license terms.
4*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  */
5*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
6*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /*
7*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * Copyright (c) 2008 by  Ben Taylor <bentaylor.solx86@gmail.com>
8*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * Copyright (c) 2007 by  Lukas Turek <turek@ksvi.mff.cuni.cz>
9*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * Copyright (c) 2007 by  Jiri Svoboda <jirik.svoboda@seznam.cz>
10*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * Copyright (c) 2007 by  Martin Krulis <martin.krulis@matfyz.cz>
11*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * Copyright (c) 2006 by Damien Bergamini <damien.bergamini@free.fr>
12*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * Copyright (c) 2006 by Florian Stoehr <ich@florian-stoehr.de>
13*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  *
14*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * Permission to use, copy, modify, and distribute this software for any
15*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * purpose with or without fee is hereby granted, provided that the above
16*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * copyright notice and this permission notice appear in all copies.
17*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  *
18*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
19*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
20*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
21*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
22*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
23*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
24*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
25*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  *
26*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  */
27*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
28*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #ifndef _ZYD_H
29*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	_ZYD_H
30*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
31*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #ifdef __cplusplus
32*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China extern "C" {
33*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #endif
34*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
35*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #include <sys/sysmacros.h>
36*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #include <sys/net80211.h>
37*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
38*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	USBDRV_MAJOR_VER 2
39*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	USBDRV_MINOR_VER 0
40*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #include <sys/usb/usba.h>
41*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #include <sys/usb/usba/usba_types.h>
42*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
43*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_DRV_NAME  "zyd"
44*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_DRV_DESC  "Zydas ZD1211(B)"
45*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_DRV_REV   "V1.1"
46*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
47*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* Return the number of fields of an array */
48*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_ARRAY_LENGTH(arr) (sizeof (arr) / sizeof ((arr)[0]))
49*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
50*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /*
51*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * Result type: all functions beginning with zyd_
52*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * should use this to indicate success or failure.
53*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * (except for public funcions, of course)
54*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  *
55*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * Detecting error: always use (value != ZYD_SUCCESS)
56*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * Indicating error: return ZYD_FAILURE
57*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  */
58*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China typedef enum {
59*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	ZYD_SUCCESS,
60*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	ZYD_FAILURE
61*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China } zyd_res;
62*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
63*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /*
64*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * Chip revision ID
65*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  */
66*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China typedef enum {
67*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	ZYD_UNKNOWN,
68*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	ZYD_ZD1211,
69*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	ZYD_ZD1211B
70*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China } zyd_mac_rev_t;
71*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
72*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /*
73*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * USB-safe mutual exclusion object.
74*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  */
75*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China typedef struct {
76*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	boolean_t initialized;	/* B_TRUE if properly initialized */
77*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	boolean_t held;		/* B_TRUE if the object is held */
78*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	kmutex_t lock;		/* serialize access */
79*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	kcondvar_t wait;	/* for waiting on release */
80*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China } zyd_serial_t;
81*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
82*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /*
83*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * Holds an ioread request status.
84*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  */
85*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China struct zyd_ioread {
86*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	volatile boolean_t pending;	/* ioread is in progress */
87*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	volatile boolean_t done;	/* response has been received */
88*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	volatile boolean_t exc;		/* an exception has occured */
89*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
90*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	void *buffer;			/* response buffer */
91*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	int buf_len;			/* buffer size (bytes) */
92*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China };
93*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
94*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /*
95*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * USB state.
96*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  */
97*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China struct zyd_usb {
98*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	/* Copy of sc->dip */
99*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	dev_info_t 		*dip;
100*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
101*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	/* Device configuration information */
102*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	usb_client_dev_data_t	*cdata;
103*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
104*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	boolean_t		connected;
105*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
106*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	/* Communication pipe handles */
107*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	usb_pipe_handle_t	pipe_data_in;
108*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	usb_pipe_handle_t	pipe_data_out;
109*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	usb_pipe_handle_t	pipe_cmd_in;
110*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	usb_pipe_handle_t	pipe_cmd_out;
111*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
112*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	/* Communication endpoint data (copied from descriptor tree) */
113*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	usb_ep_data_t		ep_data_in;
114*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	usb_ep_data_t		ep_data_out;
115*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	usb_ep_data_t		ep_cmd_in;
116*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	usb_ep_data_t		ep_cmd_out;
117*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
118*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	/* Current ioread request (if any) */
119*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	struct zyd_ioread	io_read;
120*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China };
121*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
122*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China struct zyd_softc;	/* forward declaration */
123*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
124*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China struct zyd_rf {
125*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	/* RF methods */
126*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	zyd_res		(*init)(struct zyd_rf *);
127*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	zyd_res		(*switch_radio)(struct zyd_rf *, boolean_t);
128*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	zyd_res		(*set_channel)(struct zyd_rf *, uint8_t);
129*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
130*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	/* RF attributes */
131*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	struct		zyd_softc *rf_sc;	/* back-pointer */
132*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	int		width;
133*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China };
134*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
135*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /*
136*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * per-instance soft-state structure
137*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  */
138*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China struct zyd_softc {
139*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	/* Serialize access to the soft_state/device */
140*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	zyd_serial_t		serial;
141*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	struct zyd_rf		sc_rf;
142*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
143*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	dev_info_t		*dip;
144*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
145*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	/* timeout for scanning */
146*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	timeout_id_t		timeout_id;
147*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
148*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	/* USB-specific data */
149*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	struct zyd_usb		usb;
150*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
151*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	/* Chip revision ZYD1211/ZYD1211B */
152*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	zyd_mac_rev_t		mac_rev;
153*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
154*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	/* MAC address */
155*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint8_t			macaddr[IEEE80211_ADDR_LEN];
156*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
157*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	/* net80211 data */
158*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	struct ieee80211com 	ic;
159*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
160*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	boolean_t		running;
161*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	boolean_t		suspended;
162*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	boolean_t		resched;
163*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint8_t			tx_queued;
164*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
165*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	/* Data from EEPROM */
166*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint16_t		fwbase;
167*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint8_t			regdomain;
168*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint16_t		fw_rev;
169*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint8_t			rf_rev;
170*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint8_t			pa_rev;
171*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint8_t			fix_cr47;
172*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint8_t			fix_cr157;
173*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint8_t			pwr_cal[14];
174*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint8_t			pwr_int[14];
175*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint8_t			ofdm36_cal[14];
176*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint8_t			ofdm48_cal[14];
177*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint8_t			ofdm54_cal[14];
178*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
179*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	/* kstats */
180*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint32_t		tx_nobuf;
181*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint32_t		rx_nobuf;
182*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint32_t		tx_err;
183*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint32_t		rx_err;
184*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
185*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	/* net80211 original state change handler */
186*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	int			(*newstate)(ieee80211com_t *,
187*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 					enum ieee80211_state, int);
188*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China };
189*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
190*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* RF-config request */
191*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China struct zyd_rfwrite {
192*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint16_t	code;
193*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint16_t	width;
194*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint16_t	bit[32];
195*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China };
196*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
197*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* 16-bit I/O register write request */
198*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China struct zyd_iowrite16 {
199*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint16_t	reg;
200*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint16_t	value;
201*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China };
202*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
203*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #pragma pack(1)
204*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
205*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* Generic usb command to the ZD chip */
206*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China struct zyd_cmd {
207*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint16_t 	cmd_code;
208*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint8_t		data[64];
209*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China };
210*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
211*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* ZD prepends this header to an incoming frame. */
212*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China struct zyd_plcphdr {
213*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint8_t		signal;
214*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint8_t		reserved[2];
215*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint16_t	service;	/* unaligned! */
216*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China };
217*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
218*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* ZD appends this footer to an incoming frame. */
219*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China struct zyd_rx_stat {
220*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint8_t rssi;
221*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint8_t	signal_cck;
222*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint8_t	signal_ofdm;
223*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint8_t	cipher;
224*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint8_t	flags;
225*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China };
226*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
227*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* this structure may be unaligned */
228*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China struct zyd_rx_desc {
229*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_MAX_RXFRAMECNT 3
230*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint16_t   len[ZYD_MAX_RXFRAMECNT];
231*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint16_t   tag;
232*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_TAG_MULTIFRAME 0x697e
233*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China };
234*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
235*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /*
236*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * Prepended to the 802.11 frame when sending to data_out.
237*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  */
238*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China struct zyd_tx_header {
239*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint8_t rate_mod_flags;
240*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint16_t frame_size;
241*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint8_t type_flags;
242*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint16_t packet_size;
243*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint16_t frame_duration;
244*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint8_t service;
245*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint16_t next_frame_duration;
246*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China };
247*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
248*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #pragma pack()
249*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
250*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /*
251*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * Map USB id to 1211/1211B chip
252*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  */
253*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China typedef struct zyd_usb_info {
254*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint16_t	vendor_id;
255*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	uint16_t	product_id;
256*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	zyd_mac_rev_t	mac_rev;
257*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China } zyd_usb_info_t;
258*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
259*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /*
260*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * Simple lock for callback-waiting. This lock should be used in situations when
261*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * one needs to wait for a callback function. It sipmply encapsulates one mutex
262*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * and one conditional variable.
263*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  */
264*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China struct zyd_cb_lock {
265*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	boolean_t done;
266*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	kmutex_t mutex;
267*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	kcondvar_t cv;
268*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China };
269*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
270*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* Bits for rate_mod_flags */
271*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_TX_RMF_RATE(rmf)	((rmf) & 0x0f)
272*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_TX_RMF_OFDM		0x10
273*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_TX_RMF_SH_PREAMBLE	0x20	/* CCK */
274*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_TX_RMF_5GHZ		0x40	/* OFDM */
275*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
276*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* Bits for type_flags */
277*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_TX_FLAG_BACKOFF	0x01
278*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_TX_FLAG_MULTICAST	0x02
279*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_TX_FLAG_TYPE(t)	(((t) & 0x3) << 2)
280*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_TX_TYPE_DATA	0
281*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_TX_TYPE_PS_POLL	1
282*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_TX_TYPE_MGMT	2
283*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_TX_TYPE_CTL		3
284*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
285*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_TX_FLAG_WAKEUP	0x10
286*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_TX_FLAG_RTS		0x20
287*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_TX_FLAG_ENCRYPT	0x40
288*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_TX_FLAG_CTS_TO_SELF	0x80
289*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
290*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_TX_SERVICE_LENGTH_EXTENSION		0x80
291*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
292*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_TX_LIST_COUNT	0x8
293*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_RX_LIST_COUNT	0x8
294*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_USB_REQ_COUNT	0x8
295*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
296*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /*
297*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * Time in miliseconds to stay on one channel during scan.
298*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  */
299*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_DWELL_TIME 200000
300*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
301*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_SER_SIG	B_TRUE
302*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_NO_SIG	B_FALSE
303*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
304*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* Location in the endpoint descriptor tree used by the device */
305*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_USB_CONFIG_NUMBER  1
306*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_USB_IFACE_INDEX    0
307*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_USB_ALT_IF_INDEX   0
308*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
309*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_DBG_HW	(1<<0)
310*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_DBG_FW	(1<<1)
311*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_DBG_USB	(1<<2)
312*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_DBG_TX	(1<<3)
313*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_DBG_RX	(1<<4)
314*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_DBG_SCAN	(1<<5)
315*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_DBG_GLD	(1<<6)
316*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_DBG_80211	(1<<7)
317*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_DBG_RESUME	(1<<8)
318*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
319*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_RX_BUF_SIZE (sizeof (struct zyd_rx_desc) + \
320*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	((IEEE80211_MAX_LEN + 3) & ~3) * ZYD_MAX_RXFRAMECNT)
321*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
322*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* quickly determine if a given rate is CCK or OFDM */
323*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_RATE_IS_OFDM(rate)	((rate) >= 12 && (rate) != 22)
324*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
325*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /*
326*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * Calculate the byte offset of a struct member
327*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  */
328*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_IC_TO_SOFTC(ic)\
329*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China (\
330*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	(struct zyd_softc *)(\
331*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 		(uintptr_t)(ic) - offsetof(struct zyd_softc, ic)\
332*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China )\
333*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China )
334*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
335*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /*
336*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * The 'struct zyd_usb usb' is stored inside 'struct zyd_softc'.
337*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * Using the knowledge of the usb member position,
338*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * convert a pointer to 'usb' to a pointer to the zyd_softc.
339*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  */
340*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_USB_TO_SOFTC(usbp)\
341*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China (\
342*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 	(struct zyd_softc *)(\
343*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 		(uintptr_t)(usbp) - offsetof(struct zyd_softc, usb)\
344*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China )\
345*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China )
346*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
347*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* Debugging macros */
348*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #ifdef DEBUG
349*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_DEBUG(x)	zyd_dbg x
350*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #else
351*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_DEBUG(x)
352*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #endif
353*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #define	ZYD_WARN	zyd_warn
354*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
355*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China extern void *zyd_ssp;
356*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
357*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #ifdef DEBUG
358*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China extern uint32_t zyd_dbg_flags;
359*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China void	zyd_dbg(uint32_t dbg_mask, const char *fmt, ...);
360*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #endif
361*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China void	zyd_warn(const char *fmt, ...);
362*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /*
363*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * Functions needed for initializing radios and switching channels
364*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  */
365*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China extern zyd_res	zyd_read32(struct zyd_softc *, uint16_t, uint32_t *);
366*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China extern zyd_res	zyd_write32(struct zyd_softc *, uint16_t, uint32_t);
367*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China extern zyd_res	zyd_read16(struct zyd_softc *, uint16_t, uint16_t *);
368*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China extern zyd_res	zyd_write16a(struct zyd_softc *, const struct zyd_iowrite16 *,
369*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China     int);
370*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China extern zyd_res	zyd_write16(struct zyd_softc *, uint16_t, uint16_t);
371*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /*
372*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * Zydas's own USB-safe synchronization primitive. There are many USB API
373*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * functions which forbids that caller holds a mutex. So we're avoiding that
374*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  * by using out own primitive (it consist of )
375*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China  */
376*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China void	zyd_serial_init(struct zyd_softc *sc);
377*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China zyd_res	zyd_serial_enter(struct zyd_softc *sc, boolean_t wait_sig);
378*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China void	zyd_serial_exit(struct zyd_softc *sc);
379*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China void	zyd_serial_deinit(struct zyd_softc *sc);
380*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
381*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China void	zyd_cb_lock_init(struct zyd_cb_lock *lock);
382*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China void	zyd_cb_lock_destroy(struct zyd_cb_lock *lock);
383*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China zyd_res	zyd_cb_lock_wait(struct zyd_cb_lock *lock, clock_t timeout);
384*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China void	zyd_cb_lock_signal(struct zyd_cb_lock *lock);
385*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
386*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* chipset specific routines */
387*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China void		zyd_hw_set_channel(struct zyd_softc *sc, uint8_t chan);
388*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China zyd_res		zyd_hw_init(struct zyd_softc *sc);
389*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China void		zyd_hw_deinit(struct zyd_softc *sc);
390*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China zyd_res		zyd_hw_start(struct zyd_softc *sc);
391*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China void		zyd_hw_stop(struct zyd_softc *sc);
392*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
393*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China /* USB specific routines */
394*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China zyd_res		zyd_usb_init(struct zyd_softc *sc);
395*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China void		zyd_usb_deinit(struct zyd_softc *sc);
396*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China zyd_res		zyd_usb_open_pipes(struct zyd_usb *uc);
397*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China void		zyd_usb_close_pipes(struct zyd_usb *uc);
398*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China zyd_res		zyd_usb_cmd_in_start_polling(struct zyd_usb *uc);
399*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China void		zyd_usb_cmd_in_stop_polling(struct zyd_usb *uc);
400*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China zyd_res		zyd_usb_data_in_enable(struct zyd_usb *uc);
401*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China void		zyd_usb_data_in_disable(struct zyd_usb *uc);
402*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China zyd_res		zyd_usb_cmd_send(struct zyd_usb *uc, uint16_t code,
403*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 			const void *data, size_t len);
404*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China zyd_res		zyd_usb_ioread_req(struct zyd_usb *uc, const void *in_data,
405*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 			size_t in_len, void *out_data, size_t out_len);
406*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China zyd_res		zyd_usb_send_packet(struct zyd_usb *uc, mblk_t *mp);
407*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China zyd_mac_rev_t	zyd_usb_mac_rev(uint16_t vendor, uint16_t product);
408*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China zyd_res		zyd_usb_loadfirmware(struct zyd_usb *uc, uint8_t *fw,
409*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 			size_t size);
410*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
411*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China void	zyd_receive(struct zyd_softc *sc, const uint8_t *buf, uint16_t len);
412*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China int	zyd_resume(struct zyd_softc *sc);
413*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China int	zyd_suspend(struct zyd_softc *sc);
414*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
415*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China extern uint8_t	zd1211_firmware[];
416*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China extern size_t	zd1211_firmware_size;
417*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China extern uint8_t	zd1211b_firmware[];
418*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China extern size_t	zd1211b_firmware_size;
419*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
420*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #ifdef __cplusplus
421*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China }
422*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #endif
423*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China 
424*e8da18d8Spengcheng chen - Sun Microsystems - Beijing China #endif /* _ZYD_H */
425