• Vladimir Oltean's avatar
    net: pcs: xpcs: make the checks related to the PHY interface mode stateless · 9900074e
    Vladimir Oltean authored
    The operating mode of the driver is currently to populate its
    struct mdio_xpcs_args::supported and struct mdio_xpcs_args::an_mode
    statically in xpcs_probe(), based on the passed phy_interface_t,
    and work with those.
    
    However this is not the operation that phylink expects from a PCS
    driver, because the port might be attached to an SFP cage that triggers
    changes of the phy_interface_t dynamically as one SFP module is
    unpluggged and another is plugged.
    
    To migrate towards that model, the struct mdio_xpcs_args should not
    cache anything related to the phy_interface_t, but just look up the
    statically defined, const struct xpcs_compat structure corresponding to
    the detected PCS OUI/model number.
    
    So we delete the "supported" and "an_mode" members of struct
    mdio_xpcs_args, and add the "id" structure there (since the ID is not
    expected to change at runtime).
    
    Since xpcs->supported is used deep in the code in _xpcs_config_aneg_c73(),
    we need to modify some function headers to pass the xpcs_compat from all
    callers. In turn, the xpcs_compat is always supplied externally to the
    xpcs module:
    - Most of the time by phylink
    - In xpcs_probe() it is needed because xpcs_soft_reset() writes to
      MDIO_MMD_PCS or to MDIO_MMD_VEND2 depending on whether an_mode is clause
      37 or clause 73. In order to not introduce functional changes related
      to when the soft reset is issued, we continue to require the initial
      phy_interface_t argument to be passed to xpcs_probe() so we can pass
      this on to xpcs_soft_reset().
    - stmmac_open() wants to know whether to call stmmac_init_phy() or not,
      and for that it looks inside xpcs->an_mode, because the clause 73
      (backplane) AN modes supposedly do not have a PHY. Because we moved
      an_mode outside of struct mdio_xpcs_args, this is now no longer
      directly possible, so we introduce a helper function xpcs_get_an_mode()
      which protects the data encapsulation of the xpcs module and requires
      a phy_interface_t to be passed as argument. This function can look up
      the appropriate compat based on the phy_interface_t.
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    9900074e
pcs-xpcs.c 25.7 KB