1 1.1 nonaka /* $NetBSD: if_axenreg.h,v 1.1 2013/10/26 09:16:20 nonaka Exp $ */ 2 1.1 nonaka /* $OpenBSD: if_axenreg.h,v 1.1 2013/10/07 05:37:41 yuo Exp $ */ 3 1.1 nonaka 4 1.1 nonaka /* 5 1.1 nonaka * Copyright (c) 2013 Yojiro UO <yuo (at) openbsd.org>. All right reserved. 6 1.1 nonaka * 7 1.1 nonaka */ 8 1.1 nonaka 9 1.1 nonaka /* 10 1.1 nonaka * Definitions for the ASIX Electronics AX88179 to ethernet controller. 11 1.1 nonaka */ 12 1.1 nonaka 13 1.1 nonaka #define AXEN_PHY_ID 0x0003 14 1.1 nonaka #define AXEN_MCAST_FILTER_SIZE 8 15 1.1 nonaka /* unit: KB */ 16 1.1 nonaka #define AXEN_BUFSZ_LS 8 17 1.1 nonaka #define AXEN_BUFSZ_HS 16 18 1.1 nonaka #define AXEN_BUFSZ_SS 24 19 1.1 nonaka 20 1.1 nonaka #define AXEN_REV_UA1 0 21 1.1 nonaka #define AXEN_REV_UA2 1 22 1.1 nonaka 23 1.1 nonaka 24 1.1 nonaka /* recieve header */ 25 1.1 nonaka /* 26 1.1 nonaka * +-multicast/broadcast 27 1.1 nonaka * | +-rx_ok 28 1.1 nonaka * | | ++-----L3_type (1:ipv4, 0/2:ipv6) 29 1.1 nonaka * pkt_len(13) | | ||+ ++-L4_type(0: icmp, 1: UDP, 4: TCP) 30 1.1 nonaka * |765|43210 76543210|7654 3210 7654 3210| 31 1.1 nonaka * |+-Drop_err |+-L4_err |+-L4_CSUM_ERR 32 1.1 nonaka * +--crc_err +--L3_err +--L3_CSUM_ERR 33 1.1 nonaka * 34 1.1 nonaka * ex) pkt_hdr 0x00680820 35 1.1 nonaka * drop_err, crc_err: none 36 1.1 nonaka * pkt_length = 104 byte 37 1.1 nonaka * 0x0820 = 0000 1000 0010 0000 => ipv4 icmp 38 1.1 nonaka * 39 1.1 nonaka * ex) pkt_hdr 0x004c8800 40 1.1 nonaka * drop_err, crc_err: none 41 1.1 nonaka * pkt_length = 76 byte 42 1.1 nonaka * 0x8800 = 1000 1000 0000 0000 => ipv6 mcast icmp 43 1.1 nonaka * 44 1.1 nonaka * [memo] 45 1.1 nonaka * 0x0820: ipv4 icmp 0000 1000 0010 0000 46 1.1 nonaka * 0x8820: ipv4 icmp (broadcast) 1000 1000 0010 0000 47 1.1 nonaka * 0x0824: ipv4 udp (nping) 0000 1000 0010 0100 48 1.1 nonaka * 0x0830: ipv4 tcp (ssh) 0000 1000 0011 0000 49 1.1 nonaka * 50 1.1 nonaka * 0x0800: ipv6 icmp 0000 1000 0000 0000 51 1.1 nonaka * 0x8800: ipv6 icmp (multicast) 1000 1000 0000 0000 52 1.1 nonaka * 0x8844: ipv6 UDP/MDNS mcast 1000 1000 0100 0100 53 1.1 nonaka * 0x0850: ipv6 tcp (ssh) 0000 1000 0101 0000 54 1.1 nonaka */ 55 1.1 nonaka 56 1.1 nonaka #define AXEN_RXHDR_CRC_ERR (1 << 31) 57 1.1 nonaka #define AXEN_RXHDR_DROP_ERR (1 << 30) 58 1.1 nonaka #define AXEN_RXHDR_MCAST (1 << 15) 59 1.1 nonaka #define AXEN_RXHDR_RX_OK (1 << 11) 60 1.1 nonaka #define AXEN_RXHDR_L3_ERR (1 << 9) 61 1.1 nonaka #define AXEN_RXHDR_L4_ERR (1 << 8) 62 1.1 nonaka #define AXEN_RXHDR_L3CSUM_ERR (1 << 1) 63 1.1 nonaka #define AXEN_RXHDR_L4CSUM_ERR (1 << 0) 64 1.1 nonaka 65 1.1 nonaka /* L4 packet type (3bit) */ 66 1.1 nonaka #define AXEN_RXHDR_L4_TYPE_MASK 0x0000001c 67 1.1 nonaka #define AXEN_RXHDR_L4_TYPE_OFFSET 2 68 1.1 nonaka #define AXEN_RXHDR_L4_TYPE_ICMP 0x0 69 1.1 nonaka #define AXEN_RXHDR_L4_TYPE_UDP 0x1 70 1.1 nonaka #define AXEN_RXHDR_L4_TYPE_TCP 0x4 71 1.1 nonaka 72 1.1 nonaka /* L3 packet type (2bit) */ 73 1.1 nonaka #define AXEN_RXHDR_L3_TYPE_MASK 0x00000600 74 1.1 nonaka #define AXEN_RXHDR_L3_TYPE_OFFSET 5 75 1.1 nonaka #define AXEN_RXHDR_L3_TYPE_UNDEF 0x0 76 1.1 nonaka #define AXEN_RXHDR_L3_TYPE_IPV4 0x1 77 1.1 nonaka #define AXEN_RXHDR_L3_TYPE_IPV6 0x2 78 1.1 nonaka 79 1.1 nonaka /* 80 1.1 nonaka * commands 81 1.1 nonaka */ 82 1.1 nonaka #define AXEN_CMD_LEN(x) (((x) & 0xF000) >> 12) 83 1.1 nonaka #define AXEN_CMD_DIR(x) (((x) & 0x0F00) >> 8) 84 1.1 nonaka #define AXEN_CMD_CMD(x) ((x) & 0x00FF) 85 1.1 nonaka 86 1.1 nonaka /* ---MAC--- */ 87 1.1 nonaka /* 1byte cmd */ 88 1.1 nonaka #define AXEN_CMD_MAC_READ 0x1001 89 1.1 nonaka #define AXEN_CMD_MAC_WRITE 0x1101 90 1.1 nonaka 91 1.1 nonaka #define AXEN_USB_UPLINK 0x02 92 1.1 nonaka #define AXEN_USB_FS 0x01 93 1.1 nonaka #define AXEN_USB_HS 0x02 94 1.1 nonaka #define AXEN_USB_SS 0x04 95 1.1 nonaka #define AXEN_GENERAL_STATUS 0x03 96 1.1 nonaka #define AXEN_GENERAL_STATUS_MASK 0x4 97 1.1 nonaka #define AXEN_REV0 0x0 98 1.1 nonaka #define AXEN_REV1 0x4 99 1.1 nonaka #define AXEN_UNK_05 0x05 100 1.1 nonaka #define AXEN_MAC_EEPROM_ADDR 0x07 101 1.1 nonaka #define AXEN_MAC_EEPROM_READ 0x08 102 1.1 nonaka #define AXEN_MAC_EEPROM_CMD 0x0a 103 1.1 nonaka #define AXEN_EEPROM_READ 0x04 104 1.1 nonaka #define AXEN_EEPROM_WRITE 0x08 105 1.1 nonaka #define AXEN_EEPROM_BUSY 0x10 106 1.1 nonaka #define AXEN_MONITOR_MODE 0x24 107 1.1 nonaka #define AXEN_MONITOR_NONE 0x00 108 1.1 nonaka #define AXEN_MONITOR_RWLC 0x02 109 1.1 nonaka #define AXEN_MONITOR_RWMP 0x04 110 1.1 nonaka #define AXEN_MONITOR_RWWF 0x08 111 1.1 nonaka #define AXEN_MONITOR_RW_FLAG 0x10 112 1.1 nonaka #define AXEN_MONITOR_PMEPOL 0x20 113 1.1 nonaka #define AXEN_MONITOR_PMETYPE 0x40 114 1.1 nonaka #define AXEN_UNK_28 0x28 115 1.1 nonaka #define AXEN_PHYCLK 0x33 116 1.1 nonaka #define AXEN_PHYCLK_BCS 0x01 117 1.1 nonaka #define AXEN_PHYCLK_ACS 0x02 118 1.1 nonaka #define AXEN_PHYCLK_ULR 0x08 119 1.1 nonaka #define AXEN_PHYCLK_ACSREQ 0x10 120 1.1 nonaka #define AXEN_RX_COE 0x34 121 1.1 nonaka #define AXEN_RXCOE_OFF 0x00 122 1.1 nonaka #define AXEN_RXCOE_IPv4 0x01 123 1.1 nonaka #define AXEN_RXCOE_TCPv4 0x02 124 1.1 nonaka #define AXEN_RXCOE_UDPv4 0x04 125 1.1 nonaka #define AXEN_RXCOE_ICMP 0x08 126 1.1 nonaka #define AXEN_RXCOE_IGMP 0x10 127 1.1 nonaka #define AXEN_RXCOE_TCPv6 0x20 128 1.1 nonaka #define AXEN_RXCOE_UDPv6 0x40 129 1.1 nonaka #define AXEN_RXCOE_ICMPv6 0x80 130 1.1 nonaka #define AXEN_TX_COE 0x35 131 1.1 nonaka #define AXEN_TXCOE_OFF 0x00 132 1.1 nonaka #define AXEN_TXCOE_IPv4 0x01 133 1.1 nonaka #define AXEN_TXCOE_TCPv4 0x02 134 1.1 nonaka #define AXEN_TXCOE_UDPv4 0x04 135 1.1 nonaka #define AXEN_TXCOE_ICMP 0x08 136 1.1 nonaka #define AXEN_TXCOE_IGMP 0x10 137 1.1 nonaka #define AXEN_TXCOE_TCPv6 0x20 138 1.1 nonaka #define AXEN_TXCOE_UDPv6 0x40 139 1.1 nonaka #define AXEN_TXCOE_ICMPv6 0x80 140 1.1 nonaka #define AXEN_PAUSE_HIGH_WATERMARK 0x54 141 1.1 nonaka #define AXEN_PAUSE_LOW_WATERMARK 0x55 142 1.1 nonaka 143 1.1 nonaka 144 1.1 nonaka /* 2byte cmd */ 145 1.1 nonaka #define AXEN_CMD_MAC_READ2 0x2001 146 1.1 nonaka #define AXEN_CMD_MAC_WRITE2 0x2101 147 1.1 nonaka 148 1.1 nonaka #define AXEN_MAC_RXCTL 0x0b 149 1.1 nonaka #define AXEN_RXCTL_STOP 0x0000 150 1.1 nonaka #define AXEN_RXCTL_PROMISC 0x0001 151 1.1 nonaka #define AXEN_RXCTL_ACPT_ALL_MCAST 0x0002 152 1.1 nonaka #define AXEN_RXCTL_HA8B 0x0004 153 1.1 nonaka #define AXEN_RXCTL_AUTOB 0x0008 154 1.1 nonaka #define AXEN_RXCTL_ACPT_BCAST 0x0010 155 1.1 nonaka #define AXEN_RXCTL_ACPT_PHY_MCAST 0x0020 156 1.1 nonaka #define AXEN_RXCTL_START 0x0080 157 1.1 nonaka #define AXEN_RXCTL_DROPCRCERR 0x0100 158 1.1 nonaka #define AXEN_RXCTL_IPE 0x0200 159 1.1 nonaka #define AXEN_RXCTL_TXPADCRC 0x0400 160 1.1 nonaka #define AXEN_MEDIUM_STATUS 0x22 161 1.1 nonaka #define AXEN_MEDIUM_NONE 0x0000 162 1.1 nonaka #define AXEN_MEDIUM_GIGA 0x0001 163 1.1 nonaka #define AXEN_MEDIUM_FDX 0x0002 164 1.1 nonaka #define AXEN_MEDIUM_ALWAYS_ONE 0x0004 165 1.1 nonaka #define AXEN_MEDIUM_EN_125MHZ 0x0008 166 1.1 nonaka #define AXEN_MEDIUM_RXFLOW_CTRL_EN 0x0010 167 1.1 nonaka #define AXEN_MEDIUM_TXFLOW_CTRL_EN 0x0020 168 1.1 nonaka #define AXEN_MEDIUM_RECV_EN 0x0100 169 1.1 nonaka #define AXEN_MEDIUM_PS 0x0200 170 1.1 nonaka #define AXEN_MEDIUM_JUMBO_EN 0x8040 171 1.1 nonaka #define AXEN_PHYPWR_RSTCTL 0x26 172 1.1 nonaka #define AXEN_PHYPWR_RSTCTL_BZ 0x0010 173 1.1 nonaka #define AXEN_PHYPWR_RSTCTL_IPRL 0x0020 174 1.1 nonaka #define AXEN_PHYPWR_RSTCTL_AUTODETACH 0x1000 175 1.1 nonaka 176 1.1 nonaka #define AXEN_CMD_EEPROM_READ 0x2004 177 1.1 nonaka #define AXEN_EEPROM_STAT 0x43 178 1.1 nonaka 179 1.1 nonaka /* 5byte cmd */ 180 1.1 nonaka #define AXEN_CMD_MAC_SET_RXSR 0x5101 181 1.1 nonaka #define AXEN_RX_BULKIN_QCTRL 0x2e 182 1.1 nonaka 183 1.1 nonaka /* 6byte cmd */ 184 1.1 nonaka #define AXEN_CMD_MAC_READ_ETHER 0x6001 185 1.1 nonaka #define AXEN_CMD_MAC_NODE_ID 0x10 186 1.1 nonaka 187 1.1 nonaka /* 8byte cmd */ 188 1.1 nonaka #define AXEN_CMD_MAC_READ_FILTER 0x8001 189 1.1 nonaka #define AXEN_CMD_MAC_WRITE_FILTER 0x8101 190 1.1 nonaka #define AXEN_FILTER_MULTI 0x16 191 1.1 nonaka 192 1.1 nonaka /* ---PHY--- */ 193 1.1 nonaka /* 2byte cmd */ 194 1.1 nonaka #define AXEN_CMD_MII_READ_REG 0x2002 195 1.1 nonaka #define AXEN_CMD_MII_WRITE_REG 0x2102 196 1.1 nonaka 197 1.1 nonaka 198 1.1 nonaka 199 1.1 nonaka /* ========= */ 200 1.1 nonaka #define AXEN_GPIO0_EN 0x01 201 1.1 nonaka #define AXEN_GPIO0 0x02 202 1.1 nonaka #define AXEN_GPIO1_EN 0x04 203 1.1 nonaka #define AXEN_GPIO1 0x08 204 1.1 nonaka #define AXEN_GPIO2_EN 0x10 205 1.1 nonaka #define AXEN_GPIO2 0x20 206 1.1 nonaka #define AXEN_GPIO_RELOAD_EEPROM 0x80 207 1.1 nonaka 208 1.1 nonaka 209 1.1 nonaka #define AXEN_TIMEOUT 1000 210 1.1 nonaka 211 1.1 nonaka #define AXEN_RX_LIST_CNT 1 212 1.1 nonaka #define AXEN_TX_LIST_CNT 1 213 1.1 nonaka 214 1.1 nonaka 215 1.1 nonaka #define AXEN_CONFIG_NO 1 216 1.1 nonaka #define AXEN_IFACE_IDX 0 217 1.1 nonaka 218 1.1 nonaka /* 219 1.1 nonaka * The interrupt endpoint is currently unused 220 1.1 nonaka * by the ASIX part. 221 1.1 nonaka */ 222 1.1 nonaka #define AXEN_ENDPT_RX 0x0 223 1.1 nonaka #define AXEN_ENDPT_TX 0x1 224 1.1 nonaka #define AXEN_ENDPT_INTR 0x2 225 1.1 nonaka #define AXEN_ENDPT_MAX 0x3 226 1.1 nonaka 227 1.1 nonaka struct axen_type { 228 1.1 nonaka struct usb_devno axen_dev; 229 1.1 nonaka uint16_t axen_flags; 230 1.1 nonaka #define AX178A 0x0001 /* AX88178a */ 231 1.1 nonaka #define AX179 0x0002 /* AX88179 */ 232 1.1 nonaka }; 233 1.1 nonaka 234 1.1 nonaka struct axen_softc; 235 1.1 nonaka 236 1.1 nonaka struct axen_chain { 237 1.1 nonaka struct axen_softc *axen_sc; 238 1.1 nonaka struct usbd_xfer *axen_xfer; 239 1.1 nonaka uint8_t *axen_buf; 240 1.1 nonaka int axen_accum; 241 1.1 nonaka int axen_idx; 242 1.1 nonaka }; 243 1.1 nonaka 244 1.1 nonaka struct axen_cdata { 245 1.1 nonaka struct axen_chain axen_tx_chain[AXEN_TX_LIST_CNT]; 246 1.1 nonaka struct axen_chain axen_rx_chain[AXEN_RX_LIST_CNT]; 247 1.1 nonaka int axen_tx_prod; 248 1.1 nonaka int axen_tx_cons; 249 1.1 nonaka int axen_tx_cnt; 250 1.1 nonaka int axen_rx_prod; 251 1.1 nonaka }; 252 1.1 nonaka 253 1.1 nonaka struct axen_qctrl { 254 1.1 nonaka uint8_t ctrl; 255 1.1 nonaka uint8_t timer_low; 256 1.1 nonaka uint8_t timer_high; 257 1.1 nonaka uint8_t bufsize; 258 1.1 nonaka uint8_t ifg; 259 1.1 nonaka } __packed; 260 1.1 nonaka 261 1.1 nonaka struct axen_sframe_hdr { 262 1.1 nonaka uint32_t plen; /* packet length */ 263 1.1 nonaka uint32_t gso; 264 1.1 nonaka } __packed; 265 1.1 nonaka 266 1.1 nonaka struct axen_softc { 267 1.1 nonaka device_t axen_dev; 268 1.1 nonaka struct ethercom axen_ec; 269 1.1 nonaka struct mii_data axen_mii; 270 1.1 nonaka krndsource_t rnd_source; 271 1.1 nonaka usbd_device_handle axen_udev; 272 1.1 nonaka usbd_interface_handle axen_iface; 273 1.1 nonaka 274 1.1 nonaka uint16_t axen_vendor; 275 1.1 nonaka uint16_t axen_product; 276 1.1 nonaka uint16_t axen_flags; 277 1.1 nonaka 278 1.1 nonaka int axen_ed[AXEN_ENDPT_MAX]; 279 1.1 nonaka struct usbd_pipe *axen_ep[AXEN_ENDPT_MAX]; 280 1.1 nonaka int axen_if_flags; 281 1.1 nonaka struct axen_cdata axen_cdata; 282 1.1 nonaka struct callout axen_stat_ch; 283 1.1 nonaka 284 1.1 nonaka int axen_refcnt; 285 1.1 nonaka bool axen_dying; 286 1.1 nonaka bool axen_attached; 287 1.1 nonaka 288 1.1 nonaka struct usb_task axen_tick_task; 289 1.1 nonaka 290 1.1 nonaka krwlock_t axen_mii_lock; 291 1.1 nonaka 292 1.1 nonaka int axen_link; 293 1.1 nonaka 294 1.1 nonaka uint8_t axen_ipgs[3]; 295 1.1 nonaka int axen_phyno; 296 1.1 nonaka struct timeval axen_rx_notice; 297 1.1 nonaka u_int axen_bufsz; 298 1.1 nonaka int axen_rev; 299 1.1 nonaka 300 1.1 nonaka #define sc_if axen_ec.ec_if 301 1.1 nonaka }; 302 1.1 nonaka 303 1.1 nonaka #define GET_MII(sc) (&(sc)->axen_mii) 304 1.1 nonaka #define GET_IFP(sc) (&(sc)->sc_if) 305 1.1 nonaka 306 1.1 nonaka #define ETHER_ALIGN 2 307