|
@@ -876,7 +876,7 @@ static void tg3_mdio_config(struct tg3 *tp)
|
|
|
{
|
|
|
u32 val;
|
|
|
|
|
|
- if (tp->mdio_bus.phy_map[PHY_ADDR]->interface !=
|
|
|
+ if (tp->mdio_bus->phy_map[PHY_ADDR]->interface !=
|
|
|
PHY_INTERFACE_MODE_RGMII)
|
|
|
return;
|
|
|
|
|
@@ -920,9 +920,9 @@ static void tg3_mdio_config(struct tg3 *tp)
|
|
|
static void tg3_mdio_start(struct tg3 *tp)
|
|
|
{
|
|
|
if (tp->tg3_flags3 & TG3_FLG3_MDIOBUS_INITED) {
|
|
|
- mutex_lock(&tp->mdio_bus.mdio_lock);
|
|
|
+ mutex_lock(&tp->mdio_bus->mdio_lock);
|
|
|
tp->tg3_flags3 &= ~TG3_FLG3_MDIOBUS_PAUSED;
|
|
|
- mutex_unlock(&tp->mdio_bus.mdio_lock);
|
|
|
+ mutex_unlock(&tp->mdio_bus->mdio_lock);
|
|
|
}
|
|
|
|
|
|
tp->mi_mode &= ~MAC_MI_MODE_AUTO_POLL;
|
|
@@ -936,9 +936,9 @@ static void tg3_mdio_start(struct tg3 *tp)
|
|
|
static void tg3_mdio_stop(struct tg3 *tp)
|
|
|
{
|
|
|
if (tp->tg3_flags3 & TG3_FLG3_MDIOBUS_INITED) {
|
|
|
- mutex_lock(&tp->mdio_bus.mdio_lock);
|
|
|
+ mutex_lock(&tp->mdio_bus->mdio_lock);
|
|
|
tp->tg3_flags3 |= TG3_FLG3_MDIOBUS_PAUSED;
|
|
|
- mutex_unlock(&tp->mdio_bus.mdio_lock);
|
|
|
+ mutex_unlock(&tp->mdio_bus->mdio_lock);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -947,7 +947,6 @@ static int tg3_mdio_init(struct tg3 *tp)
|
|
|
int i;
|
|
|
u32 reg;
|
|
|
struct phy_device *phydev;
|
|
|
- struct mii_bus *mdio_bus = &tp->mdio_bus;
|
|
|
|
|
|
tg3_mdio_start(tp);
|
|
|
|
|
@@ -955,21 +954,23 @@ static int tg3_mdio_init(struct tg3 *tp)
|
|
|
(tp->tg3_flags3 & TG3_FLG3_MDIOBUS_INITED))
|
|
|
return 0;
|
|
|
|
|
|
- memset(mdio_bus, 0, sizeof(*mdio_bus));
|
|
|
+ tp->mdio_bus = mdiobus_alloc();
|
|
|
+ if (tp->mdio_bus == NULL)
|
|
|
+ return -ENOMEM;
|
|
|
|
|
|
- mdio_bus->name = "tg3 mdio bus";
|
|
|
- snprintf(mdio_bus->id, MII_BUS_ID_SIZE, "%x",
|
|
|
+ tp->mdio_bus->name = "tg3 mdio bus";
|
|
|
+ snprintf(tp->mdio_bus->id, MII_BUS_ID_SIZE, "%x",
|
|
|
(tp->pdev->bus->number << 8) | tp->pdev->devfn);
|
|
|
- mdio_bus->priv = tp;
|
|
|
- mdio_bus->parent = &tp->pdev->dev;
|
|
|
- mdio_bus->read = &tg3_mdio_read;
|
|
|
- mdio_bus->write = &tg3_mdio_write;
|
|
|
- mdio_bus->reset = &tg3_mdio_reset;
|
|
|
- mdio_bus->phy_mask = ~(1 << PHY_ADDR);
|
|
|
- mdio_bus->irq = &tp->mdio_irq[0];
|
|
|
+ tp->mdio_bus->priv = tp;
|
|
|
+ tp->mdio_bus->parent = &tp->pdev->dev;
|
|
|
+ tp->mdio_bus->read = &tg3_mdio_read;
|
|
|
+ tp->mdio_bus->write = &tg3_mdio_write;
|
|
|
+ tp->mdio_bus->reset = &tg3_mdio_reset;
|
|
|
+ tp->mdio_bus->phy_mask = ~(1 << PHY_ADDR);
|
|
|
+ tp->mdio_bus->irq = &tp->mdio_irq[0];
|
|
|
|
|
|
for (i = 0; i < PHY_MAX_ADDR; i++)
|
|
|
- mdio_bus->irq[i] = PHY_POLL;
|
|
|
+ tp->mdio_bus->irq[i] = PHY_POLL;
|
|
|
|
|
|
/* The bus registration will look for all the PHYs on the mdio bus.
|
|
|
* Unfortunately, it does not ensure the PHY is powered up before
|
|
@@ -979,7 +980,7 @@ static int tg3_mdio_init(struct tg3 *tp)
|
|
|
if (tg3_readphy(tp, MII_BMCR, ®) || (reg & BMCR_PDOWN))
|
|
|
tg3_bmcr_reset(tp);
|
|
|
|
|
|
- i = mdiobus_register(mdio_bus);
|
|
|
+ i = mdiobus_register(tp->mdio_bus);
|
|
|
if (i) {
|
|
|
printk(KERN_WARNING "%s: mdiobus_reg failed (0x%x)\n",
|
|
|
tp->dev->name, i);
|
|
@@ -988,7 +989,7 @@ static int tg3_mdio_init(struct tg3 *tp)
|
|
|
|
|
|
tp->tg3_flags3 |= TG3_FLG3_MDIOBUS_INITED;
|
|
|
|
|
|
- phydev = tp->mdio_bus.phy_map[PHY_ADDR];
|
|
|
+ phydev = tp->mdio_bus->phy_map[PHY_ADDR];
|
|
|
|
|
|
switch (phydev->phy_id) {
|
|
|
case TG3_PHY_ID_BCM50610:
|
|
@@ -1014,7 +1015,8 @@ static void tg3_mdio_fini(struct tg3 *tp)
|
|
|
{
|
|
|
if (tp->tg3_flags3 & TG3_FLG3_MDIOBUS_INITED) {
|
|
|
tp->tg3_flags3 &= ~TG3_FLG3_MDIOBUS_INITED;
|
|
|
- mdiobus_unregister(&tp->mdio_bus);
|
|
|
+ mdiobus_unregister(tp->mdio_bus);
|
|
|
+ mdiobus_free(tp->mdio_bus);
|
|
|
tp->tg3_flags3 &= ~TG3_FLG3_MDIOBUS_PAUSED;
|
|
|
}
|
|
|
}
|
|
@@ -1220,7 +1222,7 @@ static void tg3_setup_flow_control(struct tg3 *tp, u32 lcladv, u32 rmtadv)
|
|
|
u32 old_tx_mode = tp->tx_mode;
|
|
|
|
|
|
if (tp->tg3_flags3 & TG3_FLG3_USE_PHYLIB)
|
|
|
- autoneg = tp->mdio_bus.phy_map[PHY_ADDR]->autoneg;
|
|
|
+ autoneg = tp->mdio_bus->phy_map[PHY_ADDR]->autoneg;
|
|
|
else
|
|
|
autoneg = tp->link_config.autoneg;
|
|
|
|
|
@@ -1257,7 +1259,7 @@ static void tg3_adjust_link(struct net_device *dev)
|
|
|
u8 oldflowctrl, linkmesg = 0;
|
|
|
u32 mac_mode, lcl_adv, rmt_adv;
|
|
|
struct tg3 *tp = netdev_priv(dev);
|
|
|
- struct phy_device *phydev = tp->mdio_bus.phy_map[PHY_ADDR];
|
|
|
+ struct phy_device *phydev = tp->mdio_bus->phy_map[PHY_ADDR];
|
|
|
|
|
|
spin_lock(&tp->lock);
|
|
|
|
|
@@ -1334,7 +1336,7 @@ static int tg3_phy_init(struct tg3 *tp)
|
|
|
/* Bring the PHY back to a known state. */
|
|
|
tg3_bmcr_reset(tp);
|
|
|
|
|
|
- phydev = tp->mdio_bus.phy_map[PHY_ADDR];
|
|
|
+ phydev = tp->mdio_bus->phy_map[PHY_ADDR];
|
|
|
|
|
|
/* Attach the MAC to the PHY. */
|
|
|
phydev = phy_connect(tp->dev, phydev->dev.bus_id, tg3_adjust_link,
|
|
@@ -1367,7 +1369,7 @@ static void tg3_phy_start(struct tg3 *tp)
|
|
|
if (!(tp->tg3_flags3 & TG3_FLG3_PHY_CONNECTED))
|
|
|
return;
|
|
|
|
|
|
- phydev = tp->mdio_bus.phy_map[PHY_ADDR];
|
|
|
+ phydev = tp->mdio_bus->phy_map[PHY_ADDR];
|
|
|
|
|
|
if (tp->link_config.phy_is_low_power) {
|
|
|
tp->link_config.phy_is_low_power = 0;
|
|
@@ -1387,13 +1389,13 @@ static void tg3_phy_stop(struct tg3 *tp)
|
|
|
if (!(tp->tg3_flags3 & TG3_FLG3_PHY_CONNECTED))
|
|
|
return;
|
|
|
|
|
|
- phy_stop(tp->mdio_bus.phy_map[PHY_ADDR]);
|
|
|
+ phy_stop(tp->mdio_bus->phy_map[PHY_ADDR]);
|
|
|
}
|
|
|
|
|
|
static void tg3_phy_fini(struct tg3 *tp)
|
|
|
{
|
|
|
if (tp->tg3_flags3 & TG3_FLG3_PHY_CONNECTED) {
|
|
|
- phy_disconnect(tp->mdio_bus.phy_map[PHY_ADDR]);
|
|
|
+ phy_disconnect(tp->mdio_bus->phy_map[PHY_ADDR]);
|
|
|
tp->tg3_flags3 &= ~TG3_FLG3_PHY_CONNECTED;
|
|
|
}
|
|
|
}
|
|
@@ -2049,7 +2051,7 @@ static int tg3_set_power_state(struct tg3 *tp, pci_power_t state)
|
|
|
struct phy_device *phydev;
|
|
|
u32 advertising;
|
|
|
|
|
|
- phydev = tp->mdio_bus.phy_map[PHY_ADDR];
|
|
|
+ phydev = tp->mdio_bus->phy_map[PHY_ADDR];
|
|
|
|
|
|
tp->link_config.phy_is_low_power = 1;
|
|
|
|
|
@@ -8954,7 +8956,7 @@ static int tg3_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
|
|
|
if (tp->tg3_flags3 & TG3_FLG3_USE_PHYLIB) {
|
|
|
if (!(tp->tg3_flags3 & TG3_FLG3_PHY_CONNECTED))
|
|
|
return -EAGAIN;
|
|
|
- return phy_ethtool_gset(tp->mdio_bus.phy_map[PHY_ADDR], cmd);
|
|
|
+ return phy_ethtool_gset(tp->mdio_bus->phy_map[PHY_ADDR], cmd);
|
|
|
}
|
|
|
|
|
|
cmd->supported = (SUPPORTED_Autoneg);
|
|
@@ -8995,7 +8997,7 @@ static int tg3_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
|
|
|
if (tp->tg3_flags3 & TG3_FLG3_USE_PHYLIB) {
|
|
|
if (!(tp->tg3_flags3 & TG3_FLG3_PHY_CONNECTED))
|
|
|
return -EAGAIN;
|
|
|
- return phy_ethtool_sset(tp->mdio_bus.phy_map[PHY_ADDR], cmd);
|
|
|
+ return phy_ethtool_sset(tp->mdio_bus->phy_map[PHY_ADDR], cmd);
|
|
|
}
|
|
|
|
|
|
if (tp->tg3_flags2 & TG3_FLG2_ANY_SERDES) {
|
|
@@ -9143,7 +9145,7 @@ static int tg3_nway_reset(struct net_device *dev)
|
|
|
if (tp->tg3_flags3 & TG3_FLG3_USE_PHYLIB) {
|
|
|
if (!(tp->tg3_flags3 & TG3_FLG3_PHY_CONNECTED))
|
|
|
return -EAGAIN;
|
|
|
- r = phy_start_aneg(tp->mdio_bus.phy_map[PHY_ADDR]);
|
|
|
+ r = phy_start_aneg(tp->mdio_bus->phy_map[PHY_ADDR]);
|
|
|
} else {
|
|
|
u32 bmcr;
|
|
|
|
|
@@ -9260,7 +9262,7 @@ static int tg3_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam
|
|
|
u32 newadv;
|
|
|
struct phy_device *phydev;
|
|
|
|
|
|
- phydev = tp->mdio_bus.phy_map[PHY_ADDR];
|
|
|
+ phydev = tp->mdio_bus->phy_map[PHY_ADDR];
|
|
|
|
|
|
if (epause->rx_pause) {
|
|
|
if (epause->tx_pause)
|
|
@@ -10242,7 +10244,7 @@ static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
|
|
if (tp->tg3_flags3 & TG3_FLG3_USE_PHYLIB) {
|
|
|
if (!(tp->tg3_flags3 & TG3_FLG3_PHY_CONNECTED))
|
|
|
return -EAGAIN;
|
|
|
- return phy_mii_ioctl(tp->mdio_bus.phy_map[PHY_ADDR], data, cmd);
|
|
|
+ return phy_mii_ioctl(tp->mdio_bus->phy_map[PHY_ADDR], data, cmd);
|
|
|
}
|
|
|
|
|
|
switch(cmd) {
|