From 768cb31d9a601b8aa7678ca1fc3af3a81503ed09 Mon Sep 17 00:00:00 2001 From: Imre Kaloz Date: Thu, 7 May 2009 19:23:04 +0000 Subject: [PATCH] backport mv88e6095 support for orion - this also fixes the non-working switch-port on some routers SVN-Revision: 15697 --- .../orion/patches/030-mv88e6095_support.patch | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 target/linux/orion/patches/030-mv88e6095_support.patch diff --git a/target/linux/orion/patches/030-mv88e6095_support.patch b/target/linux/orion/patches/030-mv88e6095_support.patch new file mode 100644 index 0000000000..c71ce040fa --- /dev/null +++ b/target/linux/orion/patches/030-mv88e6095_support.patch @@ -0,0 +1,115 @@ +From: Lennert Buytenhek +Date: Fri, 20 Mar 2009 09:50:39 +0000 (+0000) +Subject: dsa: add support for the Marvell 88E6095/6095F switch chips +X-Git-Tag: v2.6.30-rc1~662^2~146 +X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=076d3e10a54caa2c148de5732c126c7a31381d48 + +dsa: add support for the Marvell 88E6095/6095F switch chips + +Add support for the Marvell 88E6095/6095F switch chips. These +chips are similar to the 88e6131, so we can add the support to +mv88e6131.c easily. + +Thanks to Gary Thomas and Jesper Dangaard +Brouer for testing various patches. + +Signed-off-by: Lennert Buytenhek +Tested-by: Gary Thomas +Signed-off-by: David S. Miller +--- + +diff --git a/net/dsa/Kconfig b/net/dsa/Kconfig +index 49211b3..c51b554 100644 +--- a/net/dsa/Kconfig ++++ b/net/dsa/Kconfig +@@ -41,13 +41,13 @@ config NET_DSA_MV88E6XXX_NEED_PPU + default n + + config NET_DSA_MV88E6131 +- bool "Marvell 88E6131 ethernet switch chip support" ++ bool "Marvell 88E6095/6095F/6131 ethernet switch chip support" + select NET_DSA_MV88E6XXX + select NET_DSA_MV88E6XXX_NEED_PPU + select NET_DSA_TAG_DSA + ---help--- +- This enables support for the Marvell 88E6131 ethernet switch +- chip. ++ This enables support for the Marvell 88E6095/6095F/6131 ++ ethernet switch chips. + + config NET_DSA_MV88E6123_61_65 + bool "Marvell 88E6123/6161/6165 ethernet switch chip support" +diff --git a/net/dsa/mv88e6131.c b/net/dsa/mv88e6131.c +index 70fae24..0029957 100644 +--- a/net/dsa/mv88e6131.c ++++ b/net/dsa/mv88e6131.c +@@ -1,6 +1,6 @@ + /* +- * net/dsa/mv88e6131.c - Marvell 88e6131 switch chip support +- * Copyright (c) 2008 Marvell Semiconductor ++ * net/dsa/mv88e6131.c - Marvell 88e6095/6095f/6131 switch chip support ++ * Copyright (c) 2008-2009 Marvell Semiconductor + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by +@@ -21,6 +21,8 @@ static char *mv88e6131_probe(struct mii_bus *bus, int sw_addr) + ret = __mv88e6xxx_reg_read(bus, sw_addr, REG_PORT(0), 0x03); + if (ret >= 0) { + ret &= 0xfff0; ++ if (ret == 0x0950) ++ return "Marvell 88E6095/88E6095F"; + if (ret == 0x1060) + return "Marvell 88E6131"; + } +@@ -36,7 +38,7 @@ static int mv88e6131_switch_reset(struct dsa_switch *ds) + /* + * Set all ports to the disabled state. + */ +- for (i = 0; i < 8; i++) { ++ for (i = 0; i < 11; i++) { + ret = REG_READ(REG_PORT(i), 0x04); + REG_WRITE(REG_PORT(i), 0x04, ret & 0xfffc); + } +@@ -136,7 +138,7 @@ static int mv88e6131_setup_global(struct dsa_switch *ds) + * Clear all trunk masks. + */ + for (i = 0; i < 8; i++) +- REG_WRITE(REG_GLOBAL2, 0x07, 0x8000 | (i << 12) | 0xff); ++ REG_WRITE(REG_GLOBAL2, 0x07, 0x8000 | (i << 12) | 0x7ff); + + /* + * Clear all trunk mappings. +@@ -159,9 +161,13 @@ static int mv88e6131_setup_port(struct dsa_switch *ds, int p) + + /* + * MAC Forcing register: don't force link, speed, duplex +- * or flow control state to any particular values. ++ * or flow control state to any particular values on physical ++ * ports, but force the CPU port to 1000 Mb/s full duplex. + */ +- REG_WRITE(addr, 0x01, 0x0003); ++ if (p == ds->cpu_port) ++ REG_WRITE(addr, 0x01, 0x003e); ++ else ++ REG_WRITE(addr, 0x01, 0x0003); + + /* + * Port Control: disable Core Tag, disable Drop-on-Lock, +@@ -268,7 +274,7 @@ static int mv88e6131_setup(struct dsa_switch *ds) + if (ret < 0) + return ret; + +- for (i = 0; i < 6; i++) { ++ for (i = 0; i < 11; i++) { + ret = mv88e6131_setup_port(ds, i); + if (ret < 0) + return ret; +@@ -279,7 +285,7 @@ static int mv88e6131_setup(struct dsa_switch *ds) + + static int mv88e6131_port_to_phy_addr(int port) + { +- if (port >= 0 && port != 3 && port <= 7) ++ if (port >= 0 && port <= 11) + return port; + return -1; + } -- 2.30.2