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:
Mike Frysinger 2010-05-10 16:10:00 -04:00 committed by Ben Warren
parent bb7336a414
commit 141ab7a52c
2 changed files with 50 additions and 37 deletions

View file

@ -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);
/* 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);
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."
" (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);
}
tmp_regval = ax88180_mdio_read (dev, M88_EXT_SSR);
if ((tmp_regval & HWCFG_MODE_MASK) == RGMII_COPPER_MODE) {
return 1;
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 {
case CICADA_CIS8201_PHYIDR0:
debug("ax88180: Found CICADA CIS8201 PHY"
" chipset. (PHY Addr=0x%x)\n", priv->PhyAddr);
priv->PhyAddr = CICADA_CIS8201_PHYADDR;
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,
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;

View file

@ -63,10 +63,8 @@ struct ax88180_private {
/* Max Rx Jumbo size is 15K Bytes */
#define MAX_RX_SIZE 0x3C00
#define MARVELL_88E1111_PHYADDR 0x18
#define MARVELL_88E1111_PHYIDR0 0x0141
#define CICADA_CIS8201_PHYADDR 0x01
#define CICADA_CIS8201_PHYIDR0 0x000F
#define MEDIA_AUTO 0