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().
Unified · Split
| @@ -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: |
| @@ -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: |