lkml.org 
[lkml]   [2022]   [Dec]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v7 net-next 2/5] drivers/net/phy: add the link modes for the 10BASE-T1S Ethernet PHY
    This patch adds the link modes for the IEEE 802.3cg Clause 147 10BASE-T1S
    Ethernet PHY. According to the specifications, the 10BASE-T1S supports
    Point-To-Point Full-Duplex, Point-To-Point Half-Duplex and/or
    Point-To-Multipoint (AKA Multi-Drop) Half-Duplex operations.

    Signed-off-by: Piergiorgio Beruto <piergiorgio.beruto@gmail.com>
    ---
    drivers/net/phy/phy-core.c | 5 ++++-
    drivers/net/phy/phy_device.c | 14 ++++++++++++++
    drivers/net/phy/phylink.c | 6 +++++-
    include/linux/phy.h | 13 +++++++++++++
    include/uapi/linux/ethtool.h | 3 +++
    net/ethtool/common.c | 8 ++++++++
    6 files changed, 47 insertions(+), 2 deletions(-)

    diff --git a/drivers/net/phy/phy-core.c b/drivers/net/phy/phy-core.c
    index 5d08c627a516..a64186dc53f8 100644
    --- a/drivers/net/phy/phy-core.c
    +++ b/drivers/net/phy/phy-core.c
    @@ -13,7 +13,7 @@
    */
    const char *phy_speed_to_str(int speed)
    {
    - BUILD_BUG_ON_MSG(__ETHTOOL_LINK_MODE_MASK_NBITS != 99,
    + BUILD_BUG_ON_MSG(__ETHTOOL_LINK_MODE_MASK_NBITS != 102,
    "Enum ethtool_link_mode_bit_indices and phylib are out of sync. "
    "If a speed or mode has been added please update phy_speed_to_str "
    "and the PHY settings array.\n");
    @@ -260,6 +260,9 @@ static const struct phy_setting settings[] = {
    PHY_SETTING( 10, FULL, 10baseT_Full ),
    PHY_SETTING( 10, HALF, 10baseT_Half ),
    PHY_SETTING( 10, FULL, 10baseT1L_Full ),
    + PHY_SETTING( 10, FULL, 10baseT1S_Full ),
    + PHY_SETTING( 10, HALF, 10baseT1S_Half ),
    + PHY_SETTING( 10, HALF, 10baseT1S_P2MP_Half ),
    };
    #undef PHY_SETTING

    diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
    index 716870a4499c..8e48b3cec5e7 100644
    --- a/drivers/net/phy/phy_device.c
    +++ b/drivers/net/phy/phy_device.c
    @@ -45,6 +45,9 @@ EXPORT_SYMBOL_GPL(phy_basic_features);
    __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_basic_t1_features) __ro_after_init;
    EXPORT_SYMBOL_GPL(phy_basic_t1_features);

    +__ETHTOOL_DECLARE_LINK_MODE_MASK(phy_basic_t1s_p2mp_features) __ro_after_init;
    +EXPORT_SYMBOL_GPL(phy_basic_t1s_p2mp_features);
    +
    __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_gbit_features) __ro_after_init;
    EXPORT_SYMBOL_GPL(phy_gbit_features);

    @@ -98,6 +101,12 @@ const int phy_basic_t1_features_array[3] = {
    };
    EXPORT_SYMBOL_GPL(phy_basic_t1_features_array);

    +const int phy_basic_t1s_p2mp_features_array[2] = {
    + ETHTOOL_LINK_MODE_TP_BIT,
    + ETHTOOL_LINK_MODE_10baseT1S_P2MP_Half_BIT,
    +};
    +EXPORT_SYMBOL_GPL(phy_basic_t1s_p2mp_features_array);
    +
    const int phy_gbit_features_array[2] = {
    ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
    ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
    @@ -138,6 +147,11 @@ static void features_init(void)
    ARRAY_SIZE(phy_basic_t1_features_array),
    phy_basic_t1_features);

    + /* 10 half, P2MP, TP */
    + linkmode_set_bit_array(phy_basic_t1s_p2mp_features_array,
    + ARRAY_SIZE(phy_basic_t1s_p2mp_features_array),
    + phy_basic_t1s_p2mp_features);
    +
    /* 10/100 half/full + 1000 half/full */
    linkmode_set_bit_array(phy_basic_ports_array,
    ARRAY_SIZE(phy_basic_ports_array),
    diff --git a/drivers/net/phy/phylink.c b/drivers/net/phy/phylink.c
    index 09cc65c0da93..319790221d7f 100644
    --- a/drivers/net/phy/phylink.c
    +++ b/drivers/net/phy/phylink.c
    @@ -241,12 +241,16 @@ void phylink_caps_to_linkmodes(unsigned long *linkmodes, unsigned long caps)
    if (caps & MAC_ASYM_PAUSE)
    __set_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, linkmodes);

    - if (caps & MAC_10HD)
    + if (caps & MAC_10HD) {
    __set_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, linkmodes);
    + __set_bit(ETHTOOL_LINK_MODE_10baseT1S_Half_BIT, linkmodes);
    + __set_bit(ETHTOOL_LINK_MODE_10baseT1S_P2MP_Half_BIT, linkmodes);
    + }

    if (caps & MAC_10FD) {
    __set_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, linkmodes);
    __set_bit(ETHTOOL_LINK_MODE_10baseT1L_Full_BIT, linkmodes);
    + __set_bit(ETHTOOL_LINK_MODE_10baseT1S_Full_BIT, linkmodes);
    }

    if (caps & MAC_100HD) {
    diff --git a/include/linux/phy.h b/include/linux/phy.h
    index c2c04b989cc2..2a5c2d3a5da5 100644
    --- a/include/linux/phy.h
    +++ b/include/linux/phy.h
    @@ -45,6 +45,7 @@

    extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_basic_features) __ro_after_init;
    extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_basic_t1_features) __ro_after_init;
    +extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_basic_t1s_p2mp_features) __ro_after_init;
    extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_gbit_features) __ro_after_init;
    extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_gbit_fibre_features) __ro_after_init;
    extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_gbit_all_ports_features) __ro_after_init;
    @@ -54,6 +55,7 @@ extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_10gbit_full_features) __ro_after_ini

    #define PHY_BASIC_FEATURES ((unsigned long *)&phy_basic_features)
    #define PHY_BASIC_T1_FEATURES ((unsigned long *)&phy_basic_t1_features)
    +#define PHY_BASIC_T1S_P2MP_FEATURES ((unsigned long *)&phy_basic_t1s_p2mp_features)
    #define PHY_GBIT_FEATURES ((unsigned long *)&phy_gbit_features)
    #define PHY_GBIT_FIBRE_FEATURES ((unsigned long *)&phy_gbit_fibre_features)
    #define PHY_GBIT_ALL_PORTS_FEATURES ((unsigned long *)&phy_gbit_all_ports_features)
    @@ -1036,6 +1038,17 @@ struct phy_driver {
    int (*get_sqi)(struct phy_device *dev);
    /** @get_sqi_max: Get the maximum signal quality indication */
    int (*get_sqi_max)(struct phy_device *dev);
    +
    + /* PLCA RS interface */
    + /** @get_plca_cfg: Return the current PLCA configuration */
    + int (*get_plca_cfg)(struct phy_device *dev,
    + struct phy_plca_cfg *plca_cfg);
    + /** @set_plca_cfg: Set the PLCA configuration */
    + int (*set_plca_cfg)(struct phy_device *dev,
    + const struct phy_plca_cfg *plca_cfg);
    + /** @get_plca_status: Return the current PLCA status info */
    + int (*get_plca_status)(struct phy_device *dev,
    + struct phy_plca_status *plca_st);
    };
    #define to_phy_driver(d) container_of(to_mdio_common_driver(d), \
    struct phy_driver, mdiodrv)
    diff --git a/include/uapi/linux/ethtool.h b/include/uapi/linux/ethtool.h
    index 58e587ba0450..5f414deacf23 100644
    --- a/include/uapi/linux/ethtool.h
    +++ b/include/uapi/linux/ethtool.h
    @@ -1741,6 +1741,9 @@ enum ethtool_link_mode_bit_indices {
    ETHTOOL_LINK_MODE_800000baseDR8_2_Full_BIT = 96,
    ETHTOOL_LINK_MODE_800000baseSR8_Full_BIT = 97,
    ETHTOOL_LINK_MODE_800000baseVR8_Full_BIT = 98,
    + ETHTOOL_LINK_MODE_10baseT1S_Full_BIT = 99,
    + ETHTOOL_LINK_MODE_10baseT1S_Half_BIT = 100,
    + ETHTOOL_LINK_MODE_10baseT1S_P2MP_Half_BIT = 101,

    /* must be last entry */
    __ETHTOOL_LINK_MODE_MASK_NBITS
    diff --git a/net/ethtool/common.c b/net/ethtool/common.c
    index 6f399afc2ff2..5fb19050991e 100644
    --- a/net/ethtool/common.c
    +++ b/net/ethtool/common.c
    @@ -208,6 +208,9 @@ const char link_mode_names[][ETH_GSTRING_LEN] = {
    __DEFINE_LINK_MODE_NAME(800000, DR8_2, Full),
    __DEFINE_LINK_MODE_NAME(800000, SR8, Full),
    __DEFINE_LINK_MODE_NAME(800000, VR8, Full),
    + __DEFINE_LINK_MODE_NAME(10, T1S, Full),
    + __DEFINE_LINK_MODE_NAME(10, T1S, Half),
    + __DEFINE_LINK_MODE_NAME(10, T1S_P2MP, Half),
    };
    static_assert(ARRAY_SIZE(link_mode_names) == __ETHTOOL_LINK_MODE_MASK_NBITS);

    @@ -244,6 +247,8 @@ static_assert(ARRAY_SIZE(link_mode_names) == __ETHTOOL_LINK_MODE_MASK_NBITS);
    #define __LINK_MODE_LANES_X 1
    #define __LINK_MODE_LANES_FX 1
    #define __LINK_MODE_LANES_T1L 1
    +#define __LINK_MODE_LANES_T1S 1
    +#define __LINK_MODE_LANES_T1S_P2MP 1
    #define __LINK_MODE_LANES_VR8 8
    #define __LINK_MODE_LANES_DR8_2 8

    @@ -366,6 +371,9 @@ const struct link_mode_info link_mode_params[] = {
    __DEFINE_LINK_MODE_PARAMS(800000, DR8_2, Full),
    __DEFINE_LINK_MODE_PARAMS(800000, SR8, Full),
    __DEFINE_LINK_MODE_PARAMS(800000, VR8, Full),
    + __DEFINE_LINK_MODE_PARAMS(10, T1S, Full),
    + __DEFINE_LINK_MODE_PARAMS(10, T1S, Half),
    + __DEFINE_LINK_MODE_PARAMS(10, T1S_P2MP, Half),
    };
    static_assert(ARRAY_SIZE(link_mode_params) == __ETHTOOL_LINK_MODE_MASK_NBITS);

    --
    2.37.4
    \
     
     \ /
      Last update: 2022-12-17 01:50    [W:3.606 / U:1.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site