From: Gabor Juhos Date: Tue, 5 Feb 2013 08:39:26 +0000 (+0000) Subject: generic: ar8216: clear driver specific data pointer in phy_device X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=395d0bdc1f933eee8a0c5b1270851b30fcc46ef7;p=openwrt%2Fstaging%2F981213.git generic: ar8216: clear driver specific data pointer in phy_device This is needed to avoid a NULL pointer dereference: [ 19.525270] Unable to handle kernel paging request for data at address 0x00000018 [ 19.532750] Faulting instruction address: 0xc016e104 [ 19.537714] Oops: Kernel access of bad area, sig: 11 [#1] [ 19.543102] P1010 RDB [ 19.545365] Modules linked in: booke_wdt nf_nat_irc nf_nat_ftp nf_conntrack_irc nf_conntrack_ftp ipt_MASQUERADE iptable_nat xt_nat d [ 19.590725] NIP: c016e104 LR: c0171490 CTR: 00000000 [ 19.595681] REGS: c4bc3c10 TRAP: 0300 Tainted: G W O (3.7.6) [ 19.602284] MSR: 00029000 CR: 82002022 XER: 20000000 [ 19.608381] DEAR: 00000018, ESR: 00000000 [ 19.612382] TASK = c4cd9c80[2070] 'ifconfig' THREAD: c4bc2000 GPR00: 00000001 c4bc3cc0 c4cd9c80 00000000 c7811000 00000000 00000000 0000e8ec GPR08: 0000e8eb 00000000 00029000 00000001 00000000 100801f8 1005c51c 1005c514 GPR16: 1005c468 1005c54c 1005c258 1005c530 10060000 00000000 c7811000 ffff8914 GPR24: c7815030 c793e400 10063adb 00000000 c7811000 c045594c c78ca600 c7815000 [ 19.646352] NIP [c016e104] register_switch+0x98/0x2d0 [ 19.651397] LR [c0171490] ar8216_config_init+0x2d8/0x3f4 [ 19.656697] Call Trace: [ 19.659138] [c4bc3cc0] [c0170490] ar8216_mii_read+0x64/0xc4 (unreliable) [ 19.665835] [c4bc3d00] [c0171490] ar8216_config_init+0x2d8/0x3f4 [ 19.671835] [c4bc3d20] [c016cf8c] phy_init_hw+0x50/0x6c [ 19.677053] [c4bc3d30] [c016d078] phy_attach_direct+0xd0/0xf8 [ 19.682793] [c4bc3d50] [c016d154] phy_connect_direct+0x24/0x68 [ 19.688621] [c4bc3d70] [c0183b70] of_phy_connect+0x48/0x6c [ 19.694102] [c4bc3d90] [c0175aac] gfar_enet_open+0x254/0x3d8 [ 19.699755] [c4bc3db0] [c019acc4] __dev_open+0xc0/0x120 [ 19.704975] [c4bc3dd0] [c019af98] __dev_change_flags+0xd4/0x15c [ 19.710888] [c4bc3df0] [c019b0d4] dev_change_flags+0x1c/0x60 [ 19.716544] [c4bc3e10] [c01ebb94] devinet_ioctl+0x290/0x690 [ 19.722111] [c4bc3e70] [c01ec8d4] inet_ioctl+0x88/0xbc [ 19.727245] [c4bc3e80] [c0186b98] sock_ioctl+0x258/0x294 [ 19.732551] [c4bc3ea0] [c009c00c] do_vfs_ioctl+0x6a4/0x728 [ 19.738031] [c4bc3f10] [c009c0d4] sys_ioctl+0x44/0x70 [ 19.743077] [c4bc3f40] [c000c74c] ret_from_syscall+0x0/0x3c [ 19.748646] --- Exception: c01 at 0x48091b34 [ 19.748646] LR = 0x480e4b64 [ 19.756033] Instruction dump: [ 19.758991] 2f830000 907f0050 3860fff4 419e021c 837f0000 38000000 901f0038 901f0040 [ 19.766744] 901f003c 7f600034 5400d97e 0f000000 <801b0018> 2f800000 40be0010 801b001c Signed-off-by: Gabor Juhos SVN-Revision: 35497 --- diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index 3a0483ddba..cf28af0c76 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -1902,6 +1902,7 @@ err_cleanup_mib: ar8xxx_mib_cleanup(priv); err_free_priv: kfree(priv); + pdev->priv = NULL; return ret; } @@ -1983,6 +1984,8 @@ ar8216_remove(struct phy_device *pdev) if (!priv) return; + pdev->priv = NULL; + dev->priv_flags &= ~IFF_NO_IP_ALIGN; dev->eth_mangle_rx = NULL; dev->eth_mangle_tx = NULL;