net: dsa: ocelot: add hardware timestamping support for Felix
This patch is to reuse ocelot functions as possible to enable PTP clock and to support hardware timestamping on Felix. On TX path, timestamping works on packet which requires timestamp. The injection header will be configured accordingly, and skb clone requires timestamp will be added into a list. The TX timestamp is final handled in threaded interrupt handler when PTP timestamp FIFO is ready. On RX path, timestamping is always working. The RX timestamp could be got from extraction header. Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
5df66c48bc
commit
c0bcf53766
@@ -137,9 +137,11 @@ static struct sk_buff *ocelot_xmit(struct sk_buff *skb,
|
||||
struct net_device *netdev)
|
||||
{
|
||||
struct dsa_port *dp = dsa_slave_to_port(netdev);
|
||||
u64 bypass, dest, src, qos_class;
|
||||
u64 bypass, dest, src, qos_class, rew_op;
|
||||
struct dsa_switch *ds = dp->ds;
|
||||
int port = dp->index;
|
||||
struct ocelot *ocelot = ds->priv;
|
||||
struct ocelot_port *ocelot_port = ocelot->ports[port];
|
||||
u8 *injection;
|
||||
|
||||
if (unlikely(skb_cow_head(skb, OCELOT_TAG_LEN) < 0)) {
|
||||
@@ -161,6 +163,16 @@ static struct sk_buff *ocelot_xmit(struct sk_buff *skb,
|
||||
packing(injection, &src, 46, 43, OCELOT_TAG_LEN, PACK, 0);
|
||||
packing(injection, &qos_class, 19, 17, OCELOT_TAG_LEN, PACK, 0);
|
||||
|
||||
if (ocelot->ptp && (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)) {
|
||||
rew_op = ocelot_port->ptp_cmd;
|
||||
if (ocelot_port->ptp_cmd == IFH_REW_OP_TWO_STEP_PTP) {
|
||||
rew_op |= (ocelot_port->ts_id % 4) << 3;
|
||||
ocelot_port->ts_id++;
|
||||
}
|
||||
|
||||
packing(injection, &rew_op, 125, 117, OCELOT_TAG_LEN, PACK, 0);
|
||||
}
|
||||
|
||||
return skb;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user