xref: /openbmc/linux/drivers/net/phy/marvell.c (revision 8b235f2f)
1 /*
2  * drivers/net/phy/marvell.c
3  *
4  * Driver for Marvell PHYs
5  *
6  * Author: Andy Fleming
7  *
8  * Copyright (c) 2004 Freescale Semiconductor, Inc.
9  *
10  * Copyright (c) 2013 Michael Stapelberg <michael@stapelberg.de>
11  *
12  * This program is free software; you can redistribute  it and/or modify it
13  * under  the terms of  the GNU General  Public License as published by the
14  * Free Software Foundation;  either version 2 of the  License, or (at your
15  * option) any later version.
16  *
17  */
18 #include <linux/kernel.h>
19 #include <linux/string.h>
20 #include <linux/errno.h>
21 #include <linux/unistd.h>
22 #include <linux/interrupt.h>
23 #include <linux/init.h>
24 #include <linux/delay.h>
25 #include <linux/netdevice.h>
26 #include <linux/etherdevice.h>
27 #include <linux/skbuff.h>
28 #include <linux/spinlock.h>
29 #include <linux/mm.h>
30 #include <linux/module.h>
31 #include <linux/mii.h>
32 #include <linux/ethtool.h>
33 #include <linux/phy.h>
34 #include <linux/marvell_phy.h>
35 #include <linux/of.h>
36 
37 #include <linux/io.h>
38 #include <asm/irq.h>
39 #include <linux/uaccess.h>
40 
41 #define MII_MARVELL_PHY_PAGE		22
42 
43 #define MII_M1011_IEVENT		0x13
44 #define MII_M1011_IEVENT_CLEAR		0x0000
45 
46 #define MII_M1011_IMASK			0x12
47 #define MII_M1011_IMASK_INIT		0x6400
48 #define MII_M1011_IMASK_CLEAR		0x0000
49 
50 #define MII_M1011_PHY_SCR		0x10
51 #define MII_M1011_PHY_SCR_MDI		0x0000
52 #define MII_M1011_PHY_SCR_MDI_X		0x0020
53 #define MII_M1011_PHY_SCR_AUTO_CROSS	0x0060
54 
55 #define MII_M1145_PHY_EXT_ADDR_PAGE	0x16
56 #define MII_M1145_PHY_EXT_SR		0x1b
57 #define MII_M1145_PHY_EXT_CR		0x14
58 #define MII_M1145_RGMII_RX_DELAY	0x0080
59 #define MII_M1145_RGMII_TX_DELAY	0x0002
60 #define MII_M1145_HWCFG_MODE_SGMII_NO_CLK	0x4
61 #define MII_M1145_HWCFG_MODE_MASK		0xf
62 #define MII_M1145_HWCFG_FIBER_COPPER_AUTO	0x8000
63 
64 #define MII_M1145_HWCFG_MODE_SGMII_NO_CLK	0x4
65 #define MII_M1145_HWCFG_MODE_MASK		0xf
66 #define MII_M1145_HWCFG_FIBER_COPPER_AUTO	0x8000
67 
68 #define MII_M1111_PHY_LED_CONTROL	0x18
69 #define MII_M1111_PHY_LED_DIRECT	0x4100
70 #define MII_M1111_PHY_LED_COMBINE	0x411c
71 #define MII_M1111_PHY_EXT_CR		0x14
72 #define MII_M1111_RX_DELAY		0x80
73 #define MII_M1111_TX_DELAY		0x2
74 #define MII_M1111_PHY_EXT_SR		0x1b
75 
76 #define MII_M1111_HWCFG_MODE_MASK		0xf
77 #define MII_M1111_HWCFG_MODE_COPPER_RGMII	0xb
78 #define MII_M1111_HWCFG_MODE_FIBER_RGMII	0x3
79 #define MII_M1111_HWCFG_MODE_SGMII_NO_CLK	0x4
80 #define MII_M1111_HWCFG_MODE_COPPER_RTBI	0x9
81 #define MII_M1111_HWCFG_FIBER_COPPER_AUTO	0x8000
82 #define MII_M1111_HWCFG_FIBER_COPPER_RES	0x2000
83 
84 #define MII_M1111_COPPER		0
85 #define MII_M1111_FIBER			1
86 
87 #define MII_88E1121_PHY_MSCR_PAGE	2
88 #define MII_88E1121_PHY_MSCR_REG	21
89 #define MII_88E1121_PHY_MSCR_RX_DELAY	BIT(5)
90 #define MII_88E1121_PHY_MSCR_TX_DELAY	BIT(4)
91 #define MII_88E1121_PHY_MSCR_DELAY_MASK	(~(0x3 << 4))
92 
93 #define MII_88E1318S_PHY_MSCR1_REG	16
94 #define MII_88E1318S_PHY_MSCR1_PAD_ODD	BIT(6)
95 
96 /* Copper Specific Interrupt Enable Register */
97 #define MII_88E1318S_PHY_CSIER                              0x12
98 /* WOL Event Interrupt Enable */
99 #define MII_88E1318S_PHY_CSIER_WOL_EIE                      BIT(7)
100 
101 /* LED Timer Control Register */
102 #define MII_88E1318S_PHY_LED_PAGE                           0x03
103 #define MII_88E1318S_PHY_LED_TCR                            0x12
104 #define MII_88E1318S_PHY_LED_TCR_FORCE_INT                  BIT(15)
105 #define MII_88E1318S_PHY_LED_TCR_INTn_ENABLE                BIT(7)
106 #define MII_88E1318S_PHY_LED_TCR_INT_ACTIVE_LOW             BIT(11)
107 
108 /* Magic Packet MAC address registers */
109 #define MII_88E1318S_PHY_MAGIC_PACKET_WORD2                 0x17
110 #define MII_88E1318S_PHY_MAGIC_PACKET_WORD1                 0x18
111 #define MII_88E1318S_PHY_MAGIC_PACKET_WORD0                 0x19
112 
113 #define MII_88E1318S_PHY_WOL_PAGE                           0x11
114 #define MII_88E1318S_PHY_WOL_CTRL                           0x10
115 #define MII_88E1318S_PHY_WOL_CTRL_CLEAR_WOL_STATUS          BIT(12)
116 #define MII_88E1318S_PHY_WOL_CTRL_MAGIC_PACKET_MATCH_ENABLE BIT(14)
117 
118 #define MII_88E1121_PHY_LED_CTRL	16
119 #define MII_88E1121_PHY_LED_PAGE	3
120 #define MII_88E1121_PHY_LED_DEF		0x0030
121 
122 #define MII_M1011_PHY_STATUS		0x11
123 #define MII_M1011_PHY_STATUS_1000	0x8000
124 #define MII_M1011_PHY_STATUS_100	0x4000
125 #define MII_M1011_PHY_STATUS_SPD_MASK	0xc000
126 #define MII_M1011_PHY_STATUS_FULLDUPLEX	0x2000
127 #define MII_M1011_PHY_STATUS_RESOLVED	0x0800
128 #define MII_M1011_PHY_STATUS_LINK	0x0400
129 
130 #define MII_M1116R_CONTROL_REG_MAC	21
131 
132 #define MII_88E3016_PHY_SPEC_CTRL	0x10
133 #define MII_88E3016_DISABLE_SCRAMBLER	0x0200
134 #define MII_88E3016_AUTO_MDIX_CROSSOVER	0x0030
135 
136 MODULE_DESCRIPTION("Marvell PHY driver");
137 MODULE_AUTHOR("Andy Fleming");
138 MODULE_LICENSE("GPL");
139 
140 static int marvell_ack_interrupt(struct phy_device *phydev)
141 {
142 	int err;
143 
144 	/* Clear the interrupts by reading the reg */
145 	err = phy_read(phydev, MII_M1011_IEVENT);
146 
147 	if (err < 0)
148 		return err;
149 
150 	return 0;
151 }
152 
153 static int marvell_config_intr(struct phy_device *phydev)
154 {
155 	int err;
156 
157 	if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
158 		err = phy_write(phydev, MII_M1011_IMASK, MII_M1011_IMASK_INIT);
159 	else
160 		err = phy_write(phydev, MII_M1011_IMASK, MII_M1011_IMASK_CLEAR);
161 
162 	return err;
163 }
164 
165 static int marvell_set_polarity(struct phy_device *phydev, int polarity)
166 {
167 	int reg;
168 	int err;
169 	int val;
170 
171 	/* get the current settings */
172 	reg = phy_read(phydev, MII_M1011_PHY_SCR);
173 	if (reg < 0)
174 		return reg;
175 
176 	val = reg;
177 	val &= ~MII_M1011_PHY_SCR_AUTO_CROSS;
178 	switch (polarity) {
179 	case ETH_TP_MDI:
180 		val |= MII_M1011_PHY_SCR_MDI;
181 		break;
182 	case ETH_TP_MDI_X:
183 		val |= MII_M1011_PHY_SCR_MDI_X;
184 		break;
185 	case ETH_TP_MDI_AUTO:
186 	case ETH_TP_MDI_INVALID:
187 	default:
188 		val |= MII_M1011_PHY_SCR_AUTO_CROSS;
189 		break;
190 	}
191 
192 	if (val != reg) {
193 		/* Set the new polarity value in the register */
194 		err = phy_write(phydev, MII_M1011_PHY_SCR, val);
195 		if (err)
196 			return err;
197 	}
198 
199 	return 0;
200 }
201 
202 static int marvell_config_aneg(struct phy_device *phydev)
203 {
204 	int err;
205 
206 	/* The Marvell PHY has an errata which requires
207 	 * that certain registers get written in order
208 	 * to restart autonegotiation */
209 	err = phy_write(phydev, MII_BMCR, BMCR_RESET);
210 
211 	if (err < 0)
212 		return err;
213 
214 	err = phy_write(phydev, 0x1d, 0x1f);
215 	if (err < 0)
216 		return err;
217 
218 	err = phy_write(phydev, 0x1e, 0x200c);
219 	if (err < 0)
220 		return err;
221 
222 	err = phy_write(phydev, 0x1d, 0x5);
223 	if (err < 0)
224 		return err;
225 
226 	err = phy_write(phydev, 0x1e, 0);
227 	if (err < 0)
228 		return err;
229 
230 	err = phy_write(phydev, 0x1e, 0x100);
231 	if (err < 0)
232 		return err;
233 
234 	err = marvell_set_polarity(phydev, phydev->mdix);
235 	if (err < 0)
236 		return err;
237 
238 	err = phy_write(phydev, MII_M1111_PHY_LED_CONTROL,
239 			MII_M1111_PHY_LED_DIRECT);
240 	if (err < 0)
241 		return err;
242 
243 	err = genphy_config_aneg(phydev);
244 	if (err < 0)
245 		return err;
246 
247 	if (phydev->autoneg != AUTONEG_ENABLE) {
248 		int bmcr;
249 
250 		/*
251 		 * A write to speed/duplex bits (that is performed by
252 		 * genphy_config_aneg() call above) must be followed by
253 		 * a software reset. Otherwise, the write has no effect.
254 		 */
255 		bmcr = phy_read(phydev, MII_BMCR);
256 		if (bmcr < 0)
257 			return bmcr;
258 
259 		err = phy_write(phydev, MII_BMCR, bmcr | BMCR_RESET);
260 		if (err < 0)
261 			return err;
262 	}
263 
264 	return 0;
265 }
266 
267 #ifdef CONFIG_OF_MDIO
268 /*
269  * Set and/or override some configuration registers based on the
270  * marvell,reg-init property stored in the of_node for the phydev.
271  *
272  * marvell,reg-init = <reg-page reg mask value>,...;
273  *
274  * There may be one or more sets of <reg-page reg mask value>:
275  *
276  * reg-page: which register bank to use.
277  * reg: the register.
278  * mask: if non-zero, ANDed with existing register value.
279  * value: ORed with the masked value and written to the regiser.
280  *
281  */
282 static int marvell_of_reg_init(struct phy_device *phydev)
283 {
284 	const __be32 *paddr;
285 	int len, i, saved_page, current_page, page_changed, ret;
286 
287 	if (!phydev->dev.of_node)
288 		return 0;
289 
290 	paddr = of_get_property(phydev->dev.of_node, "marvell,reg-init", &len);
291 	if (!paddr || len < (4 * sizeof(*paddr)))
292 		return 0;
293 
294 	saved_page = phy_read(phydev, MII_MARVELL_PHY_PAGE);
295 	if (saved_page < 0)
296 		return saved_page;
297 	page_changed = 0;
298 	current_page = saved_page;
299 
300 	ret = 0;
301 	len /= sizeof(*paddr);
302 	for (i = 0; i < len - 3; i += 4) {
303 		u16 reg_page = be32_to_cpup(paddr + i);
304 		u16 reg = be32_to_cpup(paddr + i + 1);
305 		u16 mask = be32_to_cpup(paddr + i + 2);
306 		u16 val_bits = be32_to_cpup(paddr + i + 3);
307 		int val;
308 
309 		if (reg_page != current_page) {
310 			current_page = reg_page;
311 			page_changed = 1;
312 			ret = phy_write(phydev, MII_MARVELL_PHY_PAGE, reg_page);
313 			if (ret < 0)
314 				goto err;
315 		}
316 
317 		val = 0;
318 		if (mask) {
319 			val = phy_read(phydev, reg);
320 			if (val < 0) {
321 				ret = val;
322 				goto err;
323 			}
324 			val &= mask;
325 		}
326 		val |= val_bits;
327 
328 		ret = phy_write(phydev, reg, val);
329 		if (ret < 0)
330 			goto err;
331 
332 	}
333 err:
334 	if (page_changed) {
335 		i = phy_write(phydev, MII_MARVELL_PHY_PAGE, saved_page);
336 		if (ret == 0)
337 			ret = i;
338 	}
339 	return ret;
340 }
341 #else
342 static int marvell_of_reg_init(struct phy_device *phydev)
343 {
344 	return 0;
345 }
346 #endif /* CONFIG_OF_MDIO */
347 
348 static int m88e1121_config_aneg(struct phy_device *phydev)
349 {
350 	int err, oldpage, mscr;
351 
352 	oldpage = phy_read(phydev, MII_MARVELL_PHY_PAGE);
353 
354 	err = phy_write(phydev, MII_MARVELL_PHY_PAGE,
355 			MII_88E1121_PHY_MSCR_PAGE);
356 	if (err < 0)
357 		return err;
358 
359 	if (phy_interface_is_rgmii(phydev)) {
360 
361 		mscr = phy_read(phydev, MII_88E1121_PHY_MSCR_REG) &
362 			MII_88E1121_PHY_MSCR_DELAY_MASK;
363 
364 		if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
365 			mscr |= (MII_88E1121_PHY_MSCR_RX_DELAY |
366 				 MII_88E1121_PHY_MSCR_TX_DELAY);
367 		else if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID)
368 			mscr |= MII_88E1121_PHY_MSCR_RX_DELAY;
369 		else if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID)
370 			mscr |= MII_88E1121_PHY_MSCR_TX_DELAY;
371 
372 		err = phy_write(phydev, MII_88E1121_PHY_MSCR_REG, mscr);
373 		if (err < 0)
374 			return err;
375 	}
376 
377 	phy_write(phydev, MII_MARVELL_PHY_PAGE, oldpage);
378 
379 	err = phy_write(phydev, MII_BMCR, BMCR_RESET);
380 	if (err < 0)
381 		return err;
382 
383 	err = phy_write(phydev, MII_M1011_PHY_SCR,
384 			MII_M1011_PHY_SCR_AUTO_CROSS);
385 	if (err < 0)
386 		return err;
387 
388 	oldpage = phy_read(phydev, MII_MARVELL_PHY_PAGE);
389 
390 	phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_88E1121_PHY_LED_PAGE);
391 	phy_write(phydev, MII_88E1121_PHY_LED_CTRL, MII_88E1121_PHY_LED_DEF);
392 	phy_write(phydev, MII_MARVELL_PHY_PAGE, oldpage);
393 
394 	err = genphy_config_aneg(phydev);
395 
396 	return err;
397 }
398 
399 static int m88e1318_config_aneg(struct phy_device *phydev)
400 {
401 	int err, oldpage, mscr;
402 
403 	oldpage = phy_read(phydev, MII_MARVELL_PHY_PAGE);
404 
405 	err = phy_write(phydev, MII_MARVELL_PHY_PAGE,
406 			MII_88E1121_PHY_MSCR_PAGE);
407 	if (err < 0)
408 		return err;
409 
410 	mscr = phy_read(phydev, MII_88E1318S_PHY_MSCR1_REG);
411 	mscr |= MII_88E1318S_PHY_MSCR1_PAD_ODD;
412 
413 	err = phy_write(phydev, MII_88E1318S_PHY_MSCR1_REG, mscr);
414 	if (err < 0)
415 		return err;
416 
417 	err = phy_write(phydev, MII_MARVELL_PHY_PAGE, oldpage);
418 	if (err < 0)
419 		return err;
420 
421 	return m88e1121_config_aneg(phydev);
422 }
423 
424 static int m88e1510_config_aneg(struct phy_device *phydev)
425 {
426 	int err;
427 
428 	err = m88e1318_config_aneg(phydev);
429 	if (err < 0)
430 		return err;
431 
432 	return marvell_of_reg_init(phydev);
433 }
434 
435 static int m88e1116r_config_init(struct phy_device *phydev)
436 {
437 	int temp;
438 	int err;
439 
440 	temp = phy_read(phydev, MII_BMCR);
441 	temp |= BMCR_RESET;
442 	err = phy_write(phydev, MII_BMCR, temp);
443 	if (err < 0)
444 		return err;
445 
446 	mdelay(500);
447 
448 	err = phy_write(phydev, MII_MARVELL_PHY_PAGE, 0);
449 	if (err < 0)
450 		return err;
451 
452 	temp = phy_read(phydev, MII_M1011_PHY_SCR);
453 	temp |= (7 << 12);	/* max number of gigabit attempts */
454 	temp |= (1 << 11);	/* enable downshift */
455 	temp |= MII_M1011_PHY_SCR_AUTO_CROSS;
456 	err = phy_write(phydev, MII_M1011_PHY_SCR, temp);
457 	if (err < 0)
458 		return err;
459 
460 	err = phy_write(phydev, MII_MARVELL_PHY_PAGE, 2);
461 	if (err < 0)
462 		return err;
463 	temp = phy_read(phydev, MII_M1116R_CONTROL_REG_MAC);
464 	temp |= (1 << 5);
465 	temp |= (1 << 4);
466 	err = phy_write(phydev, MII_M1116R_CONTROL_REG_MAC, temp);
467 	if (err < 0)
468 		return err;
469 	err = phy_write(phydev, MII_MARVELL_PHY_PAGE, 0);
470 	if (err < 0)
471 		return err;
472 
473 	temp = phy_read(phydev, MII_BMCR);
474 	temp |= BMCR_RESET;
475 	err = phy_write(phydev, MII_BMCR, temp);
476 	if (err < 0)
477 		return err;
478 
479 	mdelay(500);
480 
481 	return 0;
482 }
483 
484 static int m88e3016_config_init(struct phy_device *phydev)
485 {
486 	int reg;
487 
488 	/* Enable Scrambler and Auto-Crossover */
489 	reg = phy_read(phydev, MII_88E3016_PHY_SPEC_CTRL);
490 	if (reg < 0)
491 		return reg;
492 
493 	reg &= ~MII_88E3016_DISABLE_SCRAMBLER;
494 	reg |= MII_88E3016_AUTO_MDIX_CROSSOVER;
495 
496 	reg = phy_write(phydev, MII_88E3016_PHY_SPEC_CTRL, reg);
497 	if (reg < 0)
498 		return reg;
499 
500 	return 0;
501 }
502 
503 static int m88e1111_config_init(struct phy_device *phydev)
504 {
505 	int err;
506 	int temp;
507 
508 	if (phy_interface_is_rgmii(phydev)) {
509 
510 		temp = phy_read(phydev, MII_M1111_PHY_EXT_CR);
511 		if (temp < 0)
512 			return temp;
513 
514 		if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) {
515 			temp |= (MII_M1111_RX_DELAY | MII_M1111_TX_DELAY);
516 		} else if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID) {
517 			temp &= ~MII_M1111_TX_DELAY;
518 			temp |= MII_M1111_RX_DELAY;
519 		} else if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) {
520 			temp &= ~MII_M1111_RX_DELAY;
521 			temp |= MII_M1111_TX_DELAY;
522 		}
523 
524 		err = phy_write(phydev, MII_M1111_PHY_EXT_CR, temp);
525 		if (err < 0)
526 			return err;
527 
528 		temp = phy_read(phydev, MII_M1111_PHY_EXT_SR);
529 		if (temp < 0)
530 			return temp;
531 
532 		temp &= ~(MII_M1111_HWCFG_MODE_MASK);
533 
534 		if (temp & MII_M1111_HWCFG_FIBER_COPPER_RES)
535 			temp |= MII_M1111_HWCFG_MODE_FIBER_RGMII;
536 		else
537 			temp |= MII_M1111_HWCFG_MODE_COPPER_RGMII;
538 
539 		err = phy_write(phydev, MII_M1111_PHY_EXT_SR, temp);
540 		if (err < 0)
541 			return err;
542 	}
543 
544 	if (phydev->interface == PHY_INTERFACE_MODE_SGMII) {
545 		temp = phy_read(phydev, MII_M1111_PHY_EXT_SR);
546 		if (temp < 0)
547 			return temp;
548 
549 		temp &= ~(MII_M1111_HWCFG_MODE_MASK);
550 		temp |= MII_M1111_HWCFG_MODE_SGMII_NO_CLK;
551 		temp |= MII_M1111_HWCFG_FIBER_COPPER_AUTO;
552 
553 		err = phy_write(phydev, MII_M1111_PHY_EXT_SR, temp);
554 		if (err < 0)
555 			return err;
556 
557 		/* make sure copper is selected */
558 		err = phy_read(phydev, MII_M1145_PHY_EXT_ADDR_PAGE);
559 		if (err < 0)
560 			return err;
561 
562 		err = phy_write(phydev, MII_M1145_PHY_EXT_ADDR_PAGE,
563 				err & (~0xff));
564 		if (err < 0)
565 			return err;
566 	}
567 
568 	if (phydev->interface == PHY_INTERFACE_MODE_RTBI) {
569 		temp = phy_read(phydev, MII_M1111_PHY_EXT_CR);
570 		if (temp < 0)
571 			return temp;
572 		temp |= (MII_M1111_RX_DELAY | MII_M1111_TX_DELAY);
573 		err = phy_write(phydev, MII_M1111_PHY_EXT_CR, temp);
574 		if (err < 0)
575 			return err;
576 
577 		temp = phy_read(phydev, MII_M1111_PHY_EXT_SR);
578 		if (temp < 0)
579 			return temp;
580 		temp &= ~(MII_M1111_HWCFG_MODE_MASK | MII_M1111_HWCFG_FIBER_COPPER_RES);
581 		temp |= 0x7 | MII_M1111_HWCFG_FIBER_COPPER_AUTO;
582 		err = phy_write(phydev, MII_M1111_PHY_EXT_SR, temp);
583 		if (err < 0)
584 			return err;
585 
586 		/* soft reset */
587 		err = phy_write(phydev, MII_BMCR, BMCR_RESET);
588 		if (err < 0)
589 			return err;
590 		do
591 			temp = phy_read(phydev, MII_BMCR);
592 		while (temp & BMCR_RESET);
593 
594 		temp = phy_read(phydev, MII_M1111_PHY_EXT_SR);
595 		if (temp < 0)
596 			return temp;
597 		temp &= ~(MII_M1111_HWCFG_MODE_MASK | MII_M1111_HWCFG_FIBER_COPPER_RES);
598 		temp |= MII_M1111_HWCFG_MODE_COPPER_RTBI | MII_M1111_HWCFG_FIBER_COPPER_AUTO;
599 		err = phy_write(phydev, MII_M1111_PHY_EXT_SR, temp);
600 		if (err < 0)
601 			return err;
602 	}
603 
604 	err = marvell_of_reg_init(phydev);
605 	if (err < 0)
606 		return err;
607 
608 	return phy_write(phydev, MII_BMCR, BMCR_RESET);
609 }
610 
611 static int m88e1118_config_aneg(struct phy_device *phydev)
612 {
613 	int err;
614 
615 	err = phy_write(phydev, MII_BMCR, BMCR_RESET);
616 	if (err < 0)
617 		return err;
618 
619 	err = phy_write(phydev, MII_M1011_PHY_SCR,
620 			MII_M1011_PHY_SCR_AUTO_CROSS);
621 	if (err < 0)
622 		return err;
623 
624 	err = genphy_config_aneg(phydev);
625 	return 0;
626 }
627 
628 static int m88e1118_config_init(struct phy_device *phydev)
629 {
630 	int err;
631 
632 	/* Change address */
633 	err = phy_write(phydev, MII_MARVELL_PHY_PAGE, 0x0002);
634 	if (err < 0)
635 		return err;
636 
637 	/* Enable 1000 Mbit */
638 	err = phy_write(phydev, 0x15, 0x1070);
639 	if (err < 0)
640 		return err;
641 
642 	/* Change address */
643 	err = phy_write(phydev, MII_MARVELL_PHY_PAGE, 0x0003);
644 	if (err < 0)
645 		return err;
646 
647 	/* Adjust LED Control */
648 	if (phydev->dev_flags & MARVELL_PHY_M1118_DNS323_LEDS)
649 		err = phy_write(phydev, 0x10, 0x1100);
650 	else
651 		err = phy_write(phydev, 0x10, 0x021e);
652 	if (err < 0)
653 		return err;
654 
655 	err = marvell_of_reg_init(phydev);
656 	if (err < 0)
657 		return err;
658 
659 	/* Reset address */
660 	err = phy_write(phydev, MII_MARVELL_PHY_PAGE, 0x0);
661 	if (err < 0)
662 		return err;
663 
664 	return phy_write(phydev, MII_BMCR, BMCR_RESET);
665 }
666 
667 static int m88e1149_config_init(struct phy_device *phydev)
668 {
669 	int err;
670 
671 	/* Change address */
672 	err = phy_write(phydev, MII_MARVELL_PHY_PAGE, 0x0002);
673 	if (err < 0)
674 		return err;
675 
676 	/* Enable 1000 Mbit */
677 	err = phy_write(phydev, 0x15, 0x1048);
678 	if (err < 0)
679 		return err;
680 
681 	err = marvell_of_reg_init(phydev);
682 	if (err < 0)
683 		return err;
684 
685 	/* Reset address */
686 	err = phy_write(phydev, MII_MARVELL_PHY_PAGE, 0x0);
687 	if (err < 0)
688 		return err;
689 
690 	return phy_write(phydev, MII_BMCR, BMCR_RESET);
691 }
692 
693 static int m88e1145_config_init(struct phy_device *phydev)
694 {
695 	int err;
696 	int temp;
697 
698 	/* Take care of errata E0 & E1 */
699 	err = phy_write(phydev, 0x1d, 0x001b);
700 	if (err < 0)
701 		return err;
702 
703 	err = phy_write(phydev, 0x1e, 0x418f);
704 	if (err < 0)
705 		return err;
706 
707 	err = phy_write(phydev, 0x1d, 0x0016);
708 	if (err < 0)
709 		return err;
710 
711 	err = phy_write(phydev, 0x1e, 0xa2da);
712 	if (err < 0)
713 		return err;
714 
715 	if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) {
716 		int temp = phy_read(phydev, MII_M1145_PHY_EXT_CR);
717 		if (temp < 0)
718 			return temp;
719 
720 		temp |= (MII_M1145_RGMII_RX_DELAY | MII_M1145_RGMII_TX_DELAY);
721 
722 		err = phy_write(phydev, MII_M1145_PHY_EXT_CR, temp);
723 		if (err < 0)
724 			return err;
725 
726 		if (phydev->dev_flags & MARVELL_PHY_M1145_FLAGS_RESISTANCE) {
727 			err = phy_write(phydev, 0x1d, 0x0012);
728 			if (err < 0)
729 				return err;
730 
731 			temp = phy_read(phydev, 0x1e);
732 			if (temp < 0)
733 				return temp;
734 
735 			temp &= 0xf03f;
736 			temp |= 2 << 9;	/* 36 ohm */
737 			temp |= 2 << 6;	/* 39 ohm */
738 
739 			err = phy_write(phydev, 0x1e, temp);
740 			if (err < 0)
741 				return err;
742 
743 			err = phy_write(phydev, 0x1d, 0x3);
744 			if (err < 0)
745 				return err;
746 
747 			err = phy_write(phydev, 0x1e, 0x8000);
748 			if (err < 0)
749 				return err;
750 		}
751 	}
752 
753 	if (phydev->interface == PHY_INTERFACE_MODE_SGMII) {
754 		temp = phy_read(phydev, MII_M1145_PHY_EXT_SR);
755 		if (temp < 0)
756 			return temp;
757 
758 		temp &= ~MII_M1145_HWCFG_MODE_MASK;
759 		temp |= MII_M1145_HWCFG_MODE_SGMII_NO_CLK;
760 		temp |= MII_M1145_HWCFG_FIBER_COPPER_AUTO;
761 
762 		err = phy_write(phydev, MII_M1145_PHY_EXT_SR, temp);
763 		if (err < 0)
764 			return err;
765 	}
766 
767 	err = marvell_of_reg_init(phydev);
768 	if (err < 0)
769 		return err;
770 
771 	return 0;
772 }
773 
774 /* marvell_read_status
775  *
776  * Generic status code does not detect Fiber correctly!
777  * Description:
778  *   Check the link, then figure out the current state
779  *   by comparing what we advertise with what the link partner
780  *   advertises.  Start by checking the gigabit possibilities,
781  *   then move on to 10/100.
782  */
783 static int marvell_read_status(struct phy_device *phydev)
784 {
785 	int adv;
786 	int err;
787 	int lpa;
788 	int status = 0;
789 
790 	/* Update the link, but return if there
791 	 * was an error */
792 	err = genphy_update_link(phydev);
793 	if (err)
794 		return err;
795 
796 	if (AUTONEG_ENABLE == phydev->autoneg) {
797 		status = phy_read(phydev, MII_M1011_PHY_STATUS);
798 		if (status < 0)
799 			return status;
800 
801 		lpa = phy_read(phydev, MII_LPA);
802 		if (lpa < 0)
803 			return lpa;
804 
805 		adv = phy_read(phydev, MII_ADVERTISE);
806 		if (adv < 0)
807 			return adv;
808 
809 		lpa &= adv;
810 
811 		if (status & MII_M1011_PHY_STATUS_FULLDUPLEX)
812 			phydev->duplex = DUPLEX_FULL;
813 		else
814 			phydev->duplex = DUPLEX_HALF;
815 
816 		status = status & MII_M1011_PHY_STATUS_SPD_MASK;
817 		phydev->pause = phydev->asym_pause = 0;
818 
819 		switch (status) {
820 		case MII_M1011_PHY_STATUS_1000:
821 			phydev->speed = SPEED_1000;
822 			break;
823 
824 		case MII_M1011_PHY_STATUS_100:
825 			phydev->speed = SPEED_100;
826 			break;
827 
828 		default:
829 			phydev->speed = SPEED_10;
830 			break;
831 		}
832 
833 		if (phydev->duplex == DUPLEX_FULL) {
834 			phydev->pause = lpa & LPA_PAUSE_CAP ? 1 : 0;
835 			phydev->asym_pause = lpa & LPA_PAUSE_ASYM ? 1 : 0;
836 		}
837 	} else {
838 		int bmcr = phy_read(phydev, MII_BMCR);
839 
840 		if (bmcr < 0)
841 			return bmcr;
842 
843 		if (bmcr & BMCR_FULLDPLX)
844 			phydev->duplex = DUPLEX_FULL;
845 		else
846 			phydev->duplex = DUPLEX_HALF;
847 
848 		if (bmcr & BMCR_SPEED1000)
849 			phydev->speed = SPEED_1000;
850 		else if (bmcr & BMCR_SPEED100)
851 			phydev->speed = SPEED_100;
852 		else
853 			phydev->speed = SPEED_10;
854 
855 		phydev->pause = phydev->asym_pause = 0;
856 	}
857 
858 	return 0;
859 }
860 
861 static int marvell_aneg_done(struct phy_device *phydev)
862 {
863 	int retval = phy_read(phydev, MII_M1011_PHY_STATUS);
864 	return (retval < 0) ? retval : (retval & MII_M1011_PHY_STATUS_RESOLVED);
865 }
866 
867 static int m88e1121_did_interrupt(struct phy_device *phydev)
868 {
869 	int imask;
870 
871 	imask = phy_read(phydev, MII_M1011_IEVENT);
872 
873 	if (imask & MII_M1011_IMASK_INIT)
874 		return 1;
875 
876 	return 0;
877 }
878 
879 static void m88e1318_get_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol)
880 {
881 	wol->supported = WAKE_MAGIC;
882 	wol->wolopts = 0;
883 
884 	if (phy_write(phydev, MII_MARVELL_PHY_PAGE,
885 		      MII_88E1318S_PHY_WOL_PAGE) < 0)
886 		return;
887 
888 	if (phy_read(phydev, MII_88E1318S_PHY_WOL_CTRL) &
889 	    MII_88E1318S_PHY_WOL_CTRL_MAGIC_PACKET_MATCH_ENABLE)
890 		wol->wolopts |= WAKE_MAGIC;
891 
892 	if (phy_write(phydev, MII_MARVELL_PHY_PAGE, 0x00) < 0)
893 		return;
894 }
895 
896 static int m88e1318_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol)
897 {
898 	int err, oldpage, temp;
899 
900 	oldpage = phy_read(phydev, MII_MARVELL_PHY_PAGE);
901 
902 	if (wol->wolopts & WAKE_MAGIC) {
903 		/* Explicitly switch to page 0x00, just to be sure */
904 		err = phy_write(phydev, MII_MARVELL_PHY_PAGE, 0x00);
905 		if (err < 0)
906 			return err;
907 
908 		/* Enable the WOL interrupt */
909 		temp = phy_read(phydev, MII_88E1318S_PHY_CSIER);
910 		temp |= MII_88E1318S_PHY_CSIER_WOL_EIE;
911 		err = phy_write(phydev, MII_88E1318S_PHY_CSIER, temp);
912 		if (err < 0)
913 			return err;
914 
915 		err = phy_write(phydev, MII_MARVELL_PHY_PAGE,
916 				MII_88E1318S_PHY_LED_PAGE);
917 		if (err < 0)
918 			return err;
919 
920 		/* Setup LED[2] as interrupt pin (active low) */
921 		temp = phy_read(phydev, MII_88E1318S_PHY_LED_TCR);
922 		temp &= ~MII_88E1318S_PHY_LED_TCR_FORCE_INT;
923 		temp |= MII_88E1318S_PHY_LED_TCR_INTn_ENABLE;
924 		temp |= MII_88E1318S_PHY_LED_TCR_INT_ACTIVE_LOW;
925 		err = phy_write(phydev, MII_88E1318S_PHY_LED_TCR, temp);
926 		if (err < 0)
927 			return err;
928 
929 		err = phy_write(phydev, MII_MARVELL_PHY_PAGE,
930 				MII_88E1318S_PHY_WOL_PAGE);
931 		if (err < 0)
932 			return err;
933 
934 		/* Store the device address for the magic packet */
935 		err = phy_write(phydev, MII_88E1318S_PHY_MAGIC_PACKET_WORD2,
936 				((phydev->attached_dev->dev_addr[5] << 8) |
937 				 phydev->attached_dev->dev_addr[4]));
938 		if (err < 0)
939 			return err;
940 		err = phy_write(phydev, MII_88E1318S_PHY_MAGIC_PACKET_WORD1,
941 				((phydev->attached_dev->dev_addr[3] << 8) |
942 				 phydev->attached_dev->dev_addr[2]));
943 		if (err < 0)
944 			return err;
945 		err = phy_write(phydev, MII_88E1318S_PHY_MAGIC_PACKET_WORD0,
946 				((phydev->attached_dev->dev_addr[1] << 8) |
947 				 phydev->attached_dev->dev_addr[0]));
948 		if (err < 0)
949 			return err;
950 
951 		/* Clear WOL status and enable magic packet matching */
952 		temp = phy_read(phydev, MII_88E1318S_PHY_WOL_CTRL);
953 		temp |= MII_88E1318S_PHY_WOL_CTRL_CLEAR_WOL_STATUS;
954 		temp |= MII_88E1318S_PHY_WOL_CTRL_MAGIC_PACKET_MATCH_ENABLE;
955 		err = phy_write(phydev, MII_88E1318S_PHY_WOL_CTRL, temp);
956 		if (err < 0)
957 			return err;
958 	} else {
959 		err = phy_write(phydev, MII_MARVELL_PHY_PAGE,
960 				MII_88E1318S_PHY_WOL_PAGE);
961 		if (err < 0)
962 			return err;
963 
964 		/* Clear WOL status and disable magic packet matching */
965 		temp = phy_read(phydev, MII_88E1318S_PHY_WOL_CTRL);
966 		temp |= MII_88E1318S_PHY_WOL_CTRL_CLEAR_WOL_STATUS;
967 		temp &= ~MII_88E1318S_PHY_WOL_CTRL_MAGIC_PACKET_MATCH_ENABLE;
968 		err = phy_write(phydev, MII_88E1318S_PHY_WOL_CTRL, temp);
969 		if (err < 0)
970 			return err;
971 	}
972 
973 	err = phy_write(phydev, MII_MARVELL_PHY_PAGE, oldpage);
974 	if (err < 0)
975 		return err;
976 
977 	return 0;
978 }
979 
980 static struct phy_driver marvell_drivers[] = {
981 	{
982 		.phy_id = MARVELL_PHY_ID_88E1101,
983 		.phy_id_mask = MARVELL_PHY_ID_MASK,
984 		.name = "Marvell 88E1101",
985 		.features = PHY_GBIT_FEATURES,
986 		.flags = PHY_HAS_INTERRUPT,
987 		.config_aneg = &marvell_config_aneg,
988 		.read_status = &genphy_read_status,
989 		.ack_interrupt = &marvell_ack_interrupt,
990 		.config_intr = &marvell_config_intr,
991 		.resume = &genphy_resume,
992 		.suspend = &genphy_suspend,
993 		.driver = { .owner = THIS_MODULE },
994 	},
995 	{
996 		.phy_id = MARVELL_PHY_ID_88E1112,
997 		.phy_id_mask = MARVELL_PHY_ID_MASK,
998 		.name = "Marvell 88E1112",
999 		.features = PHY_GBIT_FEATURES,
1000 		.flags = PHY_HAS_INTERRUPT,
1001 		.config_init = &m88e1111_config_init,
1002 		.config_aneg = &marvell_config_aneg,
1003 		.read_status = &genphy_read_status,
1004 		.ack_interrupt = &marvell_ack_interrupt,
1005 		.config_intr = &marvell_config_intr,
1006 		.resume = &genphy_resume,
1007 		.suspend = &genphy_suspend,
1008 		.driver = { .owner = THIS_MODULE },
1009 	},
1010 	{
1011 		.phy_id = MARVELL_PHY_ID_88E1111,
1012 		.phy_id_mask = MARVELL_PHY_ID_MASK,
1013 		.name = "Marvell 88E1111",
1014 		.features = PHY_GBIT_FEATURES,
1015 		.flags = PHY_HAS_INTERRUPT,
1016 		.config_init = &m88e1111_config_init,
1017 		.config_aneg = &marvell_config_aneg,
1018 		.read_status = &marvell_read_status,
1019 		.ack_interrupt = &marvell_ack_interrupt,
1020 		.config_intr = &marvell_config_intr,
1021 		.resume = &genphy_resume,
1022 		.suspend = &genphy_suspend,
1023 		.driver = { .owner = THIS_MODULE },
1024 	},
1025 	{
1026 		.phy_id = MARVELL_PHY_ID_88E1118,
1027 		.phy_id_mask = MARVELL_PHY_ID_MASK,
1028 		.name = "Marvell 88E1118",
1029 		.features = PHY_GBIT_FEATURES,
1030 		.flags = PHY_HAS_INTERRUPT,
1031 		.config_init = &m88e1118_config_init,
1032 		.config_aneg = &m88e1118_config_aneg,
1033 		.read_status = &genphy_read_status,
1034 		.ack_interrupt = &marvell_ack_interrupt,
1035 		.config_intr = &marvell_config_intr,
1036 		.resume = &genphy_resume,
1037 		.suspend = &genphy_suspend,
1038 		.driver = {.owner = THIS_MODULE,},
1039 	},
1040 	{
1041 		.phy_id = MARVELL_PHY_ID_88E1121R,
1042 		.phy_id_mask = MARVELL_PHY_ID_MASK,
1043 		.name = "Marvell 88E1121R",
1044 		.features = PHY_GBIT_FEATURES,
1045 		.flags = PHY_HAS_INTERRUPT,
1046 		.config_aneg = &m88e1121_config_aneg,
1047 		.read_status = &marvell_read_status,
1048 		.ack_interrupt = &marvell_ack_interrupt,
1049 		.config_intr = &marvell_config_intr,
1050 		.did_interrupt = &m88e1121_did_interrupt,
1051 		.resume = &genphy_resume,
1052 		.suspend = &genphy_suspend,
1053 		.driver = { .owner = THIS_MODULE },
1054 	},
1055 	{
1056 		.phy_id = MARVELL_PHY_ID_88E1318S,
1057 		.phy_id_mask = MARVELL_PHY_ID_MASK,
1058 		.name = "Marvell 88E1318S",
1059 		.features = PHY_GBIT_FEATURES,
1060 		.flags = PHY_HAS_INTERRUPT,
1061 		.config_aneg = &m88e1318_config_aneg,
1062 		.read_status = &marvell_read_status,
1063 		.ack_interrupt = &marvell_ack_interrupt,
1064 		.config_intr = &marvell_config_intr,
1065 		.did_interrupt = &m88e1121_did_interrupt,
1066 		.get_wol = &m88e1318_get_wol,
1067 		.set_wol = &m88e1318_set_wol,
1068 		.resume = &genphy_resume,
1069 		.suspend = &genphy_suspend,
1070 		.driver = { .owner = THIS_MODULE },
1071 	},
1072 	{
1073 		.phy_id = MARVELL_PHY_ID_88E1145,
1074 		.phy_id_mask = MARVELL_PHY_ID_MASK,
1075 		.name = "Marvell 88E1145",
1076 		.features = PHY_GBIT_FEATURES,
1077 		.flags = PHY_HAS_INTERRUPT,
1078 		.config_init = &m88e1145_config_init,
1079 		.config_aneg = &marvell_config_aneg,
1080 		.read_status = &genphy_read_status,
1081 		.ack_interrupt = &marvell_ack_interrupt,
1082 		.config_intr = &marvell_config_intr,
1083 		.resume = &genphy_resume,
1084 		.suspend = &genphy_suspend,
1085 		.driver = { .owner = THIS_MODULE },
1086 	},
1087 	{
1088 		.phy_id = MARVELL_PHY_ID_88E1149R,
1089 		.phy_id_mask = MARVELL_PHY_ID_MASK,
1090 		.name = "Marvell 88E1149R",
1091 		.features = PHY_GBIT_FEATURES,
1092 		.flags = PHY_HAS_INTERRUPT,
1093 		.config_init = &m88e1149_config_init,
1094 		.config_aneg = &m88e1118_config_aneg,
1095 		.read_status = &genphy_read_status,
1096 		.ack_interrupt = &marvell_ack_interrupt,
1097 		.config_intr = &marvell_config_intr,
1098 		.resume = &genphy_resume,
1099 		.suspend = &genphy_suspend,
1100 		.driver = { .owner = THIS_MODULE },
1101 	},
1102 	{
1103 		.phy_id = MARVELL_PHY_ID_88E1240,
1104 		.phy_id_mask = MARVELL_PHY_ID_MASK,
1105 		.name = "Marvell 88E1240",
1106 		.features = PHY_GBIT_FEATURES,
1107 		.flags = PHY_HAS_INTERRUPT,
1108 		.config_init = &m88e1111_config_init,
1109 		.config_aneg = &marvell_config_aneg,
1110 		.read_status = &genphy_read_status,
1111 		.ack_interrupt = &marvell_ack_interrupt,
1112 		.config_intr = &marvell_config_intr,
1113 		.resume = &genphy_resume,
1114 		.suspend = &genphy_suspend,
1115 		.driver = { .owner = THIS_MODULE },
1116 	},
1117 	{
1118 		.phy_id = MARVELL_PHY_ID_88E1116R,
1119 		.phy_id_mask = MARVELL_PHY_ID_MASK,
1120 		.name = "Marvell 88E1116R",
1121 		.features = PHY_GBIT_FEATURES,
1122 		.flags = PHY_HAS_INTERRUPT,
1123 		.config_init = &m88e1116r_config_init,
1124 		.config_aneg = &genphy_config_aneg,
1125 		.read_status = &genphy_read_status,
1126 		.ack_interrupt = &marvell_ack_interrupt,
1127 		.config_intr = &marvell_config_intr,
1128 		.resume = &genphy_resume,
1129 		.suspend = &genphy_suspend,
1130 		.driver = { .owner = THIS_MODULE },
1131 	},
1132 	{
1133 		.phy_id = MARVELL_PHY_ID_88E1510,
1134 		.phy_id_mask = MARVELL_PHY_ID_MASK,
1135 		.name = "Marvell 88E1510",
1136 		.features = PHY_GBIT_FEATURES,
1137 		.flags = PHY_HAS_INTERRUPT,
1138 		.config_aneg = &m88e1510_config_aneg,
1139 		.read_status = &marvell_read_status,
1140 		.ack_interrupt = &marvell_ack_interrupt,
1141 		.config_intr = &marvell_config_intr,
1142 		.did_interrupt = &m88e1121_did_interrupt,
1143 		.resume = &genphy_resume,
1144 		.suspend = &genphy_suspend,
1145 		.driver = { .owner = THIS_MODULE },
1146 	},
1147 	{
1148 		.phy_id = MARVELL_PHY_ID_88E3016,
1149 		.phy_id_mask = MARVELL_PHY_ID_MASK,
1150 		.name = "Marvell 88E3016",
1151 		.features = PHY_BASIC_FEATURES,
1152 		.flags = PHY_HAS_INTERRUPT,
1153 		.config_aneg = &genphy_config_aneg,
1154 		.config_init = &m88e3016_config_init,
1155 		.aneg_done = &marvell_aneg_done,
1156 		.read_status = &marvell_read_status,
1157 		.ack_interrupt = &marvell_ack_interrupt,
1158 		.config_intr = &marvell_config_intr,
1159 		.did_interrupt = &m88e1121_did_interrupt,
1160 		.resume = &genphy_resume,
1161 		.suspend = &genphy_suspend,
1162 		.driver = { .owner = THIS_MODULE },
1163 	},
1164 };
1165 
1166 module_phy_driver(marvell_drivers);
1167 
1168 static struct mdio_device_id __maybe_unused marvell_tbl[] = {
1169 	{ MARVELL_PHY_ID_88E1101, MARVELL_PHY_ID_MASK },
1170 	{ MARVELL_PHY_ID_88E1112, MARVELL_PHY_ID_MASK },
1171 	{ MARVELL_PHY_ID_88E1111, MARVELL_PHY_ID_MASK },
1172 	{ MARVELL_PHY_ID_88E1118, MARVELL_PHY_ID_MASK },
1173 	{ MARVELL_PHY_ID_88E1121R, MARVELL_PHY_ID_MASK },
1174 	{ MARVELL_PHY_ID_88E1145, MARVELL_PHY_ID_MASK },
1175 	{ MARVELL_PHY_ID_88E1149R, MARVELL_PHY_ID_MASK },
1176 	{ MARVELL_PHY_ID_88E1240, MARVELL_PHY_ID_MASK },
1177 	{ MARVELL_PHY_ID_88E1318S, MARVELL_PHY_ID_MASK },
1178 	{ MARVELL_PHY_ID_88E1116R, MARVELL_PHY_ID_MASK },
1179 	{ MARVELL_PHY_ID_88E1510, MARVELL_PHY_ID_MASK },
1180 	{ MARVELL_PHY_ID_88E3016, MARVELL_PHY_ID_MASK },
1181 	{ }
1182 };
1183 
1184 MODULE_DEVICE_TABLE(mdio, marvell_tbl);
1185