Commit 54e1ed69 authored by Vladimir Oltean's avatar Vladimir Oltean Committed by Jakub Kicinski

net: lan966x: convert to ndo_hwtstamp_get() and ndo_hwtstamp_set()

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: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: default avatarJacob Keller <jacob.e.keller@intel.com>
Tested-by: default avatarHoratiu Vultur <horatiu.vultur@microchip.com>
Link: https://lore.kernel.org/r/20230801142824.1772134-10-vladimir.oltean@nxp.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 7bdde444
...@@ -450,39 +450,44 @@ static int lan966x_port_get_parent_id(struct net_device *dev, ...@@ -450,39 +450,44 @@ static int lan966x_port_get_parent_id(struct net_device *dev,
return 0; return 0;
} }
static int lan966x_port_ioctl(struct net_device *dev, struct ifreq *ifr, static int lan966x_port_hwtstamp_get(struct net_device *dev,
int cmd) struct kernel_hwtstamp_config *cfg)
{ {
struct lan966x_port *port = netdev_priv(dev); struct lan966x_port *port = netdev_priv(dev);
int err;
if (cmd == SIOCSHWTSTAMP) { if (phy_has_hwtstamp(dev->phydev))
err = lan966x_ptp_setup_traps(port, ifr); return phy_mii_ioctl(dev->phydev, cfg->ifr, SIOCGHWTSTAMP);
if (err)
return err;
}
if (!phy_has_hwtstamp(dev->phydev) && port->lan966x->ptp) { if (!port->lan966x->ptp)
switch (cmd) { return -EOPNOTSUPP;
case SIOCSHWTSTAMP:
err = lan966x_ptp_hwtstamp_set(port, ifr);
if (err)
lan966x_ptp_del_traps(port);
return err; lan966x_ptp_hwtstamp_get(port, cfg);
case SIOCGHWTSTAMP:
return lan966x_ptp_hwtstamp_get(port, ifr);
}
}
if (!dev->phydev) return 0;
return -ENODEV; }
err = phy_mii_ioctl(dev->phydev, ifr, cmd); static int lan966x_port_hwtstamp_set(struct net_device *dev,
if (err && cmd == SIOCSHWTSTAMP) struct kernel_hwtstamp_config *cfg,
lan966x_ptp_del_traps(port); 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 = { static const struct net_device_ops lan966x_port_netdev_ops = {
...@@ -495,10 +500,12 @@ 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_get_stats64 = lan966x_stats_get,
.ndo_set_mac_address = lan966x_port_set_mac_address, .ndo_set_mac_address = lan966x_port_set_mac_address,
.ndo_get_port_parent_id = lan966x_port_get_parent_id, .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_setup_tc = lan966x_tc_setup,
.ndo_bpf = lan966x_xdp, .ndo_bpf = lan966x_xdp,
.ndo_xdp_xmit = lan966x_xdp_xmit, .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) bool lan966x_netdevice_check(const struct net_device *dev)
......
...@@ -298,7 +298,7 @@ struct lan966x_phc { ...@@ -298,7 +298,7 @@ struct lan966x_phc {
struct ptp_clock *clock; struct ptp_clock *clock;
struct ptp_clock_info info; struct ptp_clock_info info;
struct ptp_pin_desc pins[LAN966X_PHC_PINS_NUM]; struct ptp_pin_desc pins[LAN966X_PHC_PINS_NUM];
struct hwtstamp_config hwtstamp_config; struct kernel_hwtstamp_config hwtstamp_config;
struct lan966x *lan966x; struct lan966x *lan966x;
u8 index; u8 index;
}; };
...@@ -578,8 +578,11 @@ void lan966x_mdb_restore_entries(struct lan966x *lan966x); ...@@ -578,8 +578,11 @@ void lan966x_mdb_restore_entries(struct lan966x *lan966x);
int lan966x_ptp_init(struct lan966x *lan966x); int lan966x_ptp_init(struct lan966x *lan966x);
void lan966x_ptp_deinit(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_set(struct lan966x_port *port,
int lan966x_ptp_hwtstamp_get(struct lan966x_port *port, struct ifreq *ifr); 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, void lan966x_ptp_rxtstamp(struct lan966x *lan966x, struct sk_buff *skb,
u64 src_port, u64 timestamp); u64 src_port, u64 timestamp);
int lan966x_ptp_txtstamp_request(struct lan966x_port *port, int lan966x_ptp_txtstamp_request(struct lan966x_port *port,
...@@ -590,7 +593,8 @@ irqreturn_t lan966x_ptp_irq_handler(int irq, void *args); ...@@ -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); irqreturn_t lan966x_ptp_ext_irq_handler(int irq, void *args);
u32 lan966x_ptp_get_period_ps(void); u32 lan966x_ptp_get_period_ps(void);
int lan966x_ptp_gettime64(struct ptp_clock_info *ptp, struct timespec64 *ts); 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_ptp_del_traps(struct lan966x_port *port);
int lan966x_fdma_xmit(struct sk_buff *skb, __be32 *ifh, struct net_device *dev); int lan966x_fdma_xmit(struct sk_buff *skb, __be32 *ifh, struct net_device *dev);
......
...@@ -248,29 +248,23 @@ int lan966x_ptp_del_traps(struct lan966x_port *port) ...@@ -248,29 +248,23 @@ int lan966x_ptp_del_traps(struct lan966x_port *port)
return err; 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 (cfg->rx_filter == HWTSTAMP_FILTER_NONE)
if (copy_from_user(&cfg, ifr->ifr_data, sizeof(cfg)))
return -EFAULT;
if (cfg.rx_filter == HWTSTAMP_FILTER_NONE)
return lan966x_ptp_del_traps(port); return lan966x_ptp_del_traps(port);
else else
return lan966x_ptp_add_traps(port); 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 lan966x *lan966x = port->lan966x;
struct hwtstamp_config cfg;
struct lan966x_phc *phc; struct lan966x_phc *phc;
if (copy_from_user(&cfg, ifr->ifr_data, sizeof(cfg))) switch (cfg->tx_type) {
return -EFAULT;
switch (cfg.tx_type) {
case HWTSTAMP_TX_ON: case HWTSTAMP_TX_ON:
port->ptp_tx_cmd = IFH_REW_OP_TWO_STEP_PTP; port->ptp_tx_cmd = IFH_REW_OP_TWO_STEP_PTP;
break; break;
...@@ -284,7 +278,7 @@ int lan966x_ptp_hwtstamp_set(struct lan966x_port *port, struct ifreq *ifr) ...@@ -284,7 +278,7 @@ int lan966x_ptp_hwtstamp_set(struct lan966x_port *port, struct ifreq *ifr)
return -ERANGE; return -ERANGE;
} }
switch (cfg.rx_filter) { switch (cfg->rx_filter) {
case HWTSTAMP_FILTER_NONE: case HWTSTAMP_FILTER_NONE:
port->ptp_rx_cmd = false; port->ptp_rx_cmd = false;
break; break;
...@@ -303,7 +297,7 @@ int lan966x_ptp_hwtstamp_set(struct lan966x_port *port, struct ifreq *ifr) ...@@ -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_PTP_V2_DELAY_REQ:
case HWTSTAMP_FILTER_NTP_ALL: case HWTSTAMP_FILTER_NTP_ALL:
port->ptp_rx_cmd = true; port->ptp_rx_cmd = true;
cfg.rx_filter = HWTSTAMP_FILTER_ALL; cfg->rx_filter = HWTSTAMP_FILTER_ALL;
break; break;
default: default:
return -ERANGE; return -ERANGE;
...@@ -312,20 +306,20 @@ int lan966x_ptp_hwtstamp_set(struct lan966x_port *port, struct ifreq *ifr) ...@@ -312,20 +306,20 @@ int lan966x_ptp_hwtstamp_set(struct lan966x_port *port, struct ifreq *ifr)
/* Commit back the result & save it */ /* Commit back the result & save it */
mutex_lock(&lan966x->ptp_lock); mutex_lock(&lan966x->ptp_lock);
phc = &lan966x->phc[LAN966X_PHC_PORT]; phc = &lan966x->phc[LAN966X_PHC_PORT];
memcpy(&phc->hwtstamp_config, &cfg, sizeof(cfg)); phc->hwtstamp_config = *cfg;
mutex_unlock(&lan966x->ptp_lock); 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 *lan966x = port->lan966x;
struct lan966x_phc *phc; struct lan966x_phc *phc;
phc = &lan966x->phc[LAN966X_PHC_PORT]; phc = &lan966x->phc[LAN966X_PHC_PORT];
return copy_to_user(ifr->ifr_data, &phc->hwtstamp_config, *cfg = phc->hwtstamp_config;
sizeof(phc->hwtstamp_config)) ? -EFAULT : 0;
} }
static int lan966x_ptp_classify(struct lan966x_port *port, struct sk_buff *skb) static int lan966x_ptp_classify(struct lan966x_port *port, struct sk_buff *skb)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment