diff mbox series

[net-next,v2,6/6] smsc95xx: use PHY framework instead of MII library

Message ID 20200723115507.26194-7-andre.edich@microchip.com
State Changes Requested
Delegated to: David Miller
Headers show
Series Add PAL support to smsc95xx | expand

Commit Message

Andre Edich July 23, 2020, 11:55 a.m. UTC
Since the PHY framework is used anyway, replace the rest of the calls to
the MII library, including those from the USB Network driver
infrastructure, by the calls to the PHY framework.

Signed-off-by: Andre Edich <andre.edich@microchip.com>
---
 drivers/net/usb/smsc95xx.c | 78 +++++++++++++++-----------------------
 1 file changed, 30 insertions(+), 48 deletions(-)

Comments

kernel test robot July 25, 2020, 11:36 p.m. UTC | #1
Hi Andre,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on net-next/master]

url:    https://github.com/0day-ci/linux/commits/Andre-Edich/Add-PAL-support-to-smsc95xx/20200723-195824
base:   https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git 7fc3b978a8971305d456b32d3f2ac13191f5a0d7
config: x86_64-randconfig-a016-20200724 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-14) 9.3.0
reproduce (this is a W=1 build):
        # save the attached .config to linux build tree
        make W=1 ARCH=x86_64 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   ld: drivers/net/usb/smsc95xx.o: in function `smsc95xx_disconnect_phy':
   drivers/net/usb/smsc95xx.c:1320: undefined reference to `phy_stop'
   ld: drivers/net/usb/smsc95xx.c:1321: undefined reference to `phy_disconnect'
   ld: drivers/net/usb/smsc95xx.o: in function `smsc95xx_unbind':
   drivers/net/usb/smsc95xx.c:1284: undefined reference to `mdiobus_unregister'
   ld: drivers/net/usb/smsc95xx.c:1285: undefined reference to `mdiobus_free'
   ld: drivers/net/usb/smsc95xx.o: in function `phy_read':
   include/linux/phy.h:804: undefined reference to `mdiobus_read'
   ld: drivers/net/usb/smsc95xx.o: in function `phy_write':
   include/linux/phy.h:844: undefined reference to `mdiobus_write'
   ld: drivers/net/usb/smsc95xx.o: in function `phy_read':
   include/linux/phy.h:804: undefined reference to `mdiobus_read'
   ld: drivers/net/usb/smsc95xx.o: in function `phy_write':
   include/linux/phy.h:844: undefined reference to `mdiobus_write'
   ld: drivers/net/usb/smsc95xx.o: in function `phy_read':
   include/linux/phy.h:804: undefined reference to `mdiobus_read'
   ld: drivers/net/usb/smsc95xx.o: in function `phy_write':
   include/linux/phy.h:844: undefined reference to `mdiobus_write'
   ld: drivers/net/usb/smsc95xx.o: in function `phy_read':
   include/linux/phy.h:804: undefined reference to `mdiobus_read'
   ld: drivers/net/usb/smsc95xx.o: in function `phy_write':
   include/linux/phy.h:844: undefined reference to `mdiobus_write'
   ld: drivers/net/usb/smsc95xx.o: in function `smsc95xx_get_link_ksettings':
>> drivers/net/usb/smsc95xx.c:815: undefined reference to `phy_ethtool_get_link_ksettings'
   ld: drivers/net/usb/smsc95xx.o: in function `phy_read_status':
>> include/linux/phy.h:1402: undefined reference to `genphy_read_status'
   ld: drivers/net/usb/smsc95xx.o: in function `phy_read':
   include/linux/phy.h:804: undefined reference to `mdiobus_read'
   ld: drivers/net/usb/smsc95xx.o: in function `phy_write':
   include/linux/phy.h:844: undefined reference to `mdiobus_write'
   ld: drivers/net/usb/smsc95xx.o: in function `smsc95xx_link_reset':
>> drivers/net/usb/smsc95xx.c:582: undefined reference to `phy_ethtool_ksettings_get'
   ld: drivers/net/usb/smsc95xx.o: in function `phy_read':
   include/linux/phy.h:804: undefined reference to `mdiobus_read'
   ld: include/linux/phy.h:804: undefined reference to `mdiobus_read'
   ld: drivers/net/usb/smsc95xx.o: in function `smsc95xx_start_phy':
   drivers/net/usb/smsc95xx.c:1305: undefined reference to `phy_connect_direct'
   ld: drivers/net/usb/smsc95xx.c:1313: undefined reference to `phy_attached_info'
   ld: drivers/net/usb/smsc95xx.c:1314: undefined reference to `phy_start'
   ld: drivers/net/usb/smsc95xx.o: in function `smsc95xx_resume':
   drivers/net/usb/smsc95xx.c:1869: undefined reference to `phy_init_hw'
   ld: drivers/net/usb/smsc95xx.o: in function `smsc95xx_handle_link_change':
   drivers/net/usb/smsc95xx.c:1292: undefined reference to `phy_print_status'
   ld: drivers/net/usb/smsc95xx.o: in function `smsc95xx_set_link_ksettings':
