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; 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;

View File

@ -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