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