>> drivers/net/usb/smsc95xx.c:832: undefined reference to `phy_ethtool_set_link_ksettings'
   ld: drivers/net/usb/smsc95xx.o: in function `smsc95xx_ioctl':
>> drivers/net/usb/smsc95xx.c:864: undefined reference to `phy_mii_ioctl'
>> ld: drivers/net/usb/smsc95xx.o:(.rodata+0x22e0): undefined reference to `phy_ethtool_nway_reset'
   ld: drivers/net/usb/smsc95xx.o: in function `mdiobus_alloc':
   include/linux/phy.h:318: undefined reference to `mdiobus_alloc_size'
   ld: drivers/net/usb/smsc95xx.o: in function `smsc95xx_bind':
   drivers/net/usb/smsc95xx.c:1229: undefined reference to `__mdiobus_register'
   ld: drivers/net/usb/smsc95xx.c:1235: undefined reference to `phy_find_first'
   ld: drivers/net/usb/smsc95xx.o: in function `phy_read':
   include/linux/phy.h:804: undefined reference to `mdiobus_read'
   ld: drivers/net/usb/smsc95xx.o: in function `smsc95xx_bind':
   drivers/net/usb/smsc95xx.c:1270: undefined reference to `mdiobus_unregister'
   ld: drivers/net/usb/smsc95xx.c:1273: undefined reference to `mdiobus_free'

