Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ixp4xx_eth: Implement the SIOCGHWTSTAMP ioctl

This is untested.

Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>

+33 -3
+33 -3
drivers/net/ethernet/xscale/ixp4xx_eth.c
··· 373 373 __raw_writel(TX_SNAPSHOT_LOCKED, &regs->channel[ch].ch_event); 374 374 } 375 375 376 - static int hwtstamp_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd) 376 + static int hwtstamp_set(struct net_device *netdev, struct ifreq *ifr) 377 377 { 378 378 struct hwtstamp_config cfg; 379 379 struct ixp46x_ts_regs *regs; ··· 413 413 /* Clear out any old time stamps. */ 414 414 __raw_writel(TX_SNAPSHOT_LOCKED | RX_SNAPSHOT_LOCKED, 415 415 &regs->channel[ch].ch_event); 416 + 417 + return copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg)) ? -EFAULT : 0; 418 + } 419 + 420 + static int hwtstamp_get(struct net_device *netdev, struct ifreq *ifr) 421 + { 422 + struct hwtstamp_config cfg; 423 + struct port *port = netdev_priv(netdev); 424 + 425 + cfg.flags = 0; 426 + cfg.tx_type = port->hwts_tx_en ? HWTSTAMP_TX_ON : HWTSTAMP_TX_OFF; 427 + 428 + switch (port->hwts_rx_en) { 429 + case 0: 430 + cfg.rx_filter = HWTSTAMP_FILTER_NONE; 431 + break; 432 + case PTP_SLAVE_MODE: 433 + cfg.rx_filter = HWTSTAMP_FILTER_PTP_V1_L4_SYNC; 434 + break; 435 + case PTP_MASTER_MODE: 436 + cfg.rx_filter = HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ; 437 + break; 438 + default: 439 + WARN_ON_ONCE(1); 440 + return -ERANGE; 441 + } 416 442 417 443 return copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg)) ? -EFAULT : 0; 418 444 } ··· 985 959 if (!netif_running(dev)) 986 960 return -EINVAL; 987 961 988 - if (cpu_is_ixp46x() && cmd == SIOCSHWTSTAMP) 989 - return hwtstamp_ioctl(dev, req, cmd); 962 + if (cpu_is_ixp46x()) { 963 + if (cmd == SIOCSHWTSTAMP) 964 + return hwtstamp_set(dev, req); 965 + if (cmd == SIOCGHWTSTAMP) 966 + return hwtstamp_get(dev, req); 967 + } 990 968 991 969 return phy_mii_ioctl(port->phydev, req, cmd); 992 970 }