forked from Openwrt/openwrt
9e86e0b33b
Changelogs: https://cdn.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.1.67 https://cdn.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.1.68 https://cdn.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.1.69 Upstreamed patches: target/linux/generic/backport-6.1/740-v6.9-01-netfilter-flowtable-validate-pppoe-header.patch [1] target/linux/generic/backport-6.1/740-v6.9-02-netfilter-flowtable-incorrect-pppoe-tuple.patch [2] target/linux/generic/backport-6.1/790-48-STABLE-net-dsa-mt7530-trap-link-local-frames-regardless-of-.patch [3] target/linux/generic/backport-6.1/790-50-v6.10-net-dsa-mt7530-fix-mirroring-frames-received-on-loca.patch [4] target/linux/generic/backport-6.1/790-16-v6.4-net-dsa-mt7530-set-all-CPU-ports-in-MT7531_CPU_PMAP.patch [5] target/linux/generic/backport-6.1/790-46-v6.9-net-dsa-mt7530-fix-improper-frames-on-all-25MHz-and-.patch [6] target/linux/generic/backport-6.1/790-47-v6.10-net-dsa-mt7530-fix-enabling-EEE-on-MT7531-switch-on-.patch [7] target/linux/mediatek/patches-6.1/220-v6.3-clk-mediatek-clk-gate-Propagate-struct-device-with-m.patch [8] target/linux/mediatek/patches-6.1/222-v6.3-clk-mediatek-clk-mtk-Propagate-struct-device-for-com.patch [9] target/linux/mediatek/patches-6.1/223-v6.3-clk-mediatek-clk-mux-Propagate-struct-device-for-mtk.patch [10] target/linux/mediatek/patches-6.1/226-v6.3-clk-mediatek-clk-mtk-Extend-mtk_clk_simple_probe.patch [11] Symbol changes: MITIGATION_SPECTRE_BHI (new) [12] SPECTRE_BHI_{ON,OFF} (deprecated) [12] References: [1] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.1.89&id=8bf7c76a2a207ca2b4cfda0a279192adf27678d7 [2] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.1.89&id=f1c3c61701a0b12f4906152c1626a5de580ea3d2 [3] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.1.89&id=19643bf8c9b5bb5eea5163bf2f6a3eee6fb5b99b [4] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.1.89&id=e86c9db58eba290e858e2bb80efcde9e3973a5ef [5] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.1.89&id=013c787d231188a6408e2991150d3c9bf9a2aa0b [6] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.1.89&id=41a004ffba9b1fd8a5a7128ebd0dfa3ed39c3316 [7] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.1.89&id=7d51db455ca03e5270cc585a75a674abd063fa6c [8] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.1.89&id=082b831488a41257b7ac7ffa1d80a0b60d98394d [9] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.1.89&id=6f5f72a684a2823f21efbfd20c7e4b528c44a781 [10] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.1.89&id=a4fe8813a7868ba5867e42e60de7a2b8baac30ff [11] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.1.89&id=c1d87d56af063c87961511ee25f6b07a5676d27d [12] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.1.89&id=d844df110084ef8bd950a52194865f3f63b561ca Signed-off-by: Shiji Yang <yangshiji66@qq.com>
478 lines
14 KiB
Diff
478 lines
14 KiB
Diff
From 05dc5ea089f947a69a5db092ef4cad6a0f3c96ce Mon Sep 17 00:00:00 2001
|
|
From: Daniel Golle <daniel@makrotopia.org>
|
|
Date: Sun, 19 Mar 2023 12:58:43 +0000
|
|
Subject: [PATCH 02/48] net: dsa: mt7530: use external PCS driver
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
Implement regmap access wrappers, for now only to be used by the
|
|
pcs-mtk-lynxi driver.
|
|
Make use of this external PCS driver and drop the now reduntant
|
|
implementation in mt7530.c.
|
|
As a nice side effect the SGMII registers can now also more easily be
|
|
inspected for debugging via /sys/kernel/debug/regmap.
|
|
|
|
Tested-by: Bjørn Mork <bjorn@mork.no>
|
|
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|
Tested-by: Frank Wunderlich <frank-w@public-files.de>
|
|
Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
|
|
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|
---
|
|
drivers/net/dsa/Kconfig | 1 +
|
|
drivers/net/dsa/mt7530.c | 277 ++++++++++-----------------------------
|
|
drivers/net/dsa/mt7530.h | 47 +------
|
|
3 files changed, 71 insertions(+), 254 deletions(-)
|
|
|
|
--- a/drivers/net/dsa/Kconfig
|
|
+++ b/drivers/net/dsa/Kconfig
|
|
@@ -37,6 +37,7 @@ config NET_DSA_MT7530
|
|
tristate "MediaTek MT753x and MT7621 Ethernet switch support"
|
|
select NET_DSA_TAG_MTK
|
|
select MEDIATEK_GE_PHY
|
|
+ select PCS_MTK_LYNXI
|
|
help
|
|
This enables support for the MediaTek MT7530, MT7531, and MT7621
|
|
Ethernet switch chips.
|
|
--- a/drivers/net/dsa/mt7530.c
|
|
+++ b/drivers/net/dsa/mt7530.c
|
|
@@ -14,6 +14,7 @@
|
|
#include <linux/of_mdio.h>
|
|
#include <linux/of_net.h>
|
|
#include <linux/of_platform.h>
|
|
+#include <linux/pcs/pcs-mtk-lynxi.h>
|
|
#include <linux/phylink.h>
|
|
#include <linux/regmap.h>
|
|
#include <linux/regulator/consumer.h>
|
|
@@ -2839,128 +2840,11 @@ static int mt7531_rgmii_setup(struct mt7
|
|
return 0;
|
|
}
|
|
|
|
-static void mt7531_pcs_link_up(struct phylink_pcs *pcs, unsigned int mode,
|
|
- phy_interface_t interface, int speed, int duplex)
|
|
-{
|
|
- struct mt7530_priv *priv = pcs_to_mt753x_pcs(pcs)->priv;
|
|
- int port = pcs_to_mt753x_pcs(pcs)->port;
|
|
- unsigned int val;
|
|
-
|
|
- /* For adjusting speed and duplex of SGMII force mode. */
|
|
- if (interface != PHY_INTERFACE_MODE_SGMII ||
|
|
- phylink_autoneg_inband(mode))
|
|
- return;
|
|
-
|
|
- /* SGMII force mode setting */
|
|
- val = mt7530_read(priv, MT7531_SGMII_MODE(port));
|
|
- val &= ~MT7531_SGMII_IF_MODE_MASK;
|
|
-
|
|
- switch (speed) {
|
|
- case SPEED_10:
|
|
- val |= MT7531_SGMII_FORCE_SPEED_10;
|
|
- break;
|
|
- case SPEED_100:
|
|
- val |= MT7531_SGMII_FORCE_SPEED_100;
|
|
- break;
|
|
- case SPEED_1000:
|
|
- val |= MT7531_SGMII_FORCE_SPEED_1000;
|
|
- break;
|
|
- }
|
|
-
|
|
- /* MT7531 SGMII 1G force mode can only work in full duplex mode,
|
|
- * no matter MT7531_SGMII_FORCE_HALF_DUPLEX is set or not.
|
|
- *
|
|
- * The speed check is unnecessary as the MAC capabilities apply
|
|
- * this restriction. --rmk
|
|
- */
|
|
- if ((speed == SPEED_10 || speed == SPEED_100) &&
|
|
- duplex != DUPLEX_FULL)
|
|
- val |= MT7531_SGMII_FORCE_HALF_DUPLEX;
|
|
-
|
|
- mt7530_write(priv, MT7531_SGMII_MODE(port), val);
|
|
-}
|
|
-
|
|
static bool mt753x_is_mac_port(u32 port)
|
|
{
|
|
return (port == 5 || port == 6);
|
|
}
|
|
|
|
-static int mt7531_sgmii_setup_mode_force(struct mt7530_priv *priv, u32 port,
|
|
- phy_interface_t interface)
|
|
-{
|
|
- u32 val;
|
|
-
|
|
- if (!mt753x_is_mac_port(port))
|
|
- return -EINVAL;
|
|
-
|
|
- mt7530_set(priv, MT7531_QPHY_PWR_STATE_CTRL(port),
|
|
- MT7531_SGMII_PHYA_PWD);
|
|
-
|
|
- val = mt7530_read(priv, MT7531_PHYA_CTRL_SIGNAL3(port));
|
|
- val &= ~MT7531_RG_TPHY_SPEED_MASK;
|
|
- /* Setup 2.5 times faster clock for 2.5Gbps data speeds with 10B/8B
|
|
- * encoding.
|
|
- */
|
|
- val |= (interface == PHY_INTERFACE_MODE_2500BASEX) ?
|
|
- MT7531_RG_TPHY_SPEED_3_125G : MT7531_RG_TPHY_SPEED_1_25G;
|
|
- mt7530_write(priv, MT7531_PHYA_CTRL_SIGNAL3(port), val);
|
|
-
|
|
- mt7530_clear(priv, MT7531_PCS_CONTROL_1(port), MT7531_SGMII_AN_ENABLE);
|
|
-
|
|
- /* MT7531 SGMII 1G and 2.5G force mode can only work in full duplex
|
|
- * mode, no matter MT7531_SGMII_FORCE_HALF_DUPLEX is set or not.
|
|
- */
|
|
- mt7530_rmw(priv, MT7531_SGMII_MODE(port),
|
|
- MT7531_SGMII_IF_MODE_MASK | MT7531_SGMII_REMOTE_FAULT_DIS,
|
|
- MT7531_SGMII_FORCE_SPEED_1000);
|
|
-
|
|
- mt7530_write(priv, MT7531_QPHY_PWR_STATE_CTRL(port), 0);
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int mt7531_sgmii_setup_mode_an(struct mt7530_priv *priv, int port,
|
|
- phy_interface_t interface)
|
|
-{
|
|
- if (!mt753x_is_mac_port(port))
|
|
- return -EINVAL;
|
|
-
|
|
- mt7530_set(priv, MT7531_QPHY_PWR_STATE_CTRL(port),
|
|
- MT7531_SGMII_PHYA_PWD);
|
|
-
|
|
- mt7530_rmw(priv, MT7531_PHYA_CTRL_SIGNAL3(port),
|
|
- MT7531_RG_TPHY_SPEED_MASK, MT7531_RG_TPHY_SPEED_1_25G);
|
|
-
|
|
- mt7530_set(priv, MT7531_SGMII_MODE(port),
|
|
- MT7531_SGMII_REMOTE_FAULT_DIS |
|
|
- MT7531_SGMII_SPEED_DUPLEX_AN);
|
|
-
|
|
- mt7530_rmw(priv, MT7531_PCS_SPEED_ABILITY(port),
|
|
- MT7531_SGMII_TX_CONFIG_MASK, 1);
|
|
-
|
|
- mt7530_set(priv, MT7531_PCS_CONTROL_1(port), MT7531_SGMII_AN_ENABLE);
|
|
-
|
|
- mt7530_set(priv, MT7531_PCS_CONTROL_1(port), MT7531_SGMII_AN_RESTART);
|
|
-
|
|
- mt7530_write(priv, MT7531_QPHY_PWR_STATE_CTRL(port), 0);
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static void mt7531_pcs_an_restart(struct phylink_pcs *pcs)
|
|
-{
|
|
- struct mt7530_priv *priv = pcs_to_mt753x_pcs(pcs)->priv;
|
|
- int port = pcs_to_mt753x_pcs(pcs)->port;
|
|
- u32 val;
|
|
-
|
|
- /* Only restart AN when AN is enabled */
|
|
- val = mt7530_read(priv, MT7531_PCS_CONTROL_1(port));
|
|
- if (val & MT7531_SGMII_AN_ENABLE) {
|
|
- val |= MT7531_SGMII_AN_RESTART;
|
|
- mt7530_write(priv, MT7531_PCS_CONTROL_1(port), val);
|
|
- }
|
|
-}
|
|
-
|
|
static int
|
|
mt7531_mac_config(struct dsa_switch *ds, int port, unsigned int mode,
|
|
phy_interface_t interface)
|
|
@@ -2983,11 +2867,11 @@ mt7531_mac_config(struct dsa_switch *ds,
|
|
phydev = dp->slave->phydev;
|
|
return mt7531_rgmii_setup(priv, port, interface, phydev);
|
|
case PHY_INTERFACE_MODE_SGMII:
|
|
- return mt7531_sgmii_setup_mode_an(priv, port, interface);
|
|
case PHY_INTERFACE_MODE_NA:
|
|
case PHY_INTERFACE_MODE_1000BASEX:
|
|
case PHY_INTERFACE_MODE_2500BASEX:
|
|
- return mt7531_sgmii_setup_mode_force(priv, port, interface);
|
|
+ /* handled in SGMII PCS driver */
|
|
+ return 0;
|
|
default:
|
|
return -EINVAL;
|
|
}
|
|
@@ -3012,11 +2896,11 @@ mt753x_phylink_mac_select_pcs(struct dsa
|
|
|
|
switch (interface) {
|
|
case PHY_INTERFACE_MODE_TRGMII:
|
|
+ return &priv->pcs[port].pcs;
|
|
case PHY_INTERFACE_MODE_SGMII:
|
|
case PHY_INTERFACE_MODE_1000BASEX:
|
|
case PHY_INTERFACE_MODE_2500BASEX:
|
|
- return &priv->pcs[port].pcs;
|
|
-
|
|
+ return priv->ports[port].sgmii_pcs;
|
|
default:
|
|
return NULL;
|
|
}
|
|
@@ -3254,86 +3138,6 @@ static void mt7530_pcs_get_state(struct
|
|
state->pause |= MLO_PAUSE_TX;
|
|
}
|
|
|
|
-static int
|
|
-mt7531_sgmii_pcs_get_state_an(struct mt7530_priv *priv, int port,
|
|
- struct phylink_link_state *state)
|
|
-{
|
|
- u32 status, val;
|
|
- u16 config_reg;
|
|
-
|
|
- status = mt7530_read(priv, MT7531_PCS_CONTROL_1(port));
|
|
- state->link = !!(status & MT7531_SGMII_LINK_STATUS);
|
|
- state->an_complete = !!(status & MT7531_SGMII_AN_COMPLETE);
|
|
- if (state->interface == PHY_INTERFACE_MODE_SGMII &&
|
|
- (status & MT7531_SGMII_AN_ENABLE)) {
|
|
- val = mt7530_read(priv, MT7531_PCS_SPEED_ABILITY(port));
|
|
- config_reg = val >> 16;
|
|
-
|
|
- switch (config_reg & LPA_SGMII_SPD_MASK) {
|
|
- case LPA_SGMII_1000:
|
|
- state->speed = SPEED_1000;
|
|
- break;
|
|
- case LPA_SGMII_100:
|
|
- state->speed = SPEED_100;
|
|
- break;
|
|
- case LPA_SGMII_10:
|
|
- state->speed = SPEED_10;
|
|
- break;
|
|
- default:
|
|
- dev_err(priv->dev, "invalid sgmii PHY speed\n");
|
|
- state->link = false;
|
|
- return -EINVAL;
|
|
- }
|
|
-
|
|
- if (config_reg & LPA_SGMII_FULL_DUPLEX)
|
|
- state->duplex = DUPLEX_FULL;
|
|
- else
|
|
- state->duplex = DUPLEX_HALF;
|
|
- }
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static void
|
|
-mt7531_sgmii_pcs_get_state_inband(struct mt7530_priv *priv, int port,
|
|
- struct phylink_link_state *state)
|
|
-{
|
|
- unsigned int val;
|
|
-
|
|
- val = mt7530_read(priv, MT7531_PCS_CONTROL_1(port));
|
|
- state->link = !!(val & MT7531_SGMII_LINK_STATUS);
|
|
- if (!state->link)
|
|
- return;
|
|
-
|
|
- state->an_complete = state->link;
|
|
-
|
|
- if (state->interface == PHY_INTERFACE_MODE_2500BASEX)
|
|
- state->speed = SPEED_2500;
|
|
- else
|
|
- state->speed = SPEED_1000;
|
|
-
|
|
- state->duplex = DUPLEX_FULL;
|
|
- state->pause = MLO_PAUSE_NONE;
|
|
-}
|
|
-
|
|
-static void mt7531_pcs_get_state(struct phylink_pcs *pcs,
|
|
- struct phylink_link_state *state)
|
|
-{
|
|
- struct mt7530_priv *priv = pcs_to_mt753x_pcs(pcs)->priv;
|
|
- int port = pcs_to_mt753x_pcs(pcs)->port;
|
|
-
|
|
- if (state->interface == PHY_INTERFACE_MODE_SGMII) {
|
|
- mt7531_sgmii_pcs_get_state_an(priv, port, state);
|
|
- return;
|
|
- } else if ((state->interface == PHY_INTERFACE_MODE_1000BASEX) ||
|
|
- (state->interface == PHY_INTERFACE_MODE_2500BASEX)) {
|
|
- mt7531_sgmii_pcs_get_state_inband(priv, port, state);
|
|
- return;
|
|
- }
|
|
-
|
|
- state->link = false;
|
|
-}
|
|
-
|
|
static int mt753x_pcs_config(struct phylink_pcs *pcs, unsigned int mode,
|
|
phy_interface_t interface,
|
|
const unsigned long *advertising,
|
|
@@ -3353,18 +3157,57 @@ static const struct phylink_pcs_ops mt75
|
|
.pcs_an_restart = mt7530_pcs_an_restart,
|
|
};
|
|
|
|
-static const struct phylink_pcs_ops mt7531_pcs_ops = {
|
|
- .pcs_validate = mt753x_pcs_validate,
|
|
- .pcs_get_state = mt7531_pcs_get_state,
|
|
- .pcs_config = mt753x_pcs_config,
|
|
- .pcs_an_restart = mt7531_pcs_an_restart,
|
|
- .pcs_link_up = mt7531_pcs_link_up,
|
|
+static int mt7530_regmap_read(void *context, unsigned int reg, unsigned int *val)
|
|
+{
|
|
+ struct mt7530_priv *priv = context;
|
|
+
|
|
+ *val = mt7530_read(priv, reg);
|
|
+ return 0;
|
|
+};
|
|
+
|
|
+static int mt7530_regmap_write(void *context, unsigned int reg, unsigned int val)
|
|
+{
|
|
+ struct mt7530_priv *priv = context;
|
|
+
|
|
+ mt7530_write(priv, reg, val);
|
|
+ return 0;
|
|
+};
|
|
+
|
|
+static int mt7530_regmap_update_bits(void *context, unsigned int reg,
|
|
+ unsigned int mask, unsigned int val)
|
|
+{
|
|
+ struct mt7530_priv *priv = context;
|
|
+
|
|
+ mt7530_rmw(priv, reg, mask, val);
|
|
+ return 0;
|
|
+};
|
|
+
|
|
+static const struct regmap_bus mt7531_regmap_bus = {
|
|
+ .reg_write = mt7530_regmap_write,
|
|
+ .reg_read = mt7530_regmap_read,
|
|
+ .reg_update_bits = mt7530_regmap_update_bits,
|
|
+};
|
|
+
|
|
+#define MT7531_PCS_REGMAP_CONFIG(_name, _reg_base) \
|
|
+ { \
|
|
+ .name = _name, \
|
|
+ .reg_bits = 16, \
|
|
+ .val_bits = 32, \
|
|
+ .reg_stride = 4, \
|
|
+ .reg_base = _reg_base, \
|
|
+ .max_register = 0x17c, \
|
|
+ }
|
|
+
|
|
+static const struct regmap_config mt7531_pcs_config[] = {
|
|
+ MT7531_PCS_REGMAP_CONFIG("port5", MT7531_SGMII_REG_BASE(5)),
|
|
+ MT7531_PCS_REGMAP_CONFIG("port6", MT7531_SGMII_REG_BASE(6)),
|
|
};
|
|
|
|
static int
|
|
mt753x_setup(struct dsa_switch *ds)
|
|
{
|
|
struct mt7530_priv *priv = ds->priv;
|
|
+ struct regmap *regmap;
|
|
int i, ret;
|
|
|
|
/* Initialise the PCS devices */
|
|
@@ -3372,8 +3215,6 @@ mt753x_setup(struct dsa_switch *ds)
|
|
priv->pcs[i].pcs.ops = priv->info->pcs_ops;
|
|
priv->pcs[i].priv = priv;
|
|
priv->pcs[i].port = i;
|
|
- if (mt753x_is_mac_port(i))
|
|
- priv->pcs[i].pcs.poll = 1;
|
|
}
|
|
|
|
ret = priv->info->sw_setup(ds);
|
|
@@ -3388,6 +3229,16 @@ mt753x_setup(struct dsa_switch *ds)
|
|
if (ret && priv->irq)
|
|
mt7530_free_irq_common(priv);
|
|
|
|
+ if (priv->id == ID_MT7531)
|
|
+ for (i = 0; i < 2; i++) {
|
|
+ regmap = devm_regmap_init(ds->dev,
|
|
+ &mt7531_regmap_bus, priv,
|
|
+ &mt7531_pcs_config[i]);
|
|
+ priv->ports[5 + i].sgmii_pcs =
|
|
+ mtk_pcs_lynxi_create(ds->dev, regmap,
|
|
+ MT7531_PHYA_CTRL_SIGNAL3, 0);
|
|
+ }
|
|
+
|
|
return ret;
|
|
}
|
|
|
|
@@ -3480,7 +3331,7 @@ static const struct mt753x_info mt753x_t
|
|
},
|
|
[ID_MT7531] = {
|
|
.id = ID_MT7531,
|
|
- .pcs_ops = &mt7531_pcs_ops,
|
|
+ .pcs_ops = &mt7530_pcs_ops,
|
|
.sw_setup = mt7531_setup,
|
|
.phy_read = mt7531_ind_phy_read,
|
|
.phy_write = mt7531_ind_phy_write,
|
|
@@ -3588,7 +3439,7 @@ static void
|
|
mt7530_remove(struct mdio_device *mdiodev)
|
|
{
|
|
struct mt7530_priv *priv = dev_get_drvdata(&mdiodev->dev);
|
|
- int ret = 0;
|
|
+ int ret = 0, i;
|
|
|
|
if (!priv)
|
|
return;
|
|
@@ -3607,6 +3458,10 @@ mt7530_remove(struct mdio_device *mdiode
|
|
mt7530_free_irq(priv);
|
|
|
|
dsa_unregister_switch(priv->ds);
|
|
+
|
|
+ for (i = 0; i < 2; ++i)
|
|
+ mtk_pcs_lynxi_destroy(priv->ports[5 + i].sgmii_pcs);
|
|
+
|
|
mutex_destroy(&priv->reg_mutex);
|
|
}
|
|
|
|
--- a/drivers/net/dsa/mt7530.h
|
|
+++ b/drivers/net/dsa/mt7530.h
|
|
@@ -401,47 +401,8 @@ enum mt7530_vlan_port_acc_frm {
|
|
CCR_TX_OCT_CNT_BAD)
|
|
|
|
/* MT7531 SGMII register group */
|
|
-#define MT7531_SGMII_REG_BASE 0x5000
|
|
-#define MT7531_SGMII_REG(p, r) (MT7531_SGMII_REG_BASE + \
|
|
- ((p) - 5) * 0x1000 + (r))
|
|
-
|
|
-/* Register forSGMII PCS_CONTROL_1 */
|
|
-#define MT7531_PCS_CONTROL_1(p) MT7531_SGMII_REG(p, 0x00)
|
|
-#define MT7531_SGMII_LINK_STATUS BIT(18)
|
|
-#define MT7531_SGMII_AN_ENABLE BIT(12)
|
|
-#define MT7531_SGMII_AN_RESTART BIT(9)
|
|
-#define MT7531_SGMII_AN_COMPLETE BIT(21)
|
|
-
|
|
-/* Register for SGMII PCS_SPPED_ABILITY */
|
|
-#define MT7531_PCS_SPEED_ABILITY(p) MT7531_SGMII_REG(p, 0x08)
|
|
-#define MT7531_SGMII_TX_CONFIG_MASK GENMASK(15, 0)
|
|
-#define MT7531_SGMII_TX_CONFIG BIT(0)
|
|
-
|
|
-/* Register for SGMII_MODE */
|
|
-#define MT7531_SGMII_MODE(p) MT7531_SGMII_REG(p, 0x20)
|
|
-#define MT7531_SGMII_REMOTE_FAULT_DIS BIT(8)
|
|
-#define MT7531_SGMII_IF_MODE_MASK GENMASK(5, 1)
|
|
-#define MT7531_SGMII_FORCE_DUPLEX BIT(4)
|
|
-#define MT7531_SGMII_FORCE_SPEED_MASK GENMASK(3, 2)
|
|
-#define MT7531_SGMII_FORCE_SPEED_1000 BIT(3)
|
|
-#define MT7531_SGMII_FORCE_SPEED_100 BIT(2)
|
|
-#define MT7531_SGMII_FORCE_SPEED_10 0
|
|
-#define MT7531_SGMII_SPEED_DUPLEX_AN BIT(1)
|
|
-
|
|
-enum mt7531_sgmii_force_duplex {
|
|
- MT7531_SGMII_FORCE_FULL_DUPLEX = 0,
|
|
- MT7531_SGMII_FORCE_HALF_DUPLEX = 0x10,
|
|
-};
|
|
-
|
|
-/* Fields of QPHY_PWR_STATE_CTRL */
|
|
-#define MT7531_QPHY_PWR_STATE_CTRL(p) MT7531_SGMII_REG(p, 0xe8)
|
|
-#define MT7531_SGMII_PHYA_PWD BIT(4)
|
|
-
|
|
-/* Values of SGMII SPEED */
|
|
-#define MT7531_PHYA_CTRL_SIGNAL3(p) MT7531_SGMII_REG(p, 0x128)
|
|
-#define MT7531_RG_TPHY_SPEED_MASK (BIT(2) | BIT(3))
|
|
-#define MT7531_RG_TPHY_SPEED_1_25G 0x0
|
|
-#define MT7531_RG_TPHY_SPEED_3_125G BIT(2)
|
|
+#define MT7531_SGMII_REG_BASE(p) (0x5000 + ((p) - 5) * 0x1000)
|
|
+#define MT7531_PHYA_CTRL_SIGNAL3 0x128
|
|
|
|
/* Register for system reset */
|
|
#define MT7530_SYS_CTRL 0x7000
|
|
@@ -741,13 +702,13 @@ struct mt7530_fdb {
|
|
* @pm: The matrix used to show all connections with the port.
|
|
* @pvid: The VLAN specified is to be considered a PVID at ingress. Any
|
|
* untagged frames will be assigned to the related VLAN.
|
|
- * @vlan_filtering: The flags indicating whether the port that can recognize
|
|
- * VLAN-tagged frames.
|
|
+ * @sgmii_pcs: Pointer to PCS instance for SerDes ports
|
|
*/
|
|
struct mt7530_port {
|
|
bool enable;
|
|
u32 pm;
|
|
u16 pvid;
|
|
+ struct phylink_pcs *sgmii_pcs;
|
|
};
|
|
|
|
/* Port 5 interface select definitions */
|