Skip to content

Commit 54e1ed6

Browse files
vladimirolteankuba-moo
authored andcommitted
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: 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>
1 parent 7bdde44 commit 54e1ed6

File tree

3 files changed

+55
-50
lines changed

3 files changed

+55
-50
lines changed

drivers/net/ethernet/microchip/lan966x/lan966x_main.c

Lines changed: 33 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -450,39 +450,44 @@ static int lan966x_port_get_parent_id(struct net_device *dev,
450450
return 0;
451451
}
452452

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

459-
if (cmd == SIOCSHWTSTAMP) {
460-
err = lan966x_ptp_setup_traps(port, ifr);
461-
if (err)
462-
return err;
463-
}
458+
if (phy_has_hwtstamp(dev->phydev))
459+
return phy_mii_ioctl(dev->phydev, cfg->ifr, SIOCGHWTSTAMP);
464460

465-
if (!phy_has_hwtstamp(dev->phydev) && port->lan966x->ptp) {
466-
switch (cmd) {
467-
case SIOCSHWTSTAMP:
468-
err = lan966x_ptp_hwtstamp_set(port, ifr);
469-
if (err)
470-
lan966x_ptp_del_traps(port);
461+
if (!port->lan966x->ptp)
462+
return -EOPNOTSUPP;
471463

472-
return err;
473-
case SIOCGHWTSTAMP:
474-
return lan966x_ptp_hwtstamp_get(port, ifr);
475-
}
476-
}
464+
lan966x_ptp_hwtstamp_get(port, cfg);
477465

478-
if (!dev->phydev)
479-
return -ENODEV;
466+
return 0;
467+
}
480468

481-
err = phy_mii_ioctl(dev->phydev, ifr, cmd);
482-
if (err && cmd == SIOCSHWTSTAMP)
483-
lan966x_ptp_del_traps(port);
469+
static int lan966x_port_hwtstamp_set(struct net_device *dev,
470+
struct kernel_hwtstamp_config *cfg,
471+
struct netlink_ext_ack *extack)
472+
{
473+
struct lan966x_port *port = netdev_priv(dev);
474+
int err;
484475

485-
return err;
476+
err = lan966x_ptp_setup_traps(port, cfg);
477+
if (err)
478+
return err;
479+
480+
if (phy_has_hwtstamp(dev->phydev)) {
481+
err = phy_mii_ioctl(dev->phydev, cfg->ifr, SIOCSHWTSTAMP);
482+
if (err)
483+
lan966x_ptp_del_traps(port);
484+
return err;
485+
}
486+
487+
if (!port->lan966x->ptp)
488+
return -EOPNOTSUPP;
489+
490+
return lan966x_ptp_hwtstamp_set(port, cfg, extack);
486491
}
487492

