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