1*a20dd8f5Skevlo /* $OpenBSD: if_muereg.h,v 1.2 2018/08/15 07:13:51 kevlo Exp $ */ 277395c04Skevlo 377395c04Skevlo /* 477395c04Skevlo * Copyright (c) 2018 Kevin Lo <kevlo@openbsd.org> 577395c04Skevlo * 677395c04Skevlo * Permission to use, copy, modify, and distribute this software for any 777395c04Skevlo * purpose with or without fee is hereby granted, provided that the above 877395c04Skevlo * copyright notice and this permission notice appear in all copies. 977395c04Skevlo * 1077395c04Skevlo * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 1177395c04Skevlo * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1277395c04Skevlo * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 1377395c04Skevlo * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1477395c04Skevlo * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1577395c04Skevlo * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 1677395c04Skevlo * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1777395c04Skevlo */ 1877395c04Skevlo 1977395c04Skevlo /* 2077395c04Skevlo * USB vendor requests. 2177395c04Skevlo */ 2277395c04Skevlo #define MUE_UR_WRITEREG 0xa0 2377395c04Skevlo #define MUE_UR_READREG 0xa1 2477395c04Skevlo 2577395c04Skevlo /* 2677395c04Skevlo * Offset of MAC address inside EEPROM. 2777395c04Skevlo */ 28*a20dd8f5Skevlo #define MUE_EE_IND_OFFSET 0x00 2977395c04Skevlo #define MUE_EE_MAC_OFFSET 0x01 3077395c04Skevlo #define MUE_EE_LTM_OFFSET 0x3f 3177395c04Skevlo 3277395c04Skevlo #define MUE_INT_STATUS 0x00c 3377395c04Skevlo #define MUE_HW_CFG 0x010 3477395c04Skevlo #define MUE_PMT_CTL 0x014 3577395c04Skevlo #define MUE_DP_SEL 0x024 3677395c04Skevlo #define MUE_DP_CMD 0x028 3777395c04Skevlo #define MUE_DP_ADDR 0x02c 3877395c04Skevlo #define MUE_DP_DATA 0x030 3977395c04Skevlo #define MUE_BURST_CAP 0x034 4077395c04Skevlo #define MUE_BULK_IN_DELAY 0x03c 4177395c04Skevlo #define MUE_E2P_CMD 0x040 4277395c04Skevlo #define MUE_E2P_DATA 0x044 4377395c04Skevlo #define MUE_RFE_CTL 0x060 4477395c04Skevlo #define MUE_USB_CFG0 0x080 4577395c04Skevlo #define MUE_USB_CFG1 0x084 4677395c04Skevlo #define MUE_FCT_RX_CTL 0x090 4777395c04Skevlo #define MUE_FCT_TX_CTL 0x094 4877395c04Skevlo #define MUE_FCT_RX_FIFO_END 0x098 4977395c04Skevlo #define MUE_FCT_TX_FIFO_END 0x098 5077395c04Skevlo #define MUE_FCT_FLOW 0x0a0 5177395c04Skevlo #define MUE_7800_RFE_CTL 0x0b0 5277395c04Skevlo #define MUE_7800_FCT_RX_CTL 0x0c0 5377395c04Skevlo #define MUE_7800_FCT_TX_CTL 0x0c4 5477395c04Skevlo #define MUE_7800_FCT_FLOW 0x0d0 5577395c04Skevlo #define MUE_LTM_INDEX(idx) (0x0e0 + (idx) * 4) 5677395c04Skevlo #define MUE_MAC_CR 0x100 5777395c04Skevlo #define MUE_MAC_RX 0x104 5877395c04Skevlo #define MUE_MAC_TX 0x108 5977395c04Skevlo #define MUE_FLOW 0x10c 6077395c04Skevlo #define MUE_RX_ADDRH 0x118 6177395c04Skevlo #define MUE_RX_ADDRL 0x11c 6277395c04Skevlo #define MUE_MII_ACCESS 0x120 6377395c04Skevlo #define MUE_MII_DATA 0x124 6477395c04Skevlo #define MUE_ADDR_FILTX 0x300 6577395c04Skevlo #define MUE_7800_ADDR_FILTX 0x400 6677395c04Skevlo 6777395c04Skevlo #define MUE_7800_BURST_CAP MUE_FCT_RX_CTL 6877395c04Skevlo #define MUE_7800_BULK_IN_DELAY MUE_FCT_TX_CTL 6977395c04Skevlo 7077395c04Skevlo /* Hardware configuration register */ 7177395c04Skevlo #define MUE_HW_CFG_SRST 0x00000001 7277395c04Skevlo #define MUE_HW_CFG_LRST 0x00000002 7377395c04Skevlo #define MUE_HW_CFG_BCE 0x00000004 7477395c04Skevlo #define MUE_HW_CFG_MEF 0x00000010 7577395c04Skevlo #define MUE_HW_CFG_BIR 0x00000080 7677395c04Skevlo #define MUE_HW_CFG_LED0_EN 0x00100000 7777395c04Skevlo #define MUE_HW_CFG_LED1_EN 0x00200000 7877395c04Skevlo 7977395c04Skevlo /* Power management control register */ 8077395c04Skevlo #define MUE_PMT_CTL_PHY_RST 0x00000010 8177395c04Skevlo #define MUE_PMT_CTL_READY 0x00000080 8277395c04Skevlo 8377395c04Skevlo /* Data port select register */ 8477395c04Skevlo #define MUE_DP_SEL_RSEL_MASK 0x0000000f 8577395c04Skevlo #define MUE_DP_SEL_VHF 0x00000001 8677395c04Skevlo #define MUE_DP_SEL_DPRDY 0x80000000 8777395c04Skevlo #define MUE_DP_SEL_VHF_HASH_LEN 16 8877395c04Skevlo #define MUE_DP_SEL_VHF_VLAN_LEN 128 8977395c04Skevlo 9077395c04Skevlo /* Data port command register */ 9177395c04Skevlo #define MUE_DP_CMD_WRITE 0x00000001 9277395c04Skevlo 9377395c04Skevlo /* EEPROM command register */ 9477395c04Skevlo #define MUE_E2P_CMD_ADDR_MASK 0x000001ff 9577395c04Skevlo #define MUE_E2P_CMD_READ 0x00000000 9677395c04Skevlo #define MUE_E2P_CMD_TIMEOUT 0x00000400 9777395c04Skevlo #define MUE_E2P_CMD_BUSY 0x80000000 9877395c04Skevlo 9977395c04Skevlo /* Receive filtering engine control register */ 10077395c04Skevlo #define MUE_RFE_CTL_PERFECT 0x00000002 10177395c04Skevlo #define MUE_RFE_CTL_MULTICAST_HASH 0x00000008 10277395c04Skevlo #define MUE_RFE_CTL_UNICAST 0x00000100 10377395c04Skevlo #define MUE_RFE_CTL_MULTICAST 0x00000200 10477395c04Skevlo #define MUE_RFE_CTL_BROADCAST 0x00000400 10577395c04Skevlo 10677395c04Skevlo /* USB configuration register 0 */ 10777395c04Skevlo #define MUE_USB_CFG0_BCE 0x00000020 10877395c04Skevlo #define MUE_USB_CFG0_BIR 0x00000040 10977395c04Skevlo 11077395c04Skevlo /* USB configuration register 1 */ 11177395c04Skevlo #define MUE_USB_CFG1_LTM_ENABLE 0x00000100 11277395c04Skevlo #define MUE_USB_CFG1_DEV_U1_INIT_EN 0x00000400 11377395c04Skevlo #define MUE_USB_CFG1_DEV_U2_INIT_EN 0x00001000 11477395c04Skevlo 11577395c04Skevlo /* RX FIFO control register */ 11677395c04Skevlo #define MUE_FCT_RX_CTL_EN 0x80000000 11777395c04Skevlo 11877395c04Skevlo /* TX FIFO control register */ 11977395c04Skevlo #define MUE_FCT_TX_CTL_EN 0x80000000 12077395c04Skevlo 12177395c04Skevlo /* MAC control register */ 12277395c04Skevlo #define MUE_MAC_CR_RST 0x00000001 12377395c04Skevlo #define MUE_MAC_CR_FULL_DUPLEX 0x00000008 12477395c04Skevlo #define MUE_MAC_CR_AUTO_SPEED 0x00000800 12577395c04Skevlo #define MUE_MAC_CR_AUTO_DUPLEX 0x00001000 12677395c04Skevlo #define MUE_MAC_CR_GMII_EN 0x00080000 12777395c04Skevlo 12877395c04Skevlo /* MAC receive register */ 12977395c04Skevlo #define MUE_MAC_RX_RXEN 0x00000001 13077395c04Skevlo #define MUE_MAC_RX_MAX_SIZE_MASK 0x3fff0000 13177395c04Skevlo #define MUE_MAC_RX_MAX_SIZE_SHIFT 16 13277395c04Skevlo #define MUE_MAC_RX_MAX_LEN(x) \ 13377395c04Skevlo (((x) << MUE_MAC_RX_MAX_SIZE_SHIFT) & MUE_MAC_RX_MAX_SIZE_MASK) 13477395c04Skevlo 13577395c04Skevlo /* MAC transmit register */ 13677395c04Skevlo #define MUE_MAC_TX_TXEN 0x00000001 13777395c04Skevlo 13877395c04Skevlo /* Flow control register */ 13977395c04Skevlo #define MUE_FLOW_PAUSE_TIME 0x0000ffff 14077395c04Skevlo #define MUE_FLOW_RX_FCEN 0x20000000 14177395c04Skevlo #define MUE_FLOW_TX_FCEN 0x40000000 14277395c04Skevlo 14377395c04Skevlo /* MII access register */ 14477395c04Skevlo #define MUE_MII_ACCESS_READ 0x00000000 14577395c04Skevlo #define MUE_MII_ACCESS_BUSY 0x00000001 14677395c04Skevlo #define MUE_MII_ACCESS_WRITE 0x00000002 14777395c04Skevlo #define MUE_MII_ACCESS_REGADDR_MASK 0x000007c0 14877395c04Skevlo #define MUE_MII_ACCESS_REGADDR_SHIFT 6 14977395c04Skevlo #define MUE_MII_ACCESS_PHYADDR_MASK 0x0000f800 15077395c04Skevlo #define MUE_MII_ACCESS_PHYADDR_SHIFT 11 15177395c04Skevlo #define MUE_MII_ACCESS_REGADDR(x) \ 15277395c04Skevlo (((x) << MUE_MII_ACCESS_REGADDR_SHIFT) & MUE_MII_ACCESS_REGADDR_MASK) 15377395c04Skevlo #define MUE_MII_ACCESS_PHYADDR(x) \ 15477395c04Skevlo (((x) << MUE_MII_ACCESS_PHYADDR_SHIFT) & MUE_MII_ACCESS_PHYADDR_MASK) 15577395c04Skevlo 15677395c04Skevlo /* MAC address perfect filter register */ 15777395c04Skevlo #define MUE_ADDR_FILTX_VALID 0x80000000 15877395c04Skevlo 15977395c04Skevlo #define MUE_DEFAULT_BULKIN_DELAY 0x00002000 16077395c04Skevlo #define MUE_7800_DEFAULT_BULKIN_DELAY 0x00000800 16177395c04Skevlo 16277395c04Skevlo #define MUE_BURST_MAX_BUFSZ 129 16377395c04Skevlo #define MUE_BURST_MIN_BUFSZ 37 16477395c04Skevlo #define MUE_7800_BURST_MAX_BUFSZ 24 16577395c04Skevlo #define MUE_7800_BURST_MIN_BUFSZ 12 16677395c04Skevlo 16777395c04Skevlo #define MUE_7800_BUFSZ 12288 16877395c04Skevlo #define MUE_MAX_BUFSZ 18944 16977395c04Skevlo #define MUE_MIN_BUFSZ 8256 17077395c04Skevlo 171*a20dd8f5Skevlo #define MUE_EEPROM_INDICATOR 0xa5 172*a20dd8f5Skevlo 17377395c04Skevlo /* 17477395c04Skevlo * The interrupt endpoint is currently unused by the Moschip part. 17577395c04Skevlo */ 17677395c04Skevlo #define MUE_ENDPT_RX 0x0 17777395c04Skevlo #define MUE_ENDPT_TX 0x1 17877395c04Skevlo #define MUE_ENDPT_INTR 0x2 17977395c04Skevlo #define MUE_ENDPT_MAX 0x3 18077395c04Skevlo 18177395c04Skevlo #define MUE_RX_LIST_CNT 1 18277395c04Skevlo #define MUE_TX_LIST_CNT 1 18377395c04Skevlo 18477395c04Skevlo struct mue_softc; 18577395c04Skevlo 18677395c04Skevlo struct mue_chain { 18777395c04Skevlo struct mue_softc *mue_sc; 18877395c04Skevlo struct usbd_xfer *mue_xfer; 18977395c04Skevlo char *mue_buf; 19077395c04Skevlo struct mbuf *mue_mbuf; 19177395c04Skevlo int mue_accum; 19277395c04Skevlo int mue_idx; 19377395c04Skevlo }; 19477395c04Skevlo 19577395c04Skevlo struct mue_cdata { 19677395c04Skevlo struct mue_chain mue_tx_chain[MUE_TX_LIST_CNT]; 19777395c04Skevlo struct mue_chain mue_rx_chain[MUE_RX_LIST_CNT]; 19877395c04Skevlo int mue_tx_prod; 19977395c04Skevlo int mue_tx_cons; 20077395c04Skevlo int mue_tx_cnt; 20177395c04Skevlo int mue_rx_prod; 20277395c04Skevlo }; 20377395c04Skevlo 20477395c04Skevlo struct mue_rxbuf_hdr { 20577395c04Skevlo uint32_t rx_cmd_a; 20677395c04Skevlo #define MUE_RX_CMD_A_RED 0x00400000 20777395c04Skevlo #define MUE_RX_CMD_A_LEN_MASK 0x00003fff 20877395c04Skevlo 20977395c04Skevlo uint32_t rx_cmd_b; 21077395c04Skevlo uint16_t rx_cmd_c; 21177395c04Skevlo } __packed; 21277395c04Skevlo 21377395c04Skevlo struct mue_txbuf_hdr { 21477395c04Skevlo uint32_t tx_cmd_a; 21577395c04Skevlo #define MUE_TX_CMD_A_FCS 0x00400000 21677395c04Skevlo #define MUE_TX_CMD_A_LEN_MASK 0x000fffff 21777395c04Skevlo 21877395c04Skevlo uint32_t tx_cmd_b; 21977395c04Skevlo } __packed; 22077395c04Skevlo 22177395c04Skevlo struct mue_softc { 22277395c04Skevlo struct device mue_dev; 22377395c04Skevlo 22477395c04Skevlo struct arpcom arpcom; 22577395c04Skevlo struct mii_data mue_mii; 22677395c04Skevlo #define GET_MII(sc) (&(sc)->mue_mii) 22777395c04Skevlo #define GET_IFP(sc) (&(sc)->arpcom.ac_if) 22877395c04Skevlo 22977395c04Skevlo int mue_ed[MUE_ENDPT_MAX]; 23077395c04Skevlo struct usbd_pipe *mue_ep[MUE_ENDPT_MAX]; 23177395c04Skevlo struct mue_cdata mue_cdata; 23277395c04Skevlo struct timeout mue_stat_ch; 23377395c04Skevlo 23477395c04Skevlo struct usbd_device *mue_udev; 23577395c04Skevlo struct usbd_interface *mue_iface; 23677395c04Skevlo 23777395c04Skevlo struct usb_task mue_tick_task; 23877395c04Skevlo struct usb_task mue_stop_task; 23977395c04Skevlo 24077395c04Skevlo struct rwlock mue_mii_lock; 24177395c04Skevlo 24277395c04Skevlo struct timeval mue_rx_notice; 24377395c04Skevlo 24477395c04Skevlo uint16_t mue_product; 24577395c04Skevlo uint16_t mue_flags; 24677395c04Skevlo 24777395c04Skevlo int mue_refcnt; 24877395c04Skevlo 24977395c04Skevlo int mue_phyno; 25077395c04Skevlo int mue_bufsz; 25177395c04Skevlo int mue_link; 252*a20dd8f5Skevlo int mue_eeprom_present; 25377395c04Skevlo }; 254