14
14
15
15
#define SYNOPSYS_XPCS_USXGMII_ID 0x7996ced0
16
16
#define SYNOPSYS_XPCS_10GKR_ID 0x7996ced0
17
+ #define SYNOPSYS_XPCS_XLGMII_ID 0x7996ced0
17
18
#define SYNOPSYS_XPCS_MASK 0xffffffff
18
19
19
20
/* Vendor regs access */
@@ -74,6 +75,36 @@ static const int xpcs_10gkr_features[] = {
74
75
__ETHTOOL_LINK_MODE_MASK_NBITS ,
75
76
};
76
77
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
+
77
108
static const phy_interface_t xpcs_usxgmii_interfaces [] = {
78
109
PHY_INTERFACE_MODE_USXGMII ,
79
110
PHY_INTERFACE_MODE_MAX ,
@@ -84,6 +115,11 @@ static const phy_interface_t xpcs_10gkr_interfaces[] = {
84
115
PHY_INTERFACE_MODE_MAX ,
85
116
};
86
117
118
+ static const phy_interface_t xpcs_xlgmii_interfaces [] = {
119
+ PHY_INTERFACE_MODE_XLGMII ,
120
+ PHY_INTERFACE_MODE_MAX ,
121
+ };
122
+
87
123
static struct xpcs_id {
88
124
u32 id ;
89
125
u32 mask ;
@@ -100,6 +136,11 @@ static struct xpcs_id {
100
136
.mask = SYNOPSYS_XPCS_MASK ,
101
137
.supported = xpcs_10gkr_features ,
102
138
.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 ,
103
144
},
104
145
};
105
146
@@ -458,6 +499,60 @@ static void xpcs_resolve_lpa(struct mdio_xpcs_args *xpcs,
458
499
state -> duplex = DUPLEX_FULL ;
459
500
}
460
501
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
+
461
556
static void xpcs_resolve_pma (struct mdio_xpcs_args * xpcs ,
462
557
struct phylink_link_state * state )
463
558
{
@@ -468,6 +563,9 @@ static void xpcs_resolve_pma(struct mdio_xpcs_args *xpcs,
468
563
case PHY_INTERFACE_MODE_10GKR :
469
564
state -> speed = SPEED_10000 ;
470
565
break ;
566
+ case PHY_INTERFACE_MODE_XLGMII :
567
+ state -> speed = xpcs_get_max_xlgmii_speed (xpcs , state );
568
+ break ;
471
569
default :
472
570
state -> speed = SPEED_UNKNOWN ;
473
571
break ;
0 commit comments