aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGabor Juhos <juhosg@openwrt.org>2013-02-07 15:18:34 +0000
committerGabor Juhos <juhosg@openwrt.org>2013-02-07 15:18:34 +0000
commitc130a3feac577eb07943d2c3e5428ea5557aabcc (patch)
tree6c80aa9e319d532d450232046947cd141f78dc7d
parent4be8c22e7440e6b2d4d2673009f56ad30b401a16 (diff)
downloadupstream-c130a3feac577eb07943d2c3e5428ea5557aabcc.tar.gz
upstream-c130a3feac577eb07943d2c3e5428ea5557aabcc.tar.bz2
upstream-c130a3feac577eb07943d2c3e5428ea5557aabcc.zip
generic: mvswitch: add detach callback
Use the detach callback to disable packet mangling to avoid possible NULL pointer dereference. Compile tested only. Signed-off-by: Gabor Juhos <juhosg@openwrt.org> SVN-Revision: 35512
-rw-r--r--target/linux/generic/files/drivers/net/phy/mvswitch.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/target/linux/generic/files/drivers/net/phy/mvswitch.c b/target/linux/generic/files/drivers/net/phy/mvswitch.c
index d754951aca..af73ec22a0 100644
--- a/target/linux/generic/files/drivers/net/phy/mvswitch.c
+++ b/target/linux/generic/files/drivers/net/phy/mvswitch.c
@@ -348,16 +348,26 @@ mvswitch_config_aneg(struct phy_device *phydev)
}
static void
-mvswitch_remove(struct phy_device *pdev)
+mvswitch_detach(struct phy_device *pdev)
{
struct mvswitch_priv *priv = to_mvsw(pdev);
struct net_device *dev = pdev->attached_dev;
+ if (!dev)
+ return;
+
dev->phy_ptr = NULL;
dev->eth_mangle_rx = NULL;
dev->eth_mangle_tx = NULL;
dev->features = priv->orig_features;
dev->priv_flags &= ~IFF_NO_IP_ALIGN;
+}
+
+static void
+mvswitch_remove(struct phy_device *pdev)
+{
+ struct mvswitch_priv *priv = to_mvsw(pdev);
+
kfree(priv);
}
@@ -399,6 +409,7 @@ static struct phy_driver mvswitch_driver = {
.features = PHY_BASIC_FEATURES,
.probe = &mvswitch_probe,
.remove = &mvswitch_remove,
+ .detach = &mvswitch_detach,
.config_init = &mvswitch_config_init,
.config_aneg = &mvswitch_config_aneg,
.read_status = &mvswitch_read_status,