xref: /onnv-gate/usr/src/uts/common/sys/usb/clients/usbecm/usbecm.h (revision 11900:3d14975ff34e)
1*11900SRaymond.Chen@Sun.COM /*
2*11900SRaymond.Chen@Sun.COM  * CDDL HEADER START
3*11900SRaymond.Chen@Sun.COM  *
4*11900SRaymond.Chen@Sun.COM  * The contents of this file are subject to the terms of the
5*11900SRaymond.Chen@Sun.COM  * Common Development and Distribution License (the "License").
6*11900SRaymond.Chen@Sun.COM  * You may not use this file except in compliance with the License.
7*11900SRaymond.Chen@Sun.COM  *
8*11900SRaymond.Chen@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*11900SRaymond.Chen@Sun.COM  * or http://www.opensolaris.org/os/licensing.
10*11900SRaymond.Chen@Sun.COM  * See the License for the specific language governing permissions
11*11900SRaymond.Chen@Sun.COM  * and limitations under the License.
12*11900SRaymond.Chen@Sun.COM  *
13*11900SRaymond.Chen@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
14*11900SRaymond.Chen@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*11900SRaymond.Chen@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
16*11900SRaymond.Chen@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
17*11900SRaymond.Chen@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
18*11900SRaymond.Chen@Sun.COM  *
19*11900SRaymond.Chen@Sun.COM  * CDDL HEADER END
20*11900SRaymond.Chen@Sun.COM  */
21*11900SRaymond.Chen@Sun.COM /*
22*11900SRaymond.Chen@Sun.COM  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
23*11900SRaymond.Chen@Sun.COM  * Use is subject to license terms.
24*11900SRaymond.Chen@Sun.COM  */
25*11900SRaymond.Chen@Sun.COM 
26*11900SRaymond.Chen@Sun.COM #ifndef _SYS_USB_USBETH_H
27*11900SRaymond.Chen@Sun.COM #define	_SYS_USB_USBETH_H
28*11900SRaymond.Chen@Sun.COM 
29*11900SRaymond.Chen@Sun.COM 
30*11900SRaymond.Chen@Sun.COM #include <sys/types.h>
31*11900SRaymond.Chen@Sun.COM #include <sys/dditypes.h>
32*11900SRaymond.Chen@Sun.COM #include <sys/mac.h>
33*11900SRaymond.Chen@Sun.COM #include <sys/note.h>
34*11900SRaymond.Chen@Sun.COM 
35*11900SRaymond.Chen@Sun.COM #ifdef	__cplusplus
36*11900SRaymond.Chen@Sun.COM extern "C" {
37*11900SRaymond.Chen@Sun.COM #endif
38*11900SRaymond.Chen@Sun.COM 
39*11900SRaymond.Chen@Sun.COM typedef struct usbecm_state usbecm_state_t;
40*11900SRaymond.Chen@Sun.COM 
41*11900SRaymond.Chen@Sun.COM 
42*11900SRaymond.Chen@Sun.COM /*
43*11900SRaymond.Chen@Sun.COM  * PM support
44*11900SRaymond.Chen@Sun.COM  */
45*11900SRaymond.Chen@Sun.COM typedef struct usbecm_power {
46*11900SRaymond.Chen@Sun.COM 	uint8_t		pm_wakeup_enabled;	/* remote wakeup enabled */
47*11900SRaymond.Chen@Sun.COM 	uint8_t		pm_pwr_states;	/* bit mask of power states */
48*11900SRaymond.Chen@Sun.COM 	boolean_t	pm_raise_power;	/* driver is about to raise power */
49*11900SRaymond.Chen@Sun.COM 	uint8_t		pm_cur_power;	/* current power level */
50*11900SRaymond.Chen@Sun.COM 	uint_t		pm_busy_cnt;	/* number of set_busy requests */
51*11900SRaymond.Chen@Sun.COM } usbecm_pm_t;
52*11900SRaymond.Chen@Sun.COM 
53*11900SRaymond.Chen@Sun.COM struct usbecm_statistics {
54*11900SRaymond.Chen@Sun.COM 	uint32_t	es_upspeed;	/* Upstream bit rate, bps */
55*11900SRaymond.Chen@Sun.COM 	uint32_t	es_downspeed;	/* Downstream bit rate, bps */
56*11900SRaymond.Chen@Sun.COM 	int		es_linkstate;	/* link state */
57*11900SRaymond.Chen@Sun.COM 	uint64_t	es_ipackets;
58*11900SRaymond.Chen@Sun.COM 	uint64_t	es_opackets;
59*11900SRaymond.Chen@Sun.COM 	uint64_t	es_ibytes;
60*11900SRaymond.Chen@Sun.COM 	uint64_t	es_obytes;
61*11900SRaymond.Chen@Sun.COM 	uint64_t	es_ierrors;	/* received frames with errors */
62*11900SRaymond.Chen@Sun.COM 	uint64_t	es_oerrors;	/* transmitted frames with errors */
63*11900SRaymond.Chen@Sun.COM 	uint64_t	es_multircv;	/* received multicast frames */
64*11900SRaymond.Chen@Sun.COM 	uint64_t	es_multixmt;	/* transmitted multicast frames */
65*11900SRaymond.Chen@Sun.COM 	uint64_t	es_brdcstrcv;
66*11900SRaymond.Chen@Sun.COM 	uint64_t	es_brdcstxmt;
67*11900SRaymond.Chen@Sun.COM 	uint64_t	es_macxmt_err;
68*11900SRaymond.Chen@Sun.COM };
69*11900SRaymond.Chen@Sun.COM 
70*11900SRaymond.Chen@Sun.COM struct usbecm_ds_ops {
71*11900SRaymond.Chen@Sun.COM 	/* Device specific initialization and deinitialization */
72*11900SRaymond.Chen@Sun.COM 	int (*ecm_ds_init)(usbecm_state_t *);
73*11900SRaymond.Chen@Sun.COM 	int (*ecm_ds_fini)(usbecm_state_t *);
74*11900SRaymond.Chen@Sun.COM 
75*11900SRaymond.Chen@Sun.COM 	int (*ecm_ds_start)(usbecm_state_t *);
76*11900SRaymond.Chen@Sun.COM 	int (*ecm_ds_stop)(usbecm_state_t *);
77*11900SRaymond.Chen@Sun.COM 	int (*ecm_ds_unicst)(usbecm_state_t *);
78*11900SRaymond.Chen@Sun.COM 	int (*ecm_ds_promisc)(usbecm_state_t *);
79*11900SRaymond.Chen@Sun.COM 	int (*ecm_ds_multicst)(usbecm_state_t *);
80*11900SRaymond.Chen@Sun.COM 	mblk_t *(*ecm_ds_tx)(usbecm_state_t *, mblk_t *);
81*11900SRaymond.Chen@Sun.COM 
82*11900SRaymond.Chen@Sun.COM 	int (*ecm_ds_intr_cb)(usbecm_state_t *, mblk_t *);
83*11900SRaymond.Chen@Sun.COM 	int (*ecm_ds_bulkin_cb)(usbecm_state_t *, mblk_t *);
84*11900SRaymond.Chen@Sun.COM 	int (*ecm_ds_bulkout_cb)(usbecm_state_t *, mblk_t *);
85*11900SRaymond.Chen@Sun.COM };
86*11900SRaymond.Chen@Sun.COM 
87*11900SRaymond.Chen@Sun.COM /*
88*11900SRaymond.Chen@Sun.COM  * per bulk in/out structure
89*11900SRaymond.Chen@Sun.COM  */
90*11900SRaymond.Chen@Sun.COM struct usbecm_state {
91*11900SRaymond.Chen@Sun.COM 	kmutex_t		ecm_mutex;		/* structure lock */
92*11900SRaymond.Chen@Sun.COM 	dev_info_t		*ecm_dip;		/* device info */
93*11900SRaymond.Chen@Sun.COM 	usb_client_dev_data_t	*ecm_dev_data;		/* registration data */
94*11900SRaymond.Chen@Sun.COM 	usb_pipe_handle_t	ecm_def_ph;		/* default pipe hdl */
95*11900SRaymond.Chen@Sun.COM 	usb_log_handle_t	ecm_lh;			/* USBA log handle */
96*11900SRaymond.Chen@Sun.COM 	int			ecm_dev_state;		/* USB device state */
97*11900SRaymond.Chen@Sun.COM 	size_t			ecm_xfer_sz;		/* bulk xfer size */
98*11900SRaymond.Chen@Sun.COM 	size_t			ecm_bulkin_sz;
99*11900SRaymond.Chen@Sun.COM 	usbecm_pm_t		*ecm_pm;		/* PM support */
100*11900SRaymond.Chen@Sun.COM 	mac_handle_t		ecm_mh;			/* mac handle */
101*11900SRaymond.Chen@Sun.COM 	usb_serialization_t	ecm_ser_acc;	/* serialization object */
102*11900SRaymond.Chen@Sun.COM 
103*11900SRaymond.Chen@Sun.COM 	uint_t			ecm_cfg_index;	/* config contains ECM ifc */
104*11900SRaymond.Chen@Sun.COM 	uint16_t		ecm_ctrl_if_no;
105*11900SRaymond.Chen@Sun.COM 	uint16_t		ecm_data_if_no;
106*11900SRaymond.Chen@Sun.COM 	uint16_t		ecm_data_if_alt; /* non-compatible device */
107*11900SRaymond.Chen@Sun.COM 
108*11900SRaymond.Chen@Sun.COM 	usb_ep_data_t		*ecm_intr_ep;
109*11900SRaymond.Chen@Sun.COM 	usb_ep_data_t		*ecm_bulk_in_ep;
110*11900SRaymond.Chen@Sun.COM 	usb_ep_data_t		*ecm_bulk_out_ep;
111*11900SRaymond.Chen@Sun.COM 
112*11900SRaymond.Chen@Sun.COM 	boolean_t		ecm_compatibility;	/* if conform to spec */
113*11900SRaymond.Chen@Sun.COM 	usb_cdc_ecm_descr_t	ecm_desc;	/* if conform to spec */
114*11900SRaymond.Chen@Sun.COM 
115*11900SRaymond.Chen@Sun.COM 	uint8_t			ecm_srcaddr[6];	/* source MAC addr */
116*11900SRaymond.Chen@Sun.COM 	uint16_t		ecm_pkt_flt;	/* pkt flt bitmap ECM1.2 T.8 */
117*11900SRaymond.Chen@Sun.COM 
118*11900SRaymond.Chen@Sun.COM 	usb_pipe_handle_t	ecm_bulkout_ph;
119*11900SRaymond.Chen@Sun.COM 	int			ecm_bulkout_state;
120*11900SRaymond.Chen@Sun.COM 	usb_pipe_handle_t	ecm_bulkin_ph;
121*11900SRaymond.Chen@Sun.COM 	int			ecm_bulkin_state;
122*11900SRaymond.Chen@Sun.COM 	usb_pipe_handle_t	ecm_intr_ph;
123*11900SRaymond.Chen@Sun.COM 	int			ecm_intr_state;
124*11900SRaymond.Chen@Sun.COM 	struct usbecm_statistics	ecm_stat;
125*11900SRaymond.Chen@Sun.COM 	uint32_t		ecm_init_flags;
126*11900SRaymond.Chen@Sun.COM 	int			ecm_mac_state;
127*11900SRaymond.Chen@Sun.COM 	mblk_t			*ecm_rcv_queue; /* receive queue */
128*11900SRaymond.Chen@Sun.COM 	int			ecm_tx_cnt;
129*11900SRaymond.Chen@Sun.COM 
130*11900SRaymond.Chen@Sun.COM 	void			*ecm_priv; /* device private data */
131*11900SRaymond.Chen@Sun.COM 	struct usbecm_ds_ops    *ecm_ds_ops;
132*11900SRaymond.Chen@Sun.COM };
133*11900SRaymond.Chen@Sun.COM 
134*11900SRaymond.Chen@Sun.COM 
135*11900SRaymond.Chen@Sun.COM _NOTE(MUTEX_PROTECTS_DATA(usbecm_state::ecm_mutex, usbecm_state))
136*11900SRaymond.Chen@Sun.COM _NOTE(MUTEX_PROTECTS_DATA(usbecm_state::ecm_mutex, usbecm_statistics))
137*11900SRaymond.Chen@Sun.COM 
138*11900SRaymond.Chen@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(usbecm_state::{
139*11900SRaymond.Chen@Sun.COM 	ecm_dip
140*11900SRaymond.Chen@Sun.COM 	ecm_dev_data
141*11900SRaymond.Chen@Sun.COM 	ecm_def_ph
142*11900SRaymond.Chen@Sun.COM 	ecm_lh
143*11900SRaymond.Chen@Sun.COM 	ecm_dev_state
144*11900SRaymond.Chen@Sun.COM 	ecm_xfer_sz
145*11900SRaymond.Chen@Sun.COM 	ecm_compatibility
146*11900SRaymond.Chen@Sun.COM 	ecm_pm
147*11900SRaymond.Chen@Sun.COM 	ecm_mh
148*11900SRaymond.Chen@Sun.COM 	ecm_bulkin_ph
149*11900SRaymond.Chen@Sun.COM 	ecm_bulkout_ph
150*11900SRaymond.Chen@Sun.COM 	ecm_intr_ph
151*11900SRaymond.Chen@Sun.COM 	ecm_ser_acc
152*11900SRaymond.Chen@Sun.COM 	ecm_ctrl_if_no
153*11900SRaymond.Chen@Sun.COM 	ecm_data_if_no
154*11900SRaymond.Chen@Sun.COM 	ecm_data_if_alt
155*11900SRaymond.Chen@Sun.COM 	ecm_desc
156*11900SRaymond.Chen@Sun.COM 	ecm_bulk_in_ep
157*11900SRaymond.Chen@Sun.COM 	ecm_intr_ep
158*11900SRaymond.Chen@Sun.COM 	ecm_bulk_out_ep
159*11900SRaymond.Chen@Sun.COM 	ecm_bulkin_sz
160*11900SRaymond.Chen@Sun.COM 	ecm_priv
161*11900SRaymond.Chen@Sun.COM 	ecm_ds_ops
162*11900SRaymond.Chen@Sun.COM }))
163*11900SRaymond.Chen@Sun.COM 
164*11900SRaymond.Chen@Sun.COM _NOTE(SCHEME_PROTECTS_DATA("unshared data", mblk_t iocblk))
165*11900SRaymond.Chen@Sun.COM _NOTE(SCHEME_PROTECTS_DATA("unshared data", usb_bulk_req_t usb_intr_req_t))
166*11900SRaymond.Chen@Sun.COM 
167*11900SRaymond.Chen@Sun.COM /* pipe state */
168*11900SRaymond.Chen@Sun.COM enum {
169*11900SRaymond.Chen@Sun.COM 	USBECM_PIPE_CLOSED,			/* pipe is closed */
170*11900SRaymond.Chen@Sun.COM 	USBECM_PIPE_IDLE,			/* open but no requests */
171*11900SRaymond.Chen@Sun.COM 	USBECM_PIPE_BUSY,			/* servicing request */
172*11900SRaymond.Chen@Sun.COM 	USBECM_PIPE_CLOSING			/* pipe is closing */
173*11900SRaymond.Chen@Sun.COM };
174*11900SRaymond.Chen@Sun.COM 
175*11900SRaymond.Chen@Sun.COM enum {
176*11900SRaymond.Chen@Sun.COM 	USBECM_MAC_STOPPED = 0,
177*11900SRaymond.Chen@Sun.COM 	USBECM_MAC_STARTED,
178*11900SRaymond.Chen@Sun.COM };
179*11900SRaymond.Chen@Sun.COM 
180*11900SRaymond.Chen@Sun.COM /* various tunables */
181*11900SRaymond.Chen@Sun.COM enum {
182*11900SRaymond.Chen@Sun.COM 	USBECM_BULKOUT_TIMEOUT		= 15,	/* bulkout timeout */
183*11900SRaymond.Chen@Sun.COM 	USBECM_BULKIN_TIMEOUT		= 0	/* bulkin timeout */
184*11900SRaymond.Chen@Sun.COM };
185*11900SRaymond.Chen@Sun.COM 
186*11900SRaymond.Chen@Sun.COM /* hardware definitions */
187*11900SRaymond.Chen@Sun.COM enum {
188*11900SRaymond.Chen@Sun.COM 	USBSACM_REQ_OUT	= USB_DEV_REQ_TYPE_CLASS| USB_DEV_REQ_HOST_TO_DEV,
189*11900SRaymond.Chen@Sun.COM 	USBSACM_REQ_IN	= USB_DEV_REQ_TYPE_CLASS | USB_DEV_REQ_DEV_TO_HOST,
190*11900SRaymond.Chen@Sun.COM 	USBSACM_REQ_WRITE_IF		= USBSACM_REQ_OUT | USB_DEV_REQ_RCPT_IF,
191*11900SRaymond.Chen@Sun.COM 	USBSACM_REQ_READ_IF		= USBSACM_REQ_IN | USB_DEV_REQ_RCPT_IF
192*11900SRaymond.Chen@Sun.COM };
193*11900SRaymond.Chen@Sun.COM 
194*11900SRaymond.Chen@Sun.COM #define	USBECM_INIT_EVENTS	(0x01 << 0)
195*11900SRaymond.Chen@Sun.COM #define	USBECM_INIT_SER		(0x01 << 1)
196*11900SRaymond.Chen@Sun.COM #define	USBECM_INIT_MAC		(0x01 << 2)
197*11900SRaymond.Chen@Sun.COM 
198*11900SRaymond.Chen@Sun.COM /* Bit offset for ECM statistics capabilities, CDC ECM Rev 1.2, Table 4 */
199*11900SRaymond.Chen@Sun.COM #define	ECM_XMIT_OK			0
200*11900SRaymond.Chen@Sun.COM #define	ECM_RCV_OK			1
201*11900SRaymond.Chen@Sun.COM #define	ECM_XMIT_ERROR			2
202*11900SRaymond.Chen@Sun.COM #define	ECM_RCV_ERROR			3
203*11900SRaymond.Chen@Sun.COM #define	ECM_RCV_NO_BUFFER		4
204*11900SRaymond.Chen@Sun.COM #define	ECM_DIRECTED_BYTES_XMIT		5
205*11900SRaymond.Chen@Sun.COM #define	ECM_DIRECTED_FRAMES_XMIT	6
206*11900SRaymond.Chen@Sun.COM #define	ECM_MULTICAST_BYTES_XMIT	7
207*11900SRaymond.Chen@Sun.COM #define	ECM_MULTICAST_FRAMES_XMIT	8
208*11900SRaymond.Chen@Sun.COM #define	ECM_BROADCAST_BYTES_XMIT	9
209*11900SRaymond.Chen@Sun.COM #define	ECM_BROADCAST_FRAMES_XMIT	10
210*11900SRaymond.Chen@Sun.COM #define	ECM_DIRECTED_BYTES_RCV		11
211*11900SRaymond.Chen@Sun.COM #define	ECM_DIRECTED_FRAMES_RCV		12
212*11900SRaymond.Chen@Sun.COM #define	ECM_MULTICAST_BYTES_RCV		13
213*11900SRaymond.Chen@Sun.COM #define	ECM_MULTICAST_FRAMES_RCV	14
214*11900SRaymond.Chen@Sun.COM #define	ECM_BROADCAST_BYTES_RCV		15
215*11900SRaymond.Chen@Sun.COM #define	ECM_BROADCAST_FRAMES_RCV	16
216*11900SRaymond.Chen@Sun.COM #define	ECM_RCV_CRC_ERROR		17
217*11900SRaymond.Chen@Sun.COM #define	ECM_TRANSMIT_QUEUE_LENGTH	18
218*11900SRaymond.Chen@Sun.COM #define	ECM_RCV_ERROR_ALIGNMENT		19
219*11900SRaymond.Chen@Sun.COM #define	ECM_XMIT_ONE_COLLISION		20
220*11900SRaymond.Chen@Sun.COM #define	ECM_XMIT_MORE_COLLISIONS	21
221*11900SRaymond.Chen@Sun.COM #define	ECM_XMIT_DEFERRED		22
222*11900SRaymond.Chen@Sun.COM #define	ECM_XMIT_MAX_COLLISIONS		23
223*11900SRaymond.Chen@Sun.COM #define	ECM_RCV_OVERRUN			24
224*11900SRaymond.Chen@Sun.COM #define	ECM_XMIT_UNDERRUN		25
225*11900SRaymond.Chen@Sun.COM #define	ECM_XMIT_HEARTBEAT_FAILURE	26
226*11900SRaymond.Chen@Sun.COM #define	ECM_XMIT_TIMES_CRS_LOST		27
227*11900SRaymond.Chen@Sun.COM #define	ECM_XMIT_LATE_COLLISIONS	28
228*11900SRaymond.Chen@Sun.COM 
229*11900SRaymond.Chen@Sun.COM #define	ECM_STAT_CAP_MASK(x)	(1UL << (x))		/* Table 4 */
230*11900SRaymond.Chen@Sun.COM #define	ECM_STAT_SELECTOR(x)	((x) + 1)	/* Table 9 */
231*11900SRaymond.Chen@Sun.COM 
232*11900SRaymond.Chen@Sun.COM /* ECM class-specific request codes, Table 6 */
233*11900SRaymond.Chen@Sun.COM #define	CDC_ECM_SET_ETH_MCAST_FLT	0x40
234*11900SRaymond.Chen@Sun.COM #define	CDC_ECM_SET_ETH_PM_FLT		0x41
235*11900SRaymond.Chen@Sun.COM #define	CDC_ECM_GET_ETH_PM_FLT		0x42
236*11900SRaymond.Chen@Sun.COM #define	CDC_ECM_SET_ETH_PKT_FLT		0x43
237*11900SRaymond.Chen@Sun.COM #define	CDC_ECM_GET_ETH_STAT		0x44
238*11900SRaymond.Chen@Sun.COM 
239*11900SRaymond.Chen@Sun.COM /* ECM Ethernet Pakcet Filter Bitmap, Table 8 */
240*11900SRaymond.Chen@Sun.COM #define	CDC_ECM_PKT_TYPE_PROMISC	(1<<0)
241*11900SRaymond.Chen@Sun.COM #define	CDC_ECM_PKT_TYPE_ALL_MCAST	(1<<1) /* all multicast */
242*11900SRaymond.Chen@Sun.COM #define	CDC_ECM_PKT_TYPE_DIRECTED	(1<<2)
243*11900SRaymond.Chen@Sun.COM #define	CDC_ECM_PKT_TYPE_BCAST		(1<<3) /* broadcast */
244*11900SRaymond.Chen@Sun.COM #define	CDC_ECM_PKT_TYPE_MCAST		(1<<4) /* multicast */
245*11900SRaymond.Chen@Sun.COM 
246*11900SRaymond.Chen@Sun.COM #define	PRINT_MASK_ATTA		0x00000001
247*11900SRaymond.Chen@Sun.COM #define	PRINT_MASK_CLOSE	0x00000002
248*11900SRaymond.Chen@Sun.COM #define	PRINT_MASK_OPEN		0x00000004
249*11900SRaymond.Chen@Sun.COM #define	PRINT_MASK_EVENTS	0x00000008
250*11900SRaymond.Chen@Sun.COM #define	PRINT_MASK_PM		0x00000010
251*11900SRaymond.Chen@Sun.COM #define	PRINT_MASK_CB		0x00000020
252*11900SRaymond.Chen@Sun.COM #define	PRINT_MASK_OPS		0x00000040
253*11900SRaymond.Chen@Sun.COM #define	PRINT_MASK_ALL		0xFFFFFFFF
254*11900SRaymond.Chen@Sun.COM 
255*11900SRaymond.Chen@Sun.COM /* Turn a little endian byte array to a uint32_t */
256*11900SRaymond.Chen@Sun.COM #define	LE_TO_UINT32(src, des)	{ \
257*11900SRaymond.Chen@Sun.COM 	uint32_t tmp; \
258*11900SRaymond.Chen@Sun.COM 	des = src[3]; \
259*11900SRaymond.Chen@Sun.COM 	des = des << 24; \
260*11900SRaymond.Chen@Sun.COM 	tmp = src[2]; \
261*11900SRaymond.Chen@Sun.COM 	des |= tmp << 16; \
262*11900SRaymond.Chen@Sun.COM 	tmp = src[1]; \
263*11900SRaymond.Chen@Sun.COM 	des |= tmp << 8; \
264*11900SRaymond.Chen@Sun.COM 	des |= src[0]; \
265*11900SRaymond.Chen@Sun.COM }
266*11900SRaymond.Chen@Sun.COM 
267*11900SRaymond.Chen@Sun.COM #define	isdigit(c)	((c) >= '0' && c <= '9')
268*11900SRaymond.Chen@Sun.COM #define	toupper(C)	(((C) >= 'a' && (C) <= 'z')? ((C) - 'a' + 'A'): (C))
269*11900SRaymond.Chen@Sun.COM 
270*11900SRaymond.Chen@Sun.COM /* #define	NELEM(a)	(sizeof (a) / sizeof (*(a))) */
271*11900SRaymond.Chen@Sun.COM 
272*11900SRaymond.Chen@Sun.COM 
273*11900SRaymond.Chen@Sun.COM #ifdef	__cplusplus
274*11900SRaymond.Chen@Sun.COM }
275*11900SRaymond.Chen@Sun.COM #endif
276*11900SRaymond.Chen@Sun.COM 
277*11900SRaymond.Chen@Sun.COM #endif	/* _SYS_USB_USBETH_H */
278