vim +815 drivers/net/usb/smsc95xx.c

   807	
   808	static int smsc95xx_get_link_ksettings(struct net_device *net,
   809					       struct ethtool_link_ksettings *cmd)
   810	{
   811		struct usbnet *dev = netdev_priv(net);
   812		struct smsc95xx_priv *pdata = dev->driver_priv;
   813		int retval;
   814	
 > 815		retval = phy_ethtool_get_link_ksettings(net, cmd);
   816		if (pdata->internal_phy) {
   817			cmd->base.eth_tp_mdix = pdata->mdix_ctrl;
   818			cmd->base.eth_tp_mdix_ctrl = pdata->mdix_ctrl;
   819		}
   820		return retval;
   821	}
   822	
   823	static int smsc95xx_set_link_ksettings(struct net_device *net,
   824					       const struct ethtool_link_ksettings *cmd)
   825	{
   826		struct usbnet *dev = netdev_priv(net);
   827		struct smsc95xx_priv *pdata = dev->driver_priv;
   828		u8 mdix_ctrl = cmd->base.eth_tp_mdix_ctrl;
   829	
   830		if (pdata->mdix_ctrl != mdix_ctrl && pdata->internal_phy)
   831			set_mdix_status(net, mdix_ctrl);
 > 832		return phy_ethtool_set_link_ksettings(net, cmd);
   833	}
   834	
   835	static u32 smsc95xx_get_link(struct net_device *net)
   836	{
   837		phy_read_status(net->phydev);
   838		return net->phydev->link;
   839	}
   840	
   841	static const struct ethtool_ops smsc95xx_ethtool_ops = {
   842		.get_link	= smsc95xx_get_link,
   843		.nway_reset	= phy_ethtool_nway_reset,
   844		.get_drvinfo	= usbnet_get_drvinfo,
   845		.get_msglevel	= usbnet_get_msglevel,
   846		.set_msglevel	= usbnet_set_msglevel,
   847		.get_eeprom_len	= smsc95xx_ethtool_get_eeprom_len,
   848		.get_eeprom	= smsc95xx_ethtool_get_eeprom,
   849		.set_eeprom	= smsc95xx_ethtool_set_eeprom,
   850		.get_regs_len	= smsc95xx_ethtool_getregslen,
   851		.get_regs	= smsc95xx_ethtool_getregs,
   852		.get_wol	= smsc95xx_ethtool_get_wol,
   853		.set_wol	= smsc95xx_ethtool_set_wol,
   854		.get_link_ksettings	= smsc95xx_get_link_ksettings,
   855		.set_link_ksettings	= smsc95xx_set_link_ksettings,
   856		.get_ts_info	= ethtool_op_get_ts_info,
   857	};
   858	
   859	static int smsc95xx_ioctl(struct net_device *netdev, struct ifreq *rq, int cmd)
   860	{
   861		if (!netif_running(netdev))
   862			return -EINVAL;
   863	
 > 864		return phy_mii_ioctl(netdev->phydev, rq, cmd);
   865	}
   866	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff mbox series

Patch

diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c
index 8add7109e661..7de20c0aad36 100644
--- a/drivers/net/usb/smsc95xx.c
+++ b/drivers/net/usb/smsc95xx.c
@@ -174,10 +174,14 @@  static int __must_check __smsc95xx_phy_wait_not_busy(struct usbnet *dev,
 	return -EIO;
 }
 
