ar71xx: ag71xx: don't start/stop built-in switch w/o mii_bus_dev
authorGabor Juhos <juhosg@openwrt.org>
Sat, 22 Dec 2012 12:12:40 +0000 (12:12 +0000)
committerGabor Juhos <juhosg@openwrt.org>
Sat, 22 Dec 2012 12:12:40 +0000 (12:12 +0000)
Trying to do that causes a NULL pointer dereference:

CPU 0 Unable to handle kernel paging request at virtual address 00000000, epc == 801d170c, ra == 801d18d4
Oops[#1]:
Cpu 0
$ 0   : 00000000 00000000 00000000 00000001
$ 4   : 00000000 802e6390 ffff8f45 00000001
$ 8   : 804b5360 ffffff80 802f93bc 00000000
$12   : 802f93e8 00000000 00000000 00000000
$16   : 8381aba0 8381aba0 00000000 00000000
$20   : 8295eff0 00000032 80000000 004101b8
$24   : 00000000 777265b0
$28   : 82936000 82937cf0 00420000 801d18d4
Hi    : 00000000
Lo    : 00000001
epc   : 801d170c ar7240sw_reset+0x1c/0x19c
    Tainted: G           O
ra    : 801d18d4 ag71xx_ar7240_start+0x28/0xc0
Status: 1100fc03    KERNEL EXL IE
Cause : 00800008
BadVA : 00000000
PrId  : 00019750 (MIPS 74Kc)
Modules linked in: ath79_wdt ohci_hcd ledtrig_usbdev ledtrig_netdev
nf_nat_irc nf_nat_ftp nf_conntrack_irc nf_conntrack_ftp
 ipt_MASQUERADE iptable_nat nf_nat pppoe xt_conntrack xt_CT xt_NOTRACK
iptable_raw xt_state nf_conntrack_ipv4 nf_defrag_ipv4 nf_conntrack
ehci_hcd pppox ipt_REJECT xt_TCPMSS xt_LOG xt_comment xt_multiport
xt_mac xt_limit iptable_mangle iptable_filter ip_tables xt_tcpudp x_tab
les ppp_async ppp_generic slhc ath9k(O) ath9k_common(O) ath9k_hw(O)
ath(O) mac80211(O) usbcore usb_common nls_base crc_ccitt cfg80211(O) c
ompat(O) arc4 aes_generic crypto_blkcipher cryptomgr aead crypto_hash
crypto_algapi ledtrig_timer ledtrig_default_on leds_gpio gpio_button
_hotplug(O)
Process netifd (pid: 677, threadinfo=82936000, task=82cbe140, tls=77803750)
Stack : ffffffff 80087900 00000001 82937d74 8381aba0 8381aba0 00000000 00000000
        8295eff0 801d18d4 8295eff0 801fa4a4 00420000 80092158 00000002 8381aba0
        8381a800 00000000 00000080 801cf900 8027e720 00000000 00000000 8009223c
        8381a800 8381a82c 8027e720 00000000 00000000 7f9d14f0 00420000 801ec08c
        8381a800 801ebfb0 33000000 82937e30 00000001 8381a800 00001003 801ec348
        ...
Call Trace:
[<801d170c>] ar7240sw_reset+0x1c/0x19c
[<801d18d4>] ag71xx_ar7240_start+0x28/0xc0
[<801cf900>] ag71xx_open+0x1d0/0x258
[<801ec08c>] __dev_open+0xcc/0x130
[<801ec348>] __dev_change_flags+0xc0/0x160
[<801ec490>] dev_change_flags+0x20/0x6c
[<801ec5c8>] dev_ifsioc+0xec/0x348
[<801ecdb8>] dev_ioctl+0x594/0x67c
[<800ec00c>] do_vfs_ioctl+0x598/0x5ec
[<800ec0b0>] sys_ioctl+0x50/0x90
[<8006a3c4>] stack_done+0x20/0x40
Code: afbf0024  afb40020  afb10014 <8c91000000809021  24100104 24130704  8e440000  02002821

Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
SVN-Revision: 34848

target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_phy.c

index ebdbc5b9ac2a8b66a6592dc6ba103af87dab2b70..ce9edc1f743ea97f2de0f1db289a597844baf5bb 100644 (file)
@@ -48,7 +48,7 @@ void ag71xx_phy_start(struct ag71xx *ag)
 
        if (ag->phy_dev) {
                phy_start(ag->phy_dev);
-       } else if (pdata->switch_data) {
+       } else if (pdata->mii_bus_dev && pdata->switch_data) {
                ag71xx_ar7240_start(ag);
        } else {
                ag->link = 1;
@@ -63,7 +63,7 @@ void ag71xx_phy_stop(struct ag71xx *ag)
 
        if (ag->phy_dev)
                phy_stop(ag->phy_dev);
-       else if (pdata->switch_data)
+       else if (pdata->mii_bus_dev && pdata->switch_data)
                ag71xx_ar7240_stop(ag);
 
        spin_lock_irqsave(&ag->lock, flags);