From 2fd3aff0adc78446d044d77846f0b717f7dfac89 Mon Sep 17 00:00:00 2001 From: Gabor Juhos Date: Mon, 15 Aug 2011 14:11:43 +0000 Subject: [PATCH] ramips: allow to specify port layout for the switch of the RT305x/RT3350 Based on a patch by Roman Yeryomin git-svn-id: svn://svn.openwrt.org/openwrt/trunk@27990 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../asm/mach-ralink/rt305x_esw_platform.h | 7 +++ .../mips/ralink/rt305x/mach-dir-300-revb.c | 1 + .../arch/mips/ralink/rt305x/mach-f5d8235-v2.c | 1 + .../arch/mips/ralink/rt305x/mach-fonera20n.c | 1 + .../arch/mips/ralink/rt305x/mach-hw550-3g.c | 1 + .../mips/ralink/rt305x/mach-mofi3500-3gn.c | 1 + .../arch/mips/ralink/rt305x/mach-nw718.c | 1 + .../arch/mips/ralink/rt305x/mach-pwh2004.c | 1 + .../mips/ralink/rt305x/mach-rt-g32-revb.c | 1 + .../arch/mips/ralink/rt305x/mach-v22rw-2x2.c | 1 + .../arch/mips/ralink/rt305x/mach-wcr150gn.c | 1 + .../arch/mips/ralink/rt305x/mach-whr-g300n.c | 1 + .../ramips/files/drivers/net/ramips_esw.c | 57 ++++++++++++++----- 13 files changed, 62 insertions(+), 13 deletions(-) diff --git a/target/linux/ramips/files/arch/mips/include/asm/mach-ralink/rt305x_esw_platform.h b/target/linux/ramips/files/arch/mips/include/asm/mach-ralink/rt305x_esw_platform.h index fd1f6eb19a..97ee375eb7 100644 --- a/target/linux/ramips/files/arch/mips/include/asm/mach-ralink/rt305x_esw_platform.h +++ b/target/linux/ramips/files/arch/mips/include/asm/mach-ralink/rt305x_esw_platform.h @@ -11,8 +11,15 @@ #ifndef _RT305X_ESW_PLATFORM_H #define _RT305X_ESW_PLATFORM_H +enum { + RT305X_ESW_VLAN_CONFIG_NONE = 0, + RT305X_ESW_VLAN_CONFIG_LLLLW, + RT305X_ESW_VLAN_CONFIG_WLLLL, +}; + struct rt305x_esw_platform_data { + u8 vlan_config; }; #endif /* _RT305X_ESW_PLATFORM_H */ diff --git a/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-dir-300-revb.c b/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-dir-300-revb.c index 71b9c51fa4..622803672a 100644 --- a/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-dir-300-revb.c +++ b/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-dir-300-revb.c @@ -110,6 +110,7 @@ static void __init dir_300b_init(void) rt305x_gpio_init(RT305X_GPIO_MODE_GPIO << RT305X_GPIO_MODE_UART0_SHIFT); rt305x_register_flash(0, &dir_300b_flash_data); + rt305x_esw_data.vlan_config = RT305X_ESW_VLAN_CONFIG_LLLLW; rt305x_register_ethernet(); ramips_register_gpio_leds(-1, ARRAY_SIZE(dir_300b_leds_gpio), dir_300b_leds_gpio); diff --git a/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-f5d8235-v2.c b/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-f5d8235-v2.c index b4062818ee..7e218f7bd6 100644 --- a/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-f5d8235-v2.c +++ b/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-f5d8235-v2.c @@ -132,6 +132,7 @@ static void __init f5d8235v2_init(void) rt305x_register_flash(0, &f5d8235v2_flash_data); ramips_register_gpio_leds(-1, ARRAY_SIZE(f5d8235v2_leds_gpio), f5d8235v2_leds_gpio); + rt305x_esw_data.vlan_config = RT305X_ESW_VLAN_CONFIG_NONE; rt305x_register_ethernet(); platform_device_register(&f5d8235v2_switch); rt305x_register_wifi(); diff --git a/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-fonera20n.c b/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-fonera20n.c index bbf152fa86..544279509a 100644 --- a/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-fonera20n.c +++ b/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-fonera20n.c @@ -118,6 +118,7 @@ static void __init fonera20n_init(void) ARRAY_SIZE(fonera20n_gpio_buttons), fonera20n_gpio_buttons); + rt305x_esw_data.vlan_config = RT305X_ESW_VLAN_CONFIG_LLLLW; rt305x_register_ethernet(); rt305x_register_wifi(); rt305x_register_wdt(); diff --git a/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-hw550-3g.c b/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-hw550-3g.c index c1023e0010..77e068233a 100644 --- a/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-hw550-3g.c +++ b/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-hw550-3g.c @@ -127,6 +127,7 @@ static void __init hw550_3g_init(void) rt305x_gpio_init(HW550_3G_GPIO_MODE); rt305x_register_flash(0, &hw550_3g_flash_data); + rt305x_esw_data.vlan_config = RT305X_ESW_VLAN_CONFIG_LLLLW; rt305x_register_ethernet(); ramips_register_gpio_leds(-1, ARRAY_SIZE(hw550_3g_leds_gpio), hw550_3g_leds_gpio); diff --git a/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-mofi3500-3gn.c b/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-mofi3500-3gn.c index 8e34ad0bc3..16b109fd1b 100644 --- a/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-mofi3500-3gn.c +++ b/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-mofi3500-3gn.c @@ -127,6 +127,7 @@ static void __init mofi3500_3gn_init(void) rt305x_gpio_init(MOFI3500_3GN_GPIO_MODE); rt305x_register_flash(0, &mofi3500_3gn_flash_data); + rt305x_esw_data.vlan_config = RT305X_ESW_VLAN_CONFIG_LLLLW; rt305x_register_ethernet(); ramips_register_gpio_leds(-1, ARRAY_SIZE(mofi3500_3gn_leds_gpio), mofi3500_3gn_leds_gpio); diff --git a/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-nw718.c b/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-nw718.c index 09f6dc4859..7107a8c50a 100644 --- a/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-nw718.c +++ b/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-nw718.c @@ -129,6 +129,7 @@ static void __init nw718_init(void) rt305x_gpio_init(RT305X_GPIO_MODE_I2C | RT305X_GPIO_MODE_GPIO << RT305X_GPIO_MODE_UART0_SHIFT); + rt305x_esw_data.vlan_config = RT305X_ESW_VLAN_CONFIG_LLLLW; rt305x_register_ethernet(); ramips_register_gpio_leds(-1, ARRAY_SIZE(nw718_leds_gpio), nw718_leds_gpio); diff --git a/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-pwh2004.c b/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-pwh2004.c index 03dc19221d..c321e11088 100644 --- a/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-pwh2004.c +++ b/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-pwh2004.c @@ -95,6 +95,7 @@ static void __init pwh2004_init(void) ramips_register_gpio_buttons(-1, PWH2004_BUTTONS_POLL_INTERVAL, ARRAY_SIZE(pwh2004_gpio_buttons), pwh2004_gpio_buttons); + rt305x_esw_data.vlan_config = RT305X_ESW_VLAN_CONFIG_LLLLW; rt305x_register_ethernet(); rt305x_register_wifi(); rt305x_register_wdt(); diff --git a/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-rt-g32-revb.c b/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-rt-g32-revb.c index 8273c5ae3b..274466c210 100644 --- a/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-rt-g32-revb.c +++ b/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-rt-g32-revb.c @@ -103,6 +103,7 @@ static void __init rt_g32b_init(void) rt305x_register_spi(rt_g32b_spi_slave_info, ARRAY_SIZE(rt_g32b_spi_slave_info)); + rt305x_esw_data.vlan_config = RT305X_ESW_VLAN_CONFIG_LLLLW; rt305x_register_ethernet(); ramips_register_gpio_buttons(-1, RT_G32B_BUTTONS_POLL_INTERVAL, ARRAY_SIZE(rt_g32b_gpio_buttons), diff --git a/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-v22rw-2x2.c b/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-v22rw-2x2.c index 382da755f9..b5883bb997 100644 --- a/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-v22rw-2x2.c +++ b/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-v22rw-2x2.c @@ -104,6 +104,7 @@ static void __init v22rw_2x2_init(void) rt305x_gpio_init(RT305X_GPIO_MODE_GPIO << RT305X_GPIO_MODE_UART0_SHIFT); rt305x_register_flash(0, &v22rw_2x2_flash_data); + rt305x_esw_data.vlan_config = RT305X_ESW_VLAN_CONFIG_LLLLW; rt305x_register_ethernet(); ramips_register_gpio_leds(-1, ARRAY_SIZE(v22rw_2x2_leds_gpio), v22rw_2x2_leds_gpio); diff --git a/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-wcr150gn.c b/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-wcr150gn.c index babaa710a5..984bab7b85 100644 --- a/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-wcr150gn.c +++ b/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-wcr150gn.c @@ -60,6 +60,7 @@ static void __init wcr150gn_init(void) { rt305x_gpio_init(RT305X_GPIO_MODE_GPIO << RT305X_GPIO_MODE_UART0_SHIFT); rt305x_register_flash(0, &wcr150gn_flash_data); + rt305x_esw_data.vlan_config = RT305X_ESW_VLAN_CONFIG_LLLLW; rt305x_register_ethernet(); rt305x_register_wifi(); rt305x_register_wdt(); diff --git a/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-whr-g300n.c b/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-whr-g300n.c index 6313135885..49ab0fd009 100644 --- a/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-whr-g300n.c +++ b/target/linux/ramips/files/arch/mips/ralink/rt305x/mach-whr-g300n.c @@ -130,6 +130,7 @@ static void __init whr_g300n_init(void) rt305x_gpio_init(RT305X_GPIO_MODE_GPIO << RT305X_GPIO_MODE_UART0_SHIFT); rt305x_register_flash(0, &whr_g300n_flash_data); + rt305x_esw_data.vlan_config = RT305X_ESW_VLAN_CONFIG_LLLLW; rt305x_register_ethernet(); ramips_register_gpio_leds(-1, ARRAY_SIZE(whr_g300n_leds_gpio), whr_g300n_leds_gpio); diff --git a/target/linux/ramips/files/drivers/net/ramips_esw.c b/target/linux/ramips/files/drivers/net/ramips_esw.c index c6b5db76dc..c681eed830 100644 --- a/target/linux/ramips/files/drivers/net/ramips_esw.c +++ b/target/linux/ramips/files/drivers/net/ramips_esw.c @@ -72,6 +72,9 @@ #define RT305X_ESW_PORTS_ALL \ (RT305X_ESW_PORTS_NOCPU | RT305X_ESW_PORTS_CPU) +#define RT305X_ESW_NUM_VLANS 16 +#define RT305X_ESW_NUM_PORTS 7 + struct rt305x_esw { void __iomem *base; struct rt305x_esw_platform_data *pdata; @@ -221,8 +224,6 @@ rt305x_esw_hw_init(struct rt305x_esw *esw) (RT305X_ESW_PORTS_CPU << RT305X_ESW_SOCPC_DISBC2CPU_S)), RT305X_ESW_REG_SOCPC); - rt305x_esw_set_pvid(esw, RT305X_ESW_PORT4, 2); - rt305x_esw_set_pvid(esw, RT305X_ESW_PORT5, 1); rt305x_esw_wr(esw, 0x3f502b28, RT305X_ESW_REG_FPA2); rt305x_esw_wr(esw, 0x00000000, RT305X_ESW_REG_FPA); @@ -252,17 +253,47 @@ rt305x_esw_hw_init(struct rt305x_esw *esw) /* select local register */ rt305x_mii_write(esw, 0, 31, 0x8000); - /* set default vlan */ - rt305x_esw_set_vlan_id(esw, 0, 1); - rt305x_esw_set_vlan_id(esw, 1, 2); - rt305x_esw_set_vmsc(esw, 0, - (BIT(RT305X_ESW_PORT0) | BIT(RT305X_ESW_PORT1) | - BIT(RT305X_ESW_PORT2) | BIT(RT305X_ESW_PORT3) | - BIT(RT305X_ESW_PORT6))); - rt305x_esw_set_vmsc(esw, 1, - (BIT(RT305X_ESW_PORT4) | BIT(RT305X_ESW_PORT6))); - rt305x_esw_set_vmsc(esw, 2, 0); - rt305x_esw_set_vmsc(esw, 3, 0); + for (i = 0; i < RT305X_ESW_NUM_VLANS; i++) { + rt305x_esw_set_vlan_id(esw, i, 0); + rt305x_esw_set_vmsc(esw, i, 0); + } + + for (i = 0; i < RT305X_ESW_NUM_PORTS; i++) + rt305x_esw_set_pvid(esw, i, 1); + + switch (esw->pdata->vlan_config) { + case RT305X_ESW_VLAN_CONFIG_NONE: + break; + + case RT305X_ESW_VLAN_CONFIG_LLLLW: + rt305x_esw_set_vlan_id(esw, 0, 1); + rt305x_esw_set_vlan_id(esw, 1, 2); + rt305x_esw_set_pvid(esw, RT305X_ESW_PORT4, 2); + + rt305x_esw_set_vmsc(esw, 0, + BIT(RT305X_ESW_PORT0) | BIT(RT305X_ESW_PORT1) | + BIT(RT305X_ESW_PORT2) | BIT(RT305X_ESW_PORT3) | + BIT(RT305X_ESW_PORT6)); + rt305x_esw_set_vmsc(esw, 1, + BIT(RT305X_ESW_PORT4) | BIT(RT305X_ESW_PORT6)); + break; + + case RT305X_ESW_VLAN_CONFIG_WLLLL: + rt305x_esw_set_vlan_id(esw, 0, 1); + rt305x_esw_set_vlan_id(esw, 1, 2); + rt305x_esw_set_pvid(esw, RT305X_ESW_PORT0, 2); + + rt305x_esw_set_vmsc(esw, 0, + BIT(RT305X_ESW_PORT1) | BIT(RT305X_ESW_PORT2) | + BIT(RT305X_ESW_PORT3) | BIT(RT305X_ESW_PORT4) | + BIT(RT305X_ESW_PORT6)); + rt305x_esw_set_vmsc(esw, 1, + BIT(RT305X_ESW_PORT0) | BIT(RT305X_ESW_PORT6)); + break; + + default: + BUG(); + } } static int