phy: Add an mdio_device structure

Not all devices attached to an MDIO bus are phys. So add an
mdio_device structure to represent the generic parts of an mdio
device, and place this structure into the phy_device.

Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Andrew Lunn 2016-01-06 20:11:16 +01:00 committed by David S. Miller
parent e7f4dc3536
commit e5a03bfd87
35 changed files with 165 additions and 151 deletions

View File

@ -1235,7 +1235,7 @@ static int et131x_mii_read(struct et131x_adapter *adapter, u8 reg, u16 *value)
if (!phydev) if (!phydev)
return -EIO; return -EIO;
return et131x_phy_mii_read(adapter, phydev->addr, reg, value); return et131x_phy_mii_read(adapter, phydev->mdio.addr, reg, value);
} }
static int et131x_mii_write(struct et131x_adapter *adapter, u8 addr, u8 reg, static int et131x_mii_write(struct et131x_adapter *adapter, u8 addr, u8 reg,
@ -1462,7 +1462,7 @@ static void et1310_phy_power_switch(struct et131x_adapter *adapter, bool down)
data &= ~BMCR_PDOWN; data &= ~BMCR_PDOWN;
if (down) if (down)
data |= BMCR_PDOWN; data |= BMCR_PDOWN;
et131x_mii_write(adapter, phydev->addr, MII_BMCR, data); et131x_mii_write(adapter, phydev->mdio.addr, MII_BMCR, data);
} }
/* et131x_xcvr_init - Init the phy if we are setting it into force mode */ /* et131x_xcvr_init - Init the phy if we are setting it into force mode */
@ -1490,7 +1490,7 @@ static void et131x_xcvr_init(struct et131x_adapter *adapter)
else else
lcr2 |= (LED_VAL_LINKON << LED_TXRX_SHIFT); lcr2 |= (LED_VAL_LINKON << LED_TXRX_SHIFT);
et131x_mii_write(adapter, phydev->addr, PHY_LED_2, lcr2); et131x_mii_write(adapter, phydev->mdio.addr, PHY_LED_2, lcr2);
} }
} }
@ -3192,14 +3192,14 @@ static void et131x_adjust_link(struct net_device *netdev)
et131x_mii_read(adapter, PHY_MPHY_CONTROL_REG, et131x_mii_read(adapter, PHY_MPHY_CONTROL_REG,
&register18); &register18);
et131x_mii_write(adapter, phydev->addr, et131x_mii_write(adapter, phydev->mdio.addr,
PHY_MPHY_CONTROL_REG, PHY_MPHY_CONTROL_REG,
register18 | 0x4); register18 | 0x4);
et131x_mii_write(adapter, phydev->addr, PHY_INDEX_REG, et131x_mii_write(adapter, phydev->mdio.addr,
register18 | 0x8402); PHY_INDEX_REG, register18 | 0x8402);
et131x_mii_write(adapter, phydev->addr, PHY_DATA_REG, et131x_mii_write(adapter, phydev->mdio.addr,
register18 | 511); PHY_DATA_REG, register18 | 511);
et131x_mii_write(adapter, phydev->addr, et131x_mii_write(adapter, phydev->mdio.addr,
PHY_MPHY_CONTROL_REG, register18); PHY_MPHY_CONTROL_REG, register18);
} }
@ -3212,8 +3212,8 @@ static void et131x_adjust_link(struct net_device *netdev)
et131x_mii_read(adapter, PHY_CONFIG, &reg); et131x_mii_read(adapter, PHY_CONFIG, &reg);
reg &= ~ET_PHY_CONFIG_TX_FIFO_DEPTH; reg &= ~ET_PHY_CONFIG_TX_FIFO_DEPTH;
reg |= ET_PHY_CONFIG_FIFO_DEPTH_32; reg |= ET_PHY_CONFIG_FIFO_DEPTH_32;
et131x_mii_write(adapter, phydev->addr, PHY_CONFIG, et131x_mii_write(adapter, phydev->mdio.addr,
reg); PHY_CONFIG, reg);
} }
et131x_set_rx_dma_timer(adapter); et131x_set_rx_dma_timer(adapter);
@ -3226,14 +3226,14 @@ static void et131x_adjust_link(struct net_device *netdev)
et131x_mii_read(adapter, PHY_MPHY_CONTROL_REG, et131x_mii_read(adapter, PHY_MPHY_CONTROL_REG,
&register18); &register18);
et131x_mii_write(adapter, phydev->addr, et131x_mii_write(adapter, phydev->mdio.addr,
PHY_MPHY_CONTROL_REG, PHY_MPHY_CONTROL_REG,
register18 | 0x4); register18 | 0x4);
et131x_mii_write(adapter, phydev->addr, et131x_mii_write(adapter, phydev->mdio.addr,
PHY_INDEX_REG, register18 | 0x8402); PHY_INDEX_REG, register18 | 0x8402);
et131x_mii_write(adapter, phydev->addr, et131x_mii_write(adapter, phydev->mdio.addr,
PHY_DATA_REG, register18 | 511); PHY_DATA_REG, register18 | 511);
et131x_mii_write(adapter, phydev->addr, et131x_mii_write(adapter, phydev->mdio.addr,
PHY_MPHY_CONTROL_REG, register18); PHY_MPHY_CONTROL_REG, register18);
} }

View File

@ -844,7 +844,7 @@ static int init_phy(struct net_device *dev)
} }
netdev_dbg(dev, "attached to PHY %d UID 0x%08x Link = %d\n", netdev_dbg(dev, "attached to PHY %d UID 0x%08x Link = %d\n",
phydev->addr, phydev->phy_id, phydev->link); phydev->mdio.addr, phydev->phy_id, phydev->link);
priv->phydev = phydev; priv->phydev = phydev;
return 0; return 0;

View File

@ -2305,7 +2305,7 @@ static int b44_register_phy_one(struct b44 *bp)
bp->phydev = phydev; bp->phydev = phydev;
bp->old_link = 0; bp->old_link = 0;
bp->phy_addr = phydev->addr; bp->phy_addr = phydev->mdio.addr;
phy_attached_info(phydev); phy_attached_info(phydev);

View File

@ -401,7 +401,7 @@ int bcmgenet_mii_probe(struct net_device *dev)
* Ethernet MAC ISRs * Ethernet MAC ISRs
*/ */
if (priv->internal_phy) if (priv->internal_phy)
priv->mii_bus->irq[phydev->addr] = PHY_IGNORE_INTERRUPT; priv->mii_bus->irq[phydev->mdio.addr] = PHY_IGNORE_INTERRUPT;
return 0; return 0;
} }

View File

