xref: /openbmc/linux/drivers/net/phy/motorcomm.c (revision ac73d4bf2cdaf2cb8a43df8ee4a5c066d2c5d7b4)
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Motorcomm 8511/8521 PHY driver.
4  *
5  * Author: Peter Geis <pgwipeout@gmail.com>
6  * Author: Frank <Frank.Sae@motor-comm.com>
7  */
8 
9 #include <linux/etherdevice.h>
10 #include <linux/kernel.h>
11 #include <linux/module.h>
12 #include <linux/phy.h>
13 
14 #define PHY_ID_YT8511		0x0000010a
15 #define PHY_ID_YT8521				0x0000011A
16 
17 /* YT8521 Register Overview
18  *	UTP Register space	|	FIBER Register space
19  *  ------------------------------------------------------------
20  * |	UTP MII			|	FIBER MII		|
21  * |	UTP MMD			|				|
22  * |	UTP Extended		|	FIBER Extended		|
23  *  ------------------------------------------------------------
24  * |			Common Extended				|
25  *  ------------------------------------------------------------
26  */
27 
28 /* 0x10 ~ 0x15 , 0x1E and 0x1F are common MII registers of yt phy */
29 
30 /* Specific Function Control Register */
31 #define YTPHY_SPECIFIC_FUNCTION_CONTROL_REG	0x10
32 
33 /* 2b00 Manual MDI configuration
34  * 2b01 Manual MDIX configuration
35  * 2b10 Reserved
36  * 2b11 Enable automatic crossover for all modes  *default*
37  */
38 #define YTPHY_SFCR_MDI_CROSSOVER_MODE_MASK	(BIT(6) | BIT(5))
39 #define YTPHY_SFCR_CROSSOVER_EN			BIT(3)
40 #define YTPHY_SFCR_SQE_TEST_EN			BIT(2)
41 #define YTPHY_SFCR_POLARITY_REVERSAL_EN		BIT(1)
42 #define YTPHY_SFCR_JABBER_DIS			BIT(0)
43 
44 /* Specific Status Register */
45 #define YTPHY_SPECIFIC_STATUS_REG		0x11
46 #define YTPHY_SSR_SPEED_MODE_OFFSET		14
47 
48 #define YTPHY_SSR_SPEED_MODE_MASK		(BIT(15) | BIT(14))
49 #define YTPHY_SSR_SPEED_10M			0x0
50 #define YTPHY_SSR_SPEED_100M			0x1
51 #define YTPHY_SSR_SPEED_1000M			0x2
52 #define YTPHY_SSR_DUPLEX_OFFSET			13
53 #define YTPHY_SSR_DUPLEX			BIT(13)
54 #define YTPHY_SSR_PAGE_RECEIVED			BIT(12)
55 #define YTPHY_SSR_SPEED_DUPLEX_RESOLVED		BIT(11)
56 #define YTPHY_SSR_LINK				BIT(10)
57 #define YTPHY_SSR_MDIX_CROSSOVER		BIT(6)
58 #define YTPHY_SSR_DOWNGRADE			BIT(5)
59 #define YTPHY_SSR_TRANSMIT_PAUSE		BIT(3)
60 #define YTPHY_SSR_RECEIVE_PAUSE			BIT(2)
61 #define YTPHY_SSR_POLARITY			BIT(1)
62 #define YTPHY_SSR_JABBER			BIT(0)
63 
64 /* Interrupt enable Register */
65 #define YTPHY_INTERRUPT_ENABLE_REG		0x12
66 #define YTPHY_IER_WOL				BIT(6)
67 
68 /* Interrupt Status Register */
69 #define YTPHY_INTERRUPT_STATUS_REG		0x13
70 #define YTPHY_ISR_AUTONEG_ERR			BIT(15)
71 #define YTPHY_ISR_SPEED_CHANGED			BIT(14)
72 #define YTPHY_ISR_DUPLEX_CHANGED		BIT(13)
73 #define YTPHY_ISR_PAGE_RECEIVED			BIT(12)
74 #define YTPHY_ISR_LINK_FAILED			BIT(11)
75 #define YTPHY_ISR_LINK_SUCCESSED		BIT(10)
76 #define YTPHY_ISR_WOL				BIT(6)
77 #define YTPHY_ISR_WIRESPEED_DOWNGRADE		BIT(5)
78 #define YTPHY_ISR_SERDES_LINK_FAILED		BIT(3)
79 #define YTPHY_ISR_SERDES_LINK_SUCCESSED		BIT(2)
80 #define YTPHY_ISR_POLARITY_CHANGED		BIT(1)
81 #define YTPHY_ISR_JABBER_HAPPENED		BIT(0)
82 
83 /* Speed Auto Downgrade Control Register */
84 #define YTPHY_SPEED_AUTO_DOWNGRADE_CONTROL_REG	0x14
85 #define YTPHY_SADCR_SPEED_DOWNGRADE_EN		BIT(5)
86 
87 /* If these bits are set to 3, the PHY attempts five times ( 3(set value) +
88  * additional 2) before downgrading, default 0x3
89  */
90 #define YTPHY_SADCR_SPEED_RETRY_LIMIT		(0x3 << 2)
91 
92 /* Rx Error Counter Register */
93 #define YTPHY_RX_ERROR_COUNTER_REG		0x15
94 
95 /* Extended Register's Address Offset Register */
96 #define YTPHY_PAGE_SELECT			0x1E
97 
98 /* Extended Register's Data Register */
99 #define YTPHY_PAGE_DATA				0x1F
100 
101 /* FIBER Auto-Negotiation link partner ability */
102 #define YTPHY_FLPA_PAUSE			(0x3 << 7)
103 #define YTPHY_FLPA_ASYM_PAUSE			(0x2 << 7)
104 
105 #define YT8511_PAGE_SELECT	0x1e
106 #define YT8511_PAGE		0x1f
107 #define YT8511_EXT_CLK_GATE	0x0c
108 #define YT8511_EXT_DELAY_DRIVE	0x0d
109 #define YT8511_EXT_SLEEP_CTRL	0x27
110 
111 /* 2b00 25m from pll
112  * 2b01 25m from xtl *default*
113  * 2b10 62.m from pll
114  * 2b11 125m from pll
115  */
116 #define YT8511_CLK_125M		(BIT(2) | BIT(1))
117 #define YT8511_PLLON_SLP	BIT(14)
118 
119 /* RX Delay enabled = 1.8ns 1000T, 8ns 10/100T */
120 #define YT8511_DELAY_RX		BIT(0)
121 
122 /* TX Gig-E Delay is bits 7:4, default 0x5
123  * TX Fast-E Delay is bits 15:12, default 0xf
124  * Delay = 150ps * N - 250ps
125  * On = 2000ps, off = 50ps
126  */
127 #define YT8511_DELAY_GE_TX_EN	(0xf << 4)
128 #define YT8511_DELAY_GE_TX_DIS	(0x2 << 4)
129 #define YT8511_DELAY_FE_TX_EN	(0xf << 12)
130 #define YT8511_DELAY_FE_TX_DIS	(0x2 << 12)
131 
132 /* Extended register is different from MMD Register and MII Register.
133  * We can use ytphy_read_ext/ytphy_write_ext/ytphy_modify_ext function to
134  * operate extended register.
135  * Extended Register  start
136  */
137 
138 /* Phy gmii clock gating Register */
139 #define YT8521_CLOCK_GATING_REG			0xC
140 #define YT8521_CGR_RX_CLK_EN			BIT(12)
141 
142 #define YT8521_EXTREG_SLEEP_CONTROL1_REG	0x27
143 #define YT8521_ESC1R_SLEEP_SW			BIT(15)
144 #define YT8521_ESC1R_PLLON_SLP			BIT(14)
145 
146 /* Phy fiber Link timer cfg2 Register */
147 #define YT8521_LINK_TIMER_CFG2_REG		0xA5
148 #define YT8521_LTCR_EN_AUTOSEN			BIT(15)
149 
150 /* 0xA000, 0xA001, 0xA003 ,and 0xA006 ~ 0xA00A  are common ext registers
151  * of yt8521 phy. There is no need to switch reg space when operating these
152  * registers.
153  */
154 
155 #define YT8521_REG_SPACE_SELECT_REG		0xA000
156 #define YT8521_RSSR_SPACE_MASK			BIT(1)
157 #define YT8521_RSSR_FIBER_SPACE			(0x1 << 1)
158 #define YT8521_RSSR_UTP_SPACE			(0x0 << 1)
159 #define YT8521_RSSR_TO_BE_ARBITRATED		(0xFF)
160 
161 #define YT8521_CHIP_CONFIG_REG			0xA001
162 #define YT8521_CCR_SW_RST			BIT(15)
163 
164 #define YT8521_CCR_MODE_SEL_MASK		(BIT(2) | BIT(1) | BIT(0))
165 #define YT8521_CCR_MODE_UTP_TO_RGMII		0
166 #define YT8521_CCR_MODE_FIBER_TO_RGMII		1
167 #define YT8521_CCR_MODE_UTP_FIBER_TO_RGMII	2
168 #define YT8521_CCR_MODE_UTP_TO_SGMII		3
169 #define YT8521_CCR_MODE_SGPHY_TO_RGMAC		4
170 #define YT8521_CCR_MODE_SGMAC_TO_RGPHY		5
171 #define YT8521_CCR_MODE_UTP_TO_FIBER_AUTO	6
172 #define YT8521_CCR_MODE_UTP_TO_FIBER_FORCE	7
173 
174 /* 3 phy polling modes,poll mode combines utp and fiber mode*/
175 #define YT8521_MODE_FIBER			0x1
176 #define YT8521_MODE_UTP				0x2
177 #define YT8521_MODE_POLL			0x3
178 
179 #define YT8521_RGMII_CONFIG1_REG		0xA003
180 
181 /* TX Gig-E Delay is bits 3:0, default 0x1
182  * TX Fast-E Delay is bits 7:4, default 0xf
183  * RX Delay is bits 13:10, default 0x0
184  * Delay = 150ps * N
185  * On = 2250ps, off = 0ps
186  */
187 #define YT8521_RC1R_RX_DELAY_MASK		(0xF << 10)
188 #define YT8521_RC1R_RX_DELAY_EN			(0xF << 10)
189 #define YT8521_RC1R_RX_DELAY_DIS		(0x0 << 10)
190 #define YT8521_RC1R_FE_TX_DELAY_MASK		(0xF << 4)
191 #define YT8521_RC1R_FE_TX_DELAY_EN		(0xF << 4)
192 #define YT8521_RC1R_FE_TX_DELAY_DIS		(0x0 << 4)
193 #define YT8521_RC1R_GE_TX_DELAY_MASK		(0xF << 0)
194 #define YT8521_RC1R_GE_TX_DELAY_EN		(0xF << 0)
195 #define YT8521_RC1R_GE_TX_DELAY_DIS		(0x0 << 0)
196 
197 #define YTPHY_MISC_CONFIG_REG			0xA006
198 #define YTPHY_MCR_FIBER_SPEED_MASK		BIT(0)
199 #define YTPHY_MCR_FIBER_1000BX			(0x1 << 0)
200 #define YTPHY_MCR_FIBER_100FX			(0x0 << 0)
201 
202 /* WOL MAC ADDR: MACADDR2(highest), MACADDR1(middle), MACADDR0(lowest) */
203 #define YTPHY_WOL_MACADDR2_REG			0xA007
204 #define YTPHY_WOL_MACADDR1_REG			0xA008
205 #define YTPHY_WOL_MACADDR0_REG			0xA009
206 
207 #define YTPHY_WOL_CONFIG_REG			0xA00A
208 #define YTPHY_WCR_INTR_SEL			BIT(6)
209 #define YTPHY_WCR_ENABLE			BIT(3)
210 
211 /* 2b00 84ms
212  * 2b01 168ms  *default*
213  * 2b10 336ms
214  * 2b11 672ms
215  */
216 #define YTPHY_WCR_PULSE_WIDTH_MASK		(BIT(2) | BIT(1))
217 #define YTPHY_WCR_PULSE_WIDTH_672MS		(BIT(2) | BIT(1))
218 
219 /* 1b0 Interrupt and WOL events is level triggered and active LOW  *default*
220  * 1b1 Interrupt and WOL events is pulse triggered and active LOW
221  */
222 #define YTPHY_WCR_TYPE_PULSE			BIT(0)
223 
224 /* Extended Register  end */
225 
226 struct yt8521_priv {
227 	/* combo_advertising is used for case of YT8521 in combo mode,
228 	 * this means that yt8521 may work in utp or fiber mode which depends
229 	 * on which media is connected (YT8521_RSSR_TO_BE_ARBITRATED).
230 	 */
231 	__ETHTOOL_DECLARE_LINK_MODE_MASK(combo_advertising);
232 
233 	/* YT8521_MODE_FIBER / YT8521_MODE_UTP / YT8521_MODE_POLL*/
234 	u8 polling_mode;
235 	u8 strap_mode; /* 8 working modes  */
236 	/* current reg page of yt8521 phy:
237 	 * YT8521_RSSR_UTP_SPACE
238 	 * YT8521_RSSR_FIBER_SPACE
239 	 * YT8521_RSSR_TO_BE_ARBITRATED
240 	 */
241 	u8 reg_page;
242 };
243 
244 /**
245  * ytphy_read_ext() - read a PHY's extended register
246  * @phydev: a pointer to a &struct phy_device
247  * @regnum: register number to read
248  *
249  * NOTE:The caller must have taken the MDIO bus lock.
250  *
251  * returns the value of regnum reg or negative error code
252  */
253 static int ytphy_read_ext(struct phy_device *phydev, u16 regnum)
254 {
255 	int ret;
256 
257 	ret = __phy_write(phydev, YTPHY_PAGE_SELECT, regnum);
258 	if (ret < 0)
259 		return ret;
260 
261 	return __phy_read(phydev, YTPHY_PAGE_DATA);
262 }
263 
264 /**
265  * ytphy_read_ext_with_lock() - read a PHY's extended register
266  * @phydev: a pointer to a &struct phy_device
267  * @regnum: register number to read
268  *
269  * returns the value of regnum reg or negative error code
270  */
271 static int ytphy_read_ext_with_lock(struct phy_device *phydev, u16 regnum)
272 {
273 	int ret;
274 
275 	phy_lock_mdio_bus(phydev);
276 	ret = ytphy_read_ext(phydev, regnum);
277 	phy_unlock_mdio_bus(phydev);
278 
279 	return ret;
280 }
281 
282 /**
283  * ytphy_write_ext() - write a PHY's extended register
284  * @phydev: a pointer to a &struct phy_device
285  * @regnum: register number to write
286  * @val: value to write to @regnum
287  *
288  * NOTE:The caller must have taken the MDIO bus lock.
289  *
290  * returns 0 or negative error code
291  */
292 static int ytphy_write_ext(struct phy_device *phydev, u16 regnum, u16 val)
293 {
294 	int ret;
295 
296 	ret = __phy_write(phydev, YTPHY_PAGE_SELECT, regnum);
297 	if (ret < 0)
298 		return ret;
299 
300 	return __phy_write(phydev, YTPHY_PAGE_DATA, val);
301 }
302 
303 /**
304  * ytphy_write_ext_with_lock() - write a PHY's extended register
305  * @phydev: a pointer to a &struct phy_device
306  * @regnum: register number to write
307  * @val: value to write to @regnum
308  *
309  * returns 0 or negative error code
310  */
311 static int ytphy_write_ext_with_lock(struct phy_device *phydev, u16 regnum,
312 				     u16 val)
313 {
314 	int ret;
315 
316 	phy_lock_mdio_bus(phydev);
317 	ret = ytphy_write_ext(phydev, regnum, val);
318 	phy_unlock_mdio_bus(phydev);
319 
320 	return ret;
321 }
322 
323 /**
324  * ytphy_modify_ext() - bits modify a PHY's extended register
325  * @phydev: a pointer to a &struct phy_device
326  * @regnum: register number to write
327  * @mask: bit mask of bits to clear
328  * @set: bit mask of bits to set
329  *
330  * NOTE: Convenience function which allows a PHY's extended register to be
331  * modified as new register value = (old register value & ~mask) | set.
332  * The caller must have taken the MDIO bus lock.
333  *
334  * returns 0 or negative error code
335  */
336 static int ytphy_modify_ext(struct phy_device *phydev, u16 regnum, u16 mask,
337 			    u16 set)
338 {
339 	int ret;
340 
341 	ret = __phy_write(phydev, YTPHY_PAGE_SELECT, regnum);
342 	if (ret < 0)
343 		return ret;
344 
345 	return __phy_modify(phydev, YTPHY_PAGE_DATA, mask, set);
346 }
347 
348 /**
349  * ytphy_modify_ext_with_lock() - bits modify a PHY's extended register
350  * @phydev: a pointer to a &struct phy_device
351  * @regnum: register number to write
352  * @mask: bit mask of bits to clear
353  * @set: bit mask of bits to set
354  *
355  * NOTE: Convenience function which allows a PHY's extended register to be
356  * modified as new register value = (old register value & ~mask) | set.
357  *
358  * returns 0 or negative error code
359  */
360 static int ytphy_modify_ext_with_lock(struct phy_device *phydev, u16 regnum,
361 				      u16 mask, u16 set)
362 {
363 	int ret;
364 
365 	phy_lock_mdio_bus(phydev);
366 	ret = ytphy_modify_ext(phydev, regnum, mask, set);
367 	phy_unlock_mdio_bus(phydev);
368 
369 	return ret;
370 }
371 
372 /**
373  * ytphy_get_wol() - report whether wake-on-lan is enabled
374  * @phydev: a pointer to a &struct phy_device
375  * @wol: a pointer to a &struct ethtool_wolinfo
376  *
377  * NOTE: YTPHY_WOL_CONFIG_REG is common ext reg.
378  */
379 static void ytphy_get_wol(struct phy_device *phydev,
380 			  struct ethtool_wolinfo *wol)
381 {
382 	int wol_config;
383 
384 	wol->supported = WAKE_MAGIC;
385 	wol->wolopts = 0;
386 
387 	wol_config = ytphy_read_ext_with_lock(phydev, YTPHY_WOL_CONFIG_REG);
388 	if (wol_config < 0)
389 		return;
390 
391 	if (wol_config & YTPHY_WCR_ENABLE)
392 		wol->wolopts |= WAKE_MAGIC;
393 }
394 
395 /**
396  * ytphy_set_wol() - turn wake-on-lan on or off
397  * @phydev: a pointer to a &struct phy_device
398  * @wol: a pointer to a &struct ethtool_wolinfo
399  *
400  * NOTE: YTPHY_WOL_CONFIG_REG, YTPHY_WOL_MACADDR2_REG, YTPHY_WOL_MACADDR1_REG
401  * and YTPHY_WOL_MACADDR0_REG are common ext reg. The
402  * YTPHY_INTERRUPT_ENABLE_REG of UTP is special, fiber also use this register.
403  *
404  * returns 0 or negative errno code
405  */
406 static int ytphy_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol)
407 {
408 	struct net_device *p_attached_dev;
409 	const u16 mac_addr_reg[] = {
410 		YTPHY_WOL_MACADDR2_REG,
411 		YTPHY_WOL_MACADDR1_REG,
412 		YTPHY_WOL_MACADDR0_REG,
413 	};
414 	const u8 *mac_addr;
415 	int old_page;
416 	int ret = 0;
417 	u16 mask;
418 	u16 val;
419 	u8 i;
420 
421 	if (wol->wolopts & WAKE_MAGIC) {
422 		p_attached_dev = phydev->attached_dev;
423 		if (!p_attached_dev)
424 			return -ENODEV;
425 
426 		mac_addr = (const u8 *)p_attached_dev->dev_addr;
427 		if (!is_valid_ether_addr(mac_addr))
428 			return -EINVAL;
429 
430 		/* lock mdio bus then switch to utp reg space */
431 		old_page = phy_select_page(phydev, YT8521_RSSR_UTP_SPACE);
432 		if (old_page < 0)
433 			goto err_restore_page;
434 
435 		/* Store the device address for the magic packet */
436 		for (i = 0; i < 3; i++) {
437 			ret = ytphy_write_ext(phydev, mac_addr_reg[i],
438 					      ((mac_addr[i * 2] << 8)) |
439 						      (mac_addr[i * 2 + 1]));
440 			if (ret < 0)
441 				goto err_restore_page;
442 		}
443 
444 		/* Enable WOL feature */
445 		mask = YTPHY_WCR_PULSE_WIDTH_MASK | YTPHY_WCR_INTR_SEL;
446 		val = YTPHY_WCR_ENABLE | YTPHY_WCR_INTR_SEL;
447 		val |= YTPHY_WCR_TYPE_PULSE | YTPHY_WCR_PULSE_WIDTH_672MS;
448 		ret = ytphy_modify_ext(phydev, YTPHY_WOL_CONFIG_REG, mask, val);
449 		if (ret < 0)
450 			goto err_restore_page;
451 
452 		/* Enable WOL interrupt */
453 		ret = __phy_modify(phydev, YTPHY_INTERRUPT_ENABLE_REG, 0,
454 				   YTPHY_IER_WOL);
455 		if (ret < 0)
456 			goto err_restore_page;
457 
458 	} else {
459 		old_page = phy_select_page(phydev, YT8521_RSSR_UTP_SPACE);
460 		if (old_page < 0)
461 			goto err_restore_page;
462 
463 		/* Disable WOL feature */
464 		mask = YTPHY_WCR_ENABLE | YTPHY_WCR_INTR_SEL;
465 		ret = ytphy_modify_ext(phydev, YTPHY_WOL_CONFIG_REG, mask, 0);
466 
467 		/* Disable WOL interrupt */
468 		ret = __phy_modify(phydev, YTPHY_INTERRUPT_ENABLE_REG,
469 				   YTPHY_IER_WOL, 0);
470 		if (ret < 0)
471 			goto err_restore_page;
472 	}
473 
474 err_restore_page:
475 	return phy_restore_page(phydev, old_page, ret);
476 }
477 
478 static int yt8511_read_page(struct phy_device *phydev)
479 {
480 	return __phy_read(phydev, YT8511_PAGE_SELECT);
481 };
482 
483 static int yt8511_write_page(struct phy_device *phydev, int page)
484 {
485 	return __phy_write(phydev, YT8511_PAGE_SELECT, page);
486 };
487 
488 static int yt8511_config_init(struct phy_device *phydev)
489 {
490 	int oldpage, ret = 0;
491 	unsigned int ge, fe;
492 
493 	oldpage = phy_select_page(phydev, YT8511_EXT_CLK_GATE);
494 	if (oldpage < 0)
495 		goto err_restore_page;
496 
497 	/* set rgmii delay mode */
498 	switch (phydev->interface) {
499 	case PHY_INTERFACE_MODE_RGMII:
500 		ge = YT8511_DELAY_GE_TX_DIS;
501 		fe = YT8511_DELAY_FE_TX_DIS;
502 		break;
503 	case PHY_INTERFACE_MODE_RGMII_RXID:
504 		ge = YT8511_DELAY_RX | YT8511_DELAY_GE_TX_DIS;
505 		fe = YT8511_DELAY_FE_TX_DIS;
506 		break;
507 	case PHY_INTERFACE_MODE_RGMII_TXID:
508 		ge = YT8511_DELAY_GE_TX_EN;
509 		fe = YT8511_DELAY_FE_TX_EN;
510 		break;
511 	case PHY_INTERFACE_MODE_RGMII_ID:
512 		ge = YT8511_DELAY_RX | YT8511_DELAY_GE_TX_EN;
513 		fe = YT8511_DELAY_FE_TX_EN;
514 		break;
515 	default: /* do not support other modes */
516 		ret = -EOPNOTSUPP;
517 		goto err_restore_page;
518 	}
519 
520 	ret = __phy_modify(phydev, YT8511_PAGE, (YT8511_DELAY_RX | YT8511_DELAY_GE_TX_EN), ge);
521 	if (ret < 0)
522 		goto err_restore_page;
523 
524 	/* set clock mode to 125mhz */
525 	ret = __phy_modify(phydev, YT8511_PAGE, 0, YT8511_CLK_125M);
526 	if (ret < 0)
527 		goto err_restore_page;
528 
529 	/* fast ethernet delay is in a separate page */
530 	ret = __phy_write(phydev, YT8511_PAGE_SELECT, YT8511_EXT_DELAY_DRIVE);
531 	if (ret < 0)
532 		goto err_restore_page;
533 
534 	ret = __phy_modify(phydev, YT8511_PAGE, YT8511_DELAY_FE_TX_EN, fe);
535 	if (ret < 0)
536 		goto err_restore_page;
537 
538 	/* leave pll enabled in sleep */
539 	ret = __phy_write(phydev, YT8511_PAGE_SELECT, YT8511_EXT_SLEEP_CTRL);
540 	if (ret < 0)
541 		goto err_restore_page;
542 
543 	ret = __phy_modify(phydev, YT8511_PAGE, 0, YT8511_PLLON_SLP);
544 	if (ret < 0)
545 		goto err_restore_page;
546 
547 err_restore_page:
548 	return phy_restore_page(phydev, oldpage, ret);
549 }
550 
551 /**
552  * yt8521_read_page() - read reg page
553  * @phydev: a pointer to a &struct phy_device
554  *
555  * returns current reg space of yt8521 (YT8521_RSSR_FIBER_SPACE/
556  * YT8521_RSSR_UTP_SPACE) or negative errno code
557  */
558 static int yt8521_read_page(struct phy_device *phydev)
559 {
560 	int old_page;
561 
562 	old_page = ytphy_read_ext(phydev, YT8521_REG_SPACE_SELECT_REG);
563 	if (old_page < 0)
564 		return old_page;
565 
566 	if ((old_page & YT8521_RSSR_SPACE_MASK) == YT8521_RSSR_FIBER_SPACE)
567 		return YT8521_RSSR_FIBER_SPACE;
568 
569 	return YT8521_RSSR_UTP_SPACE;
570 };
571 
572 /**
573  * yt8521_write_page() - write reg page
574  * @phydev: a pointer to a &struct phy_device
575  * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to write.
576  *
577  * returns 0 or negative errno code
578  */
579 static int yt8521_write_page(struct phy_device *phydev, int page)
580 {
581 	int mask = YT8521_RSSR_SPACE_MASK;
582 	int set;
583 
584 	if ((page & YT8521_RSSR_SPACE_MASK) == YT8521_RSSR_FIBER_SPACE)
585 		set = YT8521_RSSR_FIBER_SPACE;
586 	else
587 		set = YT8521_RSSR_UTP_SPACE;
588 
589 	return ytphy_modify_ext(phydev, YT8521_REG_SPACE_SELECT_REG, mask, set);
590 };
591 
592 /**
593  * yt8521_probe() - read chip config then set suitable polling_mode
594  * @phydev: a pointer to a &struct phy_device
595  *
596  * returns 0 or negative errno code
597  */
598 static int yt8521_probe(struct phy_device *phydev)
599 {
600 	struct device *dev = &phydev->mdio.dev;
601 	struct yt8521_priv *priv;
602 	int chip_config;
603 	int ret;
604 
605 	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
606 	if (!priv)
607 		return -ENOMEM;
608 
609 	phydev->priv = priv;
610 
611 	chip_config = ytphy_read_ext_with_lock(phydev, YT8521_CHIP_CONFIG_REG);
612 	if (chip_config < 0)
613 		return chip_config;
614 
615 	priv->strap_mode = chip_config & YT8521_CCR_MODE_SEL_MASK;
616 	switch (priv->strap_mode) {
617 	case YT8521_CCR_MODE_FIBER_TO_RGMII:
618 	case YT8521_CCR_MODE_SGPHY_TO_RGMAC:
619 	case YT8521_CCR_MODE_SGMAC_TO_RGPHY:
620 		priv->polling_mode = YT8521_MODE_FIBER;
621 		priv->reg_page = YT8521_RSSR_FIBER_SPACE;
622 		phydev->port = PORT_FIBRE;
623 		break;
624 	case YT8521_CCR_MODE_UTP_FIBER_TO_RGMII:
625 	case YT8521_CCR_MODE_UTP_TO_FIBER_AUTO:
626 	case YT8521_CCR_MODE_UTP_TO_FIBER_FORCE:
627 		priv->polling_mode = YT8521_MODE_POLL;
628 		priv->reg_page = YT8521_RSSR_TO_BE_ARBITRATED;
629 		phydev->port = PORT_NONE;
630 		break;
631 	case YT8521_CCR_MODE_UTP_TO_SGMII:
632 	case YT8521_CCR_MODE_UTP_TO_RGMII:
633 		priv->polling_mode = YT8521_MODE_UTP;
634 		priv->reg_page = YT8521_RSSR_UTP_SPACE;
635 		phydev->port = PORT_TP;
636 		break;
637 	}
638 	/* set default reg space */
639 	if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) {
640 		ret = ytphy_write_ext_with_lock(phydev,
641 						YT8521_REG_SPACE_SELECT_REG,
642 						priv->reg_page);
643 		if (ret < 0)
644 			return ret;
645 	}
646 
647 	return 0;
648 }
649 
650 /**
651  * ytphy_utp_read_lpa() - read LPA then setup lp_advertising for utp
652  * @phydev: a pointer to a &struct phy_device
653  *
654  * NOTE:The caller must have taken the MDIO bus lock.
655  *
656  * returns 0 or negative errno code
657  */
658 static int ytphy_utp_read_lpa(struct phy_device *phydev)
659 {
660 	int lpa, lpagb;
661 
662 	if (phydev->autoneg == AUTONEG_ENABLE) {
663 		if (!phydev->autoneg_complete) {
664 			mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising,
665 							0);
666 			mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, 0);
667 			return 0;
668 		}
669 
670 		if (phydev->is_gigabit_capable) {
671 			lpagb = __phy_read(phydev, MII_STAT1000);
672 			if (lpagb < 0)
673 				return lpagb;
674 
675 			if (lpagb & LPA_1000MSFAIL) {
676 				int adv = __phy_read(phydev, MII_CTRL1000);
677 
678 				if (adv < 0)
679 					return adv;
680 
681 				if (adv & CTL1000_ENABLE_MASTER)
682 					phydev_err(phydev, "Master/Slave resolution failed, maybe conflicting manual settings?\n");
683 				else
684 					phydev_err(phydev, "Master/Slave resolution failed\n");
685 				return -ENOLINK;
686 			}
687 
688 			mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising,
689 							lpagb);
690 		}
691 
692 		lpa = __phy_read(phydev, MII_LPA);
693 		if (lpa < 0)
694 			return lpa;
695 
696 		mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, lpa);
697 	} else {
698 		linkmode_zero(phydev->lp_advertising);
699 	}
700 
701 	return 0;
702 }
703 
704 /**
705  * yt8521_adjust_status() - update speed and duplex to phydev. when in fiber
706  * mode, adjust speed and duplex.
707  * @phydev: a pointer to a &struct phy_device
708  * @status: yt8521 status read from YTPHY_SPECIFIC_STATUS_REG
709  * @is_utp: false(yt8521 work in fiber mode) or true(yt8521 work in utp mode)
710  *
711  * NOTE:The caller must have taken the MDIO bus lock.
712  *
713  * returns 0
714  */
715 static int yt8521_adjust_status(struct phy_device *phydev, int status,
716 				bool is_utp)
717 {
718 	int speed_mode, duplex;
719 	int speed;
720 	int err;
721 	int lpa;
722 
723 	if (is_utp)
724 		duplex = (status & YTPHY_SSR_DUPLEX) >> YTPHY_SSR_DUPLEX_OFFSET;
725 	else
726 		duplex = DUPLEX_FULL;	/* for fiber, it always DUPLEX_FULL */
727 
728 	speed_mode = (status & YTPHY_SSR_SPEED_MODE_MASK) >>
729 		     YTPHY_SSR_SPEED_MODE_OFFSET;
730 
731 	switch (speed_mode) {
732 	case YTPHY_SSR_SPEED_10M:
733 		if (is_utp)
734 			speed = SPEED_10;
735 		else
736 			/* for fiber, it will never run here, default to
737 			 * SPEED_UNKNOWN
738 			 */
739 			speed = SPEED_UNKNOWN;
740 		break;
741 	case YTPHY_SSR_SPEED_100M:
742 		speed = SPEED_100;
743 		break;
744 	case YTPHY_SSR_SPEED_1000M:
745 		speed = SPEED_1000;
746 		break;
747 	default:
748 		speed = SPEED_UNKNOWN;
749 		break;
750 	}
751 
752 	phydev->speed = speed;
753 	phydev->duplex = duplex;
754 
755 	if (is_utp) {
756 		err = ytphy_utp_read_lpa(phydev);
757 		if (err < 0)
758 			return err;
759 
760 		phy_resolve_aneg_pause(phydev);
761 	} else {
762 		lpa = __phy_read(phydev, MII_LPA);
763 		if (lpa < 0)
764 			return lpa;
765 
766 		/* only support 1000baseX Full */
767 		linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT,
768 				 phydev->lp_advertising, lpa & LPA_1000XFULL);
769 
770 		if (!(lpa & YTPHY_FLPA_PAUSE)) {
771 			phydev->pause = 0;
772 			phydev->asym_pause = 0;
773 		} else if ((lpa & YTPHY_FLPA_ASYM_PAUSE)) {
774 			phydev->pause = 1;
775 			phydev->asym_pause = 1;
776 		} else {
777 			phydev->pause = 1;
778 			phydev->asym_pause = 0;
779 		}
780 	}
781 
782 	return 0;
783 }
784 
785 /**
786  * yt8521_read_status_paged() -  determines the speed and duplex of one page
787  * @phydev: a pointer to a &struct phy_device
788  * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to
789  * operate.
790  *
791  * returns 1 (utp or fiber link),0 (no link) or negative errno code
792  */
793 static int yt8521_read_status_paged(struct phy_device *phydev, int page)
794 {
795 	int fiber_latch_val;
796 	int fiber_curr_val;
797 	int old_page;
798 	int ret = 0;
799 	int status;
800 	int link;
801 
802 	linkmode_zero(phydev->lp_advertising);
803 	phydev->duplex = DUPLEX_UNKNOWN;
804 	phydev->speed = SPEED_UNKNOWN;
805 	phydev->asym_pause = 0;
806 	phydev->pause = 0;
807 
808 	/* YT8521 has two reg space (utp/fiber) for linkup with utp/fiber
809 	 * respectively. but for utp/fiber combo mode, reg space should be
810 	 * arbitrated based on media priority. by default, utp takes
811 	 * priority. reg space should be properly set before read
812 	 * YTPHY_SPECIFIC_STATUS_REG.
813 	 */
814 
815 	page &= YT8521_RSSR_SPACE_MASK;
816 	old_page = phy_select_page(phydev, page);
817 	if (old_page < 0)
818 		goto err_restore_page;
819 
820 	/* Read YTPHY_SPECIFIC_STATUS_REG, which indicates the speed and duplex
821 	 * of the PHY is actually using.
822 	 */
823 	ret = __phy_read(phydev, YTPHY_SPECIFIC_STATUS_REG);
824 	if (ret < 0)
825 		goto err_restore_page;
826 
827 	status = ret;
828 	link = !!(status & YTPHY_SSR_LINK);
829 
830 	/* When PHY is in fiber mode, speed transferred from 1000Mbps to
831 	 * 100Mbps,there is not link down from YTPHY_SPECIFIC_STATUS_REG, so
832 	 * we need check MII_BMSR to identify such case.
833 	 */
834 	if (page == YT8521_RSSR_FIBER_SPACE) {
835 		ret = __phy_read(phydev, MII_BMSR);
836 		if (ret < 0)
837 			goto err_restore_page;
838 
839 		fiber_latch_val = ret;
840 		ret = __phy_read(phydev, MII_BMSR);
841 		if (ret < 0)
842 			goto err_restore_page;
843 
844 		fiber_curr_val = ret;
845 		if (link && fiber_latch_val != fiber_curr_val) {
846 			link = 0;
847 			phydev_info(phydev,
848 				    "%s, fiber link down detect, latch = %04x, curr = %04x\n",
849 				    __func__, fiber_latch_val, fiber_curr_val);
850 		}
851 	} else {
852 		/* Read autonegotiation status */
853 		ret = __phy_read(phydev, MII_BMSR);
854 		if (ret < 0)
855 			goto err_restore_page;
856 
857 		phydev->autoneg_complete = ret & BMSR_ANEGCOMPLETE ? 1 : 0;
858 	}
859 
860 	if (link) {
861 		if (page == YT8521_RSSR_UTP_SPACE)
862 			yt8521_adjust_status(phydev, status, true);
863 		else
864 			yt8521_adjust_status(phydev, status, false);
865 	}
866 	return phy_restore_page(phydev, old_page, link);
867 
868 err_restore_page:
869 	return phy_restore_page(phydev, old_page, ret);
870 }
871 
872 /**
873  * yt8521_read_status() -  determines the negotiated speed and duplex
874  * @phydev: a pointer to a &struct phy_device
875  *
876  * returns 0 or negative errno code
877  */
878 static int yt8521_read_status(struct phy_device *phydev)
879 {
880 	struct yt8521_priv *priv = phydev->priv;
881 	int link_fiber = 0;
882 	int link_utp;
883 	int link;
884 	int ret;
885 
886 	if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) {
887 		link = yt8521_read_status_paged(phydev, priv->reg_page);
888 		if (link < 0)
889 			return link;
890 	} else {
891 		/* when page is YT8521_RSSR_TO_BE_ARBITRATED, arbitration is
892 		 * needed. by default, utp is higher priority.
893 		 */
894 
895 		link_utp = yt8521_read_status_paged(phydev,
896 						    YT8521_RSSR_UTP_SPACE);
897 		if (link_utp < 0)
898 			return link_utp;
899 
900 		if (!link_utp) {
901 			link_fiber = yt8521_read_status_paged(phydev,
902 							      YT8521_RSSR_FIBER_SPACE);
903 			if (link_fiber < 0)
904 				return link_fiber;
905 		}
906 
907 		link = link_utp || link_fiber;
908 	}
909 
910 	if (link) {
911 		if (phydev->link == 0) {
912 			/* arbitrate reg space based on linkup media type. */
913 			if (priv->polling_mode == YT8521_MODE_POLL &&
914 			    priv->reg_page == YT8521_RSSR_TO_BE_ARBITRATED) {
915 				if (link_fiber)
916 					priv->reg_page =
917 						YT8521_RSSR_FIBER_SPACE;
918 				else
919 					priv->reg_page = YT8521_RSSR_UTP_SPACE;
920 
921 				ret = ytphy_write_ext_with_lock(phydev,
922 								YT8521_REG_SPACE_SELECT_REG,
923 								priv->reg_page);
924 				if (ret < 0)
925 					return ret;
926 
927 				phydev->port = link_fiber ? PORT_FIBRE : PORT_TP;
928 
929 				phydev_info(phydev, "%s, link up, media: %s\n",
930 					    __func__,
931 					    (phydev->port == PORT_TP) ?
932 					    "UTP" : "Fiber");
933 			}
934 		}
935 		phydev->link = 1;
936 	} else {
937 		if (phydev->link == 1) {
938 			phydev_info(phydev, "%s, link down, media: %s\n",
939 				    __func__, (phydev->port == PORT_TP) ?
940 				    "UTP" : "Fiber");
941 
942 			/* When in YT8521_MODE_POLL mode, need prepare for next
943 			 * arbitration.
944 			 */
945 			if (priv->polling_mode == YT8521_MODE_POLL) {
946 				priv->reg_page = YT8521_RSSR_TO_BE_ARBITRATED;
947 				phydev->port = PORT_NONE;
948 			}
949 		}
950 
951 		phydev->link = 0;
952 	}
953 
954 	return 0;
955 }
956 
957 /**
958  * yt8521_modify_bmcr_paged - bits modify a PHY's BMCR register of one page
959  * @phydev: the phy_device struct
960  * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to operate
961  * @mask: bit mask of bits to clear
962  * @set: bit mask of bits to set
963  *
964  * NOTE: Convenience function which allows a PHY's BMCR register to be
965  * modified as new register value = (old register value & ~mask) | set.
966  * YT8521 has two space (utp/fiber) and three mode (utp/fiber/poll), each space
967  * has MII_BMCR. poll mode combines utp and faber,so need do both.
968  * If it is reset, it will wait for completion.
969  *
970  * returns 0 or negative errno code
971  */
972 static int yt8521_modify_bmcr_paged(struct phy_device *phydev, int page,
973 				    u16 mask, u16 set)
974 {
975 	int max_cnt = 500; /* the max wait time of reset ~ 500 ms */
976 	int old_page;
977 	int ret = 0;
978 
979 	old_page = phy_select_page(phydev, page & YT8521_RSSR_SPACE_MASK);
980 	if (old_page < 0)
981 		goto err_restore_page;
982 
983 	ret = __phy_modify(phydev, MII_BMCR, mask, set);
984 	if (ret < 0)
985 		goto err_restore_page;
986 
987 	/* If it is reset, need to wait for the reset to complete */
988 	if (set == BMCR_RESET) {
989 		while (max_cnt--) {
990 			usleep_range(1000, 1100);
991 			ret = __phy_read(phydev, MII_BMCR);
992 			if (ret < 0)
993 				goto err_restore_page;
994 
995 			if (!(ret & BMCR_RESET))
996 				return phy_restore_page(phydev, old_page, 0);
997 		}
998 	}
999 
1000 err_restore_page:
1001 	return phy_restore_page(phydev, old_page, ret);
1002 }
1003 
1004 /**
1005  * yt8521_modify_utp_fiber_bmcr - bits modify a PHY's BMCR register
1006  * @phydev: the phy_device struct
1007  * @mask: bit mask of bits to clear
1008  * @set: bit mask of bits to set
1009  *
1010  * NOTE: Convenience function which allows a PHY's BMCR register to be
1011  * modified as new register value = (old register value & ~mask) | set.
1012  * YT8521 has two space (utp/fiber) and three mode (utp/fiber/poll), each space
1013  * has MII_BMCR. poll mode combines utp and faber,so need do both.
1014  *
1015  * returns 0 or negative errno code
1016  */
1017 static int yt8521_modify_utp_fiber_bmcr(struct phy_device *phydev, u16 mask,
1018 					u16 set)
1019 {
1020 	struct yt8521_priv *priv = phydev->priv;
1021 	int ret;
1022 
1023 	if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) {
1024 		ret = yt8521_modify_bmcr_paged(phydev, priv->reg_page, mask,
1025 					       set);
1026 		if (ret < 0)
1027 			return ret;
1028 	} else {
1029 		ret = yt8521_modify_bmcr_paged(phydev, YT8521_RSSR_UTP_SPACE,
1030 					       mask, set);
1031 		if (ret < 0)
1032 			return ret;
1033 
1034 		ret = yt8521_modify_bmcr_paged(phydev, YT8521_RSSR_FIBER_SPACE,
1035 					       mask, set);
1036 		if (ret < 0)
1037 			return ret;
1038 	}
1039 	return 0;
1040 }
1041 
1042 /**
1043  * yt8521_soft_reset() - called to issue a PHY software reset
1044  * @phydev: a pointer to a &struct phy_device
1045  *
1046  * returns 0 or negative errno code
1047  */
1048 static int yt8521_soft_reset(struct phy_device *phydev)
1049 {
1050 	return yt8521_modify_utp_fiber_bmcr(phydev, 0, BMCR_RESET);
1051 }
1052 
1053 /**
1054  * yt8521_suspend() - suspend the hardware
1055  * @phydev: a pointer to a &struct phy_device
1056  *
1057  * returns 0 or negative errno code
1058  */
1059 static int yt8521_suspend(struct phy_device *phydev)
1060 {
1061 	int wol_config;
1062 
1063 	/* YTPHY_WOL_CONFIG_REG is common ext reg */
1064 	wol_config = ytphy_read_ext_with_lock(phydev, YTPHY_WOL_CONFIG_REG);
1065 	if (wol_config < 0)
1066 		return wol_config;
1067 
1068 	/* if wol enable, do nothing */
1069 	if (wol_config & YTPHY_WCR_ENABLE)
1070 		return 0;
1071 
1072 	return yt8521_modify_utp_fiber_bmcr(phydev, 0, BMCR_PDOWN);
1073 }
1074 
1075 /**
1076  * yt8521_resume() - resume the hardware
1077  * @phydev: a pointer to a &struct phy_device
1078  *
1079  * returns 0 or negative errno code
1080  */
1081 static int yt8521_resume(struct phy_device *phydev)
1082 {
1083 	int ret;
1084 	int wol_config;
1085 
1086 	/* disable auto sleep */
1087 	ret = ytphy_modify_ext_with_lock(phydev,
1088 					 YT8521_EXTREG_SLEEP_CONTROL1_REG,
1089 					 YT8521_ESC1R_SLEEP_SW, 0);
1090 	if (ret < 0)
1091 		return ret;
1092 
1093 	wol_config = ytphy_read_ext_with_lock(phydev, YTPHY_WOL_CONFIG_REG);
1094 	if (wol_config < 0)
1095 		return wol_config;
1096 
1097 	/* if wol enable, do nothing */
1098 	if (wol_config & YTPHY_WCR_ENABLE)
1099 		return 0;
1100 
1101 	return yt8521_modify_utp_fiber_bmcr(phydev, BMCR_PDOWN, 0);
1102 }
1103 
1104 /**
1105  * yt8521_config_init() - called to initialize the PHY
1106  * @phydev: a pointer to a &struct phy_device
1107  *
1108  * returns 0 or negative errno code
1109  */
1110 static int yt8521_config_init(struct phy_device *phydev)
1111 {
1112 	int old_page;
1113 	int ret = 0;
1114 	u16 val;
1115 
1116 	old_page = phy_select_page(phydev, YT8521_RSSR_UTP_SPACE);
1117 	if (old_page < 0)
1118 		goto err_restore_page;
1119 
1120 	switch (phydev->interface) {
1121 	case PHY_INTERFACE_MODE_RGMII:
1122 		val = YT8521_RC1R_GE_TX_DELAY_DIS | YT8521_RC1R_GE_TX_DELAY_DIS;
1123 		val |= YT8521_RC1R_RX_DELAY_DIS;
1124 		break;
1125 	case PHY_INTERFACE_MODE_RGMII_RXID:
1126 		val = YT8521_RC1R_GE_TX_DELAY_DIS | YT8521_RC1R_GE_TX_DELAY_DIS;
1127 		val |= YT8521_RC1R_RX_DELAY_EN;
1128 		break;
1129 	case PHY_INTERFACE_MODE_RGMII_TXID:
1130 		val = YT8521_RC1R_GE_TX_DELAY_EN | YT8521_RC1R_GE_TX_DELAY_EN;
1131 		val |= YT8521_RC1R_RX_DELAY_DIS;
1132 		break;
1133 	case PHY_INTERFACE_MODE_RGMII_ID:
1134 		val = YT8521_RC1R_GE_TX_DELAY_EN | YT8521_RC1R_GE_TX_DELAY_EN;
1135 		val |= YT8521_RC1R_RX_DELAY_EN;
1136 		break;
1137 	case PHY_INTERFACE_MODE_SGMII:
1138 		break;
1139 	default: /* do not support other modes */
1140 		ret = -EOPNOTSUPP;
1141 		goto err_restore_page;
1142 	}
1143 
1144 	/* set rgmii delay mode */
1145 	if (phydev->interface != PHY_INTERFACE_MODE_SGMII) {
1146 		ret = ytphy_modify_ext(phydev, YT8521_RGMII_CONFIG1_REG,
1147 				       (YT8521_RC1R_RX_DELAY_MASK |
1148 				       YT8521_RC1R_FE_TX_DELAY_MASK |
1149 				       YT8521_RC1R_GE_TX_DELAY_MASK),
1150 				       val);
1151 		if (ret < 0)
1152 			goto err_restore_page;
1153 	}
1154 
1155 	/* disable auto sleep */
1156 	ret = ytphy_modify_ext(phydev, YT8521_EXTREG_SLEEP_CONTROL1_REG,
1157 			       YT8521_ESC1R_SLEEP_SW, 0);
1158 	if (ret < 0)
1159 		goto err_restore_page;
1160 
1161 	/* enable RXC clock when no wire plug */
1162 	ret = ytphy_modify_ext(phydev, YT8521_CLOCK_GATING_REG,
1163 			       YT8521_CGR_RX_CLK_EN, 0);
1164 	if (ret < 0)
1165 		goto err_restore_page;
1166 
1167 err_restore_page:
1168 	return phy_restore_page(phydev, old_page, ret);
1169 }
1170 
1171 /**
1172  * yt8521_prepare_fiber_features() -  A small helper function that setup
1173  * fiber's features.
1174  * @phydev: a pointer to a &struct phy_device
1175  * @dst: a pointer to store fiber's features
1176  */
1177 static void yt8521_prepare_fiber_features(struct phy_device *phydev,
1178 					  unsigned long *dst)
1179 {
1180 	linkmode_set_bit(ETHTOOL_LINK_MODE_100baseFX_Full_BIT, dst);
1181 	linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT, dst);
1182 	linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, dst);
1183 	linkmode_set_bit(ETHTOOL_LINK_MODE_FIBRE_BIT, dst);
1184 }
1185 
1186 /**
1187  * yt8521_fiber_setup_forced - configures/forces speed from @phydev
1188  * @phydev: target phy_device struct
1189  *
1190  * NOTE:The caller must have taken the MDIO bus lock.
1191  *
1192  * returns 0 or negative errno code
1193  */
1194 static int yt8521_fiber_setup_forced(struct phy_device *phydev)
1195 {
1196 	u16 val;
1197 	int ret;
1198 
1199 	if (phydev->speed == SPEED_1000)
1200 		val = YTPHY_MCR_FIBER_1000BX;
1201 	else if (phydev->speed == SPEED_100)
1202 		val = YTPHY_MCR_FIBER_100FX;
1203 	else
1204 		return -EINVAL;
1205 
1206 	ret =  __phy_modify(phydev, MII_BMCR, BMCR_ANENABLE, 0);
1207 	if (ret < 0)
1208 		return ret;
1209 
1210 	/* disable Fiber auto sensing */
1211 	ret =  ytphy_modify_ext(phydev, YT8521_LINK_TIMER_CFG2_REG,
1212 				YT8521_LTCR_EN_AUTOSEN, 0);
1213 	if (ret < 0)
1214 		return ret;
1215 
1216 	ret =  ytphy_modify_ext(phydev, YTPHY_MISC_CONFIG_REG,
1217 				YTPHY_MCR_FIBER_SPEED_MASK, val);
1218 	if (ret < 0)
1219 		return ret;
1220 
1221 	return ytphy_modify_ext(phydev, YT8521_CHIP_CONFIG_REG,
1222 				YT8521_CCR_SW_RST, 0);
1223 }
1224 
1225 /**
1226  * ytphy_check_and_restart_aneg - Enable and restart auto-negotiation
1227  * @phydev: target phy_device struct
1228  * @restart: whether aneg restart is requested
1229  *
1230  * NOTE:The caller must have taken the MDIO bus lock.
1231  *
1232  * returns 0 or negative errno code
1233  */
1234 static int ytphy_check_and_restart_aneg(struct phy_device *phydev, bool restart)
1235 {
1236 	int ret;
1237 
1238 	if (!restart) {
1239 		/* Advertisement hasn't changed, but maybe aneg was never on to
1240 		 * begin with?  Or maybe phy was isolated?
1241 		 */
1242 		ret = __phy_read(phydev, MII_BMCR);
1243 		if (ret < 0)
1244 			return ret;
1245 
1246 		if (!(ret & BMCR_ANENABLE) || (ret & BMCR_ISOLATE))
1247 			restart = true;
1248 	}
1249 	/* Enable and Restart Autonegotiation
1250 	 * Don't isolate the PHY if we're negotiating
1251 	 */
1252 	if (restart)
1253 		return __phy_modify(phydev, MII_BMCR, BMCR_ISOLATE,
1254 				    BMCR_ANENABLE | BMCR_ANRESTART);
1255 
1256 	return 0;
1257 }
1258 
1259 /**
1260  * yt8521_fiber_config_aneg - restart auto-negotiation or write
1261  * YTPHY_MISC_CONFIG_REG.
1262  * @phydev: target phy_device struct
1263  *
1264  * NOTE:The caller must have taken the MDIO bus lock.
1265  *
1266  * returns 0 or negative errno code
1267  */
1268 static int yt8521_fiber_config_aneg(struct phy_device *phydev)
1269 {
1270 	int err, changed = 0;
1271 	int bmcr;
1272 	u16 adv;
1273 
1274 	if (phydev->autoneg != AUTONEG_ENABLE)
1275 		return yt8521_fiber_setup_forced(phydev);
1276 
1277 	/* enable Fiber auto sensing */
1278 	err =  ytphy_modify_ext(phydev, YT8521_LINK_TIMER_CFG2_REG,
1279 				0, YT8521_LTCR_EN_AUTOSEN);
1280 	if (err < 0)
1281 		return err;
1282 
1283 	err =  ytphy_modify_ext(phydev, YT8521_CHIP_CONFIG_REG,
1284 				YT8521_CCR_SW_RST, 0);
1285 	if (err < 0)
1286 		return err;
1287 
1288 	bmcr = __phy_read(phydev, MII_BMCR);
1289 	if (bmcr < 0)
1290 		return bmcr;
1291 
1292 	/* When it is coming from fiber forced mode, add bmcr power down
1293 	 * and power up to let aneg work fine.
1294 	 */
1295 	if (!(bmcr & BMCR_ANENABLE)) {
1296 		__phy_modify(phydev, MII_BMCR, 0, BMCR_PDOWN);
1297 		usleep_range(1000, 1100);
1298 		__phy_modify(phydev, MII_BMCR, BMCR_PDOWN, 0);
1299 	}
1300 
1301 	adv = linkmode_adv_to_mii_adv_x(phydev->advertising,
1302 					ETHTOOL_LINK_MODE_1000baseX_Full_BIT);
1303 
1304 	/* Setup fiber advertisement */
1305 	err = __phy_modify_changed(phydev, MII_ADVERTISE,
1306 				   ADVERTISE_1000XHALF | ADVERTISE_1000XFULL |
1307 				   ADVERTISE_1000XPAUSE |
1308 				   ADVERTISE_1000XPSE_ASYM,
1309 				   adv);
1310 	if (err < 0)
1311 		return err;
1312 
1313 	if (err > 0)
1314 		changed = 1;
1315 
1316 	return ytphy_check_and_restart_aneg(phydev, changed);
1317 }
1318 
1319 /**
1320  * ytphy_setup_master_slave
1321  * @phydev: target phy_device struct
1322  *
1323  * NOTE: The caller must have taken the MDIO bus lock.
1324  *
1325  * returns 0 or negative errno code
1326  */
1327 static int ytphy_setup_master_slave(struct phy_device *phydev)
1328 {
1329 	u16 ctl = 0;
1330 
1331 	if (!phydev->is_gigabit_capable)
1332 		return 0;
1333 
1334 	switch (phydev->master_slave_set) {
1335 	case MASTER_SLAVE_CFG_MASTER_PREFERRED:
1336 		ctl |= CTL1000_PREFER_MASTER;
1337 		break;
1338 	case MASTER_SLAVE_CFG_SLAVE_PREFERRED:
1339 		break;
1340 	case MASTER_SLAVE_CFG_MASTER_FORCE:
1341 		ctl |= CTL1000_AS_MASTER;
1342 		fallthrough;
1343 	case MASTER_SLAVE_CFG_SLAVE_FORCE:
1344 		ctl |= CTL1000_ENABLE_MASTER;
1345 		break;
1346 	case MASTER_SLAVE_CFG_UNKNOWN:
1347 	case MASTER_SLAVE_CFG_UNSUPPORTED:
1348 		return 0;
1349 	default:
1350 		phydev_warn(phydev, "Unsupported Master/Slave mode\n");
1351 		return -EOPNOTSUPP;
1352 	}
1353 
1354 	return __phy_modify_changed(phydev, MII_CTRL1000,
1355 				    (CTL1000_ENABLE_MASTER | CTL1000_AS_MASTER |
1356 				    CTL1000_PREFER_MASTER), ctl);
1357 }
1358 
1359 /**
1360  * ytphy_utp_config_advert - sanitize and advertise auto-negotiation parameters
1361  * @phydev: target phy_device struct
1362  *
1363  * NOTE: Writes MII_ADVERTISE with the appropriate values,
1364  * after sanitizing the values to make sure we only advertise
1365  * what is supported.  Returns < 0 on error, 0 if the PHY's advertisement
1366  * hasn't changed, and > 0 if it has changed.
1367  * The caller must have taken the MDIO bus lock.
1368  *
1369  * returns 0 or negative errno code
1370  */
1371 static int ytphy_utp_config_advert(struct phy_device *phydev)
1372 {
1373 	int err, bmsr, changed = 0;
1374 	u32 adv;
1375 
1376 	/* Only allow advertising what this PHY supports */
1377 	linkmode_and(phydev->advertising, phydev->advertising,
1378 		     phydev->supported);
1379 
1380 	adv = linkmode_adv_to_mii_adv_t(phydev->advertising);
1381 
1382 	/* Setup standard advertisement */
1383 	err = __phy_modify_changed(phydev, MII_ADVERTISE,
1384 				   ADVERTISE_ALL | ADVERTISE_100BASE4 |
1385 				   ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM,
1386 				   adv);
1387 	if (err < 0)
1388 		return err;
1389 	if (err > 0)
1390 		changed = 1;
1391 
1392 	bmsr = __phy_read(phydev, MII_BMSR);
1393 	if (bmsr < 0)
1394 		return bmsr;
1395 
1396 	/* Per 802.3-2008, Section 22.2.4.2.16 Extended status all
1397 	 * 1000Mbits/sec capable PHYs shall have the BMSR_ESTATEN bit set to a
1398 	 * logical 1.
1399 	 */
1400 	if (!(bmsr & BMSR_ESTATEN))
1401 		return changed;
1402 
1403 	adv = linkmode_adv_to_mii_ctrl1000_t(phydev->advertising);
1404 
1405 	err = __phy_modify_changed(phydev, MII_CTRL1000,
1406 				   ADVERTISE_1000FULL | ADVERTISE_1000HALF,
1407 				   adv);
1408 	if (err < 0)
1409 		return err;
1410 	if (err > 0)
1411 		changed = 1;
1412 
1413 	return changed;
1414 }
1415 
1416 /**
1417  * ytphy_utp_config_aneg - restart auto-negotiation or write BMCR
1418  * @phydev: target phy_device struct
1419  * @changed: whether autoneg is requested
1420  *
1421  * NOTE: If auto-negotiation is enabled, we configure the
1422  * advertising, and then restart auto-negotiation.  If it is not
1423  * enabled, then we write the BMCR.
1424  * The caller must have taken the MDIO bus lock.
1425  *
1426  * returns 0 or negative errno code
1427  */
1428 static int ytphy_utp_config_aneg(struct phy_device *phydev, bool changed)
1429 {
1430 	int err;
1431 	u16 ctl;
1432 
1433 	err = ytphy_setup_master_slave(phydev);
1434 	if (err < 0)
1435 		return err;
1436 	else if (err)
1437 		changed = true;
1438 
1439 	if (phydev->autoneg != AUTONEG_ENABLE) {
1440 		/* configures/forces speed/duplex from @phydev */
1441 
1442 		ctl = mii_bmcr_encode_fixed(phydev->speed, phydev->duplex);
1443 
1444 		return __phy_modify(phydev, MII_BMCR, ~(BMCR_LOOPBACK |
1445 				    BMCR_ISOLATE | BMCR_PDOWN), ctl);
1446 	}
1447 
1448 	err = ytphy_utp_config_advert(phydev);
1449 	if (err < 0) /* error */
1450 		return err;
1451 	else if (err)
1452 		changed = true;
1453 
1454 	return ytphy_check_and_restart_aneg(phydev, changed);
1455 }
1456 
1457 /**
1458  * yt8521_config_aneg_paged() - switch reg space then call genphy_config_aneg
1459  * of one page
1460  * @phydev: a pointer to a &struct phy_device
1461  * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to
1462  * operate.
1463  *
1464  * returns 0 or negative errno code
1465  */
1466 static int yt8521_config_aneg_paged(struct phy_device *phydev, int page)
1467 {
1468 	__ETHTOOL_DECLARE_LINK_MODE_MASK(fiber_supported);
1469 	struct yt8521_priv *priv = phydev->priv;
1470 	int old_page;
1471 	int ret = 0;
1472 
1473 	page &= YT8521_RSSR_SPACE_MASK;
1474 
1475 	old_page = phy_select_page(phydev, page);
1476 	if (old_page < 0)
1477 		goto err_restore_page;
1478 
1479 	/* If reg_page is YT8521_RSSR_TO_BE_ARBITRATED,
1480 	 * phydev->advertising should be updated.
1481 	 */
1482 	if (priv->reg_page == YT8521_RSSR_TO_BE_ARBITRATED) {
1483 		linkmode_zero(fiber_supported);
1484 		yt8521_prepare_fiber_features(phydev, fiber_supported);
1485 
1486 		/* prepare fiber_supported, then setup advertising. */
1487 		if (page == YT8521_RSSR_FIBER_SPACE) {
1488 			linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT,
1489 					 fiber_supported);
1490 			linkmode_set_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT,
1491 					 fiber_supported);
1492 			linkmode_and(phydev->advertising,
1493 				     priv->combo_advertising, fiber_supported);
1494 		} else {
1495 			/* ETHTOOL_LINK_MODE_Autoneg_BIT is also used in utp */
1496 			linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
1497 					   fiber_supported);
1498 			linkmode_andnot(phydev->advertising,
1499 					priv->combo_advertising,
1500 					fiber_supported);
1501 		}
1502 	}
1503 
1504 	if (page == YT8521_RSSR_FIBER_SPACE)
1505 		ret = yt8521_fiber_config_aneg(phydev);
1506 	else
1507 		ret = ytphy_utp_config_aneg(phydev, false);
1508 
1509 err_restore_page:
1510 	return phy_restore_page(phydev, old_page, ret);
1511 }
1512 
1513 /**
1514  * yt8521_config_aneg() - change reg space then call yt8521_config_aneg_paged
1515  * @phydev: a pointer to a &struct phy_device
1516  *
1517  * returns 0 or negative errno code
1518  */
1519 static int yt8521_config_aneg(struct phy_device *phydev)
1520 {
1521 	struct yt8521_priv *priv = phydev->priv;
1522 	int ret;
1523 
1524 	if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) {
1525 		ret = yt8521_config_aneg_paged(phydev, priv->reg_page);
1526 		if (ret < 0)
1527 			return ret;
1528 	} else {
1529 		/* If reg_page is YT8521_RSSR_TO_BE_ARBITRATED,
1530 		 * phydev->advertising need to be saved at first run.
1531 		 * Because it contains the advertising which supported by both
1532 		 * mac and yt8521(utp and fiber).
1533 		 */
1534 		if (linkmode_empty(priv->combo_advertising)) {
1535 			linkmode_copy(priv->combo_advertising,
1536 				      phydev->advertising);
1537 		}
1538 
1539 		ret = yt8521_config_aneg_paged(phydev, YT8521_RSSR_UTP_SPACE);
1540 		if (ret < 0)
1541 			return ret;
1542 
1543 		ret = yt8521_config_aneg_paged(phydev, YT8521_RSSR_FIBER_SPACE);
1544 		if (ret < 0)
1545 			return ret;
1546 
1547 		/* we don't known which will be link, so restore
1548 		 * phydev->advertising as default value.
1549 		 */
1550 		linkmode_copy(phydev->advertising, priv->combo_advertising);
1551 	}
1552 	return 0;
1553 }
1554 
1555 /**
1556  * yt8521_aneg_done_paged() - determines the auto negotiation result of one
1557  * page.
1558  * @phydev: a pointer to a &struct phy_device
1559  * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to
1560  * operate.
1561  *
1562  * returns 0(no link)or 1(fiber or utp link) or negative errno code
1563  */
1564 static int yt8521_aneg_done_paged(struct phy_device *phydev, int page)
1565 {
1566 	int old_page;
1567 	int ret = 0;
1568 	int link;
1569 
1570 	old_page = phy_select_page(phydev, page & YT8521_RSSR_SPACE_MASK);
1571 	if (old_page < 0)
1572 		goto err_restore_page;
1573 
1574 	ret = __phy_read(phydev, YTPHY_SPECIFIC_STATUS_REG);
1575 	if (ret < 0)
1576 		goto err_restore_page;
1577 
1578 	link = !!(ret & YTPHY_SSR_LINK);
1579 	ret = link;
1580 
1581 err_restore_page:
1582 	return phy_restore_page(phydev, old_page, ret);
1583 }
1584 
1585 /**
1586  * yt8521_aneg_done() - determines the auto negotiation result
1587  * @phydev: a pointer to a &struct phy_device
1588  *
1589  * returns 0(no link)or 1(fiber or utp link) or negative errno code
1590  */
1591 static int yt8521_aneg_done(struct phy_device *phydev)
1592 {
1593 	struct yt8521_priv *priv = phydev->priv;
1594 	int link_fiber = 0;
1595 	int link_utp;
1596 	int link;
1597 
1598 	if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) {
1599 		link = yt8521_aneg_done_paged(phydev, priv->reg_page);
1600 	} else {
1601 		link_utp = yt8521_aneg_done_paged(phydev,
1602 						  YT8521_RSSR_UTP_SPACE);
1603 		if (link_utp < 0)
1604 			return link_utp;
1605 
1606 		if (!link_utp) {
1607 			link_fiber = yt8521_aneg_done_paged(phydev,
1608 							    YT8521_RSSR_FIBER_SPACE);
1609 			if (link_fiber < 0)
1610 				return link_fiber;
1611 		}
1612 		link = link_fiber || link_utp;
1613 		phydev_info(phydev, "%s, link_fiber: %d, link_utp: %d\n",
1614 			    __func__, link_fiber, link_utp);
1615 	}
1616 
1617 	return link;
1618 }
1619 
1620 /**
1621  * ytphy_utp_read_abilities - read PHY abilities from Clause 22 registers
1622  * @phydev: target phy_device struct
1623  *
1624  * NOTE: Reads the PHY's abilities and populates
1625  * phydev->supported accordingly.
1626  * The caller must have taken the MDIO bus lock.
1627  *
1628  * returns 0 or negative errno code
1629  */
1630 static int ytphy_utp_read_abilities(struct phy_device *phydev)
1631 {
1632 	int val;
1633 
1634 	linkmode_set_bit_array(phy_basic_ports_array,
1635 			       ARRAY_SIZE(phy_basic_ports_array),
1636 			       phydev->supported);
1637 
1638 	val = __phy_read(phydev, MII_BMSR);
1639 	if (val < 0)
1640 		return val;
1641 
1642 	linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->supported,
1643 			 val & BMSR_ANEGCAPABLE);
1644 
1645 	linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, phydev->supported,
1646 			 val & BMSR_100FULL);
1647 	linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, phydev->supported,
1648 			 val & BMSR_100HALF);
1649 	linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, phydev->supported,
1650 			 val & BMSR_10FULL);
1651 	linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, phydev->supported,
1652 			 val & BMSR_10HALF);
1653 
1654 	if (val & BMSR_ESTATEN) {
1655 		val = __phy_read(phydev, MII_ESTATUS);
1656 		if (val < 0)
1657 			return val;
1658 
1659 		linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
1660 				 phydev->supported, val & ESTATUS_1000_TFULL);
1661 		linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
1662 				 phydev->supported, val & ESTATUS_1000_THALF);
1663 		linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT,
1664 				 phydev->supported, val & ESTATUS_1000_XFULL);
1665 	}
1666 
1667 	return 0;
1668 }
1669 
1670 /**
1671  * yt8521_get_features_paged() -  read supported link modes for one page
1672  * @phydev: a pointer to a &struct phy_device
1673  * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to
1674  * operate.
1675  *
1676  * returns 0 or negative errno code
1677  */
1678 static int yt8521_get_features_paged(struct phy_device *phydev, int page)
1679 {
1680 	int old_page;
1681 	int ret = 0;
1682 
1683 	page &= YT8521_RSSR_SPACE_MASK;
1684 	old_page = phy_select_page(phydev, page);
1685 	if (old_page < 0)
1686 		goto err_restore_page;
1687 
1688 	if (page == YT8521_RSSR_FIBER_SPACE) {
1689 		linkmode_zero(phydev->supported);
1690 		yt8521_prepare_fiber_features(phydev, phydev->supported);
1691 	} else {
1692 		ret = ytphy_utp_read_abilities(phydev);
1693 		if (ret < 0)
1694 			goto err_restore_page;
1695 	}
1696 
1697 err_restore_page:
1698 	return phy_restore_page(phydev, old_page, ret);
1699 }
1700 
1701 /**
1702  * yt8521_get_features - switch reg space then call yt8521_get_features_paged
1703  * @phydev: target phy_device struct
1704  *
1705  * returns 0 or negative errno code
1706  */
1707 static int yt8521_get_features(struct phy_device *phydev)
1708 {
1709 	struct yt8521_priv *priv = phydev->priv;
1710 	int ret;
1711 
1712 	if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) {
1713 		ret = yt8521_get_features_paged(phydev, priv->reg_page);
1714 	} else {
1715 		ret = yt8521_get_features_paged(phydev,
1716 						YT8521_RSSR_UTP_SPACE);
1717 		if (ret < 0)
1718 			return ret;
1719 
1720 		/* add fiber's features to phydev->supported */
1721 		yt8521_prepare_fiber_features(phydev, phydev->supported);
1722 	}
1723 	return ret;
1724 }
1725 
1726 static struct phy_driver motorcomm_phy_drvs[] = {
1727 	{
1728 		PHY_ID_MATCH_EXACT(PHY_ID_YT8511),
1729 		.name		= "YT8511 Gigabit Ethernet",
1730 		.config_init	= yt8511_config_init,
1731 		.suspend	= genphy_suspend,
1732 		.resume		= genphy_resume,
1733 		.read_page	= yt8511_read_page,
1734 		.write_page	= yt8511_write_page,
1735 	},
1736 	{
1737 		PHY_ID_MATCH_EXACT(PHY_ID_YT8521),
1738 		.name		= "YT8521 Gigabit Ethernet",
1739 		.get_features	= yt8521_get_features,
1740 		.probe		= yt8521_probe,
1741 		.read_page	= yt8521_read_page,
1742 		.write_page	= yt8521_write_page,
1743 		.get_wol	= ytphy_get_wol,
1744 		.set_wol	= ytphy_set_wol,
1745 		.config_aneg	= yt8521_config_aneg,
1746 		.aneg_done	= yt8521_aneg_done,
1747 		.config_init	= yt8521_config_init,
1748 		.read_status	= yt8521_read_status,
1749 		.soft_reset	= yt8521_soft_reset,
1750 		.suspend	= yt8521_suspend,
1751 		.resume		= yt8521_resume,
1752 	},
1753 };
1754 
1755 module_phy_driver(motorcomm_phy_drvs);
1756 
1757 MODULE_DESCRIPTION("Motorcomm 8511/8521 PHY driver");
1758 MODULE_AUTHOR("Peter Geis");
1759 MODULE_AUTHOR("Frank");
1760 MODULE_LICENSE("GPL");
1761 
1762 static const struct mdio_device_id __maybe_unused motorcomm_tbl[] = {
1763 	{ PHY_ID_MATCH_EXACT(PHY_ID_YT8511) },
1764 	{ PHY_ID_MATCH_EXACT(PHY_ID_YT8521) },
1765 	{ /* sentinal */ }
1766 };
1767 
1768 MODULE_DEVICE_TABLE(mdio, motorcomm_tbl);
1769