488493
static const struct net_device_ops lan966x_port_netdev_ops = {
@@ -495,10 +500,12 @@ static const struct net_device_ops lan966x_port_netdev_ops = {
495500
.ndo_get_stats64 = lan966x_stats_get,
496501
.ndo_set_mac_address = lan966x_port_set_mac_address,
497502
.ndo_get_port_parent_id = lan966x_port_get_parent_id,
498-
.ndo_eth_ioctl = lan966x_port_ioctl,
503+
.ndo_eth_ioctl = phy_do_ioctl,
499504
.ndo_setup_tc = lan966x_tc_setup,
500505
.ndo_bpf = lan966x_xdp,
501506
.ndo_xdp_xmit = lan966x_xdp_xmit,
507+
.ndo_hwtstamp_get = lan966x_port_hwtstamp_get,
508+
.ndo_hwtstamp_set = lan966x_port_hwtstamp_set,
502509
};
503510

504511
bool lan966x_netdevice_check(const struct net_device *dev)

drivers/net/ethernet/microchip/lan966x/lan966x_main.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ struct lan966x_phc {
298298
struct ptp_clock *clock;
299299
struct ptp_clock_info info;
300300
struct ptp_pin_desc pins[LAN966X_PHC_PINS_NUM];
301-
struct hwtstamp_config hwtstamp_config;
301+
struct kernel_hwtstamp_config hwtstamp_config;
302302
struct lan966x *lan966x;
303303
u8 index;
304304
};
@@ -578,8 +578,11 @@ void lan966x_mdb_restore_entries(struct lan966x *lan966x);
578578

579579
int lan966x_ptp_init(struct lan966x *lan966x);
580580
void lan966x_ptp_deinit(struct lan966x *lan966x);
581-
int lan966x_ptp_hwtstamp_set(struct lan966x_port *port, struct ifreq *ifr);
582-
int lan966x_ptp_hwtstamp_get(struct lan966x_port *port, struct ifreq *ifr);
581+
int lan966x_ptp_hwtstamp_set(struct lan966x_port *port,
582+
struct kernel_hwtstamp_config *cfg,
583+
struct netlink_ext_ack *extack);
584+
void lan966x_ptp_hwtstamp_get(struct lan966x_port *port,
585+
struct kernel_hwtstamp_config *cfg);
583586
void lan966x_ptp_rxtstamp(struct lan966x *lan966x, struct sk_buff *skb,
584587
u64 src_port, u64 timestamp);
585588
int lan966x_ptp_txtstamp_request(struct lan966x_port *port,
@@ -590,7 +593,8 @@ irqreturn_t lan966x_ptp_irq_handler(int irq, void *args);
590593
irqreturn_t lan966x_ptp_ext_irq_handler(int irq, void *args);
591594
u32 lan966x_ptp_get_period_ps(void);
592595
int lan966x_ptp_gettime64(struct ptp_clock_info *ptp, struct timespec64 *ts);
593-
int lan966x_ptp_setup_traps(struct lan966x_port *port, struct ifreq *ifr);
596+
int lan966x_ptp_setup_traps(struct lan966x_port *port,
597+
struct kernel_hwtstamp_config *cfg);
594598
int lan966x_ptp_del_traps(struct lan966x_port *port);
595599

596600
int lan966x_fdma_xmit(struct sk_buff *skb, __be32 *ifh, struct net_device *dev);

drivers/net/ethernet/microchip/lan966x/lan966x_ptp.c

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -248,29 +248,23 @@ int lan966x_ptp_del_traps(struct lan966x_port *port)
248248
return err;
249249
}
250250

251-
int lan966x_ptp_setup_traps(struct lan966x_port *port, struct ifreq *ifr)
251+
int lan966x_ptp_setup_traps(struct lan966x_port *port,
252+
struct kernel_hwtstamp_config *cfg)
252253
{
253-
struct hwtstamp_config cfg;
254-
255-
if (copy_from_user(&cfg, ifr->ifr_data, sizeof(cfg)))
256-
return -EFAULT;
257-
258-
if (cfg.rx_filter == HWTSTAMP_FILTER_NONE)
254+
if (cfg->rx_filter == HWTSTAMP_FILTER_NONE)
259255
return lan966x_ptp_del_traps(port);
260256
else
261257
return lan966x_ptp_add_traps(port);
262258
}
263259

264-
int lan966x_ptp_hwtstamp_set(struct lan966x_port *port, struct ifreq *ifr)
260+
int lan966x_ptp_hwtstamp_set(struct lan966x_port *port,
261+
struct kernel_hwtstamp_config *cfg,
262+
struct netlink_ext_ack *extack)
265263
{
266264
struct lan966x *lan966x = port->lan966x;
267-
struct hwtstamp_config cfg;
268265
struct lan966x_phc *phc;
269266

270-
if (copy_from_user(&cfg, ifr->ifr_data, sizeof(cfg)))
271-
return -EFAULT;
272-
273-
switch (cfg.tx_type) {
267+
switch (cfg->tx_type) {
274268
case HWTSTAMP_TX_ON:
275269
port->ptp_tx_cmd = IFH_REW_OP_TWO_STEP_PTP;
276270
break;
@@ -284,7 +278,7 @@ int lan966x_ptp_hwtstamp_set(struct lan966x_port *port, struct ifreq *ifr)
284278
return -ERANGE;
285279
}
286280

287-
switch (cfg.rx_filter) {
281+
switch (cfg->rx_filter) {
288282
case HWTSTAMP_FILTER_NONE:
289283
port->ptp_rx_cmd = false;
290284
break;
@@ -303,7 +297,7 @@ int lan966x_ptp_hwtstamp_set(struct lan966x_port *port, struct ifreq *ifr)
303297
case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ:
304298
case HWTSTAMP_FILTER_NTP_ALL:
305299
port->ptp_rx_cmd = true;
306-
cfg.rx_filter = HWTSTAMP_FILTER_ALL;
300+
cfg->rx_filter = HWTSTAMP_FILTER_ALL;
307301
break;
308302
default:
309303
return -ERANGE;
@@ -312,20 +306,20 @@ int lan966x_ptp_hwtstamp_set(struct lan966x_port *port, struct ifreq *ifr)
312306
/* Commit back the result & save it */
313307
mutex_lock(&lan966x->ptp_lock);
314308
phc = &lan966x->phc[LAN966X_PHC_PORT];
315-
memcpy(&phc->hwtstamp_config, &cfg, sizeof(cfg));
309+
phc->hwtstamp_config = *cfg;
316310
mutex_unlock(&lan966x->ptp_lock);
317311

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

321-
int lan966x_ptp_hwtstamp_get(struct lan966x_port *port, struct ifreq *ifr)
315+
void lan966x_ptp_hwtstamp_get(struct lan966x_port *port,
316+
struct kernel_hwtstamp_config *cfg)
322317
{
323318
struct lan966x *lan966x = port->lan966x;
324319
struct lan966x_phc *phc;
325320

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

331325
static int lan966x_ptp_classify(struct lan966x_port *port, struct sk_buff *skb)

0 commit comments

Comments
 (0)