|
|
@@ -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
|