Hello,

The PA Semi PWRficient Gigabit Ethernet doesn't work anymore since the first networking updates [1] for the kernel 4.16.

Error messages:

[    0.634241] libphy: pasemi gpio mdio bus: probed
[    0.634749] pasemi gpio mdio bus: Cannot register as MDIO bus, err -38
[    2.311496] pasemi_mac 0000:00:14.0: runtime IRQ mapping not provided by arch [    2.311554] pasemi_mac 0000:00:14.1: runtime IRQ mapping not provided by arch [    2.311599] pasemi_mac 0000:00:14.2: runtime IRQ mapping not provided by arch [    2.311641] pasemi_mac 0000:00:14.3: runtime IRQ mapping not provided by arch [    2.312276] pasemi_mac 0000:00:15.0: runtime IRQ mapping not provided by arch [    2.312903] pasemi_mac 0000:00:15.1: runtime IRQ mapping not provided by arch [    3.817420] i2c-pasemi 0000:00:1c.0: runtime IRQ mapping not provided by arch [    3.817616] i2c-pasemi 0000:00:1c.1: runtime IRQ mapping not provided by arch [    3.817809] i2c-pasemi 0000:00:1c.2: runtime IRQ mapping not provided by arch [    4.299984] pasemi_edac 0000:00:04.0: runtime IRQ mapping not provided by arch [    4.300281] pasemi_edac 0000:00:05.0: runtime IRQ mapping not provided by arch
[   39.633565] pasemi_mac 0000:00:14.3: PHY init failed: -19.
[   39.633569] pasemi_mac 0000:00:14.3: Defaulting to 1Gbit full duplex

I figured out that the problematic code is in the mdio bus changes of the networking updates. [1]

I found the problematic code in the file 'drivers/net/phy/mdio_bus.c'. I created a patch which solves the problem with the PA Semi PWRficient Gigabit Ethernet. (attached)

Could you please check the changes in the file 'drivers/net/phy/mdio_bus.c'?

Thanks,
Christian

[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b2fe5fa68642860e7de76167c3111623aa0d5de1
--- a/drivers/net/phy/mdio_bus.c	2018-02-03 17:34:46.973045321 +0100
+++ b/drivers/net/phy/mdio_bus.c	2018-02-04 11:03:14.909093360 +0100
@@ -47,41 +47,11 @@
 
 #include "mdio-boardinfo.h"
 
-static int mdiobus_register_gpiod(struct mdio_device *mdiodev)
-{
-	struct gpio_desc *gpiod = NULL;
-
-	/* Deassert the optional reset signal */
-	if (mdiodev->dev.of_node)
-		gpiod = fwnode_get_named_gpiod(&mdiodev->dev.of_node->fwnode,
-					       "reset-gpios", 0, GPIOD_OUT_LOW,
-					       "PHY reset");
-	if (PTR_ERR(gpiod) == -ENOENT)
-		gpiod = NULL;
-	else if (IS_ERR(gpiod))
-		return PTR_ERR(gpiod);
-
-	mdiodev->reset = gpiod;
-
-	/* Assert the reset signal again */
-	mdio_device_reset(mdiodev, 1);
-
-	return 0;
-}
-
 int mdiobus_register_device(struct mdio_device *mdiodev)
 {
-	int err;
-
 	if (mdiodev->bus->mdio_map[mdiodev->addr])
 		return -EBUSY;
 
-	if (mdiodev->flags & MDIO_DEVICE_FLAG_PHY) {
-		err = mdiobus_register_gpiod(mdiodev);
-		if (err)
-			return err;
-	}
-
 	mdiodev->bus->mdio_map[mdiodev->addr] = mdiodev;
 
 	return 0;

Reply via email to