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