All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH net-next v2 0/6] Add PAL support to smsc95xx
@ 2020-07-23 11:55 Andre Edich
  2020-07-23 11:55 ` [PATCH net-next v2 1/6] smsc95xx: remove redundant function arguments Andre Edich
                   ` (5 more replies)
  0 siblings, 6 replies; 18+ messages in thread
From: Andre Edich @ 2020-07-23 11:55 UTC (permalink / raw)
  To: netdev, UNGLinuxDriver, steve.glendinning
  Cc: Parthiban.Veerasooran, Andre Edich

To allow to probe external PHY drivers, this patch series adds use of
Phy Abstraction Layer to the smsc95xx driver.

Changes in v2:
- Moved 'net' patches from here to the separate patch series;
- Removed redundant call of the phy_start_aneg after phy_start;
- Removed netif_dbg tracing "speed, duplex, lcladv, and rmtadv";
- mdiobus: added dependency from the usbnet device;
- Moved making of the MII address from 'phy_id' and 'idx' into the
  function mii_address;
- Moved direct MDIO accesses under condition 'if (pdata->internal_phy)',
  as they only need for the internal PHY;
- To be sure, that this set of patches is git-bisectable, tested each
  sub-set of patches to be functional for both, internal and external
  PHYs, including suspend/resume test for the 'devices'
  (5.7.8-1-ARCH, Raspberry Pi 3 Model B).

Andre Edich (6):
  smsc95xx: remove redundant function arguments
  smsc95xx: use usbnet->driver_priv
  smsc95xx: add PAL support to use external PHY drivers
  smsc95xx: remove redundant link status checking
  smsc95xx: use PAL framework read/write functions
  smsc95xx: use PHY framework instead of MII library

 drivers/net/usb/smsc95xx.c | 413 +++++++++++++++++--------------------
 1 file changed, 194 insertions(+), 219 deletions(-)

-- 
2.27.0


^ permalink raw reply	[flat|nested] 18+ messages in thread

* [PATCH net-next v2 1/6] smsc95xx: remove redundant function arguments
  2020-07-23 11:55 [PATCH net-next v2 0/6] Add PAL support to smsc95xx Andre Edich
@ 2020-07-23 11:55 ` Andre Edich
  2020-07-23 11:55 ` [PATCH net-next v2 2/6] smsc95xx: use usbnet->driver_priv Andre Edich
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 18+ messages in thread
From: Andre Edich @ 2020-07-23 11:55 UTC (permalink / raw)
  To: netdev, UNGLinuxDriver, steve.glendinning
  Cc: Parthiban.Veerasooran, Andre Edich

This patch removes arguments netdev and phy_id from the functions
smsc95xx_mdio_read_nopm and smsc95xx_mdio_write_nopm.  Both removed
arguments are recovered from a new argument `struct usbnet *dev`.

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

diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c
index bb4ccbda031a..3fdf7c2b2d25 100644
--- a/drivers/net/usb/smsc95xx.c
+++ b/drivers/net/usb/smsc95xx.c
@@ -261,16 +261,18 @@ static void __smsc95xx_mdio_write(struct net_device *netdev, int phy_id,
 	mutex_unlock(&dev->phy_mutex);
 }
 
-static int smsc95xx_mdio_read_nopm(struct net_device *netdev, int phy_id,
-				   int idx)
+static int smsc95xx_mdio_read_nopm(struct usbnet *dev, int idx)
 {
-	return __smsc95xx_mdio_read(netdev, phy_id, idx, 1);
+	struct mii_if_info *mii = &dev->mii;
+
+	return __smsc95xx_mdio_read(dev->net, mii->phy_id, idx, 1);
 }
 
