Skip to content

Commit 8bd17dc

Browse files
committed
Merge branch 'Fix-10G-PHY-interface-types'
Russell King says: ==================== Fix 10G PHY interface types Recent discussion has revealed that our current usage of the 10GKR phy_interface_t is not correct. This is based on a misunderstanding caused in part by the various specifications being difficult to obtain. Now that a better understanding has been reached, we ought to correct this. This series introduce PHY_INTERFACE_MODE_10GBASER to replace the existing usage of 10GKR mode, and document their differences in the phylib documentation. Then switch PHY, SFP/phylink, the Marvell PP2 network driver, and its associated comphy driver over to use the correct interface mode. None of the existing platform usage was actually using 10GBASE-KR. In order to maintain compatibility with existing DT files, arrange for the Marvell PP2 driver to rewrite the phy interface mode; this allows other drivers to adopt correct behaviour w.r.t whether the 10G connection conforms to the backplane 10GBASE-KR protocol vs normal 10GBASE-R protocol. After applying these locally to net-next I've validated that the only places which mention the old PHY_INTERFACE_MODE_10GKR definition are: Documentation/networking/phy.rst:``PHY_INTERFACE_MODE_10GKR`` drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c: if (phy_mode == PHY_INTERFACE_MODE_10GKR) drivers/net/phy/aquantia_main.c: phydev->interface = PHY_INTERFACE_MODE_10GKR; drivers/net/phy/aquantia_main.c: phydev->interface != PHY_INTERFACE_MODE_10GKR && include/linux/phy.h: PHY_INTERFACE_MODE_10GKR, include/linux/phy.h: case PHY_INTERFACE_MODE_10GKR: which is as expected. The only users of "10gbase-kr" in DT are: arch/arm64/boot/dts/marvell/armada-7040-db.dts: phy-mode = "10gbase-kr"; arch/arm64/boot/dts/marvell/armada-8040-clearfog-gt-8k.dts: phy-mode = "10gbase-kr"; arch/arm64/boot/dts/marvell/armada-8040-db.dts: phy-mode = "10gbase-kr"; arch/arm64/boot/dts/marvell/armada-8040-db.dts: phy-mode = "10gbase-kr"; arch/arm64/boot/dts/marvell/armada-8040-mcbin-singleshot.dts: phy-mode = "10gbase-kr"; arch/arm64/boot/dts/marvell/armada-8040-mcbin-singleshot.dts: phy-mode = "10gbase-kr"; arch/arm64/boot/dts/marvell/armada-8040-mcbin.dts: phy-mode = "10gbase-kr";arch/arm64/boot/dts/marvell/armada-8040-mcbin.dts: phy-mode = "10gbase-kr";arch/arm64/boot/dts/marvell/cn9130-db.dts: phy-mode = "10gbase-kr"; arch/arm64/boot/dts/marvell/cn9131-db.dts: phy-mode = "10gbase-kr"; arch/arm64/boot/dts/marvell/cn9132-db.dts: phy-mode = "10gbase-kr"; which all use the mvpp2 driver, and these will be updated in a separate patch to be submitted in the following kernel cycle. v2: add comment to mvpp2 driver. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents aea6a1e + e0f909b commit 8bd17dc

File tree

9 files changed

+65
-29
lines changed

9 files changed

+65
-29
lines changed

Documentation/networking/phy.rst

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,24 @@ Some of the interface modes are described below:
267267
duplex, pause or other settings. This is dependent on the MAC and/or
268268
PHY behaviour.
269269

270+
``PHY_INTERFACE_MODE_10GBASER``
271+
This is the IEEE 802.3 Clause 49 defined 10GBASE-R protocol used with
272+
various different mediums. Please refer to the IEEE standard for a
273+
definition of this.
274+
275+
Note: 10GBASE-R is just one protocol that can be used with XFI and SFI.
276+
XFI and SFI permit multiple protocols over a single SERDES lane, and
277+
also defines the electrical characteristics of the signals with a host
278+
compliance board plugged into the host XFP/SFP connector. Therefore,
279+
XFI and SFI are not PHY interface types in their own right.
280+
281+
``PHY_INTERFACE_MODE_10GKR``
282+
This is the IEEE 802.3 Clause 49 defined 10GBASE-R with Clause 73
283+
autonegotiation. Please refer to the IEEE standard for further
284+
information.
285+
286+
Note: due to legacy usage, some 10GBASE-R usage incorrectly makes
287+
use of this definition.
270288

