diff options
Diffstat (limited to 'target/linux/ramips/files')
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 fd1f6eb19..97ee375eb 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 71b9c51fa..622803672 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 b4062818e..7e218f7bd 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 bbf152fa8..544279509 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 c1023e001..77e068233 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 8e34ad0bc..16b109fd1 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 09f6dc485..7107a8c50 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 03dc19221..c321e1108 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 8273c5ae3..274466c21 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 382da755f..b5883bb99 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 babaa710a..984bab7b8 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 631313588..49ab0fd00 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 c6b5db76d..c681eed83 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  | 
