101-20-net-mediatek-add-support-for-SGMII-1Gbps-auto-negoti.patch 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. From 8e59c3cc700a6efb8db574f3c8e18b6181b4a07d Mon Sep 17 00:00:00 2001
  2. From: Weijie Gao <[email protected]>
  3. Date: Wed, 19 Jul 2023 17:17:13 +0800
  4. Subject: [PATCH 20/29] net: mediatek: add support for SGMII 1Gbps
  5. auto-negotiation mode
  6. Existing SGMII support of mtk-eth is actually a MediaTek-specific
  7. 2.5Gbps high-speed SGMII (HSGMII) which does not support
  8. auto-negotiation mode.
  9. This patch adds SGMII 1Gbps auto-negotiation mode and rename the
  10. existing HSGMII to 2500basex.
  11. Signed-off-by: Weijie Gao <[email protected]>
  12. ---
  13. drivers/net/mtk_eth.c | 46 +++++++++++++++++++++++++++++++++++++------
  14. drivers/net/mtk_eth.h | 2 ++
  15. 2 files changed, 42 insertions(+), 6 deletions(-)
  16. --- a/drivers/net/mtk_eth.c
  17. +++ b/drivers/net/mtk_eth.c
  18. @@ -893,7 +893,7 @@ static int mt7531_setup(struct mtk_eth_p
  19. if (!port5_sgmii)
  20. mt7531_port_rgmii_init(priv, 5);
  21. break;
  22. - case PHY_INTERFACE_MODE_SGMII:
  23. + case PHY_INTERFACE_MODE_2500BASEX:
  24. mt7531_port_sgmii_init(priv, 6);
  25. if (port5_sgmii)
  26. mt7531_port_sgmii_init(priv, 5);
  27. @@ -986,6 +986,7 @@ static void mtk_phy_link_adjust(struct m
  28. (MAC_RX_PKT_LEN_1536 << MAC_RX_PKT_LEN_S) |
  29. MAC_MODE | FORCE_MODE |
  30. MAC_TX_EN | MAC_RX_EN |
  31. + DEL_RXFIFO_CLR |
  32. BKOFF_EN | BACKPR_EN;
  33. switch (priv->phydev->speed) {
  34. @@ -996,6 +997,7 @@ static void mtk_phy_link_adjust(struct m
  35. mcr |= (SPEED_100M << FORCE_SPD_S);
  36. break;
  37. case SPEED_1000:
  38. + case SPEED_2500:
  39. mcr |= (SPEED_1000M << FORCE_SPD_S);
  40. break;
  41. };
  42. @@ -1048,7 +1050,8 @@ static int mtk_phy_start(struct mtk_eth_
  43. return 0;
  44. }
  45. - mtk_phy_link_adjust(priv);
  46. + if (!priv->force_mode)
  47. + mtk_phy_link_adjust(priv);
  48. debug("Speed: %d, %s duplex%s\n", phydev->speed,
  49. (phydev->duplex) ? "full" : "half",
  50. @@ -1076,7 +1079,31 @@ static int mtk_phy_probe(struct udevice
  51. return 0;
  52. }
  53. -static void mtk_sgmii_init(struct mtk_eth_priv *priv)
  54. +static void mtk_sgmii_an_init(struct mtk_eth_priv *priv)
  55. +{
  56. + /* Set SGMII GEN1 speed(1G) */
  57. + clrsetbits_le32(priv->sgmii_base + priv->soc->ana_rgc3,
  58. + SGMSYS_SPEED_2500, 0);
  59. +
  60. + /* Enable SGMII AN */
  61. + setbits_le32(priv->sgmii_base + SGMSYS_PCS_CONTROL_1,
  62. + SGMII_AN_ENABLE);
  63. +
  64. + /* SGMII AN mode setting */
  65. + writel(SGMII_AN_MODE, priv->sgmii_base + SGMSYS_SGMII_MODE);
  66. +
  67. + /* SGMII PN SWAP setting */
  68. + if (priv->pn_swap) {
  69. + setbits_le32(priv->sgmii_base + SGMSYS_QPHY_WRAP_CTRL,
  70. + SGMII_PN_SWAP_TX_RX);
  71. + }
  72. +
  73. + /* Release PHYA power down state */
  74. + clrsetbits_le32(priv->sgmii_base + SGMSYS_QPHY_PWR_STATE_CTRL,
  75. + SGMII_PHYA_PWD, 0);
  76. +}
  77. +
  78. +static void mtk_sgmii_force_init(struct mtk_eth_priv *priv)
  79. {
  80. /* Set SGMII GEN2 speed(2.5G) */
  81. setbits_le32(priv->sgmii_base + priv->soc->ana_rgc3,
  82. @@ -1111,10 +1138,14 @@ static void mtk_mac_init(struct mtk_eth_
  83. ge_mode = GE_MODE_RGMII;
  84. break;
  85. case PHY_INTERFACE_MODE_SGMII:
  86. + case PHY_INTERFACE_MODE_2500BASEX:
  87. ge_mode = GE_MODE_RGMII;
  88. mtk_ethsys_rmw(priv, ETHSYS_SYSCFG0_REG, SYSCFG0_SGMII_SEL_M,
  89. SYSCFG0_SGMII_SEL(priv->gmac_id));
  90. - mtk_sgmii_init(priv);
  91. + if (priv->phy_interface == PHY_INTERFACE_MODE_SGMII)
  92. + mtk_sgmii_an_init(priv);
  93. + else
  94. + mtk_sgmii_force_init(priv);
  95. break;
  96. case PHY_INTERFACE_MODE_MII:
  97. case PHY_INTERFACE_MODE_GMII:
  98. @@ -1148,6 +1179,7 @@ static void mtk_mac_init(struct mtk_eth_
  99. mcr |= SPEED_100M << FORCE_SPD_S;
  100. break;
  101. case SPEED_1000:
  102. + case SPEED_2500:
  103. mcr |= SPEED_1000M << FORCE_SPD_S;
  104. break;
  105. }
  106. @@ -1490,13 +1522,15 @@ static int mtk_eth_of_to_plat(struct ude
  107. priv->duplex = ofnode_read_bool(subnode, "full-duplex");
  108. if (priv->speed != SPEED_10 && priv->speed != SPEED_100 &&
  109. - priv->speed != SPEED_1000) {
  110. + priv->speed != SPEED_1000 && priv->speed != SPEED_2500 &&
  111. + priv->speed != SPEED_10000) {
  112. printf("error: no valid speed set in fixed-link\n");
  113. return -EINVAL;
  114. }
  115. }
  116. - if (priv->phy_interface == PHY_INTERFACE_MODE_SGMII) {
  117. + if (priv->phy_interface == PHY_INTERFACE_MODE_SGMII ||
  118. + priv->phy_interface == PHY_INTERFACE_MODE_2500BASEX) {
  119. /* get corresponding sgmii phandle */
  120. ret = dev_read_phandle_with_args(dev, "mediatek,sgmiisys",
  121. NULL, 0, 0, &args);
  122. --- a/drivers/net/mtk_eth.h
  123. +++ b/drivers/net/mtk_eth.h
  124. @@ -69,6 +69,7 @@ enum mkt_eth_capabilities {
  125. #define SGMII_AN_RESTART BIT(9)
  126. #define SGMSYS_SGMII_MODE 0x20
  127. +#define SGMII_AN_MODE 0x31120103
  128. #define SGMII_FORCE_MODE 0x31120019
  129. #define SGMSYS_QPHY_PWR_STATE_CTRL 0xe8
  130. @@ -168,6 +169,7 @@ enum mkt_eth_capabilities {
  131. #define FORCE_MODE BIT(15)
  132. #define MAC_TX_EN BIT(14)
  133. #define MAC_RX_EN BIT(13)
  134. +#define DEL_RXFIFO_CLR BIT(12)
  135. #define BKOFF_EN BIT(9)
  136. #define BACKPR_EN BIT(8)
  137. #define FORCE_RX_FC BIT(5)