lkml.org 
[lkml]   [2021]   [Dec]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH net-next v5 2/4] net: ocelot: add and export ocelot_ptp_rx_timestamp()
    Date
    In order to support PTP in FDMA, PTP handling code is needed. Since
    this is the same as for register-based extraction, export it with
    a new ocelot_ptp_rx_timestamp() function.

    Reviewed-by: Vladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: Clément Léger <clement.leger@bootlin.com>
    ---
    drivers/net/ethernet/mscc/ocelot.c | 41 +++++++++++++++++-------------
    include/soc/mscc/ocelot.h | 2 ++
    2 files changed, 26 insertions(+), 17 deletions(-)

    diff --git a/drivers/net/ethernet/mscc/ocelot.c b/drivers/net/ethernet/mscc/ocelot.c
    index b5ec8ce7f4dd..876a7ecf86eb 100644
    --- a/drivers/net/ethernet/mscc/ocelot.c
    +++ b/drivers/net/ethernet/mscc/ocelot.c
    @@ -1054,14 +1054,34 @@ static int ocelot_xtr_poll_xfh(struct ocelot *ocelot, int grp, u32 *xfh)
    return 0;
    }

    -int ocelot_xtr_poll_frame(struct ocelot *ocelot, int grp, struct sk_buff **nskb)
    +void ocelot_ptp_rx_timestamp(struct ocelot *ocelot, struct sk_buff *skb,
    + u64 timestamp)
    {
    struct skb_shared_hwtstamps *shhwtstamps;
    u64 tod_in_ns, full_ts_in_ns;
    + struct timespec64 ts;
    +
    + ocelot_ptp_gettime64(&ocelot->ptp_info, &ts);
    +
    + tod_in_ns = ktime_set(ts.tv_sec, ts.tv_nsec);
    + if ((tod_in_ns & 0xffffffff) < timestamp)
    + full_ts_in_ns = (((tod_in_ns >> 32) - 1) << 32) |
    + timestamp;
    + else
    + full_ts_in_ns = (tod_in_ns & GENMASK_ULL(63, 32)) |
    + timestamp;
    +
    + shhwtstamps = skb_hwtstamps(skb);
    + memset(shhwtstamps, 0, sizeof(struct skb_shared_hwtstamps));
    + shhwtstamps->hwtstamp = full_ts_in_ns;
    +}
    +EXPORT_SYMBOL(ocelot_ptp_rx_timestamp);
    +
    +int ocelot_xtr_poll_frame(struct ocelot *ocelot, int grp, struct sk_buff **nskb)
    +{
    u64 timestamp, src_port, len;
    u32 xfh[OCELOT_TAG_LEN / 4];
    struct net_device *dev;
    - struct timespec64 ts;
    struct sk_buff *skb;
    int sz, buf_len;
    u32 val, *buf;
    @@ -1117,21 +1137,8 @@ int ocelot_xtr_poll_frame(struct ocelot *ocelot, int grp, struct sk_buff **nskb)
    *buf = val;
    }

    - if (ocelot->ptp) {
    - ocelot_ptp_gettime64(&ocelot->ptp_info, &ts);
    -
    - tod_in_ns = ktime_set(ts.tv_sec, ts.tv_nsec);
    - if ((tod_in_ns & 0xffffffff) < timestamp)
    - full_ts_in_ns = (((tod_in_ns >> 32) - 1) << 32) |
    - timestamp;
    - else
    - full_ts_in_ns = (tod_in_ns & GENMASK_ULL(63, 32)) |
    - timestamp;
    -
    - shhwtstamps = skb_hwtstamps(skb);
    - memset(shhwtstamps, 0, sizeof(struct skb_shared_hwtstamps));
    - shhwtstamps->hwtstamp = full_ts_in_ns;
    - }
    + if (ocelot->ptp)
    + ocelot_ptp_rx_timestamp(ocelot, skb, timestamp);

    /* Everything we see on an interface that is in the HW bridge
    * has already been forwarded.
    diff --git a/include/soc/mscc/ocelot.h b/include/soc/mscc/ocelot.h
    index 9b99cfd39a59..f038062a97a9 100644
    --- a/include/soc/mscc/ocelot.h
    +++ b/include/soc/mscc/ocelot.h
    @@ -797,6 +797,8 @@ void ocelot_port_inject_frame(struct ocelot *ocelot, int port, int grp,
    void ocelot_ifh_port_set(void *ifh, int port, u32 rew_op, u32 vlan_tag);
    int ocelot_xtr_poll_frame(struct ocelot *ocelot, int grp, struct sk_buff **skb);
    void ocelot_drain_cpu_queue(struct ocelot *ocelot, int grp);
    +void ocelot_ptp_rx_timestamp(struct ocelot *ocelot, struct sk_buff *skb,
    + u64 timestamp);

    /* Hardware initialization */
    int ocelot_regfields_init(struct ocelot *ocelot,
    --
    2.34.1
    \
     
     \ /
      Last update: 2021-12-07 10:12    [W:3.289 / U:0.092 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site