mirror of https://gitee.com/openkylin/linux.git
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 <kurt@linutronix.de> Tested-by: Richard Cochran <richardcochran@gmail.com> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
036c508ba9
commit
28fba67ff9
|
@ -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)
|
||||||
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,
|
||||||
&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,
|
||||||
{
|
{
|
||||||
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,
|
||||||
{
|
{
|
||||||
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,
|
||||||
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;
|
||||||
|
|
Loading…
Reference in New Issue