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

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.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 7bdde444
Loading
Loading
Loading
Loading
+33 −26
Original line number Diff line number Diff line
@@ -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);

	if (phy_has_hwtstamp(dev->phydev))
		return phy_mii_ioctl(dev->phydev, cfg->ifr, SIOCGHWTSTAMP);

	if (!port->lan966x->ptp)
		return -EOPNOTSUPP;

	lan966x_ptp_hwtstamp_get(port, cfg);

	return 0;
}

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;

	if (cmd == SIOCSHWTSTAMP) {
		err = lan966x_ptp_setup_traps(port, ifr);
	err = lan966x_ptp_setup_traps(port, cfg);
	if (err)
		return err;
	}

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

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

	if (!dev->phydev)
		return -ENODEV;

	err = phy_mii_ioctl(dev->phydev, ifr, cmd);
	if (err && cmd == SIOCSHWTSTAMP)
		lan966x_ptp_del_traps(port);
	if (!port->lan966x->ptp)
		return -EOPNOTSUPP;

	return err;
	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)
+8 −4
Original line number Diff line number Diff line
@@ -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);
+14 −20
Original line number Diff line number Diff line
@@ -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)