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;