Commit 28fba67f authored by Kurt Kanzenbach's avatar Kurt Kanzenbach Committed by David S. Miller

net: dsa: mv88e6xxx: Use generic helper function

In order to reduce code duplication between ptp drivers, generic helper
functions were introduced. Use them.
Signed-off-by: Kurt Kanzenbach's avatarKurt Kanzenbach <kurt@linutronix.de>
Tested-by: default avatarRichard Cochran <richardcochran@gmail.com>
Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 036c508b
...@@ -211,49 +211,20 @@ int mv88e6xxx_port_hwtstamp_get(struct dsa_switch *ds, int port, ...@@ -211,49 +211,20 @@ int mv88e6xxx_port_hwtstamp_get(struct dsa_switch *ds, int port,
-EFAULT : 0; -EFAULT : 0;
} }
/* Get the start of the PTP header in this skb */
static u8 *parse_ptp_header(struct sk_buff *skb, unsigned int type)
{
u8 *data = skb_mac_header(skb);
unsigned int offset = 0;
if (type & PTP_CLASS_VLAN)
offset += VLAN_HLEN;
switch (type & PTP_CLASS_PMASK) {
case PTP_CLASS_IPV4:
offset += ETH_HLEN + IPV4_HLEN(data + offset) + UDP_HLEN;
break;
case PTP_CLASS_IPV6:
offset += ETH_HLEN + IP6_HLEN + UDP_HLEN;
break;
case PTP_CLASS_L2:
offset += ETH_HLEN;
break;
default:
return NULL;
}
/* Ensure that the entire header is present in this packet. */
if (skb->len + ETH_HLEN < offset + 34)
return NULL;
return data + offset;
}
/* Returns a pointer to the PTP header if the caller should time stamp, /* Returns a pointer to the PTP header if the caller should time stamp,
* or NULL if the caller should not. * or NULL if the caller should not.
*/ */
static u8 *mv88e6xxx_should_tstamp(struct mv88e6xxx_chip *chip, int port, static struct ptp_header *mv88e6xxx_should_tstamp(struct mv88e6xxx_chip *chip,
struct sk_buff *skb, unsigned int type) int port, struct sk_buff *skb,
unsigned int type)
{ {
struct mv88e6xxx_port_hwtstamp *ps = &chip->port_hwtstamp[port]; struct mv88e6xxx_port_hwtstamp *ps = &chip->port_hwtstamp[port];
u8 *hdr; struct ptp_header *hdr;
if (!chip->info->ptp_support) if (!chip->info->ptp_support)
return NULL; return NULL;
hdr = parse_ptp_header(skb, type); hdr = ptp_parse_header(skb, type);
if (!hdr) if (!hdr)
return NULL; return NULL;
...@@ -275,12 +246,11 @@ static int mv88e6xxx_ts_valid(u16 status) ...@@ -275,12 +246,11 @@ static int mv88e6xxx_ts_valid(u16 status)
static int seq_match(struct sk_buff *skb, u16 ts_seqid) static int seq_match(struct sk_buff *skb, u16 ts_seqid)
{ {
unsigned int type = SKB_PTP_TYPE(skb); unsigned int type = SKB_PTP_TYPE(skb);
u8 *hdr = parse_ptp_header(skb, type); struct ptp_header *hdr;
__be16 *seqid;
seqid = (__be16 *)(hdr + OFF_PTP_SEQUENCE_ID); hdr = ptp_parse_header(skb, type);
return ts_seqid == ntohs(*seqid); return ts_seqid == ntohs(hdr->sequence_id);
} }
static void mv88e6xxx_get_rxts(struct mv88e6xxx_chip *chip, static void mv88e6xxx_get_rxts(struct mv88e6xxx_chip *chip,
...@@ -357,9 +327,9 @@ static void mv88e6xxx_rxtstamp_work(struct mv88e6xxx_chip *chip, ...@@ -357,9 +327,9 @@ static void mv88e6xxx_rxtstamp_work(struct mv88e6xxx_chip *chip,
&ps->rx_queue2); &ps->rx_queue2);
} }
static int is_pdelay_resp(u8 *msgtype) static int is_pdelay_resp(const struct ptp_header *hdr)
{ {
return (*msgtype & 0xf) == 3; return (hdr->tsmt & 0xf) == 3;
} }
bool mv88e6xxx_port_rxtstamp(struct dsa_switch *ds, int port, bool mv88e6xxx_port_rxtstamp(struct dsa_switch *ds, int port,
...@@ -367,7 +337,7 @@ bool mv88e6xxx_port_rxtstamp(struct dsa_switch *ds, int port, ...@@ -367,7 +337,7 @@ bool mv88e6xxx_port_rxtstamp(struct dsa_switch *ds, int port,
{ {
struct mv88e6xxx_port_hwtstamp *ps; struct mv88e6xxx_port_hwtstamp *ps;
struct mv88e6xxx_chip *chip; struct mv88e6xxx_chip *chip;
u8 *hdr; struct ptp_header *hdr;
chip = ds->priv; chip = ds->priv;
ps = &chip->port_hwtstamp[port]; ps = &chip->port_hwtstamp[port];
...@@ -503,8 +473,7 @@ bool mv88e6xxx_port_txtstamp(struct dsa_switch *ds, int port, ...@@ -503,8 +473,7 @@ bool mv88e6xxx_port_txtstamp(struct dsa_switch *ds, int port,
{ {
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];
__be16 *seq_ptr; struct ptp_header *hdr;
u8 *hdr;
if (!(skb_shinfo(clone)->tx_flags & SKBTX_HW_TSTAMP)) if (!(skb_shinfo(clone)->tx_flags & SKBTX_HW_TSTAMP))
return false; return false;
...@@ -513,15 +482,13 @@ bool mv88e6xxx_port_txtstamp(struct dsa_switch *ds, int port, ...@@ -513,15 +482,13 @@ bool mv88e6xxx_port_txtstamp(struct dsa_switch *ds, int port,
if (!hdr) if (!hdr)
return false; return false;
seq_ptr = (__be16 *)(hdr + OFF_PTP_SEQUENCE_ID);
if (test_and_set_bit_lock(MV88E6XXX_HWTSTAMP_TX_IN_PROGRESS, if (test_and_set_bit_lock(MV88E6XXX_HWTSTAMP_TX_IN_PROGRESS,
&ps->state)) &ps->state))
return false; return false;
ps->tx_skb = clone; ps->tx_skb = clone;
ps->tx_tstamp_start = jiffies; ps->tx_tstamp_start = jiffies;
ps->tx_seq_id = be16_to_cpup(seq_ptr); ps->tx_seq_id = be16_to_cpu(hdr->sequence_id);
ptp_schedule_worker(chip->ptp_clock, 0); ptp_schedule_worker(chip->ptp_clock, 0);
return true; return true;
......
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