0034-net-dsa-mediatek-add-dual-gmac-support.patch 3.0 KB

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