ar71xx: implement switch fix for WD My Net N750
authorGabor Juhos <juhosg@openwrt.org>
Tue, 17 Dec 2013 22:14:11 +0000 (22:14 +0000)
committerGabor Juhos <juhosg@openwrt.org>
Tue, 17 Dec 2013 22:14:11 +0000 (22:14 +0000)
The bootloader on the WD My Net N750 disables the ports on it's internal
AR8327N switch by powering them down. The stock firmware then brings the
ports back up again by starting the auto negotiation process on each
port.

This fix implements just that.

Signed-off-by: Felix Kaechele <heffer@fedoraproject.org>
Patchwork: http://patchwork.openwrt.org/patch/4615/
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
SVN-Revision: 39128

target/linux/ar71xx/files/arch/mips/ath79/mach-mynet-n750.c

index 60f68cd6a1b3a00d17c2a837f13f904391331210..29201feb0bbd08e03e72d5b6e8e0ad88c5e63763 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/pci.h>
 #include <linux/phy.h>
 #include <linux/gpio.h>
+#include <linux/delay.h>
 #include <linux/platform_device.h>
 #include <linux/ath9k_platform.h>
 #include <linux/ar8216_platform.h>
@@ -144,6 +145,23 @@ static void mynet_n750_get_mac(const char *name, char *mac)
                pr_err("no MAC address found for %s\n", name);
 }
 
+/*
+ * The bootloader on this board powers down all PHYs on the switch
+ * before booting the kernel. We bring all PHYs back up so that they are
+ * discoverable by the mdio bus scan and the switch is detected
+ * correctly.
+ */
+static void mynet_n750_mdio_fixup(struct mii_bus *bus)
+{
+       int i;
+
+       for (i = 0; i < 5; i++)
+               bus->write(bus, i, MII_BMCR,
+                          (BMCR_RESET | BMCR_ANENABLE | BMCR_SPEED1000));
+
+       mdelay(1000);
+}
+
 static void __init mynet_n750_setup(void)
 {
        u8 *art = (u8 *) KSEG1ADDR(0x1fff0000);
@@ -178,6 +196,7 @@ static void __init mynet_n750_setup(void)
        mdiobus_register_board_info(mynet_n750_mdio0_info,
                                    ARRAY_SIZE(mynet_n750_mdio0_info));
 
+       ath79_mdio0_data.reset = mynet_n750_mdio_fixup;
        ath79_register_mdio(0, 0x0);
 
        mynet_n750_get_mac("lanmac=", ath79_eth0_data.mac_addr);