Commit cf536ea3 authored by Yangbo Lu's avatar Yangbo Lu Committed by David S. Miller

net: dsa: no longer identify PTP packet in core driver

Move ptp_classify_raw out of dsa core driver for handling tx
timestamp request. Let device drivers do this if they want.
Not all drivers want to limit tx timestamping for only PTP
packet.
Signed-off-by: default avatarYangbo Lu <yangbo.lu@nxp.com>
Tested-by: Kurt Kanzenbach's avatarKurt Kanzenbach <kurt@linutronix.de>
Acked-by: default avatarRichard Cochran <richardcochran@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent cfd12c06
...@@ -374,14 +374,19 @@ long hellcreek_hwtstamp_work(struct ptp_clock_info *ptp) ...@@ -374,14 +374,19 @@ long hellcreek_hwtstamp_work(struct ptp_clock_info *ptp)
} }
bool hellcreek_port_txtstamp(struct dsa_switch *ds, int port, bool hellcreek_port_txtstamp(struct dsa_switch *ds, int port,
struct sk_buff *clone, unsigned int type) struct sk_buff *clone)
{ {
struct hellcreek *hellcreek = ds->priv; struct hellcreek *hellcreek = ds->priv;
struct hellcreek_port_hwtstamp *ps; struct hellcreek_port_hwtstamp *ps;
struct ptp_header *hdr; struct ptp_header *hdr;
unsigned int type;
ps = &hellcreek->ports[port].port_hwtstamp; ps = &hellcreek->ports[port].port_hwtstamp;
type = ptp_classify_raw(clone);
if (type == PTP_CLASS_NONE)
return false;
/* Make sure the message is a PTP message that needs to be timestamped /* Make sure the message is a PTP message that needs to be timestamped
* and the interaction with the HW timestamping is enabled. If not, stop * and the interaction with the HW timestamping is enabled. If not, stop
* here * here
......
...@@ -45,7 +45,7 @@ int hellcreek_port_hwtstamp_get(struct dsa_switch *ds, int port, ...@@ -45,7 +45,7 @@ int hellcreek_port_hwtstamp_get(struct dsa_switch *ds, int port,
bool hellcreek_port_rxtstamp(struct dsa_switch *ds, int port, bool hellcreek_port_rxtstamp(struct dsa_switch *ds, int port,
struct sk_buff *clone, unsigned int type); struct sk_buff *clone, unsigned int type);
bool hellcreek_port_txtstamp(struct dsa_switch *ds, int port, bool hellcreek_port_txtstamp(struct dsa_switch *ds, int port,
struct sk_buff *clone, unsigned int type); struct sk_buff *clone);
int hellcreek_get_ts_info(struct dsa_switch *ds, int port, int hellcreek_get_ts_info(struct dsa_switch *ds, int port,
struct ethtool_ts_info *info); struct ethtool_ts_info *info);
......
...@@ -469,11 +469,16 @@ long mv88e6xxx_hwtstamp_work(struct ptp_clock_info *ptp) ...@@ -469,11 +469,16 @@ long mv88e6xxx_hwtstamp_work(struct ptp_clock_info *ptp)
} }
bool mv88e6xxx_port_txtstamp(struct dsa_switch *ds, int port, bool mv88e6xxx_port_txtstamp(struct dsa_switch *ds, int port,
struct sk_buff *clone, unsigned int type) struct sk_buff *clone)
{ {
struct mv88e6xxx_chip *chip = ds->priv; struct mv88e6xxx_chip *chip = ds->priv;
struct mv88e6xxx_port_hwtstamp *ps = &chip->port_hwtstamp[port]; struct mv88e6xxx_port_hwtstamp *ps = &chip->port_hwtstamp[port];
struct ptp_header *hdr; struct ptp_header *hdr;
unsigned int type;
type = ptp_classify_raw(clone);
if (type == PTP_CLASS_NONE)
return false;
hdr = mv88e6xxx_should_tstamp(chip, port, clone, type); hdr = mv88e6xxx_should_tstamp(chip, port, clone, type);
if (!hdr) if (!hdr)
......
...@@ -118,7 +118,7 @@ int mv88e6xxx_port_hwtstamp_get(struct dsa_switch *ds, int port, ...@@ -118,7 +118,7 @@ int mv88e6xxx_port_hwtstamp_get(struct dsa_switch *ds, int port,
bool mv88e6xxx_port_rxtstamp(struct dsa_switch *ds, int port, bool mv88e6xxx_port_rxtstamp(struct dsa_switch *ds, int port,
struct sk_buff *clone, unsigned int type); struct sk_buff *clone, unsigned int type);
bool mv88e6xxx_port_txtstamp(struct dsa_switch *ds, int port, bool mv88e6xxx_port_txtstamp(struct dsa_switch *ds, int port,
struct sk_buff *clone, unsigned int type); struct sk_buff *clone);
int mv88e6xxx_get_ts_info(struct dsa_switch *ds, int port, int mv88e6xxx_get_ts_info(struct dsa_switch *ds, int port,
struct ethtool_ts_info *info); struct ethtool_ts_info *info);
...@@ -152,8 +152,7 @@ static inline bool mv88e6xxx_port_rxtstamp(struct dsa_switch *ds, int port, ...@@ -152,8 +152,7 @@ static inline bool mv88e6xxx_port_rxtstamp(struct dsa_switch *ds, int port,
} }
static inline bool mv88e6xxx_port_txtstamp(struct dsa_switch *ds, int port, static inline bool mv88e6xxx_port_txtstamp(struct dsa_switch *ds, int port,
struct sk_buff *clone, struct sk_buff *clone)
unsigned int type)
{ {
return false; return false;
} }
......
...@@ -1396,7 +1396,7 @@ static bool felix_rxtstamp(struct dsa_switch *ds, int port, ...@@ -1396,7 +1396,7 @@ static bool felix_rxtstamp(struct dsa_switch *ds, int port,
} }
static bool felix_txtstamp(struct dsa_switch *ds, int port, static bool felix_txtstamp(struct dsa_switch *ds, int port,
struct sk_buff *clone, unsigned int type) struct sk_buff *clone)
{ {
struct ocelot *ocelot = ds->priv; struct ocelot *ocelot = ds->priv;
struct ocelot_port *ocelot_port = ocelot->ports[port]; struct ocelot_port *ocelot_port = ocelot->ports[port];
......
...@@ -435,8 +435,7 @@ bool sja1105_port_rxtstamp(struct dsa_switch *ds, int port, ...@@ -435,8 +435,7 @@ bool sja1105_port_rxtstamp(struct dsa_switch *ds, int port,
* the skb and have it available in DSA_SKB_CB in the .port_deferred_xmit * the skb and have it available in DSA_SKB_CB in the .port_deferred_xmit
* callback, where we will timestamp it synchronously. * callback, where we will timestamp it synchronously.
*/ */
bool sja1105_port_txtstamp(struct dsa_switch *ds, int port, bool sja1105_port_txtstamp(struct dsa_switch *ds, int port, struct sk_buff *skb)
struct sk_buff *skb, unsigned int type)
{ {
struct sja1105_private *priv = ds->priv; struct sja1105_private *priv = ds->priv;
struct sja1105_port *sp = &priv->ports[port]; struct sja1105_port *sp = &priv->ports[port];
......
...@@ -105,7 +105,7 @@ bool sja1105_port_rxtstamp(struct dsa_switch *ds, int port, ...@@ -105,7 +105,7 @@ bool sja1105_port_rxtstamp(struct dsa_switch *ds, int port,
struct sk_buff *skb, unsigned int type); struct sk_buff *skb, unsigned int type);
bool sja1105_port_txtstamp(struct dsa_switch *ds, int port, bool sja1105_port_txtstamp(struct dsa_switch *ds, int port,
struct sk_buff *skb, unsigned int type); struct sk_buff *skb);
int sja1105_hwtstamp_get(struct dsa_switch *ds, int port, struct ifreq *ifr); int sja1105_hwtstamp_get(struct dsa_switch *ds, int port, struct ifreq *ifr);
......
...@@ -741,7 +741,7 @@ struct dsa_switch_ops { ...@@ -741,7 +741,7 @@ struct dsa_switch_ops {
int (*port_hwtstamp_set)(struct dsa_switch *ds, int port, int (*port_hwtstamp_set)(struct dsa_switch *ds, int port,
struct ifreq *ifr); struct ifreq *ifr);
bool (*port_txtstamp)(struct dsa_switch *ds, int port, bool (*port_txtstamp)(struct dsa_switch *ds, int port,
struct sk_buff *clone, unsigned int type); struct sk_buff *clone);
bool (*port_rxtstamp)(struct dsa_switch *ds, int port, bool (*port_rxtstamp)(struct dsa_switch *ds, int port,
struct sk_buff *skb, unsigned int type); struct sk_buff *skb, unsigned int type);
......
...@@ -20,7 +20,6 @@ ...@@ -20,7 +20,6 @@
#include <linux/if_bridge.h> #include <linux/if_bridge.h>
#include <linux/if_hsr.h> #include <linux/if_hsr.h>
#include <linux/netpoll.h> #include <linux/netpoll.h>
#include <linux/ptp_classify.h>
#include "dsa_priv.h" #include "dsa_priv.h"
...@@ -557,15 +556,10 @@ static void dsa_skb_tx_timestamp(struct dsa_slave_priv *p, ...@@ -557,15 +556,10 @@ static void dsa_skb_tx_timestamp(struct dsa_slave_priv *p,
{ {
struct dsa_switch *ds = p->dp->ds; struct dsa_switch *ds = p->dp->ds;
struct sk_buff *clone; struct sk_buff *clone;
unsigned int type;
if (!(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)) if (!(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP))
return; return;
type = ptp_classify_raw(skb);
if (type == PTP_CLASS_NONE)
return;
if (!ds->ops->port_txtstamp) if (!ds->ops->port_txtstamp)
return; return;
...@@ -573,7 +567,7 @@ static void dsa_skb_tx_timestamp(struct dsa_slave_priv *p, ...@@ -573,7 +567,7 @@ static void dsa_skb_tx_timestamp(struct dsa_slave_priv *p,
if (!clone) if (!clone)
return; return;
if (ds->ops->port_txtstamp(ds, p->dp->index, clone, type)) { if (ds->ops->port_txtstamp(ds, p->dp->index, clone)) {
DSA_SKB_CB(skb)->clone = clone; DSA_SKB_CB(skb)->clone = clone;
return; return;
} }
...@@ -632,9 +626,7 @@ static netdev_tx_t dsa_slave_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -632,9 +626,7 @@ static netdev_tx_t dsa_slave_xmit(struct sk_buff *skb, struct net_device *dev)
DSA_SKB_CB(skb)->clone = NULL; DSA_SKB_CB(skb)->clone = NULL;
/* Identify PTP protocol packets, clone them, and pass them to the /* Handle tx timestamp if any */
* switch driver
*/
dsa_skb_tx_timestamp(p, skb); dsa_skb_tx_timestamp(p, skb);
if (dsa_realloc_skb(skb, dev)) { if (dsa_realloc_skb(skb, dev)) {
......
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