xref: /rk3399_rockchip-uboot/drivers/usb/eth/lan7x.h (revision 248a3f6c7ce01965f0303416645c8884013acabb)
1*d2c31979SYuiko Oshino /*
2*d2c31979SYuiko Oshino  * Copyright (c) 2017 Microchip Technology Inc. All rights reserved.
3*d2c31979SYuiko Oshino  *
4*d2c31979SYuiko Oshino  * SPDX-License-Identifier:	GPL-2.0+
5*d2c31979SYuiko Oshino  */
6*d2c31979SYuiko Oshino 
7*d2c31979SYuiko Oshino #include <console.h>
8*d2c31979SYuiko Oshino #include <watchdog.h>
9*d2c31979SYuiko Oshino 
10*d2c31979SYuiko Oshino /* USB Vendor Requests */
11*d2c31979SYuiko Oshino #define USB_VENDOR_REQUEST_WRITE_REGISTER	0xA0
12*d2c31979SYuiko Oshino #define USB_VENDOR_REQUEST_READ_REGISTER	0xA1
13*d2c31979SYuiko Oshino #define USB_VENDOR_REQUEST_GET_STATS		0xA2
14*d2c31979SYuiko Oshino 
15*d2c31979SYuiko Oshino /* Tx Command A */
16*d2c31979SYuiko Oshino #define TX_CMD_A_FCS			BIT(22)
17*d2c31979SYuiko Oshino #define TX_CMD_A_LEN_MASK		0x000FFFFF
18*d2c31979SYuiko Oshino 
19*d2c31979SYuiko Oshino /* Rx Command A */
20*d2c31979SYuiko Oshino #define RX_CMD_A_RXE			BIT(18)
21*d2c31979SYuiko Oshino #define RX_CMD_A_LEN_MASK		0x00003FFF
22*d2c31979SYuiko Oshino 
23*d2c31979SYuiko Oshino /* SCSRs */
24*d2c31979SYuiko Oshino #define ID_REV				0x00
25*d2c31979SYuiko Oshino #define ID_REV_CHIP_ID_MASK		0xFFFF0000
26*d2c31979SYuiko Oshino #define ID_REV_CHIP_ID_7500		0x7500
27*d2c31979SYuiko Oshino #define ID_REV_CHIP_ID_7800		0x7800
28*d2c31979SYuiko Oshino #define ID_REV_CHIP_ID_7850		0x7850
29*d2c31979SYuiko Oshino 
30*d2c31979SYuiko Oshino #define INT_STS				0x0C
31*d2c31979SYuiko Oshino 
32*d2c31979SYuiko Oshino #define HW_CFG				0x010
33*d2c31979SYuiko Oshino #define HW_CFG_LRST			BIT(1)
34*d2c31979SYuiko Oshino 
35*d2c31979SYuiko Oshino #define PMT_CTL				0x014
36*d2c31979SYuiko Oshino #define PMT_CTL_PHY_PWRUP		BIT(10)
37*d2c31979SYuiko Oshino #define PMT_CTL_READY			BIT(7)
38*d2c31979SYuiko Oshino #define PMT_CTL_PHY_RST			BIT(4)
39*d2c31979SYuiko Oshino 
40*d2c31979SYuiko Oshino #define E2P_CMD				0x040
41*d2c31979SYuiko Oshino #define E2P_CMD_EPC_BUSY		BIT(31)
42*d2c31979SYuiko Oshino #define E2P_CMD_EPC_CMD_READ		0x00000000
43*d2c31979SYuiko Oshino #define E2P_CMD_EPC_TIMEOUT		BIT(10)
44*d2c31979SYuiko Oshino #define E2P_CMD_EPC_ADDR_MASK		0x000001FF
45*d2c31979SYuiko Oshino 
46*d2c31979SYuiko Oshino #define E2P_DATA			0x044
47*d2c31979SYuiko Oshino 
48*d2c31979SYuiko Oshino #define RFE_CTL_BCAST_EN		BIT(10)
49*d2c31979SYuiko Oshino #define RFE_CTL_DA_PERFECT		BIT(1)
50*d2c31979SYuiko Oshino 
51*d2c31979SYuiko Oshino #define FCT_RX_CTL_EN			BIT(31)
52*d2c31979SYuiko Oshino 
53*d2c31979SYuiko Oshino #define FCT_TX_CTL_EN			BIT(31)
54*d2c31979SYuiko Oshino 
55*d2c31979SYuiko Oshino #define MAC_CR				0x100
56*d2c31979SYuiko Oshino #define MAC_CR_ADP			BIT(13)
57*d2c31979SYuiko Oshino #define MAC_CR_AUTO_DUPLEX		BIT(12)
58*d2c31979SYuiko Oshino #define MAC_CR_AUTO_SPEED		BIT(11)
59*d2c31979SYuiko Oshino 
60*d2c31979SYuiko Oshino #define MAC_RX				0x104
61*d2c31979SYuiko Oshino #define MAC_RX_FCS_STRIP		BIT(4)
62*d2c31979SYuiko Oshino #define MAC_RX_RXEN			BIT(0)
63*d2c31979SYuiko Oshino 
64*d2c31979SYuiko Oshino #define MAC_TX				0x108
65*d2c31979SYuiko Oshino #define MAC_TX_TXEN			BIT(0)
66*d2c31979SYuiko Oshino 
67*d2c31979SYuiko Oshino #define FLOW				0x10C
68*d2c31979SYuiko Oshino #define FLOW_CR_TX_FCEN			BIT(30)
69*d2c31979SYuiko Oshino #define FLOW_CR_RX_FCEN			BIT(29)
70*d2c31979SYuiko Oshino 
71*d2c31979SYuiko Oshino #define RX_ADDRH			0x118
72*d2c31979SYuiko Oshino #define RX_ADDRL			0x11C
73*d2c31979SYuiko Oshino 
74*d2c31979SYuiko Oshino #define MII_ACC				0x120
75*d2c31979SYuiko Oshino #define MII_ACC_MII_READ		0x00000000
76*d2c31979SYuiko Oshino #define MII_ACC_MII_WRITE		0x00000002
77*d2c31979SYuiko Oshino #define MII_ACC_MII_BUSY		BIT(0)
78*d2c31979SYuiko Oshino 
79*d2c31979SYuiko Oshino #define MII_DATA			0x124
80*d2c31979SYuiko Oshino 
81*d2c31979SYuiko Oshino #define SS_USB_PKT_SIZE			1024
82*d2c31979SYuiko Oshino #define HS_USB_PKT_SIZE			512
83*d2c31979SYuiko Oshino #define FS_USB_PKT_SIZE			64
84*d2c31979SYuiko Oshino 
85*d2c31979SYuiko Oshino #define MAX_RX_FIFO_SIZE		(12 * 1024)
86*d2c31979SYuiko Oshino #define MAX_TX_FIFO_SIZE		(12 * 1024)
87*d2c31979SYuiko Oshino #define DEFAULT_BULK_IN_DELAY		0x0800
88*d2c31979SYuiko Oshino 
89*d2c31979SYuiko Oshino #define EEPROM_INDICATOR		0xA5
90*d2c31979SYuiko Oshino #define EEPROM_MAC_OFFSET		0x01
91*d2c31979SYuiko Oshino 
92*d2c31979SYuiko Oshino /* Some extra defines */
93*d2c31979SYuiko Oshino #define LAN7X_INTERNAL_PHY_ID		1
94*d2c31979SYuiko Oshino 
95*d2c31979SYuiko Oshino #define LAN7X_MAC_RX_MAX_SIZE(mtu) \
96*d2c31979SYuiko Oshino 	((mtu) << 16)			/* Max frame size */
97*d2c31979SYuiko Oshino #define LAN7X_MAC_RX_MAX_SIZE_DEFAULT \
98*d2c31979SYuiko Oshino 	LAN7X_MAC_RX_MAX_SIZE(ETH_FRAME_LEN + 4 /* VLAN */ + 4 /* CRC */)
99*d2c31979SYuiko Oshino 
100*d2c31979SYuiko Oshino /* Timeouts */
101*d2c31979SYuiko Oshino #define USB_CTRL_SET_TIMEOUT_MS		5000
102*d2c31979SYuiko Oshino #define USB_CTRL_GET_TIMEOUT_MS		5000
103*d2c31979SYuiko Oshino #define USB_BULK_SEND_TIMEOUT_MS	5000
104*d2c31979SYuiko Oshino #define USB_BULK_RECV_TIMEOUT_MS	5000
105*d2c31979SYuiko Oshino #define TIMEOUT_RESOLUTION_MS		50
106*d2c31979SYuiko Oshino #define PHY_CONNECT_TIMEOUT_MS		5000
107*d2c31979SYuiko Oshino 
108*d2c31979SYuiko Oshino #define RX_URB_SIZE	2048
109*d2c31979SYuiko Oshino 
110*d2c31979SYuiko Oshino /* driver private */
111*d2c31979SYuiko Oshino struct lan7x_private {
112*d2c31979SYuiko Oshino 	struct ueth_data ueth;
113*d2c31979SYuiko Oshino 	u32 chipid;		/* Chip or device ID */
114*d2c31979SYuiko Oshino 	struct mii_dev *mdiobus;
115*d2c31979SYuiko Oshino 	struct phy_device *phydev;
116*d2c31979SYuiko Oshino };
117*d2c31979SYuiko Oshino 
118*d2c31979SYuiko Oshino /*
119*d2c31979SYuiko Oshino  * Lan7x infrastructure commands
120*d2c31979SYuiko Oshino  */
121*d2c31979SYuiko Oshino 
122*d2c31979SYuiko Oshino int lan7x_write_reg(struct usb_device *udev, u32 index, u32 data);
123*d2c31979SYuiko Oshino 
124*d2c31979SYuiko Oshino int lan7x_read_reg(struct usb_device *udev, u32 index, u32 *data);
125*d2c31979SYuiko Oshino 
lan7x_wait_for_bit(struct usb_device * udev,const char * prefix,const u32 reg,const u32 mask,const bool set,const unsigned int timeout_ms,const bool breakable)126*d2c31979SYuiko Oshino static inline int lan7x_wait_for_bit(struct usb_device *udev,
127*d2c31979SYuiko Oshino 				     const char *prefix, const u32 reg,
128*d2c31979SYuiko Oshino 				     const u32 mask, const bool set,
129*d2c31979SYuiko Oshino 				     const unsigned int timeout_ms,
130*d2c31979SYuiko Oshino 				     const bool breakable)
131*d2c31979SYuiko Oshino {
132*d2c31979SYuiko Oshino 	u32 val;
133*d2c31979SYuiko Oshino 	unsigned long start = get_timer(0);
134*d2c31979SYuiko Oshino 
135*d2c31979SYuiko Oshino 	while (1) {
136*d2c31979SYuiko Oshino 		lan7x_read_reg(udev, reg, &val);
137*d2c31979SYuiko Oshino 
138*d2c31979SYuiko Oshino 		if (!set)
139*d2c31979SYuiko Oshino 			val = ~val;
140*d2c31979SYuiko Oshino 
141*d2c31979SYuiko Oshino 		if ((val & mask) == mask)
142*d2c31979SYuiko Oshino 			return 0;
143*d2c31979SYuiko Oshino 
144*d2c31979SYuiko Oshino 		if (get_timer(start) > timeout_ms)
145*d2c31979SYuiko Oshino 			break;
146*d2c31979SYuiko Oshino 
147*d2c31979SYuiko Oshino 		if (breakable && ctrlc()) {
148*d2c31979SYuiko Oshino 			puts("Abort\n");
149*d2c31979SYuiko Oshino 			return -EINTR;
150*d2c31979SYuiko Oshino 		}
151*d2c31979SYuiko Oshino 
152*d2c31979SYuiko Oshino 		udelay(1);
153*d2c31979SYuiko Oshino 		WATCHDOG_RESET();
154*d2c31979SYuiko Oshino 	}
155*d2c31979SYuiko Oshino 
156*d2c31979SYuiko Oshino 	debug("%s: Timeout (reg=0x%x mask=%08x wait_set=%i)\n", prefix, reg,
157*d2c31979SYuiko Oshino 	      mask, set);
158*d2c31979SYuiko Oshino 
159*d2c31979SYuiko Oshino 	return -ETIMEDOUT;
160*d2c31979SYuiko Oshino }
161*d2c31979SYuiko Oshino 
162*d2c31979SYuiko Oshino int lan7x_mdio_read(struct usb_device *udev, int phy_id, int idx);
163*d2c31979SYuiko Oshino 
164*d2c31979SYuiko Oshino void lan7x_mdio_write(struct usb_device *udev, int phy_id, int idx,
165*d2c31979SYuiko Oshino 		      int regval);
166*d2c31979SYuiko Oshino 
lan7x_mdio_wait_for_bit(struct usb_device * udev,const char * prefix,int phy_id,const u32 reg,const u32 mask,const bool set,const unsigned int timeout_ms,const bool breakable)167*d2c31979SYuiko Oshino static inline int lan7x_mdio_wait_for_bit(struct usb_device *udev,
168*d2c31979SYuiko Oshino 					  const char *prefix,
169*d2c31979SYuiko Oshino 					  int phy_id, const u32 reg,
170*d2c31979SYuiko Oshino 					  const u32 mask, const bool set,
171*d2c31979SYuiko Oshino 					  const unsigned int timeout_ms,
172*d2c31979SYuiko Oshino 					  const bool breakable)
173*d2c31979SYuiko Oshino {
174*d2c31979SYuiko Oshino 	u32 val;
175*d2c31979SYuiko Oshino 	unsigned long start = get_timer(0);
176*d2c31979SYuiko Oshino 
177*d2c31979SYuiko Oshino 	while (1) {
178*d2c31979SYuiko Oshino 		val = lan7x_mdio_read(udev, phy_id, reg);
179*d2c31979SYuiko Oshino 
180*d2c31979SYuiko Oshino 		if (!set)
181*d2c31979SYuiko Oshino 			val = ~val;
182*d2c31979SYuiko Oshino 
183*d2c31979SYuiko Oshino 		if ((val & mask) == mask)
184*d2c31979SYuiko Oshino 			return 0;
185*d2c31979SYuiko Oshino 
186*d2c31979SYuiko Oshino 		if (get_timer(start) > timeout_ms)
187*d2c31979SYuiko Oshino 			break;
188*d2c31979SYuiko Oshino 
189*d2c31979SYuiko Oshino 		if (breakable && ctrlc()) {
190*d2c31979SYuiko Oshino 			puts("Abort\n");
191*d2c31979SYuiko Oshino 			return -EINTR;
192*d2c31979SYuiko Oshino 		}
193*d2c31979SYuiko Oshino 
194*d2c31979SYuiko Oshino 		udelay(1);
195*d2c31979SYuiko Oshino 		WATCHDOG_RESET();
196*d2c31979SYuiko Oshino 	}
197*d2c31979SYuiko Oshino 
198*d2c31979SYuiko Oshino 	debug("%s: Timeout (reg=0x%x mask=%08x wait_set=%i)\n", prefix, reg,
199*d2c31979SYuiko Oshino 	      mask, set);
200*d2c31979SYuiko Oshino 
201*d2c31979SYuiko Oshino 	return -ETIMEDOUT;
202*d2c31979SYuiko Oshino }
203*d2c31979SYuiko Oshino 
204*d2c31979SYuiko Oshino int lan7x_phylib_register(struct udevice *udev);
205*d2c31979SYuiko Oshino 
206*d2c31979SYuiko Oshino int lan7x_eth_phylib_connect(struct udevice *udev, struct ueth_data *dev);
207*d2c31979SYuiko Oshino 
208*d2c31979SYuiko Oshino int lan7x_eth_phylib_config_start(struct udevice *udev);
209*d2c31979SYuiko Oshino 
210*d2c31979SYuiko Oshino int lan7x_pmt_phy_reset(struct usb_device *udev,
211*d2c31979SYuiko Oshino 			struct ueth_data *dev);
212*d2c31979SYuiko Oshino 
213*d2c31979SYuiko Oshino int lan7x_update_flowcontrol(struct usb_device *udev,
214*d2c31979SYuiko Oshino 			     struct ueth_data *dev,
215*d2c31979SYuiko Oshino 			     uint32_t *flow, uint32_t *fct_flow);
216*d2c31979SYuiko Oshino 
217*d2c31979SYuiko Oshino int lan7x_read_eeprom_mac(unsigned char *enetaddr, struct usb_device *udev);
218*d2c31979SYuiko Oshino 
219*d2c31979SYuiko Oshino int lan7x_basic_reset(struct usb_device *udev,
220*d2c31979SYuiko Oshino 		      struct ueth_data *dev);
221*d2c31979SYuiko Oshino 
222*d2c31979SYuiko Oshino void lan7x_eth_stop(struct udevice *dev);
223*d2c31979SYuiko Oshino 
224*d2c31979SYuiko Oshino int lan7x_eth_send(struct udevice *dev, void *packet, int length);
225*d2c31979SYuiko Oshino 
226*d2c31979SYuiko Oshino int lan7x_eth_recv(struct udevice *dev, int flags, uchar **packetp);
227*d2c31979SYuiko Oshino 
228*d2c31979SYuiko Oshino int lan7x_free_pkt(struct udevice *dev, uchar *packet, int packet_len);
229*d2c31979SYuiko Oshino 
230*d2c31979SYuiko Oshino int lan7x_eth_remove(struct udevice *dev);
231