]> git.itanic.dy.fi Git - linux-stable/commitdiff
net: lan966x: convert to ndo_hwtstamp_get() and ndo_hwtstamp_set()
authorVladimir Oltean <vladimir.oltean@nxp.com>
Tue, 1 Aug 2023 14:28:21 +0000 (17:28 +0300)
committerJakub Kicinski <kuba@kernel.org>
Thu, 3 Aug 2023 02:11:06 +0000 (19:11 -0700)
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>
Link: https://lore.kernel.org/r/20230801142824.1772134-10-vladimir.oltean@nxp.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/microchip/lan966x/lan966x_main.c
drivers/net/ethernet/microchip/lan966x/lan966x_main.h
drivers/net/ethernet/microchip/lan966x/lan966x_ptp.c

index 73f20683210edfa7020c22ab1c6e29a94b182f39..1baa94a98fe3314401edeb023fad4772120c171e 100644 (file)
@@ -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)
index 27f272831ea5cda8260d4a2a7004a84bf396d0f7..b538d496e8d79058604688821e8bd86986920205 100644 (file)
@@ -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);
index 266a21a2d124698b00d1e4040b97714150d7f1da..60bd0cff6677033bdbdd3e1828960414b5b2664a 100644 (file)
@@ -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)