History

net: phylink: treat PSGMII as an inband capable interface

PSGMII (the Qualcomm 5-port SGMII) conveys the link negotiation result from the PHY back to the MAC through per-channel in-band SGMII words, exactly like SGMII and QSGMII. However, PHY_INTERFACE_MODE_PSGMII is missing from phylink_get_inband_type(), so phylink reports INBAND_NONE for it and phylink_pcs_neg_mode() falls back to PHYLINK_PCS_NEG_NONE. The PCS is then programmed in force mode and its control-register speed bits (which default to 1000base) are used, so a slower copper link - e.g. 100base-T - is reported as 1Gbps and cannot pass traffic. Classify PSGMII alongside SGMII and QSGMII as INBAND_CISCO_SGMII so the PCS negotiates in-band and the resolved link speed comes from the PHY in-band word. Also add PSGMII to the generic clause 22 PCS helper functions which handle the SGMII in-band word. Without this, a PCS using these helpers would still fall through to the default handling and force the link state to false in phylink_mii_c22_pcs_decode_state(), fail to encode the SGMII advertisement, and get rejected by phylink_get_link_timer_ns().

Sandeep Sondagar committed 3 months ago

Commit 5ba017f1 parent 77e80af2 files · +4 −0Browse files

Unified · Split

2 files
  1. drivers/net/phy/phylink.c +3 −0
  2. include/linux/phylink.h +1 −0
drivers/net/phy/phylink.c+3−0
@@ -1039,6 +1039,7 @@ static enum inband_type phylink_get_inband_type(phy_interface_t interface) · 1038 unmodified lines
1039{1039{
1040 switch (interface) {1040 switch (interface) {
1041 case PHY_INTERFACE_MODE_SGMII:1041 case PHY_INTERFACE_MODE_SGMII:
1042 case PHY_INTERFACE_MODE_PSGMII:
1042 case PHY_INTERFACE_MODE_QSGMII:1043 case PHY_INTERFACE_MODE_QSGMII:
1043 case PHY_INTERFACE_MODE_QUSGMII:1044 case PHY_INTERFACE_MODE_QUSGMII:
1044 case PHY_INTERFACE_MODE_USXGMII:1045 case PHY_INTERFACE_MODE_USXGMII:
@@ -4178,6 +4179,7 @@ void phylink_mii_c22_pcs_decode_state(struct phylink_link_state *state, · 3133 unmodified lines
4178 break;4179 break;
4179 4180
4180 case PHY_INTERFACE_MODE_SGMII:4181 case PHY_INTERFACE_MODE_SGMII:
4182 case PHY_INTERFACE_MODE_PSGMII:
4181 case PHY_INTERFACE_MODE_QSGMII:4183 case PHY_INTERFACE_MODE_QSGMII:
4182 if (neg_mode == PHYLINK_PCS_NEG_INBAND_ENABLED)4184 if (neg_mode == PHYLINK_PCS_NEG_INBAND_ENABLED)
4183 phylink_decode_sgmii_word(state, lpa);4185 phylink_decode_sgmii_word(state, lpa);
@@ -4258,6 +4260,7 @@ int phylink_mii_c22_pcs_encode_advertisement(phy_interface_t interface, · 74 unmodified lines
4258 adv |= ADVERTISE_1000XPSE_ASYM;4260 adv |= ADVERTISE_1000XPSE_ASYM;
4259 return adv;4261 return adv;
4260 case PHY_INTERFACE_MODE_SGMII:4262 case PHY_INTERFACE_MODE_SGMII:
4263 case PHY_INTERFACE_MODE_PSGMII:
4261 case PHY_INTERFACE_MODE_QSGMII:4264 case PHY_INTERFACE_MODE_QSGMII:
4262 return 0x0001;4265 return 0x0001;
4263 default:4266 default:
include/linux/phylink.h+1−0
@@ -791,6 +791,7 @@ static inline int phylink_get_link_timer_ns(phy_interface_t interface) · 790 unmodified lines
791{791{
792 switch (interface) {792 switch (interface) {
793 case PHY_INTERFACE_MODE_SGMII:793 case PHY_INTERFACE_MODE_SGMII:
794 case PHY_INTERFACE_MODE_PSGMII:
794 case PHY_INTERFACE_MODE_QSGMII:795 case PHY_INTERFACE_MODE_QSGMII:
795 case PHY_INTERFACE_MODE_USXGMII:796 case PHY_INTERFACE_MODE_USXGMII:
796 case PHY_INTERFACE_MODE_10G_QXGMII:797 case PHY_INTERFACE_MODE_10G_QXGMII:

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t