@ -2366,8 +2366,8 @@ static int sbmac_mii_probe(struct net_device *dev)
return -ENXIO; return -ENXIO;
} }
phy_dev = phy_connect(dev, dev_name(&phy_dev->dev), &sbmac_mii_poll, phy_dev = phy_connect(dev, dev_name(&phy_dev->mdio.dev),
PHY_INTERFACE_MODE_GMII); &sbmac_mii_poll, PHY_INTERFACE_MODE_GMII);
if (IS_ERR(phy_dev)) { if (IS_ERR(phy_dev)) {
printk(KERN_ERR "%s: could not attach to PHY\n", dev->name); printk(KERN_ERR "%s: could not attach to PHY\n", dev->name);
return PTR_ERR(phy_dev); return PTR_ERR(phy_dev);

View File

@ -1295,7 +1295,7 @@ int dtsec_init(struct fman_mac *dtsec)
err = init(dtsec->regs, dtsec_drv_param, dtsec->phy_if, err = init(dtsec->regs, dtsec_drv_param, dtsec->phy_if,
dtsec->max_speed, (u8 *)eth_addr, dtsec->exceptions, dtsec->max_speed, (u8 *)eth_addr, dtsec->exceptions,
dtsec->tbiphy->addr); dtsec->tbiphy->mdio.addr);
if (err) { if (err) {
free_init_resources(dtsec); free_init_resources(dtsec);
pr_err("DTSEC version doesn't support this i/f mode\n"); pr_err("DTSEC version doesn't support this i/f mode\n");
@ -1434,11 +1434,11 @@ struct fman_mac *dtsec_config(struct fman_mac_params *params)
dtsec->tbiphy = of_phy_find_device(params->internal_phy_node); dtsec->tbiphy = of_phy_find_device(params->internal_phy_node);
if (!dtsec->tbiphy) { if (!dtsec->tbiphy) {
pr_err("of_phy_find_device (TBI PHY) failed\n"); pr_err("of_phy_find_device (TBI PHY) failed\n");
put_device(&dtsec->tbiphy->dev); put_device(&dtsec->tbiphy->mdio.dev);
goto err_dtsec_drv_param; goto err_dtsec_drv_param;
} }
put_device(&dtsec->tbiphy->dev); put_device(&dtsec->tbiphy->mdio.dev);
/* Save FMan revision */ /* Save FMan revision */
fman_get_revision(dtsec->fm, &dtsec->fm_rev_info); fman_get_revision(dtsec->fm, &dtsec->fm_rev_info);

View File

@ -1054,15 +1054,15 @@ int memac_init(struct fman_mac *memac)
* register address space and access each one of 4 * register address space and access each one of 4
* ports inside QSGMII. * ports inside QSGMII.
*/ */
phy_addr = memac->pcsphy->addr; phy_addr = memac->pcsphy->mdio.addr;
qsmgii_phy_addr = (u8)((phy_addr << 2) | i); qsmgii_phy_addr = (u8)((phy_addr << 2) | i);
memac->pcsphy->addr = qsmgii_phy_addr; memac->pcsphy->mdio.addr = qsmgii_phy_addr;
if (memac->basex_if) if (memac->basex_if)
setup_sgmii_internal_phy_base_x(memac); setup_sgmii_internal_phy_base_x(memac);
else else
setup_sgmii_internal_phy(memac, fixed_link); setup_sgmii_internal_phy(memac, fixed_link);
memac->pcsphy->addr = phy_addr; memac->pcsphy->mdio.addr = phy_addr;
} }
} }

View File

@ -254,7 +254,7 @@ static void restart(struct net_device *dev)
int r; int r;
u32 addrhi, addrlo; u32 addrhi, addrlo;
struct mii_bus* mii = fep->phydev->bus; struct mii_bus *mii = fep->phydev->mdio.bus;
struct fec_info* fec_inf = mii->priv; struct fec_info* fec_inf = mii->priv;
r = whack_reset(fep->fec.fecp); r = whack_reset(fep->fec.fecp);

View File

@ -1834,7 +1834,7 @@ static void gfar_configure_serdes(struct net_device *dev)
* several seconds for it to come back. * several seconds for it to come back.
*/ */
if (phy_read(tbiphy, MII_BMSR) & BMSR_LSTATUS) { if (phy_read(tbiphy, MII_BMSR) & BMSR_LSTATUS) {
put_device(&tbiphy->dev); put_device(&tbiphy->mdio.dev);
return; return;
} }
@ -1849,7 +1849,7 @@ static void gfar_configure_serdes(struct net_device *dev)
BMCR_ANENABLE | BMCR_ANRESTART | BMCR_FULLDPLX | BMCR_ANENABLE | BMCR_ANRESTART | BMCR_FULLDPLX |
BMCR_SPEED1000); BMCR_SPEED1000);
put_device(&tbiphy->dev); put_device(&tbiphy->mdio.dev);
} }
static int __gfar_is_rx_idle(struct gfar_private *priv) static int __gfar_is_rx_idle(struct gfar_private *priv)

View File

@ -1385,7 +1385,7 @@ static int adjust_enet_interface(struct ucc_geth_private *ugeth)
value &= ~0x1000; /* Turn off autonegotiation */ value &= ~0x1000; /* Turn off autonegotiation */
phy_write(tbiphy, ENET_TBI_MII_CR, value); phy_write(tbiphy, ENET_TBI_MII_CR, value);
put_device(&tbiphy->dev); put_device(&tbiphy->mdio.dev);
} }
init_check_frame_length_mode(ug_info->lengthCheckRx, &ug_regs->maccfg2); init_check_frame_length_mode(ug_info->lengthCheckRx, &ug_regs->maccfg2);
@ -1705,7 +1705,7 @@ static void uec_configure_serdes(struct net_device *dev)
* several seconds for it to come back. * several seconds for it to come back.
*/ */
if (phy_read(tbiphy, ENET_TBI_MII_SR) & TBISR_LSTATUS) { if (phy_read(tbiphy, ENET_TBI_MII_SR) & TBISR_LSTATUS) {
put_device(&tbiphy->dev); put_device(&tbiphy->mdio.dev);
return; return;
} }

View File

@ -71,7 +71,7 @@ static void hns_get_mdix_mode(struct net_device *net_dev,
struct hns_nic_priv *priv = netdev_priv(net_dev); struct hns_nic_priv *priv = netdev_priv(net_dev);
struct phy_device *phy_dev = priv->phy; struct phy_device *phy_dev = priv->phy;
if (!phy_dev || !phy_dev->bus) { if (!phy_dev || !phy_dev->mdio.bus) {
cmd->eth_tp_mdix_ctrl = ETH_TP_MDI_INVALID; cmd->eth_tp_mdix_ctrl = ETH_TP_MDI_INVALID;
cmd->eth_tp_mdix = ETH_TP_MDI_INVALID; cmd->eth_tp_mdix = ETH_TP_MDI_INVALID;
return; return;

View File

@ -3133,7 +3133,7 @@ static int mv643xx_eth_probe(struct platform_device *pdev)
if (!mp->phy) if (!mp->phy)
err = -ENODEV; err = -ENODEV;
else else
phy_addr_set(mp, mp->phy->addr); phy_addr_set(mp, mp->phy->mdio.addr);
} else if (pd->phy_addr != MV643XX_ETH_PHY_NONE) { } else if (pd->phy_addr != MV643XX_ETH_PHY_NONE) {
mp->phy = phy_scan(mp, pd->phy_addr); mp->phy = phy_scan(mp, pd->phy_addr);

View File

@ -3714,7 +3714,7 @@ static int mvneta_probe(struct platform_device *pdev)
mvneta_fixed_link_update(pp, phy); mvneta_fixed_link_update(pp, phy);
put_device(&phy->dev); put_device(&phy->mdio.dev);
} }
return 0; return 0;

View File

@ -864,8 +864,8 @@ static int smsc911x_phy_loopbacktest(struct net_device *dev)
for (i = 0; i < 10; i++) { for (i = 0; i < 10; i++) {
/* Set PHY to 10/FD, no ANEG, and loopback mode */ /* Set PHY to 10/FD, no ANEG, and loopback mode */
smsc911x_mii_write(phy_dev->bus, phy_dev->addr, MII_BMCR, smsc911x_mii_write(phy_dev->mdio.bus, phy_dev->mdio.addr,
BMCR_LOOPBACK | BMCR_FULLDPLX); MII_BMCR, BMCR_LOOPBACK | BMCR_FULLDPLX);
/* Enable MAC tx/rx, FD */ /* Enable MAC tx/rx, FD */
spin_lock_irqsave(&pdata->mac_lock, flags); spin_lock_irqsave(&pdata->mac_lock, flags);
@ -893,7 +893,7 @@ static int smsc911x_phy_loopbacktest(struct net_device *dev)
spin_unlock_irqrestore(&pdata->mac_lock, flags); spin_unlock_irqrestore(&pdata->mac_lock, flags);
/* Cancel PHY loopback mode */ /* Cancel PHY loopback mode */
smsc911x_mii_write(phy_dev->bus, phy_dev->addr, MII_BMCR, 0); smsc911x_mii_write(phy_dev->mdio.bus, phy_dev->mdio.addr, MII_BMCR, 0);
smsc911x_reg_write(pdata, TX_CFG, 0); smsc911x_reg_write(pdata, TX_CFG, 0);
smsc911x_reg_write(pdata, RX_CFG, 0); smsc911x_reg_write(pdata, RX_CFG, 0);
@ -1021,7 +1021,7 @@ static int smsc911x_mii_probe(struct net_device *dev)
} }
SMSC_TRACE(pdata, probe, "PHY: addr %d, phy_id 0x%08X", SMSC_TRACE(pdata, probe, "PHY: addr %d, phy_id 0x%08X",
phydev->addr, phydev->phy_id); phydev->mdio.addr, phydev->phy_id);
ret = phy_connect_direct(dev, phydev, &smsc911x_phy_adjust_link, ret = phy_connect_direct(dev, phydev, &smsc911x_phy_adjust_link,
pdata->config.phy_interface); pdata->config.phy_interface);
@ -1988,7 +1988,8 @@ smsc911x_ethtool_getregs(struct net_device *dev, struct ethtool_regs *regs,
} }
for (i = 0; i <= 31; i++) for (i = 0; i <= 31; i++)
data[j++] = smsc911x_mii_read(phy_dev->bus, phy_dev->addr, i); data[j++] = smsc911x_mii_read(phy_dev->mdio.bus,
phy_dev->mdio.addr, i);
} }
static void smsc911x_eeprom_enable_access(struct smsc911x_data *pdata) static void smsc911x_eeprom_enable_access(struct smsc911x_data *pdata)

