2
0

788-v6.3-net-dsa-mt7530-use-external-PCS-driver.patch 16 KB

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