xref: /freebsd/sys/dev/usb/net/if_axgereg.h (revision 6962da914dd511349b219241e92b32329be76fc6)
1da089c14SMark Johnston /*-
24d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
3718cf2ccSPedro F. Giffuni  *
4d32048bbSKevin Lo  * Copyright (c) 2013-2014 Kevin Lo
5da089c14SMark Johnston  * All rights reserved.
6da089c14SMark Johnston  *
7da089c14SMark Johnston  * Redistribution and use in source and binary forms, with or without
8da089c14SMark Johnston  * modification, are permitted provided that the following conditions
9da089c14SMark Johnston  * are met:
10da089c14SMark Johnston  * 1. Redistributions of source code must retain the above copyright
11da089c14SMark Johnston  *    notice, this list of conditions and the following disclaimer.
12da089c14SMark Johnston  * 2. Redistributions in binary form must reproduce the above copyright
13da089c14SMark Johnston  *    notice, this list of conditions and the following disclaimer in the
14da089c14SMark Johnston  *    documentation and/or other materials provided with the distribution.
15da089c14SMark Johnston  *
1677c66464SKevin Lo  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17da089c14SMark Johnston  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18da089c14SMark Johnston  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
195dc8bea6SKevin Lo  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
205dc8bea6SKevin Lo  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
215dc8bea6SKevin Lo  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
225dc8bea6SKevin Lo  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
235dc8bea6SKevin Lo  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
245dc8bea6SKevin Lo  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
255dc8bea6SKevin Lo  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
265dc8bea6SKevin Lo  * SUCH DAMAGE.
27da089c14SMark Johnston  */
28da089c14SMark Johnston 
29da089c14SMark Johnston #define	AXGE_ACCESS_MAC			0x01
30da089c14SMark Johnston #define	AXGE_ACCESS_PHY			0x02
31da089c14SMark Johnston #define	AXGE_ACCESS_WAKEUP		0x03
32da089c14SMark Johnston #define	AXGE_ACCESS_EEPROM		0x04
33da089c14SMark Johnston #define	AXGE_ACCESS_EFUSE		0x05
34da089c14SMark Johnston #define	AXGE_RELOAD_EEPROM_EFUSE	0x06
35*6962da91SDamien Broka #define	AXGE_FW_MODE			0x08
36da089c14SMark Johnston #define	AXGE_WRITE_EFUSE_EN		0x09
37da089c14SMark Johnston #define	AXGE_WRITE_EFUSE_DIS		0x0A
38da089c14SMark Johnston #define	AXGE_ACCESS_MFAB		0x10
39da089c14SMark Johnston 
40*6962da91SDamien Broka #define	AXGE_FW_MODE_178A179		0x0000
41*6962da91SDamien Broka #define	AXGE_FW_MODE_179A		0x0001
42*6962da91SDamien Broka 
43d32048bbSKevin Lo /* Physical link status register */
44d32048bbSKevin Lo #define	AXGE_PLSR			0x02
45d32048bbSKevin Lo #define	PLSR_USB_FS			0x01
46d32048bbSKevin Lo #define	PLSR_USB_HS			0x02
47d32048bbSKevin Lo #define	PLSR_USB_SS			0x04
48da089c14SMark Johnston 
49d32048bbSKevin Lo /* EEPROM address register */
50d32048bbSKevin Lo #define	AXGE_EAR			0x07
51da089c14SMark Johnston 
52d32048bbSKevin Lo /* EEPROM data low register */
53d32048bbSKevin Lo #define	AXGE_EDLR			0x08
54da089c14SMark Johnston 
55d32048bbSKevin Lo /* EEPROM data high register */
56d32048bbSKevin Lo #define	AXGE_EDHR			0x09
57da089c14SMark Johnston 
58d32048bbSKevin Lo /* EEPROM command register */
59d32048bbSKevin Lo #define	AXGE_ECR			0x0a
60da089c14SMark Johnston 
61d32048bbSKevin Lo /* Rx control register */
62d32048bbSKevin Lo #define	AXGE_RCR			0x0b
63d32048bbSKevin Lo #define	RCR_STOP			0x0000
64b2cdc7caSPyun YongHyeon #define	RCR_PROMISC			0x0001
65b2cdc7caSPyun YongHyeon #define	RCR_ACPT_ALL_MCAST		0x0002
66b2cdc7caSPyun YongHyeon #define	RCR_AUTOPAD_BNDRY		0x0004
67b2cdc7caSPyun YongHyeon #define	RCR_ACPT_BCAST			0x0008
68b2cdc7caSPyun YongHyeon #define	RCR_ACPT_MCAST			0x0010
69b2cdc7caSPyun YongHyeon #define	RCR_ACPT_PHY_MCAST		0x0020
70b2cdc7caSPyun YongHyeon #define	RCR_START			0x0080
71b2cdc7caSPyun YongHyeon #define	RCR_DROP_CRCERR			0x0100
72d32048bbSKevin Lo #define	RCR_IPE				0x0200
73d32048bbSKevin Lo #define	RCR_TX_CRC_PAD			0x0400
74da089c14SMark Johnston 
75d32048bbSKevin Lo /* Node id register */
76d32048bbSKevin Lo #define	AXGE_NIDR			0x10
77da089c14SMark Johnston 
78d32048bbSKevin Lo /* Multicast filter array */
79d32048bbSKevin Lo #define	AXGE_MFA			0x16
80d32048bbSKevin Lo 
81d32048bbSKevin Lo /* Medium status register */
82d32048bbSKevin Lo #define	AXGE_MSR			0x22
83d32048bbSKevin Lo #define	MSR_GM				0x0001
84d32048bbSKevin Lo #define	MSR_FD				0x0002
85d32048bbSKevin Lo #define	MSR_EN_125MHZ			0x0008
86d32048bbSKevin Lo #define	MSR_RFC				0x0010
87d32048bbSKevin Lo #define	MSR_TFC				0x0020
88d32048bbSKevin Lo #define	MSR_RE				0x0100
89d32048bbSKevin Lo #define	MSR_PS				0x0200
90d32048bbSKevin Lo 
91d32048bbSKevin Lo /* Monitor mode status register */
92d32048bbSKevin Lo #define	AXGE_MMSR			0x24
93d32048bbSKevin Lo #define	MMSR_RWLC			0x02
94d32048bbSKevin Lo #define	MMSR_RWMP			0x04
95d32048bbSKevin Lo #define	MMSR_RWWF			0x08
96d32048bbSKevin Lo #define	MMSR_RW_FLAG			0x10
97d32048bbSKevin Lo #define	MMSR_PME_POL			0x20
98d32048bbSKevin Lo #define	MMSR_PME_TYPE			0x40
99d32048bbSKevin Lo #define	MMSR_PME_IND			0x80
100d32048bbSKevin Lo 
101d32048bbSKevin Lo /* GPIO control/status register */
102d32048bbSKevin Lo #define	AXGE_GPIOCR			0x25
103d32048bbSKevin Lo 
104d32048bbSKevin Lo /* Ethernet PHY power & reset control register */
105d32048bbSKevin Lo #define	AXGE_EPPRCR			0x26
106d32048bbSKevin Lo #define	EPPRCR_BZ			0x0010
107d32048bbSKevin Lo #define	EPPRCR_IPRL			0x0020
108d32048bbSKevin Lo #define	EPPRCR_AUTODETACH		0x1000
109da089c14SMark Johnston 
110da089c14SMark Johnston #define	AXGE_RX_BULKIN_QCTRL		0x2e
111da089c14SMark Johnston 
112da089c14SMark Johnston #define	AXGE_CLK_SELECT			0x33
113da089c14SMark Johnston #define	AXGE_CLK_SELECT_BCS		0x01
114da089c14SMark Johnston #define	AXGE_CLK_SELECT_ACS		0x02
115da089c14SMark Johnston #define	AXGE_CLK_SELECT_ACSREQ		0x10
116da089c14SMark Johnston #define	AXGE_CLK_SELECT_ULR		0x08
117da089c14SMark Johnston 
118d32048bbSKevin Lo /* COE Rx control register */
119d32048bbSKevin Lo #define	AXGE_CRCR			0x34
120d32048bbSKevin Lo #define	CRCR_IP				0x01
121d32048bbSKevin Lo #define	CRCR_TCP			0x02
122d32048bbSKevin Lo #define	CRCR_UDP			0x04
123d32048bbSKevin Lo #define	CRCR_ICMP			0x08
124d32048bbSKevin Lo #define	CRCR_IGMP			0x10
125d32048bbSKevin Lo #define	CRCR_TCPV6			0x20
126d32048bbSKevin Lo #define	CRCR_UDPV6			0x40
127d32048bbSKevin Lo #define	CRCR_ICMPV6			0x80
128da089c14SMark Johnston 
129d32048bbSKevin Lo /* COE Tx control register */
130d32048bbSKevin Lo #define	AXGE_CTCR			0x35
131d32048bbSKevin Lo #define	CTCR_IP				0x01
132d32048bbSKevin Lo #define	CTCR_TCP			0x02
133d32048bbSKevin Lo #define	CTCR_UDP			0x04
134d32048bbSKevin Lo #define	CTCR_ICMP			0x08
135d32048bbSKevin Lo #define	CTCR_IGMP			0x10
136d32048bbSKevin Lo #define	CTCR_TCPV6			0x20
137d32048bbSKevin Lo #define	CTCR_UDPV6			0x40
138d32048bbSKevin Lo #define	CTCR_ICMPV6			0x80
139da089c14SMark Johnston 
140d32048bbSKevin Lo /* Pause water level high register */
141d32048bbSKevin Lo #define	AXGE_PWLHR			0x54
142da089c14SMark Johnston 
143d32048bbSKevin Lo /* Pause water level low register */
144d32048bbSKevin Lo #define	AXGE_PWLLR			0x55
145da089c14SMark Johnston 
146da089c14SMark Johnston #define	AXGE_CONFIG_IDX			0	/* config number 1 */
147da089c14SMark Johnston #define	AXGE_IFACE_IDX			0
148da089c14SMark Johnston 
149da089c14SMark Johnston #define	GET_MII(sc)		uether_getmii(&(sc)->sc_ue)
150da089c14SMark Johnston 
151da089c14SMark Johnston /* The interrupt endpoint is currently unused by the ASIX part. */
152da089c14SMark Johnston enum {
153da089c14SMark Johnston 	AXGE_BULK_DT_WR,
154da089c14SMark Johnston 	AXGE_BULK_DT_RD,
155da089c14SMark Johnston 	AXGE_N_TRANSFER,
156da089c14SMark Johnston };
157da089c14SMark Johnston 
1587c10cf8cSPyun YongHyeon #define	AXGE_N_FRAMES	16
1597c10cf8cSPyun YongHyeon 
1607c10cf8cSPyun YongHyeon struct axge_frame_txhdr {
1617c10cf8cSPyun YongHyeon 	uint32_t		len;
162b06ccf79SPyun YongHyeon #define	AXGE_TXLEN_MASK		0x0001FFFF
163b06ccf79SPyun YongHyeon #define	AXGE_VLAN_INSERT	0x20000000
164b06ccf79SPyun YongHyeon #define	AXGE_CSUM_DISABLE	0x80000000
165ac14c068SPyun YongHyeon 	uint32_t		mss;
166b06ccf79SPyun YongHyeon #define	AXGE_MSS_MASK		0x00003FFF
167b06ccf79SPyun YongHyeon #define	AXGE_PADDING		0x80008000
168b06ccf79SPyun YongHyeon #define	AXGE_VLAN_TAG_MASK	0xFFFF0000
169ac14c068SPyun YongHyeon } __packed;
170b06ccf79SPyun YongHyeon 
1717c10cf8cSPyun YongHyeon #define	AXGE_TXBYTES(x)		((x) & AXGE_TXLEN_MASK)
1727c10cf8cSPyun YongHyeon 
173a42c5d9fSPyun YongHyeon #define	AXGE_PHY_ADDR		3
174a42c5d9fSPyun YongHyeon 
175a5d82655SPyun YongHyeon struct axge_frame_rxhdr {
176a5d82655SPyun YongHyeon 	uint32_t		status;
177a5d82655SPyun YongHyeon #define	AXGE_RX_L4_CSUM_ERR	0x00000001
178a5d82655SPyun YongHyeon #define	AXGE_RX_L3_CSUM_ERR	0x00000002
179a5d82655SPyun YongHyeon #define	AXGE_RX_L4_TYPE_UDP	0x00000004
180a5d82655SPyun YongHyeon #define	AXGE_RX_L4_TYPE_ICMP	0x00000008
181a5d82655SPyun YongHyeon #define	AXGE_RX_L4_TYPE_IGMP	0x0000000C
182a5d82655SPyun YongHyeon #define	AXGE_RX_L4_TYPE_TCP	0x00000010
183a5d82655SPyun YongHyeon #define	AXGE_RX_L4_TYPE_MASK	0x0000001C
184a5d82655SPyun YongHyeon #define	AXGE_RX_L3_TYPE_IPV4	0x00000020
185a5d82655SPyun YongHyeon #define	AXGE_RX_L3_TYPE_IPV6	0x00000040
186a5d82655SPyun YongHyeon #define	AXGE_RX_L3_TYPE_MASK	0x00000060
187a5d82655SPyun YongHyeon #define	AXGE_RX_VLAN_IND_MASK	0x00000700
188a5d82655SPyun YongHyeon #define	AXGE_RX_GOOD_PKT	0x00000800
189a5d82655SPyun YongHyeon #define	AXGE_RX_VLAN_PRI_MASK	0x00007000
190a5d82655SPyun YongHyeon #define	AXGE_RX_MBCAST		0x00008000
191a5d82655SPyun YongHyeon #define	AXGE_RX_LEN_MASK	0x1FFF0000
192a5d82655SPyun YongHyeon #define	AXGE_RX_CRC_ERR		0x20000000
193a5d82655SPyun YongHyeon #define	AXGE_RX_MII_ERR		0x40000000
194a5d82655SPyun YongHyeon #define	AXGE_RX_DROP_PKT	0x80000000
195a5d82655SPyun YongHyeon #define	AXGE_RX_LEN_SHIFT	16
196a5d82655SPyun YongHyeon } __packed;
197a5d82655SPyun YongHyeon 
198a5d82655SPyun YongHyeon #define	AXGE_RXBYTES(x)		(((x) & AXGE_RX_LEN_MASK) >> AXGE_RX_LEN_SHIFT)
199a5d82655SPyun YongHyeon #define	AXGE_RX_ERR(x)		\
200a5d82655SPyun YongHyeon 	    ((x) & (AXGE_RX_CRC_ERR | AXGE_RX_MII_ERR | AXGE_RX_DROP_PKT))
201a5d82655SPyun YongHyeon 
202da089c14SMark Johnston struct axge_softc {
203da089c14SMark Johnston 	struct usb_ether	sc_ue;
204da089c14SMark Johnston 	struct mtx		sc_mtx;
205da089c14SMark Johnston 	struct usb_xfer		*sc_xfer[AXGE_N_TRANSFER];
206da089c14SMark Johnston 
207da089c14SMark Johnston 	int			sc_flags;
208da089c14SMark Johnston #define	AXGE_FLAG_LINK		0x0001	/* got a link */
209*6962da91SDamien Broka #define	AXGE_FLAG_178A		0x1000	/* AX88178A */
210*6962da91SDamien Broka #define	AXGE_FLAG_179		0x2000	/* AX88179 */
211*6962da91SDamien Broka #define	AXGE_FLAG_179A		0x4000	/* AX88179A */
212da089c14SMark Johnston };
213da089c14SMark Johnston 
214da089c14SMark Johnston #define	AXGE_LOCK(_sc)			mtx_lock(&(_sc)->sc_mtx)
215da089c14SMark Johnston #define	AXGE_UNLOCK(_sc)		mtx_unlock(&(_sc)->sc_mtx)
216da089c14SMark Johnston #define	AXGE_LOCK_ASSERT(_sc, t)	mtx_assert(&(_sc)->sc_mtx, t)
217