lkml.org 
[lkml]   [2023]   [Mar]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH net-next v12 08/18] net: ethernet: mtk_eth_soc: fix 1000Base-X and 2500Base-X modes
    After conversion to phylink_pcs the 1000Base-X and 2500Base-X modes
    would work only after `ethtool -s eth1 autoneg off`.
    As ethtool autoneg and the ETHTOOL_LINK_MODE_Autoneg_BIT is supposed
    to control auto-negotiation on the external interface it doesn't make
    much sense to use it to control on-board SGMII auto-negotiation between
    MAC and PHY.
    Set correct values to really only enable SGMII auto-negotiation when
    actually operating in SGMII mode. For 1000Base-X and 2500Base-X mode,
    enable remote-fault detection only if in-band-status is enabled.
    This fixes using 1000Base-X and 2500Base-X SFPs on the BananaPi R3
    board and also makes it possible to use interface-mode-switching PHYs
    operating in either SGMII mode for 10M/100M/1000M or in 2500Base-X for
    2500M mode on other boards.

    Fixes: 14a44ab0330d ("net: mtk_eth_soc: partially convert to phylink_pcs")
    Signed-off-by: Daniel Golle <daniel@makrotopia.org>
    ---
    drivers/net/ethernet/mediatek/mtk_sgmii.c | 24 +++++------------------
    1 file changed, 5 insertions(+), 19 deletions(-)

    diff --git a/drivers/net/ethernet/mediatek/mtk_sgmii.c b/drivers/net/ethernet/mediatek/mtk_sgmii.c
    index 61bd9986466a..58d8cb3aa7f4 100644
    --- a/drivers/net/ethernet/mediatek/mtk_sgmii.c
    +++ b/drivers/net/ethernet/mediatek/mtk_sgmii.c
    @@ -38,9 +38,9 @@ static int mtk_pcs_config(struct phylink_pcs *pcs, unsigned int mode,
    const unsigned long *advertising,
    bool permit_pause_to_mac)
    {
    - bool mode_changed = false, changed, use_an;
    struct mtk_pcs *mpcs = pcs_to_mtk_pcs(pcs);
    - unsigned int rgc3, sgm_mode, bmcr;
    + unsigned int rgc3, sgm_mode = 0, bmcr = 0;
    + bool mode_changed = false, changed;
    int advertise, link_timer;

    advertise = phylink_mii_c22_pcs_encode_advertisement(interface,
    @@ -55,27 +55,13 @@ static int mtk_pcs_config(struct phylink_pcs *pcs, unsigned int mode,
    if (interface == PHY_INTERFACE_MODE_SGMII) {
    sgm_mode = SGMII_IF_MODE_SGMII;
    if (phylink_autoneg_inband(mode)) {
    + bmcr = SGMII_AN_ENABLE;
    sgm_mode |= SGMII_REMOTE_FAULT_DIS |
    SGMII_SPEED_DUPLEX_AN;
    - use_an = true;
    - } else {
    - use_an = false;
    }
    - } else if (phylink_autoneg_inband(mode)) {
    - /* 1000base-X or 2500base-X autoneg */
    - sgm_mode = SGMII_REMOTE_FAULT_DIS;
    - use_an = linkmode_test_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
    - advertising);
    - } else {
    + } else if (!phylink_autoneg_inband(mode)) {
    /* 1000base-X or 2500base-X without autoneg */
    - sgm_mode = 0;
    - use_an = false;
    - }
    -
    - if (use_an) {
    - bmcr = SGMII_AN_ENABLE;
    - } else {
    - bmcr = 0;
    + sgm_mode = SGMII_REMOTE_FAULT_DIS;
    }

    if (mpcs->interface != interface) {
    --
    2.39.2
    \
     
     \ /
      Last update: 2023-03-27 00:47    [W:4.024 / U:0.100 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site