View File

@ -315,7 +315,8 @@ smsc9420_ethtool_getregs(struct net_device *dev, struct ethtool_regs *regs,
return; return;
for (i = 0; i <= 31; i++) for (i = 0; i <= 31; i++)
data[j++] = smsc9420_mii_read(phy_dev->bus, phy_dev->addr, i); data[j++] = smsc9420_mii_read(phy_dev->mdio.bus,
phy_dev->mdio.addr, i);
} }
static void smsc9420_eeprom_enable_access(struct smsc9420_pdata *pd) static void smsc9420_eeprom_enable_access(struct smsc9420_pdata *pd)

View File

@ -2050,7 +2050,8 @@ static int cpsw_probe_dt(struct cpsw_priv *priv,
if (!phy_dev) if (!phy_dev)
return -ENODEV; return -ENODEV;
snprintf(slave_data->phy_id, sizeof(slave_data->phy_id), snprintf(slave_data->phy_id, sizeof(slave_data->phy_id),
PHY_ID_FMT, phy_dev->bus->id, phy_dev->addr); PHY_ID_FMT, phy_dev->mdio.bus->id,
phy_dev->mdio.addr);
} else if (parp) { } else if (parp) {
u32 phyid; u32 phyid;
struct device_node *mdio_node; struct device_node *mdio_node;

View File

@ -396,7 +396,7 @@ static int davinci_mdio_probe(struct platform_device *pdev)
phy = data->bus->phy_map[addr]; phy = data->bus->phy_map[addr];
if (phy) { if (phy) {
dev_info(dev, "phy[%d]: device %s, driver %s\n", dev_info(dev, "phy[%d]: device %s, driver %s\n",
phy->addr, phydev_name(phy), phy->mdio.addr, phydev_name(phy),
phy->drv ? phy->drv->name : "unknown"); phy->drv ? phy->drv->name : "unknown");
} }
} }

View File

@ -827,7 +827,7 @@ static int xemaclite_mdio_setup(struct net_local *lp, struct device *dev)
dev_info(dev, dev_info(dev,
"MDIO of the phy is not registered yet\n"); "MDIO of the phy is not registered yet\n");
else else
put_device(&phydev->dev); put_device(&phydev->mdio.dev);
return 0; return 0;
} }

View File