-static void smsc95xx_mdio_write_nopm(struct net_device *netdev, int phy_id,
-				     int idx, int regval)
+static void smsc95xx_mdio_write_nopm(struct usbnet *dev, int idx, int regval)
 {
-	__smsc95xx_mdio_write(netdev, phy_id, idx, regval, 1);
+	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)
@@ -1347,39 +1349,37 @@ static u32 smsc_crc(const u8 *buffer, size_t len, int filter)
 
 static int smsc95xx_enable_phy_wakeup_interrupts(struct usbnet *dev, u16 mask)
 {
-	struct mii_if_info *mii = &dev->mii;
 	int ret;
 
 	netdev_dbg(dev->net, "enabling PHY wakeup interrupts\n");
 
 	/* read to clear */
-	ret = smsc95xx_mdio_read_nopm(dev->net, mii->phy_id, PHY_INT_SRC);
+	ret = smsc95xx_mdio_read_nopm(dev, PHY_INT_SRC);
 	if (ret < 0)
 		return ret;
 
 	/* enable interrupt source */
-	ret = smsc95xx_mdio_read_nopm(dev->net, mii->phy_id, PHY_INT_MASK);
+	ret = smsc95xx_mdio_read_nopm(dev, PHY_INT_MASK);
 	if (ret < 0)
 		return ret;
 
 	ret |= mask;
 
-	smsc95xx_mdio_write_nopm(dev->net, mii->phy_id, PHY_INT_MASK, ret);
+	smsc95xx_mdio_write_nopm(dev, PHY_INT_MASK, ret);
 
 	return 0;
 }
 
 static int smsc95xx_link_ok_nopm(struct usbnet *dev)
 {
-	struct mii_if_info *mii = &dev->mii;
 	int ret;
 
 	/* first, a dummy read, needed to latch some MII phys */
-	ret = smsc95xx_mdio_read_nopm(dev->net, mii->phy_id, MII_BMSR);
+	ret = smsc95xx_mdio_read_nopm(dev, MII_BMSR);
 	if (ret < 0)
 		return ret;
 
-	ret = smsc95xx_mdio_read_nopm(dev->net, mii->phy_id, MII_BMSR);
+	ret = smsc95xx_mdio_read_nopm(dev, MII_BMSR);
 	if (ret < 0)
 		return ret;
 
@@ -1428,7 +1428,6 @@ static int smsc95xx_enter_suspend0(struct usbnet *dev)
 static int smsc95xx_enter_suspend1(struct usbnet *dev)
 {
 	struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
-	struct mii_if_info *mii = &dev->mii;
 	u32 val;
 	int ret;
 
@@ -1436,17 +1435,17 @@ static int smsc95xx_enter_suspend1(struct usbnet *dev)
 	 * compatibility with non-standard link partners
 	 */
 	if (pdata->features & FEATURE_PHY_NLP_CROSSOVER)
-		smsc95xx_mdio_write_nopm(dev->net, mii->phy_id,	PHY_EDPD_CONFIG,
-			PHY_EDPD_CONFIG_DEFAULT);
+		smsc95xx_mdio_write_nopm(dev, PHY_EDPD_CONFIG,
+					 PHY_EDPD_CONFIG_DEFAULT);
 
 	/* enable energy detect power-down mode */
-	ret = smsc95xx_mdio_read_nopm(dev->net, mii->phy_id, PHY_MODE_CTRL_STS);
+	ret = smsc95xx_mdio_read_nopm(dev, PHY_MODE_CTRL_STS);
 	if (ret < 0)
 		return ret;
 
 	ret |= MODE_CTRL_STS_EDPWRDOWN_;
 
-	smsc95xx_mdio_write_nopm(dev->net, mii->phy_id, PHY_MODE_CTRL_STS, ret);
+	smsc95xx_mdio_write_nopm(dev, PHY_MODE_CTRL_STS, ret);
 
 	/* enter SUSPEND1 mode */
 	ret = smsc95xx_read_reg_nopm(dev, PM_CTRL, &val);
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH net-next v2 2/6] smsc95xx: use usbnet->driver_priv
  2020-07-23 11:55 [PATCH net-next v2 0/6] Add PAL support to smsc95xx Andre Edich
  2020-07-23 11:55 ` [PATCH net-next v2 1/6] smsc95xx: remove redundant function arguments Andre Edich
@ 2020-07-23 11:55 ` Andre Edich
  2020-07-23 22:42   ` Andrew Lunn
  2020-07-23 11:55 ` [PATCH net-next v2 3/6] smsc95xx: add PAL support to use external PHY drivers Andre Edich
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 18+ messages in thread
From: Andre Edich @ 2020-07-23 11:55 UTC (permalink / raw)
  To: netdev, UNGLinuxDriver, steve.glendinning
  Cc: Parthiban.Veerasooran, Andre Edich

Using `void *driver_priv` instead of `unsigned long data[]` is more
straightforward way to recover the `struct smsc95xx_priv *` from the
`struct net_device *`.

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

diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c
index 3fdf7c2b2d25..f200684875fb 100644
--- a/drivers/net/usb/smsc95xx.c
+++ b/drivers/net/usb/smsc95xx.c
@@ -457,7 +457,7 @@ static unsigned int smsc95xx_hash(char addr[ETH_ALEN])
 static void smsc95xx_set_multicast(struct net_device *netdev)
 {
 	struct usbnet *dev = netdev_priv(netdev);
-	struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+	struct smsc95xx_priv *pdata = dev->driver_priv;
 	unsigned long flags;
 	int ret;
 
@@ -552,7 +552,7 @@ static int smsc95xx_phy_update_flowcontrol(struct usbnet *dev, u8 duplex,
 
 static int smsc95xx_link_reset(struct usbnet *dev)
 {
-	struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+	struct smsc95xx_priv *pdata = dev->driver_priv;
 	struct mii_if_info *mii = &dev->mii;
 	struct ethtool_cmd ecmd = { .cmd = ETHTOOL_GSET };
 	unsigned long flags;
@@ -620,7 +620,7 @@ static void smsc95xx_status(struct usbnet *dev, struct urb *urb)
 
 static void set_carrier(struct usbnet *dev, bool link)
 {
-	struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+	struct smsc95xx_priv *pdata = dev->driver_priv;
 
 	if (pdata->link_ok == link)
 		return;
@@ -749,7 +749,7 @@ static void smsc95xx_ethtool_get_wol(struct net_device *net,
 				     struct ethtool_wolinfo *wolinfo)
 {
 	struct usbnet *dev = netdev_priv(net);
-	struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+	struct smsc95xx_priv *pdata = dev->driver_priv;
 
 	wolinfo->supported = SUPPORTED_WAKE;
 	wolinfo->wolopts = pdata->wolopts;
@@ -759,7 +759,7 @@ static int smsc95xx_ethtool_set_wol(struct net_device *net,
 				    struct ethtool_wolinfo *wolinfo)
 {
 	struct usbnet *dev = netdev_priv(net);
-	struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+	struct smsc95xx_priv *pdata = dev->driver_priv;
 	int ret;
 
 	if (wolinfo->wolopts & ~SUPPORTED_WAKE)
@@ -798,7 +798,7 @@ static int get_mdix_status(struct net_device *net)
 static void set_mdix_status(struct net_device *net, __u8 mdix_ctrl)
 {
 	struct usbnet *dev = netdev_priv(net);
-	struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+	struct smsc95xx_priv *pdata = dev->driver_priv;
 	int buf;
 
 	if ((pdata->chip_id == ID_REV_CHIP_ID_9500A_) ||
@@ -847,7 +847,7 @@ static int smsc95xx_get_link_ksettings(struct net_device *net,
 				       struct ethtool_link_ksettings *cmd)
 {
 	struct usbnet *dev = netdev_priv(net);
-	struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+	struct smsc95xx_priv *pdata = dev->driver_priv;
 	int retval;
 
 	retval = usbnet_get_link_ksettings(net, cmd);
@@ -862,7 +862,7 @@ static int smsc95xx_set_link_ksettings(struct net_device *net,
 				       const struct ethtool_link_ksettings *cmd)
 {
 	struct usbnet *dev = netdev_priv(net);
-	struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+	struct smsc95xx_priv *pdata = dev->driver_priv;
 	int retval;
 
 	if (pdata->mdix_ctrl != cmd->base.eth_tp_mdix_ctrl)
@@ -944,7 +944,7 @@ static int smsc95xx_set_mac_address(struct usbnet *dev)
 /* starts the TX path */
 static int smsc95xx_start_tx_path(struct usbnet *dev)
 {
-	struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+	struct smsc95xx_priv *pdata = dev->driver_priv;
 	unsigned long flags;
 	int ret;
 
@@ -964,7 +964,7 @@ static int smsc95xx_start_tx_path(struct usbnet *dev)
 /* Starts the Receive path */
 static int smsc95xx_start_rx_path(struct usbnet *dev, int in_pm)
 {
-	struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+	struct smsc95xx_priv *pdata = dev->driver_priv;
 	unsigned long flags;
 
 	spin_lock_irqsave(&pdata->mac_cr_lock, flags);
@@ -1021,7 +1021,7 @@ static int smsc95xx_phy_initialize(struct usbnet *dev)
 
 static int smsc95xx_reset(struct usbnet *dev)
 {
-	struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+	struct smsc95xx_priv *pdata = dev->driver_priv;
 	u32 read_buf, write_buf, burst_cap;
 	int ret = 0, timeout;
 
@@ -1249,7 +1249,7 @@ static const struct net_device_ops smsc95xx_netdev_ops = {
 
 static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf)
 {
-	struct smsc95xx_priv *pdata = NULL;
+	struct smsc95xx_priv *pdata;
 	u32 val;
 	int ret;
 
@@ -1261,13 +1261,12 @@ static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf)
 		return ret;
 	}
 
-	dev->data[0] = (unsigned long)kzalloc(sizeof(struct smsc95xx_priv),
-					      GFP_KERNEL);
-
-	pdata = (struct smsc95xx_priv *)(dev->data[0]);
+	pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
 	if (!pdata)
 		return -ENOMEM;
 
+	dev->driver_priv = pdata;
+
 	spin_lock_init(&pdata->mac_cr_lock);
 
 	/* LAN95xx devices do not alter the computed checksum of 0 to 0xffff.
@@ -1330,15 +1329,11 @@ static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf)
 
 static void smsc95xx_unbind(struct usbnet *dev, struct usb_interface *intf)
 {
-	struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
-
-	if (pdata) {
-		cancel_delayed_work_sync(&pdata->carrier_check);
-		netif_dbg(dev, ifdown, dev->net, "free pdata\n");
-		kfree(pdata);
-		pdata = NULL;
-		dev->data[0] = 0;
-	}
+	struct smsc95xx_priv *pdata = dev->driver_priv;
+
+	cancel_delayed_work_sync(&pdata->carrier_check);
+	netif_dbg(dev, ifdown, dev->net, "free pdata\n");
+	kfree(pdata);
 }
 
 static u32 smsc_crc(const u8 *buffer, size_t len, int filter)
@@ -1388,7 +1383,7 @@ static int smsc95xx_link_ok_nopm(struct usbnet *dev)
 
 static int smsc95xx_enter_suspend0(struct usbnet *dev)
 {
-	struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+	struct smsc95xx_priv *pdata = dev->driver_priv;
 	u32 val;
 	int ret;
 
@@ -1427,7 +1422,7 @@ static int smsc95xx_enter_suspend0(struct usbnet *dev)
 
 static int smsc95xx_enter_suspend1(struct usbnet *dev)
 {
-	struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+	struct smsc95xx_priv *pdata = dev->driver_priv;
 	u32 val;
 	int ret;
 
@@ -1474,7 +1469,7 @@ static int smsc95xx_enter_suspend1(struct usbnet *dev)
 
 static int smsc95xx_enter_suspend2(struct usbnet *dev)
 {
-	struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+	struct smsc95xx_priv *pdata = dev->driver_priv;
 	u32 val;
 	int ret;
 
@@ -1496,7 +1491,7 @@ static int smsc95xx_enter_suspend2(struct usbnet *dev)
 
 static int smsc95xx_enter_suspend3(struct usbnet *dev)
 {
-	struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+	struct smsc95xx_priv *pdata = dev->driver_priv;
 	u32 val;
 	int ret;
 
@@ -1535,7 +1530,7 @@ static int smsc95xx_enter_suspend3(struct usbnet *dev)
 
 static int smsc95xx_autosuspend(struct usbnet *dev, u32 link_up)
 {
-	struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+	struct smsc95xx_priv *pdata = dev->driver_priv;
 	int ret;
 
 	if (!netif_running(dev->net)) {
@@ -1583,7 +1578,7 @@ static int smsc95xx_autosuspend(struct usbnet *dev, u32 link_up)
 static int smsc95xx_suspend(struct usb_interface *intf, pm_message_t message)
 {
 	struct usbnet *dev = usb_get_intfdata(intf);
-	struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+	struct smsc95xx_priv *pdata = dev->driver_priv;
 	u32 val, link_up;
 	int ret;
 
@@ -1854,7 +1849,7 @@ static int smsc95xx_resume(struct usb_interface *intf)
 	u32 val;
 
 	BUG_ON(!dev);
-	pdata = (struct smsc95xx_priv *)(dev->data[0]);
+	pdata = dev->driver_priv;
 	suspend_flags = pdata->suspend_flags;
 
 	netdev_dbg(dev->net, "resume suspend_flags=0x%02x\n", suspend_flags);
@@ -2074,7 +2069,7 @@ static struct sk_buff *smsc95xx_tx_fixup(struct usbnet *dev,
 
 static int smsc95xx_manage_power(struct usbnet *dev, int on)
 {
-	struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
+	struct smsc95xx_priv *pdata = dev->driver_priv;
 
 	dev->intf->needs_remote_wakeup = on;
 
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH net-next v2 3/6] smsc95xx: add PAL support to use external PHY drivers
  2020-07-23 11:55 [PATCH net-next v2 0/6] Add PAL support to smsc95xx Andre Edich
  2020-07-23 11:55 ` [PATCH net-next v2 1/6] smsc95xx: remove redundant function arguments Andre Edich
  2020-07-23 11:55 ` [PATCH net-next v2 2/6] smsc95xx: use usbnet->driver_priv Andre Edich
@ 2020-07-23 11:55 ` Andre Edich
  2020-07-23 22:39   ` Andrew Lunn
  2020-07-25 16:33     ` kernel test robot
  2020-07-23 11:55 ` [PATCH net-next v2 4/6] smsc95xx: remove redundant link status checking Andre Edich
                   ` (2 subsequent siblings)
  5 siblings, 2 replies; 18+ messages in thread
From: Andre Edich @ 2020-07-23 11:55 UTC (permalink / raw)
  To: netdev, UNGLinuxDriver, steve.glendinning
  Cc: Parthiban.Veerasooran, Andre Edich

Generally, each PHY has their own configuration and it can be done
through an external PHY driver.  The smsc95xx driver uses only the
hard-coded internal PHY configuration.

This patch adds PAL (PHY Abstraction Layer) support to probe external
PHY drivers for configuring external PHYs.

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

diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c
index f200684875fb..9d2710f6d396 100644
--- a/drivers/net/usb/smsc95xx.c
+++ b/drivers/net/usb/smsc95xx.c
@@ -18,6 +18,8 @@
 #include <linux/usb/usbnet.h>
 #include <linux/slab.h>
 #include <linux/of_net.h>
+#include <linux/mdio.h>
+#include <linux/phy.h>
 #include "smsc95xx.h"
 
 #define SMSC_CHIPNAME			"smsc95xx"
@@ -64,6 +66,9 @@ struct smsc95xx_priv {
 	bool link_ok;
 	struct delayed_work carrier_check;
 	struct usbnet *dev;
+	struct mii_bus *mdiobus;
+	struct phy_device *phydev;
+	bool internal_phy;
 };
 
 static bool turbo_mode = true;
@@ -286,6 +291,22 @@ static void smsc95xx_mdio_write(struct net_device *netdev, int phy_id, int idx,
 	__smsc95xx_mdio_write(netdev, phy_id, idx, regval, 0);
 }
 
+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);
+}
+
+static int smsc95xx_mdiobus_write(struct mii_bus *bus, int phy_id, int idx,
+				  u16 regval)
+{
+	struct usbnet *dev = bus->priv;
+
+	__smsc95xx_mdio_write(dev->net, phy_id, idx, regval, 0);
+	return 0;
+}
+
 static int __must_check smsc95xx_wait_eeprom(struct usbnet *dev)
 {
 	unsigned long start_time = jiffies;
@@ -559,15 +580,20 @@ static int smsc95xx_link_reset(struct usbnet *dev)
 	u16 lcladv, rmtadv;
 	int ret;
 
-	/* clear interrupt status */
-	ret = smsc95xx_mdio_read(dev->net, mii->phy_id, PHY_INT_SRC);
-	if (ret < 0)
-		return ret;
-
 	ret = smsc95xx_write_reg(dev, INT_STS, INT_STS_CLEAR_ALL_);
 	if (ret < 0)
 		return ret;
 
+	if (pdata->internal_phy) {
+		/* clear interrupt status */
+		ret = smsc95xx_mdio_read(dev->net, mii->phy_id, PHY_INT_SRC);
+		if (ret < 0)
+			return ret;
+
+		smsc95xx_mdio_write(dev->net, mii->phy_id, PHY_INT_MASK,
+				    PHY_INT_MASK_DEFAULT_);
+	}
+
 	mii_check_media(mii, 1, 1);
 	mii_ethtool_gset(&dev->mii, &ecmd);
 	lcladv = smsc95xx_mdio_read(dev->net, mii->phy_id, MII_ADVERTISE);
@@ -851,10 +877,10 @@ static int smsc95xx_get_link_ksettings(struct net_device *net,
 	int retval;
 
 	retval = usbnet_get_link_ksettings(net, cmd);
-
-	cmd->base.eth_tp_mdix = pdata->mdix_ctrl;
-	cmd->base.eth_tp_mdix_ctrl = pdata->mdix_ctrl;
-
+	if (pdata->internal_phy) {
+		cmd->base.eth_tp_mdix = pdata->mdix_ctrl;
+		cmd->base.eth_tp_mdix_ctrl = pdata->mdix_ctrl;
+	}
 	return retval;
 }
 
@@ -863,14 +889,12 @@ static int smsc95xx_set_link_ksettings(struct net_device *net,
 {
 	struct usbnet *dev = netdev_priv(net);
 	struct smsc95xx_priv *pdata = dev->driver_priv;
-	int retval;
-
-	if (pdata->mdix_ctrl != cmd->base.eth_tp_mdix_ctrl)
-		set_mdix_status(net, cmd->base.eth_tp_mdix_ctrl);
+	u8 mdix_ctrl = cmd->base.eth_tp_mdix_ctrl;
 
-	retval = usbnet_set_link_ksettings(net, cmd);
+	if (pdata->mdix_ctrl != mdix_ctrl && pdata->internal_phy)
+		set_mdix_status(net, mdix_ctrl);
 
-	return retval;
+	return usbnet_set_link_ksettings(net, cmd);
 }
 
 static const struct ethtool_ops smsc95xx_ethtool_ops = {
@@ -974,51 +998,6 @@ static int smsc95xx_start_rx_path(struct usbnet *dev, int in_pm)
 	return __smsc95xx_write_reg(dev, MAC_CR, pdata->mac_cr, in_pm);
 }
 
-static int smsc95xx_phy_initialize(struct usbnet *dev)
-{
-	int bmcr, ret, timeout = 0;
-
-	/* Initialize MII structure */
-	dev->mii.dev = dev->net;
-	dev->mii.mdio_read = smsc95xx_mdio_read;
-	dev->mii.mdio_write = smsc95xx_mdio_write;
-	dev->mii.phy_id_mask = 0x1f;
-	dev->mii.reg_num_mask = 0x1f;
-	dev->mii.phy_id = SMSC95XX_INTERNAL_PHY_ID;
-
-	/* reset phy and wait for reset to complete */
-	smsc95xx_mdio_write(dev->net, dev->mii.phy_id, MII_BMCR, BMCR_RESET);
-
-	do {
-		msleep(10);
-		bmcr = smsc95xx_mdio_read(dev->net, dev->mii.phy_id, MII_BMCR);
-		timeout++;
-	} while ((bmcr & BMCR_RESET) && (timeout < 100));
-
-	if (timeout >= 100) {
-		netdev_warn(dev->net, "timeout on PHY Reset");
-		return -EIO;
-	}
-
-	smsc95xx_mdio_write(dev->net, dev->mii.phy_id, MII_ADVERTISE,
-		ADVERTISE_ALL | ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP |
-		ADVERTISE_PAUSE_ASYM);
-
-	/* read to clear */
-	ret = smsc95xx_mdio_read(dev->net, dev->mii.phy_id, PHY_INT_SRC);
-	if (ret < 0) {
-		netdev_warn(dev->net, "Failed to read PHY_INT_SRC during init\n");
-		return ret;
-	}
-
-	smsc95xx_mdio_write(dev->net, dev->mii.phy_id, PHY_INT_MASK,
-		PHY_INT_MASK_DEFAULT_);
-	mii_nway_restart(&dev->mii);
-
-	netif_dbg(dev, ifup, dev->net, "phy initialised successfully\n");
-	return 0;
-}
-
 static int smsc95xx_reset(struct usbnet *dev)
 {
 	struct smsc95xx_priv *pdata = dev->driver_priv;
@@ -1200,12 +1179,6 @@ static int smsc95xx_reset(struct usbnet *dev)
 
 	smsc95xx_set_multicast(dev->net);
 
-	ret = smsc95xx_phy_initialize(dev);
-	if (ret < 0) {
-		netdev_warn(dev->net, "Failed to init PHY\n");
-		return ret;
-	}
-
 	ret = smsc95xx_read_reg(dev, INT_EP_CTL, &read_buf);
 	if (ret < 0)
 		return ret;
@@ -1291,14 +1264,59 @@ static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf)
 	if (ret)
 		goto free_pdata;
 
+	pdata->mdiobus = mdiobus_alloc();
+	if (!pdata->mdiobus) {
+		ret = -ENOMEM;
+		goto free_pdata;
+	}
+
+	ret = smsc95xx_read_reg(dev, HW_CFG, &val);
+	if (ret < 0)
+		goto free_mdio;
+
+	pdata->internal_phy = !(val & HW_CFG_PSEL_);
+	if (pdata->internal_phy)
+		pdata->mdiobus->phy_mask = ~(1u << SMSC95XX_INTERNAL_PHY_ID);
+
+	pdata->mdiobus->priv = dev;
+	pdata->mdiobus->read = smsc95xx_mdiobus_read;
+	pdata->mdiobus->write = smsc95xx_mdiobus_write;
+	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);
+
+	ret = mdiobus_register(pdata->mdiobus);
+	if (ret) {
+		netdev_err(dev->net, "Could not register MDIO bus\n");
+		goto free_mdio;
+	}
+
+	pdata->phydev = phy_find_first(pdata->mdiobus);
+	if (!pdata->phydev) {
+		netdev_err(dev->net, "no PHY found\n");
+		ret = -ENODEV;
+		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)
-		goto free_pdata;
+		goto unregister_mdio;
 
 	val >>= 16;
 	pdata->chip_id = val;
-	pdata->mdix_ctrl = get_mdix_status(dev->net);
+	if (pdata->internal_phy)
+		pdata->mdix_ctrl = get_mdix_status(dev->net);
 
 	if ((val == ID_REV_CHIP_ID_9500A_) || (val == ID_REV_CHIP_ID_9530_) ||
 	    (val == ID_REV_CHIP_ID_89530_) || (val == ID_REV_CHIP_ID_9730_))
@@ -1322,6 +1340,12 @@ static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf)
 
 	return 0;
 
+unregister_mdio:
+	mdiobus_unregister(pdata->mdiobus);
+
+free_mdio:
+	mdiobus_free(pdata->mdiobus);
+
 free_pdata:
 	kfree(pdata);
 	return ret;
@@ -1332,10 +1356,47 @@ static void smsc95xx_unbind(struct usbnet *dev, struct usb_interface *intf)
 	struct smsc95xx_priv *pdata = dev->driver_priv;
 
 	cancel_delayed_work_sync(&pdata->carrier_check);
+	mdiobus_unregister(pdata->mdiobus);
+	mdiobus_free(pdata->mdiobus);
 	netif_dbg(dev, ifdown, dev->net, "free pdata\n");
 	kfree(pdata);
 }
 
+static void smsc95xx_handle_link_change(struct net_device *net)
+{
+	phy_print_status(net->phydev);
+}
+
+static int smsc95xx_start_phy(struct usbnet *dev)
+{
+	struct smsc95xx_priv *pdata = dev->driver_priv;
+	struct net_device *net = dev->net;
+	int ret;
+
+	ret = smsc95xx_reset(dev);
+	if (ret < 0)
+		return ret;
+
+	ret = phy_connect_direct(net, pdata->phydev,
+				 &smsc95xx_handle_link_change,
+				 PHY_INTERFACE_MODE_MII);
+	if (ret) {
+		netdev_err(net, "can't attach PHY to %s\n", pdata->mdiobus->id);
+		return ret;
+	}
+
+	phy_attached_info(net->phydev);
+	phy_start(net->phydev);
+	return 0;
+}
+
+static int smsc95xx_disconnect_phy(struct usbnet *dev)
+{
+	phy_stop(dev->net->phydev);
+	phy_disconnect(dev->net->phydev);
+	return 0;
+}
+
 static u32 smsc_crc(const u8 *buffer, size_t len, int filter)
 {
 	u32 crc = bitrev16(crc16(0xFFFF, buffer, len));
@@ -1887,6 +1948,7 @@ static int smsc95xx_resume(struct usb_interface *intf)
 	if (ret < 0)
 		netdev_warn(dev->net, "usbnet_resume error\n");
 
+	phy_init_hw(pdata->phydev);
 	return ret;
 }
 
@@ -2092,7 +2154,8 @@ static const struct driver_info smsc95xx_info = {
 	.bind		= smsc95xx_bind,
 	.unbind		= smsc95xx_unbind,
 	.link_reset	= smsc95xx_link_reset,
-	.reset		= smsc95xx_reset,
+	.reset		= smsc95xx_start_phy,
+	.stop		= smsc95xx_disconnect_phy,
 	.rx_fixup	= smsc95xx_rx_fixup,
 	.tx_fixup	= smsc95xx_tx_fixup,
 	.status		= smsc95xx_status,
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH net-next v2 4/6] smsc95xx: remove redundant link status checking
  2020-07-23 11:55 [PATCH net-next v2 0/6] Add PAL support to smsc95xx Andre Edich
                   ` (2 preceding siblings ...)
  2020-07-23 11:55 ` [PATCH net-next v2 3/6] smsc95xx: add PAL support to use external PHY drivers Andre Edich
@ 2020-07-23 11:55 ` Andre Edich
  2020-07-23 22:41   ` Andrew Lunn
  2020-07-23 11:55 ` [PATCH net-next v2 5/6] smsc95xx: use PAL framework read/write functions Andre Edich
  2020-07-23 11:55 ` [PATCH net-next v2 6/6] smsc95xx: use PHY framework instead of MII library Andre Edich
  5 siblings, 1 reply; 18+ messages in thread
From: Andre Edich @ 2020-07-23 11:55 UTC (permalink / raw)
  To: netdev, UNGLinuxDriver, steve.glendinning
  Cc: Parthiban.Veerasooran, Andre Edich

Current driver supports PAL that does link status checking anyway.

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

diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c
index 9d2710f6d396..8731724bf2c5 100644
--- a/drivers/net/usb/smsc95xx.c
+++ b/drivers/net/usb/smsc95xx.c
@@ -51,8 +51,6 @@
 #define SUSPEND_ALLMODES		(SUSPEND_SUSPEND0 | SUSPEND_SUSPEND1 | \
 					 SUSPEND_SUSPEND2 | SUSPEND_SUSPEND3)
 
-#define CARRIER_CHECK_DELAY (2 * HZ)
-
 struct smsc95xx_priv {
 	u32 chip_id;
 	u32 mac_cr;
@@ -64,8 +62,6 @@ struct smsc95xx_priv {
 	u8 suspend_flags;
 	u8 mdix_ctrl;
 	bool link_ok;
-	struct delayed_work carrier_check;
-	struct usbnet *dev;
 	struct mii_bus *mdiobus;
 	struct phy_device *phydev;
 	bool internal_phy;
@@ -644,44 +640,6 @@ static void smsc95xx_status(struct usbnet *dev, struct urb *urb)
 			    intdata);
 }
 
-static void set_carrier(struct usbnet *dev, bool link)
-{
-	struct smsc95xx_priv *pdata = dev->driver_priv;
-
-	if (pdata->link_ok == link)
-		return;
-
-	pdata->link_ok = link;
-
-	if (link)
-		usbnet_link_change(dev, 1, 0);
-	else
-		usbnet_link_change(dev, 0, 0);
-}
-
-static void check_carrier(struct work_struct *work)
-{
-	struct smsc95xx_priv *pdata = container_of(work, struct smsc95xx_priv,
-						carrier_check.work);
-	struct usbnet *dev = pdata->dev;
-	int ret;
-
-	if (pdata->suspend_flags != 0)
-		return;
-
-	ret = smsc95xx_mdio_read(dev->net, dev->mii.phy_id, MII_BMSR);
-	if (ret < 0) {
-		netdev_warn(dev->net, "Failed to read MII_BMSR\n");
-		return;
-	}
-	if (ret & BMSR_LSTATUS)
-		set_carrier(dev, 1);
-	else
-		set_carrier(dev, 0);
-
-	schedule_delayed_work(&pdata->carrier_check, CARRIER_CHECK_DELAY);
-}
-
 /* Enable or disable Tx & Rx checksum offload engines */
 static int smsc95xx_set_features(struct net_device *netdev,
 	netdev_features_t features)
@@ -1333,11 +1291,6 @@ static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf)
 	dev->net->min_mtu = ETH_MIN_MTU;
 	dev->net->max_mtu = ETH_DATA_LEN;
 	dev->hard_mtu = dev->net->mtu + dev->net->hard_header_len;
-
-	pdata->dev = dev;
-	INIT_DELAYED_WORK(&pdata->carrier_check, check_carrier);
-	schedule_delayed_work(&pdata->carrier_check, CARRIER_CHECK_DELAY);
-
 	return 0;
 
 unregister_mdio:
@@ -1355,7 +1308,6 @@ static void smsc95xx_unbind(struct usbnet *dev, struct usb_interface *intf)
 {
 	struct smsc95xx_priv *pdata = dev->driver_priv;
 
-	cancel_delayed_work_sync(&pdata->carrier_check);
 	mdiobus_unregister(pdata->mdiobus);
 	mdiobus_free(pdata->mdiobus);
 	netif_dbg(dev, ifdown, dev->net, "free pdata\n");
@@ -1649,8 +1601,6 @@ static int smsc95xx_suspend(struct usb_interface *intf, pm_message_t message)
 		return ret;
 	}
 
-	cancel_delayed_work_sync(&pdata->carrier_check);
-
 	if (pdata->suspend_flags) {
 		netdev_warn(dev->net, "error during last resume\n");
 		pdata->suspend_flags = 0;
@@ -1894,10 +1844,6 @@ static int smsc95xx_suspend(struct usb_interface *intf, pm_message_t message)
 	if (ret && PMSG_IS_AUTO(message))
 		usbnet_resume(intf);
 
-	if (ret)
-		schedule_delayed_work(&pdata->carrier_check,
-				      CARRIER_CHECK_DELAY);
-
 	return ret;
 }
 
@@ -1917,7 +1863,6 @@ static int smsc95xx_resume(struct usb_interface *intf)
 
 	/* do this first to ensure it's cleared even in error case */
 	pdata->suspend_flags = 0;
-	schedule_delayed_work(&pdata->carrier_check, CARRIER_CHECK_DELAY);
 
 	if (suspend_flags & SUSPEND_ALLMODES) {
 		/* clear wake-up sources */
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH net-next v2 5/6] smsc95xx: use PAL framework read/write functions
  2020-07-23 11:55 [PATCH net-next v2 0/6] Add PAL support to smsc95xx Andre Edich
                   ` (3 preceding siblings ...)
  2020-07-23 11:55 ` [PATCH net-next v2 4/6] smsc95xx: remove redundant link status checking Andre Edich
@ 2020-07-23 11:55 ` Andre Edich
  2020-07-25 19:30     ` kernel test robot
  2020-07-23 11:55 ` [PATCH net-next v2 6/6] smsc95xx: use PHY framework instead of MII library Andre Edich
  5 siblings, 1 reply; 18+ messages in thread
From: Andre Edich @ 2020-07-23 11:55 UTC (permalink / raw)
  To: netdev, UNGLinuxDriver, steve.glendinning
  Cc: Parthiban.Veerasooran, Andre Edich

Use functions phy_read and phy_write instead of smsc95xx_mdio_read and
smsc95xx_mdio_write respectively.

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

diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c
index 8731724bf2c5..8add7109e661 100644
--- a/drivers/net/usb/smsc95xx.c
+++ b/drivers/net/usb/smsc95xx.c
@@ -582,22 +582,20 @@ static int smsc95xx_link_reset(struct usbnet *dev)
 
 	if (pdata->internal_phy) {
 		/* clear interrupt status */
-		ret = smsc95xx_mdio_read(dev->net, mii->phy_id, PHY_INT_SRC);
+		ret = phy_read(pdata->phydev, PHY_INT_SRC);
 		if (ret < 0)
 			return ret;
 
-		smsc95xx_mdio_write(dev->net, mii->phy_id, PHY_INT_MASK,
-				    PHY_INT_MASK_DEFAULT_);
+		ret = phy_write(pdata->phydev, PHY_INT_MASK,
+				PHY_INT_MASK_DEFAULT_);
+		if (ret < 0)
+			return ret;
 	}
 
 	mii_check_media(mii, 1, 1);
 	mii_ethtool_gset(&dev->mii, &ecmd);
-	lcladv = smsc95xx_mdio_read(dev->net, mii->phy_id, MII_ADVERTISE);
-	rmtadv = smsc95xx_mdio_read(dev->net, mii->phy_id, MII_LPA);
-
-	netif_dbg(dev, link, dev->net,
-		  "speed: %u duplex: %d lcladv: %04x rmtadv: %04x\n",
-		  ethtool_cmd_speed(&ecmd), ecmd.duplex, lcladv, rmtadv);
+	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) {
@@ -761,10 +759,11 @@ static int smsc95xx_ethtool_set_wol(struct net_device *net,
 static int get_mdix_status(struct net_device *net)
 {
 	struct usbnet *dev = netdev_priv(net);
+	struct smsc95xx_priv *pdata = dev->driver_priv;
 	u32 val;
 	int buf;
 
-	buf = smsc95xx_mdio_read(dev->net, dev->mii.phy_id, SPECIAL_CTRL_STS);
+	buf = phy_read(pdata->phydev, SPECIAL_CTRL_STS);
 	if (buf & SPECIAL_CTRL_STS_OVRRD_AMDIX_) {
 		if (buf & SPECIAL_CTRL_STS_AMDIX_ENABLE_)
 			return ETH_TP_MDI_AUTO;
@@ -790,39 +789,31 @@ static void set_mdix_status(struct net_device *net, __u8 mdix_ctrl)
 	    (pdata->chip_id == ID_REV_CHIP_ID_89530_) ||
 	    (pdata->chip_id == ID_REV_CHIP_ID_9730_)) {
 		/* Extend Manual AutoMDIX timer for 9500A/9500Ai */
-		buf = smsc95xx_mdio_read(dev->net, dev->mii.phy_id,
-					 PHY_EDPD_CONFIG);
+		buf = phy_read(pdata->phydev, PHY_EDPD_CONFIG);
 		buf |= PHY_EDPD_CONFIG_EXT_CROSSOVER_;
-		smsc95xx_mdio_write(dev->net, dev->mii.phy_id,
-				    PHY_EDPD_CONFIG, buf);
+		phy_write(pdata->phydev, PHY_EDPD_CONFIG, buf);
 	}
 
 	if (mdix_ctrl == ETH_TP_MDI) {
-		buf = smsc95xx_mdio_read(dev->net, dev->mii.phy_id,
-					 SPECIAL_CTRL_STS);
+		buf = phy_read(pdata->phydev, SPECIAL_CTRL_STS);
 		buf |= SPECIAL_CTRL_STS_OVRRD_AMDIX_;
 		buf &= ~(SPECIAL_CTRL_STS_AMDIX_ENABLE_ |
 			 SPECIAL_CTRL_STS_AMDIX_STATE_);
-		smsc95xx_mdio_write(dev->net, dev->mii.phy_id,
-				    SPECIAL_CTRL_STS, buf);
+		phy_write(pdata->phydev, SPECIAL_CTRL_STS, buf);
 	} else if (mdix_ctrl == ETH_TP_MDI_X) {
-		buf = smsc95xx_mdio_read(dev->net, dev->mii.phy_id,
-					 SPECIAL_CTRL_STS);
+		buf = phy_read(pdata->phydev, SPECIAL_CTRL_STS);
 		buf |= SPECIAL_CTRL_STS_OVRRD_AMDIX_;
 		buf &= ~(SPECIAL_CTRL_STS_AMDIX_ENABLE_ |
 			 SPECIAL_CTRL_STS_AMDIX_STATE_);
 		buf |= SPECIAL_CTRL_STS_AMDIX_STATE_;
-		smsc95xx_mdio_write(dev->net, dev->mii.phy_id,
-				    SPECIAL_CTRL_STS, buf);
+		phy_write(pdata->phydev, SPECIAL_CTRL_STS, buf);
 	} else if (mdix_ctrl == ETH_TP_MDI_AUTO) {
-		buf = smsc95xx_mdio_read(dev->net, dev->mii.phy_id,
-					 SPECIAL_CTRL_STS);
+		buf = phy_read(pdata->phydev, SPECIAL_CTRL_STS);
 		buf &= ~SPECIAL_CTRL_STS_OVRRD_AMDIX_;
 		buf &= ~(SPECIAL_CTRL_STS_AMDIX_ENABLE_ |
 			 SPECIAL_CTRL_STS_AMDIX_STATE_);
 		buf |= SPECIAL_CTRL_STS_AMDIX_ENABLE_;
-		smsc95xx_mdio_write(dev->net, dev->mii.phy_id,
-				    SPECIAL_CTRL_STS, buf);
+		phy_write(pdata->phydev, SPECIAL_CTRL_STS, buf);
 	}
 	pdata->mdix_ctrl = mdix_ctrl;
 }
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH net-next v2 6/6] smsc95xx: use PHY framework instead of MII library
  2020-07-23 11:55 [PATCH net-next v2 0/6] Add PAL support to smsc95xx Andre Edich
                   ` (4 preceding siblings ...)
  2020-07-23 11:55 ` [PATCH net-next v2 5/6] smsc95xx: use PAL framework read/write functions Andre Edich
@ 2020-07-23 11:55 ` Andre Edich
  2020-07-25 23:36     ` kernel test robot
  5 siblings, 1 reply; 18+ messages in thread
From: Andre Edich @ 2020-07-23 11:55 UTC (permalink / raw)
  To: netdev, UNGLinuxDriver, steve.glendinning
  Cc: Parthiban.Veerasooran, Andre Edich

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(-)

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)
-- 
2.27.0


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* Re: [PATCH net-next v2 3/6] smsc95xx: add PAL support to use external PHY drivers
  2020-07-23 11:55 ` [PATCH net-next v2 3/6] smsc95xx: add PAL support to use external PHY drivers Andre Edich
@ 2020-07-23 22:39   ` Andrew Lunn
  2020-07-24 15:17     ` Andre.Edich
  2020-07-25 16:33     ` kernel test robot
  1 sibling, 1 reply; 18+ messages in thread
From: Andrew Lunn @ 2020-07-23 22:39 UTC (permalink / raw)
  To: Andre Edich
  Cc: netdev, UNGLinuxDriver, steve.glendinning, Parthiban.Veerasooran

On Thu, Jul 23, 2020 at 01:55:04PM +0200, Andre Edich wrote:
> Generally, each PHY has their own configuration and it can be done
> through an external PHY driver.  The smsc95xx driver uses only the
> hard-coded internal PHY configuration.
> 
> This patch adds PAL (PHY Abstraction Layer) support to probe external
> PHY drivers for configuring external PHYs.

Hi Andre

We call it phylib, not PAL.

>  static int __must_check smsc95xx_wait_eeprom(struct usbnet *dev)
>  {
>  	unsigned long start_time = jiffies;
> @@ -559,15 +580,20 @@ static int smsc95xx_link_reset(struct usbnet *dev)
>  	u16 lcladv, rmtadv;
>  	int ret;
>  
> -	/* clear interrupt status */
> -	ret = smsc95xx_mdio_read(dev->net, mii->phy_id, PHY_INT_SRC);
> -	if (ret < 0)
> -		return ret;
> -
>  	ret = smsc95xx_write_reg(dev, INT_STS, INT_STS_CLEAR_ALL_);
>  	if (ret < 0)
>  		return ret;
>  
> +	if (pdata->internal_phy) {
> +		/* clear interrupt status */
> +		ret = smsc95xx_mdio_read(dev->net, mii->phy_id, PHY_INT_SRC);
> +		if (ret < 0)
> +			return ret;
> +
> +		smsc95xx_mdio_write(dev->net, mii->phy_id, PHY_INT_MASK,
> +				    PHY_INT_MASK_DEFAULT_);
> +	}

The PHY driver should do this, not the MAC driver.

Which PHY driver is used for the internal PHY? In theory, you should
not need to know if it is internal or external, it is just a PHY. That
might mean you need to move some code from this driver into the PHY
driver, if it is currently missing in the PHY driver.

> +
>  	mii_check_media(mii, 1, 1);
>  	mii_ethtool_gset(&dev->mii, &ecmd);
>  	lcladv = smsc95xx_mdio_read(dev->net, mii->phy_id, MII_ADVERTISE);
> @@ -851,10 +877,10 @@ static int smsc95xx_get_link_ksettings(struct net_device *net,
>  	int retval;
>  
>  	retval = usbnet_get_link_ksettings(net, cmd);
> -
> -	cmd->base.eth_tp_mdix = pdata->mdix_ctrl;
> -	cmd->base.eth_tp_mdix_ctrl = pdata->mdix_ctrl;
> -
> +	if (pdata->internal_phy) {
> +		cmd->base.eth_tp_mdix = pdata->mdix_ctrl;
> +		cmd->base.eth_tp_mdix_ctrl = pdata->mdix_ctrl;
> +	}

Again, they PHY driver should take care of this. You need to set
phydev->mdix_ctrl before starting the PHY. The PHY driver should set
phdev->mdix to the current status. 

> +static void smsc95xx_handle_link_change(struct net_device *net)
> +{
> +	phy_print_status(net->phydev);

So the MAC does not care about the speed? The pause configuration?
Duplex?

	Andrew

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH net-next v2 4/6] smsc95xx: remove redundant link status checking
  2020-07-23 11:55 ` [PATCH net-next v2 4/6] smsc95xx: remove redundant link status checking Andre Edich
@ 2020-07-23 22:41   ` Andrew Lunn
  0 siblings, 0 replies; 18+ messages in thread
From: Andrew Lunn @ 2020-07-23 22:41 UTC (permalink / raw)
  To: Andre Edich
  Cc: netdev, UNGLinuxDriver, steve.glendinning, Parthiban.Veerasooran

On Thu, Jul 23, 2020 at 01:55:05PM +0200, Andre Edich wrote:
> Current driver supports PAL that does link status checking anyway.
> 
> Signed-off-by: Andre Edich <andre.edich@microchip.com>

Reviewed-by: Andrew Lunn <andrew@lunn.ch>

    Andrew

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH net-next v2 2/6] smsc95xx: use usbnet->driver_priv
  2020-07-23 11:55 ` [PATCH net-next v2 2/6] smsc95xx: use usbnet->driver_priv Andre Edich
@ 2020-07-23 22:42   ` Andrew Lunn
  0 siblings, 0 replies; 18+ messages in thread
From: Andrew Lunn @ 2020-07-23 22:42 UTC (permalink / raw)
  To: Andre Edich
  Cc: netdev, UNGLinuxDriver, steve.glendinning, Parthiban.Veerasooran

On Thu, Jul 23, 2020 at 01:55:03PM +0200, Andre Edich wrote:
> Using `void *driver_priv` instead of `unsigned long data[]` is more
> straightforward way to recover the `struct smsc95xx_priv *` from the
> `struct net_device *`.
> 
> Signed-off-by: Andre Edich <andre.edich@microchip.com>

Reviewed-by: Andrew Lunn <andrew@lunn.ch>

    Andrew

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH net-next v2 3/6] smsc95xx: add PAL support to use external PHY drivers
  2020-07-23 22:39   ` Andrew Lunn
@ 2020-07-24 15:17     ` Andre.Edich
  2020-07-24 15:34       ` Andrew Lunn
  0 siblings, 1 reply; 18+ messages in thread
From: Andre.Edich @ 2020-07-24 15:17 UTC (permalink / raw)
  To: andrew; +Cc: Parthiban.Veerasooran, netdev, UNGLinuxDriver, steve.glendinning

On Fri, 2020-07-24 at 00:39 +0200, Andrew Lunn wrote:
> EXTERNAL EMAIL: Do not click links or open attachments unless you
> know the content is safe
> 
> On Thu, Jul 23, 2020 at 01:55:04PM +0200, Andre Edich wrote:
> > Generally, each PHY has their own configuration and it can be done
> > through an external PHY driver.  The smsc95xx driver uses only the
> > hard-coded internal PHY configuration.
> > 
> > This patch adds PAL (PHY Abstraction Layer) support to probe
> > external
> > PHY drivers for configuring external PHYs.
> 
> Hi Andre
> 
> We call it phylib, not PAL.

Hi Andrew,

thank you for the feedback. In the next version, I will correct these
wordings as well.

> 
> >  static int __must_check smsc95xx_wait_eeprom(struct usbnet *dev)
> >  {
> >       unsigned long start_time = jiffies;
> > @@ -559,15 +580,20 @@ static int smsc95xx_link_reset(struct usbnet
> > *dev)
> >       u16 lcladv, rmtadv;
> >       int ret;
> > 
> > -     /* clear interrupt status */
> > -     ret = smsc95xx_mdio_read(dev->net, mii->phy_id, PHY_INT_SRC);
> > -     if (ret < 0)
> > -             return ret;
> > -
> >       ret = smsc95xx_write_reg(dev, INT_STS, INT_STS_CLEAR_ALL_);
> >       if (ret < 0)
> >               return ret;
> > 
> > +     if (pdata->internal_phy) {
> > +             /* clear interrupt status */
> > +             ret = smsc95xx_mdio_read(dev->net, mii->phy_id,
> > PHY_INT_SRC);
> > +             if (ret < 0)
> > +                     return ret;
> > +
> > +             smsc95xx_mdio_write(dev->net, mii->phy_id,
> > PHY_INT_MASK,
> > +                                 PHY_INT_MASK_DEFAULT_);
> > +     }
> 
> The PHY driver should do this, not the MAC driver.
> 
> Which PHY driver is used for the internal PHY? In theory, you should
> not need to know if it is internal or external, it is just a PHY. 

Yes sure, you are right.  I see the drivers/net/phy/smsc.c that is
probed for the internal PHY of the DUT's Ethernet controller.

> 
> That
> might mean you need to move some code from this driver into the PHY
> driver, if it is currently missing in the PHY driver.

Correct, the PHY driver does interrupt setup activities, so that they
can be removed from the smsc95xx.
 
> 
> > +
> >       mii_check_media(mii, 1, 1);
> >       mii_ethtool_gset(&dev->mii, &ecmd);
> >       lcladv = smsc95xx_mdio_read(dev->net, mii->phy_id,
> > MII_ADVERTISE);
> > @@ -851,10 +877,10 @@ static int smsc95xx_get_link_ksettings(struct
> > net_device *net,
> >       int retval;
> > 
> >       retval = usbnet_get_link_ksettings(net, cmd);
> > -
> > -     cmd->base.eth_tp_mdix = pdata->mdix_ctrl;
> > -     cmd->base.eth_tp_mdix_ctrl = pdata->mdix_ctrl;
> > -
> > +     if (pdata->internal_phy) {
> > +             cmd->base.eth_tp_mdix = pdata->mdix_ctrl;
> > +             cmd->base.eth_tp_mdix_ctrl = pdata->mdix_ctrl;
> > +     }
> 
> Again, they PHY driver should take care of this. You need to set
> phydev->mdix_ctrl before starting the PHY. The PHY driver should set
> phdev->mdix to the current status.

The SMSC Phy driver does not have any MDIX setup code, but I think I've
got the idea now.

> 
> > +static void smsc95xx_handle_link_change(struct net_device *net)
> > +{
> > +     phy_print_status(net->phydev);
> 
> So the MAC does not care about the speed? The pause configuration?
> Duplex?

Now, I'm wondering how those "care about speed", "pause", and "duplex"
work in the current smsc95xx.  I guess, we did not touch any of those
activities with our patches.

Thanks a lot.
Andre

> 
>         Andrew

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH net-next v2 3/6] smsc95xx: add PAL support to use external PHY drivers
  2020-07-24 15:17     ` Andre.Edich
@ 2020-07-24 15:34       ` Andrew Lunn
  0 siblings, 0 replies; 18+ messages in thread
From: Andrew Lunn @ 2020-07-24 15:34 UTC (permalink / raw)
  To: Andre.Edich
  Cc: Parthiban.Veerasooran, netdev, UNGLinuxDriver, steve.glendinning

> > > +static void smsc95xx_handle_link_change(struct net_device *net)
> > > +{
> > > +     phy_print_status(net->phydev);
> > 
> > So the MAC does not care about the speed? The pause configuration?
> > Duplex?
> 
> Now, I'm wondering how those "care about speed", "pause", and "duplex"
> work in the current smsc95xx.  I guess, we did not touch any of those
> activities with our patches.

Yes, this patchset itself is not necessarily wrong. It seems more like
the driver could be broken with respect to these things. It is
something you might want to put on your TODO list to look at later.

	  Andrew

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH net-next v2 3/6] smsc95xx: add PAL support to use external PHY drivers
  2020-07-23 11:55 ` [PATCH net-next v2 3/6] smsc95xx: add PAL support to use external PHY drivers Andre Edich
@ 2020-07-25 16:33     ` kernel test robot
  2020-07-25 16:33     ` kernel test robot
  1 sibling, 0 replies; 18+ messages in thread
From: kernel test robot @ 2020-07-25 16:33 UTC (permalink / raw)
  To: Andre Edich, netdev, UNGLinuxDriver, steve.glendinning
  Cc: kbuild-all, Parthiban.Veerasooran, Andre Edich

[-- Attachment #1: Type: text/plain, Size: 8305 bytes --]

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:1395: undefined reference to `phy_stop'
>> ld: drivers/net/usb/smsc95xx.c:1396: undefined reference to `phy_disconnect'
   ld: drivers/net/usb/smsc95xx.o: in function `smsc95xx_unbind':
>> drivers/net/usb/smsc95xx.c:1359: undefined reference to `mdiobus_unregister'
>> ld: drivers/net/usb/smsc95xx.c:1360: undefined reference to `mdiobus_free'
   ld: drivers/net/usb/smsc95xx.o: in function `smsc95xx_start_phy':
>> drivers/net/usb/smsc95xx.c:1380: undefined reference to `phy_connect_direct'
>> ld: drivers/net/usb/smsc95xx.c:1388: undefined reference to `phy_attached_info'
>> ld: drivers/net/usb/smsc95xx.c:1389: undefined reference to `phy_start'
   ld: drivers/net/usb/smsc95xx.o: in function `smsc95xx_resume':
>> drivers/net/usb/smsc95xx.c:1951: undefined reference to `phy_init_hw'
   ld: drivers/net/usb/smsc95xx.o: in function `smsc95xx_handle_link_change':
>> drivers/net/usb/smsc95xx.c:1367: undefined reference to `phy_print_status'
   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:1293: undefined reference to `__mdiobus_register'
>> ld: drivers/net/usb/smsc95xx.c:1299: undefined reference to `phy_find_first'
   ld: drivers/net/usb/smsc95xx.c:1344: undefined reference to `mdiobus_unregister'
   ld: drivers/net/usb/smsc95xx.c:1347: undefined reference to `mdiobus_free'

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

  1222	
  1223	static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf)
  1224	{
  1225		struct smsc95xx_priv *pdata;
  1226		u32 val;
  1227		int ret;
  1228	
  1229		printk(KERN_INFO SMSC_CHIPNAME " v" SMSC_DRIVER_VERSION "\n");
  1230	
  1231		ret = usbnet_get_endpoints(dev, intf);
  1232		if (ret < 0) {
  1233			netdev_warn(dev->net, "usbnet_get_endpoints failed: %d\n", ret);
  1234			return ret;
  1235		}
  1236	
  1237		pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
  1238		if (!pdata)
  1239			return -ENOMEM;
  1240	
  1241		dev->driver_priv = pdata;
  1242	
  1243		spin_lock_init(&pdata->mac_cr_lock);
  1244	
  1245		/* LAN95xx devices do not alter the computed checksum of 0 to 0xffff.
  1246		 * RFC 2460, ipv6 UDP calculated checksum yields a result of zero must
  1247		 * be changed to 0xffff. RFC 768, ipv4 UDP computed checksum is zero,
  1248		 * it is transmitted as all ones. The zero transmitted checksum means
  1249		 * transmitter generated no checksum. Hence, enable csum offload only
  1250		 * for ipv4 packets.
  1251		 */
  1252		if (DEFAULT_TX_CSUM_ENABLE)
  1253			dev->net->features |= NETIF_F_IP_CSUM;
  1254		if (DEFAULT_RX_CSUM_ENABLE)
  1255			dev->net->features |= NETIF_F_RXCSUM;
  1256	
  1257		dev->net->hw_features = NETIF_F_IP_CSUM | NETIF_F_RXCSUM;
  1258		set_bit(EVENT_NO_IP_ALIGN, &dev->flags);
  1259	
  1260		smsc95xx_init_mac_address(dev);
  1261	
  1262		/* Init all registers */
  1263		ret = smsc95xx_reset(dev);
  1264		if (ret)
  1265			goto free_pdata;
  1266	
  1267		pdata->mdiobus = mdiobus_alloc();
  1268		if (!pdata->mdiobus) {
  1269			ret = -ENOMEM;
  1270			goto free_pdata;
  1271		}
  1272	
  1273		ret = smsc95xx_read_reg(dev, HW_CFG, &val);
  1274		if (ret < 0)
  1275			goto free_mdio;
  1276	
  1277		pdata->internal_phy = !(val & HW_CFG_PSEL_);
  1278		if (pdata->internal_phy)
  1279			pdata->mdiobus->phy_mask = ~(1u << SMSC95XX_INTERNAL_PHY_ID);
  1280	
  1281		pdata->mdiobus->priv = dev;
  1282		pdata->mdiobus->read = smsc95xx_mdiobus_read;
  1283		pdata->mdiobus->write = smsc95xx_mdiobus_write;
  1284		pdata->mdiobus->name = "smsc95xx-mdiobus";
  1285		pdata->mdiobus->parent = &dev->udev->dev;
  1286	
  1287		dev->mii.phy_id_mask = 0x1f;
  1288		dev->mii.reg_num_mask = 0x1f;
  1289	
  1290		snprintf(pdata->mdiobus->id, ARRAY_SIZE(pdata->mdiobus->id),
  1291			 "usb-%03d:%03d", dev->udev->bus->busnum, dev->udev->devnum);
  1292	
> 1293		ret = mdiobus_register(pdata->mdiobus);
  1294		if (ret) {
  1295			netdev_err(dev->net, "Could not register MDIO bus\n");
  1296			goto free_mdio;
  1297		}
  1298	
> 1299		pdata->phydev = phy_find_first(pdata->mdiobus);
  1300		if (!pdata->phydev) {
  1301			netdev_err(dev->net, "no PHY found\n");
  1302			ret = -ENODEV;
  1303			goto unregister_mdio;
  1304		}
  1305	
  1306		dev->mii.dev = dev->net;
  1307		dev->mii.mdio_read = smsc95xx_mdio_read;
  1308		dev->mii.mdio_write = smsc95xx_mdio_write;
  1309		dev->mii.phy_id = pdata->phydev->mdio.addr;
  1310	
  1311		/* detect device revision as different features may be available */
  1312		ret = smsc95xx_read_reg(dev, ID_REV, &val);
  1313		if (ret < 0)
  1314			goto unregister_mdio;
  1315	
  1316		val >>= 16;
  1317		pdata->chip_id = val;
  1318		if (pdata->internal_phy)
  1319			pdata->mdix_ctrl = get_mdix_status(dev->net);
  1320	
  1321		if ((val == ID_REV_CHIP_ID_9500A_) || (val == ID_REV_CHIP_ID_9530_) ||
  1322		    (val == ID_REV_CHIP_ID_89530_) || (val == ID_REV_CHIP_ID_9730_))
  1323			pdata->features = (FEATURE_8_WAKEUP_FILTERS |
  1324				FEATURE_PHY_NLP_CROSSOVER |
  1325				FEATURE_REMOTE_WAKEUP);
  1326		else if (val == ID_REV_CHIP_ID_9512_)
  1327			pdata->features = FEATURE_8_WAKEUP_FILTERS;
  1328	
  1329		dev->net->netdev_ops = &smsc95xx_netdev_ops;
  1330		dev->net->ethtool_ops = &smsc95xx_ethtool_ops;
  1331		dev->net->flags |= IFF_MULTICAST;
  1332		dev->net->hard_header_len += SMSC95XX_TX_OVERHEAD_CSUM;
  1333		dev->net->min_mtu = ETH_MIN_MTU;
  1334		dev->net->max_mtu = ETH_DATA_LEN;
  1335		dev->hard_mtu = dev->net->mtu + dev->net->hard_header_len;
  1336	
  1337		pdata->dev = dev;
  1338		INIT_DELAYED_WORK(&pdata->carrier_check, check_carrier);
  1339		schedule_delayed_work(&pdata->carrier_check, CARRIER_CHECK_DELAY);
  1340	
  1341		return 0;
  1342	
  1343	unregister_mdio:
  1344		mdiobus_unregister(pdata->mdiobus);
  1345	
  1346	free_mdio:
  1347		mdiobus_free(pdata->mdiobus);
  1348	
  1349	free_pdata:
  1350		kfree(pdata);
  1351		return ret;
  1352	}
  1353	
  1354	static void smsc95xx_unbind(struct usbnet *dev, struct usb_interface *intf)
  1355	{
  1356		struct smsc95xx_priv *pdata = dev->driver_priv;
  1357	
  1358		cancel_delayed_work_sync(&pdata->carrier_check);
> 1359		mdiobus_unregister(pdata->mdiobus);
> 1360		mdiobus_free(pdata->mdiobus);
  1361		netif_dbg(dev, ifdown, dev->net, "free pdata\n");
  1362		kfree(pdata);
  1363	}
  1364	
  1365	static void smsc95xx_handle_link_change(struct net_device *net)
  1366	{
> 1367		phy_print_status(net->phydev);
  1368	}
  1369	
  1370	static int smsc95xx_start_phy(struct usbnet *dev)
  1371	{
  1372		struct smsc95xx_priv *pdata = dev->driver_priv;
  1373		struct net_device *net = dev->net;
  1374		int ret;
  1375	
  1376		ret = smsc95xx_reset(dev);
  1377		if (ret < 0)
  1378			return ret;
  1379	
> 1380		ret = phy_connect_direct(net, pdata->phydev,
  1381					 &smsc95xx_handle_link_change,
  1382					 PHY_INTERFACE_MODE_MII);
  1383		if (ret) {
  1384			netdev_err(net, "can't attach PHY to %s\n", pdata->mdiobus->id);
  1385			return ret;
  1386		}
  1387	
> 1388		phy_attached_info(net->phydev);
> 1389		phy_start(net->phydev);
  1390		return 0;
  1391	}
  1392	
  1393	static int smsc95xx_disconnect_phy(struct usbnet *dev)
  1394	{
> 1395		phy_stop(dev->net->phydev);
> 1396		phy_disconnect(dev->net->phydev);
  1397		return 0;
  1398	}
  1399	

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

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 38364 bytes --]

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH net-next v2 3/6] smsc95xx: add PAL support to use external PHY drivers
@ 2020-07-25 16:33     ` kernel test robot
  0 siblings, 0 replies; 18+ messages in thread
From: kernel test robot @ 2020-07-25 16:33 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 8532 bytes --]

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:1395: undefined reference to `phy_stop'
>> ld: drivers/net/usb/smsc95xx.c:1396: undefined reference to `phy_disconnect'
   ld: drivers/net/usb/smsc95xx.o: in function `smsc95xx_unbind':
>> drivers/net/usb/smsc95xx.c:1359: undefined reference to `mdiobus_unregister'
>> ld: drivers/net/usb/smsc95xx.c:1360: undefined reference to `mdiobus_free'
   ld: drivers/net/usb/smsc95xx.o: in function `smsc95xx_start_phy':
>> drivers/net/usb/smsc95xx.c:1380: undefined reference to `phy_connect_direct'
>> ld: drivers/net/usb/smsc95xx.c:1388: undefined reference to `phy_attached_info'
>> ld: drivers/net/usb/smsc95xx.c:1389: undefined reference to `phy_start'
   ld: drivers/net/usb/smsc95xx.o: in function `smsc95xx_resume':
>> drivers/net/usb/smsc95xx.c:1951: undefined reference to `phy_init_hw'
   ld: drivers/net/usb/smsc95xx.o: in function `smsc95xx_handle_link_change':
>> drivers/net/usb/smsc95xx.c:1367: undefined reference to `phy_print_status'
   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:1293: undefined reference to `__mdiobus_register'
>> ld: drivers/net/usb/smsc95xx.c:1299: undefined reference to `phy_find_first'
   ld: drivers/net/usb/smsc95xx.c:1344: undefined reference to `mdiobus_unregister'
   ld: drivers/net/usb/smsc95xx.c:1347: undefined reference to `mdiobus_free'

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

  1222	
  1223	static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf)
  1224	{
  1225		struct smsc95xx_priv *pdata;
  1226		u32 val;
  1227		int ret;
  1228	
  1229		printk(KERN_INFO SMSC_CHIPNAME " v" SMSC_DRIVER_VERSION "\n");
  1230	
  1231		ret = usbnet_get_endpoints(dev, intf);
  1232		if (ret < 0) {
  1233			netdev_warn(dev->net, "usbnet_get_endpoints failed: %d\n", ret);
  1234			return ret;
  1235		}
  1236	
  1237		pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
  1238		if (!pdata)
  1239			return -ENOMEM;
  1240	
  1241		dev->driver_priv = pdata;
  1242	
  1243		spin_lock_init(&pdata->mac_cr_lock);
  1244	
  1245		/* LAN95xx devices do not alter the computed checksum of 0 to 0xffff.
  1246		 * RFC 2460, ipv6 UDP calculated checksum yields a result of zero must
  1247		 * be changed to 0xffff. RFC 768, ipv4 UDP computed checksum is zero,
  1248		 * it is transmitted as all ones. The zero transmitted checksum means
  1249		 * transmitter generated no checksum. Hence, enable csum offload only
  1250		 * for ipv4 packets.
  1251		 */
  1252		if (DEFAULT_TX_CSUM_ENABLE)
  1253			dev->net->features |= NETIF_F_IP_CSUM;
  1254		if (DEFAULT_RX_CSUM_ENABLE)
  1255			dev->net->features |= NETIF_F_RXCSUM;
  1256	
  1257		dev->net->hw_features = NETIF_F_IP_CSUM | NETIF_F_RXCSUM;
  1258		set_bit(EVENT_NO_IP_ALIGN, &dev->flags);
  1259	
  1260		smsc95xx_init_mac_address(dev);
  1261	
  1262		/* Init all registers */
  1263		ret = smsc95xx_reset(dev);
  1264		if (ret)
  1265			goto free_pdata;
  1266	
  1267		pdata->mdiobus = mdiobus_alloc();
  1268		if (!pdata->mdiobus) {
  1269			ret = -ENOMEM;
  1270			goto free_pdata;
  1271		}
  1272	
  1273		ret = smsc95xx_read_reg(dev, HW_CFG, &val);
  1274		if (ret < 0)
  1275			goto free_mdio;
  1276	
  1277		pdata->internal_phy = !(val & HW_CFG_PSEL_);
  1278		if (pdata->internal_phy)
  1279			pdata->mdiobus->phy_mask = ~(1u << SMSC95XX_INTERNAL_PHY_ID);
  1280	
  1281		pdata->mdiobus->priv = dev;
  1282		pdata->mdiobus->read = smsc95xx_mdiobus_read;
  1283		pdata->mdiobus->write = smsc95xx_mdiobus_write;
  1284		pdata->mdiobus->name = "smsc95xx-mdiobus";
  1285		pdata->mdiobus->parent = &dev->udev->dev;
  1286	
  1287		dev->mii.phy_id_mask = 0x1f;
  1288		dev->mii.reg_num_mask = 0x1f;
  1289	
  1290		snprintf(pdata->mdiobus->id, ARRAY_SIZE(pdata->mdiobus->id),
  1291			 "usb-%03d:%03d", dev->udev->bus->busnum, dev->udev->devnum);
  1292	
> 1293		ret = mdiobus_register(pdata->mdiobus);
  1294		if (ret) {
  1295			netdev_err(dev->net, "Could not register MDIO bus\n");
  1296			goto free_mdio;
  1297		}
  1298	
> 1299		pdata->phydev = phy_find_first(pdata->mdiobus);
  1300		if (!pdata->phydev) {
  1301			netdev_err(dev->net, "no PHY found\n");
  1302			ret = -ENODEV;
  1303			goto unregister_mdio;
  1304		}
  1305	
  1306		dev->mii.dev = dev->net;
  1307		dev->mii.mdio_read = smsc95xx_mdio_read;
  1308		dev->mii.mdio_write = smsc95xx_mdio_write;
  1309		dev->mii.phy_id = pdata->phydev->mdio.addr;
  1310	
  1311		/* detect device revision as different features may be available */
  1312		ret = smsc95xx_read_reg(dev, ID_REV, &val);
  1313		if (ret < 0)
  1314			goto unregister_mdio;
  1315	
  1316		val >>= 16;
  1317		pdata->chip_id = val;
  1318		if (pdata->internal_phy)
  1319			pdata->mdix_ctrl = get_mdix_status(dev->net);
  1320	
  1321		if ((val == ID_REV_CHIP_ID_9500A_) || (val == ID_REV_CHIP_ID_9530_) ||
  1322		    (val == ID_REV_CHIP_ID_89530_) || (val == ID_REV_CHIP_ID_9730_))
  1323			pdata->features = (FEATURE_8_WAKEUP_FILTERS |
  1324				FEATURE_PHY_NLP_CROSSOVER |
  1325				FEATURE_REMOTE_WAKEUP);
  1326		else if (val == ID_REV_CHIP_ID_9512_)
  1327			pdata->features = FEATURE_8_WAKEUP_FILTERS;
  1328	
  1329		dev->net->netdev_ops = &smsc95xx_netdev_ops;
  1330		dev->net->ethtool_ops = &smsc95xx_ethtool_ops;
  1331		dev->net->flags |= IFF_MULTICAST;
  1332		dev->net->hard_header_len += SMSC95XX_TX_OVERHEAD_CSUM;
  1333		dev->net->min_mtu = ETH_MIN_MTU;
  1334		dev->net->max_mtu = ETH_DATA_LEN;
  1335		dev->hard_mtu = dev->net->mtu + dev->net->hard_header_len;
  1336	
  1337		pdata->dev = dev;
  1338		INIT_DELAYED_WORK(&pdata->carrier_check, check_carrier);
  1339		schedule_delayed_work(&pdata->carrier_check, CARRIER_CHECK_DELAY);
  1340	
  1341		return 0;
  1342	
  1343	unregister_mdio:
  1344		mdiobus_unregister(pdata->mdiobus);
  1345	
  1346	free_mdio:
  1347		mdiobus_free(pdata->mdiobus);
  1348	
  1349	free_pdata:
  1350		kfree(pdata);
  1351		return ret;
  1352	}
  1353	
  1354	static void smsc95xx_unbind(struct usbnet *dev, struct usb_interface *intf)
  1355	{
  1356		struct smsc95xx_priv *pdata = dev->driver_priv;
  1357	
  1358		cancel_delayed_work_sync(&pdata->carrier_check);
> 1359		mdiobus_unregister(pdata->mdiobus);
> 1360		mdiobus_free(pdata->mdiobus);
  1361		netif_dbg(dev, ifdown, dev->net, "free pdata\n");
  1362		kfree(pdata);
  1363	}
  1364	
  1365	static void smsc95xx_handle_link_change(struct net_device *net)
  1366	{
> 1367		phy_print_status(net->phydev);
  1368	}
  1369	
  1370	static int smsc95xx_start_phy(struct usbnet *dev)
  1371	{
  1372		struct smsc95xx_priv *pdata = dev->driver_priv;
  1373		struct net_device *net = dev->net;
  1374		int ret;
  1375	
  1376		ret = smsc95xx_reset(dev);
  1377		if (ret < 0)
  1378			return ret;
  1379	
> 1380		ret = phy_connect_direct(net, pdata->phydev,
  1381					 &smsc95xx_handle_link_change,
  1382					 PHY_INTERFACE_MODE_MII);
  1383		if (ret) {
  1384			netdev_err(net, "can't attach PHY to %s\n", pdata->mdiobus->id);
  1385			return ret;
  1386		}
  1387	
> 1388		phy_attached_info(net->phydev);
> 1389		phy_start(net->phydev);
  1390		return 0;
  1391	}
  1392	
  1393	static int smsc95xx_disconnect_phy(struct usbnet *dev)
  1394	{
> 1395		phy_stop(dev->net->phydev);
> 1396		phy_disconnect(dev->net->phydev);
  1397		return 0;
  1398	}
  1399	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 38364 bytes --]

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH net-next v2 5/6] smsc95xx: use PAL framework read/write functions
  2020-07-23 11:55 ` [PATCH net-next v2 5/6] smsc95xx: use PAL framework read/write functions Andre Edich
@ 2020-07-25 19:30     ` kernel test robot
  0 siblings, 0 replies; 18+ messages in thread
From: kernel test robot @ 2020-07-25 19:30 UTC (permalink / raw)
  To: Andre Edich, netdev, UNGLinuxDriver, steve.glendinning
  Cc: kbuild-all, Parthiban.Veerasooran, Andre Edich

[-- Attachment #1: Type: text/plain, Size: 8435 bytes --]

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:1338: undefined reference to `phy_stop'
   ld: drivers/net/usb/smsc95xx.c:1339: undefined reference to `phy_disconnect'
   ld: drivers/net/usb/smsc95xx.o: in function `smsc95xx_unbind':
   drivers/net/usb/smsc95xx.c:1302: undefined reference to `mdiobus_unregister'
   ld: drivers/net/usb/smsc95xx.c:1303: 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 `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: 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:1323: undefined reference to `phy_connect_direct'
   ld: drivers/net/usb/smsc95xx.c:1331: undefined reference to `phy_attached_info'
   ld: drivers/net/usb/smsc95xx.c:1332: undefined reference to `phy_start'
   ld: drivers/net/usb/smsc95xx.o: in function `smsc95xx_resume':
   drivers/net/usb/smsc95xx.c:1887: undefined reference to `phy_init_hw'
   ld: drivers/net/usb/smsc95xx.o: in function `smsc95xx_handle_link_change':
   drivers/net/usb/smsc95xx.c:1310: undefined reference to `phy_print_status'
   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:1242: undefined reference to `__mdiobus_register'
   ld: drivers/net/usb/smsc95xx.c:1248: 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:1288: undefined reference to `mdiobus_unregister'
   ld: drivers/net/usb/smsc95xx.c:1291: undefined reference to `mdiobus_free'

vim +804 include/linux/phy.h

8c5e850c0ce597 Russell King      2017-12-29  792  
2e888103295f47 Lennert Buytenhek 2008-09-29  793  /**
2e888103295f47 Lennert Buytenhek 2008-09-29  794   * phy_read - Convenience function for reading a given PHY register
2e888103295f47 Lennert Buytenhek 2008-09-29  795   * @phydev: the phy_device struct
2e888103295f47 Lennert Buytenhek 2008-09-29  796   * @regnum: register number to read
2e888103295f47 Lennert Buytenhek 2008-09-29  797   *
2e888103295f47 Lennert Buytenhek 2008-09-29  798   * NOTE: MUST NOT be called from interrupt context,
2e888103295f47 Lennert Buytenhek 2008-09-29  799   * because the bus read/write functions may wait for an interrupt
2e888103295f47 Lennert Buytenhek 2008-09-29  800   * to conclude the operation.
2e888103295f47 Lennert Buytenhek 2008-09-29  801   */
abf35df21513c5 Jason Gunthorpe   2010-03-09  802  static inline int phy_read(struct phy_device *phydev, u32 regnum)
2e888103295f47 Lennert Buytenhek 2008-09-29  803  {
e5a03bfd873c29 Andrew Lunn       2016-01-06 @804  	return mdiobus_read(phydev->mdio.bus, phydev->mdio.addr, regnum);
2e888103295f47 Lennert Buytenhek 2008-09-29  805  }
2e888103295f47 Lennert Buytenhek 2008-09-29  806  
fcbd30d09ba053 Dejin Zheng       2020-03-23  807  #define phy_read_poll_timeout(phydev, regnum, val, cond, sleep_us, \
fcbd30d09ba053 Dejin Zheng       2020-03-23  808  				timeout_us, sleep_before_read) \
fcbd30d09ba053 Dejin Zheng       2020-03-23  809  ({ \
fcbd30d09ba053 Dejin Zheng       2020-03-23  810  	int __ret = read_poll_timeout(phy_read, val, (cond) || val < 0, \
fcbd30d09ba053 Dejin Zheng       2020-03-23  811  		sleep_us, timeout_us, sleep_before_read, phydev, regnum); \
fcbd30d09ba053 Dejin Zheng       2020-03-23  812  	if (val <  0) \
fcbd30d09ba053 Dejin Zheng       2020-03-23  813  		__ret = val; \
fcbd30d09ba053 Dejin Zheng       2020-03-23  814  	if (__ret) \
fcbd30d09ba053 Dejin Zheng       2020-03-23  815  		phydev_err(phydev, "%s failed: %d\n", __func__, __ret); \
fcbd30d09ba053 Dejin Zheng       2020-03-23  816  	__ret; \
fcbd30d09ba053 Dejin Zheng       2020-03-23  817  })
fcbd30d09ba053 Dejin Zheng       2020-03-23  818  
fcbd30d09ba053 Dejin Zheng       2020-03-23  819  
788f9933db6172 Russell King      2018-01-02  820  /**
788f9933db6172 Russell King      2018-01-02  821   * __phy_read - convenience function for reading a given PHY register
788f9933db6172 Russell King      2018-01-02  822   * @phydev: the phy_device struct
788f9933db6172 Russell King      2018-01-02  823   * @regnum: register number to read
788f9933db6172 Russell King      2018-01-02  824   *
788f9933db6172 Russell King      2018-01-02  825   * The caller must have taken the MDIO bus lock.
788f9933db6172 Russell King      2018-01-02  826   */
788f9933db6172 Russell King      2018-01-02  827  static inline int __phy_read(struct phy_device *phydev, u32 regnum)
788f9933db6172 Russell King      2018-01-02  828  {
788f9933db6172 Russell King      2018-01-02  829  	return __mdiobus_read(phydev->mdio.bus, phydev->mdio.addr, regnum);
788f9933db6172 Russell King      2018-01-02  830  }
788f9933db6172 Russell King      2018-01-02  831  
2e888103295f47 Lennert Buytenhek 2008-09-29  832  /**
2e888103295f47 Lennert Buytenhek 2008-09-29  833   * phy_write - Convenience function for writing a given PHY register
2e888103295f47 Lennert Buytenhek 2008-09-29  834   * @phydev: the phy_device struct
2e888103295f47 Lennert Buytenhek 2008-09-29  835   * @regnum: register number to write
2e888103295f47 Lennert Buytenhek 2008-09-29  836   * @val: value to write to @regnum
2e888103295f47 Lennert Buytenhek 2008-09-29  837   *
2e888103295f47 Lennert Buytenhek 2008-09-29  838   * NOTE: MUST NOT be called from interrupt context,
2e888103295f47 Lennert Buytenhek 2008-09-29  839   * because the bus read/write functions may wait for an interrupt
2e888103295f47 Lennert Buytenhek 2008-09-29  840   * to conclude the operation.
2e888103295f47 Lennert Buytenhek 2008-09-29  841   */
abf35df21513c5 Jason Gunthorpe   2010-03-09  842  static inline int phy_write(struct phy_device *phydev, u32 regnum, u16 val)
2e888103295f47 Lennert Buytenhek 2008-09-29  843  {
e5a03bfd873c29 Andrew Lunn       2016-01-06 @844  	return mdiobus_write(phydev->mdio.bus, phydev->mdio.addr, regnum, val);
2e888103295f47 Lennert Buytenhek 2008-09-29  845  }
2e888103295f47 Lennert Buytenhek 2008-09-29  846  

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

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 38364 bytes --]

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH net-next v2 5/6] smsc95xx: use PAL framework read/write functions
@ 2020-07-25 19:30     ` kernel test robot
  0 siblings, 0 replies; 18+ messages in thread
From: kernel test robot @ 2020-07-25 19:30 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 8565 bytes --]

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:1338: undefined reference to `phy_stop'
   ld: drivers/net/usb/smsc95xx.c:1339: undefined reference to `phy_disconnect'
   ld: drivers/net/usb/smsc95xx.o: in function `smsc95xx_unbind':
   drivers/net/usb/smsc95xx.c:1302: undefined reference to `mdiobus_unregister'
   ld: drivers/net/usb/smsc95xx.c:1303: 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 `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: 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:1323: undefined reference to `phy_connect_direct'
   ld: drivers/net/usb/smsc95xx.c:1331: undefined reference to `phy_attached_info'
   ld: drivers/net/usb/smsc95xx.c:1332: undefined reference to `phy_start'
   ld: drivers/net/usb/smsc95xx.o: in function `smsc95xx_resume':
   drivers/net/usb/smsc95xx.c:1887: undefined reference to `phy_init_hw'
   ld: drivers/net/usb/smsc95xx.o: in function `smsc95xx_handle_link_change':
   drivers/net/usb/smsc95xx.c:1310: undefined reference to `phy_print_status'
   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:1242: undefined reference to `__mdiobus_register'
   ld: drivers/net/usb/smsc95xx.c:1248: 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:1288: undefined reference to `mdiobus_unregister'
   ld: drivers/net/usb/smsc95xx.c:1291: undefined reference to `mdiobus_free'

vim +804 include/linux/phy.h

8c5e850c0ce597 Russell King      2017-12-29  792  
2e888103295f47 Lennert Buytenhek 2008-09-29  793  /**
2e888103295f47 Lennert Buytenhek 2008-09-29  794   * phy_read - Convenience function for reading a given PHY register
2e888103295f47 Lennert Buytenhek 2008-09-29  795   * @phydev: the phy_device struct
2e888103295f47 Lennert Buytenhek 2008-09-29  796   * @regnum: register number to read
2e888103295f47 Lennert Buytenhek 2008-09-29  797   *
2e888103295f47 Lennert Buytenhek 2008-09-29  798   * NOTE: MUST NOT be called from interrupt context,
2e888103295f47 Lennert Buytenhek 2008-09-29  799   * because the bus read/write functions may wait for an interrupt
2e888103295f47 Lennert Buytenhek 2008-09-29  800   * to conclude the operation.
2e888103295f47 Lennert Buytenhek 2008-09-29  801   */
abf35df21513c5 Jason Gunthorpe   2010-03-09  802  static inline int phy_read(struct phy_device *phydev, u32 regnum)
2e888103295f47 Lennert Buytenhek 2008-09-29  803  {
e5a03bfd873c29 Andrew Lunn       2016-01-06 @804  	return mdiobus_read(phydev->mdio.bus, phydev->mdio.addr, regnum);
2e888103295f47 Lennert Buytenhek 2008-09-29  805  }
2e888103295f47 Lennert Buytenhek 2008-09-29  806  
fcbd30d09ba053 Dejin Zheng       2020-03-23  807  #define phy_read_poll_timeout(phydev, regnum, val, cond, sleep_us, \
fcbd30d09ba053 Dejin Zheng       2020-03-23  808  				timeout_us, sleep_before_read) \
fcbd30d09ba053 Dejin Zheng       2020-03-23  809  ({ \
fcbd30d09ba053 Dejin Zheng       2020-03-23  810  	int __ret = read_poll_timeout(phy_read, val, (cond) || val < 0, \
fcbd30d09ba053 Dejin Zheng       2020-03-23  811  		sleep_us, timeout_us, sleep_before_read, phydev, regnum); \
fcbd30d09ba053 Dejin Zheng       2020-03-23  812  	if (val <  0) \
fcbd30d09ba053 Dejin Zheng       2020-03-23  813  		__ret = val; \
fcbd30d09ba053 Dejin Zheng       2020-03-23  814  	if (__ret) \
fcbd30d09ba053 Dejin Zheng       2020-03-23  815  		phydev_err(phydev, "%s failed: %d\n", __func__, __ret); \
fcbd30d09ba053 Dejin Zheng       2020-03-23  816  	__ret; \
fcbd30d09ba053 Dejin Zheng       2020-03-23  817  })
fcbd30d09ba053 Dejin Zheng       2020-03-23  818  
fcbd30d09ba053 Dejin Zheng       2020-03-23  819  
788f9933db6172 Russell King      2018-01-02  820  /**
788f9933db6172 Russell King      2018-01-02  821   * __phy_read - convenience function for reading a given PHY register
788f9933db6172 Russell King      2018-01-02  822   * @phydev: the phy_device struct
788f9933db6172 Russell King      2018-01-02  823   * @regnum: register number to read
788f9933db6172 Russell King      2018-01-02  824   *
788f9933db6172 Russell King      2018-01-02  825   * The caller must have taken the MDIO bus lock.
788f9933db6172 Russell King      2018-01-02  826   */
788f9933db6172 Russell King      2018-01-02  827  static inline int __phy_read(struct phy_device *phydev, u32 regnum)
788f9933db6172 Russell King      2018-01-02  828  {
788f9933db6172 Russell King      2018-01-02  829  	return __mdiobus_read(phydev->mdio.bus, phydev->mdio.addr, regnum);
788f9933db6172 Russell King      2018-01-02  830  }
788f9933db6172 Russell King      2018-01-02  831  
2e888103295f47 Lennert Buytenhek 2008-09-29  832  /**
2e888103295f47 Lennert Buytenhek 2008-09-29  833   * phy_write - Convenience function for writing a given PHY register
2e888103295f47 Lennert Buytenhek 2008-09-29  834   * @phydev: the phy_device struct
2e888103295f47 Lennert Buytenhek 2008-09-29  835   * @regnum: register number to write
2e888103295f47 Lennert Buytenhek 2008-09-29  836   * @val: value to write to @regnum
2e888103295f47 Lennert Buytenhek 2008-09-29  837   *
2e888103295f47 Lennert Buytenhek 2008-09-29  838   * NOTE: MUST NOT be called from interrupt context,
2e888103295f47 Lennert Buytenhek 2008-09-29  839   * because the bus read/write functions may wait for an interrupt
2e888103295f47 Lennert Buytenhek 2008-09-29  840   * to conclude the operation.
2e888103295f47 Lennert Buytenhek 2008-09-29  841   */
abf35df21513c5 Jason Gunthorpe   2010-03-09  842  static inline int phy_write(struct phy_device *phydev, u32 regnum, u16 val)
2e888103295f47 Lennert Buytenhek 2008-09-29  843  {
e5a03bfd873c29 Andrew Lunn       2016-01-06 @844  	return mdiobus_write(phydev->mdio.bus, phydev->mdio.addr, regnum, val);
2e888103295f47 Lennert Buytenhek 2008-09-29  845  }
2e888103295f47 Lennert Buytenhek 2008-09-29  846  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 38364 bytes --]

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH net-next v2 6/6] smsc95xx: use PHY framework instead of MII library
  2020-07-23 11:55 ` [PATCH net-next v2 6/6] smsc95xx: use PHY framework instead of MII library Andre Edich
@ 2020-07-25 23:36     ` kernel test robot
  0 siblings, 0 replies; 18+ messages in thread
From: kernel test robot @ 2020-07-25 23:36 UTC (permalink / raw)
  To: Andre Edich, netdev, UNGLinuxDriver, steve.glendinning
  Cc: kbuild-all, Parthiban.Veerasooran, Andre Edich

[-- Attachment #1: Type: text/plain, Size: 7151 bytes --]

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

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 38364 bytes --]

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH net-next v2 6/6] smsc95xx: use PHY framework instead of MII library
@ 2020-07-25 23:36     ` kernel test robot
  0 siblings, 0 replies; 18+ messages in thread
From: kernel test robot @ 2020-07-25 23:36 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 7297 bytes --]

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(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 38364 bytes --]

^ permalink raw reply	[flat|nested] 18+ messages in thread

end of thread, other threads:[~2020-07-26  0:13 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-07-23 11:55 [PATCH net-next v2 0/6] Add PAL support to smsc95xx Andre Edich
2020-07-23 11:55 ` [PATCH net-next v2 1/6] smsc95xx: remove redundant function arguments Andre Edich
2020-07-23 11:55 ` [PATCH net-next v2 2/6] smsc95xx: use usbnet->driver_priv Andre Edich
2020-07-23 22:42   ` Andrew Lunn
2020-07-23 11:55 ` [PATCH net-next v2 3/6] smsc95xx: add PAL support to use external PHY drivers Andre Edich
2020-07-23 22:39   ` Andrew Lunn
2020-07-24 15:17     ` Andre.Edich
2020-07-24 15:34       ` Andrew Lunn
2020-07-25 16:33   ` kernel test robot
2020-07-25 16:33     ` kernel test robot
2020-07-23 11:55 ` [PATCH net-next v2 4/6] smsc95xx: remove redundant link status checking Andre Edich
2020-07-23 22:41   ` Andrew Lunn
2020-07-23 11:55 ` [PATCH net-next v2 5/6] smsc95xx: use PAL framework read/write functions Andre Edich
2020-07-25 19:30   ` kernel test robot
2020-07-25 19:30     ` kernel test robot
2020-07-23 11:55 ` [PATCH net-next v2 6/6] smsc95xx: use PHY framework instead of MII library Andre Edich
2020-07-25 23:36   ` kernel test robot
2020-07-25 23:36     ` kernel test robot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.