1 /*        $NetBSD: if_muereg.h,v 1.6 2019/08/15 08:02:32 mrg Exp $    */
2 /*        $OpenBSD: if_muereg.h,v 1.1 2018/08/03 01:50:15 kevlo Exp $ */
3 
4 /*
5  * Copyright (c) 2018 Kevin Lo <kevlo@openbsd.org>
6  *
7  * Permission to use, copy, modify, and distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 #ifndef _IF_MUEREG_H_
21 #define _IF_MUEREG_H_
22 
23 /* XXX for ETHER_HDR_LEN and ETHER_VLAN_ENCAP_LEN */
24 #include <net/if_ether.h>
25 
26 /* XXX for IP_MAXPACKET */
27 #include <netinet/in.h>
28 #include <netinet/ip.h>
29 /* XXX for struct ip6_hdr */
30 #include <netinet/ip6.h>
31 /* XXX for struct mue_txbuf_hdr */
32 #include <dev/usb/if_muevar.h>
33 
34 /* USB vendor requests */
35 #define MUE_UR_WRITEREG         0xa0
36 #define MUE_UR_READREG                  0xa1
37 
38 /* registers */
39 #define MUE_ID_REV                      0x000
40 #define MUE_INT_STATUS                            0x00c
41 #define MUE_HW_CFG                      0x010
42 #define MUE_PMT_CTL                     0x014
43 #define MUE_LED_CFG                     0x018
44 #define MUE_DP_SEL                      0x024
45 #define MUE_DP_CMD                      0x028
46 #define MUE_DP_ADDR                     0x02c
47 #define MUE_DP_DATA                     0x030
48 #define MUE_7500_BURST_CAP              0x034
49 #define MUE_7500_INT_EP_CTL             0x038
50 #define MUE_7500_BULKIN_DELAY           0x03c
51 #define MUE_E2P_CMD                     0x040
52 #define MUE_E2P_DATA                              0x044
53 #define MUE_E2P_IND                     0x0a5
54 #define MUE_7500_RFE_CTL                0x060
55 #define MUE_USB_CFG0                              0x080
56 #define MUE_USB_CFG1                              0x084
57 #define MUE_7500_FCT_RX_CTL             0x090
58 #define MUE_7800_BURST_CAP              0x090
59 #define MUE_7500_FCT_TX_CTL             0x094
60 #define MUE_7800_BULKIN_DELAY           0x094
61 #define MUE_7500_FCT_RX_FIFO_END        0x098
62 #define MUE_7800_INT_EP_CTL             0x098
63 #define MUE_7500_FCT_TX_FIFO_END        0x09c
64 #define MUE_7500_FCT_FLOW               0x0a0
65 #define MUE_7800_RFE_CTL                0x0b0
66 #define MUE_7800_FCT_RX_CTL             0x0c0
67 #define MUE_7800_FCT_TX_CTL             0x0c4
68 #define MUE_7800_FCT_RX_FIFO_END        0x0c8
69 #define MUE_7800_FCT_TX_FIFO_END        0x0cc
70 #define MUE_7800_FCT_FLOW               0x0d0
71 #define MUE_LTM_INDEX(idx)              (0x0e0 + (idx) * 4)
72 #define MUE_NUM_LTM_INDEX               6
73 #define MUE_MAC_CR                      0x100
74 #define MUE_MAC_RX                      0x104
75 #define MUE_MAC_TX                      0x108
76 #define MUE_FLOW                        0x10c
77 #define MUE_RX_ADDRH                              0x118
78 #define MUE_RX_ADDRL                              0x11c
79 #define MUE_MII_ACCESS                            0x120
80 #define MUE_MII_DATA                              0x124
81 #define MUE_7500_ADDR_FILTX_BASE        0x300
82 #define MUE_7500_ADDR_FILTX(i)                    (MUE_7500_ADDR_FILTX_BASE + 8 * (i))
83 #define MUE_7800_ADDR_FILTX_BASE        0x400
84 #define MUE_7800_ADDR_FILTX(i)                    (MUE_7800_ADDR_FILTX_BASE + 8 * (i))
85 #define MUE_NUM_ADDR_FILTX              33
86 
87 /* device ID and revision register */
88 #define MUE_ID_REV_ID                   __BITS(16,31)
89 #define MUE_ID_REV_REV                  __BITS(0,15)
90 
91 /* hardware configuration register */
92 #define MUE_HW_CFG_SRST                 0x00000001
93 #define MUE_HW_CFG_LRST                 0x00000002
94 #define MUE_HW_CFG_BCE                  0x00000004
95 #define MUE_HW_CFG_MEF                  0x00000010
96 #define MUE_HW_CFG_BIR                  0x00000080
97 #define MUE_HW_CFG_LED0_EN    0x00100000
98 #define MUE_HW_CFG_LED1_EN    0x00200000
99 
100 /* power management control register */
101 #define MUE_PMT_CTL_PHY_RST   0x00000010
102 #define MUE_PMT_CTL_READY     0x00000080
103 
104 /* LED configuration register */
105 #define MUE_LED_CFG_LEDGPIO_EN                    0x0000f000
106 #define MUE_LED_CFG_LED10_FUN_SEL       0x40000000
107 #define MUE_LED_CFG_LED2_FUN_SEL        0x80000000
108 
109 /* data port select register */
110 #define MUE_DP_SEL_RSEL_MASK  0x0000000f
111 #define MUE_DP_SEL_VHF                  0x00000001
112 #define MUE_DP_SEL_DPRDY      0x80000000
113 #define MUE_DP_SEL_VHF_HASH_LEN         16
114 #define MUE_DP_SEL_VHF_VLAN_LEN         128
115 
116 /* data port command register */
117 #define MUE_DP_CMD_WRITE      0x00000001
118 
119 /* burst cap register and etc */
120 #define MUE_SS_USB_PKT_SIZE             1024
121 #define MUE_HS_USB_PKT_SIZE             512
122 #define MUE_FS_USB_PKT_SIZE             64
123 #define MUE_7500_HS_RX_BUFSIZE                    \
124           (16 * 1024 + 5 * MUE_HS_USB_PKT_SIZE)
125 #define MUE_7500_FS_RX_BUFSIZE                    \
126           (6 * 1024 + 33 * MUE_FS_USB_PKT_SIZE)
127 #define MUE_7500_MAX_RX_FIFO_SIZE       (20 * 1024)
128 #define MUE_7500_MAX_TX_FIFO_SIZE       (12 * 1024)
129 #define MUE_7800_RX_BUFSIZE             (12 * 1024)
130 #define MUE_7800_MAX_RX_FIFO_SIZE       MUE_7800_RX_BUFSIZE
131 #define MUE_7800_MAX_TX_FIFO_SIZE       MUE_7800_RX_BUFSIZE
132 #define MUE_FRAME_LEN(mtu)              \
133           (mtu + ETHER_HDR_LEN + ETHER_CRC_LEN + ETHER_VLAN_ENCAP_LEN)
134 #define MUE_TSO_FRAME_LEN               MUE_FRAME_LEN(IP_MAXPACKET)
135 #define MUE_TX_BUFSIZE                            \
136           (sizeof(struct mue_txbuf_hdr) + MUE_TSO_FRAME_LEN)
137 
138 /* interrupt endpoint control register */
139 #define MUE_INT_EP_CTL_PHY_INT                    0x20000
140 
141 /* bulk-in delay register */
142 #define MUE_7500_DEFAULT_BULKIN_DELAY   0x00002000
143 #define MUE_7800_DEFAULT_BULKIN_DELAY   0x00000800
144 
145 /* EEPROM command register */
146 #define MUE_E2P_CMD_ADDR_MASK 0x000001ff
147 #define MUE_E2P_CMD_READ      0x00000000
148 #define MUE_E2P_CMD_LOADED    0x00000200
149 #define MUE_E2P_CMD_TIMEOUT   0x00000400
150 #define MUE_E2P_CMD_BUSY      0x80000000
151 #define MUE_E2P_IND_OFFSET    0x000
152 #define   MUE_E2P_MAC_OFFSET  0x001
153 #define   MUE_E2P_LTM_OFFSET  0x03f
154 
155 /* Receive Filtering Engine control register */
156 #define MUE_RFE_CTL_PERFECT             0x00000002
157 #define MUE_RFE_CTL_MULTICAST_HASH      0x00000008
158 #define MUE_RFE_CTL_VLAN_FILTER                   0x00000020
159 #define MUE_RFE_CTL_UNICAST             0x00000100
160 #define MUE_RFE_CTL_MULTICAST           0x00000200
161 #define MUE_RFE_CTL_BROADCAST           0x00000400
162 #define MUE_RFE_CTL_IP_COE              0x00000800
163 #define MUE_RFE_CTL_TCPUDP_COE                    0x00001000
164 #define MUE_RFE_CTL_ICMP_COE            0x00002000
165 #define MUE_RFE_CTL_IGMP_COE            0x00004000
166 
167 /* USB configuration register 0 */
168 #define MUE_USB_CFG0_BCE      0x00000020
169 #define MUE_USB_CFG0_BIR      0x00000040
170 
171 /* USB configuration register 1 */
172 #define MUE_USB_CFG1_LTM_ENABLE                   0x00000100
173 #define MUE_USB_CFG1_DEV_U1_INIT_EN     0x00000400
174 #define MUE_USB_CFG1_DEV_U2_INIT_EN     0x00001000
175 
176 /* RX FIFO control register */
177 #define MUE_FCT_RX_CTL_EN     0x80000000
178 
179 /* TX FIFO control register */
180 #define MUE_FCT_TX_CTL_EN     0x80000000
181 
182 /* MAC control register */
183 #define MUE_MAC_CR_RST                  0x00000001
184 #define MUE_MAC_CR_FULL_DUPLEX          0x00000008
185 #define MUE_MAC_CR_AUTO_SPEED 0x00000800
186 #define MUE_MAC_CR_AUTO_DUPLEX          0x00001000
187 #define MUE_MAC_CR_GMII_EN    0x00080000
188 
189 /* MAC receive register */
190 #define MUE_MAC_RX_RXEN                           0x00000001
191 #define MUE_MAC_RX_MAX_SIZE_MASK        0x3fff0000
192 #define MUE_MAC_RX_MAX_SIZE_SHIFT       16
193 #define MUE_MAC_RX_MAX_LEN(x) \
194           (((x) << MUE_MAC_RX_MAX_SIZE_SHIFT) & MUE_MAC_RX_MAX_SIZE_MASK)
195 
196 /* MAC transmit register */
197 #define MUE_MAC_TX_TXEN                 0x00000001
198 
199 /* flow control register */
200 #define MUE_FLOW_PAUSE_TIME   0x0000ffff
201 #define MUE_FLOW_RX_FCEN      0x20000000
202 #define MUE_FLOW_TX_FCEN      0x40000000
203 
204 /* MII access register */
205 #define MUE_MII_ACCESS_READ             0x00000000
206 #define MUE_MII_ACCESS_BUSY             0x00000001
207 #define MUE_MII_ACCESS_WRITE            0x00000002
208 #define MUE_MII_ACCESS_REGADDR_MASK     0x000007c0
209 #define MUE_MII_ACCESS_REGADDR_SHIFT    6
210 #define MUE_MII_ACCESS_PHYADDR_MASK     0x0000f800
211 #define MUE_MII_ACCESS_PHYADDR_SHIFT    11
212 #define MUE_MII_ACCESS_REGADDR(x)       \
213           (((x) << MUE_MII_ACCESS_REGADDR_SHIFT) & MUE_MII_ACCESS_REGADDR_MASK)
214 #define MUE_MII_ACCESS_PHYADDR(x)       \
215           (((x) << MUE_MII_ACCESS_PHYADDR_SHIFT) & MUE_MII_ACCESS_PHYADDR_MASK)
216 
217 /* MAC address perfect filter register */
218 #define MUE_ADDR_FILTX_VALID  0x80000000
219 
220 /* undocumented OTP registers from Linux via FreeBSD */
221 #define MUE_OTP_BASE_ADDR               0x01000
222 #define MUE_OTP_ADDR(off)               (MUE_OTP_BASE_ADDR + 4 * (off))
223 #define MUE_OTP_PWR_DN                            MUE_OTP_ADDR(0x00)
224 #define MUE_OTP_PWR_DN_PWRDN_N                    0x01
225 #define MUE_OTP_ADDR1                             MUE_OTP_ADDR(0x01)
226 #define MUE_OTP_ADDR1_MASK              0x1f
227 #define MUE_OTP_ADDR2                             MUE_OTP_ADDR(0x02)
228 #define MUE_OTP_ADDR2_MASK              0xff
229 #define MUE_OTP_ADDR3                             MUE_OTP_ADDR(0x03)
230 #define MUE_OTP_ADDR3_MASK              0x03
231 #define MUE_OTP_RD_DATA                           MUE_OTP_ADDR(0x06)
232 #define MUE_OTP_FUNC_CMD                MUE_OTP_ADDR(0x08)
233 #define MUE_OTP_FUNC_CMD_RESET                    0x04
234 #define MUE_OTP_FUNC_CMD_PROGRAM        0x02
235 #define MUE_OTP_FUNC_CMD_READ           0x01
236 #define MUE_OTP_MAC_OFFSET              0x01
237 #define MUE_OTP_IND_OFFSET              0x00
238 #define MUE_OTP_IND_1                             0xf3
239 #define MUE_OTP_IND_2                             0xf7
240 #define MUE_OTP_CMD_GO                            MUE_OTP_ADDR(0x0a)
241 #define MUE_OTP_CMD_GO_GO               0x01
242 #define MUE_OTP_STATUS                            MUE_OTP_ADDR(0x0a)
243 #define MUE_OTP_STATUS_OTP_LOCK                   0x10
244 #define MUE_OTP_STATUS_BUSY             0x01
245 
246 #endif /* _IF_MUEREG_H_ */
247