Message ID | 20220317124958.27921-15-kabel@kernel.org |
---|---|
State | Superseded |
Delegated to: | Ramon Fried |
Headers | show |
Series | u-boot-net refactors, fixes, cleanups | expand |
On Thu, Mar 17, 2022 at 2:50 PM Marek Behún <kabel@kernel.org> wrote: > > From: Marek Behún <marek.behun@nic.cz> > > Currently we require PHY interface mode to be known when > finding/creating the PHY - the functions > * phy_device_create() > * create_phy_by_mask() > * search_for_existing_phy() > * get_phy_device_by_mask() > * phy_find_by_mask() (this is the only one global) > all require the interface parameter, but the only thing done with it is > that it is assigned to phydev->interface. > > This makes it impossible to find a PHY device without overwriting the > set mode. > > Since the interface mode is not used during .probe() and should be used > at first in .config(), drop the interface parameter from these > functions. Make the default value of phydev->interface (in > phy_device_create()) to be PHY_INTERFACE_MODE_NA. Move the interface > parameter to phy_connect_dev(), where it should be. > > Change all occurrences treewide. In occurrences where we don't call > phy_connect_dev() for some reason (they only configure the PHY without > connecting it to an ethernet controller), set > phydev->interface = value from phy_find_by_mask call. > > Signed-off-by: Marek Behún <marek.behun@nic.cz> > --- > board/CZ.NIC/turris_mox/turris_mox.c | 2 +- > board/boundary/nitrogen6x/nitrogen6x.c | 2 +- > board/gdsys/a38x/controlcenterdc.c | 7 ++- > board/gdsys/a38x/ihs_phys.c | 6 +- > drivers/net/altera_tse.c | 4 +- > drivers/net/ethoc.c | 4 +- > drivers/net/fec_mxc.c | 4 +- > drivers/net/pch_gbe.c | 4 +- > drivers/net/phy/phy.c | 86 +++++++++++--------------- > drivers/net/phy/xilinx_gmii2rgmii.c | 4 +- > drivers/net/ravb.c | 4 +- > drivers/net/sh_eth.c | 4 +- > drivers/net/sni_ave.c | 4 +- > drivers/net/sunxi_emac.c | 5 +- > include/_exports.h | 3 +- > include/exports.h | 3 +- > include/phy.h | 12 ++-- > 17 files changed, 72 insertions(+), 86 deletions(-) > > diff --git a/board/CZ.NIC/turris_mox/turris_mox.c b/board/CZ.NIC/turris_mox/turris_mox.c > index 8888a2dcab..9702d1fc78 100644 > --- a/board/CZ.NIC/turris_mox/turris_mox.c > +++ b/board/CZ.NIC/turris_mox/turris_mox.c > @@ -396,7 +396,7 @@ static void mox_phy_leds_start_blinking(void) > return; > } > > - phydev = phy_find_by_mask(bus, BIT(1), PHY_INTERFACE_MODE_RGMII); > + phydev = phy_find_by_mask(bus, BIT(1)); > if (!phydev) { > printf("Cannot get ethernet PHY!\n"); > return; > diff --git a/board/boundary/nitrogen6x/nitrogen6x.c b/board/boundary/nitrogen6x/nitrogen6x.c > index 84e14d1124..47784e9445 100644 > --- a/board/boundary/nitrogen6x/nitrogen6x.c > +++ b/board/boundary/nitrogen6x/nitrogen6x.c > @@ -345,7 +345,7 @@ int board_eth_init(struct bd_info *bis) > if (!bus) > return -EINVAL; > /* scan phy 4,5,6,7 */ > - phydev = phy_find_by_mask(bus, (0xf << 4), PHY_INTERFACE_MODE_RGMII); > + phydev = phy_find_by_mask(bus, (0xf << 4)); > if (!phydev) { > ret = -EINVAL; > goto free_bus; > diff --git a/board/gdsys/a38x/controlcenterdc.c b/board/gdsys/a38x/controlcenterdc.c > index 7d65400ccb..ccebba7272 100644 > --- a/board/gdsys/a38x/controlcenterdc.c > +++ b/board/gdsys/a38x/controlcenterdc.c > @@ -194,11 +194,12 @@ void init_host_phys(struct mii_dev *bus) > for (k = 0; k < 2; ++k) { > struct phy_device *phydev; > > - phydev = phy_find_by_mask(bus, 1 << k, > - PHY_INTERFACE_MODE_SGMII); > + phydev = phy_find_by_mask(bus, 1 << k); > > - if (phydev) > + if (phydev) { > + phydev->interface = PHY_INTERFACE_MODE_SGMII; > phy_config(phydev); > + } > } > } > > diff --git a/board/gdsys/a38x/ihs_phys.c b/board/gdsys/a38x/ihs_phys.c > index e09c0006b7..60a5c37aef 100644 > --- a/board/gdsys/a38x/ihs_phys.c > +++ b/board/gdsys/a38x/ihs_phys.c > @@ -28,6 +28,7 @@ static void ihs_phy_config(struct phy_device *phydev, bool qinpn, bool qoutpn) > { > u16 reg; > > + phydev->interface = PHY_INTERFACE_MODE_MII; > phy_config(phydev); > > /* enable QSGMII autonegotiation with flow control */ > @@ -142,10 +143,9 @@ struct porttype *get_porttype(uint octo_phy_mask, uint k) > int init_single_phy(struct porttype *porttype, struct mii_dev *bus, > uint bus_idx, uint m, uint phy_idx) > { > - struct phy_device *phydev = phy_find_by_mask( > - bus, 1 << (m * 8 + phy_idx), > - PHY_INTERFACE_MODE_MII); > + struct phy_device *phydev; > > + phydev = phy_find_by_mask(bus, BIT(m * 8 + phy_idx)); > printf(" %u", bus_idx * 32 + m * 8 + phy_idx); > > if (!phydev) > diff --git a/drivers/net/altera_tse.c b/drivers/net/altera_tse.c > index b1e5c5890a..912d28fca2 100644 > --- a/drivers/net/altera_tse.c > +++ b/drivers/net/altera_tse.c > @@ -435,11 +435,11 @@ static int tse_phy_init(struct altera_tse_priv *priv, void *dev) > if (priv->phyaddr) > mask = 1 << priv->phyaddr; > > - phydev = phy_find_by_mask(priv->bus, mask, priv->interface); > + phydev = phy_find_by_mask(priv->bus, mask); > if (!phydev) > return -ENODEV; > > - phy_connect_dev(phydev, dev); > + phy_connect_dev(phydev, dev, priv->interface); > > phydev->supported &= PHY_GBIT_FEATURES; > phydev->advertising = phydev->supported; > diff --git a/drivers/net/ethoc.c b/drivers/net/ethoc.c > index 7f146d4c8b..a219affb58 100644 > --- a/drivers/net/ethoc.c > +++ b/drivers/net/ethoc.c > @@ -614,11 +614,11 @@ static int ethoc_phy_init(struct ethoc *priv, void *dev) > mask = 1 << CONFIG_PHY_ADDR; > #endif > > - phydev = phy_find_by_mask(priv->bus, mask, PHY_INTERFACE_MODE_MII); > + phydev = phy_find_by_mask(priv->bus, mask); > if (!phydev) > return -ENODEV; > > - phy_connect_dev(phydev, dev); > + phy_connect_dev(phydev, dev, PHY_INTERFACE_MODE_MII); > > phydev->supported &= PHY_BASIC_FEATURES; > phydev->advertising = phydev->supported; > diff --git a/drivers/net/fec_mxc.c b/drivers/net/fec_mxc.c > index 318568f256..f781e29f42 100644 > --- a/drivers/net/fec_mxc.c > +++ b/drivers/net/fec_mxc.c > @@ -1172,7 +1172,7 @@ static int fec_probe(struct bd_info *bd, int dev_id, uint32_t base_addr, > fec_mii_setspeed(bus->priv); > #ifdef CONFIG_PHYLIB > fec->phydev = phydev; > - phy_connect_dev(phydev, edev); > + phy_connect_dev(phydev, edev, PHY_INTERFACE_MODE_RGMII); > /* Configure phy */ > phy_config(phydev); > #else > @@ -1234,7 +1234,7 @@ int fecmxc_initialize_multi(struct bd_info *bd, int dev_id, int phy_id, > if (!bus) > return -ENOMEM; > #ifdef CONFIG_PHYLIB > - phydev = phy_find_by_mask(bus, 1 << phy_id, PHY_INTERFACE_MODE_RGMII); > + phydev = phy_find_by_mask(bus, 1 << phy_id); > if (!phydev) { > mdio_unregister(bus); > free(bus); > diff --git a/drivers/net/pch_gbe.c b/drivers/net/pch_gbe.c > index fabcf85c0d..f1895246b9 100644 > --- a/drivers/net/pch_gbe.c > +++ b/drivers/net/pch_gbe.c > @@ -416,13 +416,13 @@ static int pch_gbe_phy_init(struct udevice *dev) > struct phy_device *phydev; > int mask = 0xffffffff; > > - phydev = phy_find_by_mask(priv->bus, mask, plat->phy_interface); > + phydev = phy_find_by_mask(priv->bus, mask); > if (!phydev) { > printf("pch_gbe: cannot find the phy\n"); > return -1; > } > > - phy_connect_dev(phydev, dev); > + phy_connect_dev(phydev, dev, plat->phy_interface); > > phydev->supported &= PHY_GBIT_FEATURES; > phydev->advertising = phydev->supported; > diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c > index 10c724388f..b6fcedc955 100644 > --- a/drivers/net/phy/phy.c > +++ b/drivers/net/phy/phy.c > @@ -642,8 +642,7 @@ static struct phy_driver *generic_for_phy(struct phy_device *phydev) > return &genphy_driver; > } > > -static struct phy_driver *get_phy_driver(struct phy_device *phydev, > - phy_interface_t interface) > +static struct phy_driver *get_phy_driver(struct phy_device *phydev) > { > struct list_head *entry; > int phy_id = phydev->phy_id; > @@ -660,8 +659,7 @@ static struct phy_driver *get_phy_driver(struct phy_device *phydev, > } > > static struct phy_device *phy_device_create(struct mii_dev *bus, int addr, > - u32 phy_id, bool is_c45, > - phy_interface_t interface) > + u32 phy_id, bool is_c45) > { > struct phy_device *dev; > > @@ -680,7 +678,7 @@ static struct phy_device *phy_device_create(struct mii_dev *bus, int addr, > > dev->duplex = -1; > dev->link = 0; > - dev->interface = interface; > + dev->interface = PHY_INTERFACE_MODE_NA; > > #ifdef CONFIG_DM_ETH > dev->node = ofnode_null(); > @@ -693,7 +691,7 @@ static struct phy_device *phy_device_create(struct mii_dev *bus, int addr, > dev->is_c45 = is_c45; > dev->bus = bus; > > - dev->drv = get_phy_driver(dev, interface); > + dev->drv = get_phy_driver(dev); > > if (phy_probe(dev)) { > printf("%s, PHY probe failed\n", __func__); > @@ -742,8 +740,7 @@ int __weak get_phy_id(struct mii_dev *bus, int addr, int devad, u32 *phy_id) > } > > static struct phy_device *create_phy_by_mask(struct mii_dev *bus, > - uint phy_mask, int devad, > - phy_interface_t interface) > + uint phy_mask, int devad) > { > u32 phy_id = 0xffffffff; > bool is_c45; > @@ -764,8 +761,7 @@ static struct phy_device *create_phy_by_mask(struct mii_dev *bus, > /* If the PHY ID is mostly f's, we didn't find anything */ > if (r == 0 && (phy_id & 0x1fffffff) != 0x1fffffff) { > is_c45 = (devad == MDIO_DEVAD_NONE) ? false : true; > - return phy_device_create(bus, addr, phy_id, is_c45, > - interface); > + return phy_device_create(bus, addr, phy_id, is_c45); > } > next: > phy_mask &= ~(1 << addr); > @@ -774,25 +770,22 @@ next: > } > > static struct phy_device *search_for_existing_phy(struct mii_dev *bus, > - uint phy_mask, > - phy_interface_t interface) > + uint phy_mask) > { > /* If we have one, return the existing device, with new interface */ > while (phy_mask) { > int addr = ffs(phy_mask) - 1; > > - if (bus->phymap[addr]) { > - bus->phymap[addr]->interface = interface; > + if (bus->phymap[addr]) > return bus->phymap[addr]; > - } > + > phy_mask &= ~(1 << addr); > } > return NULL; > } > > static struct phy_device *get_phy_device_by_mask(struct mii_dev *bus, > - uint phy_mask, > - phy_interface_t interface) > + uint phy_mask) > { > struct phy_device *phydev; > int devad[] = { > @@ -808,13 +801,12 @@ static struct phy_device *get_phy_device_by_mask(struct mii_dev *bus, > int i, devad_cnt; > > devad_cnt = sizeof(devad)/sizeof(int); > - phydev = search_for_existing_phy(bus, phy_mask, interface); > + phydev = search_for_existing_phy(bus, phy_mask); > if (phydev) > return phydev; > /* try different access clauses */ > for (i = 0; i < devad_cnt; i++) { > - phydev = create_phy_by_mask(bus, phy_mask, > - devad[i], interface); > + phydev = create_phy_by_mask(bus, phy_mask, devad[i]); > if (IS_ERR(phydev)) > return NULL; > if (phydev) > @@ -842,10 +834,9 @@ static struct phy_device *get_phy_device_by_mask(struct mii_dev *bus, > * Description: Reads the ID registers of the PHY at @addr on the > * @bus, then allocates and returns the phy_device to represent it. > */ > -static struct phy_device *get_phy_device(struct mii_dev *bus, int addr, > - phy_interface_t interface) > +static struct phy_device *get_phy_device(struct mii_dev *bus, int addr) > { > - return get_phy_device_by_mask(bus, 1 << addr, interface); > + return get_phy_device_by_mask(bus, 1 << addr); > } > > int phy_reset(struct phy_device *phydev) > @@ -904,18 +895,12 @@ int miiphy_reset(const char *devname, unsigned char addr) > struct mii_dev *bus = miiphy_get_dev_by_name(devname); > struct phy_device *phydev; > > - /* > - * miiphy_reset was only used on standard PHYs, so we'll fake it here. > - * If later code tries to connect with the right interface, this will > - * be corrected by get_phy_device in phy_connect() > - */ > - phydev = get_phy_device(bus, addr, PHY_INTERFACE_MODE_MII); > + phydev = get_phy_device(bus, addr); > > return phy_reset(phydev); > } > > -struct phy_device *phy_find_by_mask(struct mii_dev *bus, uint phy_mask, > - phy_interface_t interface) > +struct phy_device *phy_find_by_mask(struct mii_dev *bus, uint phy_mask) > { > /* Reset the bus */ > if (bus->reset) { > @@ -925,13 +910,15 @@ struct phy_device *phy_find_by_mask(struct mii_dev *bus, uint phy_mask, > mdelay(15); > } > > - return get_phy_device_by_mask(bus, phy_mask, interface); > + return get_phy_device_by_mask(bus, phy_mask); > } > > #ifdef CONFIG_DM_ETH > -void phy_connect_dev(struct phy_device *phydev, struct udevice *dev) > +void phy_connect_dev(struct phy_device *phydev, struct udevice *dev, > + phy_interface_t interface) > #else > -void phy_connect_dev(struct phy_device *phydev, struct eth_device *dev) > +void phy_connect_dev(struct phy_device *phydev, struct eth_device *dev, > + phy_interface_t interface) > #endif > { > /* Soft Reset the PHY */ > @@ -942,13 +929,14 @@ void phy_connect_dev(struct phy_device *phydev, struct eth_device *dev) > phydev->dev->name, dev->name); > } > phydev->dev = dev; > - debug("%s connected to %s\n", dev->name, phydev->drv->name); > + phydev->interface = interface; > + debug("%s connected to %s mode %s\n", dev->name, phydev->drv->name, > + phy_string_for_interface(interface)); > } > > #ifdef CONFIG_PHY_XILINX_GMII2RGMII > static struct phy_device *phy_connect_gmii2rgmii(struct mii_dev *bus, > - struct udevice *dev, > - phy_interface_t interface) > + struct udevice *dev) > { > struct phy_device *phydev = NULL; > ofnode node; > @@ -957,8 +945,7 @@ static struct phy_device *phy_connect_gmii2rgmii(struct mii_dev *bus, > node = ofnode_by_compatible(node, "xlnx,gmii-to-rgmii-1.0"); > if (ofnode_valid(node)) { > phydev = phy_device_create(bus, 0, > - PHY_GMII2RGMII_ID, false, > - interface); > + PHY_GMII2RGMII_ID, false); > if (phydev) > phydev->node = node; > break; > @@ -990,24 +977,23 @@ struct phy_device *fixed_phy_create(ofnode node) > return NULL; > } > > - phydev = phy_device_create(NULL, 0, PHY_FIXED_ID, false, > - ofnode_read_phy_mode(node)); > + phydev = phy_device_create(NULL, 0, PHY_FIXED_ID, false); > if (phydev) > phydev->node = subnode; > > + phydev->interface = ofnode_read_phy_mode(node); > + > return phydev; > } > > static struct phy_device *phy_connect_fixed(struct mii_dev *bus, > - struct udevice *dev, > - phy_interface_t interface) > + struct udevice *dev) > { > ofnode node = dev_ofnode(dev), subnode; > struct phy_device *phydev = NULL; > > if (ofnode_phy_is_fixed_link(node, &subnode)) { > - phydev = phy_device_create(bus, 0, PHY_FIXED_ID, > - false, interface); > + phydev = phy_device_create(bus, 0, PHY_FIXED_ID, false); > if (phydev) > phydev->node = subnode; > } > @@ -1030,24 +1016,24 @@ struct phy_device *phy_connect(struct mii_dev *bus, int addr, > uint mask = (addr >= 0) ? (1 << addr) : 0xffffffff; > > #ifdef CONFIG_PHY_FIXED > - phydev = phy_connect_fixed(bus, dev, interface); > + phydev = phy_connect_fixed(bus, dev); > #endif > > #ifdef CONFIG_PHY_NCSI > if (!phydev) > - phydev = phy_device_create(bus, 0, PHY_NCSI_ID, false, interface); > + phydev = phy_device_create(bus, 0, PHY_NCSI_ID, false); > #endif > > #ifdef CONFIG_PHY_XILINX_GMII2RGMII > if (!phydev) > - phydev = phy_connect_gmii2rgmii(bus, dev, interface); > + phydev = phy_connect_gmii2rgmii(bus, dev); > #endif > > if (!phydev) > - phydev = phy_find_by_mask(bus, mask, interface); > + phydev = phy_find_by_mask(bus, mask); > > if (phydev) > - phy_connect_dev(phydev, dev); > + phy_connect_dev(phydev, dev, interface); > else > printf("Could not get PHY for %s: addr %d\n", bus->name, addr); > return phydev; > diff --git a/drivers/net/phy/xilinx_gmii2rgmii.c b/drivers/net/phy/xilinx_gmii2rgmii.c > index d92a364365..7376283956 100644 > --- a/drivers/net/phy/xilinx_gmii2rgmii.c > +++ b/drivers/net/phy/xilinx_gmii2rgmii.c > @@ -42,13 +42,13 @@ static int xilinxgmiitorgmii_config(struct phy_device *phydev) > > ext_phyaddr = ofnode_read_u32_default(phandle.node, "reg", -1); > ext_phydev = phy_find_by_mask(phydev->bus, > - 1 << ext_phyaddr, > - PHY_INTERFACE_MODE_RGMII); > + 1 << ext_phyaddr); > if (!ext_phydev) { > printf("%s, No external phy device found\n", __func__); > return -EINVAL; > } > > + ext_phydev->interface = PHY_INTERFACE_MODE_RGMII; > ext_phydev->node = phandle.node; > phydev->priv = ext_phydev; > > diff --git a/drivers/net/ravb.c b/drivers/net/ravb.c > index 5c152d6e0a..c28680565f 100644 > --- a/drivers/net/ravb.c > +++ b/drivers/net/ravb.c > @@ -319,11 +319,11 @@ static int ravb_phy_config(struct udevice *dev) > mdelay(1); > } > > - phydev = phy_find_by_mask(eth->bus, mask, pdata->phy_interface); > + phydev = phy_find_by_mask(eth->bus, mask); > if (!phydev) > return -ENODEV; > > - phy_connect_dev(phydev, dev); > + phy_connect_dev(phydev, dev, pdata->phy_interface); > > eth->phydev = phydev; > > diff --git a/drivers/net/sh_eth.c b/drivers/net/sh_eth.c > index 5c57e3dfcd..1de3ff8add 100644 > --- a/drivers/net/sh_eth.c > +++ b/drivers/net/sh_eth.c > @@ -762,11 +762,11 @@ static int sh_eth_phy_config(struct udevice *dev) > struct phy_device *phydev; > int mask = 0xffffffff; > > - phydev = phy_find_by_mask(priv->bus, mask, pdata->phy_interface); > + phydev = phy_find_by_mask(priv->bus, mask); > if (!phydev) > return -ENODEV; > > - phy_connect_dev(phydev, dev); > + phy_connect_dev(phydev, dev, pdata->phy_interface); > > port_info->phydev = phydev; > phy_config(phydev); > diff --git a/drivers/net/sni_ave.c b/drivers/net/sni_ave.c > index d684e60e72..58276a40c7 100644 > --- a/drivers/net/sni_ave.c > +++ b/drivers/net/sni_ave.c > @@ -393,11 +393,11 @@ static int ave_phy_init(struct ave_private *priv, void *dev) > struct phy_device *phydev; > int mask = GENMASK(31, 0), ret; > > - phydev = phy_find_by_mask(priv->bus, mask, priv->phy_mode); > + phydev = phy_find_by_mask(priv->bus, mask); > if (!phydev) > return -ENODEV; > > - phy_connect_dev(phydev, dev); > + phy_connect_dev(phydev, dev, priv->phy_mode); > > phydev->supported &= PHY_GBIT_FEATURES; > if (priv->max_speed) { > diff --git a/drivers/net/sunxi_emac.c b/drivers/net/sunxi_emac.c > index 17ad88e732..4c7ef2525b 100644 > --- a/drivers/net/sunxi_emac.c > +++ b/drivers/net/sunxi_emac.c > @@ -272,12 +272,11 @@ static int sunxi_emac_init_phy(struct emac_eth_dev *priv, void *dev) > if (ret) > return ret; > > - priv->phydev = phy_find_by_mask(priv->bus, mask, > - PHY_INTERFACE_MODE_MII); > + priv->phydev = phy_find_by_mask(priv->bus, mask); > if (!priv->phydev) > return -ENODEV; > > - phy_connect_dev(priv->phydev, dev); > + phy_connect_dev(priv->phydev, dev, PHY_INTERFACE_MODE_MII); > phy_config(priv->phydev); > > return 0; > diff --git a/include/_exports.h b/include/_exports.h > index 8030d70c0b..f6df8b6107 100644 > --- a/include/_exports.h > +++ b/include/_exports.h > @@ -77,8 +77,7 @@ > EXPORT_FUNC(mdio_get_current_dev, struct mii_dev *, > mdio_get_current_dev, void) > EXPORT_FUNC(phy_find_by_mask, struct phy_device *, phy_find_by_mask, > - struct mii_dev *bus, unsigned phy_mask, > - phy_interface_t interface) > + struct mii_dev *bus, unsigned phy_mask) > EXPORT_FUNC(mdio_phydev_for_ethname, struct phy_device *, > mdio_phydev_for_ethname, const char *ethname) > EXPORT_FUNC(miiphy_set_current_dev, int, miiphy_set_current_dev, > diff --git a/include/exports.h b/include/exports.h > index 550cafdc7a..6f8c9cf451 100644 > --- a/include/exports.h > +++ b/include/exports.h > @@ -55,8 +55,7 @@ int i2c_read (uchar, uint, int , uchar* , int); > #endif > #ifdef CONFIG_PHY_AQUANTIA > struct mii_dev *mdio_get_current_dev(void); > -struct phy_device *phy_find_by_mask(struct mii_dev *bus, unsigned phy_mask, > - phy_interface_t interface); > +struct phy_device *phy_find_by_mask(struct mii_dev *bus, unsigned phy_mask); > struct phy_device *mdio_phydev_for_ethname(const char *ethname); > int miiphy_set_current_dev(const char *devname); > #endif > diff --git a/include/phy.h b/include/phy.h > index 9742ce6fe1..9473e5b694 100644 > --- a/include/phy.h > +++ b/include/phy.h > @@ -388,11 +388,9 @@ int phy_reset(struct phy_device *phydev); > * > * @bus: MII/MDIO bus to scan > * @phy_mask: bitmap of PYH addresses to scan > - * @interface: type of MAC-PHY interface > * @return: pointer to phy_device if a PHY is found, or NULL otherwise > */ > -struct phy_device *phy_find_by_mask(struct mii_dev *bus, unsigned phy_mask, > - phy_interface_t interface); > +struct phy_device *phy_find_by_mask(struct mii_dev *bus, unsigned phy_mask); > > #ifdef CONFIG_PHY_FIXED > > @@ -421,8 +419,10 @@ static inline struct phy_device *fixed_phy_create(ofnode node) > * phy_connect_dev() - Associates the given pair of PHY and Ethernet devices > * @phydev: PHY device > * @dev: Ethernet device > + * @interface: type of MAC-PHY interface > */ > -void phy_connect_dev(struct phy_device *phydev, struct udevice *dev); > +void phy_connect_dev(struct phy_device *phydev, struct udevice *dev, > + phy_interface_t interface); > > /** > * phy_connect() - Creates a PHY device for the Ethernet interface > @@ -456,8 +456,10 @@ static inline ofnode phy_get_ofnode(struct phy_device *phydev) > * phy_connect_dev() - Associates the given pair of PHY and Ethernet devices > * @phydev: PHY device > * @dev: Ethernet device > + * @interface: type of MAC-PHY interface > */ > -void phy_connect_dev(struct phy_device *phydev, struct eth_device *dev); > +void phy_connect_dev(struct phy_device *phydev, struct eth_device *dev, > + phy_interface_t interface); > > /** > * phy_connect() - Creates a PHY device for the Ethernet interface > -- > 2.34.1 > Reviewed-by: Ramon Fried <rfried.dev@gmail.com>
diff --git a/board/CZ.NIC/turris_mox/turris_mox.c b/board/CZ.NIC/turris_mox/turris_mox.c index 8888a2dcab..9702d1fc78 100644 --- a/board/CZ.NIC/turris_mox/turris_mox.c +++ b/board/CZ.NIC/turris_mox/turris_mox.c @@ -396,7 +396,7 @@ static void mox_phy_leds_start_blinking(void) return; } - phydev = phy_find_by_mask(bus, BIT(1), PHY_INTERFACE_MODE_RGMII); + phydev = phy_find_by_mask(bus, BIT(1)); if (!phydev) { printf("Cannot get ethernet PHY!\n"); return; diff --git a/board/boundary/nitrogen6x/nitrogen6x.c b/board/boundary/nitrogen6x/nitrogen6x.c index 84e14d1124..47784e9445 100644 --- a/board/boundary/nitrogen6x/nitrogen6x.c +++ b/board/boundary/nitrogen6x/nitrogen6x.c @@ -345,7 +345,7 @@ int board_eth_init(struct bd_info *bis) if (!bus) return -EINVAL; /* scan phy 4,5,6,7 */ - phydev = phy_find_by_mask(bus, (0xf << 4), PHY_INTERFACE_MODE_RGMII); + phydev = phy_find_by_mask(bus, (0xf << 4)); if (!phydev) { ret = -EINVAL; goto free_bus; diff --git a/board/gdsys/a38x/controlcenterdc.c b/board/gdsys/a38x/controlcenterdc.c index 7d65400ccb..ccebba7272 100644 --- a/board/gdsys/a38x/controlcenterdc.c +++ b/board/gdsys/a38x/controlcenterdc.c @@ -194,11 +194,12 @@ void init_host_phys(struct mii_dev *bus) for (k = 0; k < 2; ++k) { struct phy_device *phydev; - phydev = phy_find_by_mask(bus, 1 << k, - PHY_INTERFACE_MODE_SGMII); + phydev = phy_find_by_mask(bus, 1 << k); - if (phydev) + if (phydev) { + phydev->interface = PHY_INTERFACE_MODE_SGMII; phy_config(phydev); + } } } diff --git a/board/gdsys/a38x/ihs_phys.c b/board/gdsys/a38x/ihs_phys.c index e09c0006b7..60a5c37aef 100644 --- a/board/gdsys/a38x/ihs_phys.c +++ b/board/gdsys/a38x/ihs_phys.c @@ -28,6 +28,7 @@ static void ihs_phy_config(struct phy_device *phydev, bool qinpn, bool qoutpn) { u16 reg; + phydev->interface = PHY_INTERFACE_MODE_MII; phy_config(phydev); /* enable QSGMII autonegotiation with flow control */ @@ -142,10 +143,9 @@ struct porttype *get_porttype(uint octo_phy_mask, uint k) int init_single_phy(struct porttype *porttype, struct mii_dev *bus, uint bus_idx, uint m, uint phy_idx) { - struct phy_device *phydev = phy_find_by_mask( - bus, 1 << (m * 8 + phy_idx), - PHY_INTERFACE_MODE_MII); + struct phy_device *phydev; + phydev = phy_find_by_mask(bus, BIT(m * 8 + phy_idx)); printf(" %u", bus_idx * 32 + m * 8 + phy_idx); if (!phydev) diff --git a/drivers/net/altera_tse.c b/drivers/net/altera_tse.c index b1e5c5890a..912d28fca2 100644 --- a/drivers/net/altera_tse.c +++ b/drivers/net/altera_tse.c @@ -435,11 +435,11 @@ static int tse_phy_init(struct altera_tse_priv *priv, void *dev) if (priv->phyaddr) mask = 1 << priv->phyaddr; - phydev = phy_find_by_mask(priv->bus, mask, priv->interface); + phydev = phy_find_by_mask(priv->bus, mask); if (!phydev) return -ENODEV; - phy_connect_dev(phydev, dev); + phy_connect_dev(phydev, dev, priv->interface); phydev->supported &= PHY_GBIT_FEATURES; phydev->advertising = phydev->supported; diff --git a/drivers/net/ethoc.c b/drivers/net/ethoc.c index 7f146d4c8b..a219affb58 100644 --- a/drivers/net/ethoc.c +++ b/drivers/net/ethoc.c @@ -614,11 +614,11 @@ static int ethoc_phy_init(struct ethoc *priv, void *dev) mask = 1 << CONFIG_PHY_ADDR; #endif - phydev = phy_find_by_mask(priv->bus, mask, PHY_INTERFACE_MODE_MII); + phydev = phy_find_by_mask(priv->bus, mask); if (!phydev) return -ENODEV; - phy_connect_dev(phydev, dev); + phy_connect_dev(phydev, dev, PHY_INTERFACE_MODE_MII); phydev->supported &= PHY_BASIC_FEATURES; phydev->advertising = phydev->supported; diff --git a/drivers/net/fec_mxc.c b/drivers/net/fec_mxc.c index 318568f256..f781e29f42 100644 --- a/drivers/net/fec_mxc.c +++ b/drivers/net/fec_mxc.c @@ -1172,7 +1172,7 @@ static int fec_probe(struct bd_info *bd, int dev_id, uint32_t base_addr, fec_mii_setspeed(bus->priv); #ifdef CONFIG_PHYLIB fec->phydev = phydev; - phy_connect_dev(phydev, edev); + phy_connect_dev(phydev, edev, PHY_INTERFACE_MODE_RGMII); /* Configure phy */ phy_config(phydev); #else @@ -1234,7 +1234,7 @@ int fecmxc_initialize_multi(struct bd_info *bd, int dev_id, int phy_id, if (!bus) return -ENOMEM; #ifdef CONFIG_PHYLIB - phydev = phy_find_by_mask(bus, 1 << phy_id, PHY_INTERFACE_MODE_RGMII); + phydev = phy_find_by_mask(bus, 1 << phy_id); if (!phydev) { mdio_unregister(bus); free(bus); diff --git a/drivers/net/pch_gbe.c b/drivers/net/pch_gbe.c index fabcf85c0d..f1895246b9 100644 --- a/drivers/net/pch_gbe.c +++ b/drivers/net/pch_gbe.c @@ -416,13 +416,13 @@ static int pch_gbe_phy_init(struct udevice *dev) struct phy_device *phydev; int mask = 0xffffffff; - phydev = phy_find_by_mask(priv->bus, mask, plat->phy_interface); + phydev = phy_find_by_mask(priv->bus, mask); if (!phydev) { printf("pch_gbe: cannot find the phy\n"); return -1; } - phy_connect_dev(phydev, dev); + phy_connect_dev(phydev, dev, plat->phy_interface); phydev->supported &= PHY_GBIT_FEATURES; phydev->advertising = phydev->supported; diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index 10c724388f..b6fcedc955 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c @@ -642,8 +642,7 @@ static struct phy_driver *generic_for_phy(struct phy_device *phydev) return &genphy_driver; } -static struct phy_driver *get_phy_driver(struct phy_device *phydev, - phy_interface_t interface) +static struct phy_driver *get_phy_driver(struct phy_device *phydev) { struct list_head *entry; int phy_id = phydev->phy_id; @@ -660,8 +659,7 @@ static struct phy_driver *get_phy_driver(struct phy_device *phydev, } static struct phy_device *phy_device_create(struct mii_dev *bus, int addr, - u32 phy_id, bool is_c45, - phy_interface_t interface) + u32 phy_id, bool is_c45) { struct phy_device *dev; @@ -680,7 +678,7 @@ static struct phy_device *phy_device_create(struct mii_dev *bus, int addr, dev->duplex = -1; dev->link = 0; - dev->interface = interface; + dev->interface = PHY_INTERFACE_MODE_NA; #ifdef CONFIG_DM_ETH dev->node = ofnode_null(); @@ -693,7 +691,7 @@ static struct phy_device *phy_device_create(struct mii_dev *bus, int addr, dev->is_c45 = is_c45; dev->bus = bus; - dev->drv = get_phy_driver(dev, interface); + dev->drv = get_phy_driver(dev); if (phy_probe(dev)) { printf("%s, PHY probe failed\n", __func__); @@ -742,8 +740,7 @@ int __weak get_phy_id(struct mii_dev *bus, int addr, int devad, u32 *phy_id) } static struct phy_device *create_phy_by_mask(struct mii_dev *bus, - uint phy_mask, int devad, - phy_interface_t interface) + uint phy_mask, int devad) { u32 phy_id = 0xffffffff; bool is_c45; @@ -764,8 +761,7 @@ static struct phy_device *create_phy_by_mask(struct mii_dev *bus, /* If the PHY ID is mostly f's, we didn't find anything */ if (r == 0 && (phy_id & 0x1fffffff) != 0x1fffffff) { is_c45 = (devad == MDIO_DEVAD_NONE) ? false : true; - return phy_device_create(bus, addr, phy_id, is_c45, - interface); + return phy_device_create(bus, addr, phy_id, is_c45); } next: phy_mask &= ~(1 << addr); @@ -774,25 +770,22 @@ next: } static struct phy_device *search_for_existing_phy(struct mii_dev *bus, - uint phy_mask, - phy_interface_t interface) + uint phy_mask) { /* If we have one, return the existing device, with new interface */ while (phy_mask) { int addr = ffs(phy_mask) - 1; - if (bus->phymap[addr]) { - bus->phymap[addr]->interface = interface; + if (bus->phymap[addr]) return bus->phymap[addr]; - } + phy_mask &= ~(1 << addr); } return NULL; } static struct phy_device *get_phy_device_by_mask(struct mii_dev *bus, - uint phy_mask, - phy_interface_t interface) + uint phy_mask) { struct phy_device *phydev; int devad[] = { @@ -808,13 +801,12 @@ static struct phy_device *get_phy_device_by_mask(struct mii_dev *bus, int i, devad_cnt; devad_cnt = sizeof(devad)/sizeof(int); - phydev = search_for_existing_phy(bus, phy_mask, interface); + phydev = search_for_existing_phy(bus, phy_mask); if (phydev) return phydev; /* try different access clauses */ for (i = 0; i < devad_cnt; i++) { - phydev = create_phy_by_mask(bus, phy_mask, - devad[i], interface); + phydev = create_phy_by_mask(bus, phy_mask, devad[i]); if (IS_ERR(phydev)) return NULL; if (phydev) @@ -842,10 +834,9 @@ static struct phy_device *get_phy_device_by_mask(struct mii_dev *bus, * Description: Reads the ID registers of the PHY at @addr on the * @bus, then allocates and returns the phy_device to represent it. */ -static struct phy_device *get_phy_device(struct mii_dev *bus, int addr, - phy_interface_t interface) +static struct phy_device *get_phy_device(struct mii_dev *bus, int addr) { - return get_phy_device_by_mask(bus, 1 << addr, interface); + return get_phy_device_by_mask(bus, 1 << addr); } int phy_reset(struct phy_device *phydev) @@ -904,18 +895,12 @@ int miiphy_reset(const char *devname, unsigned char addr) struct mii_dev *bus = miiphy_get_dev_by_name(devname); struct phy_device *phydev; - /* - * miiphy_reset was only used on standard PHYs, so we'll fake it here. - * If later code tries to connect with the right interface, this will - * be corrected by get_phy_device in phy_connect() - */ - phydev = get_phy_device(bus, addr, PHY_INTERFACE_MODE_MII); + phydev = get_phy_device(bus, addr); return phy_reset(phydev); } -struct phy_device *phy_find_by_mask(struct mii_dev *bus, uint phy_mask, - phy_interface_t interface) +struct phy_device *phy_find_by_mask(struct mii_dev *bus, uint phy_mask) { /* Reset the bus */ if (bus->reset) { @@ -925,13 +910,15 @@ struct phy_device *phy_find_by_mask(struct mii_dev *bus, uint phy_mask, mdelay(15); } - return get_phy_device_by_mask(bus, phy_mask, interface); + return get_phy_device_by_mask(bus, phy_mask); } #ifdef CONFIG_DM_ETH -void phy_connect_dev(struct phy_device *phydev, struct udevice *dev) +void phy_connect_dev(struct phy_device *phydev, struct udevice *dev, + phy_interface_t interface) #else -void phy_connect_dev(struct phy_device *phydev, struct eth_device *dev) +void phy_connect_dev(struct phy_device *phydev, struct eth_device *dev, + phy_interface_t interface) #endif { /* Soft Reset the PHY */ @@ -942,13 +929,14 @@ void phy_connect_dev(struct phy_device *phydev, struct eth_device *dev) phydev->dev->name, dev->name); } phydev->dev = dev; - debug("%s connected to %s\n", dev->name, phydev->drv->name); + phydev->interface = interface; + debug("%s connected to %s mode %s\n", dev->name, phydev->drv->name, + phy_string_for_interface(interface)); } #ifdef CONFIG_PHY_XILINX_GMII2RGMII static struct phy_device *phy_connect_gmii2rgmii(struct mii_dev *bus, - struct udevice *dev, - phy_interface_t interface) + struct udevice *dev) { struct phy_device *phydev = NULL; ofnode node; @@ -957,8 +945,7 @@ static struct phy_device *phy_connect_gmii2rgmii(struct mii_dev *bus, node = ofnode_by_compatible(node, "xlnx,gmii-to-rgmii-1.0"); if (ofnode_valid(node)) { phydev = phy_device_create(bus, 0, - PHY_GMII2RGMII_ID, false, - interface); + PHY_GMII2RGMII_ID, false); if (phydev) phydev->node = node; break; @@ -990,24 +977,23 @@ struct phy_device *fixed_phy_create(ofnode node) return NULL; } - phydev = phy_device_create(NULL, 0, PHY_FIXED_ID, false, - ofnode_read_phy_mode(node)); + phydev = phy_device_create(NULL, 0, PHY_FIXED_ID, false); if (phydev) phydev->node = subnode; + phydev->interface = ofnode_read_phy_mode(node); + return phydev; } static struct phy_device *phy_connect_fixed(struct mii_dev *bus, - struct udevice *dev, - phy_interface_t interface) + struct udevice *dev) { ofnode node = dev_ofnode(dev), subnode; struct phy_device *phydev = NULL; if (ofnode_phy_is_fixed_link(node, &subnode)) { - phydev = phy_device_create(bus, 0, PHY_FIXED_ID, - false, interface); + phydev = phy_device_create(bus, 0, PHY_FIXED_ID, false); if (phydev) phydev->node = subnode; } @@ -1030,24 +1016,24 @@ struct phy_device *phy_connect(struct mii_dev *bus, int addr, uint mask = (addr >= 0) ? (1 << addr) : 0xffffffff; #ifdef CONFIG_PHY_FIXED - phydev = phy_connect_fixed(bus, dev, interface); + phydev = phy_connect_fixed(bus, dev); #endif #ifdef CONFIG_PHY_NCSI if (!phydev) - phydev = phy_device_create(bus, 0, PHY_NCSI_ID, false, interface); + phydev = phy_device_create(bus, 0, PHY_NCSI_ID, false); #endif #ifdef CONFIG_PHY_XILINX_GMII2RGMII if (!phydev) - phydev = phy_connect_gmii2rgmii(bus, dev, interface); + phydev = phy_connect_gmii2rgmii(bus, dev); #endif if (!phydev) - phydev = phy_find_by_mask(bus, mask, interface); + phydev = phy_find_by_mask(bus, mask); if (phydev) - phy_connect_dev(phydev, dev); + phy_connect_dev(phydev, dev, interface); else printf("Could not get PHY for %s: addr %d\n", bus->name, addr); return phydev; diff --git a/drivers/net/phy/xilinx_gmii2rgmii.c b/drivers/net/phy/xilinx_gmii2rgmii.c index d92a364365..7376283956 100644 --- a/drivers/net/phy/xilinx_gmii2rgmii.c +++ b/drivers/net/phy/xilinx_gmii2rgmii.c @@ -42,13 +42,13 @@ static int xilinxgmiitorgmii_config(struct phy_device *phydev) ext_phyaddr = ofnode_read_u32_default(phandle.node, "reg", -1); ext_phydev = phy_find_by_mask(phydev->bus, - 1 << ext_phyaddr, - PHY_INTERFACE_MODE_RGMII); + 1 << ext_phyaddr); if (!ext_phydev) { printf("%s, No external phy device found\n", __func__); return -EINVAL; } + ext_phydev->interface = PHY_INTERFACE_MODE_RGMII; ext_phydev->node = phandle.node; phydev->priv = ext_phydev; diff --git a/drivers/net/ravb.c b/drivers/net/ravb.c index 5c152d6e0a..c28680565f 100644 --- a/drivers/net/ravb.c +++ b/drivers/net/ravb.c @@ -319,11 +319,11 @@ static int ravb_phy_config(struct udevice *dev) mdelay(1); } - phydev = phy_find_by_mask(eth->bus, mask, pdata->phy_interface); + phydev = phy_find_by_mask(eth->bus, mask); if (!phydev) return -ENODEV; - phy_connect_dev(phydev, dev); + phy_connect_dev(phydev, dev, pdata->phy_interface); eth->phydev = phydev; diff --git a/drivers/net/sh_eth.c b/drivers/net/sh_eth.c index 5c57e3dfcd..1de3ff8add 100644 --- a/drivers/net/sh_eth.c +++ b/drivers/net/sh_eth.c @@ -762,11 +762,11 @@ static int sh_eth_phy_config(struct udevice *dev) struct phy_device *phydev; int mask = 0xffffffff; - phydev = phy_find_by_mask(priv->bus, mask, pdata->phy_interface); + phydev = phy_find_by_mask(priv->bus, mask); if (!phydev) return -ENODEV; - phy_connect_dev(phydev, dev); + phy_connect_dev(phydev, dev, pdata->phy_interface); port_info->phydev = phydev; phy_config(phydev); diff --git a/drivers/net/sni_ave.c b/drivers/net/sni_ave.c index d684e60e72..58276a40c7 100644 --- a/drivers/net/sni_ave.c +++ b/drivers/net/sni_ave.c @@ -393,11 +393,11 @@ static int ave_phy_init(struct ave_private *priv, void *dev) struct phy_device *phydev; int mask = GENMASK(31, 0), ret; - phydev = phy_find_by_mask(priv->bus, mask, priv->phy_mode); + phydev = phy_find_by_mask(priv->bus, mask); if (!phydev) return -ENODEV; - phy_connect_dev(phydev, dev); + phy_connect_dev(phydev, dev, priv->phy_mode); phydev->supported &= PHY_GBIT_FEATURES; if (priv->max_speed) { diff --git a/drivers/net/sunxi_emac.c b/drivers/net/sunxi_emac.c index 17ad88e732..4c7ef2525b 100644 --- a/drivers/net/sunxi_emac.c +++ b/drivers/net/sunxi_emac.c @@ -272,12 +272,11 @@ static int sunxi_emac_init_phy(struct emac_eth_dev *priv, void *dev) if (ret) return ret; - priv->phydev = phy_find_by_mask(priv->bus, mask, - PHY_INTERFACE_MODE_MII); + priv->phydev = phy_find_by_mask(priv->bus, mask); if (!priv->phydev) return -ENODEV; - phy_connect_dev(priv->phydev, dev); + phy_connect_dev(priv->phydev, dev, PHY_INTERFACE_MODE_MII); phy_config(priv->phydev); return 0; diff --git a/include/_exports.h b/include/_exports.h index 8030d70c0b..f6df8b6107 100644 --- a/include/_exports.h +++ b/include/_exports.h @@ -77,8 +77,7 @@ EXPORT_FUNC(mdio_get_current_dev, struct mii_dev *, mdio_get_current_dev, void) EXPORT_FUNC(phy_find_by_mask, struct phy_device *, phy_find_by_mask, - struct mii_dev *bus, unsigned phy_mask, - phy_interface_t interface) + struct mii_dev *bus, unsigned phy_mask) EXPORT_FUNC(mdio_phydev_for_ethname, struct phy_device *, mdio_phydev_for_ethname, const char *ethname) EXPORT_FUNC(miiphy_set_current_dev, int, miiphy_set_current_dev, diff --git a/include/exports.h b/include/exports.h index 550cafdc7a..6f8c9cf451 100644 --- a/include/exports.h +++ b/include/exports.h @@ -55,8 +55,7 @@ int i2c_read (uchar, uint, int , uchar* , int); #endif #ifdef CONFIG_PHY_AQUANTIA struct mii_dev *mdio_get_current_dev(void); -struct phy_device *phy_find_by_mask(struct mii_dev *bus, unsigned phy_mask, - phy_interface_t interface); +struct phy_device *phy_find_by_mask(struct mii_dev *bus, unsigned phy_mask); struct phy_device *mdio_phydev_for_ethname(const char *ethname); int miiphy_set_current_dev(const char *devname); #endif diff --git a/include/phy.h b/include/phy.h index 9742ce6fe1..9473e5b694 100644 --- a/include/phy.h +++ b/include/phy.h @@ -388,11 +388,9 @@ int phy_reset(struct phy_device *phydev); * * @bus: MII/MDIO bus to scan * @phy_mask: bitmap of PYH addresses to scan - * @interface: type of MAC-PHY interface * @return: pointer to phy_device if a PHY is found, or NULL otherwise */ -struct phy_device *phy_find_by_mask(struct mii_dev *bus, unsigned phy_mask, - phy_interface_t interface); +struct phy_device *phy_find_by_mask(struct mii_dev *bus, unsigned phy_mask); #ifdef CONFIG_PHY_FIXED @@ -421,8 +419,10 @@ static inline struct phy_device *fixed_phy_create(ofnode node) * phy_connect_dev() - Associates the given pair of PHY and Ethernet devices * @phydev: PHY device * @dev: Ethernet device + * @interface: type of MAC-PHY interface */ -void phy_connect_dev(struct phy_device *phydev, struct udevice *dev); +void phy_connect_dev(struct phy_device *phydev, struct udevice *dev, + phy_interface_t interface); /** * phy_connect() - Creates a PHY device for the Ethernet interface @@ -456,8 +456,10 @@ static inline ofnode phy_get_ofnode(struct phy_device *phydev) * phy_connect_dev() - Associates the given pair of PHY and Ethernet devices * @phydev: PHY device * @dev: Ethernet device + * @interface: type of MAC-PHY interface */ -void phy_connect_dev(struct phy_device *phydev, struct eth_device *dev); +void phy_connect_dev(struct phy_device *phydev, struct eth_device *dev, + phy_interface_t interface); /** * phy_connect() - Creates a PHY device for the Ethernet interface