ipq806x: add support for GL.iNet GL-B1300
[openwrt/openwrt.git] / target / linux / mediatek / patches-4.9 / 0034-net-dsa-mediatek-add-dual-gmac-support.patch
1 From dcb751a52b2ee69c16db2fef8f92a96ab13b6bb4 Mon Sep 17 00:00:00 2001
2 From: John Crispin <john@phrozen.org>
3 Date: Thu, 10 Aug 2017 14:45:34 +0200
4 Subject: [PATCH 34/57] net: dsa: mediatek: add dual gmac support
5
6 Signed-off-by: John Crispin <john@phrozen.org>
7 ---
8 drivers/net/dsa/mt7530.c | 22 ++++++++++++++++------
9 1 file changed, 16 insertions(+), 6 deletions(-)
10
11 --- a/drivers/net/dsa/mt7530.c
12 +++ b/drivers/net/dsa/mt7530.c
13 @@ -627,7 +627,7 @@ mt7530_setup(struct dsa_switch *ds)
14
15 /* Enable Port 6 only; P5 as GMAC5 which currently is not supported */
16 val = mt7530_read(priv, MT7530_MHWTRAP);
17 - val &= ~MHWTRAP_P6_DIS & ~MHWTRAP_PHY_ACCESS;
18 + val &= ~MHWTRAP_P5_DIS & ~MHWTRAP_P6_DIS & ~MHWTRAP_PHY_ACCESS;
19 val |= MHWTRAP_MANUAL;
20 if (!dsa_is_cpu_port(ds, 5)) {
21 val |= MHWTRAP_P5_DIS;
22 @@ -735,6 +735,9 @@ static int
23 mt7530_cpu_port_enable(struct mt7530_priv *priv,
24 int port)
25 {
26 + u8 port_mask = 0;
27 + int i;
28 +
29 /* Enable Mediatek header mode on the cpu port */
30 mt7530_write(priv, MT7530_PVC_P(port),
31 PORT_SPEC_TAG);
32 @@ -751,8 +754,12 @@ mt7530_cpu_port_enable(struct mt7530_pri
33 /* CPU port gets connected to all user ports of
34 * the switch
35 */
36 + for (i = 0; i < MT7530_NUM_PORTS; i++)
37 + if ((priv->ds->enabled_port_mask & BIT(i)) &&
38 + (dsa_port_upstream_port(priv->ds, i) == port))
39 + port_mask |= BIT(i);
40 mt7530_write(priv, MT7530_PCR_P(port),
41 - PCR_MATRIX(priv->ds->enabled_port_mask));
42 + PCR_MATRIX(port_mask));
43
44 return 0;
45 }
46 @@ -762,6 +769,7 @@ mt7530_port_enable(struct dsa_switch *ds
47 struct phy_device *phy)
48 {
49 struct mt7530_priv *priv = ds->priv;
50 + u8 upstream = dsa_port_upstream_port(ds, port);
51
52 mutex_lock(&priv->reg_mutex);
53
54 @@ -772,7 +780,7 @@ mt7530_port_enable(struct dsa_switch *ds
55 * restore the port matrix if the port is the member of a certain
56 * bridge.
57 */
58 - priv->ports[port].pm |= PCR_MATRIX(BIT(MT7530_CPU_PORT));
59 + priv->ports[port].pm |= PCR_MATRIX(BIT(upstream));
60 priv->ports[port].enable = true;
61 mt7530_rmw(priv, MT7530_PCR_P(port), PCR_MATRIX_MASK,
62 priv->ports[port].pm);
63 @@ -835,7 +843,8 @@ mt7530_port_bridge_join(struct dsa_switc
64 struct net_device *bridge)
65 {
66 struct mt7530_priv *priv = ds->priv;
67 - u32 port_bitmap = BIT(MT7530_CPU_PORT);
68 + u8 upstream = dsa_port_upstream_port(ds, port);
69 + u32 port_bitmap = BIT(upstream);
70 int i;
71
72 mutex_lock(&priv->reg_mutex);
73 @@ -873,6 +882,7 @@ static void
74 mt7530_port_bridge_leave(struct dsa_switch *ds, int port)
75 {
76 struct mt7530_priv *priv = ds->priv;
77 + u8 upstream = dsa_port_upstream_port(ds, port);
78 int i;
79
80 mutex_lock(&priv->reg_mutex);
81 @@ -898,8 +908,8 @@ mt7530_port_bridge_leave(struct dsa_swit
82 priv->bridge_dev[port] = NULL;
83 if (priv->ports[port].enable)
84 mt7530_rmw(priv, MT7530_PCR_P(port), PCR_MATRIX_MASK,
85 - PCR_MATRIX(BIT(MT7530_CPU_PORT)));
86 - priv->ports[port].pm = PCR_MATRIX(BIT(MT7530_CPU_PORT));
87 + PCR_MATRIX(BIT(upstream)));
88 + priv->ports[port].pm = PCR_MATRIX(BIT(upstream));
89
90 mutex_unlock(&priv->reg_mutex);
91 }