mirror of
https://github.com/Stichting-MINIX-Research-Foundation/u-boot.git
synced 2025-09-18 08:32:04 -04:00
AX88180: improve phy searching
Rather than hardcode specific phy addresses, search the possible phy address space to find the first available phy. Also respect the normal CONFIG_PHY_ADDR option for board porters to pick a specific address. Signed-off-by: Mike Frysinger <vapier@gentoo.org> Signed-off-by: Ben Warren <biggerbadderben@gmail.com>
This commit is contained in:
parent
bb7336a414
commit
141ab7a52c
@ -255,49 +255,60 @@ static int ax88180_phy_initial (struct eth_device *dev)
|
|||||||
{
|
{
|
||||||
struct ax88180_private *priv = (struct ax88180_private *)dev->priv;
|
struct ax88180_private *priv = (struct ax88180_private *)dev->priv;
|
||||||
unsigned long tmp_regval;
|
unsigned long tmp_regval;
|
||||||
|
unsigned short phyaddr;
|
||||||
|
|
||||||
/* Check avaliable PHY chipset */
|
/* Search for first avaliable PHY chipset */
|
||||||
priv->PhyAddr = MARVELL_88E1111_PHYADDR;
|
#ifdef CONFIG_PHY_ADDR
|
||||||
priv->PhyID0 = ax88180_mdio_read (dev, PHYIDR0);
|
phyaddr = CONFIG_PHY_ADDR;
|
||||||
|
#else
|
||||||
|
for (phyaddr = 0; phyaddr < 32; ++phyaddr)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
priv->PhyAddr = phyaddr;
|
||||||
|
priv->PhyID0 = ax88180_mdio_read(dev, PHYIDR0);
|
||||||
|
|
||||||
if (priv->PhyID0 == MARVELL_88E1111_PHYIDR0) {
|
switch (priv->PhyID0) {
|
||||||
|
case MARVELL_88E1111_PHYIDR0:
|
||||||
|
debug("ax88180: Found Marvell 88E1111 PHY."
|
||||||
|
" (PHY Addr=0x%x)\n", priv->PhyAddr);
|
||||||
|
|
||||||
debug ("ax88180: Found Marvell 88E1111 PHY."
|
tmp_regval = ax88180_mdio_read(dev, M88_EXT_SSR);
|
||||||
" (PHY Addr=0x%x)\n", priv->PhyAddr);
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
tmp_regval = ax88180_mdio_read (dev, M88_EXT_SSR);
|
return 1;
|
||||||
if ((tmp_regval & HWCFG_MODE_MASK) == RGMII_COPPER_MODE) {
|
|
||||||
|
|
||||||
ax88180_mdio_write (dev, M88_EXT_SCR, DEFAULT_EXT_SCR);
|
case CICADA_CIS8201_PHYIDR0:
|
||||||
if (ax88180_phy_reset (dev) < 0)
|
debug("ax88180: Found CICADA CIS8201 PHY"
|
||||||
return 0;
|
" chipset. (PHY Addr=0x%x)\n", priv->PhyAddr);
|
||||||
ax88180_mdio_write (dev, M88_IER, LINK_CHANGE_INT);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
|
|
||||||
priv->PhyAddr = CICADA_CIS8201_PHYADDR;
|
ax88180_mdio_write(dev, CIS_IMR,
|
||||||
priv->PhyID0 = ax88180_mdio_read (dev, PHYIDR0);
|
|
||||||
|
|
||||||
if (priv->PhyID0 == CICADA_CIS8201_PHYIDR0) {
|
|
||||||
|
|
||||||
debug ("ax88180: Found CICADA CIS8201 PHY"
|
|
||||||
" chipset. (PHY Addr=0x%x)\n", priv->PhyAddr);
|
|
||||||
ax88180_mdio_write (dev, CIS_IMR,
|
|
||||||
(CIS_INT_ENABLE | LINK_CHANGE_INT));
|
(CIS_INT_ENABLE | LINK_CHANGE_INT));
|
||||||
|
|
||||||
/* Set CIS_SMI_PRIORITY bit before force the media mode */
|
/* Set CIS_SMI_PRIORITY bit before force the media mode */
|
||||||
tmp_regval =
|
tmp_regval = ax88180_mdio_read(dev, CIS_AUX_CTRL_STATUS);
|
||||||
ax88180_mdio_read (dev, CIS_AUX_CTRL_STATUS);
|
|
||||||
tmp_regval &= ~CIS_SMI_PRIORITY;
|
tmp_regval &= ~CIS_SMI_PRIORITY;
|
||||||
ax88180_mdio_write (dev, CIS_AUX_CTRL_STATUS,
|
ax88180_mdio_write(dev, CIS_AUX_CTRL_STATUS, tmp_regval);
|
||||||
tmp_regval);
|
|
||||||
} else {
|
return 1;
|
||||||
printf ("ax88180: Unknown PHY chipset!!\n");
|
|
||||||
return 0;
|
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)
|
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);
|
(unsigned int)bmcr_val, (unsigned int)bmsr_val);
|
||||||
|
|
||||||
/* Get real media mode here */
|
/* Get real media mode here */
|
||||||
if (priv->PhyID0 == MARVELL_88E1111_PHYIDR0) {
|
switch (priv->PhyID0) {
|
||||||
RealMediaMode = get_MarvellPHY_media_mode (dev);
|
case MARVELL_88E1111_PHYIDR0:
|
||||||
} else if (priv->PhyID0 == CICADA_CIS8201_PHYIDR0) {
|
RealMediaMode = get_MarvellPHY_media_mode(dev);
|
||||||
RealMediaMode = get_CicadaPHY_media_mode (dev);
|
break;
|
||||||
} else {
|
case CICADA_CIS8201_PHYIDR0:
|
||||||
|
RealMediaMode = get_CicadaPHY_media_mode(dev);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
RealMediaMode = MEDIA_1000FULL;
|
RealMediaMode = MEDIA_1000FULL;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
priv->LinkState = INS_LINK_UP;
|
priv->LinkState = INS_LINK_UP;
|
||||||
|
@ -63,10 +63,8 @@ struct ax88180_private {
|
|||||||
/* Max Rx Jumbo size is 15K Bytes */
|
/* Max Rx Jumbo size is 15K Bytes */
|
||||||
#define MAX_RX_SIZE 0x3C00
|
#define MAX_RX_SIZE 0x3C00
|
||||||
|
|
||||||
#define MARVELL_88E1111_PHYADDR 0x18
|
|
||||||
#define MARVELL_88E1111_PHYIDR0 0x0141
|
#define MARVELL_88E1111_PHYIDR0 0x0141
|
||||||
|
|
||||||
#define CICADA_CIS8201_PHYADDR 0x01
|
|
||||||
#define CICADA_CIS8201_PHYIDR0 0x000F
|
#define CICADA_CIS8201_PHYIDR0 0x000F
|
||||||
|
|
||||||
#define MEDIA_AUTO 0
|
#define MEDIA_AUTO 0
|
||||||
|
Loading…
x
Reference in New Issue
Block a user