790-02-v6.4-net-dsa-mt7530-use-external-PCS-driver.patch 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477
  1. From 05dc5ea089f947a69a5db092ef4cad6a0f3c96ce Mon Sep 17 00:00:00 2001
  2. From: Daniel Golle <[email protected]>
  3. Date: Sun, 19 Mar 2023 12:58:43 +0000
  4. Subject: [PATCH 02/48] net: dsa: mt7530: use external PCS driver
  5. MIME-Version: 1.0
  6. Content-Type: text/plain; charset=UTF-8
  7. Content-Transfer-Encoding: 8bit
  8. Implement regmap access wrappers, for now only to be used by the
  9. pcs-mtk-lynxi driver.
  10. Make use of this external PCS driver and drop the now reduntant
  11. implementation in mt7530.c.
  12. As a nice side effect the SGMII registers can now also more easily be
  13. inspected for debugging via /sys/kernel/debug/regmap.
  14. Tested-by: Bjørn Mork <[email protected]>
  15. Signed-off-by: Daniel Golle <[email protected]>
  16. Tested-by: Frank Wunderlich <[email protected]>
  17. Reviewed-by: Russell King (Oracle) <[email protected]>
  18. Signed-off-by: Jakub Kicinski <[email protected]>
  19. ---
  20. drivers/net/dsa/Kconfig | 1 +
  21. drivers/net/dsa/mt7530.c | 277 ++++++++++-----------------------------
  22. drivers/net/dsa/mt7530.h | 47 +------
  23. 3 files changed, 71 insertions(+), 254 deletions(-)
  24. --- a/drivers/net/dsa/Kconfig
  25. +++ b/drivers/net/dsa/Kconfig
  26. @@ -37,6 +37,7 @@ config NET_DSA_MT7530
  27. tristate "MediaTek MT753x and MT7621 Ethernet switch support"
  28. select NET_DSA_TAG_MTK
  29. select MEDIATEK_GE_PHY
  30. + select PCS_MTK_LYNXI
  31. help
  32. This enables support for the MediaTek MT7530, MT7531, and MT7621
  33. Ethernet switch chips.
  34. --- a/drivers/net/dsa/mt7530.c
  35. +++ b/drivers/net/dsa/mt7530.c
  36. @@ -14,6 +14,7 @@
  37. #include <linux/of_mdio.h>
  38. #include <linux/of_net.h>
  39. #include <linux/of_platform.h>
  40. +#include <linux/pcs/pcs-mtk-lynxi.h>
  41. #include <linux/phylink.h>
  42. #include <linux/regmap.h>
  43. #include <linux/regulator/consumer.h>
  44. @@ -2651,128 +2652,11 @@ static int mt7531_rgmii_setup(struct mt7
  45. return 0;
  46. }
  47. -static void mt7531_pcs_link_up(struct phylink_pcs *pcs, unsigned int mode,
  48. - phy_interface_t interface, int speed, int duplex)
  49. -{
  50. - struct mt7530_priv *priv = pcs_to_mt753x_pcs(pcs)->priv;
  51. - int port = pcs_to_mt753x_pcs(pcs)->port;
  52. - unsigned int val;
  53. -
  54. - /* For adjusting speed and duplex of SGMII force mode. */
  55. - if (interface != PHY_INTERFACE_MODE_SGMII ||
  56. - phylink_autoneg_inband(mode))
  57. - return;
  58. -
  59. - /* SGMII force mode setting */
  60. - val = mt7530_read(priv, MT7531_SGMII_MODE(port));
  61. - val &= ~MT7531_SGMII_IF_MODE_MASK;
  62. -
  63. - switch (speed) {
  64. - case SPEED_10:
  65. - val |= MT7531_SGMII_FORCE_SPEED_10;
  66. - break;
  67. - case SPEED_100:
  68. - val |= MT7531_SGMII_FORCE_SPEED_100;
  69. - break;
  70. - case SPEED_1000:
  71. - val |= MT7531_SGMII_FORCE_SPEED_1000;
  72. - break;
  73. - }
  74. -
  75. - /* MT7531 SGMII 1G force mode can only work in full duplex mode,
  76. - * no matter MT7531_SGMII_FORCE_HALF_DUPLEX is set or not.
  77. - *
  78. - * The speed check is unnecessary as the MAC capabilities apply
  79. - * this restriction. --rmk
  80. - */
  81. - if ((speed == SPEED_10 || speed == SPEED_100) &&
  82. - duplex != DUPLEX_FULL)
  83. - val |= MT7531_SGMII_FORCE_HALF_DUPLEX;
  84. -
  85. - mt7530_write(priv, MT7531_SGMII_MODE(port), val);
  86. -}
  87. -
  88. static bool mt753x_is_mac_port(u32 port)
  89. {
  90. return (port == 5 || port == 6);
  91. }
  92. -static int mt7531_sgmii_setup_mode_force(struct mt7530_priv *priv, u32 port,
  93. - phy_interface_t interface)
  94. -{
  95. - u32 val;
  96. -
  97. - if (!mt753x_is_mac_port(port))
  98. - return -EINVAL;
  99. -
  100. - mt7530_set(priv, MT7531_QPHY_PWR_STATE_CTRL(port),
  101. - MT7531_SGMII_PHYA_PWD);
  102. -
  103. - val = mt7530_read(priv, MT7531_PHYA_CTRL_SIGNAL3(port));
  104. - val &= ~MT7531_RG_TPHY_SPEED_MASK;
  105. - /* Setup 2.5 times faster clock for 2.5Gbps data speeds with 10B/8B
  106. - * encoding.
  107. - */
  108. - val |= (interface == PHY_INTERFACE_MODE_2500BASEX) ?
  109. - MT7531_RG_TPHY_SPEED_3_125G : MT7531_RG_TPHY_SPEED_1_25G;
  110. - mt7530_write(priv, MT7531_PHYA_CTRL_SIGNAL3(port), val);
  111. -
  112. - mt7530_clear(priv, MT7531_PCS_CONTROL_1(port), MT7531_SGMII_AN_ENABLE);
  113. -
  114. - /* MT7531 SGMII 1G and 2.5G force mode can only work in full duplex
  115. - * mode, no matter MT7531_SGMII_FORCE_HALF_DUPLEX is set or not.
  116. - */
  117. - mt7530_rmw(priv, MT7531_SGMII_MODE(port),
  118. - MT7531_SGMII_IF_MODE_MASK | MT7531_SGMII_REMOTE_FAULT_DIS,
  119. - MT7531_SGMII_FORCE_SPEED_1000);
  120. -
  121. - mt7530_write(priv, MT7531_QPHY_PWR_STATE_CTRL(port), 0);
  122. -
  123. - return 0;
  124. -}
  125. -
  126. -static int mt7531_sgmii_setup_mode_an(struct mt7530_priv *priv, int port,
  127. - phy_interface_t interface)
  128. -{
  129. - if (!mt753x_is_mac_port(port))
  130. - return -EINVAL;
  131. -
  132. - mt7530_set(priv, MT7531_QPHY_PWR_STATE_CTRL(port),
  133. - MT7531_SGMII_PHYA_PWD);
  134. -
  135. - mt7530_rmw(priv, MT7531_PHYA_CTRL_SIGNAL3(port),
  136. - MT7531_RG_TPHY_SPEED_MASK, MT7531_RG_TPHY_SPEED_1_25G);
  137. -
  138. - mt7530_set(priv, MT7531_SGMII_MODE(port),
  139. - MT7531_SGMII_REMOTE_FAULT_DIS |
  140. - MT7531_SGMII_SPEED_DUPLEX_AN);
  141. -
  142. - mt7530_rmw(priv, MT7531_PCS_SPEED_ABILITY(port),
  143. - MT7531_SGMII_TX_CONFIG_MASK, 1);
  144. -
  145. - mt7530_set(priv, MT7531_PCS_CONTROL_1(port), MT7531_SGMII_AN_ENABLE);
  146. -
  147. - mt7530_set(priv, MT7531_PCS_CONTROL_1(port), MT7531_SGMII_AN_RESTART);
  148. -
  149. - mt7530_write(priv, MT7531_QPHY_PWR_STATE_CTRL(port), 0);
  150. -
  151. - return 0;
  152. -}
  153. -
  154. -static void mt7531_pcs_an_restart(struct phylink_pcs *pcs)
  155. -{
  156. - struct mt7530_priv *priv = pcs_to_mt753x_pcs(pcs)->priv;
  157. - int port = pcs_to_mt753x_pcs(pcs)->port;
  158. - u32 val;
  159. -
  160. - /* Only restart AN when AN is enabled */
  161. - val = mt7530_read(priv, MT7531_PCS_CONTROL_1(port));
  162. - if (val & MT7531_SGMII_AN_ENABLE) {
  163. - val |= MT7531_SGMII_AN_RESTART;
  164. - mt7530_write(priv, MT7531_PCS_CONTROL_1(port), val);
  165. - }
  166. -}
  167. -
  168. static int
  169. mt7531_mac_config(struct dsa_switch *ds, int port, unsigned int mode,
  170. phy_interface_t interface)
  171. @@ -2795,11 +2679,11 @@ mt7531_mac_config(struct dsa_switch *ds,
  172. phydev = dp->slave->phydev;
  173. return mt7531_rgmii_setup(priv, port, interface, phydev);
  174. case PHY_INTERFACE_MODE_SGMII:
  175. - return mt7531_sgmii_setup_mode_an(priv, port, interface);
  176. case PHY_INTERFACE_MODE_NA:
  177. case PHY_INTERFACE_MODE_1000BASEX:
  178. case PHY_INTERFACE_MODE_2500BASEX:
  179. - return mt7531_sgmii_setup_mode_force(priv, port, interface);
  180. + /* handled in SGMII PCS driver */
  181. + return 0;
  182. default:
  183. return -EINVAL;
  184. }
  185. @@ -2824,11 +2708,11 @@ mt753x_phylink_mac_select_pcs(struct dsa
  186. switch (interface) {
  187. case PHY_INTERFACE_MODE_TRGMII:
  188. + return &priv->pcs[port].pcs;
  189. case PHY_INTERFACE_MODE_SGMII:
  190. case PHY_INTERFACE_MODE_1000BASEX:
  191. case PHY_INTERFACE_MODE_2500BASEX:
  192. - return &priv->pcs[port].pcs;
  193. -
  194. + return priv->ports[port].sgmii_pcs;
  195. default:
  196. return NULL;
  197. }
  198. @@ -3066,86 +2950,6 @@ static void mt7530_pcs_get_state(struct
  199. state->pause |= MLO_PAUSE_TX;
  200. }
  201. -static int
  202. -mt7531_sgmii_pcs_get_state_an(struct mt7530_priv *priv, int port,
  203. - struct phylink_link_state *state)
  204. -{
  205. - u32 status, val;
  206. - u16 config_reg;
  207. -
  208. - status = mt7530_read(priv, MT7531_PCS_CONTROL_1(port));
  209. - state->link = !!(status & MT7531_SGMII_LINK_STATUS);
  210. - state->an_complete = !!(status & MT7531_SGMII_AN_COMPLETE);
  211. - if (state->interface == PHY_INTERFACE_MODE_SGMII &&
  212. - (status & MT7531_SGMII_AN_ENABLE)) {
  213. - val = mt7530_read(priv, MT7531_PCS_SPEED_ABILITY(port));
  214. - config_reg = val >> 16;
  215. -
  216. - switch (config_reg & LPA_SGMII_SPD_MASK) {
  217. - case LPA_SGMII_1000:
  218. - state->speed = SPEED_1000;
  219. - break;
  220. - case LPA_SGMII_100:
  221. - state->speed = SPEED_100;
  222. - break;
  223. - case LPA_SGMII_10:
  224. - state->speed = SPEED_10;
  225. - break;
  226. - default:
  227. - dev_err(priv->dev, "invalid sgmii PHY speed\n");
  228. - state->link = false;
  229. - return -EINVAL;
  230. - }
  231. -
  232. - if (config_reg & LPA_SGMII_FULL_DUPLEX)
  233. - state->duplex = DUPLEX_FULL;
  234. - else
  235. - state->duplex = DUPLEX_HALF;
  236. - }
  237. -
  238. - return 0;
  239. -}
  240. -
  241. -static void
  242. -mt7531_sgmii_pcs_get_state_inband(struct mt7530_priv *priv, int port,
  243. - struct phylink_link_state *state)
  244. -{
  245. - unsigned int val;
  246. -
  247. - val = mt7530_read(priv, MT7531_PCS_CONTROL_1(port));
  248. - state->link = !!(val & MT7531_SGMII_LINK_STATUS);
  249. - if (!state->link)
  250. - return;
  251. -
  252. - state->an_complete = state->link;
  253. -
  254. - if (state->interface == PHY_INTERFACE_MODE_2500BASEX)
  255. - state->speed = SPEED_2500;
  256. - else
  257. - state->speed = SPEED_1000;
  258. -
  259. - state->duplex = DUPLEX_FULL;
  260. - state->pause = MLO_PAUSE_NONE;
  261. -}
  262. -
  263. -static void mt7531_pcs_get_state(struct phylink_pcs *pcs,
  264. - struct phylink_link_state *state)
  265. -{
  266. - struct mt7530_priv *priv = pcs_to_mt753x_pcs(pcs)->priv;
  267. - int port = pcs_to_mt753x_pcs(pcs)->port;
  268. -
  269. - if (state->interface == PHY_INTERFACE_MODE_SGMII) {
  270. - mt7531_sgmii_pcs_get_state_an(priv, port, state);
  271. - return;
  272. - } else if ((state->interface == PHY_INTERFACE_MODE_1000BASEX) ||
  273. - (state->interface == PHY_INTERFACE_MODE_2500BASEX)) {
  274. - mt7531_sgmii_pcs_get_state_inband(priv, port, state);
  275. - return;
  276. - }
  277. -
  278. - state->link = false;
  279. -}
  280. -
  281. static int mt753x_pcs_config(struct phylink_pcs *pcs, unsigned int mode,
  282. phy_interface_t interface,
  283. const unsigned long *advertising,
  284. @@ -3165,18 +2969,57 @@ static const struct phylink_pcs_ops mt75
  285. .pcs_an_restart = mt7530_pcs_an_restart,
  286. };
  287. -static const struct phylink_pcs_ops mt7531_pcs_ops = {
  288. - .pcs_validate = mt753x_pcs_validate,
  289. - .pcs_get_state = mt7531_pcs_get_state,
  290. - .pcs_config = mt753x_pcs_config,
  291. - .pcs_an_restart = mt7531_pcs_an_restart,
  292. - .pcs_link_up = mt7531_pcs_link_up,
  293. +static int mt7530_regmap_read(void *context, unsigned int reg, unsigned int *val)
  294. +{
  295. + struct mt7530_priv *priv = context;
  296. +
  297. + *val = mt7530_read(priv, reg);
  298. + return 0;
  299. +};
  300. +
  301. +static int mt7530_regmap_write(void *context, unsigned int reg, unsigned int val)
  302. +{
  303. + struct mt7530_priv *priv = context;
  304. +
  305. + mt7530_write(priv, reg, val);
  306. + return 0;
  307. +};
  308. +
  309. +static int mt7530_regmap_update_bits(void *context, unsigned int reg,
  310. + unsigned int mask, unsigned int val)
  311. +{
  312. + struct mt7530_priv *priv = context;
  313. +
  314. + mt7530_rmw(priv, reg, mask, val);
  315. + return 0;
  316. +};
  317. +
  318. +static const struct regmap_bus mt7531_regmap_bus = {
  319. + .reg_write = mt7530_regmap_write,
  320. + .reg_read = mt7530_regmap_read,
  321. + .reg_update_bits = mt7530_regmap_update_bits,
  322. +};
  323. +
  324. +#define MT7531_PCS_REGMAP_CONFIG(_name, _reg_base) \
  325. + { \
  326. + .name = _name, \
  327. + .reg_bits = 16, \
  328. + .val_bits = 32, \
  329. + .reg_stride = 4, \
  330. + .reg_base = _reg_base, \
  331. + .max_register = 0x17c, \
  332. + }
  333. +
  334. +static const struct regmap_config mt7531_pcs_config[] = {
  335. + MT7531_PCS_REGMAP_CONFIG("port5", MT7531_SGMII_REG_BASE(5)),
  336. + MT7531_PCS_REGMAP_CONFIG("port6", MT7531_SGMII_REG_BASE(6)),
  337. };
  338. static int
  339. mt753x_setup(struct dsa_switch *ds)
  340. {
  341. struct mt7530_priv *priv = ds->priv;
  342. + struct regmap *regmap;
  343. int i, ret;
  344. /* Initialise the PCS devices */
  345. @@ -3184,8 +3027,6 @@ mt753x_setup(struct dsa_switch *ds)
  346. priv->pcs[i].pcs.ops = priv->info->pcs_ops;
  347. priv->pcs[i].priv = priv;
  348. priv->pcs[i].port = i;
  349. - if (mt753x_is_mac_port(i))
  350. - priv->pcs[i].pcs.poll = 1;
  351. }
  352. ret = priv->info->sw_setup(ds);
  353. @@ -3200,6 +3041,16 @@ mt753x_setup(struct dsa_switch *ds)
  354. if (ret && priv->irq)
  355. mt7530_free_irq_common(priv);
  356. + if (priv->id == ID_MT7531)
  357. + for (i = 0; i < 2; i++) {
  358. + regmap = devm_regmap_init(ds->dev,
  359. + &mt7531_regmap_bus, priv,
  360. + &mt7531_pcs_config[i]);
  361. + priv->ports[5 + i].sgmii_pcs =
  362. + mtk_pcs_lynxi_create(ds->dev, regmap,
  363. + MT7531_PHYA_CTRL_SIGNAL3, 0);
  364. + }
  365. +
  366. return ret;
  367. }
  368. @@ -3291,7 +3142,7 @@ static const struct mt753x_info mt753x_t
  369. },
  370. [ID_MT7531] = {
  371. .id = ID_MT7531,
  372. - .pcs_ops = &mt7531_pcs_ops,
  373. + .pcs_ops = &mt7530_pcs_ops,
  374. .sw_setup = mt7531_setup,
  375. .phy_read = mt7531_ind_phy_read,
  376. .phy_write = mt7531_ind_phy_write,
  377. @@ -3399,7 +3250,7 @@ static void
  378. mt7530_remove(struct mdio_device *mdiodev)
  379. {
  380. struct mt7530_priv *priv = dev_get_drvdata(&mdiodev->dev);
  381. - int ret = 0;
  382. + int ret = 0, i;
  383. if (!priv)
  384. return;
  385. @@ -3418,6 +3269,10 @@ mt7530_remove(struct mdio_device *mdiode
  386. mt7530_free_irq(priv);
  387. dsa_unregister_switch(priv->ds);
  388. +
  389. + for (i = 0; i < 2; ++i)
  390. + mtk_pcs_lynxi_destroy(priv->ports[5 + i].sgmii_pcs);
  391. +
  392. mutex_destroy(&priv->reg_mutex);
  393. }
  394. --- a/drivers/net/dsa/mt7530.h
  395. +++ b/drivers/net/dsa/mt7530.h
  396. @@ -391,47 +391,8 @@ enum mt7530_vlan_port_acc_frm {
  397. CCR_TX_OCT_CNT_BAD)
  398. /* MT7531 SGMII register group */
  399. -#define MT7531_SGMII_REG_BASE 0x5000
  400. -#define MT7531_SGMII_REG(p, r) (MT7531_SGMII_REG_BASE + \
  401. - ((p) - 5) * 0x1000 + (r))
  402. -
  403. -/* Register forSGMII PCS_CONTROL_1 */
  404. -#define MT7531_PCS_CONTROL_1(p) MT7531_SGMII_REG(p, 0x00)
  405. -#define MT7531_SGMII_LINK_STATUS BIT(18)
  406. -#define MT7531_SGMII_AN_ENABLE BIT(12)
  407. -#define MT7531_SGMII_AN_RESTART BIT(9)
  408. -#define MT7531_SGMII_AN_COMPLETE BIT(21)
  409. -
  410. -/* Register for SGMII PCS_SPPED_ABILITY */
  411. -#define MT7531_PCS_SPEED_ABILITY(p) MT7531_SGMII_REG(p, 0x08)
  412. -#define MT7531_SGMII_TX_CONFIG_MASK GENMASK(15, 0)
  413. -#define MT7531_SGMII_TX_CONFIG BIT(0)
  414. -
  415. -/* Register for SGMII_MODE */
  416. -#define MT7531_SGMII_MODE(p) MT7531_SGMII_REG(p, 0x20)
  417. -#define MT7531_SGMII_REMOTE_FAULT_DIS BIT(8)
  418. -#define MT7531_SGMII_IF_MODE_MASK GENMASK(5, 1)
  419. -#define MT7531_SGMII_FORCE_DUPLEX BIT(4)
  420. -#define MT7531_SGMII_FORCE_SPEED_MASK GENMASK(3, 2)
  421. -#define MT7531_SGMII_FORCE_SPEED_1000 BIT(3)
  422. -#define MT7531_SGMII_FORCE_SPEED_100 BIT(2)
  423. -#define MT7531_SGMII_FORCE_SPEED_10 0
  424. -#define MT7531_SGMII_SPEED_DUPLEX_AN BIT(1)
  425. -
  426. -enum mt7531_sgmii_force_duplex {
  427. - MT7531_SGMII_FORCE_FULL_DUPLEX = 0,
  428. - MT7531_SGMII_FORCE_HALF_DUPLEX = 0x10,
  429. -};
  430. -
  431. -/* Fields of QPHY_PWR_STATE_CTRL */
  432. -#define MT7531_QPHY_PWR_STATE_CTRL(p) MT7531_SGMII_REG(p, 0xe8)
  433. -#define MT7531_SGMII_PHYA_PWD BIT(4)
  434. -
  435. -/* Values of SGMII SPEED */
  436. -#define MT7531_PHYA_CTRL_SIGNAL3(p) MT7531_SGMII_REG(p, 0x128)
  437. -#define MT7531_RG_TPHY_SPEED_MASK (BIT(2) | BIT(3))
  438. -#define MT7531_RG_TPHY_SPEED_1_25G 0x0
  439. -#define MT7531_RG_TPHY_SPEED_3_125G BIT(2)
  440. +#define MT7531_SGMII_REG_BASE(p) (0x5000 + ((p) - 5) * 0x1000)
  441. +#define MT7531_PHYA_CTRL_SIGNAL3 0x128
  442. /* Register for system reset */
  443. #define MT7530_SYS_CTRL 0x7000
  444. @@ -730,13 +691,13 @@ struct mt7530_fdb {
  445. * @pm: The matrix used to show all connections with the port.
  446. * @pvid: The VLAN specified is to be considered a PVID at ingress. Any
  447. * untagged frames will be assigned to the related VLAN.
  448. - * @vlan_filtering: The flags indicating whether the port that can recognize
  449. - * VLAN-tagged frames.
  450. + * @sgmii_pcs: Pointer to PCS instance for SerDes ports
  451. */
  452. struct mt7530_port {
  453. bool enable;
  454. u32 pm;
  455. u16 pvid;
  456. + struct phylink_pcs *sgmii_pcs;
  457. };
  458. /* Port 5 interface select definitions */