2016-06-29 13:09:09 +00:00
|
|
|
--- a/drivers/net/ethernet/mediatek/esw_rt3050.c
|
|
|
|
+++ b/drivers/net/ethernet/mediatek/esw_rt3050.c
|
2016-07-13 10:07:08 +00:00
|
|
|
@@ -221,6 +221,8 @@ struct rt305x_esw {
|
2016-06-29 13:09:09 +00:00
|
|
|
|
|
|
|
unsigned char port_map;
|
|
|
|
unsigned char port_disable;
|
|
|
|
+ unsigned int reg_initval_fct2;
|
|
|
|
+ unsigned int reg_initval_fpa2;
|
|
|
|
unsigned int reg_led_polarity;
|
|
|
|
|
|
|
|
struct switch_dev swdev;
|
2016-07-13 10:07:08 +00:00
|
|
|
@@ -452,7 +454,10 @@ static void esw_hw_init(struct rt305x_es
|
2016-06-29 13:09:09 +00:00
|
|
|
(RT305X_ESW_PORTS_NOCPU << RT305X_ESW_POC2_UNTAG_EN_S)),
|
|
|
|
RT305X_ESW_REG_POC2);
|
|
|
|
|
|
|
|
- esw_w32(esw, 0x0002500c, RT305X_ESW_REG_FCT2);
|
|
|
|
+ if (esw->reg_initval_fct2)
|
|
|
|
+ esw_w32(esw, esw->reg_initval_fct2, RT305X_ESW_REG_FCT2);
|
|
|
|
+ else
|
|
|
|
+ esw_w32(esw, 0x0002500c, RT305X_ESW_REG_FCT2);
|
|
|
|
|
|
|
|
/* 300s aging timer, max packet len 1536, broadcast storm prevention
|
|
|
|
* disabled, disable collision abort, mac xor48 hash, 10 packet back
|
2016-07-13 10:07:08 +00:00
|
|
|
@@ -475,7 +480,10 @@ static void esw_hw_init(struct rt305x_es
|
2016-06-29 13:09:09 +00:00
|
|
|
* port5: disabled
|
|
|
|
* port6: enabled, gige, full-duplex, rx/tx-flow-control
|
|
|
|
*/
|
|
|
|
- esw_w32(esw, 0x3f502b28, RT305X_ESW_REG_FPA2);
|
|
|
|
+ if (esw->reg_initval_fpa2)
|
|
|
|
+ esw_w32(esw, esw->reg_initval_fpa2, RT305X_ESW_REG_FPA2);
|
|
|
|
+ else
|
|
|
|
+ esw_w32(esw, 0x3f502b28, RT305X_ESW_REG_FPA2);
|
|
|
|
esw_w32(esw, 0x00000000, RT305X_ESW_REG_FPA);
|
|
|
|
|
|
|
|
/* Force Link/Activity on ports */
|
2016-07-13 10:07:08 +00:00
|
|
|
@@ -1361,6 +1369,14 @@ static int esw_probe(struct platform_dev
|
2016-06-29 13:09:09 +00:00
|
|
|
if (port_disable)
|
|
|
|
esw->port_disable = be32_to_cpu(*port_disable);
|
|
|
|
|
|
|
|
+ reg_init = of_get_property(np, "ralink,fct2", NULL);
|
|
|
|
+ if (reg_init)
|
|
|
|
+ esw->reg_initval_fct2 = be32_to_cpu(*reg_init);
|
|
|
|
+
|
|
|
|
+ reg_init = of_get_property(np, "ralink,fpa2", NULL);
|
|
|
|
+ if (reg_init)
|
|
|
|
+ esw->reg_initval_fpa2 = be32_to_cpu(*reg_init);
|
|
|
|
+
|
|
|
|
reg_init = of_get_property(np, "mediatek,led_polarity", NULL);
|
|
|
|
if (reg_init)
|
|
|
|
esw->reg_led_polarity = be32_to_cpu(*reg_init);
|
2016-07-13 10:07:08 +00:00
|
|
|
@@ -1386,6 +1402,18 @@ static int esw_probe(struct platform_dev
|
2016-06-29 13:09:09 +00:00
|
|
|
|
|
|
|
esw_hw_init(esw);
|
|
|
|
|
|
|
|
+ reg_init = of_get_property(np, "ralink,rgmii", NULL);
|
|
|
|
+ if (reg_init && be32_to_cpu(*reg_init) == 1) {
|
|
|
|
+ /*
|
|
|
|
+ * External switch connected to RGMII interface.
|
|
|
|
+ * Unregister the switch device after initialization.
|
|
|
|
+ */
|
|
|
|
+ dev_err(&pdev->dev, "RGMII mode, not exporting switch device.\n");
|
|
|
|
+ unregister_switch(&esw->swdev);
|
|
|
|
+ platform_set_drvdata(pdev, NULL);
|
|
|
|
+ return -ENODEV;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
ret = devm_request_irq(&pdev->dev, esw->irq, esw_interrupt, 0, "esw",
|
|
|
|
esw);
|
|
|
|
|