Skip to content

Commit a22d3b0

Browse files
mwallevinodkoul
authored andcommitted
phy: ti: gmii-sel: Always write the RGMII ID setting
Some SoCs are just validated with the TX delay enabled. With commit ca13b24 ("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: ca13b24 ("net: ethernet: ti: am65-cpsw: fixup PHY mode for fixed RGMII TX delay") Signed-off-by: Michael Walle <[email protected]> Reviewed-by: Maxime Chevallier <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Vinod Koul <[email protected]>
1 parent aac1256 commit a22d3b0

File tree

1 file changed

+39
-8
lines changed

1 file changed

+39
-8
lines changed

drivers/phy/ti/phy-gmii-sel.c

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ enum {
3434
PHY_GMII_SEL_PORT_MODE = 0,
3535
PHY_GMII_SEL_RGMII_ID_MODE,
3636
PHY_GMII_SEL_RMII_IO_CLK_EN,
37+
PHY_GMII_SEL_FIXED_TX_DELAY,
3738
PHY_GMII_SEL_LAST,
3839
};
3940

@@ -127,6 +128,11 @@ static int phy_gmii_sel_mode(struct phy *phy, enum phy_mode mode, int submode)
127128
goto unsupported;
128129
}
129130

131+
/* With a fixed delay, some modes are not supported at all. */
132+
if (soc_data->features & BIT(PHY_GMII_SEL_FIXED_TX_DELAY) &&
133+
rgmii_id != 0)
134+
return -EINVAL;
135+
130136
if_phy->phy_if_mode = submode;
131137

132138
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 = {
210216

211217
static const
212218
struct reg_field phy_gmii_sel_fields_am654[][PHY_GMII_SEL_LAST] = {
213-
{ [PHY_GMII_SEL_PORT_MODE] = REG_FIELD(0x0, 0, 2), },
214-
{ [PHY_GMII_SEL_PORT_MODE] = REG_FIELD(0x4, 0, 2), },
215-
{ [PHY_GMII_SEL_PORT_MODE] = REG_FIELD(0x8, 0, 2), },
216-
{ [PHY_GMII_SEL_PORT_MODE] = REG_FIELD(0xC, 0, 2), },
217-
{ [PHY_GMII_SEL_PORT_MODE] = REG_FIELD(0x10, 0, 2), },
218-
{ [PHY_GMII_SEL_PORT_MODE] = REG_FIELD(0x14, 0, 2), },
219-
{ [PHY_GMII_SEL_PORT_MODE] = REG_FIELD(0x18, 0, 2), },
220-
{ [PHY_GMII_SEL_PORT_MODE] = REG_FIELD(0x1C, 0, 2), },
219+
{
220+
[PHY_GMII_SEL_PORT_MODE] = REG_FIELD(0x0, 0, 2),
221+
[PHY_GMII_SEL_RGMII_ID_MODE] = REG_FIELD(0x0, 4, 4),
222+
}, {
223+
[PHY_GMII_SEL_PORT_MODE] = REG_FIELD(0x4, 0, 2),
224+
[PHY_GMII_SEL_RGMII_ID_MODE] = REG_FIELD(0x4, 4, 4),
225+
}, {
226+
[PHY_GMII_SEL_PORT_MODE] = REG_FIELD(0x8, 0, 2),
227+
[PHY_GMII_SEL_RGMII_ID_MODE] = REG_FIELD(0x8, 4, 4),
228+
}, {
229+
[PHY_GMII_SEL_PORT_MODE] = REG_FIELD(0xC, 0, 2),
230+
[PHY_GMII_SEL_RGMII_ID_MODE] = REG_FIELD(0xC, 4, 4),
231+
}, {
232+
[PHY_GMII_SEL_PORT_MODE] = REG_FIELD(0x10, 0, 2),
233+
[PHY_GMII_SEL_RGMII_ID_MODE] = REG_FIELD(0x10, 4, 4),
234+
}, {
235+
[PHY_GMII_SEL_PORT_MODE] = REG_FIELD(0x14, 0, 2),
236+
[PHY_GMII_SEL_RGMII_ID_MODE] = REG_FIELD(0x14, 4, 4),
237+
}, {
238+
[PHY_GMII_SEL_PORT_MODE] = REG_FIELD(0x18, 0, 2),
239+
[PHY_GMII_SEL_RGMII_ID_MODE] = REG_FIELD(0x18, 4, 4),
240+
}, {
241+
[PHY_GMII_SEL_PORT_MODE] = REG_FIELD(0x1C, 0, 2),
242+
[PHY_GMII_SEL_RGMII_ID_MODE] = REG_FIELD(0x1C, 4, 4),
243+
},
221244
};
222245

223246
static const
224247
struct phy_gmii_sel_soc_data phy_gmii_sel_soc_am654 = {
225248
.use_of_data = true,
249+
.features = BIT(PHY_GMII_SEL_RGMII_ID_MODE) |
250+
BIT(PHY_GMII_SEL_FIXED_TX_DELAY),
226251
.regfields = phy_gmii_sel_fields_am654,
227252
};
228253

229254
static const
230255
struct phy_gmii_sel_soc_data phy_gmii_sel_cpsw5g_soc_j7200 = {
231256
.use_of_data = true,
257+
.features = BIT(PHY_GMII_SEL_RGMII_ID_MODE) |
258+
BIT(PHY_GMII_SEL_FIXED_TX_DELAY),
232259
.regfields = phy_gmii_sel_fields_am654,
233260
.extra_modes = BIT(PHY_INTERFACE_MODE_QSGMII) | BIT(PHY_INTERFACE_MODE_SGMII) |
234261
BIT(PHY_INTERFACE_MODE_USXGMII),
@@ -239,6 +266,8 @@ struct phy_gmii_sel_soc_data phy_gmii_sel_cpsw5g_soc_j7200 = {
239266
static const
240267
struct phy_gmii_sel_soc_data phy_gmii_sel_cpsw9g_soc_j721e = {
241268
.use_of_data = true,
269+
.features = BIT(PHY_GMII_SEL_RGMII_ID_MODE) |
270+
BIT(PHY_GMII_SEL_FIXED_TX_DELAY),
242271
.regfields = phy_gmii_sel_fields_am654,
243272
.extra_modes = BIT(PHY_INTERFACE_MODE_QSGMII) | BIT(PHY_INTERFACE_MODE_SGMII),
244273
.num_ports = 8,
@@ -248,6 +277,8 @@ struct phy_gmii_sel_soc_data phy_gmii_sel_cpsw9g_soc_j721e = {
248277
static const
249278
struct phy_gmii_sel_soc_data phy_gmii_sel_cpsw9g_soc_j784s4 = {
250279
.use_of_data = true,
280+
.features = BIT(PHY_GMII_SEL_RGMII_ID_MODE) |
281+
BIT(PHY_GMII_SEL_FIXED_TX_DELAY),
251282
.regfields = phy_gmii_sel_fields_am654,
252283
.extra_modes = BIT(PHY_INTERFACE_MODE_QSGMII) | BIT(PHY_INTERFACE_MODE_SGMII) |
253284
BIT(PHY_INTERFACE_MODE_USXGMII),

0 commit comments

Comments
 (0)