|
@@ -255,49 +255,60 @@ static int ax88180_phy_initial (struct eth_device *dev)
|
|
|
{
|
|
|
struct ax88180_private *priv = (struct ax88180_private *)dev->priv;
|
|
|
unsigned long tmp_regval;
|
|
|
+ unsigned short phyaddr;
|
|
|
|
|
|
- /* Check avaliable PHY chipset */
|
|
|
- priv->PhyAddr = MARVELL_88E1111_PHYADDR;
|
|
|
- priv->PhyID0 = ax88180_mdio_read (dev, PHYIDR0);
|
|
|
-
|
|
|
- if (priv->PhyID0 == MARVELL_88E1111_PHYIDR0) {
|
|
|
-
|
|
|
- debug ("ax88180: Found Marvell 88E1111 PHY."
|
|
|
- " (PHY Addr=0x%x)\n", priv->PhyAddr);
|
|
|
-
|
|
|
- tmp_regval = ax88180_mdio_read (dev, M88_EXT_SSR);
|
|
|
- if ((tmp_regval & HWCFG_MODE_MASK) == RGMII_COPPER_MODE) {
|
|
|
-
|
|
|
- ax88180_mdio_write (dev, M88_EXT_SCR, DEFAULT_EXT_SCR);
|
|
|
- if (ax88180_phy_reset (dev) < 0)
|
|
|
- return 0;
|
|
|
- ax88180_mdio_write (dev, M88_IER, LINK_CHANGE_INT);
|
|
|
- }
|
|
|
- } else {
|
|
|
+ /* Search for first avaliable PHY chipset */
|
|
|
+#ifdef CONFIG_PHY_ADDR
|
|
|
+ phyaddr = CONFIG_PHY_ADDR;
|
|
|
+#else
|
|
|
+ for (phyaddr = 0; phyaddr < 32; ++phyaddr)
|
|
|
+#endif
|
|
|
+ {
|
|
|
+ priv->PhyAddr = phyaddr;
|
|
|
+ priv->PhyID0 = ax88180_mdio_read(dev, PHYIDR0);
|
|
|
+
|
|
|
+ switch (priv->PhyID0) {
|
|
|
+ case MARVELL_88E1111_PHYIDR0:
|
|
|
+ debug("ax88180: Found Marvell 88E1111 PHY."
|
|
|
+ " (PHY Addr=0x%x)\n", priv->PhyAddr);
|
|
|
+
|
|
|
+ tmp_regval = ax88180_mdio_read(dev, M88_EXT_SSR);
|
|
|
+ if ((tmp_regval & HWCFG_MODE_MASK) != RGMII_COPPER_MODE) {
|
|
|
+ ax88180_mdio_write(dev, M88_EXT_SCR, DEFAULT_EXT_SCR);
|
|
|
+ if (ax88180_phy_reset(dev) < 0)
|
|
|
+ return 0;
|
|
|
+ ax88180_mdio_write(dev, M88_IER, LINK_CHANGE_INT);
|
|
|
+ }
|
|
|
|
|
|
- priv->PhyAddr = CICADA_CIS8201_PHYADDR;
|
|
|
- priv->PhyID0 = ax88180_mdio_read (dev, PHYIDR0);
|
|
|
+ return 1;
|
|
|
|
|
|
- if (priv->PhyID0 == CICADA_CIS8201_PHYIDR0) {
|
|
|
+ case CICADA_CIS8201_PHYIDR0:
|
|
|
+ debug("ax88180: Found CICADA CIS8201 PHY"
|
|
|
+ " chipset. (PHY Addr=0x%x)\n", priv->PhyAddr);
|
|
|
|
|
|
- debug ("ax88180: Found CICADA CIS8201 PHY"
|
|
|
- " chipset. (PHY Addr=0x%x)\n", priv->PhyAddr);
|
|
|
- ax88180_mdio_write (dev, CIS_IMR,
|
|
|
+ ax88180_mdio_write(dev, CIS_IMR,
|
|
|
(CIS_INT_ENABLE | LINK_CHANGE_INT));
|
|
|
|
|
|
/* Set CIS_SMI_PRIORITY bit before force the media mode */
|
|
|
- tmp_regval =
|
|
|
- ax88180_mdio_read (dev, CIS_AUX_CTRL_STATUS);
|
|
|
+ tmp_regval = ax88180_mdio_read(dev, CIS_AUX_CTRL_STATUS);
|
|
|
tmp_regval &= ~CIS_SMI_PRIORITY;
|
|
|
- ax88180_mdio_write (dev, CIS_AUX_CTRL_STATUS,
|
|
|
- tmp_regval);
|
|
|
- } else {
|
|
|
- printf ("ax88180: Unknown PHY chipset!!\n");
|
|
|
- return 0;
|
|
|
+ ax88180_mdio_write(dev, CIS_AUX_CTRL_STATUS, tmp_regval);
|
|
|
+
|
|
|
+ return 1;
|
|
|
+
|
|
|
+ case 0xffff:
|
|
|
+ /* No PHY at this addr */
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ printf("ax88180: Unknown PHY chipset %#x at addr %#x\n",
|
|
|
+ priv->PhyID0, priv->PhyAddr);
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return 1;
|
|
|
+ printf("ax88180: Unknown PHY chipset!!\n");
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
static void ax88180_media_config (struct eth_device *dev)
|
|
@@ -345,12 +356,16 @@ static void ax88180_media_config (struct eth_device *dev)
|
|
|
(unsigned int)bmcr_val, (unsigned int)bmsr_val);
|
|
|
|
|
|
/* Get real media mode here */
|
|
|
- if (priv->PhyID0 == MARVELL_88E1111_PHYIDR0) {
|
|
|
- RealMediaMode = get_MarvellPHY_media_mode (dev);
|
|
|
- } else if (priv->PhyID0 == CICADA_CIS8201_PHYIDR0) {
|
|
|
- RealMediaMode = get_CicadaPHY_media_mode (dev);
|
|
|
- } else {
|
|
|
+ switch (priv->PhyID0) {
|
|
|
+ case MARVELL_88E1111_PHYIDR0:
|
|
|
+ RealMediaMode = get_MarvellPHY_media_mode(dev);
|
|
|
+ break;
|
|
|
+ case CICADA_CIS8201_PHYIDR0:
|
|
|
+ RealMediaMode = get_CicadaPHY_media_mode(dev);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
RealMediaMode = MEDIA_1000FULL;
|
|
|
+ break;
|
|
|
}
|
|
|
|
|
|
priv->LinkState = INS_LINK_UP;
|