mirror of https://github.com/torvalds/linux.git
phy: ti: gmii-sel: Always write the RGMII ID setting
Some SoCs are just validated with the TX delay enabled. With commitca13b249f2("net: ethernet: ti: am65-cpsw: fixup PHY mode for fixed RGMII TX delay"), the network driver will patch the delay setting on the fly assuming that the TX delay setting is fixed. In reality, the TX delay is configurable and just skipped in the documentation. There are bootloaders, which will disable the TX delay and this will lead to a transmit path which doesn't add any delays at all. Fix that by always writing the RGMII_ID setting and report an error for unsupported RGMII delay modes. This is safe to do and shouldn't break any boards in mainline because the fixed delay is only introduced for gmii-sel compatibles which are used together with the am65-cpsw-nuss driver and also contains the commit above. Fixes:ca13b249f2("net: ethernet: ti: am65-cpsw: fixup PHY mode for fixed RGMII TX delay") Signed-off-by: Michael Walle <mwalle@kernel.org> Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com> Link: https://lore.kernel.org/r/20250819065622.1019537-1-mwalle@kernel.org Signed-off-by: Vinod Koul <vkoul@kernel.org>
This commit is contained in:
parent
aac1256a41
commit
a22d3b0d49
|
|
@ -34,6 +34,7 @@ enum {
|
|||
PHY_GMII_SEL_PORT_MODE = 0,
|
||||
PHY_GMII_SEL_RGMII_ID_MODE,
|
||||
PHY_GMII_SEL_RMII_IO_CLK_EN,
|
||||
PHY_GMII_SEL_FIXED_TX_DELAY,
|
||||
PHY_GMII_SEL_LAST,
|
||||
};
|
||||
|
||||
|
|
@ -127,6 +128,11 @@ static int phy_gmii_sel_mode(struct phy *phy, enum phy_mode mode, int submode)
|
|||
goto unsupported;
|
||||
}
|
||||
|
||||
/* With a fixed delay, some modes are not supported at all. */
|
||||
if (soc_data->features & BIT(PHY_GMII_SEL_FIXED_TX_DELAY) &&
|
||||
rgmii_id != 0)
|
||||
return -EINVAL;
|
||||
|
||||
if_phy->phy_if_mode = submode;
|
||||
|
||||
dev_dbg(dev, "%s id:%u mode:%u rgmii_id:%d rmii_clk_ext:%d\n",
|
||||
|
|
@ -210,25 +216,46 @@ struct phy_gmii_sel_soc_data phy_gmii_sel_soc_dm814 = {
|
|||
|
||||
static const
|
||||
struct reg_field phy_gmii_sel_fields_am654[][PHY_GMII_SEL_LAST] = {
|
||||
{ [PHY_GMII_SEL_PORT_MODE] = REG_FIELD(0x0, 0, 2), },
|
||||
{ [PHY_GMII_SEL_PORT_MODE] = REG_FIELD(0x4, 0, 2), },
|
||||
{ [PHY_GMII_SEL_PORT_MODE] = REG_FIELD(0x8, 0, 2), },
|
||||
{ [PHY_GMII_SEL_PORT_MODE] = REG_FIELD(0xC, 0, 2), },
|
||||
{ [PHY_GMII_SEL_PORT_MODE] = REG_FIELD(0x10, 0, 2), },
|
||||
{ [PHY_GMII_SEL_PORT_MODE] = REG_FIELD(0x14, 0, 2), },
|
||||
{ [PHY_GMII_SEL_PORT_MODE] = REG_FIELD(0x18, 0, 2), },
|
||||
{ [PHY_GMII_SEL_PORT_MODE] = REG_FIELD(0x1C, 0, 2), },
|
||||
{
|
||||
[PHY_GMII_SEL_PORT_MODE] = REG_FIELD(0x0, 0, 2),
|
||||
[PHY_GMII_SEL_RGMII_ID_MODE] = REG_FIELD(0x0, 4, 4),
|
||||
}, {
|
||||
[PHY_GMII_SEL_PORT_MODE] = REG_FIELD(0x4, 0, 2),
|
||||
[PHY_GMII_SEL_RGMII_ID_MODE] = REG_FIELD(0x4, 4, 4),
|
||||
}, {
|
||||
[PHY_GMII_SEL_PORT_MODE] = REG_FIELD(0x8, 0, 2),
|
||||
[PHY_GMII_SEL_RGMII_ID_MODE] = REG_FIELD(0x8, 4, 4),
|
||||
}, {
|
||||
[PHY_GMII_SEL_PORT_MODE] = REG_FIELD(0xC, 0, 2),
|
||||
[PHY_GMII_SEL_RGMII_ID_MODE] = REG_FIELD(0xC, 4, 4),
|
||||
}, {
|
||||
[PHY_GMII_SEL_PORT_MODE] = REG_FIELD(0x10, 0, 2),
|
||||
[PHY_GMII_SEL_RGMII_ID_MODE] = REG_FIELD(0x10, 4, 4),
|
||||
}, {
|
||||
[PHY_GMII_SEL_PORT_MODE] = REG_FIELD(0x14, 0, 2),
|
||||
[PHY_GMII_SEL_RGMII_ID_MODE] = REG_FIELD(0x14, 4, 4),
|
||||
}, {
|
||||
[PHY_GMII_SEL_PORT_MODE] = REG_FIELD(0x18, 0, 2),
|
||||
[PHY_GMII_SEL_RGMII_ID_MODE] = REG_FIELD(0x18, 4, 4),
|
||||
}, {
|
||||
[PHY_GMII_SEL_PORT_MODE] = REG_FIELD(0x1C, 0, 2),
|
||||
[PHY_GMII_SEL_RGMII_ID_MODE] = REG_FIELD(0x1C, 4, 4),
|
||||
},
|
||||
};
|
||||
|
||||
static const
|
||||
struct phy_gmii_sel_soc_data phy_gmii_sel_soc_am654 = {
|
||||
.use_of_data = true,
|
||||
.features = BIT(PHY_GMII_SEL_RGMII_ID_MODE) |
|
||||
BIT(PHY_GMII_SEL_FIXED_TX_DELAY),
|
||||
.regfields = phy_gmii_sel_fields_am654,
|
||||
};
|
||||
|
||||
static const
|
||||
struct phy_gmii_sel_soc_data phy_gmii_sel_cpsw5g_soc_j7200 = {
|
||||
.use_of_data = true,
|
||||
.features = BIT(PHY_GMII_SEL_RGMII_ID_MODE) |
|
||||
BIT(PHY_GMII_SEL_FIXED_TX_DELAY),
|
||||
.regfields = phy_gmii_sel_fields_am654,
|
||||
.extra_modes = BIT(PHY_INTERFACE_MODE_QSGMII) | BIT(PHY_INTERFACE_MODE_SGMII) |
|
||||
BIT(PHY_INTERFACE_MODE_USXGMII),
|
||||
|
|
@ -239,6 +266,8 @@ struct phy_gmii_sel_soc_data phy_gmii_sel_cpsw5g_soc_j7200 = {
|
|||
static const
|
||||
struct phy_gmii_sel_soc_data phy_gmii_sel_cpsw9g_soc_j721e = {
|
||||
.use_of_data = true,
|
||||
.features = BIT(PHY_GMII_SEL_RGMII_ID_MODE) |
|
||||
BIT(PHY_GMII_SEL_FIXED_TX_DELAY),
|
||||
.regfields = phy_gmii_sel_fields_am654,
|
||||
.extra_modes = BIT(PHY_INTERFACE_MODE_QSGMII) | BIT(PHY_INTERFACE_MODE_SGMII),
|
||||
.num_ports = 8,
|
||||
|
|
@ -248,6 +277,8 @@ struct phy_gmii_sel_soc_data phy_gmii_sel_cpsw9g_soc_j721e = {
|
|||
static const
|
||||
struct phy_gmii_sel_soc_data phy_gmii_sel_cpsw9g_soc_j784s4 = {
|
||||
.use_of_data = true,
|
||||
.features = BIT(PHY_GMII_SEL_RGMII_ID_MODE) |
|
||||
BIT(PHY_GMII_SEL_FIXED_TX_DELAY),
|
||||
.regfields = phy_gmii_sel_fields_am654,
|
||||
.extra_modes = BIT(PHY_INTERFACE_MODE_QSGMII) | BIT(PHY_INTERFACE_MODE_SGMII) |
|
||||
BIT(PHY_INTERFACE_MODE_USXGMII),
|
||||
|
|
|
|||
Loading…
Reference in New Issue