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;
|
||||
}
|
||||
|
||||
/* 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,
|
||||
* or NULL if the caller should not.
|
||||
*/
|
||||
static u8 *mv88e6xxx_should_tstamp(struct mv88e6xxx_chip *chip, int port,
|
||||
struct sk_buff *skb, unsigned int type)
|
||||
static struct ptp_header *mv88e6xxx_should_tstamp(struct mv88e6xxx_chip *chip,
|
||||
int port, struct sk_buff *skb,
|
||||
unsigned int type)
|
||||
{
|
||||
struct mv88e6xxx_port_hwtstamp *ps = &chip->port_hwtstamp[port];
|
||||
u8 *hdr;
|
||||
struct ptp_header *hdr;
|
||||
|
||||
if (!chip->info->ptp_support)
|
||||
return NULL;
|
||||
|
||||
hdr = parse_ptp_header(skb, type);
|
||||
hdr = ptp_parse_header(skb, type);
|
||||
if (!hdr)
|
||||
return NULL;
|
||||
|
||||
|
@ -275,12 +246,11 @@ static int mv88e6xxx_ts_valid(u16 status)
|
|||
static int seq_match(struct sk_buff *skb, u16 ts_seqid)
|
||||
{
|
||||
unsigned int type = SKB_PTP_TYPE(skb);
|
||||
u8 *hdr = parse_ptp_header(skb, type);
|
||||
__be16 *seqid;
|
||||
struct ptp_header *hdr;
|
||||
|
||||
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,
|
||||
|
@ -357,9 +327,9 @@ static void mv88e6xxx_rxtstamp_work(struct mv88e6xxx_chip *chip,
|
|||
&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,
|
||||
|
@ -367,7 +337,7 @@ bool mv88e6xxx_port_rxtstamp(struct dsa_switch *ds, int port,
|
|||
{
|
||||
struct mv88e6xxx_port_hwtstamp *ps;
|
||||
struct mv88e6xxx_chip *chip;
|
||||
u8 *hdr;
|
||||
struct ptp_header *hdr;
|
||||
|
||||
chip = ds->priv;
|
||||
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_port_hwtstamp *ps = &chip->port_hwtstamp[port];
|
||||
__be16 *seq_ptr;
|
||||
u8 *hdr;
|
||||
struct ptp_header *hdr;
|
||||
|
||||
if (!(skb_shinfo(clone)->tx_flags & SKBTX_HW_TSTAMP))
|
||||
return false;
|
||||
|
@ -513,15 +482,13 @@ bool mv88e6xxx_port_txtstamp(struct dsa_switch *ds, int port,
|
|||
if (!hdr)
|
||||
return false;
|
||||
|
||||
seq_ptr = (__be16 *)(hdr + OFF_PTP_SEQUENCE_ID);
|
||||
|
||||
if (test_and_set_bit_lock(MV88E6XXX_HWTSTAMP_TX_IN_PROGRESS,
|
||||
&ps->state))
|
||||
return false;
|
||||
|
||||
ps->tx_skb = clone;
|
||||
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);
|
||||
return true;
|
||||
|
|
Loading…
Reference in New Issue