xref: /openbsd-src/sys/dev/usb/if_auereg.h (revision cb4c8d6490adef1ec8be69931ba50e6b4edb9f27)
1*cb4c8d64Smpi /*	$OpenBSD: if_auereg.h,v 1.18 2015/06/18 10:02:49 mpi Exp $ */
20897b806Snate /*	$NetBSD: if_auereg.h,v 1.16 2001/10/10 02:14:17 augustss Exp $	*/
35deafb75Saaron /*
45deafb75Saaron  * Copyright (c) 1997, 1998, 1999
55deafb75Saaron  *	Bill Paul <wpaul@ee.columbia.edu>.  All rights reserved.
65deafb75Saaron  *
75deafb75Saaron  * Redistribution and use in source and binary forms, with or without
85deafb75Saaron  * modification, are permitted provided that the following conditions
95deafb75Saaron  * are met:
105deafb75Saaron  * 1. Redistributions of source code must retain the above copyright
115deafb75Saaron  *    notice, this list of conditions and the following disclaimer.
125deafb75Saaron  * 2. Redistributions in binary form must reproduce the above copyright
135deafb75Saaron  *    notice, this list of conditions and the following disclaimer in the
145deafb75Saaron  *    documentation and/or other materials provided with the distribution.
155deafb75Saaron  * 3. All advertising materials mentioning features or use of this software
165deafb75Saaron  *    must display the following acknowledgement:
175deafb75Saaron  *	This product includes software developed by Bill Paul.
185deafb75Saaron  * 4. Neither the name of the author nor the names of any co-contributors
195deafb75Saaron  *    may be used to endorse or promote products derived from this software
205deafb75Saaron  *    without specific prior written permission.
215deafb75Saaron  *
225deafb75Saaron  * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
235deafb75Saaron  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
245deafb75Saaron  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
255deafb75Saaron  * ARE DISCLAIMED.  IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD
265deafb75Saaron  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
275deafb75Saaron  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
285deafb75Saaron  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
295deafb75Saaron  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
305deafb75Saaron  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
315deafb75Saaron  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
325deafb75Saaron  * THE POSSIBILITY OF SUCH DAMAGE.
335deafb75Saaron  *
345deafb75Saaron  * $FreeBSD: src/sys/dev/usb/if_auereg.h,v 1.2 2000/01/08 06:52:36 wpaul Exp $
355deafb75Saaron  */
365deafb75Saaron 
375deafb75Saaron /*
385deafb75Saaron  * Register definitions for ADMtek Pegasus AN986 USB to Ethernet
395deafb75Saaron  * chip. The Pegasus uses a total of four USB endpoints: the control
405deafb75Saaron  * endpoint (0), a bulk read endpoint for receiving packets (1),
415deafb75Saaron  * a bulk write endpoint for sending packets (2) and an interrupt
425deafb75Saaron  * endpoint for passing RX and TX status (3). Endpoint 0 is used
435deafb75Saaron  * to read and write the ethernet module's registers. All registers
445deafb75Saaron  * are 8 bits wide.
455deafb75Saaron  *
465deafb75Saaron  * Packet transfer is done in 64 byte chunks. The last chunk in a
475deafb75Saaron  * transfer is denoted by having a length less that 64 bytes. For
485deafb75Saaron  * the RX case, the data includes an optional RX status word.
495deafb75Saaron  */
505deafb75Saaron 
515deafb75Saaron #define AUE_UR_READREG		0xF0
525deafb75Saaron #define AUE_UR_WRITEREG		0xF1
535deafb75Saaron 
545deafb75Saaron /*
555deafb75Saaron  * Note that while the ADMtek technically has four
565deafb75Saaron  * endpoints, the control endpoint (endpoint 0) is
575deafb75Saaron  * regarded as special by the USB code and drivers
585deafb75Saaron  * don't have direct access to it. (We access it
595deafb75Saaron  * using usbd_do_request() when reading/writing
605deafb75Saaron  * registers.) Consequently, our endpoint indexes
615deafb75Saaron  * don't match those in the ADMtek Pegasus manual:
625deafb75Saaron  * we consider the RX data endpoint to be index 0
635deafb75Saaron  * and work up from there.
645deafb75Saaron  */
655deafb75Saaron #define AUE_ENDPT_RX		0x0
665deafb75Saaron #define AUE_ENDPT_TX		0x1
675deafb75Saaron #define AUE_ENDPT_INTR		0x2
685deafb75Saaron #define AUE_ENDPT_MAX		0x3
695deafb75Saaron 
705deafb75Saaron #define AUE_CTL0		0x00
715deafb75Saaron #define AUE_CTL1		0x01
725deafb75Saaron #define AUE_CTL2		0x02
735deafb75Saaron #define AUE_MAR0		0x08
745deafb75Saaron #define AUE_MAR1		0x09
755deafb75Saaron #define AUE_MAR2		0x0A
765deafb75Saaron #define AUE_MAR3		0x0B
775deafb75Saaron #define AUE_MAR4		0x0C
785deafb75Saaron #define AUE_MAR5		0x0D
795deafb75Saaron #define AUE_MAR6		0x0E
805deafb75Saaron #define AUE_MAR7		0x0F
815deafb75Saaron #define AUE_MAR			AUE_MAR0
825deafb75Saaron #define AUE_PAR0		0x10
835deafb75Saaron #define AUE_PAR1		0x11
845deafb75Saaron #define AUE_PAR2		0x12
855deafb75Saaron #define AUE_PAR3		0x13
865deafb75Saaron #define AUE_PAR4		0x14
875deafb75Saaron #define AUE_PAR5		0x15
885deafb75Saaron #define AUE_PAR			AUE_PAR0
895deafb75Saaron #define AUE_PAUSE0		0x18
905deafb75Saaron #define AUE_PAUSE1		0x19
915deafb75Saaron #define AUE_PAUSE		AUE_PAUSE0
925deafb75Saaron #define AUE_RX_FLOWCTL_CNT	0x1A
935deafb75Saaron #define AUE_RX_FLOWCTL_FIFO	0x1B
940897b806Snate #define AUE_REG_1D		0x1D
955deafb75Saaron #define AUE_EE_REG		0x20
965deafb75Saaron #define AUE_EE_DATA0		0x21
975deafb75Saaron #define AUE_EE_DATA1		0x22
985deafb75Saaron #define AUE_EE_DATA		AUE_EE_DATA0
995deafb75Saaron #define AUE_EE_CTL		0x23
1005deafb75Saaron #define AUE_PHY_ADDR		0x25
1015deafb75Saaron #define AUE_PHY_DATA0		0x26
1025deafb75Saaron #define AUE_PHY_DATA1		0x27
1035deafb75Saaron #define AUE_PHY_DATA		AUE_PHY_DATA0
1045deafb75Saaron #define AUE_PHY_CTL		0x28
1055deafb75Saaron #define AUE_USB_STS		0x2A
1065deafb75Saaron #define AUE_TXSTAT0		0x2B
1075deafb75Saaron #define AUE_TXSTAT1		0x2C
1085deafb75Saaron #define AUE_TXSTAT		AUE_TXSTAT0
1095deafb75Saaron #define AUE_RXSTAT		0x2D
1105deafb75Saaron #define AUE_PKTLOST0		0x2E
1115deafb75Saaron #define AUE_PKTLOST1		0x2F
1125deafb75Saaron #define AUE_PKTLOST		AUE_PKTLOST0
1135deafb75Saaron 
1140897b806Snate #define AUE_REG_7B		0x7B
1155deafb75Saaron #define AUE_GPIO0		0x7E
1165deafb75Saaron #define AUE_GPIO1		0x7F
1170897b806Snate #define AUE_REG_81		0x81
1185deafb75Saaron 
1195deafb75Saaron #define AUE_CTL0_INCLUDE_RXCRC	0x01
1205deafb75Saaron #define AUE_CTL0_ALLMULTI	0x02
1215deafb75Saaron #define AUE_CTL0_STOP_BACKOFF	0x04
1225deafb75Saaron #define AUE_CTL0_RXSTAT_APPEND	0x08
1235deafb75Saaron #define AUE_CTL0_WAKEON_ENB	0x10
1245deafb75Saaron #define AUE_CTL0_RXPAUSE_ENB	0x20
1255deafb75Saaron #define AUE_CTL0_RX_ENB		0x40
1265deafb75Saaron #define AUE_CTL0_TX_ENB		0x80
1275deafb75Saaron 
1285deafb75Saaron #define AUE_CTL1_HOMELAN	0x04
1295deafb75Saaron #define AUE_CTL1_RESETMAC	0x08
1305deafb75Saaron #define AUE_CTL1_SPEEDSEL	0x10	/* 0 = 10mbps, 1 = 100mbps */
1315deafb75Saaron #define AUE_CTL1_DUPLEX		0x20	/* 0 = half, 1 = full */
1325deafb75Saaron #define AUE_CTL1_DELAYHOME	0x40
1335deafb75Saaron 
1345deafb75Saaron #define AUE_CTL2_EP3_CLR	0x01	/* reading EP3 clrs status regs */
1355deafb75Saaron #define AUE_CTL2_RX_BADFRAMES	0x02
1365deafb75Saaron #define AUE_CTL2_RX_PROMISC	0x04
1375deafb75Saaron #define AUE_CTL2_LOOPBACK	0x08
1385deafb75Saaron #define AUE_CTL2_EEPROMWR_ENB	0x10
1395deafb75Saaron #define AUE_CTL2_EEPROM_LOAD	0x20
1405deafb75Saaron 
1415deafb75Saaron #define AUE_EECTL_WRITE		0x01
1425deafb75Saaron #define AUE_EECTL_READ		0x02
1435deafb75Saaron #define AUE_EECTL_DONE		0x04
1445deafb75Saaron 
1455deafb75Saaron #define AUE_PHYCTL_PHYREG	0x1F
1465deafb75Saaron #define AUE_PHYCTL_WRITE	0x20
1475deafb75Saaron #define AUE_PHYCTL_READ		0x40
1485deafb75Saaron #define AUE_PHYCTL_DONE		0x80
1495deafb75Saaron 
1505deafb75Saaron #define AUE_USBSTS_SUSPEND	0x01
1515deafb75Saaron #define AUE_USBSTS_RESUME	0x02
1525deafb75Saaron 
1535deafb75Saaron #define AUE_TXSTAT0_JABTIMO	0x04
1545deafb75Saaron #define AUE_TXSTAT0_CARLOSS	0x08
1555deafb75Saaron #define AUE_TXSTAT0_NOCARRIER	0x10
1565deafb75Saaron #define AUE_TXSTAT0_LATECOLL	0x20
1575deafb75Saaron #define AUE_TXSTAT0_EXCESSCOLL	0x40
1585deafb75Saaron #define AUE_TXSTAT0_UNDERRUN	0x80
1595deafb75Saaron 
1605deafb75Saaron #define AUE_TXSTAT1_PKTCNT	0x0F
1615deafb75Saaron #define AUE_TXSTAT1_FIFO_EMPTY	0x40
1625deafb75Saaron #define AUE_TXSTAT1_FIFO_FULL	0x80
1635deafb75Saaron 
1645deafb75Saaron #define AUE_RXSTAT_OVERRUN	0x01
1655deafb75Saaron #define AUE_RXSTAT_PAUSE	0x02
1665deafb75Saaron 
1675deafb75Saaron #define AUE_GPIO_IN0		0x01
1685deafb75Saaron #define AUE_GPIO_OUT0		0x02
1695deafb75Saaron #define AUE_GPIO_SEL0		0x04
1705deafb75Saaron #define AUE_GPIO_IN1		0x08
1715deafb75Saaron #define AUE_GPIO_OUT1		0x10
1725deafb75Saaron #define AUE_GPIO_SEL1		0x20
1735deafb75Saaron 
1745deafb75Saaron struct aue_intrpkt {
1755deafb75Saaron 	u_int8_t		aue_txstat0;
1765deafb75Saaron 	u_int8_t		aue_txstat1;
1775deafb75Saaron 	u_int8_t		aue_rxstat;
1785deafb75Saaron 	u_int8_t		aue_rxlostpkt0;
1795deafb75Saaron 	u_int8_t		aue_rxlostpkt1;
1805deafb75Saaron 	u_int8_t		aue_wakeupstat;
1815deafb75Saaron 	u_int8_t		aue_rsvd;
1825deafb75Saaron 	u_int8_t		_pad;
1835deafb75Saaron };
1845deafb75Saaron #define AUE_INTR_PKTLEN 8
1855deafb75Saaron 
1865deafb75Saaron struct aue_rxpkt {
1875deafb75Saaron 	uWord			aue_pktlen;
1885deafb75Saaron 	uByte			aue_rxstat;
1895deafb75Saaron };
1905deafb75Saaron 
1915deafb75Saaron #define AUE_RXSTAT_MCAST	0x01
1925deafb75Saaron #define AUE_RXSTAT_GIANT	0x02
1935deafb75Saaron #define AUE_RXSTAT_RUNT		0x04
1945deafb75Saaron #define AUE_RXSTAT_CRCERR	0x08
1955deafb75Saaron #define AUE_RXSTAT_DRIBBLE	0x10
1965deafb75Saaron #define AUE_RXSTAT_MASK		0x1E
1975deafb75Saaron 
1985deafb75Saaron 
1995deafb75Saaron /*************** The rest belongs in if_auevar.h *************/
2005deafb75Saaron 
2015deafb75Saaron #define AUE_TX_LIST_CNT		1
2025deafb75Saaron #define AUE_RX_LIST_CNT		1
2035deafb75Saaron 
2045deafb75Saaron struct aue_softc;
2055deafb75Saaron 
2065deafb75Saaron struct aue_chain {
2075deafb75Saaron 	struct aue_softc	*aue_sc;
208ab0b1be7Smglocker 	struct usbd_xfer	*aue_xfer;
2095deafb75Saaron 	char			*aue_buf;
2105deafb75Saaron 	struct mbuf		*aue_mbuf;
2115deafb75Saaron 	int			aue_idx;
2125deafb75Saaron };
2135deafb75Saaron 
2145deafb75Saaron struct aue_cdata {
2155deafb75Saaron 	struct aue_chain	aue_tx_chain[AUE_TX_LIST_CNT];
2165deafb75Saaron 	struct aue_chain	aue_rx_chain[AUE_RX_LIST_CNT];
2175deafb75Saaron 	struct aue_intrpkt	aue_ibuf;
2185deafb75Saaron 	int			aue_tx_prod;
2195deafb75Saaron 	int			aue_tx_cons;
2205deafb75Saaron 	int			aue_tx_cnt;
2215deafb75Saaron 	int			aue_rx_prod;
2225deafb75Saaron };
2235deafb75Saaron 
2245deafb75Saaron struct aue_softc {
2258c5d01eeSmk 	struct device		aue_dev;
2265deafb75Saaron 
2275deafb75Saaron 	struct arpcom		arpcom;
2285deafb75Saaron 	struct mii_data		aue_mii;
2295deafb75Saaron #define GET_IFP(sc) (&(sc)->arpcom.ac_if)
2305deafb75Saaron #define GET_MII(sc) (&(sc)->aue_mii)
2315deafb75Saaron 
23234eef271Smbalmer 	struct timeout		aue_stat_ch;
2335deafb75Saaron 
234ab0b1be7Smglocker 	struct usbd_device	*aue_udev;
235ab0b1be7Smglocker 	struct usbd_interface	*aue_iface;
2365deafb75Saaron 	u_int16_t		aue_vendor;
2375deafb75Saaron 	u_int16_t		aue_product;
2385deafb75Saaron 	int			aue_ed[AUE_ENDPT_MAX];
239ab0b1be7Smglocker 	struct usbd_pipe	*aue_ep[AUE_ENDPT_MAX];
2405deafb75Saaron 	u_int8_t		aue_link;
2415deafb75Saaron 	struct aue_cdata	aue_cdata;
2425deafb75Saaron 
2430897b806Snate 	u_int16_t		aue_flags;
24482426cf3Sfgsch 
245e34fcbc1Snate 	int			aue_refcnt;
2465deafb75Saaron 	u_int			aue_rx_errs;
247bcc0e93aSaaron 	u_int			aue_intr_errs;
2485deafb75Saaron 	struct timeval		aue_rx_notice;
249b6aa61b1Saaron 
250b6aa61b1Saaron 	struct usb_task		aue_tick_task;
251b6aa61b1Saaron 	struct usb_task		aue_stop_task;
252b6aa61b1Saaron 
2535be69eafSkrw 	struct rwlock		aue_mii_lock;
2545deafb75Saaron };
2555deafb75Saaron 
2565deafb75Saaron #define AUE_TIMEOUT		1000
2575deafb75Saaron #define AUE_BUFSZ		1536
2585deafb75Saaron #define AUE_MIN_FRAMELEN	60
2595deafb75Saaron #define AUE_TX_TIMEOUT		10000 /* ms */
2605deafb75Saaron #define AUE_INTR_INTERVAL	100 /* ms */
261