diff --git a/root/target/linux/brcm2708/patches-4.14/0151-lan78xx-Enable-LEDs-and-auto-negotiation.patch b/root/target/linux/brcm2708/patches-4.14/0151-lan78xx-Enable-LEDs-and-auto-negotiation.patch index 67f36c7f..5343bc67 100644 --- a/root/target/linux/brcm2708/patches-4.14/0151-lan78xx-Enable-LEDs-and-auto-negotiation.patch +++ b/root/target/linux/brcm2708/patches-4.14/0151-lan78xx-Enable-LEDs-and-auto-negotiation.patch @@ -38,16 +38,6 @@ index ee95fc957e1f..76674d8881b5 100644 ret = lan78xx_write_reg(dev, HW_CFG, buf); ret = lan78xx_read_reg(dev, USB_CFG0, &buf); -@@ -2461,6 +2469,9 @@ static int lan78xx_reset(struct lan78xx_net *dev) - /* LAN7801 only has RGMII mode */ - if (dev->chipid == ID_REV_CHIP_ID_7801_) - buf &= ~MAC_CR_GMII_EN_; -+ /* If no valid EEPROM and no valid OTP, enable AUTO negotiation */ -+ if (!has_eeprom && !has_otp) -+ buf |= MAC_CR_AUTO_DUPLEX_ | MAC_CR_AUTO_SPEED_; - ret = lan78xx_write_reg(dev, MAC_CR, buf); - - ret = lan78xx_read_reg(dev, MAC_TX, &buf); -- 2.16.1 diff --git a/root/target/linux/brcm2708/patches-4.14/0285-lan78xx-Simple-patch-to-prevent-some-crashes.patch b/root/target/linux/brcm2708/patches-4.14/0285-lan78xx-Simple-patch-to-prevent-some-crashes.patch deleted file mode 100644 index 3073b6bc..00000000 --- a/root/target/linux/brcm2708/patches-4.14/0285-lan78xx-Simple-patch-to-prevent-some-crashes.patch +++ /dev/null @@ -1,70 +0,0 @@ -From 661230038a8736ba9023978c53cd21cd65739406 Mon Sep 17 00:00:00 2001 -From: Phil Elwell -Date: Wed, 28 Mar 2018 17:32:20 +0100 -Subject: [PATCH 285/297] lan78xx: Simple patch to prevent some crashes - -Alexander Graf submitted a patch to solve a problem when connecting to -the device before the interface is brought up, but with that patch -applied the interface fails to work (for me and others). This simpler -patch should be considered a stepping stone that may prevent some of the -crashes seen when the interface is reset but without solving the early -access problem. - -See: https://github.com/raspberrypi/linux/issues/2449 - -Signed-off-by: Phil Elwell ---- - drivers/net/usb/lan78xx.c | 20 ++++++++++++-------- - 1 file changed, 12 insertions(+), 8 deletions(-) - -diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c -index 981cc5bf2df4..e7bdbd1accad 100644 ---- a/drivers/net/usb/lan78xx.c -+++ b/drivers/net/usb/lan78xx.c -@@ -2023,6 +2023,9 @@ static int lan78xx_phy_init(struct lan78xx_net *dev) - int i; - struct phy_device *phydev = dev->net->phydev; - -+ /* Return early if already initialised */ -+ if (phydev) -+ return 0; - phydev = phy_find_first(dev->mdiobus); - if (!phydev) { - netdev_err(dev->net, "no PHY found\n"); -@@ -2639,13 +2642,8 @@ static int lan78xx_stop(struct net_device *net) - if (timer_pending(&dev->stat_monitor)) - del_timer_sync(&dev->stat_monitor); - -- phy_unregister_fixup_for_uid(PHY_KSZ9031RNX, 0xfffffff0); -- phy_unregister_fixup_for_uid(PHY_LAN8835, 0xfffffff0); -- -- phy_stop(net->phydev); -- phy_disconnect(net->phydev); -- -- net->phydev = NULL; -+ if (net->phydev) -+ phy_stop(net->phydev); - - clear_bit(EVENT_DEV_OPEN, &dev->flags); - netif_stop_queue(net); -@@ -3543,10 +3541,16 @@ static void lan78xx_disconnect(struct usb_interface *intf) - udev = interface_to_usbdev(intf); - - net = dev->net; -- unregister_netdev(net); - - cancel_delayed_work_sync(&dev->wq); - -+ phy_unregister_fixup_for_uid(PHY_KSZ9031RNX, 0xfffffff0); -+ phy_unregister_fixup_for_uid(PHY_LAN8835, 0xfffffff0); -+ -+ phy_disconnect(net->phydev); -+ net->phydev = NULL; -+ unregister_netdev(net); -+ - usb_scuttle_anchored_urbs(&dev->deferred); - - lan78xx_unbind(dev, intf); --- -2.16.1 - diff --git a/root/target/linux/brcm2708/patches-4.14/0292-Revert-lan78xx-Simple-patch-to-prevent-some-crashes.patch b/root/target/linux/brcm2708/patches-4.14/0292-Revert-lan78xx-Simple-patch-to-prevent-some-crashes.patch deleted file mode 100644 index 5af8c8a4..00000000 --- a/root/target/linux/brcm2708/patches-4.14/0292-Revert-lan78xx-Simple-patch-to-prevent-some-crashes.patch +++ /dev/null @@ -1,62 +0,0 @@ -From 8d51cdad7dfe77c6b5dfeb95e675d7c4036c9f0f Mon Sep 17 00:00:00 2001 -From: Phil Elwell -Date: Wed, 4 Apr 2018 16:56:49 +0100 -Subject: [PATCH 292/297] Revert "lan78xx: Simple patch to prevent some - crashes" - -This reverts commit 661230038a8736ba9023978c53cd21cd65739406. ---- - drivers/net/usb/lan78xx.c | 20 ++++++++------------ - 1 file changed, 8 insertions(+), 12 deletions(-) - -diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c -index 099c7a06e365..70490995022b 100644 ---- a/drivers/net/usb/lan78xx.c -+++ b/drivers/net/usb/lan78xx.c -@@ -2023,9 +2023,6 @@ static int lan78xx_phy_init(struct lan78xx_net *dev) - int i; - struct phy_device *phydev = dev->net->phydev; - -- /* Return early if already initialised */ -- if (phydev) -- return 0; - phydev = phy_find_first(dev->mdiobus); - if (!phydev) { - netdev_err(dev->net, "no PHY found\n"); -@@ -2643,8 +2640,13 @@ static int lan78xx_stop(struct net_device *net) - if (timer_pending(&dev->stat_monitor)) - del_timer_sync(&dev->stat_monitor); - -- if (net->phydev) -- phy_stop(net->phydev); -+ phy_unregister_fixup_for_uid(PHY_KSZ9031RNX, 0xfffffff0); -+ phy_unregister_fixup_for_uid(PHY_LAN8835, 0xfffffff0); -+ -+ phy_stop(net->phydev); -+ phy_disconnect(net->phydev); -+ -+ net->phydev = NULL; - - clear_bit(EVENT_DEV_OPEN, &dev->flags); - netif_stop_queue(net); -@@ -3542,16 +3544,10 @@ static void lan78xx_disconnect(struct usb_interface *intf) - udev = interface_to_usbdev(intf); - - net = dev->net; -+ unregister_netdev(net); - - cancel_delayed_work_sync(&dev->wq); - -- phy_unregister_fixup_for_uid(PHY_KSZ9031RNX, 0xfffffff0); -- phy_unregister_fixup_for_uid(PHY_LAN8835, 0xfffffff0); -- -- phy_disconnect(net->phydev); -- net->phydev = NULL; -- unregister_netdev(net); -- - usb_scuttle_anchored_urbs(&dev->deferred); - - lan78xx_unbind(dev, intf); --- -2.16.1 - diff --git a/root/target/linux/brcm2708/patches-4.14/0293-lan78xx-Connect-phy-early.patch b/root/target/linux/brcm2708/patches-4.14/0293-lan78xx-Connect-phy-early.patch deleted file mode 100644 index 03f5cdc6..00000000 --- a/root/target/linux/brcm2708/patches-4.14/0293-lan78xx-Connect-phy-early.patch +++ /dev/null @@ -1,172 +0,0 @@ -From c11ae4fec531878e4d416004912b3bd6dda7b432 Mon Sep 17 00:00:00 2001 -From: Alexander Graf -Date: Wed, 4 Apr 2018 00:19:35 +0200 -Subject: [PATCH 293/297] lan78xx: Connect phy early - -When using wicked with a lan78xx device attached to the system, we -end up with ethtool commands issued on the device before an ifup -got issued. That lead to the following crash: - - Unable to handle kernel NULL pointer dereference at virtual address 0000039c - pgd = ffff800035b30000 - [0000039c] *pgd=0000000000000000 - Internal error: Oops: 96000004 [#1] SMP - Modules linked in: [...] - Supported: Yes - CPU: 3 PID: 638 Comm: wickedd Tainted: G E 4.12.14-0-default #1 - Hardware name: raspberrypi rpi/rpi, BIOS 2018.03-rc2 02/21/2018 - task: ffff800035e74180 task.stack: ffff800036718000 - PC is at phy_ethtool_ksettings_get+0x20/0x98 - LR is at lan78xx_get_link_ksettings+0x44/0x60 [lan78xx] - pc : [] lr : [] pstate: 20000005 - sp : ffff80003671bb20 - x29: ffff80003671bb20 x28: ffff800035e74180 - x27: ffff000008912000 x26: 000000000000001d - x25: 0000000000000124 x24: ffff000008f74d00 - x23: 0000004000114809 x22: 0000000000000000 - x21: ffff80003671bbd0 x20: 0000000000000000 - x19: ffff80003671bbd0 x18: 000000000000040d - x17: 0000000000000001 x16: 0000000000000000 - x15: 0000000000000000 x14: ffffffffffffffff - x13: 0000000000000000 x12: 0000000000000020 - x11: 0101010101010101 x10: fefefefefefefeff - x9 : 7f7f7f7f7f7f7f7f x8 : fefefeff31677364 - x7 : 0000000080808080 x6 : ffff80003671bc9c - x5 : ffff80003671b9f8 x4 : ffff80002c296190 - x3 : 0000000000000000 x2 : 0000000000000000 - x1 : ffff80003671bbd0 x0 : ffff80003671bc00 - Process wickedd (pid: 638, stack limit = 0xffff800036718000) - Call trace: - Exception stack(0xffff80003671b9e0 to 0xffff80003671bb20) - b9e0: ffff80003671bc00 ffff80003671bbd0 0000000000000000 0000000000000000 - ba00: ffff80002c296190 ffff80003671b9f8 ffff80003671bc9c 0000000080808080 - ba20: fefefeff31677364 7f7f7f7f7f7f7f7f fefefefefefefeff 0101010101010101 - ba40: 0000000000000020 0000000000000000 ffffffffffffffff 0000000000000000 - ba60: 0000000000000000 0000000000000001 000000000000040d ffff80003671bbd0 - ba80: 0000000000000000 ffff80003671bbd0 0000000000000000 0000004000114809 - baa0: ffff000008f74d00 0000000000000124 000000000000001d ffff000008912000 - bac0: ffff800035e74180 ffff80003671bb20 ffff000000dcca84 ffff80003671bb20 - bae0: ffff0000086f7f30 0000000020000005 ffff80002c296000 ffff800035223900 - bb00: 0000ffffffffffff 0000000000000000 ffff80003671bb20 ffff0000086f7f30 - [] phy_ethtool_ksettings_get+0x20/0x98 - [] lan78xx_get_link_ksettings+0x44/0x60 [lan78xx] - [] ethtool_get_settings+0x68/0x210 - [] dev_ethtool+0x214/0x2180 - [] dev_ioctl+0x400/0x630 - [] sock_do_ioctl+0x70/0x88 - [] sock_ioctl+0x208/0x368 - [] do_vfs_ioctl+0xb0/0x848 - [] SyS_ioctl+0x8c/0xa8 - Exception stack(0xffff80003671bec0 to 0xffff80003671c000) - bec0: 0000000000000009 0000000000008946 0000fffff4e841d0 0000aa0032687465 - bee0: 0000aaaafa2319d4 0000fffff4e841d4 0000000032687465 0000000032687465 - bf00: 000000000000001d 7f7fff7f7f7f7f7f 72606b622e71ff4c 7f7f7f7f7f7f7f7f - bf20: 0101010101010101 0000000000000020 ffffffffffffffff 0000ffff7f510c68 - bf40: 0000ffff7f6a9d18 0000ffff7f44ce30 000000000000040d 0000ffff7f6f98f0 - bf60: 0000fffff4e842c0 0000000000000001 0000aaaafa2c2e00 0000ffff7f6ab000 - bf80: 0000fffff4e842c0 0000ffff7f62a000 0000aaaafa2b9f20 0000aaaafa2c2e00 - bfa0: 0000fffff4e84818 0000fffff4e841a0 0000ffff7f5ad0cc 0000fffff4e841a0 - bfc0: 0000ffff7f44ce3c 0000000080000000 0000000000000009 000000000000001d - bfe0: 0000000000000000 0000000000000000 0000000000000000 0000000000000000 - -The culprit is quite simple: The driver tries to access the phy left and right, -but only actually has a working reference to it when the device is up. - -The fix thus is quite simple too: Get a reference to the phy on probe already -and keep it even when the device is going down. - -With this patch applied, I can successfully run wicked on my system and bring -the interface up and down as many times as I want, without getting NULL pointer -dereferences in between. - -Signed-off-by: Alexander Graf ---- - drivers/net/usb/lan78xx.c | 34 ++++++++++++++++++---------------- - 1 file changed, 18 insertions(+), 16 deletions(-) - -diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c -index 70490995022b..5c6972871b7b 100644 ---- a/drivers/net/usb/lan78xx.c -+++ b/drivers/net/usb/lan78xx.c -@@ -2119,10 +2119,6 @@ static int lan78xx_phy_init(struct lan78xx_net *dev) - - dev->fc_autoneg = phydev->autoneg; - -- phy_start(phydev); -- -- netif_dbg(dev, ifup, dev->net, "phy initialised successfully"); -- - return 0; - - error: -@@ -2561,9 +2557,9 @@ static int lan78xx_open(struct net_device *net) - if (ret < 0) - goto done; - -- ret = lan78xx_phy_init(dev); -- if (ret < 0) -- goto done; -+ phy_start(net->phydev); -+ -+ netif_dbg(dev, ifup, dev->net, "phy initialised successfully"); - - if (of_property_read_bool(dev->udev->dev.of_node, - "microchip,eee-enabled")) { -@@ -2640,13 +2636,8 @@ static int lan78xx_stop(struct net_device *net) - if (timer_pending(&dev->stat_monitor)) - del_timer_sync(&dev->stat_monitor); - -- phy_unregister_fixup_for_uid(PHY_KSZ9031RNX, 0xfffffff0); -- phy_unregister_fixup_for_uid(PHY_LAN8835, 0xfffffff0); -- -- phy_stop(net->phydev); -- phy_disconnect(net->phydev); -- -- net->phydev = NULL; -+ if (net->phydev) -+ phy_stop(net->phydev); - - clear_bit(EVENT_DEV_OPEN, &dev->flags); - netif_stop_queue(net); -@@ -3542,8 +3533,13 @@ static void lan78xx_disconnect(struct usb_interface *intf) - return; - - udev = interface_to_usbdev(intf); -- - net = dev->net; -+ -+ phy_unregister_fixup_for_uid(PHY_KSZ9031RNX, 0xfffffff0); -+ phy_unregister_fixup_for_uid(PHY_LAN8835, 0xfffffff0); -+ -+ phy_disconnect(net->phydev); -+ - unregister_netdev(net); - - cancel_delayed_work_sync(&dev->wq); -@@ -3703,8 +3699,14 @@ static int lan78xx_probe(struct usb_interface *intf, - pm_runtime_set_autosuspend_delay(&udev->dev, - DEFAULT_AUTOSUSPEND_DELAY); - -+ ret = lan78xx_phy_init(dev); -+ if (ret < 0) -+ goto out4; -+ - return 0; - -+out4: -+ unregister_netdev(netdev); - out3: - lan78xx_unbind(dev, intf); - out2: -@@ -4052,7 +4054,7 @@ static int lan78xx_reset_resume(struct usb_interface *intf) - - lan78xx_reset(dev); - -- lan78xx_phy_init(dev); -+ phy_start(dev->net->phydev); - - return lan78xx_resume(intf); - } --- -2.16.1 -