271289
Pause frames / flow control
272290
===========================

drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1114,7 +1114,7 @@ mvpp2_shared_interrupt_mask_unmask(struct mvpp2_port *port, bool mask)
11141114
/* Port configuration routines */
11151115
static bool mvpp2_is_xlg(phy_interface_t interface)
11161116
{
1117-
return interface == PHY_INTERFACE_MODE_10GKR ||
1117+
return interface == PHY_INTERFACE_MODE_10GBASER ||
11181118
interface == PHY_INTERFACE_MODE_XAUI;
11191119
}
11201120

@@ -1200,7 +1200,7 @@ static int mvpp22_gop_init(struct mvpp2_port *port)
12001200
case PHY_INTERFACE_MODE_2500BASEX:
12011201
mvpp22_gop_init_sgmii(port);
12021202
break;
1203-
case PHY_INTERFACE_MODE_10GKR:
1203+
case PHY_INTERFACE_MODE_10GBASER:
12041204
if (port->gop_id != 0)
12051205
goto invalid_conf;
12061206
mvpp22_gop_init_10gkr(port);
@@ -1649,7 +1649,7 @@ static void mvpp22_pcs_reset_deassert(struct mvpp2_port *port)
16491649
xpcs = priv->iface_base + MVPP22_XPCS_BASE(port->gop_id);
16501650