-static int __smsc95xx_mdio_read(struct net_device *netdev, int phy_id, int idx,
+static u32 mii_address(u16 op, int phy_id, int idx)
+{
+	return (phy_id & 0x1f) << 11 | (idx & 0x1f) << 6 | op | MII_BUSY_;
+}
+
+static int __smsc95xx_mdio_read(struct usbnet *dev, int phy_id, int idx,
 				int in_pm)
 {
-	struct usbnet *dev = netdev_priv(netdev);
 	u32 val, addr;
 	int ret;
 
@@ -191,9 +195,7 @@  static int __smsc95xx_mdio_read(struct net_device *netdev, int phy_id, int idx,
 	}
 
 	/* set the address, index & direction (read from PHY) */
-	phy_id &= dev->mii.phy_id_mask;
-	idx &= dev->mii.reg_num_mask;
-	addr = (phy_id << 11) | (idx << 6) | MII_READ_ | MII_BUSY_;
+	addr = mii_address(MII_READ_, phy_id, idx);
 	ret = __smsc95xx_write_reg(dev, MII_ADDR, addr, in_pm);
 	if (ret < 0) {
 		netdev_warn(dev->net, "Error writing MII_ADDR\n");
@@ -219,10 +221,9 @@  static int __smsc95xx_mdio_read(struct net_device *netdev, int phy_id, int idx,
 	return ret;
 }
 
-static void __smsc95xx_mdio_write(struct net_device *netdev, int phy_id,
+static void __smsc95xx_mdio_write(struct usbnet *dev, int phy_id,
 				  int idx, int regval, int in_pm)
 {
-	struct usbnet *dev = netdev_priv(netdev);
 	u32 val, addr;
 	int ret;
 
@@ -243,9 +244,7 @@  static void __smsc95xx_mdio_write(struct net_device *netdev, int phy_id,
 	}
 
 	/* set the address, index & direction (write to PHY) */
-	phy_id &= dev->mii.phy_id_mask;
-	idx &= dev->mii.reg_num_mask;
-	addr = (phy_id << 11) | (idx << 6) | MII_WRITE_ | MII_BUSY_;
+	addr = mii_address(MII_WRITE_, phy_id, idx);
 	ret = __smsc95xx_write_reg(dev, MII_ADDR, addr, in_pm);
 	if (ret < 0) {
 		netdev_warn(dev->net, "Error writing MII_ADDR\n");
@@ -264,34 +263,23 @@  static void __smsc95xx_mdio_write(struct net_device *netdev, int phy_id,
 
 static int smsc95xx_mdio_read_nopm(struct usbnet *dev, int idx)
 {
-	struct mii_if_info *mii = &dev->mii;
+	struct smsc95xx_priv *pdata = dev->driver_priv;
 
-	return __smsc95xx_mdio_read(dev->net, mii->phy_id, idx, 1);
+	return __smsc95xx_mdio_read(dev, pdata->phydev->mdio.addr, idx, 1);
 }
 
 static void smsc95xx_mdio_write_nopm(struct usbnet *dev, int idx, int regval)
 {
-	struct mii_if_info *mii = &dev->mii;
-
-	__smsc95xx_mdio_write(dev->net, mii->phy_id, idx, regval, 1);
-}
-
-static int smsc95xx_mdio_read(struct net_device *netdev, int phy_id, int idx)
-{
-	return __smsc95xx_mdio_read(netdev, phy_id, idx, 0);
-}
+	struct smsc95xx_priv *pdata = dev->driver_priv;
 
-static void smsc95xx_mdio_write(struct net_device *netdev, int phy_id, int idx,
-				int regval)
-{
-	__smsc95xx_mdio_write(netdev, phy_id, idx, regval, 0);
+	__smsc95xx_mdio_write(dev, pdata->phydev->mdio.addr, idx, regval, 1);
 }
 
 static int smsc95xx_mdiobus_read(struct mii_bus *bus, int phy_id, int idx)
 {
 	struct usbnet *dev = bus->priv;
 
-	return __smsc95xx_mdio_read(dev->net, phy_id, idx, 0);
+	return __smsc95xx_mdio_read(dev, phy_id, idx, 0);
 }
 
 static int smsc95xx_mdiobus_write(struct mii_bus *bus, int phy_id, int idx,
@@ -299,7 +287,7 @@  static int smsc95xx_mdiobus_write(struct mii_bus *bus, int phy_id, int idx,
 {
 	struct usbnet *dev = bus->priv;
 
-	__smsc95xx_mdio_write(dev->net, phy_id, idx, regval, 0);
+	__smsc95xx_mdio_write(dev, phy_id, idx, regval, 0);
 	return 0;
 }
 
@@ -570,8 +558,7 @@  static int smsc95xx_phy_update_flowcontrol(struct usbnet *dev, u8 duplex,
 static int smsc95xx_link_reset(struct usbnet *dev)
 {
 	struct smsc95xx_priv *pdata = dev->driver_priv;
-	struct mii_if_info *mii = &dev->mii;
-	struct ethtool_cmd ecmd = { .cmd = ETHTOOL_GSET };
+	struct ethtool_link_ksettings cmd;
 	unsigned long flags;
 	u16 lcladv, rmtadv;
 	int ret;
@@ -592,13 +579,12 @@  static int smsc95xx_link_reset(struct usbnet *dev)
 			return ret;
 	}
 
-	mii_check_media(mii, 1, 1);
-	mii_ethtool_gset(&dev->mii, &ecmd);
+	phy_ethtool_ksettings_get(pdata->phydev, &cmd);
 	lcladv = phy_read(pdata->phydev, MII_ADVERTISE);
 	rmtadv = phy_read(pdata->phydev, MII_LPA);
 
 	spin_lock_irqsave(&pdata->mac_cr_lock, flags);
-	if (ecmd.duplex != DUPLEX_FULL) {
+	if (cmd.base.duplex != DUPLEX_FULL) {
 		pdata->mac_cr &= ~MAC_CR_FDPX_;
 		pdata->mac_cr |= MAC_CR_RCVOWN_;
 	} else {
@@ -611,7 +597,8 @@  static int smsc95xx_link_reset(struct usbnet *dev)
 	if (ret < 0)
 		return ret;
 
-	ret = smsc95xx_phy_update_flowcontrol(dev, ecmd.duplex, lcladv, rmtadv);
+	ret = smsc95xx_phy_update_flowcontrol(dev, cmd.base.duplex, lcladv,
+					      rmtadv);
 	if (ret < 0)
 		netdev_warn(dev->net, "Error updating PHY flow control\n");
 
@@ -825,7 +812,7 @@  static int smsc95xx_get_link_ksettings(struct net_device *net,
 	struct smsc95xx_priv *pdata = dev->driver_priv;
 	int retval;
 
-	retval = usbnet_get_link_ksettings(net, cmd);
+	retval = phy_ethtool_get_link_ksettings(net, cmd);
 	if (pdata->internal_phy) {
 		cmd->base.eth_tp_mdix = pdata->mdix_ctrl;
 		cmd->base.eth_tp_mdix_ctrl = pdata->mdix_ctrl;
@@ -842,13 +829,18 @@  static int smsc95xx_set_link_ksettings(struct net_device *net,
 
 	if (pdata->mdix_ctrl != mdix_ctrl && pdata->internal_phy)
 		set_mdix_status(net, mdix_ctrl);
+	return phy_ethtool_set_link_ksettings(net, cmd);
+}
 
-	return usbnet_set_link_ksettings(net, cmd);
+static u32 smsc95xx_get_link(struct net_device *net)
+{
+	phy_read_status(net->phydev);
+	return net->phydev->link;
 }
 
 static const struct ethtool_ops smsc95xx_ethtool_ops = {
-	.get_link	= usbnet_get_link,
-	.nway_reset	= usbnet_nway_reset,
+	.get_link	= smsc95xx_get_link,
+	.nway_reset	= phy_ethtool_nway_reset,
 	.get_drvinfo	= usbnet_get_drvinfo,
 	.get_msglevel	= usbnet_get_msglevel,
 	.set_msglevel	= usbnet_set_msglevel,
@@ -866,12 +858,10 @@  static const struct ethtool_ops smsc95xx_ethtool_ops = {
 
 static int smsc95xx_ioctl(struct net_device *netdev, struct ifreq *rq, int cmd)
 {
-	struct usbnet *dev = netdev_priv(netdev);
-
 	if (!netif_running(netdev))
 		return -EINVAL;
 
-	return generic_mii_ioctl(&dev->mii, if_mii(rq), cmd, NULL);
+	return phy_mii_ioctl(netdev->phydev, rq, cmd);
 }
 
 static void smsc95xx_init_mac_address(struct usbnet *dev)
@@ -1233,9 +1223,6 @@  static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf)
 	pdata->mdiobus->name = "smsc95xx-mdiobus";
 	pdata->mdiobus->parent = &dev->udev->dev;
 
-	dev->mii.phy_id_mask = 0x1f;
-	dev->mii.reg_num_mask = 0x1f;
-
 	snprintf(pdata->mdiobus->id, ARRAY_SIZE(pdata->mdiobus->id),
 		 "usb-%03d:%03d", dev->udev->bus->busnum, dev->udev->devnum);
 
@@ -1252,11 +1239,6 @@  static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf)
 		goto unregister_mdio;
 	}
 
-	dev->mii.dev = dev->net;
-	dev->mii.mdio_read = smsc95xx_mdio_read;
-	dev->mii.mdio_write = smsc95xx_mdio_write;
-	dev->mii.phy_id = pdata->phydev->mdio.addr;
-
 	/* detect device revision as different features may be available */
 	ret = smsc95xx_read_reg(dev, ID_REV, &val);
 	if (ret < 0)