phylib: move to dynamic allocation of struct mii_bus
This patch introduces mdiobus_alloc() and mdiobus_free(), and makes all mdio bus drivers use these functions to allocate their struct mii_bus'es dynamically. Signed-off-by: Lennert Buytenhek <buytenh@marvell.com> Signed-off-by: David S. Miller <davem@davemloft.net> Acked-by: Andy Fleming <afleming@freescale.com>
Этот коммит содержится в:

коммит произвёл
David S. Miller

родитель
18ee49ddb0
Коммит
298cf9beb9
@@ -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) {
|
||||
|
Ссылка в новой задаче
Block a user