16511651
switch (port->phy_interface) {
1652-
case PHY_INTERFACE_MODE_10GKR:
1652+
case PHY_INTERFACE_MODE_10GBASER:
16531653
val = readl(mpcs + MVPP22_MPCS_CLK_RESET);
16541654
val |= MAC_CLK_RESET_MAC | MAC_CLK_RESET_SD_RX |
16551655
MAC_CLK_RESET_SD_TX;
@@ -4758,7 +4758,7 @@ static void mvpp2_phylink_validate(struct phylink_config *config,
47584758

47594759
/* Invalid combinations */
47604760
switch (state->interface) {
4761-
case PHY_INTERFACE_MODE_10GKR:
4761+
case PHY_INTERFACE_MODE_10GBASER:
47624762
case PHY_INTERFACE_MODE_XAUI:
47634763
if (port->gop_id != 0)
47644764
goto empty_set;
@@ -4780,7 +4780,7 @@ static void mvpp2_phylink_validate(struct phylink_config *config,
47804780
phylink_set(mask, Asym_Pause);
47814781

47824782
switch (state->interface) {
4783-
case PHY_INTERFACE_MODE_10GKR:
4783+
case PHY_INTERFACE_MODE_10GBASER:
47844784
case PHY_INTERFACE_MODE_XAUI:
47854785
case PHY_INTERFACE_MODE_NA:
47864786
if (port->gop_id == 0) {
@@ -5247,6 +5247,15 @@ static int mvpp2_port_probe(struct platform_device *pdev,
52475247
goto err_free_netdev;
52485248
}
52495249

5250+
/*
5251+
* Rewrite 10GBASE-KR to 10GBASE-R for compatibility with existing DT.
5252+
* Existing usage of 10GBASE-KR is not correct; no backplane
5253+
* negotiation is done, and this driver does not actually support
5254+
* 10GBASE-KR.
5255+
*/
5256+
if (phy_mode == PHY_INTERFACE_MODE_10GKR)
5257+
phy_mode = PHY_INTERFACE_MODE_10GBASER;
5258+
52505259
if (port_node) {
52515260
comphy = devm_of_phy_get(&pdev->dev, port_node, NULL);
52525261
if (IS_ERR(comphy)) {

drivers/net/phy/aquantia_main.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -358,9 +358,11 @@ static int aqr107_read_status(struct phy_device *phydev)
358358

359359
switch (FIELD_GET(MDIO_PHYXS_VEND_IF_STATUS_TYPE_MASK, val)) {
360360
case MDIO_PHYXS_VEND_IF_STATUS_TYPE_KR:
361-
case MDIO_PHYXS_VEND_IF_STATUS_TYPE_XFI:
362361
phydev->interface = PHY_INTERFACE_MODE_10GKR;
363362
break;
363+
case MDIO_PHYXS_VEND_IF_STATUS_TYPE_XFI:
364+
phydev->interface = PHY_INTERFACE_MODE_10GBASER;
365+
break;
364366
case MDIO_PHYXS_VEND_IF_STATUS_TYPE_USXGMII:
365367
phydev->interface = PHY_INTERFACE_MODE_USXGMII;
366368
break;
@@ -493,7 +495,8 @@ static int aqr107_config_init(struct phy_device *phydev)
493495
phydev->interface != PHY_INTERFACE_MODE_2500BASEX &&
494496
phydev->interface != PHY_INTERFACE_MODE_XGMII &&
495497
phydev->interface != PHY_INTERFACE_MODE_USXGMII &&
496-
phydev->interface != PHY_INTERFACE_MODE_10GKR)
498+
phydev->interface != PHY_INTERFACE_MODE_10GKR &&
499+
phydev->interface != PHY_INTERFACE_MODE_10GBASER)
497500
return -ENODEV;
498501

499502
WARN(phydev->interface == PHY_INTERFACE_MODE_XGMII,

drivers/net/phy/bcm84881.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ static int bcm84881_config_init(struct phy_device *phydev)
5353
switch (phydev->interface) {
5454
case PHY_INTERFACE_MODE_SGMII:
5555
case PHY_INTERFACE_MODE_2500BASEX:
56-
case PHY_INTERFACE_MODE_10GKR:
56+
case PHY_INTERFACE_MODE_10GBASER:
5757
break;
5858
default:
5959
return -ENODEV;
@@ -218,7 +218,7 @@ static int bcm84881_read_status(struct phy_device *phydev)
218218
if (mode == 1 || mode == 2)
219219
phydev->interface = PHY_INTERFACE_MODE_SGMII;
220220
else if (mode == 3)
221-
phydev->interface = PHY_INTERFACE_MODE_10GKR;
221+
phydev->interface = PHY_INTERFACE_MODE_10GBASER;
222222
else if (mode == 4)
223223
phydev->interface = PHY_INTERFACE_MODE_2500BASEX;
224224
switch (mode & 7) {

drivers/net/phy/marvell10g.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ static int mv3310_sfp_insert(void *upstream, const struct sfp_eeprom_id *id)
216216
sfp_parse_support(phydev->sfp_bus, id, support);
217217
iface = sfp_select_interface(phydev->sfp_bus, support);
218218

219-
if (iface != PHY_INTERFACE_MODE_10GKR) {
219+
if (iface != PHY_INTERFACE_MODE_10GBASER) {
220220
dev_err(&phydev->mdio.dev, "incompatible SFP module inserted\n");
221221
return -EINVAL;
222222
}
@@ -304,7 +304,7 @@ static int mv3310_config_init(struct phy_device *phydev)
304304
phydev->interface != PHY_INTERFACE_MODE_2500BASEX &&
305305
phydev->interface != PHY_INTERFACE_MODE_XAUI &&
306306
phydev->interface != PHY_INTERFACE_MODE_RXAUI &&
307-
phydev->interface != PHY_INTERFACE_MODE_10GKR)
307+
phydev->interface != PHY_INTERFACE_MODE_10GBASER)
308308
return -ENODEV;
309309

310310
return 0;
@@ -386,16 +386,17 @@ static void mv3310_update_interface(struct phy_device *phydev)
386386
{
387387
if ((phydev->interface == PHY_INTERFACE_MODE_SGMII ||
388388
phydev->interface == PHY_INTERFACE_MODE_2500BASEX ||
389-
phydev->interface == PHY_INTERFACE_MODE_10GKR) && phydev->link) {
389+
phydev->interface == PHY_INTERFACE_MODE_10GBASER) &&
390+
phydev->link) {
390391
/* The PHY automatically switches its serdes interface (and
391-
* active PHYXS instance) between Cisco SGMII, 10GBase-KR and
392+
* active PHYXS instance) between Cisco SGMII, 10GBase-R and
392393
* 2500BaseX modes according to the speed. Florian suggests
393394
* setting phydev->interface to communicate this to the MAC.
394395
* Only do this if we are already in one of the above modes.
395396
*/
396397
switch (phydev->speed) {
397398
case SPEED_10000:
398-
phydev->interface = PHY_INTERFACE_MODE_10GKR;
399+
phydev->interface = PHY_INTERFACE_MODE_10GBASER;
399400
break;
400401
case SPEED_2500:
401402
phydev->interface = PHY_INTERFACE_MODE_2500BASEX;

drivers/net/phy/phylink.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,7 @@ static int phylink_parse_mode(struct phylink *pl, struct fwnode_handle *fwnode)
298298
break;
299299

300300
case PHY_INTERFACE_MODE_10GKR:
301+
case PHY_INTERFACE_MODE_10GBASER:
301302
phylink_set(pl->supported, 10baseT_Half);
302303
phylink_set(pl->supported, 10baseT_Full);
303304
phylink_set(pl->supported, 100baseT_Half);

drivers/net/phy/sfp-bus.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,7 @@ phy_interface_t sfp_select_interface(struct sfp_bus *bus,
373373
phylink_test(link_modes, 10000baseLRM_Full) ||
374374
phylink_test(link_modes, 10000baseER_Full) ||
375375
phylink_test(link_modes, 10000baseT_Full))
376-
return PHY_INTERFACE_MODE_10GKR;
376+
return PHY_INTERFACE_MODE_10GBASER;
377377

378378
if (phylink_test(link_modes, 2500baseX_Full))
379379
return PHY_INTERFACE_MODE_2500BASEX;

drivers/phy/marvell/phy-mvebu-cp110-comphy.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ static const struct mvebu_comphy_conf mvebu_comphy_cp110_modes[] = {
221221
ETH_CONF(2, 0, PHY_INTERFACE_MODE_SGMII, 0x1, COMPHY_FW_MODE_SGMII),
222222
ETH_CONF(2, 0, PHY_INTERFACE_MODE_2500BASEX, 0x1, COMPHY_FW_MODE_HS_SGMII),
223223
ETH_CONF(2, 0, PHY_INTERFACE_MODE_RXAUI, 0x1, COMPHY_FW_MODE_RXAUI),
224-
ETH_CONF(2, 0, PHY_INTERFACE_MODE_10GKR, 0x1, COMPHY_FW_MODE_XFI),
224+
ETH_CONF(2, 0, PHY_INTERFACE_MODE_10GBASER, 0x1, COMPHY_FW_MODE_XFI),
225225
GEN_CONF(2, 0, PHY_MODE_USB_HOST_SS, COMPHY_FW_MODE_USB3H),
226226
GEN_CONF(2, 0, PHY_MODE_SATA, COMPHY_FW_MODE_SATA),
227227
GEN_CONF(2, 0, PHY_MODE_PCIE, COMPHY_FW_MODE_PCIE),
@@ -235,14 +235,14 @@ static const struct mvebu_comphy_conf mvebu_comphy_cp110_modes[] = {
235235
/* lane 4 */
236236
ETH_CONF(4, 0, PHY_INTERFACE_MODE_SGMII, 0x2, COMPHY_FW_MODE_SGMII),
237237
ETH_CONF(4, 0, PHY_INTERFACE_MODE_2500BASEX, 0x2, COMPHY_FW_MODE_HS_SGMII),
238-
ETH_CONF(4, 0, PHY_INTERFACE_MODE_10GKR, 0x2, COMPHY_FW_MODE_XFI),
238+
ETH_CONF(4, 0, PHY_INTERFACE_MODE_10GBASER, 0x2, COMPHY_FW_MODE_XFI),
239239
ETH_CONF(4, 0, PHY_INTERFACE_MODE_RXAUI, 0x2, COMPHY_FW_MODE_RXAUI),
240240
GEN_CONF(4, 0, PHY_MODE_USB_DEVICE_SS, COMPHY_FW_MODE_USB3D),
241241
GEN_CONF(4, 1, PHY_MODE_USB_HOST_SS, COMPHY_FW_MODE_USB3H),
242242
GEN_CONF(4, 1, PHY_MODE_PCIE, COMPHY_FW_MODE_PCIE),
243243
ETH_CONF(4, 1, PHY_INTERFACE_MODE_SGMII, 0x1, COMPHY_FW_MODE_SGMII),
244244
ETH_CONF(4, 1, PHY_INTERFACE_MODE_2500BASEX, -1, COMPHY_FW_MODE_HS_SGMII),
245-
ETH_CONF(4, 1, PHY_INTERFACE_MODE_10GKR, -1, COMPHY_FW_MODE_XFI),
245+
ETH_CONF(4, 1, PHY_INTERFACE_MODE_10GBASER, -1, COMPHY_FW_MODE_XFI),
246246
/* lane 5 */
247247
ETH_CONF(5, 1, PHY_INTERFACE_MODE_RXAUI, 0x2, COMPHY_FW_MODE_RXAUI),
248248
GEN_CONF(5, 1, PHY_MODE_SATA, COMPHY_FW_MODE_SATA),
@@ -342,7 +342,7 @@ static int mvebu_comphy_ethernet_init_reset(struct mvebu_comphy_lane *lane)
342342
MVEBU_COMPHY_SERDES_CFG0_RXAUI_MODE);
343343

344344
switch (lane->submode) {
345-
case PHY_INTERFACE_MODE_10GKR:
345+
case PHY_INTERFACE_MODE_10GBASER:
346346
val |= MVEBU_COMPHY_SERDES_CFG0_GEN_RX(0xe) |
347347
MVEBU_COMPHY_SERDES_CFG0_GEN_TX(0xe);
348348
break;
@@ -417,7 +417,7 @@ static int mvebu_comphy_ethernet_init_reset(struct mvebu_comphy_lane *lane)
417417
/* refclk selection */
418418
val = readl(priv->base + MVEBU_COMPHY_MISC_CTRL0(lane->id));
419419
val &= ~MVEBU_COMPHY_MISC_CTRL0_REFCLK_SEL;
420-
if (lane->submode == PHY_INTERFACE_MODE_10GKR)
420+
if (lane->submode == PHY_INTERFACE_MODE_10GBASER)
421421
val |= MVEBU_COMPHY_MISC_CTRL0_ICP_FORCE;
422422
writel(val, priv->base + MVEBU_COMPHY_MISC_CTRL0(lane->id));
423423

@@ -564,7 +564,7 @@ static int mvebu_comphy_set_mode_rxaui(struct phy *phy)
564564
return mvebu_comphy_init_plls(lane);
565565
}
566566

567-
static int mvebu_comphy_set_mode_10gkr(struct phy *phy)
567+
static int mvebu_comphy_set_mode_10gbaser(struct phy *phy)
568568
{
569569
struct mvebu_comphy_lane *lane = phy_get_drvdata(phy);
570570
struct mvebu_comphy_priv *priv = lane->priv;
@@ -735,8 +735,8 @@ static int mvebu_comphy_power_on_legacy(struct phy *phy)
735735
case PHY_INTERFACE_MODE_RXAUI:
736736
ret = mvebu_comphy_set_mode_rxaui(phy);
737737
break;
738-
case PHY_INTERFACE_MODE_10GKR:
739-
ret = mvebu_comphy_set_mode_10gkr(phy);
738+
case PHY_INTERFACE_MODE_10GBASER:
739+
ret = mvebu_comphy_set_mode_10gbaser(phy);
740740
break;
741741
default:
742742
return -ENOTSUPP;
@@ -782,8 +782,8 @@ static int mvebu_comphy_power_on(struct phy *phy)
782782
lane->id);
783783
fw_speed = COMPHY_FW_SPEED_3125;
784784
break;
785-
case PHY_INTERFACE_MODE_10GKR:
786-
dev_dbg(priv->dev, "set lane %d to 10G-KR mode\n",
785+
case PHY_INTERFACE_MODE_10GBASER:
786+
dev_dbg(priv->dev, "set lane %d to 10GBASE-R mode\n",
787787
lane->id);
788788
fw_speed = COMPHY_FW_SPEED_103125;
789789
break;

include/linux/phy.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,11 @@ typedef enum {
100100
PHY_INTERFACE_MODE_2500BASEX,
101101
PHY_INTERFACE_MODE_RXAUI,
102102
PHY_INTERFACE_MODE_XAUI,
103-
/* 10GBASE-KR, XFI, SFI - single lane 10G Serdes */
104-
PHY_INTERFACE_MODE_10GKR,
103+
/* 10GBASE-R, XFI, SFI - single lane 10G Serdes */
104+
PHY_INTERFACE_MODE_10GBASER,
105105
PHY_INTERFACE_MODE_USXGMII,
106+
/* 10GBASE-KR - with Clause 73 AN */
107+
PHY_INTERFACE_MODE_10GKR,
106108
PHY_INTERFACE_MODE_MAX,
107109
} phy_interface_t;
108110

@@ -176,10 +178,12 @@ static inline const char *phy_modes(phy_interface_t interface)
176178
return "rxaui";
177179
case PHY_INTERFACE_MODE_XAUI:
178180
return "xaui";
179-
case PHY_INTERFACE_MODE_10GKR:
180-
return "10gbase-kr";
181+
case PHY_INTERFACE_MODE_10GBASER:
182+
return "10gbase-r";
181183
case PHY_INTERFACE_MODE_USXGMII:
182184
return "usxgmii";
185+
case PHY_INTERFACE_MODE_10GKR:
186+
return "10gbase-kr";
183187
default:
184188
return "unknown";
185189
}

0 commit comments

Comments
 (0)