lkml.org 
[lkml]   [2023]   [Aug]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v9 net-next 09/12] net: lan966x: convert to ndo_hwtstamp_get() and ndo_hwtstamp_set()
    Date
    The hardware timestamping through ndo_eth_ioctl() is going away.
    Convert the lan966x driver to the new API before that can be removed.

    After removing the timestamping logic from lan966x_port_ioctl(), the
    rest is equivalent to phy_do_ioctl().

    Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
    Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
    Tested-by: Horatiu Vultur <horatiu.vultur@microchip.com>
    ---
    Changes in v9:
    - None
    Changes in v8:
    - Use phy_do_ioctl()
    Changes in v7:
    - Patch is new

    .../ethernet/microchip/lan966x/lan966x_main.c | 59 +++++++++++--------
    .../ethernet/microchip/lan966x/lan966x_main.h | 12 ++--
    .../ethernet/microchip/lan966x/lan966x_ptp.c | 34 +++++------
    3 files changed, 55 insertions(+), 50 deletions(-)

    diff --git a/drivers/net/ethernet/microchip/lan966x/lan966x_main.c b/drivers/net/ethernet/microchip/lan966x/lan966x_main.c
    index 73f20683210e..1baa94a98fe3 100644
    --- a/drivers/net/ethernet/microchip/lan966x/lan966x_main.c
    +++ b/drivers/net/ethernet/microchip/lan966x/lan966x_main.c
    @@ -450,39 +450,44 @@ static int lan966x_port_get_parent_id(struct net_device *dev,
    return 0;
    }

    -static int lan966x_port_ioctl(struct net_device *dev, struct ifreq *ifr,
    - int cmd)
    +static int lan966x_port_hwtstamp_get(struct net_device *dev,
    + struct kernel_hwtstamp_config *cfg)
    {
    struct lan966x_port *port = netdev_priv(dev);
    - int err;

    - if (cmd == SIOCSHWTSTAMP) {
    - err = lan966x_ptp_setup_traps(port, ifr);
    - if (err)
    - return err;
    - }
    + if (phy_has_hwtstamp(dev->phydev))
    + return phy_mii_ioctl(dev->phydev, cfg->ifr, SIOCGHWTSTAMP);

    - if (!phy_has_hwtstamp(dev->phydev) && port->lan966x->ptp) {
    - switch (cmd) {
    - case SIOCSHWTSTAMP:
    - err = lan966x_ptp_hwtstamp_set(port, ifr);
    - if (err)
    - lan966x_ptp_del_traps(port);
    + if (!port->lan966x->ptp)
    + return -EOPNOTSUPP;

    - return err;
    - case SIOCGHWTSTAMP:
    - return lan966x_ptp_hwtstamp_get(port, ifr);
    - }
    - }
    + lan966x_ptp_hwtstamp_get(port, cfg);

    - if (!dev->phydev)
    - return -ENODEV;
    + return 0;
    +}

    - err = phy_mii_ioctl(dev->phydev, ifr, cmd);
    - if (err && cmd == SIOCSHWTSTAMP)
    - lan966x_ptp_del_traps(port);
    +static int lan966x_port_hwtstamp_set(struct net_device *dev,
    + struct kernel_hwtstamp_config *cfg,
    + struct netlink_ext_ack *extack)
    +{
    + struct lan966x_port *port = netdev_priv(dev);
    + int err;

    - return err;
    + err = lan966x_ptp_setup_traps(port, cfg);
    + if (err)
    + return err;
    +
    + if (phy_has_hwtstamp(dev->phydev)) {
    + err = phy_mii_ioctl(dev->phydev, cfg->ifr, SIOCSHWTSTAMP);
    + if (err)
    + lan966x_ptp_del_traps(port);
    + return err;
    + }
    +
    + if (!port->lan966x->ptp)
    + return -EOPNOTSUPP;
    +
    + return lan966x_ptp_hwtstamp_set(port, cfg, extack);
    }

    static const struct net_device_ops lan966x_port_netdev_ops = {
    @@ -495,10 +500,12 @@ static const struct net_device_ops lan966x_port_netdev_ops = {
    .ndo_get_stats64 = lan966x_stats_get,
    .ndo_set_mac_address = lan966x_port_set_mac_address,
    .ndo_get_port_parent_id = lan966x_port_get_parent_id,
    - .ndo_eth_ioctl = lan966x_port_ioctl,
    + .ndo_eth_ioctl = phy_do_ioctl,
    .ndo_setup_tc = lan966x_tc_setup,
    .ndo_bpf = lan966x_xdp,
    .ndo_xdp_xmit = lan966x_xdp_xmit,
    + .ndo_hwtstamp_get = lan966x_port_hwtstamp_get,
    + .ndo_hwtstamp_set = lan966x_port_hwtstamp_set,
    };

    bool lan966x_netdevice_check(const struct net_device *dev)
    diff --git a/drivers/net/ethernet/microchip/lan966x/lan966x_main.h b/drivers/net/ethernet/microchip/lan966x/lan966x_main.h
    index 27f272831ea5..b538d496e8d7 100644
    --- a/drivers/net/ethernet/microchip/lan966x/lan966x_main.h
    +++ b/drivers/net/ethernet/microchip/lan966x/lan966x_main.h
    @@ -298,7 +298,7 @@ struct lan966x_phc {
    struct ptp_clock *clock;
    struct ptp_clock_info info;
    struct ptp_pin_desc pins[LAN966X_PHC_PINS_NUM];
    - struct hwtstamp_config hwtstamp_config;
    + struct kernel_hwtstamp_config hwtstamp_config;
    struct lan966x *lan966x;
    u8 index;
    };
    @@ -578,8 +578,11 @@ void lan966x_mdb_restore_entries(struct lan966x *lan966x);

    int lan966x_ptp_init(struct lan966x *lan966x);
    void lan966x_ptp_deinit(struct lan966x *lan966x);
    -int lan966x_ptp_hwtstamp_set(struct lan966x_port *port, struct ifreq *ifr);
    -int lan966x_ptp_hwtstamp_get(struct lan966x_port *port, struct ifreq *ifr);
    +int lan966x_ptp_hwtstamp_set(struct lan966x_port *port,
    + struct kernel_hwtstamp_config *cfg,
    + struct netlink_ext_ack *extack);
    +void lan966x_ptp_hwtstamp_get(struct lan966x_port *port,
    + struct kernel_hwtstamp_config *cfg);
    void lan966x_ptp_rxtstamp(struct lan966x *lan966x, struct sk_buff *skb,
    u64 src_port, u64 timestamp);
    int lan966x_ptp_txtstamp_request(struct lan966x_port *port,
    @@ -590,7 +593,8 @@ irqreturn_t lan966x_ptp_irq_handler(int irq, void *args);
    irqreturn_t lan966x_ptp_ext_irq_handler(int irq, void *args);
    u32 lan966x_ptp_get_period_ps(void);
    int lan966x_ptp_gettime64(struct ptp_clock_info *ptp, struct timespec64 *ts);
    -int lan966x_ptp_setup_traps(struct lan966x_port *port, struct ifreq *ifr);
    +int lan966x_ptp_setup_traps(struct lan966x_port *port,
    + struct kernel_hwtstamp_config *cfg);
    int lan966x_ptp_del_traps(struct lan966x_port *port);

    int lan966x_fdma_xmit(struct sk_buff *skb, __be32 *ifh, struct net_device *dev);
    diff --git a/drivers/net/ethernet/microchip/lan966x/lan966x_ptp.c b/drivers/net/ethernet/microchip/lan966x/lan966x_ptp.c
    index 266a21a2d124..60bd0cff6677 100644
    --- a/drivers/net/ethernet/microchip/lan966x/lan966x_ptp.c
    +++ b/drivers/net/ethernet/microchip/lan966x/lan966x_ptp.c
    @@ -248,29 +248,23 @@ int lan966x_ptp_del_traps(struct lan966x_port *port)
    return err;
    }

    -int lan966x_ptp_setup_traps(struct lan966x_port *port, struct ifreq *ifr)
    +int lan966x_ptp_setup_traps(struct lan966x_port *port,
    + struct kernel_hwtstamp_config *cfg)
    {
    - struct hwtstamp_config cfg;
    -
    - if (copy_from_user(&cfg, ifr->ifr_data, sizeof(cfg)))
    - return -EFAULT;
    -
    - if (cfg.rx_filter == HWTSTAMP_FILTER_NONE)
    + if (cfg->rx_filter == HWTSTAMP_FILTER_NONE)
    return lan966x_ptp_del_traps(port);
    else
    return lan966x_ptp_add_traps(port);
    }

    -int lan966x_ptp_hwtstamp_set(struct lan966x_port *port, struct ifreq *ifr)
    +int lan966x_ptp_hwtstamp_set(struct lan966x_port *port,
    + struct kernel_hwtstamp_config *cfg,
    + struct netlink_ext_ack *extack)
    {
    struct lan966x *lan966x = port->lan966x;
    - struct hwtstamp_config cfg;
    struct lan966x_phc *phc;

    - if (copy_from_user(&cfg, ifr->ifr_data, sizeof(cfg)))
    - return -EFAULT;
    -
    - switch (cfg.tx_type) {
    + switch (cfg->tx_type) {
    case HWTSTAMP_TX_ON:
    port->ptp_tx_cmd = IFH_REW_OP_TWO_STEP_PTP;
    break;
    @@ -284,7 +278,7 @@ int lan966x_ptp_hwtstamp_set(struct lan966x_port *port, struct ifreq *ifr)
    return -ERANGE;
    }

    - switch (cfg.rx_filter) {
    + switch (cfg->rx_filter) {
    case HWTSTAMP_FILTER_NONE:
    port->ptp_rx_cmd = false;
    break;
    @@ -303,7 +297,7 @@ int lan966x_ptp_hwtstamp_set(struct lan966x_port *port, struct ifreq *ifr)
    case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ:
    case HWTSTAMP_FILTER_NTP_ALL:
    port->ptp_rx_cmd = true;
    - cfg.rx_filter = HWTSTAMP_FILTER_ALL;
    + cfg->rx_filter = HWTSTAMP_FILTER_ALL;
    break;
    default:
    return -ERANGE;
    @@ -312,20 +306,20 @@ int lan966x_ptp_hwtstamp_set(struct lan966x_port *port, struct ifreq *ifr)
    /* Commit back the result & save it */
    mutex_lock(&lan966x->ptp_lock);
    phc = &lan966x->phc[LAN966X_PHC_PORT];
    - memcpy(&phc->hwtstamp_config, &cfg, sizeof(cfg));
    + phc->hwtstamp_config = *cfg;
    mutex_unlock(&lan966x->ptp_lock);

    - return copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg)) ? -EFAULT : 0;
    + return 0;
    }

    -int lan966x_ptp_hwtstamp_get(struct lan966x_port *port, struct ifreq *ifr)
    +void lan966x_ptp_hwtstamp_get(struct lan966x_port *port,
    + struct kernel_hwtstamp_config *cfg)
    {
    struct lan966x *lan966x = port->lan966x;
    struct lan966x_phc *phc;

    phc = &lan966x->phc[LAN966X_PHC_PORT];
    - return copy_to_user(ifr->ifr_data, &phc->hwtstamp_config,
    - sizeof(phc->hwtstamp_config)) ? -EFAULT : 0;
    + *cfg = phc->hwtstamp_config;
    }

    static int lan966x_ptp_classify(struct lan966x_port *port, struct sk_buff *skb)
    --
    2.34.1
    \
     
     \ /
      Last update: 2023-08-01 16:31    [W:8.156 / U:0.588 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site