Skip to content

Commit 01972fa

Browse files
Russell King (Oracle)kuba-moo
authored andcommitted
net: phy: aquantia: fill in possible_interfaces for AQR113C
Fill in the possible_interfaces bitmap for AQR113C so phylink knows which interface modes will be used by the PHY. Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Link: https://lore.kernel.org/r/E1r6VI6-00DDLl-2D@rmk-PC.armlinux.org.uk Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent a225833 commit 01972fa

File tree

2 files changed

+80
-1
lines changed

2 files changed

+80
-1
lines changed

drivers/net/phy/aquantia/aquantia.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@
4747
#define VEND1_GLOBAL_CFG_5G 0x031e
4848
#define VEND1_GLOBAL_CFG_10G 0x031f
4949
/* ...and now the fields */
50+
#define VEND1_GLOBAL_CFG_SERDES_MODE GENMASK(2, 0)
51+
#define VEND1_GLOBAL_CFG_SERDES_MODE_XFI 0
52+
#define VEND1_GLOBAL_CFG_SERDES_MODE_SGMII 3
53+
#define VEND1_GLOBAL_CFG_SERDES_MODE_OCSGMII 4
54+
#define VEND1_GLOBAL_CFG_SERDES_MODE_XFI5G 6
5055
#define VEND1_GLOBAL_CFG_RATE_ADAPT GENMASK(8, 7)
5156
#define VEND1_GLOBAL_CFG_RATE_ADAPT_NONE 0
5257
#define VEND1_GLOBAL_CFG_RATE_ADAPT_USX 1

drivers/net/phy/aquantia/aquantia_main.c

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -656,6 +656,80 @@ static int aqr107_resume(struct phy_device *phydev)
656656
return aqr107_wait_processor_intensive_op(phydev);
657657
}
658658

659+
static const u16 aqr_global_cfg_regs[] = {
660+
VEND1_GLOBAL_CFG_10M,
661+
VEND1_GLOBAL_CFG_100M,
662+
VEND1_GLOBAL_CFG_1G,
663+
VEND1_GLOBAL_CFG_2_5G,
664+
VEND1_GLOBAL_CFG_5G,
665+
VEND1_GLOBAL_CFG_10G
666+
};
667+
668+
static int aqr107_fill_interface_modes(struct phy_device *phydev)
669+
{
670+
unsigned long *possible = phydev->possible_interfaces;
671+
unsigned int serdes_mode, rate_adapt;
672+
phy_interface_t interface;
673+
int i, val;
674+
675+
/* Walk the media-speed configuration registers to determine which
676+
* host-side serdes modes may be used by the PHY depending on the
677+
* negotiated media speed.
678+
*/
679+
for (i = 0; i < ARRAY_SIZE(aqr_global_cfg_regs); i++) {
680+
val = phy_read_mmd(phydev, MDIO_MMD_VEND1,
681+
aqr_global_cfg_regs[i]);
682+
if (val < 0)
683+
return val;
684+
685+
serdes_mode = FIELD_GET(VEND1_GLOBAL_CFG_SERDES_MODE, val);
686+
rate_adapt = FIELD_GET(VEND1_GLOBAL_CFG_RATE_ADAPT, val);
687+
688+
switch (serdes_mode) {
689+
case VEND1_GLOBAL_CFG_SERDES_MODE_XFI:
690+
if (rate_adapt == VEND1_GLOBAL_CFG_RATE_ADAPT_USX)
691+
interface = PHY_INTERFACE_MODE_USXGMII;
692+
else
693+
interface = PHY_INTERFACE_MODE_10GBASER;
694+
break;
695+
696+
case VEND1_GLOBAL_CFG_SERDES_MODE_XFI5G:
697+
interface = PHY_INTERFACE_MODE_5GBASER;
698+
break;
699+
700+
case VEND1_GLOBAL_CFG_SERDES_MODE_OCSGMII:
701+
interface = PHY_INTERFACE_MODE_2500BASEX;
702+
break;
703+
704+
case VEND1_GLOBAL_CFG_SERDES_MODE_SGMII:
705+
interface = PHY_INTERFACE_MODE_SGMII;
706+
break;
707+
708+
default:
709+
phydev_warn(phydev, "unrecognised serdes mode %u\n",
710+
serdes_mode);
711+
interface = PHY_INTERFACE_MODE_NA;
712+
break;
713+
}
714+
715+
if (interface != PHY_INTERFACE_MODE_NA)
716+
__set_bit(interface, possible);
717+
}
718+
719+
return 0;
720+
}
721+
722+
static int aqr113c_config_init(struct phy_device *phydev)
723+
{
724+
int ret;
725+
726+
ret = aqr107_config_init(phydev);
727+
if (ret < 0)
728+
return ret;
729+
730+
return aqr107_fill_interface_modes(phydev);
731+
}
732+
659733
static int aqr107_probe(struct phy_device *phydev)
660734
{
661735
int ret;
@@ -794,7 +868,7 @@ static struct phy_driver aqr_driver[] = {
794868
.name = "Aquantia AQR113C",
795869
.probe = aqr107_probe,
796870
.get_rate_matching = aqr107_get_rate_matching,
797-
.config_init = aqr107_config_init,
871+
.config_init = aqr113c_config_init,
798872
.config_aneg = aqr_config_aneg,
799873
.config_intr = aqr_config_intr,
800874
.handle_interrupt = aqr_handle_interrupt,

0 commit comments

Comments
 (0)