xref: /illumos-gate/usr/src/uts/common/io/usbgem/usbgem.h (revision 2d6eb4a5)
16716431bSRobert Mustacchi /*
26716431bSRobert Mustacchi  * usbgem.h: General USB to Ethernet MAC driver framework
36716431bSRobert Mustacchi  * @(#)usbgem.h	1.4 12/02/09
46716431bSRobert Mustacchi  * (C) Copyright 2003-2009 Masayuki Murayama KHF04453@nifty.ne.jp
56716431bSRobert Mustacchi  */
66716431bSRobert Mustacchi 
76716431bSRobert Mustacchi #ifndef __USBGEM_H__
86716431bSRobert Mustacchi #define	__USBGEM_H__
96716431bSRobert Mustacchi 
106716431bSRobert Mustacchi #include <sys/mac.h>
116716431bSRobert Mustacchi #ifndef MAC_VERSION
126716431bSRobert Mustacchi #include <sys/mac_provider.h>
136716431bSRobert Mustacchi #endif
146716431bSRobert Mustacchi #include <sys/mac_ether.h>
156716431bSRobert Mustacchi 
166716431bSRobert Mustacchi /*
176716431bSRobert Mustacchi  * Useful macros and typedefs
186716431bSRobert Mustacchi  */
196716431bSRobert Mustacchi #define	USBGEM_NAME_LEN	32
206716431bSRobert Mustacchi 
216716431bSRobert Mustacchi #define	USBGEM_TX_TIMEOUT		(drv_usectohz(3*1000000))
226716431bSRobert Mustacchi #define	USBGEM_TX_TIMEOUT_INTERVAL	(drv_usectohz(1*1000000))
236716431bSRobert Mustacchi #define	USBGEM_LINK_WATCH_INTERVAL	(drv_usectohz(1*1000000))
246716431bSRobert Mustacchi 
256716431bSRobert Mustacchi /* general return code */
266716431bSRobert Mustacchi #define	USBGEM_SUCCESS	0
276716431bSRobert Mustacchi #define	USBGEM_FAILURE	1
286716431bSRobert Mustacchi 
296716431bSRobert Mustacchi /* return code of usbgem_tx_done */
306716431bSRobert Mustacchi #define	INTR_RESTART_TX	0x80000000U
316716431bSRobert Mustacchi 
326716431bSRobert Mustacchi struct usbgem_stats {
336716431bSRobert Mustacchi 	uint32_t	intr;
346716431bSRobert Mustacchi 
356716431bSRobert Mustacchi 	uint32_t	crc;
366716431bSRobert Mustacchi 	uint32_t	errrcv;
376716431bSRobert Mustacchi 	uint32_t	overflow;
386716431bSRobert Mustacchi 	uint32_t	frame;
396716431bSRobert Mustacchi 	uint32_t	missed;
406716431bSRobert Mustacchi 	uint32_t	runt;
416716431bSRobert Mustacchi 	uint32_t	frame_too_long;
426716431bSRobert Mustacchi 	uint32_t	norcvbuf;
436716431bSRobert Mustacchi 	uint32_t	sqe;
446716431bSRobert Mustacchi 
456716431bSRobert Mustacchi 	uint32_t	collisions;
466716431bSRobert Mustacchi 	uint32_t	first_coll;
476716431bSRobert Mustacchi 	uint32_t	multi_coll;
486716431bSRobert Mustacchi 	uint32_t	excoll;
496716431bSRobert Mustacchi 	uint32_t	xmit_internal_err;
506716431bSRobert Mustacchi 	uint32_t	nocarrier;
516716431bSRobert Mustacchi 	uint32_t	defer;
526716431bSRobert Mustacchi 	uint32_t	errxmt;
536716431bSRobert Mustacchi 	uint32_t	underflow;
546716431bSRobert Mustacchi 	uint32_t	xmtlatecoll;
556716431bSRobert Mustacchi 	uint32_t	noxmtbuf;
566716431bSRobert Mustacchi 	uint32_t	jabber;
576716431bSRobert Mustacchi 
586716431bSRobert Mustacchi 
596716431bSRobert Mustacchi 	uint64_t	rbytes;
606716431bSRobert Mustacchi 	uint64_t	obytes;
616716431bSRobert Mustacchi 	uint64_t	rpackets;
626716431bSRobert Mustacchi 	uint64_t	opackets;
636716431bSRobert Mustacchi 	uint32_t	rbcast;
646716431bSRobert Mustacchi 	uint32_t	obcast;
656716431bSRobert Mustacchi 	uint32_t	rmcast;
666716431bSRobert Mustacchi 	uint32_t	omcast;
676716431bSRobert Mustacchi 	uint32_t	rcv_internal_err;
686716431bSRobert Mustacchi };
696716431bSRobert Mustacchi 
706716431bSRobert Mustacchi struct mcast_addr {
716716431bSRobert Mustacchi 	struct ether_addr	addr;
726716431bSRobert Mustacchi 	uint32_t		hash;
736716431bSRobert Mustacchi };
746716431bSRobert Mustacchi 
756716431bSRobert Mustacchi #define	USBGEM_MAXMC	64
766716431bSRobert Mustacchi #define	USBGEM_MCALLOC	(sizeof (struct mcast_addr) * USBGEM_MAXMC)
776716431bSRobert Mustacchi 
786716431bSRobert Mustacchi #define	SLOT(dp, n)	((n) % (dp)->ugc.usbgc_tx_list_max)
796716431bSRobert Mustacchi 
806716431bSRobert Mustacchi /*
816716431bSRobert Mustacchi  * mac soft state
826716431bSRobert Mustacchi  */
836716431bSRobert Mustacchi struct usbgem_dev {
846716431bSRobert Mustacchi 	dev_info_t	*dip;
856716431bSRobert Mustacchi 	mac_handle_t	mh;
866716431bSRobert Mustacchi 	char		name[USBGEM_NAME_LEN];
876716431bSRobert Mustacchi 
886716431bSRobert Mustacchi 	/* pointer to usb private data */
896716431bSRobert Mustacchi 	usb_client_dev_data_t	*reg_data;
906716431bSRobert Mustacchi 
916716431bSRobert Mustacchi 	/* usb handles */
926716431bSRobert Mustacchi 	usb_pipe_handle_t	default_pipe;
936716431bSRobert Mustacchi 	usb_pipe_handle_t	bulkin_pipe;
946716431bSRobert Mustacchi 	usb_pipe_handle_t	bulkout_pipe;
956716431bSRobert Mustacchi 	usb_pipe_handle_t	intr_pipe;
966716431bSRobert Mustacchi 
976716431bSRobert Mustacchi 	/* usb endpoints */
986716431bSRobert Mustacchi 	usb_ep_descr_t		*ep_default;
996716431bSRobert Mustacchi 	usb_ep_descr_t		*ep_bulkin;
1006716431bSRobert Mustacchi 	usb_ep_descr_t		*ep_bulkout;
1016716431bSRobert Mustacchi 	usb_ep_descr_t		*ep_intr;
1026716431bSRobert Mustacchi 
1036716431bSRobert Mustacchi 	/* usb policies */
1046716431bSRobert Mustacchi 	usb_pipe_policy_t	policy_default;
1056716431bSRobert Mustacchi 	usb_pipe_policy_t	policy_bulkin;
1066716431bSRobert Mustacchi 	usb_pipe_policy_t	policy_bulkout;
1076716431bSRobert Mustacchi 	usb_pipe_policy_t	policy_interrupt;
1086716431bSRobert Mustacchi 
1096716431bSRobert Mustacchi 	/* MAC address information */
1106716431bSRobert Mustacchi 	struct ether_addr	cur_addr;
1116716431bSRobert Mustacchi 	struct ether_addr	dev_addr;
1126716431bSRobert Mustacchi 
1136716431bSRobert Mustacchi 	/* RX state and resource management */
1146716431bSRobert Mustacchi 	kmutex_t		rxlock;
1156716431bSRobert Mustacchi 	int			rx_busy_cnt;
1166716431bSRobert Mustacchi 	boolean_t		rx_active;
1176716431bSRobert Mustacchi 	kcondvar_t		rx_drain_cv;
1186716431bSRobert Mustacchi 
1196716431bSRobert Mustacchi 	/* RX buffer management */
1206716431bSRobert Mustacchi 	int			rx_buf_len;
1216716431bSRobert Mustacchi 
1226716431bSRobert Mustacchi 	/* TX state and resource management */
1236716431bSRobert Mustacchi 	kmutex_t		txlock;
1246716431bSRobert Mustacchi 	int			tx_busy_cnt;
1256716431bSRobert Mustacchi 	usb_bulk_req_t		*tx_free_list;
1266716431bSRobert Mustacchi 	kcondvar_t		tx_drain_cv;
1276716431bSRobert Mustacchi 	clock_t			tx_start_time;
1286716431bSRobert Mustacchi 	int			bulkout_timeout;	/* in second */
1296716431bSRobert Mustacchi 	int			tx_max_packets;
1306716431bSRobert Mustacchi 	int			tx_seq_num;
1316716431bSRobert Mustacchi 	int			tx_intr_pended;
1326716431bSRobert Mustacchi 
1336716431bSRobert Mustacchi 	/* NIC state from OS view */
1346716431bSRobert Mustacchi 	int			nic_state;
1356716431bSRobert Mustacchi #define	NIC_STATE_UNKNOWN	0
1366716431bSRobert Mustacchi #define	NIC_STATE_STOPPED	1
1376716431bSRobert Mustacchi #define	NIC_STATE_INITIALIZED	2
1386716431bSRobert Mustacchi #define	NIC_STATE_ONLINE	3
1396716431bSRobert Mustacchi 
1406716431bSRobert Mustacchi 	/* MAC state from hardware view */
1416716431bSRobert Mustacchi 	int			mac_state;
1426716431bSRobert Mustacchi #define	MAC_STATE_DISCONNECTED	0	/* it includes suspended state too */
1436716431bSRobert Mustacchi #define	MAC_STATE_STOPPED	1	/* powered up / buf not initialized */
1446716431bSRobert Mustacchi #define	MAC_STATE_INITIALIZED	2	/* initialized */
1456716431bSRobert Mustacchi #define	MAC_STATE_ONLINE	3	/* working correctly  */
1466716431bSRobert Mustacchi #define	MAC_STATE_ERROR		4	/* need to restart nic */
1476716431bSRobert Mustacchi 
1486716431bSRobert Mustacchi 	clock_t			fatal_error;
1496716431bSRobert Mustacchi 
1506716431bSRobert Mustacchi 	/* robustness: timer and watchdog */
1516716431bSRobert Mustacchi 	uint_t			tx_watcher_stop;
1526716431bSRobert Mustacchi 	kt_did_t		tx_watcher_did;
1536716431bSRobert Mustacchi 	kcondvar_t		tx_watcher_cv;
1546716431bSRobert Mustacchi 	kmutex_t		tx_watcher_lock;
1556716431bSRobert Mustacchi 	clock_t			tx_watcher_timeout;
1566716431bSRobert Mustacchi 	clock_t			tx_watcher_interval;
1576716431bSRobert Mustacchi 
1586716431bSRobert Mustacchi 	/* MII mamagement */
1596716431bSRobert Mustacchi 	boolean_t		anadv_autoneg:1;
1606716431bSRobert Mustacchi 	boolean_t		anadv_1000fdx:1;
1616716431bSRobert Mustacchi 	boolean_t		anadv_1000hdx:1;
1626716431bSRobert Mustacchi 	boolean_t		anadv_100t4:1;
1636716431bSRobert Mustacchi 	boolean_t		anadv_100fdx:1;
1646716431bSRobert Mustacchi 	boolean_t		anadv_100hdx:1;
1656716431bSRobert Mustacchi 	boolean_t		anadv_10fdx:1;
1666716431bSRobert Mustacchi 	boolean_t		anadv_10hdx:1;
1676716431bSRobert Mustacchi 	boolean_t		anadv_1000t_ms:2;
1686716431bSRobert Mustacchi 	boolean_t		anadv_pause:1;
1696716431bSRobert Mustacchi 	boolean_t		anadv_asmpause:1;
1706716431bSRobert Mustacchi 	boolean_t		mii_advert_ro:1;
1716716431bSRobert Mustacchi 
1726716431bSRobert Mustacchi 	boolean_t		full_duplex:1;
1736716431bSRobert Mustacchi 	int			speed:3;
1746716431bSRobert Mustacchi #define		USBGEM_SPD_10	0
1756716431bSRobert Mustacchi #define		USBGEM_SPD_100	1
1766716431bSRobert Mustacchi #define		USBGEM_SPD_1000	2
1776716431bSRobert Mustacchi #define		USBGEM_SPD_NUM	3
1786716431bSRobert Mustacchi 	unsigned int		flow_control:2;
1796716431bSRobert Mustacchi #define		FLOW_CONTROL_NONE	0
1806716431bSRobert Mustacchi #define		FLOW_CONTROL_SYMMETRIC	1
1816716431bSRobert Mustacchi #define		FLOW_CONTROL_TX_PAUSE	2
1826716431bSRobert Mustacchi #define		FLOW_CONTROL_RX_PAUSE	3
1836716431bSRobert Mustacchi 
1846716431bSRobert Mustacchi 	boolean_t		mii_supress_msg:1;
1856716431bSRobert Mustacchi 
1866716431bSRobert Mustacchi 	uint32_t		mii_phy_id;
1876716431bSRobert Mustacchi 	uint16_t		mii_status;
1886716431bSRobert Mustacchi 	uint16_t		mii_advert;
1896716431bSRobert Mustacchi 	uint16_t		mii_lpable;
1906716431bSRobert Mustacchi 	uint16_t		mii_exp;
1916716431bSRobert Mustacchi 	uint16_t		mii_ctl1000;
1926716431bSRobert Mustacchi 	uint16_t		mii_stat1000;
1936716431bSRobert Mustacchi 	uint16_t		mii_xstatus;
1946716431bSRobert Mustacchi 	int8_t			mii_phy_addr;	/* must be signed */
1956716431bSRobert Mustacchi 
1966716431bSRobert Mustacchi 	uint16_t		mii_status_ro;
1976716431bSRobert Mustacchi 	uint16_t		mii_xstatus_ro;
1986716431bSRobert Mustacchi 
1996716431bSRobert Mustacchi 	int			mii_state;
2006716431bSRobert Mustacchi #define		MII_STATE_UNKNOWN		0
2016716431bSRobert Mustacchi #define		MII_STATE_RESETTING		1
2026716431bSRobert Mustacchi #define		MII_STATE_AUTONEGOTIATING	2
2036716431bSRobert Mustacchi #define		MII_STATE_AN_DONE		3
2046716431bSRobert Mustacchi #define		MII_STATE_MEDIA_SETUP		4
2056716431bSRobert Mustacchi #define		MII_STATE_LINKUP		5
2066716431bSRobert Mustacchi #define		MII_STATE_LINKDOWN		6
2076716431bSRobert Mustacchi 
2086716431bSRobert Mustacchi 	clock_t			mii_last_check;	/* in tick */
2096716431bSRobert Mustacchi 	clock_t			mii_timer;	/* in tick */
2106716431bSRobert Mustacchi #define		MII_RESET_TIMEOUT	drv_usectohz(1000*1000)
2116716431bSRobert Mustacchi #define		MII_AN_TIMEOUT		drv_usectohz(5000*1000)
2126716431bSRobert Mustacchi #define		MII_LINKDOWN_TIMEOUT	drv_usectohz(10000*1000)
2136716431bSRobert Mustacchi 
2146716431bSRobert Mustacchi 	clock_t			mii_interval;	/* in tick */
2156716431bSRobert Mustacchi 	clock_t			linkup_delay;	/* in tick */
2166716431bSRobert Mustacchi 
2176716431bSRobert Mustacchi 	uint_t			link_watcher_stop;
2186716431bSRobert Mustacchi 	kt_did_t		link_watcher_did;
2196716431bSRobert Mustacchi 	kcondvar_t		link_watcher_wait_cv;
2206716431bSRobert Mustacchi 	kmutex_t		link_watcher_lock;
2216716431bSRobert Mustacchi 
2226716431bSRobert Mustacchi 	krwlock_t		dev_state_lock;	/* mac_state and nic_state */
2236716431bSRobert Mustacchi 	ksema_t			hal_op_lock;	/* serialize hw operations */
2246716431bSRobert Mustacchi 	ksema_t			drv_op_lock;	/* hotplug op lock */
2256716431bSRobert Mustacchi 
2266716431bSRobert Mustacchi 	/* multcast list */
2276716431bSRobert Mustacchi 	ksema_t			rxfilter_lock;
2286716431bSRobert Mustacchi 	int			mc_count;
2296716431bSRobert Mustacchi 	int			mc_count_req;
2306716431bSRobert Mustacchi 	struct mcast_addr	*mc_list;
2316716431bSRobert Mustacchi 	int			rxmode;
2326716431bSRobert Mustacchi #define		RXMODE_PROMISC		0x01
2336716431bSRobert Mustacchi #define		RXMODE_ALLMULTI_REQ	0x02
2346716431bSRobert Mustacchi #define		RXMODE_MULTI_OVF	0x04
2356716431bSRobert Mustacchi #define		RXMODE_ENABLE		0x08
2366716431bSRobert Mustacchi #define		RXMODE_ALLMULTI		(RXMODE_ALLMULTI_REQ | RXMODE_MULTI_OVF)
2376716431bSRobert Mustacchi #define		RXMODE_BITS	\
2386716431bSRobert Mustacchi 			"\020"	\
2396716431bSRobert Mustacchi 			"\004ENABLE"	\
2406716431bSRobert Mustacchi 			"\003MULTI_OVF"	\
2416716431bSRobert Mustacchi 			"\002ALLMULTI_REQ"	\
2426716431bSRobert Mustacchi 			"\001PROMISC"
2436716431bSRobert Mustacchi 
2446716431bSRobert Mustacchi 	/* statistcs */
2456716431bSRobert Mustacchi 	struct usbgem_stats		stats;
2466716431bSRobert Mustacchi 
2476716431bSRobert Mustacchi 	/* pointer to local structure */
2486716431bSRobert Mustacchi 	void			*private;
2496716431bSRobert Mustacchi 	int			priv_size;
2506716431bSRobert Mustacchi 
2516716431bSRobert Mustacchi 	/* configuration */
2526716431bSRobert Mustacchi 	struct usbgem_conf {
2536716431bSRobert Mustacchi 		/* name */
2546716431bSRobert Mustacchi 		char		usbgc_name[USBGEM_NAME_LEN];
2556716431bSRobert Mustacchi 		int		usbgc_ppa;
2566716431bSRobert Mustacchi 
2576716431bSRobert Mustacchi 		/* specification on usb */
2586716431bSRobert Mustacchi 		int	usbgc_ifnum;	/* interface number */
2596716431bSRobert Mustacchi 		int	usbgc_alt;	/* alternate */
2606716431bSRobert Mustacchi 
2616716431bSRobert Mustacchi 		/* specification on tx engine */
2626716431bSRobert Mustacchi 		int		usbgc_tx_list_max;
2636716431bSRobert Mustacchi 
2646716431bSRobert Mustacchi 		/* specification on rx engine */
2656716431bSRobert Mustacchi 		int		usbgc_rx_header_len;
2666716431bSRobert Mustacchi 		int		usbgc_rx_list_max;
2676716431bSRobert Mustacchi 
2686716431bSRobert Mustacchi 		/* time out parameters */
2696716431bSRobert Mustacchi 		clock_t		usbgc_tx_timeout;
2706716431bSRobert Mustacchi 		clock_t		usbgc_tx_timeout_interval;
2716716431bSRobert Mustacchi 
2726716431bSRobert Mustacchi 		/* flow control */
2736716431bSRobert Mustacchi 		int		usbgc_flow_control;
2746716431bSRobert Mustacchi 
2756716431bSRobert Mustacchi 		/* MII timeout parameters */
2766716431bSRobert Mustacchi 		clock_t	usbgc_mii_linkdown_timeout;
2776716431bSRobert Mustacchi 		clock_t	usbgc_mii_link_watch_interval;
2786716431bSRobert Mustacchi 		clock_t	usbgc_mii_reset_timeout;
2796716431bSRobert Mustacchi 
2806716431bSRobert Mustacchi 		clock_t	usbgc_mii_an_watch_interval;
2816716431bSRobert Mustacchi 		clock_t	usbgc_mii_an_timeout;
2826716431bSRobert Mustacchi 		clock_t	usbgc_mii_an_wait;
2836716431bSRobert Mustacchi 		clock_t	usbgc_mii_an_delay;
2846716431bSRobert Mustacchi 
2856716431bSRobert Mustacchi 		/* MII configuration */
2866716431bSRobert Mustacchi 		int	usbgc_mii_addr_min;
2876716431bSRobert Mustacchi 		int	usbgc_mii_linkdown_action;
2886716431bSRobert Mustacchi 		int	usbgc_mii_linkdown_timeout_action;
2896716431bSRobert Mustacchi #define		MII_ACTION_NONE		0
2906716431bSRobert Mustacchi #define		MII_ACTION_RESET	1
2916716431bSRobert Mustacchi #define		MII_ACTION_RSA		2
2926716431bSRobert Mustacchi 		boolean_t	usbgc_mii_dont_reset:1;
2936716431bSRobert Mustacchi 		boolean_t	usbgc_mii_an_oneshot:1;
2946716431bSRobert Mustacchi 		boolean_t	usbgc_mii_hw_link_detection:1;
2956716431bSRobert Mustacchi 		boolean_t	usbgc_mii_stop_mac_on_linkdown:1;
2966716431bSRobert Mustacchi 		uint16_t	usbgc_mii_an_cmd;
2976716431bSRobert Mustacchi 
2986716431bSRobert Mustacchi 		/* I/O methods */
2996716431bSRobert Mustacchi 
3006716431bSRobert Mustacchi 		/* mac operation */
3016716431bSRobert Mustacchi 		int	(*usbgc_attach_chip)(struct usbgem_dev *dp);
3026716431bSRobert Mustacchi 		int	(*usbgc_reset_chip)(struct usbgem_dev *dp);
3036716431bSRobert Mustacchi 		int	(*usbgc_init_chip)(struct usbgem_dev *dp);
3046716431bSRobert Mustacchi 		int	(*usbgc_start_chip)(struct usbgem_dev *dp);
3056716431bSRobert Mustacchi 		int	(*usbgc_stop_chip)(struct usbgem_dev *dp);
3066716431bSRobert Mustacchi 		uint32_t (*usbgc_multicast_hash)(struct usbgem_dev *dp,
3076716431bSRobert Mustacchi 		    const uint8_t *);
3086716431bSRobert Mustacchi 		int	(*usbgc_set_rx_filter)(struct usbgem_dev *dp);
3096716431bSRobert Mustacchi 		int	(*usbgc_set_media)(struct usbgem_dev *dp);
3106716431bSRobert Mustacchi 		int	(*usbgc_get_stats)(struct usbgem_dev *dp);
3116716431bSRobert Mustacchi 		void	(*usbgc_interrupt)(struct usbgem_dev *dp, mblk_t *mp);
3126716431bSRobert Mustacchi 
3136716431bSRobert Mustacchi 		/* packet manipulation */
3146716431bSRobert Mustacchi 		mblk_t	*(*usbgc_tx_make_packet)(struct usbgem_dev *dp,
3156716431bSRobert Mustacchi 		    mblk_t *mp);
3166716431bSRobert Mustacchi 		mblk_t	*(*usbgc_rx_make_packet)(struct usbgem_dev *dp,
3176716431bSRobert Mustacchi 		    mblk_t *mp);
3186716431bSRobert Mustacchi 		/* mii operations */
3196716431bSRobert Mustacchi 		int	(*usbgc_mii_probe)(struct usbgem_dev *dp);
3206716431bSRobert Mustacchi 		int	(*usbgc_mii_init)(struct usbgem_dev *dp);
3216716431bSRobert Mustacchi 		int	(*usbgc_mii_config)(struct usbgem_dev *dp, int *errp);
3226716431bSRobert Mustacchi 		uint16_t (*usbgc_mii_read)(struct usbgem_dev *dp, uint_t reg,
3236716431bSRobert Mustacchi 		    int *errp);
3246716431bSRobert Mustacchi 		void	(*usbgc_mii_write)(struct usbgem_dev *dp, uint_t reg,
3256716431bSRobert Mustacchi 		    uint16_t val, int *errp);
3266716431bSRobert Mustacchi 
3276716431bSRobert Mustacchi 		/* jumbo frame */
3286716431bSRobert Mustacchi 		int	usbgc_max_mtu;
3296716431bSRobert Mustacchi 		int	usbgc_default_mtu;
3306716431bSRobert Mustacchi 		int	usbgc_min_mtu;
3316716431bSRobert Mustacchi 	} ugc;
3326716431bSRobert Mustacchi 
3336716431bSRobert Mustacchi 	int	misc_flag;
3346716431bSRobert Mustacchi #define	USBGEM_VLAN	0x0001
3356716431bSRobert Mustacchi 	timeout_id_t	intr_watcher_id;
3366716431bSRobert Mustacchi 
3376716431bSRobert Mustacchi 	/* buffer size */
3386716431bSRobert Mustacchi 	uint_t	mtu;
3396716431bSRobert Mustacchi 
3406716431bSRobert Mustacchi 	/* performance tuning parameters */
3416716431bSRobert Mustacchi 	uint_t	txthr;		/* tx fifo threshoold */
3426716431bSRobert Mustacchi 	uint_t	txmaxdma;	/* tx max dma burst size */
3436716431bSRobert Mustacchi 	uint_t	rxthr;		/* rx fifo threshoold */
3446716431bSRobert Mustacchi 	uint_t	rxmaxdma;	/* tx max dma burst size */
3456716431bSRobert Mustacchi 
3466716431bSRobert Mustacchi 	/* kstat stuff */
3476716431bSRobert Mustacchi 	kstat_t	*ksp;
3486716431bSRobert Mustacchi 
3496716431bSRobert Mustacchi 	/* ndd stuff */
3506716431bSRobert Mustacchi 	caddr_t	nd_data_p;
3516716431bSRobert Mustacchi 	caddr_t	nd_arg_p;
3526716431bSRobert Mustacchi 
3536716431bSRobert Mustacchi #ifdef USBGEM_DEBUG_LEVEL
3546716431bSRobert Mustacchi 	int	tx_cnt;
3556716431bSRobert Mustacchi #endif
3566716431bSRobert Mustacchi };
3576716431bSRobert Mustacchi 
3586716431bSRobert Mustacchi /*
3596716431bSRobert Mustacchi  * Exported functions
3606716431bSRobert Mustacchi  */
3616716431bSRobert Mustacchi int usbgem_ctrl_out(struct usbgem_dev *dp,
3626716431bSRobert Mustacchi     uint8_t reqt, uint8_t req, uint16_t val, uint16_t ix, uint16_t len,
3636716431bSRobert Mustacchi     void *bp, int size);
3646716431bSRobert Mustacchi 
3656716431bSRobert Mustacchi int usbgem_ctrl_in(struct usbgem_dev *dp,
3666716431bSRobert Mustacchi     uint8_t reqt, uint8_t req, uint16_t val, uint16_t ix, uint16_t len,
3676716431bSRobert Mustacchi     void *bp, int size);
3686716431bSRobert Mustacchi 
3696716431bSRobert Mustacchi int usbgem_ctrl_out_val(struct usbgem_dev *dp,
3706716431bSRobert Mustacchi     uint8_t reqt, uint8_t req, uint16_t val, uint16_t ix, uint16_t len,
3716716431bSRobert Mustacchi     uint32_t v);
3726716431bSRobert Mustacchi 
3736716431bSRobert Mustacchi int usbgem_ctrl_in_val(struct usbgem_dev *dp,
3746716431bSRobert Mustacchi     uint8_t reqt, uint8_t req, uint16_t val, uint16_t ix, uint16_t len,
3756716431bSRobert Mustacchi     void *valp);
3766716431bSRobert Mustacchi 
3776716431bSRobert Mustacchi void usbgem_generate_macaddr(struct usbgem_dev *, uint8_t *);
3786716431bSRobert Mustacchi boolean_t usbgem_get_mac_addr_conf(struct usbgem_dev *);
3796716431bSRobert Mustacchi int usbgem_mii_probe_default(struct usbgem_dev *);
3806716431bSRobert Mustacchi int usbgem_mii_init_default(struct usbgem_dev *);
3816716431bSRobert Mustacchi int usbgem_mii_config_default(struct usbgem_dev *, int *errp);
3826716431bSRobert Mustacchi void usbgem_mii_update_link(struct usbgem_dev *);
3836716431bSRobert Mustacchi void usbgem_restart_tx(struct usbgem_dev *);
3846716431bSRobert Mustacchi boolean_t usbgem_tx_done(struct usbgem_dev *, int);
3856716431bSRobert Mustacchi void usbgem_receive(struct usbgem_dev *);
3866716431bSRobert Mustacchi struct usbgem_dev *usbgem_do_attach(dev_info_t *,
3876716431bSRobert Mustacchi     struct usbgem_conf *, void *, int);
3886716431bSRobert Mustacchi int usbgem_do_detach(dev_info_t *);
3896716431bSRobert Mustacchi 
3906716431bSRobert Mustacchi uint32_t usbgem_ether_crc_le(const uint8_t *addr);
3916716431bSRobert Mustacchi uint32_t usbgem_ether_crc_be(const uint8_t *addr);
3926716431bSRobert Mustacchi 
3936716431bSRobert Mustacchi int usbgem_resume(dev_info_t *);
3946716431bSRobert Mustacchi int usbgem_suspend(dev_info_t *);
3956716431bSRobert Mustacchi int usbgem_quiesce(dev_info_t *);
3966716431bSRobert Mustacchi 
3976716431bSRobert Mustacchi #define	USBGEM_STREAM_OPS(dev_ops, attach, detach) \
3986716431bSRobert Mustacchi     DDI_DEFINE_STREAM_OPS(dev_ops, nulldev, nulldev, attach, detach, \
3996716431bSRobert Mustacchi     nodev, NULL, D_MP, NULL, usbgem_quiesce)
400*ceb6b962SRobert Mustacchi 
4016716431bSRobert Mustacchi int usbgem_mod_init(struct dev_ops *, char *);
4026716431bSRobert Mustacchi void usbgem_mod_fini(struct dev_ops *);
4036716431bSRobert Mustacchi 
4046716431bSRobert Mustacchi #define	USBGEM_GET_DEV(dip) \
4056716431bSRobert Mustacchi 	((struct usbgem_dev *)(ddi_get_driver_private(dip)))
4066716431bSRobert Mustacchi 
4076716431bSRobert Mustacchi #endif /* __USBGEM_H__ */
408