]> git.sur5r.net Git - u-boot/blob - drivers/net/phy/mv88e61xx.c
net: mv88e61xx: Add support for fixed links
[u-boot] / drivers / net / phy / mv88e61xx.c
1 /*
2  * (C) Copyright 2015
3  * Elecsys Corporation <www.elecsyscorp.com>
4  * Kevin Smith <kevin.smith@elecsyscorp.com>
5  *
6  * Original driver:
7  * (C) Copyright 2009
8  * Marvell Semiconductor <www.marvell.com>
9  * Prafulla Wadaskar <prafulla@marvell.com>
10  *
11  * SPDX-License-Identifier:     GPL-2.0+
12  */
13
14 /*
15  * PHY driver for mv88e61xx ethernet switches.
16  *
17  * This driver configures the mv88e61xx for basic use as a PHY.  The switch
18  * supports a VLAN configuration that determines how traffic will be routed
19  * between the ports.  This driver uses a simple configuration that routes
20  * traffic from each PHY port only to the CPU port, and from the CPU port to
21  * any PHY port.
22  *
23  * The configuration determines which PHY ports to activate using the
24  * CONFIG_MV88E61XX_PHY_PORTS bitmask.  Setting bit 0 will activate port 0, bit
25  * 1 activates port 1, etc.  Do not set the bit for the port the CPU is
26  * connected to unless it is connected over a PHY interface (not MII).
27  *
28  * This driver was written for and tested on the mv88e6176 with an SGMII
29  * connection.  Other configurations should be supported, but some additions or
30  * changes may be required.
31  */
32
33 #include <common.h>
34
35 #include <bitfield.h>
36 #include <errno.h>
37 #include <malloc.h>
38 #include <miiphy.h>
39 #include <netdev.h>
40
41 #define PHY_AUTONEGOTIATE_TIMEOUT       5000
42
43 #define PORT_COUNT                      11
44 #define PORT_MASK                       ((1 << PORT_COUNT) - 1)
45
46 /* Device addresses */
47 #define DEVADDR_PHY(p)                  (p)
48 #define DEVADDR_PORT(p)                 (0x10 + (p))
49 #define DEVADDR_SERDES                  0x0F
50 #define DEVADDR_GLOBAL_1                0x1B
51 #define DEVADDR_GLOBAL_2                0x1C
52
53 /* SMI indirection registers for multichip addressing mode */
54 #define SMI_CMD_REG                     0x00
55 #define SMI_DATA_REG                    0x01
56
57 /* Global registers */
58 #define GLOBAL1_STATUS                  0x00
59 #define GLOBAL1_CTRL                    0x04
60 #define GLOBAL1_MON_CTRL                0x1A
61
62 /* Global 2 registers */
63 #define GLOBAL2_REG_PHY_CMD             0x18
64 #define GLOBAL2_REG_PHY_DATA            0x19
65
66 /* Port registers */
67 #define PORT_REG_STATUS                 0x00
68 #define PORT_REG_PHYS_CTRL              0x01
69 #define PORT_REG_SWITCH_ID              0x03
70 #define PORT_REG_CTRL                   0x04
71 #define PORT_REG_VLAN_MAP               0x06
72 #define PORT_REG_VLAN_ID                0x07
73
74 /* Phy registers */
75 #define PHY_REG_CTRL1                   0x10
76 #define PHY_REG_STATUS1                 0x11
77 #define PHY_REG_PAGE                    0x16
78
79 /* Serdes registers */
80 #define SERDES_REG_CTRL_1               0x10
81
82 /* Phy page numbers */
83 #define PHY_PAGE_COPPER                 0
84 #define PHY_PAGE_SERDES                 1
85
86 /* Register fields */
87 #define GLOBAL1_CTRL_SWRESET            BIT(15)
88
89 #define GLOBAL1_MON_CTRL_CPUDEST_SHIFT  4
90 #define GLOBAL1_MON_CTRL_CPUDEST_WIDTH  4
91
92 #define PORT_REG_STATUS_LINK            BIT(11)
93 #define PORT_REG_STATUS_DUPLEX          BIT(10)
94
95 #define PORT_REG_STATUS_SPEED_SHIFT     8
96 #define PORT_REG_STATUS_SPEED_WIDTH     2
97 #define PORT_REG_STATUS_SPEED_10        0
98 #define PORT_REG_STATUS_SPEED_100       1
99 #define PORT_REG_STATUS_SPEED_1000      2
100
101 #define PORT_REG_STATUS_CMODE_MASK              0xF
102 #define PORT_REG_STATUS_CMODE_100BASE_X         0x8
103 #define PORT_REG_STATUS_CMODE_1000BASE_X        0x9
104 #define PORT_REG_STATUS_CMODE_SGMII             0xa
105
106 #define PORT_REG_PHYS_CTRL_PCS_AN_EN    BIT(10)
107 #define PORT_REG_PHYS_CTRL_PCS_AN_RST   BIT(9)
108 #define PORT_REG_PHYS_CTRL_FC_VALUE     BIT(7)
109 #define PORT_REG_PHYS_CTRL_FC_FORCE     BIT(6)
110 #define PORT_REG_PHYS_CTRL_LINK_VALUE   BIT(5)
111 #define PORT_REG_PHYS_CTRL_LINK_FORCE   BIT(4)
112 #define PORT_REG_PHYS_CTRL_DUPLEX_VALUE BIT(3)
113 #define PORT_REG_PHYS_CTRL_DUPLEX_FORCE BIT(2)
114 #define PORT_REG_PHYS_CTRL_SPD1000      BIT(1)
115 #define PORT_REG_PHYS_CTRL_SPD_MASK     (BIT(1) | BIT(0))
116
117 #define PORT_REG_CTRL_PSTATE_SHIFT      0
118 #define PORT_REG_CTRL_PSTATE_WIDTH      2
119
120 #define PORT_REG_VLAN_ID_DEF_VID_SHIFT  0
121 #define PORT_REG_VLAN_ID_DEF_VID_WIDTH  12
122
123 #define PORT_REG_VLAN_MAP_TABLE_SHIFT   0
124 #define PORT_REG_VLAN_MAP_TABLE_WIDTH   11
125
126 #define SERDES_REG_CTRL_1_FORCE_LINK    BIT(10)
127
128 #define PHY_REG_CTRL1_ENERGY_DET_SHIFT  8
129 #define PHY_REG_CTRL1_ENERGY_DET_WIDTH  2
130
131 /* Field values */
132 #define PORT_REG_CTRL_PSTATE_DISABLED   0
133 #define PORT_REG_CTRL_PSTATE_FORWARD    3
134
135 #define PHY_REG_CTRL1_ENERGY_DET_OFF    0
136 #define PHY_REG_CTRL1_ENERGY_DET_SENSE_ONLY     2
137 #define PHY_REG_CTRL1_ENERGY_DET_SENSE_XMIT     3
138
139 /* PHY Status Register */
140 #define PHY_REG_STATUS1_SPEED           0xc000
141 #define PHY_REG_STATUS1_GBIT            0x8000
142 #define PHY_REG_STATUS1_100             0x4000
143 #define PHY_REG_STATUS1_DUPLEX          0x2000
144 #define PHY_REG_STATUS1_SPDDONE         0x0800
145 #define PHY_REG_STATUS1_LINK            0x0400
146 #define PHY_REG_STATUS1_ENERGY          0x0010
147
148 /*
149  * Macros for building commands for indirect addressing modes.  These are valid
150  * for both the indirect multichip addressing mode and the PHY indirection
151  * required for the writes to any PHY register.
152  */
153 #define SMI_BUSY                        BIT(15)
154 #define SMI_CMD_CLAUSE_22               BIT(12)
155 #define SMI_CMD_CLAUSE_22_OP_READ       (2 << 10)
156 #define SMI_CMD_CLAUSE_22_OP_WRITE      (1 << 10)
157
158 #define SMI_CMD_READ                    (SMI_BUSY | SMI_CMD_CLAUSE_22 | \
159                                          SMI_CMD_CLAUSE_22_OP_READ)
160 #define SMI_CMD_WRITE                   (SMI_BUSY | SMI_CMD_CLAUSE_22 | \
161                                          SMI_CMD_CLAUSE_22_OP_WRITE)
162
163 #define SMI_CMD_ADDR_SHIFT              5
164 #define SMI_CMD_ADDR_WIDTH              5
165 #define SMI_CMD_REG_SHIFT               0
166 #define SMI_CMD_REG_WIDTH               5
167
168 /* Check for required macros */
169 #ifndef CONFIG_MV88E61XX_PHY_PORTS
170 #error Define CONFIG_MV88E61XX_PHY_PORTS to indicate which physical ports \
171         to activate
172 #endif
173 #ifndef CONFIG_MV88E61XX_CPU_PORT
174 #error Define CONFIG_MV88E61XX_CPU_PORT to the port the CPU is attached to
175 #endif
176
177 /*
178  *  These are ports without PHYs that may be wired directly
179  * to other serdes interfaces
180  */
181 #ifndef CONFIG_MV88E61XX_FIXED_PORTS
182 #define CONFIG_MV88E61XX_FIXED_PORTS 0
183 #endif
184
185 /* ID register values for different switch models */
186 #define PORT_SWITCH_ID_6096             0x0980
187 #define PORT_SWITCH_ID_6097             0x0990
188 #define PORT_SWITCH_ID_6172             0x1720
189 #define PORT_SWITCH_ID_6176             0x1760
190 #define PORT_SWITCH_ID_6240             0x2400
191 #define PORT_SWITCH_ID_6352             0x3520
192
193 struct mv88e61xx_phy_priv {
194         struct mii_dev *mdio_bus;
195         int smi_addr;
196         int id;
197 };
198
199 static inline int smi_cmd(int cmd, int addr, int reg)
200 {
201         cmd = bitfield_replace(cmd, SMI_CMD_ADDR_SHIFT, SMI_CMD_ADDR_WIDTH,
202                                addr);
203         cmd = bitfield_replace(cmd, SMI_CMD_REG_SHIFT, SMI_CMD_REG_WIDTH, reg);
204         return cmd;
205 }
206
207 static inline int smi_cmd_read(int addr, int reg)
208 {
209         return smi_cmd(SMI_CMD_READ, addr, reg);
210 }
211
212 static inline int smi_cmd_write(int addr, int reg)
213 {
214         return smi_cmd(SMI_CMD_WRITE, addr, reg);
215 }
216
217 __weak int mv88e61xx_hw_reset(struct phy_device *phydev)
218 {
219         return 0;
220 }
221
222 /* Wait for the current SMI indirect command to complete */
223 static int mv88e61xx_smi_wait(struct mii_dev *bus, int smi_addr)
224 {
225         int val;
226         u32 timeout = 100;
227
228         do {
229                 val = bus->read(bus, smi_addr, MDIO_DEVAD_NONE, SMI_CMD_REG);
230                 if (val >= 0 && (val & SMI_BUSY) == 0)
231                         return 0;
232
233                 mdelay(1);
234         } while (--timeout);
235
236         puts("SMI busy timeout\n");
237         return -ETIMEDOUT;
238 }
239
240 /*
241  * The mv88e61xx has three types of addresses: the smi bus address, the device
242  * address, and the register address.  The smi bus address distinguishes it on
243  * the smi bus from other PHYs or switches.  The device address determines
244  * which on-chip register set you are reading/writing (the various PHYs, their
245  * associated ports, or global configuration registers).  The register address
246  * is the offset of the register you are reading/writing.
247  *
248  * When the mv88e61xx is hardware configured to have address zero, it behaves in
249  * single-chip addressing mode, where it responds to all SMI addresses, using
250  * the smi address as its device address.  This obviously only works when this
251  * is the only chip on the SMI bus.  This allows the driver to access device
252  * registers without using indirection.  When the chip is configured to a
253  * non-zero address, it only responds to that SMI address and requires indirect
254  * writes to access the different device addresses.
255  */
256 static int mv88e61xx_reg_read(struct phy_device *phydev, int dev, int reg)
257 {
258         struct mv88e61xx_phy_priv *priv = phydev->priv;
259         struct mii_dev *mdio_bus = priv->mdio_bus;
260         int smi_addr = priv->smi_addr;
261         int res;
262
263         /* In single-chip mode, the device can be addressed directly */
264         if (smi_addr == 0)
265                 return mdio_bus->read(mdio_bus, dev, MDIO_DEVAD_NONE, reg);
266
267         /* Wait for the bus to become free */
268         res = mv88e61xx_smi_wait(mdio_bus, smi_addr);
269         if (res < 0)
270                 return res;
271
272         /* Issue the read command */
273         res = mdio_bus->write(mdio_bus, smi_addr, MDIO_DEVAD_NONE, SMI_CMD_REG,
274                          smi_cmd_read(dev, reg));
275         if (res < 0)
276                 return res;
277
278         /* Wait for the read command to complete */
279         res = mv88e61xx_smi_wait(mdio_bus, smi_addr);
280         if (res < 0)
281                 return res;
282
283         /* Read the data */
284         res = mdio_bus->read(mdio_bus, smi_addr, MDIO_DEVAD_NONE, SMI_DATA_REG);
285         if (res < 0)
286                 return res;
287
288         return bitfield_extract(res, 0, 16);
289 }
290
291 /* See the comment above mv88e61xx_reg_read */
292 static int mv88e61xx_reg_write(struct phy_device *phydev, int dev, int reg,
293                                u16 val)
294 {
295         struct mv88e61xx_phy_priv *priv = phydev->priv;
296         struct mii_dev *mdio_bus = priv->mdio_bus;
297         int smi_addr = priv->smi_addr;
298         int res;
299
300         /* In single-chip mode, the device can be addressed directly */
301         if (smi_addr == 0) {
302                 return mdio_bus->write(mdio_bus, dev, MDIO_DEVAD_NONE, reg,
303                                 val);
304         }
305
306         /* Wait for the bus to become free */
307         res = mv88e61xx_smi_wait(mdio_bus, smi_addr);
308         if (res < 0)
309                 return res;
310
311         /* Set the data to write */
312         res = mdio_bus->write(mdio_bus, smi_addr, MDIO_DEVAD_NONE,
313                                 SMI_DATA_REG, val);
314         if (res < 0)
315                 return res;
316
317         /* Issue the write command */
318         res = mdio_bus->write(mdio_bus, smi_addr, MDIO_DEVAD_NONE, SMI_CMD_REG,
319                                 smi_cmd_write(dev, reg));
320         if (res < 0)
321                 return res;
322
323         /* Wait for the write command to complete */
324         res = mv88e61xx_smi_wait(mdio_bus, smi_addr);
325         if (res < 0)
326                 return res;
327
328         return 0;
329 }
330
331 static int mv88e61xx_phy_wait(struct phy_device *phydev)
332 {
333         int val;
334         u32 timeout = 100;
335
336         do {
337                 val = mv88e61xx_reg_read(phydev, DEVADDR_GLOBAL_2,
338                                          GLOBAL2_REG_PHY_CMD);
339                 if (val >= 0 && (val & SMI_BUSY) == 0)
340                         return 0;
341
342                 mdelay(1);
343         } while (--timeout);
344
345         return -ETIMEDOUT;
346 }
347
348 static int mv88e61xx_phy_read_indirect(struct mii_dev *smi_wrapper, int dev,
349                 int devad, int reg)
350 {
351         struct phy_device *phydev;
352         int res;
353
354         phydev = (struct phy_device *)smi_wrapper->priv;
355
356         /* Issue command to read */
357         res = mv88e61xx_reg_write(phydev, DEVADDR_GLOBAL_2,
358                                   GLOBAL2_REG_PHY_CMD,
359                                   smi_cmd_read(dev, reg));
360
361         /* Wait for data to be read */
362         res = mv88e61xx_phy_wait(phydev);
363         if (res < 0)
364                 return res;
365
366         /* Read retrieved data */
367         return mv88e61xx_reg_read(phydev, DEVADDR_GLOBAL_2,
368                                   GLOBAL2_REG_PHY_DATA);
369 }
370
371 static int mv88e61xx_phy_write_indirect(struct mii_dev *smi_wrapper, int dev,
372                 int devad, int reg, u16 data)
373 {
374         struct phy_device *phydev;
375         int res;
376
377         phydev = (struct phy_device *)smi_wrapper->priv;
378
379         /* Set the data to write */
380         res = mv88e61xx_reg_write(phydev, DEVADDR_GLOBAL_2,
381                                   GLOBAL2_REG_PHY_DATA, data);
382         if (res < 0)
383                 return res;
384         /* Issue the write command */
385         res = mv88e61xx_reg_write(phydev, DEVADDR_GLOBAL_2,
386                                   GLOBAL2_REG_PHY_CMD,
387                                   smi_cmd_write(dev, reg));
388         if (res < 0)
389                 return res;
390
391         /* Wait for command to complete */
392         return mv88e61xx_phy_wait(phydev);
393 }
394
395 /* Wrapper function to make calls to phy_read_indirect simpler */
396 static int mv88e61xx_phy_read(struct phy_device *phydev, int phy, int reg)
397 {
398         return mv88e61xx_phy_read_indirect(phydev->bus, DEVADDR_PHY(phy),
399                                            MDIO_DEVAD_NONE, reg);
400 }
401
402 /* Wrapper function to make calls to phy_read_indirect simpler */
403 static int mv88e61xx_phy_write(struct phy_device *phydev, int phy,
404                 int reg, u16 val)
405 {
406         return mv88e61xx_phy_write_indirect(phydev->bus, DEVADDR_PHY(phy),
407                                             MDIO_DEVAD_NONE, reg, val);
408 }
409
410 static int mv88e61xx_port_read(struct phy_device *phydev, u8 port, u8 reg)
411 {
412         return mv88e61xx_reg_read(phydev, DEVADDR_PORT(port), reg);
413 }
414
415 static int mv88e61xx_port_write(struct phy_device *phydev, u8 port, u8 reg,
416                                                                 u16 val)
417 {
418         return mv88e61xx_reg_write(phydev, DEVADDR_PORT(port), reg, val);
419 }
420
421 static int mv88e61xx_set_page(struct phy_device *phydev, u8 phy, u8 page)
422 {
423         return mv88e61xx_phy_write(phydev, phy, PHY_REG_PAGE, page);
424 }
425
426 static int mv88e61xx_get_switch_id(struct phy_device *phydev)
427 {
428         int res;
429
430         res = mv88e61xx_port_read(phydev, 0, PORT_REG_SWITCH_ID);
431         if (res < 0)
432                 return res;
433         return res & 0xfff0;
434 }
435
436 static bool mv88e61xx_6352_family(struct phy_device *phydev)
437 {
438         struct mv88e61xx_phy_priv *priv = phydev->priv;
439
440         switch (priv->id) {
441         case PORT_SWITCH_ID_6172:
442         case PORT_SWITCH_ID_6176:
443         case PORT_SWITCH_ID_6240:
444         case PORT_SWITCH_ID_6352:
445                 return true;
446         }
447         return false;
448 }
449
450 static int mv88e61xx_get_cmode(struct phy_device *phydev, u8 port)
451 {
452         int res;
453
454         res = mv88e61xx_port_read(phydev, port, PORT_REG_STATUS);
455         if (res < 0)
456                 return res;
457         return res & PORT_REG_STATUS_CMODE_MASK;
458 }
459
460 static int mv88e61xx_parse_status(struct phy_device *phydev)
461 {
462         unsigned int speed;
463         unsigned int mii_reg;
464
465         mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, PHY_REG_STATUS1);
466
467         if ((mii_reg & PHY_REG_STATUS1_LINK) &&
468             !(mii_reg & PHY_REG_STATUS1_SPDDONE)) {
469                 int i = 0;
470
471                 puts("Waiting for PHY realtime link");
472                 while (!(mii_reg & PHY_REG_STATUS1_SPDDONE)) {
473                         /* Timeout reached ? */
474                         if (i > PHY_AUTONEGOTIATE_TIMEOUT) {
475                                 puts(" TIMEOUT !\n");
476                                 phydev->link = 0;
477                                 break;
478                         }
479
480                         if ((i++ % 1000) == 0)
481                                 putc('.');
482                         udelay(1000);
483                         mii_reg = phy_read(phydev, MDIO_DEVAD_NONE,
484                                         PHY_REG_STATUS1);
485                 }
486                 puts(" done\n");
487                 udelay(500000); /* another 500 ms (results in faster booting) */
488         } else {
489                 if (mii_reg & PHY_REG_STATUS1_LINK)
490                         phydev->link = 1;
491                 else
492                         phydev->link = 0;
493         }
494
495         if (mii_reg & PHY_REG_STATUS1_DUPLEX)
496                 phydev->duplex = DUPLEX_FULL;
497         else
498                 phydev->duplex = DUPLEX_HALF;
499
500         speed = mii_reg & PHY_REG_STATUS1_SPEED;
501
502         switch (speed) {
503         case PHY_REG_STATUS1_GBIT:
504                 phydev->speed = SPEED_1000;
505                 break;
506         case PHY_REG_STATUS1_100:
507                 phydev->speed = SPEED_100;
508                 break;
509         default:
510                 phydev->speed = SPEED_10;
511                 break;
512         }
513
514         return 0;
515 }
516
517 static int mv88e61xx_switch_reset(struct phy_device *phydev)
518 {
519         int time;
520         int val;
521         u8 port;
522
523         /* Disable all ports */
524         for (port = 0; port < PORT_COUNT; port++) {
525                 val = mv88e61xx_port_read(phydev, port, PORT_REG_CTRL);
526                 if (val < 0)
527                         return val;
528                 val = bitfield_replace(val, PORT_REG_CTRL_PSTATE_SHIFT,
529                                        PORT_REG_CTRL_PSTATE_WIDTH,
530                                        PORT_REG_CTRL_PSTATE_DISABLED);
531                 val = mv88e61xx_port_write(phydev, port, PORT_REG_CTRL, val);
532                 if (val < 0)
533                         return val;
534         }
535
536         /* Wait 2 ms for queues to drain */
537         udelay(2000);
538
539         /* Reset switch */
540         val = mv88e61xx_reg_read(phydev, DEVADDR_GLOBAL_1, GLOBAL1_CTRL);
541         if (val < 0)
542                 return val;
543         val |= GLOBAL1_CTRL_SWRESET;
544         val = mv88e61xx_reg_write(phydev, DEVADDR_GLOBAL_1,
545                                      GLOBAL1_CTRL, val);
546         if (val < 0)
547                 return val;
548
549         /* Wait up to 1 second for switch reset complete */
550         for (time = 1000; time; time--) {
551                 val = mv88e61xx_reg_read(phydev, DEVADDR_GLOBAL_1,
552                                             GLOBAL1_CTRL);
553                 if (val >= 0 && ((val & GLOBAL1_CTRL_SWRESET) == 0))
554                         break;
555                 udelay(1000);
556         }
557         if (!time)
558                 return -ETIMEDOUT;
559
560         return 0;
561 }
562
563 static int mv88e61xx_serdes_init(struct phy_device *phydev)
564 {
565         int val;
566
567         val = mv88e61xx_set_page(phydev, DEVADDR_SERDES, PHY_PAGE_SERDES);
568         if (val < 0)
569                 return val;
570
571         /* Power up serdes module */
572         val = mv88e61xx_phy_read(phydev, DEVADDR_SERDES, MII_BMCR);
573         if (val < 0)
574                 return val;
575         val &= ~(BMCR_PDOWN);
576         val = mv88e61xx_phy_write(phydev, DEVADDR_SERDES, MII_BMCR, val);
577         if (val < 0)
578                 return val;
579
580         return 0;
581 }
582
583 static int mv88e61xx_port_enable(struct phy_device *phydev, u8 port)
584 {
585         int val;
586
587         val = mv88e61xx_port_read(phydev, port, PORT_REG_CTRL);
588         if (val < 0)
589                 return val;
590         val = bitfield_replace(val, PORT_REG_CTRL_PSTATE_SHIFT,
591                                PORT_REG_CTRL_PSTATE_WIDTH,
592                                PORT_REG_CTRL_PSTATE_FORWARD);
593         val = mv88e61xx_port_write(phydev, port, PORT_REG_CTRL, val);
594         if (val < 0)
595                 return val;
596
597         return 0;
598 }
599
600 static int mv88e61xx_port_set_vlan(struct phy_device *phydev, u8 port,
601                                                         u16 mask)
602 {
603         int val;
604
605         /* Set VID to port number plus one */
606         val = mv88e61xx_port_read(phydev, port, PORT_REG_VLAN_ID);
607         if (val < 0)
608                 return val;
609         val = bitfield_replace(val, PORT_REG_VLAN_ID_DEF_VID_SHIFT,
610                                PORT_REG_VLAN_ID_DEF_VID_WIDTH,
611                                port + 1);
612         val = mv88e61xx_port_write(phydev, port, PORT_REG_VLAN_ID, val);
613         if (val < 0)
614                 return val;
615
616         /* Set VID mask */
617         val = mv88e61xx_port_read(phydev, port, PORT_REG_VLAN_MAP);
618         if (val < 0)
619                 return val;
620         val = bitfield_replace(val, PORT_REG_VLAN_MAP_TABLE_SHIFT,
621                                PORT_REG_VLAN_MAP_TABLE_WIDTH,
622                                mask);
623         val = mv88e61xx_port_write(phydev, port, PORT_REG_VLAN_MAP, val);
624         if (val < 0)
625                 return val;
626
627         return 0;
628 }
629
630 static int mv88e61xx_read_port_config(struct phy_device *phydev, u8 port)
631 {
632         int res;
633         int val;
634         bool forced = false;
635
636         val = mv88e61xx_port_read(phydev, port, PORT_REG_STATUS);
637         if (val < 0)
638                 return val;
639         if (!(val & PORT_REG_STATUS_LINK)) {
640                 /* Temporarily force link to read port configuration */
641                 u32 timeout = 100;
642                 forced = true;
643
644                 val = mv88e61xx_port_read(phydev, port, PORT_REG_PHYS_CTRL);
645                 if (val < 0)
646                         return val;
647                 val |= (PORT_REG_PHYS_CTRL_LINK_FORCE |
648                                 PORT_REG_PHYS_CTRL_LINK_VALUE);
649                 val = mv88e61xx_port_write(phydev, port, PORT_REG_PHYS_CTRL,
650                                            val);
651                 if (val < 0)
652                         return val;
653
654                 /* Wait for status register to reflect forced link */
655                 do {
656                         val = mv88e61xx_port_read(phydev, port,
657                                                   PORT_REG_STATUS);
658                         if (val < 0)
659                                 goto unforce;
660                         if (val & PORT_REG_STATUS_LINK)
661                                 break;
662                 } while (--timeout);
663
664                 if (timeout == 0) {
665                         res = -ETIMEDOUT;
666                         goto unforce;
667                 }
668         }
669
670         if (val & PORT_REG_STATUS_DUPLEX)
671                 phydev->duplex = DUPLEX_FULL;
672         else
673                 phydev->duplex = DUPLEX_HALF;
674
675         val = bitfield_extract(val, PORT_REG_STATUS_SPEED_SHIFT,
676                                PORT_REG_STATUS_SPEED_WIDTH);
677         switch (val) {
678         case PORT_REG_STATUS_SPEED_1000:
679                 phydev->speed = SPEED_1000;
680                 break;
681         case PORT_REG_STATUS_SPEED_100:
682                 phydev->speed = SPEED_100;
683                 break;
684         default:
685                 phydev->speed = SPEED_10;
686                 break;
687         }
688
689         res = 0;
690
691 unforce:
692         if (forced) {
693                 val = mv88e61xx_port_read(phydev, port, PORT_REG_PHYS_CTRL);
694                 if (val < 0)
695                         return val;
696                 val &= ~(PORT_REG_PHYS_CTRL_LINK_FORCE |
697                                 PORT_REG_PHYS_CTRL_LINK_VALUE);
698                 val = mv88e61xx_port_write(phydev, port, PORT_REG_PHYS_CTRL,
699                                            val);
700                 if (val < 0)
701                         return val;
702         }
703
704         return res;
705 }
706
707 static int mv88e61xx_set_cpu_port(struct phy_device *phydev)
708 {
709         int val;
710
711         /* Set CPUDest */
712         val = mv88e61xx_reg_read(phydev, DEVADDR_GLOBAL_1, GLOBAL1_MON_CTRL);
713         if (val < 0)
714                 return val;
715         val = bitfield_replace(val, GLOBAL1_MON_CTRL_CPUDEST_SHIFT,
716                                GLOBAL1_MON_CTRL_CPUDEST_WIDTH,
717                                CONFIG_MV88E61XX_CPU_PORT);
718         val = mv88e61xx_reg_write(phydev, DEVADDR_GLOBAL_1,
719                                      GLOBAL1_MON_CTRL, val);
720         if (val < 0)
721                 return val;
722
723         /* Allow CPU to route to any port */
724         val = PORT_MASK & ~(1 << CONFIG_MV88E61XX_CPU_PORT);
725         val = mv88e61xx_port_set_vlan(phydev, CONFIG_MV88E61XX_CPU_PORT, val);
726         if (val < 0)
727                 return val;
728
729         /* Enable CPU port */
730         val = mv88e61xx_port_enable(phydev, CONFIG_MV88E61XX_CPU_PORT);
731         if (val < 0)
732                 return val;
733
734         val = mv88e61xx_read_port_config(phydev, CONFIG_MV88E61XX_CPU_PORT);
735         if (val < 0)
736                 return val;
737
738         /* If CPU is connected to serdes, initialize serdes */
739         if (mv88e61xx_6352_family(phydev)) {
740                 val = mv88e61xx_get_cmode(phydev, CONFIG_MV88E61XX_CPU_PORT);
741                 if (val < 0)
742                         return val;
743                 if (val == PORT_REG_STATUS_CMODE_100BASE_X ||
744                     val == PORT_REG_STATUS_CMODE_1000BASE_X ||
745                     val == PORT_REG_STATUS_CMODE_SGMII) {
746                         val = mv88e61xx_serdes_init(phydev);
747                         if (val < 0)
748                                 return val;
749                 }
750         }
751
752         return 0;
753 }
754
755 static int mv88e61xx_switch_init(struct phy_device *phydev)
756 {
757         static int init;
758         int res;
759
760         if (init)
761                 return 0;
762
763         res = mv88e61xx_switch_reset(phydev);
764         if (res < 0)
765                 return res;
766
767         res = mv88e61xx_set_cpu_port(phydev);
768         if (res < 0)
769                 return res;
770
771         init = 1;
772
773         return 0;
774 }
775
776 static int mv88e61xx_phy_enable(struct phy_device *phydev, u8 phy)
777 {
778         int val;
779
780         val = mv88e61xx_phy_read(phydev, phy, MII_BMCR);
781         if (val < 0)
782                 return val;
783         val &= ~(BMCR_PDOWN);
784         val = mv88e61xx_phy_write(phydev, phy, MII_BMCR, val);
785         if (val < 0)
786                 return val;
787
788         return 0;
789 }
790
791 static int mv88e61xx_phy_setup(struct phy_device *phydev, u8 phy)
792 {
793         int val;
794
795         /*
796          * Enable energy-detect sensing on PHY, used to determine when a PHY
797          * port is physically connected
798          */
799         val = mv88e61xx_phy_read(phydev, phy, PHY_REG_CTRL1);
800         if (val < 0)
801                 return val;
802         val = bitfield_replace(val, PHY_REG_CTRL1_ENERGY_DET_SHIFT,
803                                PHY_REG_CTRL1_ENERGY_DET_WIDTH,
804                                PHY_REG_CTRL1_ENERGY_DET_SENSE_XMIT);
805         val = mv88e61xx_phy_write(phydev, phy, PHY_REG_CTRL1, val);
806         if (val < 0)
807                 return val;
808
809         return 0;
810 }
811
812 static int mv88e61xx_fixed_port_setup(struct phy_device *phydev, u8 port)
813 {
814         int val;
815
816         val = mv88e61xx_port_read(phydev, port, PORT_REG_PHYS_CTRL);
817         if (val < 0)
818                 return val;
819
820         val &= ~(PORT_REG_PHYS_CTRL_SPD_MASK |
821                  PORT_REG_PHYS_CTRL_FC_VALUE);
822         val |= PORT_REG_PHYS_CTRL_PCS_AN_EN |
823                PORT_REG_PHYS_CTRL_PCS_AN_RST |
824                PORT_REG_PHYS_CTRL_FC_FORCE |
825                PORT_REG_PHYS_CTRL_DUPLEX_VALUE |
826                PORT_REG_PHYS_CTRL_DUPLEX_FORCE |
827                PORT_REG_PHYS_CTRL_SPD1000;
828
829         return mv88e61xx_port_write(phydev, port, PORT_REG_PHYS_CTRL,
830                                    val);
831 }
832
833 static int mv88e61xx_phy_config_port(struct phy_device *phydev, u8 phy)
834 {
835         int val;
836
837         val = mv88e61xx_port_enable(phydev, phy);
838         if (val < 0)
839                 return val;
840
841         val = mv88e61xx_port_set_vlan(phydev, phy,
842                         1 << CONFIG_MV88E61XX_CPU_PORT);
843         if (val < 0)
844                 return val;
845
846         return 0;
847 }
848
849 static int mv88e61xx_probe(struct phy_device *phydev)
850 {
851         struct mii_dev *smi_wrapper;
852         struct mv88e61xx_phy_priv *priv;
853         int res;
854
855         res = mv88e61xx_hw_reset(phydev);
856         if (res < 0)
857                 return res;
858
859         priv = malloc(sizeof(*priv));
860         if (!priv)
861                 return -ENOMEM;
862
863         memset(priv, 0, sizeof(*priv));
864
865         /*
866          * This device requires indirect reads/writes to the PHY registers
867          * which the generic PHY code can't handle.  Make a wrapper MII device
868          * to handle reads/writes
869          */
870         smi_wrapper = mdio_alloc();
871         if (!smi_wrapper) {
872                 free(priv);
873                 return -ENOMEM;
874         }
875
876         /*
877          * Store the mdio bus in the private data, as we are going to replace
878          * the bus with the wrapper bus
879          */
880         priv->mdio_bus = phydev->bus;
881
882         /*
883          * Store the smi bus address in private data.  This lets us use the
884          * phydev addr field for device address instead, as the genphy code
885          * expects.
886          */
887         priv->smi_addr = phydev->addr;
888
889         /*
890          * Store the phy_device in the wrapper mii device. This lets us get it
891          * back when genphy functions call phy_read/phy_write.
892          */
893         smi_wrapper->priv = phydev;
894         strncpy(smi_wrapper->name, "indirect mii", sizeof(smi_wrapper->name));
895         smi_wrapper->read = mv88e61xx_phy_read_indirect;
896         smi_wrapper->write = mv88e61xx_phy_write_indirect;
897
898         /* Replace the bus with the wrapper device */
899         phydev->bus = smi_wrapper;
900
901         phydev->priv = priv;
902
903         priv->id = mv88e61xx_get_switch_id(phydev);
904
905         return 0;
906 }
907
908 static int mv88e61xx_phy_config(struct phy_device *phydev)
909 {
910         int res;
911         int i;
912         int ret = -1;
913
914         res = mv88e61xx_switch_init(phydev);
915         if (res < 0)
916                 return res;
917
918         for (i = 0; i < PORT_COUNT; i++) {
919                 if ((1 << i) & CONFIG_MV88E61XX_PHY_PORTS) {
920                         phydev->addr = i;
921
922                         res = mv88e61xx_phy_enable(phydev, i);
923                         if (res < 0) {
924                                 printf("Error enabling PHY %i\n", i);
925                                 continue;
926                         }
927                         res = mv88e61xx_phy_setup(phydev, i);
928                         if (res < 0) {
929                                 printf("Error setting up PHY %i\n", i);
930                                 continue;
931                         }
932                         res = mv88e61xx_phy_config_port(phydev, i);
933                         if (res < 0) {
934                                 printf("Error configuring PHY %i\n", i);
935                                 continue;
936                         }
937
938                         res = genphy_config_aneg(phydev);
939                         if (res < 0) {
940                                 printf("Error setting PHY %i autoneg\n", i);
941                                 continue;
942                         }
943                         res = phy_reset(phydev);
944                         if (res < 0) {
945                                 printf("Error resetting PHY %i\n", i);
946                                 continue;
947                         }
948
949                         /* Return success if any PHY succeeds */
950                         ret = 0;
951                 } else if ((1 << i) & CONFIG_MV88E61XX_FIXED_PORTS) {
952                         res = mv88e61xx_fixed_port_setup(phydev, i);
953                         if (res < 0) {
954                                 printf("Error configuring port %i\n", i);
955                                 continue;
956                         }
957                 }
958         }
959
960         return ret;
961 }
962
963 static int mv88e61xx_phy_is_connected(struct phy_device *phydev)
964 {
965         int val;
966
967         val = mv88e61xx_phy_read(phydev, phydev->addr, PHY_REG_STATUS1);
968         if (val < 0)
969                 return 0;
970
971         /*
972          * After reset, the energy detect signal remains high for a few seconds
973          * regardless of whether a cable is connected.  This function will
974          * return false positives during this time.
975          */
976         return (val & PHY_REG_STATUS1_ENERGY) == 0;
977 }
978
979 static int mv88e61xx_phy_startup(struct phy_device *phydev)
980 {
981         int i;
982         int link = 0;
983         int res;
984         int speed = phydev->speed;
985         int duplex = phydev->duplex;
986
987         for (i = 0; i < PORT_COUNT; i++) {
988                 if ((1 << i) & CONFIG_MV88E61XX_PHY_PORTS) {
989                         phydev->addr = i;
990                         if (!mv88e61xx_phy_is_connected(phydev))
991                                 continue;
992                         res = genphy_update_link(phydev);
993                         if (res < 0)
994                                 continue;
995                         res = mv88e61xx_parse_status(phydev);
996                         if (res < 0)
997                                 continue;
998                         link = (link || phydev->link);
999                 }
1000         }
1001         phydev->link = link;
1002
1003         /* Restore CPU interface speed and duplex after it was changed for
1004          * other ports */
1005         phydev->speed = speed;
1006         phydev->duplex = duplex;
1007
1008         return 0;
1009 }
1010
1011 static struct phy_driver mv88e61xx_driver = {
1012         .name = "Marvell MV88E61xx",
1013         .uid = 0x01410eb1,
1014         .mask = 0xfffffff0,
1015         .features = PHY_GBIT_FEATURES,
1016         .probe = mv88e61xx_probe,
1017         .config = mv88e61xx_phy_config,
1018         .startup = mv88e61xx_phy_startup,
1019         .shutdown = &genphy_shutdown,
1020 };
1021
1022 static struct phy_driver mv88e609x_driver = {
1023         .name = "Marvell MV88E609x",
1024         .uid = 0x1410c89,
1025         .mask = 0xfffffff0,
1026         .features = PHY_GBIT_FEATURES,
1027         .probe = mv88e61xx_probe,
1028         .config = mv88e61xx_phy_config,
1029         .startup = mv88e61xx_phy_startup,
1030         .shutdown = &genphy_shutdown,
1031 };
1032
1033 int phy_mv88e61xx_init(void)
1034 {
1035         phy_register(&mv88e61xx_driver);
1036         phy_register(&mv88e609x_driver);
1037
1038         return 0;
1039 }
1040
1041 /*
1042  * Overload weak get_phy_id definition since we need non-standard functions
1043  * to read PHY registers
1044  */
1045 int get_phy_id(struct mii_dev *bus, int smi_addr, int devad, u32 *phy_id)
1046 {
1047         struct phy_device temp_phy;
1048         struct mv88e61xx_phy_priv temp_priv;
1049         struct mii_dev temp_mii;
1050         int val;
1051
1052         /*
1053          * Buid temporary data structures that the chip reading code needs to
1054          * read the ID
1055          */
1056         temp_priv.mdio_bus = bus;
1057         temp_priv.smi_addr = smi_addr;
1058         temp_phy.priv = &temp_priv;
1059         temp_mii.priv = &temp_phy;
1060
1061         val = mv88e61xx_phy_read_indirect(&temp_mii, 0, devad, MII_PHYSID1);
1062         if (val < 0)
1063                 return -EIO;
1064
1065         *phy_id = val << 16;
1066
1067         val = mv88e61xx_phy_read_indirect(&temp_mii, 0, devad, MII_PHYSID2);
1068         if (val < 0)
1069                 return -EIO;
1070
1071         *phy_id |= (val & 0xffff);
1072
1073         return 0;
1074 }