@ -190,7 +190,7 @@ static int at803x_resume(struct phy_device *phydev)
static int at803x_probe(struct phy_device *phydev) static int at803x_probe(struct phy_device *phydev)
{ {
struct device *dev = &phydev->dev; struct device *dev = &phydev->mdio.dev;
struct at803x_priv *priv; struct at803x_priv *priv;
struct gpio_desc *gpiod_reset; struct gpio_desc *gpiod_reset;

View File

@ -40,10 +40,10 @@ static int bcm87xx_of_reg_init(struct phy_device *phydev)
const __be32 *paddr_end; const __be32 *paddr_end;
int len, ret; int len, ret;
if (!phydev->dev.of_node) if (!phydev->mdio.dev.of_node)
return 0; return 0;
paddr = of_get_property(phydev->dev.of_node, paddr = of_get_property(phydev->mdio.dev.of_node,
"broadcom,c45-reg-init", &len); "broadcom,c45-reg-init", &len);
if (!paddr) if (!paddr)
return 0; return 0;

View File

@ -220,9 +220,10 @@ static void rx_timestamp_work(struct work_struct *work);
#define BROADCAST_ADDR 31 #define BROADCAST_ADDR 31
static inline int broadcast_write(struct mii_bus *bus, u32 regnum, u16 val) static inline int broadcast_write(struct phy_device *phydev, u32 regnum,
u16 val)
{ {
return mdiobus_write(bus, BROADCAST_ADDR, regnum, val); return mdiobus_write(phydev->mdio.bus, BROADCAST_ADDR, regnum, val);
} }
/* Caller must hold extreg_lock. */ /* Caller must hold extreg_lock. */
@ -232,7 +233,7 @@ static int ext_read(struct phy_device *phydev, int page, u32 regnum)
int val; int val;
if (dp83640->clock->page != page) { if (dp83640->clock->page != page) {
broadcast_write(phydev->bus, PAGESEL, page); broadcast_write(phydev, PAGESEL, page);
dp83640->clock->page = page; dp83640->clock->page = page;
} }
val = phy_read(phydev, regnum); val = phy_read(phydev, regnum);
@ -247,11 +248,11 @@ static void ext_write(int broadcast, struct phy_device *phydev,
struct dp83640_private *dp83640 = phydev->priv; struct dp83640_private *dp83640 = phydev->priv;
if (dp83640->clock->page != page) { if (dp83640->clock->page != page) {
broadcast_write(phydev->bus, PAGESEL, page); broadcast_write(phydev, PAGESEL, page);
dp83640->clock->page = page; dp83640->clock->page = page;
} }
if (broadcast) if (broadcast)
broadcast_write(phydev->bus, regnum, val); broadcast_write(phydev, regnum, val);
else else
phy_write(phydev, regnum, val); phy_write(phydev, regnum, val);
} }
@ -1039,7 +1040,7 @@ static int choose_this_phy(struct dp83640_clock *clock,
if (chosen_phy == -1 && !clock->chosen) if (chosen_phy == -1 && !clock->chosen)
return 1; return 1;
if (chosen_phy == phydev->addr) if (chosen_phy == phydev->mdio.addr)
return 1; return 1;
return 0; return 0;
@ -1103,10 +1104,10 @@ static int dp83640_probe(struct phy_device *phydev)
struct dp83640_private *dp83640; struct dp83640_private *dp83640;
int err = -ENOMEM, i; int err = -ENOMEM, i;
if (phydev->addr == BROADCAST_ADDR) if (phydev->mdio.addr == BROADCAST_ADDR)
return 0; return 0;
clock = dp83640_clock_get_bus(phydev->bus); clock = dp83640_clock_get_bus(phydev->mdio.bus);
if (!clock) if (!clock)
goto no_clock; goto no_clock;
@ -1132,7 +1133,8 @@ static int dp83640_probe(struct phy_device *phydev)
if (choose_this_phy(clock, phydev)) { if (choose_this_phy(clock, phydev)) {
clock->chosen = dp83640; clock->chosen = dp83640;
clock->ptp_clock = ptp_clock_register(&clock->caps, &phydev->dev); clock->ptp_clock = ptp_clock_register(&clock->caps,
&phydev->mdio.dev);
if (IS_ERR(clock->ptp_clock)) { if (IS_ERR(clock->ptp_clock)) {
err = PTR_ERR(clock->ptp_clock); err = PTR_ERR(clock->ptp_clock);
goto no_register; goto no_register;
@ -1158,7 +1160,7 @@ static void dp83640_remove(struct phy_device *phydev)
struct list_head *this, *next; struct list_head *this, *next;
struct dp83640_private *tmp, *dp83640 = phydev->priv; struct dp83640_private *tmp, *dp83640 = phydev->priv;
if (phydev->addr == BROADCAST_ADDR) if (phydev->mdio.addr == BROADCAST_ADDR)
return; return;
enable_status_frames(phydev, false); enable_status_frames(phydev, false);

View File

@ -103,7 +103,7 @@ static int dp83867_config_intr(struct phy_device *phydev)
static int dp83867_of_init(struct phy_device *phydev) static int dp83867_of_init(struct phy_device *phydev)
{ {
struct dp83867_private *dp83867 = phydev->priv; struct dp83867_private *dp83867 = phydev->priv;
struct device *dev = &phydev->dev; struct device *dev = &phydev->mdio.dev;
struct device_node *of_node = dev->of_node; struct device_node *of_node = dev->of_node;
int ret; int ret;
@ -137,7 +137,7 @@ static int dp83867_config_init(struct phy_device *phydev)
u16 val, delay; u16 val, delay;
if (!phydev->priv) { if (!phydev->priv) {
dp83867 = devm_kzalloc(&phydev->dev, sizeof(*dp83867), dp83867 = devm_kzalloc(&phydev->mdio.dev, sizeof(*dp83867),
GFP_KERNEL); GFP_KERNEL);
if (!dp83867) if (!dp83867)
return -ENOMEM; return -ENOMEM;

View File

@ -197,11 +197,11 @@ int fixed_phy_set_link_update(struct phy_device *phydev,
struct fixed_mdio_bus *fmb = &platform_fmb; struct fixed_mdio_bus *fmb = &platform_fmb;
struct fixed_phy *fp; struct fixed_phy *fp;
if (!phydev || !phydev->bus) if (!phydev || !phydev->mdio.bus)
return -EINVAL; return -EINVAL;
list_for_each_entry(fp, &fmb->phys, node) { list_for_each_entry(fp, &fmb->phys, node) {
if (fp->addr == phydev->addr) { if (fp->addr == phydev->mdio.addr) {
fp->link_update = link_update; fp->link_update = link_update;
fp->phydev = phydev; fp->phydev = phydev;
return 0; return 0;
@ -219,11 +219,11 @@ int fixed_phy_update_state(struct phy_device *phydev,
struct fixed_mdio_bus *fmb = &platform_fmb; struct fixed_mdio_bus *fmb = &platform_fmb;
struct fixed_phy *fp; struct fixed_phy *fp;
if (!phydev || phydev->bus != fmb->mii_bus) if (!phydev || phydev->mdio.bus != fmb->mii_bus)
return -EINVAL; return -EINVAL;
list_for_each_entry(fp, &fmb->phys, node) { list_for_each_entry(fp, &fmb->phys, node) {
if (fp->addr == phydev->addr) { if (fp->addr == phydev->mdio.addr) {
#define _UPD(x) if (changed->x) \ #define _UPD(x) if (changed->x) \
fp->status.x = status->x fp->status.x = status->x
_UPD(link); _UPD(link);
@ -344,7 +344,7 @@ struct phy_device *fixed_phy_register(unsigned int irq,
} }
of_node_get(np); of_node_get(np);
phy->dev.of_node = np; phy->mdio.dev.of_node = np;
phy->is_pseudo_fixed_link = true; phy->is_pseudo_fixed_link = true;
switch (status->speed) { switch (status->speed) {

View File

@ -53,43 +53,43 @@ static int ip175c_config_init(struct phy_device *phydev)
if (full_reset_performed == 0) { if (full_reset_performed == 0) {
/* master reset */ /* master reset */
err = mdiobus_write(phydev->bus, 30, 0, 0x175c); err = mdiobus_write(phydev->mdio.bus, 30, 0, 0x175c);
if (err < 0) if (err < 0)
return err; return err;
/* ensure no bus delays overlap reset period */ /* ensure no bus delays overlap reset period */
err = mdiobus_read(phydev->bus, 30, 0); err = mdiobus_read(phydev->mdio.bus, 30, 0);
/* data sheet specifies reset period is 2 msec */ /* data sheet specifies reset period is 2 msec */
mdelay(2); mdelay(2);
/* enable IP175C mode */ /* enable IP175C mode */
err = mdiobus_write(phydev->bus, 29, 31, 0x175c); err = mdiobus_write(phydev->mdio.bus, 29, 31, 0x175c);
if (err < 0) if (err < 0)
return err; return err;
/* Set MII0 speed and duplex (in PHY mode) */ /* Set MII0 speed and duplex (in PHY mode) */
err = mdiobus_write(phydev->bus, 29, 22, 0x420); err = mdiobus_write(phydev->mdio.bus, 29, 22, 0x420);
if (err < 0) if (err < 0)
return err; return err;
/* reset switch ports */ /* reset switch ports */
for (i = 0; i < 5; i++) { for (i = 0; i < 5; i++) {
err = mdiobus_write(phydev->bus, i, err = mdiobus_write(phydev->mdio.bus, i,
MII_BMCR, BMCR_RESET); MII_BMCR, BMCR_RESET);
if (err < 0) if (err < 0)
return err; return err;
} }
for (i = 0; i < 5; i++) for (i = 0; i < 5; i++)
err = mdiobus_read(phydev->bus, i, MII_BMCR); err = mdiobus_read(phydev->mdio.bus, i, MII_BMCR);
mdelay(2); mdelay(2);
full_reset_performed = 1; full_reset_performed = 1;
} }
if (phydev->addr != 4) { if (phydev->mdio.addr != 4) {
phydev->state = PHY_RUNNING; phydev->state = PHY_RUNNING;
phydev->speed = SPEED_100; phydev->speed = SPEED_100;
phydev->duplex = DUPLEX_FULL; phydev->duplex = DUPLEX_FULL;
@ -184,7 +184,7 @@ static int ip101a_g_config_init(struct phy_device *phydev)
static int ip175c_read_status(struct phy_device *phydev) static int ip175c_read_status(struct phy_device *phydev)
{ {
if (phydev->addr == 4) /* WAN port */ if (phydev->mdio.addr == 4) /* WAN port */
genphy_read_status(phydev); genphy_read_status(phydev);
else else
/* Don't need to read status for switch ports */ /* Don't need to read status for switch ports */
@ -195,7 +195,7 @@ static int ip175c_read_status(struct phy_device *phydev)
static int ip175c_config_aneg(struct phy_device *phydev) static int ip175c_config_aneg(struct phy_device *phydev)
{ {
if (phydev->addr == 4) /* WAN port */ if (phydev->mdio.addr == 4) /* WAN port */
genphy_config_aneg(phydev); genphy_config_aneg(phydev);
return 0; return 0;

View File

@ -300,10 +300,11 @@ static int marvell_of_reg_init(struct phy_device *phydev)
const __be32 *paddr; const __be32 *paddr;
int len, i, saved_page, current_page, page_changed, ret; int len, i, saved_page, current_page, page_changed, ret;
if (!phydev->dev.of_node) if (!phydev->mdio.dev.of_node)
return 0; return 0;
paddr = of_get_property(phydev->dev.of_node, "marvell,reg-init", &len); paddr = of_get_property(phydev->mdio.dev.of_node,
"marvell,reg-init", &len);
if (!paddr || len < (4 * sizeof(*paddr))) if (!paddr || len < (4 * sizeof(*paddr)))
return 0; return 0;
@ -1060,7 +1061,7 @@ static int marvell_probe(struct phy_device *phydev)
{ {
struct marvell_priv *priv; struct marvell_priv *priv;
priv = devm_kzalloc(&phydev->dev, sizeof(*priv), GFP_KERNEL); priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL);
if (!priv) if (!priv)
return -ENOMEM; return -ENOMEM;

View File

@ -200,16 +200,16 @@ EXPORT_SYMBOL(of_mdio_find_bus);
* the phy. This allows auto-probed pyh devices to be supplied with information * the phy. This allows auto-probed pyh devices to be supplied with information
* passed in via DT. * passed in via DT.
*/ */
static void of_mdiobus_link_phydev(struct mii_bus *mdio, static void of_mdiobus_link_phydev(struct mii_bus *bus,
struct phy_device *phydev) struct phy_device *phydev)
{ {
struct device *dev = &phydev->dev; struct device *dev = &phydev->mdio.dev;
struct device_node *child; struct device_node *child;
if (dev->of_node || !mdio->dev.of_node) if (dev->of_node || !bus->dev.of_node)
return; return;
for_each_available_child_of_node(mdio->dev.of_node, child) { for_each_available_child_of_node(bus->dev.of_node, child) {
int addr; int addr;
int ret; int ret;
@ -227,7 +227,7 @@ static void of_mdiobus_link_phydev(struct mii_bus *mdio,
continue; continue;
} }
if (addr == phydev->addr) { if (addr == phydev->mdio.addr) {
dev->of_node = child; dev->of_node = child;
return; return;
} }
@ -522,7 +522,7 @@ static int mdio_bus_match(struct device *dev, struct device_driver *drv)
static bool mdio_bus_phy_may_suspend(struct phy_device *phydev) static bool mdio_bus_phy_may_suspend(struct phy_device *phydev)
{ {
struct device_driver *drv = phydev->dev.driver; struct device_driver *drv = phydev->mdio.dev.driver;
struct phy_driver *phydrv = to_phy_driver(drv); struct phy_driver *phydrv = to_phy_driver(drv);
struct net_device *netdev = phydev->attached_dev; struct net_device *netdev = phydev->attached_dev;

View File

@ -350,7 +350,7 @@ static int ksz9021_load_values_from_of(struct phy_device *phydev,
static int ksz9021_config_init(struct phy_device *phydev) static int ksz9021_config_init(struct phy_device *phydev)
{ {
const struct device *dev = &phydev->dev; const struct device *dev = &phydev->mdio.dev;
const struct device_node *of_node = dev->of_node; const struct device_node *of_node = dev->of_node;
const struct device *dev_walker; const struct device *dev_walker;
@ -358,7 +358,7 @@ static int ksz9021_config_init(struct phy_device *phydev)
* properties in the MAC node. Walk up the tree of devices to * properties in the MAC node. Walk up the tree of devices to
* find a device with an OF node. * find a device with an OF node.
*/ */
dev_walker = &phydev->dev; dev_walker = &phydev->mdio.dev;
do { do {
of_node = dev_walker->of_node; of_node = dev_walker->of_node;
dev_walker = dev_walker->parent; dev_walker = dev_walker->parent;
@ -471,7 +471,7 @@ static int ksz9031_center_flp_timing(struct phy_device *phydev)
static int ksz9031_config_init(struct phy_device *phydev) static int ksz9031_config_init(struct phy_device *phydev)
{ {
const struct device *dev = &phydev->dev; const struct device *dev = &phydev->mdio.dev;
const struct device_node *of_node = dev->of_node; const struct device_node *of_node = dev->of_node;
static const char *clk_skews[2] = {"rxc-skew-ps", "txc-skew-ps"}; static const char *clk_skews[2] = {"rxc-skew-ps", "txc-skew-ps"};
static const char *rx_data_skews[4] = { static const char *rx_data_skews[4] = {
@ -630,12 +630,12 @@ static void kszphy_get_stats(struct phy_device *phydev,
static int kszphy_probe(struct phy_device *phydev) static int kszphy_probe(struct phy_device *phydev)
{ {
const struct kszphy_type *type = phydev->drv->driver_data; const struct kszphy_type *type = phydev->drv->driver_data;
const struct device_node *np = phydev->dev.of_node; const struct device_node *np = phydev->mdio.dev.of_node;
struct kszphy_priv *priv; struct kszphy_priv *priv;
struct clk *clk; struct clk *clk;
int ret; int ret;
priv = devm_kzalloc(&phydev->dev, sizeof(*priv), GFP_KERNEL); priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL);
if (!priv) if (!priv)
return -ENOMEM; return -ENOMEM;
@ -658,7 +658,7 @@ static int kszphy_probe(struct phy_device *phydev)
priv->led_mode = -1; priv->led_mode = -1;
} }
clk = devm_clk_get(&phydev->dev, "rmii-ref"); clk = devm_clk_get(&phydev->mdio.dev, "rmii-ref");
/* NOTE: clk may be NULL if building without CONFIG_HAVE_CLK */ /* NOTE: clk may be NULL if building without CONFIG_HAVE_CLK */
if (!IS_ERR_OR_NULL(clk)) { if (!IS_ERR_OR_NULL(clk)) {
unsigned long rate = clk_get_rate(clk); unsigned long rate = clk_get_rate(clk);

View File

@ -68,7 +68,7 @@ int lan88xx_suspend(struct phy_device *phydev)
static int lan88xx_probe(struct phy_device *phydev) static int lan88xx_probe(struct phy_device *phydev)
{ {
struct device *dev = &phydev->dev; struct device *dev = &phydev->mdio.dev;
struct lan88xx_priv *priv; struct lan88xx_priv *priv;
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
@ -89,7 +89,7 @@ static int lan88xx_probe(struct phy_device *phydev)
static void lan88xx_remove(struct phy_device *phydev) static void lan88xx_remove(struct phy_device *phydev)
{ {
struct device *dev = &phydev->dev; struct device *dev = &phydev->mdio.dev;
struct lan88xx_priv *priv = phydev->priv; struct lan88xx_priv *priv = phydev->priv;
if (priv) if (priv)

View File

@ -319,7 +319,7 @@ int phy_ethtool_sset(struct phy_device *phydev, struct ethtool_cmd *cmd)
{ {
u32 speed = ethtool_cmd_speed(cmd); u32 speed = ethtool_cmd_speed(cmd);
if (cmd->phy_address != phydev->addr) if (cmd->phy_address != phydev->mdio.addr)
return -EINVAL; return -EINVAL;
/* We make sure that we don't pass unsupported values in to the PHY */ /* We make sure that we don't pass unsupported values in to the PHY */
@ -375,7 +375,7 @@ int phy_ethtool_gset(struct phy_device *phydev, struct ethtool_cmd *cmd)
cmd->port = PORT_BNC; cmd->port = PORT_BNC;
else else
cmd->port = PORT_MII; cmd->port = PORT_MII;
cmd->phy_address = phydev->addr; cmd->phy_address = phydev->mdio.addr;
cmd->transceiver = phy_is_internal(phydev) ? cmd->transceiver = phy_is_internal(phydev) ?
XCVR_INTERNAL : XCVR_EXTERNAL; XCVR_INTERNAL : XCVR_EXTERNAL;
cmd->autoneg = phydev->autoneg; cmd->autoneg = phydev->autoneg;
@ -403,16 +403,17 @@ int phy_mii_ioctl(struct phy_device *phydev, struct ifreq *ifr, int cmd)
switch (cmd) { switch (cmd) {
case SIOCGMIIPHY: case SIOCGMIIPHY:
mii_data->phy_id = phydev->addr; mii_data->phy_id = phydev->mdio.addr;
/* fall through */ /* fall through */
case SIOCGMIIREG: case SIOCGMIIREG:
mii_data->val_out = mdiobus_read(phydev->bus, mii_data->phy_id, mii_data->val_out = mdiobus_read(phydev->mdio.bus,
mii_data->phy_id,
mii_data->reg_num); mii_data->reg_num);
return 0; return 0;
case SIOCSMIIREG: case SIOCSMIIREG:
if (mii_data->phy_id == phydev->addr) { if (mii_data->phy_id == phydev->mdio.addr) {
switch (mii_data->reg_num) { switch (mii_data->reg_num) {
case MII_BMCR: case MII_BMCR:
if ((val & (BMCR_RESET | BMCR_ANENABLE)) == 0) { if ((val & (BMCR_RESET | BMCR_ANENABLE)) == 0) {
@ -445,10 +446,10 @@ int phy_mii_ioctl(struct phy_device *phydev, struct ifreq *ifr, int cmd)
} }
} }
mdiobus_write(phydev->bus, mii_data->phy_id, mdiobus_write(phydev->mdio.bus, mii_data->phy_id,
mii_data->reg_num, val); mii_data->reg_num, val);
if (mii_data->phy_id == phydev->addr && if (mii_data->phy_id == phydev->mdio.addr &&
mii_data->reg_num == MII_BMCR && mii_data->reg_num == MII_BMCR &&
val & BMCR_RESET) val & BMCR_RESET)
return phy_init_hw(phydev); return phy_init_hw(phydev);
@ -643,7 +644,7 @@ int phy_start_interrupts(struct phy_device *phydev)
if (request_irq(phydev->irq, phy_interrupt, 0, "phy_interrupt", if (request_irq(phydev->irq, phy_interrupt, 0, "phy_interrupt",
phydev) < 0) { phydev) < 0) {
pr_warn("%s: Can't get IRQ %d (PHY)\n", pr_warn("%s: Can't get IRQ %d (PHY)\n",
phydev->bus->name, phydev->irq); phydev->mdio.bus->name, phydev->irq);
phydev->irq = PHY_POLL; phydev->irq = PHY_POLL;
return 0; return 0;
} }
@ -1041,11 +1042,11 @@ static inline void mmd_phy_indirect(struct mii_bus *bus, int prtad, int devad,
int phy_read_mmd_indirect(struct phy_device *phydev, int prtad, int devad) int phy_read_mmd_indirect(struct phy_device *phydev, int prtad, int devad)
{ {
struct phy_driver *phydrv = phydev->drv; struct phy_driver *phydrv = phydev->drv;
int addr = phydev->addr; int addr = phydev->mdio.addr;
int value = -1; int value = -1;
if (!phydrv->read_mmd_indirect) { if (!phydrv->read_mmd_indirect) {
struct mii_bus *bus = phydev->bus; struct mii_bus *bus = phydev->mdio.bus;
mutex_lock(&bus->mdio_lock); mutex_lock(&bus->mdio_lock);
mmd_phy_indirect(bus, prtad, devad, addr); mmd_phy_indirect(bus, prtad, devad, addr);
@ -1079,10 +1080,10 @@ void phy_write_mmd_indirect(struct phy_device *phydev, int prtad,
int devad, u32 data) int devad, u32 data)
{ {
struct phy_driver *phydrv = phydev->drv; struct phy_driver *phydrv = phydev->drv;
int addr = phydev->addr; int addr = phydev->mdio.addr;
if (!phydrv->write_mmd_indirect) { if (!phydrv->write_mmd_indirect) {
struct mii_bus *bus = phydev->bus; struct mii_bus *bus = phydev->mdio.bus;
mutex_lock(&bus->mdio_lock); mutex_lock(&bus->mdio_lock);
mmd_phy_indirect(bus, prtad, devad, addr); mmd_phy_indirect(bus, prtad, devad, addr);

View File

@ -43,7 +43,7 @@ MODULE_LICENSE("GPL");
void phy_device_free(struct phy_device *phydev) void phy_device_free(struct phy_device *phydev)
{ {
put_device(&phydev->dev); put_device(&phydev->mdio.dev);
} }
EXPORT_SYMBOL(phy_device_free); EXPORT_SYMBOL(phy_device_free);
@ -65,7 +65,7 @@ static DEFINE_MUTEX(phy_fixup_lock);
/** /**
* phy_register_fixup - creates a new phy_fixup and adds it to the list * phy_register_fixup - creates a new phy_fixup and adds it to the list
* @bus_id: A string which matches phydev->dev.bus_id (or PHY_ANY_ID) * @bus_id: A string which matches phydev->mdio.dev.bus_id (or PHY_ANY_ID)
* @phy_uid: Used to match against phydev->phy_id (the UID of the PHY) * @phy_uid: Used to match against phydev->phy_id (the UID of the PHY)
* It can also be PHY_ANY_UID * It can also be PHY_ANY_UID
* @phy_uid_mask: Applied to phydev->phy_id and fixup->phy_uid before * @phy_uid_mask: Applied to phydev->phy_id and fixup->phy_uid before
@ -153,13 +153,19 @@ struct phy_device *phy_device_create(struct mii_bus *bus, int addr, int phy_id,
struct phy_c45_device_ids *c45_ids) struct phy_c45_device_ids *c45_ids)
{ {
struct phy_device *dev; struct phy_device *dev;
struct mdio_device *mdiodev;
/* We allocate the device, and initialize the default values */ /* We allocate the device, and initialize the default values */
dev = kzalloc(sizeof(*dev), GFP_KERNEL); dev = kzalloc(sizeof(*dev), GFP_KERNEL);
if (!dev) if (!dev)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
dev->dev.release = phy_device_release; mdiodev = &dev->mdio;
mdiodev->dev.release = phy_device_release;
mdiodev->dev.parent = &bus->dev;
mdiodev->dev.bus = &mdio_bus_type;
mdiodev->bus = bus;
mdiodev->addr = addr;
dev->speed = 0; dev->speed = 0;
dev->duplex = -1; dev->duplex = -1;
@ -171,15 +177,11 @@ struct phy_device *phy_device_create(struct mii_bus *bus, int addr, int phy_id,
dev->autoneg = AUTONEG_ENABLE; dev->autoneg = AUTONEG_ENABLE;
dev->is_c45 = is_c45; dev->is_c45 = is_c45;
dev->addr = addr;
dev->phy_id = phy_id; dev->phy_id = phy_id;
if (c45_ids) if (c45_ids)
dev->c45_ids = *c45_ids; dev->c45_ids = *c45_ids;
dev->bus = bus;
dev->dev.parent = &bus->dev;
dev->dev.bus = &mdio_bus_type;
dev->irq = bus->irq ? bus->irq[addr] : PHY_POLL; dev->irq = bus->irq ? bus->irq[addr] : PHY_POLL;
dev_set_name(&dev->dev, PHY_ID_FMT, bus->id, addr); dev_set_name(&mdiodev->dev, PHY_ID_FMT, bus->id, addr);
dev->state = PHY_DOWN; dev->state = PHY_DOWN;
@ -199,7 +201,7 @@ struct phy_device *phy_device_create(struct mii_bus *bus, int addr, int phy_id,
*/ */
request_module(MDIO_MODULE_PREFIX MDIO_ID_FMT, MDIO_ID_ARGS(phy_id)); request_module(MDIO_MODULE_PREFIX MDIO_ID_FMT, MDIO_ID_ARGS(phy_id));
device_initialize(&dev->dev); device_initialize(&mdiodev->dev);
return dev; return dev;
} }
@ -382,27 +384,27 @@ int phy_device_register(struct phy_device *phydev)
int err; int err;
/* Don't register a phy if one is already registered at this address */ /* Don't register a phy if one is already registered at this address */
if (phydev->bus->phy_map[phydev->addr]) if (phydev->mdio.bus->phy_map[phydev->mdio.addr])
return -EINVAL; return -EINVAL;
phydev->bus->phy_map[phydev->addr] = phydev; phydev->mdio.bus->phy_map[phydev->mdio.addr] = phydev;
/* Run all of the fixups for this PHY */ /* Run all of the fixups for this PHY */
err = phy_scan_fixups(phydev); err = phy_scan_fixups(phydev);
if (err) { if (err) {
pr_err("PHY %d failed to initialize\n", phydev->addr); pr_err("PHY %d failed to initialize\n", phydev->mdio.addr);
goto out; goto out;
} }
err = device_add(&phydev->dev); err = device_add(&phydev->mdio.dev);
if (err) { if (err) {
pr_err("PHY %d failed to add\n", phydev->addr); pr_err("PHY %d failed to add\n", phydev->mdio.addr);
goto out; goto out;
} }
return 0; return 0;
out: out:
phydev->bus->phy_map[phydev->addr] = NULL; phydev->mdio.bus->phy_map[phydev->mdio.addr] = NULL;
return err; return err;
} }
EXPORT_SYMBOL(phy_device_register); EXPORT_SYMBOL(phy_device_register);
@ -417,10 +419,10 @@ EXPORT_SYMBOL(phy_device_register);
*/ */
void phy_device_remove(struct phy_device *phydev) void phy_device_remove(struct phy_device *phydev)
{ {
struct mii_bus *bus = phydev->bus; struct mii_bus *bus = phydev->mdio.bus;
int addr = phydev->addr; int addr = phydev->mdio.addr;
device_del(&phydev->dev); device_del(&phydev->mdio.dev);
bus->phy_map[addr] = NULL; bus->phy_map[addr] = NULL;
} }
EXPORT_SYMBOL(phy_device_remove); EXPORT_SYMBOL(phy_device_remove);
@ -617,13 +619,13 @@ EXPORT_SYMBOL(phy_attached_info);
void phy_attached_print(struct phy_device *phydev, const char *fmt, ...) void phy_attached_print(struct phy_device *phydev, const char *fmt, ...)
{ {
if (!fmt) { if (!fmt) {
dev_info(&phydev->dev, ATTACHED_FMT "\n", dev_info(&phydev->mdio.dev, ATTACHED_FMT "\n",
phydev->drv->name, phydev_name(phydev), phydev->drv->name, phydev_name(phydev),
phydev->irq); phydev->irq);
} else { } else {
va_list ap; va_list ap;
dev_info(&phydev->dev, ATTACHED_FMT, dev_info(&phydev->mdio.dev, ATTACHED_FMT,
phydev->drv->name, phydev_name(phydev), phydev->drv->name, phydev_name(phydev),
phydev->irq); phydev->irq);
@ -652,8 +654,8 @@ EXPORT_SYMBOL(phy_attached_print);
int phy_attach_direct(struct net_device *dev, struct phy_device *phydev, int phy_attach_direct(struct net_device *dev, struct phy_device *phydev,
u32 flags, phy_interface_t interface) u32 flags, phy_interface_t interface)
{ {
struct mii_bus *bus = phydev->bus; struct mii_bus *bus = phydev->mdio.bus;
struct device *d = &phydev->dev; struct device *d = &phydev->mdio.dev;
int err; int err;
if (!try_module_get(bus->owner)) { if (!try_module_get(bus->owner)) {
@ -771,8 +773,8 @@ void phy_detach(struct phy_device *phydev)
* real driver could be loaded * real driver could be loaded
*/ */
for (i = 0; i < ARRAY_SIZE(genphy_driver); i++) { for (i = 0; i < ARRAY_SIZE(genphy_driver); i++) {
if (phydev->dev.driver == &genphy_driver[i].driver) { if (phydev->mdio.dev.driver == &genphy_driver[i].driver) {
device_release_driver(&phydev->dev); device_release_driver(&phydev->mdio.dev);
break; break;
} }
} }
@ -781,16 +783,16 @@ void phy_detach(struct phy_device *phydev)
* The phydev might go away on the put_device() below, so avoid * The phydev might go away on the put_device() below, so avoid
* a use-after-free bug by reading the underlying bus first. * a use-after-free bug by reading the underlying bus first.
*/ */
bus = phydev->bus; bus = phydev->mdio.bus;
put_device(&phydev->dev); put_device(&phydev->mdio.dev);
module_put(bus->owner); module_put(bus->owner);
} }
EXPORT_SYMBOL(phy_detach); EXPORT_SYMBOL(phy_detach);
int phy_suspend(struct phy_device *phydev) int phy_suspend(struct phy_device *phydev)
{ {
struct phy_driver *phydrv = to_phy_driver(phydev->dev.driver); struct phy_driver *phydrv = to_phy_driver(phydev->mdio.dev.driver);
struct ethtool_wolinfo wol = { .cmd = ETHTOOL_GWOL }; struct ethtool_wolinfo wol = { .cmd = ETHTOOL_GWOL };
int ret = 0; int ret = 0;
@ -813,7 +815,7 @@ EXPORT_SYMBOL(phy_suspend);
int phy_resume(struct phy_device *phydev) int phy_resume(struct phy_device *phydev)
{ {
struct phy_driver *phydrv = to_phy_driver(phydev->dev.driver); struct phy_driver *phydrv = to_phy_driver(phydev->mdio.dev.driver);
int ret = 0; int ret = 0;
if (phydrv->resume) if (phydrv->resume)
@ -1330,7 +1332,7 @@ EXPORT_SYMBOL(phy_set_max_speed);
static void of_set_phy_supported(struct phy_device *phydev) static void of_set_phy_supported(struct phy_device *phydev)
{ {
struct device_node *node = phydev->dev.of_node; struct device_node *node = phydev->mdio.dev.of_node;
u32 max_speed; u32 max_speed;
if (!IS_ENABLED(CONFIG_OF_MDIO)) if (!IS_ENABLED(CONFIG_OF_MDIO))
@ -1354,7 +1356,7 @@ static void of_set_phy_supported(struct phy_device *phydev)
static int phy_probe(struct device *dev) static int phy_probe(struct device *dev)
{ {
struct phy_device *phydev = to_phy_device(dev); struct phy_device *phydev = to_phy_device(dev);
struct device_driver *drv = phydev->dev.driver; struct device_driver *drv = phydev->mdio.dev.driver;
struct phy_driver *phydrv = to_phy_driver(drv); struct phy_driver *phydrv = to_phy_driver(drv);
int err = 0; int err = 0;

View File

@ -44,7 +44,7 @@ static int smsc_phy_ack_interrupt(struct phy_device *phydev)
static int smsc_phy_config_init(struct phy_device *phydev) static int smsc_phy_config_init(struct phy_device *phydev)
{ {
int __maybe_unused len; int __maybe_unused len;
struct device *dev __maybe_unused = &phydev->dev; struct device *dev __maybe_unused = &phydev->mdio.dev;
struct device_node *of_node __maybe_unused = dev->of_node; struct device_node *of_node __maybe_unused = dev->of_node;
int rc = phy_read(phydev, MII_LAN83C185_CTRL_STATUS); int rc = phy_read(phydev, MII_LAN83C185_CTRL_STATUS);
int enable_energy = 1; int enable_energy = 1;

View File

@ -75,7 +75,7 @@ static int of_mdiobus_register_phy(struct mii_bus *mdio, struct device_node *chi
/* Associate the OF node with the device structure so it /* Associate the OF node with the device structure so it
* can be looked up later */ * can be looked up later */
of_node_get(child); of_node_get(child);
phy->dev.of_node = child; phy->mdio.dev.of_node = child;
/* All data is now stored in the phy struct; /* All data is now stored in the phy struct;
* register it */ * register it */
@ -233,7 +233,7 @@ struct phy_device *of_phy_connect(struct net_device *dev,
ret = phy_connect_direct(dev, phy, hndlr, iface); ret = phy_connect_direct(dev, phy, hndlr, iface);
/* refcount is held by phy_connect_direct() on success */ /* refcount is held by phy_connect_direct() on success */
put_device(&phy->dev); put_device(&phy->mdio.dev);
return ret ? NULL : phy; return ret ? NULL : phy;
} }
@ -263,7 +263,7 @@ struct phy_device *of_phy_attach(struct net_device *dev,
ret = phy_attach_direct(dev, phy, flags, iface); ret = phy_attach_direct(dev, phy, flags, iface);
/* refcount is held by phy_attach_direct() on success */ /* refcount is held by phy_attach_direct() on success */
put_device(&phy->dev); put_device(&phy->mdio.dev);
return ret ? NULL : phy; return ret ? NULL : phy;
} }

View File

@ -13,6 +13,15 @@
struct mii_bus; struct mii_bus;
struct mdio_device {
struct device dev;
struct mii_bus *bus;
/* Bus address of the MDIO device (0-31) */
int addr;
};
#define to_mdio_device(d) container_of(d, struct mdio_device, dev)
static inline bool mdio_phy_id_is_c45(int phy_id) static inline bool mdio_phy_id_is_c45(int phy_id)
{ {
return (phy_id & MDIO_PHY_ID_C45) && !(phy_id & ~MDIO_PHY_ID_C45_MASK); return (phy_id & MDIO_PHY_ID_C45) && !(phy_id & ~MDIO_PHY_ID_C45_MASK);

View File

@ -358,14 +358,12 @@ struct phy_c45_device_ids {
* handling, as well as handling shifts in PHY hardware state * handling, as well as handling shifts in PHY hardware state
*/ */
struct phy_device { struct phy_device {
struct mdio_device mdio;
/* Information about the PHY type */ /* Information about the PHY type */
/* And management functions */ /* And management functions */
struct phy_driver *drv; struct phy_driver *drv;
struct mii_bus *bus;
struct device dev;
u32 phy_id; u32 phy_id;
struct phy_c45_device_ids c45_ids; struct phy_c45_device_ids c45_ids;
@ -381,9 +379,6 @@ struct phy_device {
phy_interface_t interface; phy_interface_t interface;
/* Bus address of the PHY (0-31) */
int addr;
/* /*
* forced speed & duplex (no autoneg) * forced speed & duplex (no autoneg)
* partner speed & duplex & pause (autoneg) * partner speed & duplex & pause (autoneg)
@ -432,7 +427,8 @@ struct phy_device {
void (*adjust_link)(struct net_device *dev); void (*adjust_link)(struct net_device *dev);
}; };
#define to_phy_device(d) container_of(d, struct phy_device, dev) #define to_phy_device(d) container_of(to_mdio_device(d), \
struct phy_device, mdio)
/* struct phy_driver: Driver structure for a particular PHY type /* struct phy_driver: Driver structure for a particular PHY type
* *
@ -622,7 +618,7 @@ static inline int phy_read_mmd(struct phy_device *phydev, int devad, u32 regnum)
if (!phydev->is_c45) if (!phydev->is_c45)
return -EOPNOTSUPP; return -EOPNOTSUPP;
return mdiobus_read(phydev->bus, phydev->addr, return mdiobus_read(phydev->mdio.bus, phydev->mdio.addr,
MII_ADDR_C45 | (devad << 16) | (regnum & 0xffff)); MII_ADDR_C45 | (devad << 16) | (regnum & 0xffff));
} }
@ -648,7 +644,7 @@ int phy_read_mmd_indirect(struct phy_device *phydev, int prtad, int devad);
*/ */
static inline int phy_read(struct phy_device *phydev, u32 regnum) static inline int phy_read(struct phy_device *phydev, u32 regnum)
{ {
return mdiobus_read(phydev->bus, phydev->addr, regnum); return mdiobus_read(phydev->mdio.bus, phydev->mdio.addr, regnum);
} }
/** /**
@ -663,7 +659,7 @@ static inline int phy_read(struct phy_device *phydev, u32 regnum)
*/ */
static inline int phy_write(struct phy_device *phydev, u32 regnum, u16 val) static inline int phy_write(struct phy_device *phydev, u32 regnum, u16 val)
{ {
return mdiobus_write(phydev->bus, phydev->addr, regnum, val); return mdiobus_write(phydev->mdio.bus, phydev->mdio.addr, regnum, val);
} }
/** /**
@ -726,7 +722,7 @@ static inline int phy_write_mmd(struct phy_device *phydev, int devad,
regnum = MII_ADDR_C45 | ((devad & 0x1f) << 16) | (regnum & 0xffff); regnum = MII_ADDR_C45 | ((devad & 0x1f) << 16) | (regnum & 0xffff);
return mdiobus_write(phydev->bus, phydev->addr, regnum, val); return mdiobus_write(phydev->mdio.bus, phydev->mdio.addr, regnum, val);
} }
/** /**
@ -776,14 +772,14 @@ static inline int phy_read_status(struct phy_device *phydev)
} }
#define phydev_err(_phydev, format, args...) \ #define phydev_err(_phydev, format, args...) \
dev_err(&_phydev->dev, format, ##args) dev_err(&_phydev->mdio.dev, format, ##args)
#define phydev_dbg(_phydev, format, args...) \ #define phydev_dbg(_phydev, format, args...) \
dev_dbg(&_phydev->dev, format, ##args) dev_dbg(&_phydev->mdio.dev, format, ##args);
static inline const char *phydev_name(const struct phy_device *phydev) static inline const char *phydev_name(const struct phy_device *phydev)
{ {
return dev_name(&phydev->dev); return dev_name(&phydev->mdio.dev);
} }
void phy_attached_print(struct phy_device *phydev, const char *fmt, ...) void phy_attached_print(struct phy_device *phydev, const char *fmt, ...)

View File

@ -439,7 +439,7 @@ static void dsa_switch_destroy(struct dsa_switch *ds)
if (of_phy_is_fixed_link(port_dn)) { if (of_phy_is_fixed_link(port_dn)) {
phydev = of_phy_find_device(port_dn); phydev = of_phy_find_device(port_dn);
if (phydev) { if (phydev) {
int addr = phydev->addr; int addr = phydev->mdio.addr;
phy_device_free(phydev); phy_device_free(phydev);
of_node_put(port_dn); of_node_put(port_dn);