Commit 69317a53 authored by Ben Hutchings's avatar Ben Hutchings Committed by David S. Miller

tile_net: Always enable PTP clock support on TILE-Gx

All other net drivers with PTP support enable it unconditionally.
Make tile_net consistent with this.
Signed-off-by: default avatarBen Hutchings <bhutchings@solarflare.com>
Acked-by: default avatarChris Metcalf <cmetcalf@tilera.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent fcf93a0a
...@@ -9,20 +9,10 @@ config TILE_NET ...@@ -9,20 +9,10 @@ config TILE_NET
select CRC32 select CRC32
select TILE_GXIO_MPIPE if TILEGX select TILE_GXIO_MPIPE if TILEGX
select HIGH_RES_TIMERS if TILEGX select HIGH_RES_TIMERS if TILEGX
select PTP_1588_CLOCK if TILEGX
---help--- ---help---
This is a standard Linux network device driver for the This is a standard Linux network device driver for the
on-chip Tilera Gigabit Ethernet and XAUI interfaces. on-chip Tilera Gigabit Ethernet and XAUI interfaces.
To compile this driver as a module, choose M here: the module To compile this driver as a module, choose M here: the module
will be called tile_net. will be called tile_net.
config PTP_1588_CLOCK_TILEGX
tristate "Tilera TILE-Gx mPIPE as PTP clock"
select PTP_1588_CLOCK
depends on TILE_NET
depends on TILEGX
---help---
This driver adds support for using the mPIPE as a PTP
clock. This clock is only useful if your PTP programs are
getting hardware time stamps on the PTP Ethernet packets
using the SO_TIMESTAMPING API.
...@@ -187,10 +187,8 @@ struct tile_net_priv { ...@@ -187,10 +187,8 @@ struct tile_net_priv {
int echannel; int echannel;
/* mPIPE instance, 0 or 1. */ /* mPIPE instance, 0 or 1. */
int instance; int instance;
#ifdef CONFIG_PTP_1588_CLOCK_TILEGX
/* The timestamp config. */ /* The timestamp config. */
struct hwtstamp_config stamp_cfg; struct hwtstamp_config stamp_cfg;
#endif
}; };
static struct mpipe_data { static struct mpipe_data {
...@@ -229,14 +227,12 @@ static struct mpipe_data { ...@@ -229,14 +227,12 @@ static struct mpipe_data {
int first_bucket; int first_bucket;
int num_buckets; int num_buckets;
#ifdef CONFIG_PTP_1588_CLOCK_TILEGX
/* PTP-specific data. */ /* PTP-specific data. */
struct ptp_clock *ptp_clock; struct ptp_clock *ptp_clock;
struct ptp_clock_info caps; struct ptp_clock_info caps;
/* Lock for ptp accessors. */ /* Lock for ptp accessors. */
struct mutex ptp_lock; struct mutex ptp_lock;
#endif
} mpipe_data[NR_MPIPE_MAX] = { } mpipe_data[NR_MPIPE_MAX] = {
[0 ... (NR_MPIPE_MAX - 1)] { [0 ... (NR_MPIPE_MAX - 1)] {
...@@ -451,20 +447,17 @@ static void tile_net_provide_needed_buffers(void) ...@@ -451,20 +447,17 @@ static void tile_net_provide_needed_buffers(void)
static void tile_rx_timestamp(struct tile_net_priv *priv, struct sk_buff *skb, static void tile_rx_timestamp(struct tile_net_priv *priv, struct sk_buff *skb,
gxio_mpipe_idesc_t *idesc) gxio_mpipe_idesc_t *idesc)
{ {
#ifdef CONFIG_PTP_1588_CLOCK_TILEGX
if (unlikely(priv->stamp_cfg.rx_filter != HWTSTAMP_FILTER_NONE)) { if (unlikely(priv->stamp_cfg.rx_filter != HWTSTAMP_FILTER_NONE)) {
struct skb_shared_hwtstamps *shhwtstamps = skb_hwtstamps(skb); struct skb_shared_hwtstamps *shhwtstamps = skb_hwtstamps(skb);
memset(shhwtstamps, 0, sizeof(*shhwtstamps)); memset(shhwtstamps, 0, sizeof(*shhwtstamps));
shhwtstamps->hwtstamp = ktime_set(idesc->time_stamp_sec, shhwtstamps->hwtstamp = ktime_set(idesc->time_stamp_sec,
idesc->time_stamp_ns); idesc->time_stamp_ns);
} }
#endif
} }
/* Get TX timestamp, and store it in the skb. */ /* Get TX timestamp, and store it in the skb. */
static void tile_tx_timestamp(struct sk_buff *skb, int instance) static void tile_tx_timestamp(struct sk_buff *skb, int instance)
{ {
#ifdef CONFIG_PTP_1588_CLOCK_TILEGX
struct skb_shared_info *shtx = skb_shinfo(skb); struct skb_shared_info *shtx = skb_shinfo(skb);
if (unlikely((shtx->tx_flags & SKBTX_HW_TSTAMP) != 0)) { if (unlikely((shtx->tx_flags & SKBTX_HW_TSTAMP) != 0)) {
struct mpipe_data *md = &mpipe_data[instance]; struct mpipe_data *md = &mpipe_data[instance];
...@@ -477,13 +470,11 @@ static void tile_tx_timestamp(struct sk_buff *skb, int instance) ...@@ -477,13 +470,11 @@ static void tile_tx_timestamp(struct sk_buff *skb, int instance)
shhwtstamps.hwtstamp = ktime_set(ts.tv_sec, ts.tv_nsec); shhwtstamps.hwtstamp = ktime_set(ts.tv_sec, ts.tv_nsec);
skb_tstamp_tx(skb, &shhwtstamps); skb_tstamp_tx(skb, &shhwtstamps);
} }
#endif
} }
/* Use ioctl() to enable or disable TX or RX timestamping. */ /* Use ioctl() to enable or disable TX or RX timestamping. */
static int tile_hwtstamp_set(struct net_device *dev, struct ifreq *rq) static int tile_hwtstamp_set(struct net_device *dev, struct ifreq *rq)
{ {
#ifdef CONFIG_PTP_1588_CLOCK_TILEGX
struct hwtstamp_config config; struct hwtstamp_config config;
struct tile_net_priv *priv = netdev_priv(dev); struct tile_net_priv *priv = netdev_priv(dev);
...@@ -529,14 +520,10 @@ static int tile_hwtstamp_set(struct net_device *dev, struct ifreq *rq) ...@@ -529,14 +520,10 @@ static int tile_hwtstamp_set(struct net_device *dev, struct ifreq *rq)
priv->stamp_cfg = config; priv->stamp_cfg = config;
return 0; return 0;
#else
return -EOPNOTSUPP;
#endif
} }
static int tile_hwtstamp_get(struct net_device *dev, struct ifreq *rq) static int tile_hwtstamp_get(struct net_device *dev, struct ifreq *rq)
{ {
#ifdef CONFIG_PTP_1588_CLOCK_TILEGX
struct tile_net_priv *priv = netdev_priv(dev); struct tile_net_priv *priv = netdev_priv(dev);
if (copy_to_user(rq->ifr_data, &priv->stamp_cfg, if (copy_to_user(rq->ifr_data, &priv->stamp_cfg,
...@@ -544,9 +531,6 @@ static int tile_hwtstamp_get(struct net_device *dev, struct ifreq *rq) ...@@ -544,9 +531,6 @@ static int tile_hwtstamp_get(struct net_device *dev, struct ifreq *rq)
return -EFAULT; return -EFAULT;
return 0; return 0;
#else
return -EOPNOTSUPP;
#endif
} }
static inline bool filter_packet(struct net_device *dev, void *buf) static inline bool filter_packet(struct net_device *dev, void *buf)
...@@ -828,8 +812,6 @@ static enum hrtimer_restart tile_net_handle_egress_timer(struct hrtimer *t) ...@@ -828,8 +812,6 @@ static enum hrtimer_restart tile_net_handle_egress_timer(struct hrtimer *t)
return HRTIMER_NORESTART; return HRTIMER_NORESTART;
} }
#ifdef CONFIG_PTP_1588_CLOCK_TILEGX
/* PTP clock operations. */ /* PTP clock operations. */
static int ptp_mpipe_adjfreq(struct ptp_clock_info *ptp, s32 ppb) static int ptp_mpipe_adjfreq(struct ptp_clock_info *ptp, s32 ppb)
...@@ -896,12 +878,9 @@ static struct ptp_clock_info ptp_mpipe_caps = { ...@@ -896,12 +878,9 @@ static struct ptp_clock_info ptp_mpipe_caps = {
.enable = ptp_mpipe_enable, .enable = ptp_mpipe_enable,
}; };
#endif /* CONFIG_PTP_1588_CLOCK_TILEGX */
/* Sync mPIPE's timestamp up with Linux system time and register PTP clock. */ /* Sync mPIPE's timestamp up with Linux system time and register PTP clock. */
static void register_ptp_clock(struct net_device *dev, struct mpipe_data *md) static void register_ptp_clock(struct net_device *dev, struct mpipe_data *md)
{ {
#ifdef CONFIG_PTP_1588_CLOCK_TILEGX
struct timespec ts; struct timespec ts;
getnstimeofday(&ts); getnstimeofday(&ts);
...@@ -913,16 +892,13 @@ static void register_ptp_clock(struct net_device *dev, struct mpipe_data *md) ...@@ -913,16 +892,13 @@ static void register_ptp_clock(struct net_device *dev, struct mpipe_data *md)
if (IS_ERR(md->ptp_clock)) if (IS_ERR(md->ptp_clock))
netdev_err(dev, "ptp_clock_register failed %ld\n", netdev_err(dev, "ptp_clock_register failed %ld\n",
PTR_ERR(md->ptp_clock)); PTR_ERR(md->ptp_clock));
#endif
} }
/* Initialize PTP fields in a new device. */ /* Initialize PTP fields in a new device. */
static void init_ptp_dev(struct tile_net_priv *priv) static void init_ptp_dev(struct tile_net_priv *priv)
{ {
#ifdef CONFIG_PTP_1588_CLOCK_TILEGX
priv->stamp_cfg.rx_filter = HWTSTAMP_FILTER_NONE; priv->stamp_cfg.rx_filter = HWTSTAMP_FILTER_NONE;
priv->stamp_cfg.tx_type = HWTSTAMP_TX_OFF; priv->stamp_cfg.tx_type = HWTSTAMP_TX_OFF;
#endif
} }
/* Helper functions for "tile_net_update()". */ /* Helper functions for "tile_net_update()". */
......
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