Skip to content

Commit 7c6dbd2

Browse files
joabreudavem330
authored andcommitted
net: phy: xpcs: Add XLGMII support
Add XLGMII support for XPCS. This does not include Autoneg feature. Signed-off-by: Jose Abreu <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 9f57db9 commit 7c6dbd2

File tree

1 file changed

+98
-0
lines changed

1 file changed

+98
-0
lines changed

drivers/net/phy/mdio-xpcs.c

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
#define SYNOPSYS_XPCS_USXGMII_ID 0x7996ced0
1616
#define SYNOPSYS_XPCS_10GKR_ID 0x7996ced0
17+
#define SYNOPSYS_XPCS_XLGMII_ID 0x7996ced0
1718
#define SYNOPSYS_XPCS_MASK 0xffffffff
1819

1920
/* Vendor regs access */
@@ -74,6 +75,36 @@ static const int xpcs_10gkr_features[] = {
7475
__ETHTOOL_LINK_MODE_MASK_NBITS,
7576
};
7677

78+
static const int xpcs_xlgmii_features[] = {
79+
ETHTOOL_LINK_MODE_Pause_BIT,
80+
ETHTOOL_LINK_MODE_Asym_Pause_BIT,
81+
ETHTOOL_LINK_MODE_25000baseCR_Full_BIT,
82+
ETHTOOL_LINK_MODE_25000baseKR_Full_BIT,
83+
ETHTOOL_LINK_MODE_25000baseSR_Full_BIT,
84+
ETHTOOL_LINK_MODE_40000baseKR4_Full_BIT,
85+
ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT,
86+
ETHTOOL_LINK_MODE_40000baseSR4_Full_BIT,
87+
ETHTOOL_LINK_MODE_40000baseLR4_Full_BIT,
88+
ETHTOOL_LINK_MODE_50000baseCR2_Full_BIT,
89+
ETHTOOL_LINK_MODE_50000baseKR2_Full_BIT,
90+
ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT,
91+
ETHTOOL_LINK_MODE_50000baseKR_Full_BIT,
92+
ETHTOOL_LINK_MODE_50000baseSR_Full_BIT,
93+
ETHTOOL_LINK_MODE_50000baseCR_Full_BIT,
94+
ETHTOOL_LINK_MODE_50000baseLR_ER_FR_Full_BIT,
95+
ETHTOOL_LINK_MODE_50000baseDR_Full_BIT,
96+
ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT,
97+
ETHTOOL_LINK_MODE_100000baseSR4_Full_BIT,
98+
ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT,
99+
ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT,
100+
ETHTOOL_LINK_MODE_100000baseKR2_Full_BIT,
101+
ETHTOOL_LINK_MODE_100000baseSR2_Full_BIT,
102+
ETHTOOL_LINK_MODE_100000baseCR2_Full_BIT,
103+
ETHTOOL_LINK_MODE_100000baseLR2_ER2_FR2_Full_BIT,
104+
ETHTOOL_LINK_MODE_100000baseDR2_Full_BIT,
105+
__ETHTOOL_LINK_MODE_MASK_NBITS,
106+
};
107+
77108
static const phy_interface_t xpcs_usxgmii_interfaces[] = {
78109
PHY_INTERFACE_MODE_USXGMII,
79110
PHY_INTERFACE_MODE_MAX,
@@ -84,6 +115,11 @@ static const phy_interface_t xpcs_10gkr_interfaces[] = {
84115
PHY_INTERFACE_MODE_MAX,
85116
};
86117

118+
static const phy_interface_t xpcs_xlgmii_interfaces[] = {
119+
PHY_INTERFACE_MODE_XLGMII,
120+
PHY_INTERFACE_MODE_MAX,
121+
};
122+
87123
static struct xpcs_id {
88124
u32 id;
89125
u32 mask;
@@ -100,6 +136,11 @@ static struct xpcs_id {
100136
.mask = SYNOPSYS_XPCS_MASK,
101137
.supported = xpcs_10gkr_features,
102138
.interface = xpcs_10gkr_interfaces,
139+
}, {
140+
.id = SYNOPSYS_XPCS_XLGMII_ID,
141+
.mask = SYNOPSYS_XPCS_MASK,
142+
.supported = xpcs_xlgmii_features,
143+
.interface = xpcs_xlgmii_interfaces,
103144
},
104145
};
105146

@@ -458,6 +499,60 @@ static void xpcs_resolve_lpa(struct mdio_xpcs_args *xpcs,
458499
state->duplex = DUPLEX_FULL;
459500
}
460501

502+
static int xpcs_get_max_xlgmii_speed(struct mdio_xpcs_args *xpcs,
503+
struct phylink_link_state *state)
504+
{
505+
unsigned long *adv = state->advertising;
506+
int speed = SPEED_UNKNOWN;
507+
int bit;
508+
509+
for_each_set_bit(bit, adv, __ETHTOOL_LINK_MODE_MASK_NBITS) {
510+
int new_speed = SPEED_UNKNOWN;
511+
512+
switch (bit) {
513+
case ETHTOOL_LINK_MODE_25000baseCR_Full_BIT:
514+
case ETHTOOL_LINK_MODE_25000baseKR_Full_BIT:
515+
case ETHTOOL_LINK_MODE_25000baseSR_Full_BIT:
516+
new_speed = SPEED_25000;
517+
break;
518+
case ETHTOOL_LINK_MODE_40000baseKR4_Full_BIT:
519+
case ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT:
520+
case ETHTOOL_LINK_MODE_40000baseSR4_Full_BIT:
521+
case ETHTOOL_LINK_MODE_40000baseLR4_Full_BIT:
522+
new_speed = SPEED_40000;
523+
break;
524+
case ETHTOOL_LINK_MODE_50000baseCR2_Full_BIT:
525+
case ETHTOOL_LINK_MODE_50000baseKR2_Full_BIT:
526+
case ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT:
527+
case ETHTOOL_LINK_MODE_50000baseKR_Full_BIT:
528+
case ETHTOOL_LINK_MODE_50000baseSR_Full_BIT:
529+
case ETHTOOL_LINK_MODE_50000baseCR_Full_BIT:
530+
case ETHTOOL_LINK_MODE_50000baseLR_ER_FR_Full_BIT:
531+
case ETHTOOL_LINK_MODE_50000baseDR_Full_BIT:
532+
new_speed = SPEED_50000;
533+
break;
534+
case ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT:
535+
case ETHTOOL_LINK_MODE_100000baseSR4_Full_BIT:
536+
case ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT:
537+
case ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT:
538+
case ETHTOOL_LINK_MODE_100000baseKR2_Full_BIT:
539+
case ETHTOOL_LINK_MODE_100000baseSR2_Full_BIT:
540+
case ETHTOOL_LINK_MODE_100000baseCR2_Full_BIT:
541+
case ETHTOOL_LINK_MODE_100000baseLR2_ER2_FR2_Full_BIT:
542+
case ETHTOOL_LINK_MODE_100000baseDR2_Full_BIT:
543+
new_speed = SPEED_100000;
544+
break;
545+
default:
546+
continue;
547+
}
548+
549+
if (new_speed > speed)
550+
speed = new_speed;
551+
}
552+
553+
return speed;
554+
}
555+
461556
static void xpcs_resolve_pma(struct mdio_xpcs_args *xpcs,
462557
struct phylink_link_state *state)
463558
{
@@ -468,6 +563,9 @@ static void xpcs_resolve_pma(struct mdio_xpcs_args *xpcs,
468563
case PHY_INTERFACE_MODE_10GKR:
469564
state->speed = SPEED_10000;
470565
break;
566+
case PHY_INTERFACE_MODE_XLGMII:
567+
state->speed = xpcs_get_max_xlgmii_speed(xpcs, state);
568+
break;
471569
default:
472570
state->speed = SPEED_UNKNOWN;
473571
break;

0 commit comments

Comments
 (0)