1
0
Fork 0
mirror of https://github.com/Ysurac/openmptcprouter.git synced 2025-02-15 04:42:02 +00:00
openmptcprouter/root/target/linux/brcm2708/patches-4.14/0285-lan78xx-Simple-patch-to-prevent-some-crashes.patch
2018-04-09 10:50:54 +02:00

70 lines
2.2 KiB
Diff

From 661230038a8736ba9023978c53cd21cd65739406 Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.org>
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 <phil@raspberrypi.org>
---
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