linux/drivers/net/ethernet/qlogic/qede/qede_ptp.c
<<
>>
Prefs
   1/* QLogic qede NIC Driver
   2 * Copyright (c) 2015-2017  QLogic Corporation
   3 *
   4 * This software is available to you under a choice of one of two
   5 * licenses.  You may choose to be licensed under the terms of the GNU
   6 * General Public License (GPL) Version 2, available from the file
   7 * COPYING in the main directory of this source tree, or the
   8 * OpenIB.org BSD license below:
   9 *
  10 *     Redistribution and use in source and binary forms, with or
  11 *     without modification, are permitted provided that the following
  12 *     conditions are met:
  13 *
  14 *      - Redistributions of source code must retain the above
  15 *        copyright notice, this list of conditions and the following
  16 *        disclaimer.
  17 *
  18 *      - Redistributions in binary form must reproduce the above
  19 *        copyright notice, this list of conditions and the following
  20 *        disclaimer in the documentation and /or other materials
  21 *        provided with the distribution.
  22 *
  23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  30 * SOFTWARE.
  31 */
  32#include "qede_ptp.h"
  33#define QEDE_PTP_TX_TIMEOUT (2 * HZ)
  34
  35struct qede_ptp {
  36        const struct qed_eth_ptp_ops    *ops;
  37        struct ptp_clock_info           clock_info;
  38        struct cyclecounter             cc;
  39        struct timecounter              tc;
  40        struct ptp_clock                *clock;
  41        struct work_struct              work;
  42        unsigned long                   ptp_tx_start;
  43        struct qede_dev                 *edev;
  44        struct sk_buff                  *tx_skb;
  45
  46        /* ptp spinlock is used for protecting the cycle/time counter fields
  47         * and, also for serializing the qed PTP API invocations.
  48         */
  49        spinlock_t                      lock;
  50        bool                            hw_ts_ioctl_called;
  51        u16                             tx_type;
  52        u16                             rx_filter;
  53};
  54
  55/**
  56 * qede_ptp_adjfreq
  57 * @ptp: the ptp clock structure
  58 * @ppb: parts per billion adjustment from base
  59 *
  60 * Adjust the frequency of the ptp cycle counter by the
  61 * indicated ppb from the base frequency.
  62 */
  63static int qede_ptp_adjfreq(struct ptp_clock_info *info, s32 ppb)
  64{
  65        struct qede_ptp *ptp = container_of(info, struct qede_ptp, clock_info);
  66        struct qede_dev *edev = ptp->edev;
  67        int rc;
  68
  69        __qede_lock(edev);
  70        if (edev->state == QEDE_STATE_OPEN) {
  71                spin_lock_bh(&ptp->lock);
  72                rc = ptp->ops->adjfreq(edev->cdev, ppb);
  73                spin_unlock_bh(&ptp->lock);
  74        } else {
  75                DP_ERR(edev, "PTP adjfreq called while interface is down\n");
  76                rc = -EFAULT;
  77        }
  78        __qede_unlock(edev);
  79
  80        return rc;
  81}
  82
  83static int qede_ptp_adjtime(struct ptp_clock_info *info, s64 delta)
  84{
  85        struct qede_dev *edev;
  86        struct qede_ptp *ptp;
  87
  88        ptp = container_of(info, struct qede_ptp, clock_info);
  89        edev = ptp->edev;
  90
  91        DP_VERBOSE(edev, QED_MSG_DEBUG, "PTP adjtime called, delta = %llx\n",
  92                   delta);
  93
  94        spin_lock_bh(&ptp->lock);
  95        timecounter_adjtime(&ptp->tc, delta);
  96        spin_unlock_bh(&ptp->lock);
  97
  98        return 0;
  99}
 100
 101static int qede_ptp_gettime(struct ptp_clock_info *info, struct timespec64 *ts)
 102{
 103        struct qede_dev *edev;
 104        struct qede_ptp *ptp;
 105        u64 ns;
 106
 107        ptp = container_of(info, struct qede_ptp, clock_info);
 108        edev = ptp->edev;
 109
 110        spin_lock_bh(&ptp->lock);
 111        ns = timecounter_read(&ptp->tc);
 112        spin_unlock_bh(&ptp->lock);
 113
 114        DP_VERBOSE(edev, QED_MSG_DEBUG, "PTP gettime called, ns = %llu\n", ns);
 115
 116        *ts = ns_to_timespec64(ns);
 117
 118        return 0;
 119}
 120
 121static int qede_ptp_settime(struct ptp_clock_info *info,
 122                            const struct timespec64 *ts)
 123{
 124        struct qede_dev *edev;
 125        struct qede_ptp *ptp;
 126        u64 ns;
 127
 128        ptp = container_of(info, struct qede_ptp, clock_info);
 129        edev = ptp->edev;
 130
 131        ns = timespec64_to_ns(ts);
 132
 133        DP_VERBOSE(edev, QED_MSG_DEBUG, "PTP settime called, ns = %llu\n", ns);
 134
 135        /* Re-init the timecounter */
 136        spin_lock_bh(&ptp->lock);
 137        timecounter_init(&ptp->tc, &ptp->cc, ns);
 138        spin_unlock_bh(&ptp->lock);
 139
 140        return 0;
 141}
 142
 143/* Enable (or disable) ancillary features of the phc subsystem */
 144static int qede_ptp_ancillary_feature_enable(struct ptp_clock_info *info,
 145                                             struct ptp_clock_request *rq,
 146                                             int on)
 147{
 148        struct qede_dev *edev;
 149        struct qede_ptp *ptp;
 150
 151        ptp = container_of(info, struct qede_ptp, clock_info);
 152        edev = ptp->edev;
 153
 154        DP_ERR(edev, "PHC ancillary features are not supported\n");
 155
 156        return -ENOTSUPP;
 157}
 158
 159static void qede_ptp_task(struct work_struct *work)
 160{
 161        struct skb_shared_hwtstamps shhwtstamps;
 162        struct qede_dev *edev;
 163        struct qede_ptp *ptp;
 164        u64 timestamp, ns;
 165        bool timedout;
 166        int rc;
 167
 168        ptp = container_of(work, struct qede_ptp, work);
 169        edev = ptp->edev;
 170        timedout = time_is_before_jiffies(ptp->ptp_tx_start +
 171                                          QEDE_PTP_TX_TIMEOUT);
 172
 173        /* Read Tx timestamp registers */
 174        spin_lock_bh(&ptp->lock);
 175        rc = ptp->ops->read_tx_ts(edev->cdev, &timestamp);
 176        spin_unlock_bh(&ptp->lock);
 177        if (rc) {
 178                if (unlikely(timedout)) {
 179                        DP_INFO(edev, "Tx timestamp is not recorded\n");
 180                        dev_kfree_skb_any(ptp->tx_skb);
 181                        ptp->tx_skb = NULL;
 182                        clear_bit_unlock(QEDE_FLAGS_PTP_TX_IN_PRORGESS,
 183                                         &edev->flags);
 184                        edev->ptp_skip_txts++;
 185                } else {
 186                        /* Reschedule to keep checking for a valid TS value */
 187                        schedule_work(&ptp->work);
 188                }
 189                return;
 190        }
 191
 192        ns = timecounter_cyc2time(&ptp->tc, timestamp);
 193        memset(&shhwtstamps, 0, sizeof(shhwtstamps));
 194        shhwtstamps.hwtstamp = ns_to_ktime(ns);
 195        skb_tstamp_tx(ptp->tx_skb, &shhwtstamps);
 196        dev_kfree_skb_any(ptp->tx_skb);
 197        ptp->tx_skb = NULL;
 198        clear_bit_unlock(QEDE_FLAGS_PTP_TX_IN_PRORGESS, &edev->flags);
 199
 200        DP_VERBOSE(edev, QED_MSG_DEBUG,
 201                   "Tx timestamp, timestamp cycles = %llu, ns = %llu\n",
 202                   timestamp, ns);
 203}
 204
 205/* Read the PHC. This API is invoked with ptp_lock held. */
 206static u64 qede_ptp_read_cc(const struct cyclecounter *cc)
 207{
 208        struct qede_dev *edev;
 209        struct qede_ptp *ptp;
 210        u64 phc_cycles;
 211        int rc;
 212
 213        ptp = container_of(cc, struct qede_ptp, cc);
 214        edev = ptp->edev;
 215        rc = ptp->ops->read_cc(edev->cdev, &phc_cycles);
 216        if (rc)
 217                WARN_ONCE(1, "PHC read err %d\n", rc);
 218
 219        DP_VERBOSE(edev, QED_MSG_DEBUG, "PHC read cycles = %llu\n", phc_cycles);
 220
 221        return phc_cycles;
 222}
 223
 224static int qede_ptp_cfg_filters(struct qede_dev *edev)
 225{
 226        enum qed_ptp_hwtstamp_tx_type tx_type = QED_PTP_HWTSTAMP_TX_ON;
 227        enum qed_ptp_filter_type rx_filter = QED_PTP_FILTER_NONE;
 228        struct qede_ptp *ptp = edev->ptp;
 229
 230        if (!ptp)
 231                return -EIO;
 232
 233        if (!ptp->hw_ts_ioctl_called) {
 234                DP_INFO(edev, "TS IOCTL not called\n");
 235                return 0;
 236        }
 237
 238        switch (ptp->tx_type) {
 239        case HWTSTAMP_TX_ON:
 240                set_bit(QEDE_FLAGS_TX_TIMESTAMPING_EN, &edev->flags);
 241                tx_type = QED_PTP_HWTSTAMP_TX_ON;
 242                break;
 243
 244        case HWTSTAMP_TX_OFF:
 245                clear_bit(QEDE_FLAGS_TX_TIMESTAMPING_EN, &edev->flags);
 246                tx_type = QED_PTP_HWTSTAMP_TX_OFF;
 247                break;
 248
 249        case HWTSTAMP_TX_ONESTEP_SYNC:
 250                DP_ERR(edev, "One-step timestamping is not supported\n");
 251                return -ERANGE;
 252        }
 253
 254        spin_lock_bh(&ptp->lock);
 255        switch (ptp->rx_filter) {
 256        case HWTSTAMP_FILTER_NONE:
 257                rx_filter = QED_PTP_FILTER_NONE;
 258                break;
 259        case HWTSTAMP_FILTER_ALL:
 260        case HWTSTAMP_FILTER_SOME:
 261        case HWTSTAMP_FILTER_NTP_ALL:
 262                ptp->rx_filter = HWTSTAMP_FILTER_NONE;
 263                rx_filter = QED_PTP_FILTER_ALL;
 264                break;
 265        case HWTSTAMP_FILTER_PTP_V1_L4_EVENT:
 266                ptp->rx_filter = HWTSTAMP_FILTER_PTP_V1_L4_EVENT;
 267                rx_filter = QED_PTP_FILTER_V1_L4_EVENT;
 268                break;
 269        case HWTSTAMP_FILTER_PTP_V1_L4_SYNC:
 270        case HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ:
 271                ptp->rx_filter = HWTSTAMP_FILTER_PTP_V1_L4_EVENT;
 272                /* Initialize PTP detection for UDP/IPv4 events */
 273                rx_filter = QED_PTP_FILTER_V1_L4_GEN;
 274                break;
 275        case HWTSTAMP_FILTER_PTP_V2_L4_EVENT:
 276                ptp->rx_filter = HWTSTAMP_FILTER_PTP_V2_L4_EVENT;
 277                rx_filter = QED_PTP_FILTER_V2_L4_EVENT;
 278                break;
 279        case HWTSTAMP_FILTER_PTP_V2_L4_SYNC:
 280        case HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ:
 281                ptp->rx_filter = HWTSTAMP_FILTER_PTP_V2_L4_EVENT;
 282                /* Initialize PTP detection for UDP/IPv4 or UDP/IPv6 events */
 283                rx_filter = QED_PTP_FILTER_V2_L4_GEN;
 284                break;
 285        case HWTSTAMP_FILTER_PTP_V2_L2_EVENT:
 286                ptp->rx_filter = HWTSTAMP_FILTER_PTP_V2_L2_EVENT;
 287                rx_filter = QED_PTP_FILTER_V2_L2_EVENT;
 288                break;
 289        case HWTSTAMP_FILTER_PTP_V2_L2_SYNC:
 290        case HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ:
 291                ptp->rx_filter = HWTSTAMP_FILTER_PTP_V2_L2_EVENT;
 292                /* Initialize PTP detection L2 events */
 293                rx_filter = QED_PTP_FILTER_V2_L2_GEN;
 294                break;
 295        case HWTSTAMP_FILTER_PTP_V2_EVENT:
 296                ptp->rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT;
 297                rx_filter = QED_PTP_FILTER_V2_EVENT;
 298                break;
 299        case HWTSTAMP_FILTER_PTP_V2_SYNC:
 300        case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ:
 301                ptp->rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT;
 302                /* Initialize PTP detection L2, UDP/IPv4 or UDP/IPv6 events */
 303                rx_filter = QED_PTP_FILTER_V2_GEN;
 304                break;
 305        }
 306
 307        ptp->ops->cfg_filters(edev->cdev, rx_filter, tx_type);
 308
 309        spin_unlock_bh(&ptp->lock);
 310
 311        return 0;
 312}
 313
 314int qede_ptp_hw_ts(struct qede_dev *edev, struct ifreq *ifr)
 315{
 316        struct hwtstamp_config config;
 317        struct qede_ptp *ptp;
 318        int rc;
 319
 320        ptp = edev->ptp;
 321        if (!ptp)
 322                return -EIO;
 323
 324        if (copy_from_user(&config, ifr->ifr_data, sizeof(config)))
 325                return -EFAULT;
 326
 327        DP_VERBOSE(edev, QED_MSG_DEBUG,
 328                   "HWTSTAMP IOCTL: Requested tx_type = %d, requested rx_filters = %d\n",
 329                   config.tx_type, config.rx_filter);
 330
 331        if (config.flags) {
 332                DP_ERR(edev, "config.flags is reserved for future use\n");
 333                return -EINVAL;
 334        }
 335
 336        ptp->hw_ts_ioctl_called = 1;
 337        ptp->tx_type = config.tx_type;
 338        ptp->rx_filter = config.rx_filter;
 339
 340        rc = qede_ptp_cfg_filters(edev);
 341        if (rc)
 342                return rc;
 343
 344        config.rx_filter = ptp->rx_filter;
 345
 346        return copy_to_user(ifr->ifr_data, &config,
 347                            sizeof(config)) ? -EFAULT : 0;
 348}
 349
 350int qede_ptp_get_ts_info(struct qede_dev *edev, struct ethtool_ts_info *info)
 351{
 352        struct qede_ptp *ptp = edev->ptp;
 353
 354        if (!ptp) {
 355                info->so_timestamping = SOF_TIMESTAMPING_TX_SOFTWARE |
 356                                        SOF_TIMESTAMPING_RX_SOFTWARE |
 357                                        SOF_TIMESTAMPING_SOFTWARE;
 358                info->phc_index = -1;
 359
 360                return 0;
 361        }
 362
 363        info->so_timestamping = SOF_TIMESTAMPING_TX_SOFTWARE |
 364                                SOF_TIMESTAMPING_RX_SOFTWARE |
 365                                SOF_TIMESTAMPING_SOFTWARE |
 366                                SOF_TIMESTAMPING_TX_HARDWARE |
 367                                SOF_TIMESTAMPING_RX_HARDWARE |
 368                                SOF_TIMESTAMPING_RAW_HARDWARE;
 369
 370        if (ptp->clock)
 371                info->phc_index = ptp_clock_index(ptp->clock);
 372        else
 373                info->phc_index = -1;
 374
 375        info->rx_filters = BIT(HWTSTAMP_FILTER_NONE) |
 376                           BIT(HWTSTAMP_FILTER_PTP_V1_L4_EVENT) |
 377                           BIT(HWTSTAMP_FILTER_PTP_V1_L4_SYNC) |
 378                           BIT(HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ) |
 379                           BIT(HWTSTAMP_FILTER_PTP_V2_L4_EVENT) |
 380                           BIT(HWTSTAMP_FILTER_PTP_V2_L4_SYNC) |
 381                           BIT(HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ) |
 382                           BIT(HWTSTAMP_FILTER_PTP_V2_L2_EVENT) |
 383                           BIT(HWTSTAMP_FILTER_PTP_V2_L2_SYNC) |
 384                           BIT(HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ) |
 385                           BIT(HWTSTAMP_FILTER_PTP_V2_EVENT) |
 386                           BIT(HWTSTAMP_FILTER_PTP_V2_SYNC) |
 387                           BIT(HWTSTAMP_FILTER_PTP_V2_DELAY_REQ);
 388
 389        info->tx_types = BIT(HWTSTAMP_TX_OFF) | BIT(HWTSTAMP_TX_ON);
 390
 391        return 0;
 392}
 393
 394void qede_ptp_disable(struct qede_dev *edev)
 395{
 396        struct qede_ptp *ptp;
 397
 398        ptp = edev->ptp;
 399        if (!ptp)
 400                return;
 401
 402        if (ptp->clock) {
 403                ptp_clock_unregister(ptp->clock);
 404                ptp->clock = NULL;
 405        }
 406
 407        /* Cancel PTP work queue. Should be done after the Tx queues are
 408         * drained to prevent additional scheduling.
 409         */
 410        cancel_work_sync(&ptp->work);
 411        if (ptp->tx_skb) {
 412                dev_kfree_skb_any(ptp->tx_skb);
 413                ptp->tx_skb = NULL;
 414        }
 415
 416        /* Disable PTP in HW */
 417        spin_lock_bh(&ptp->lock);
 418        ptp->ops->disable(edev->cdev);
 419        spin_unlock_bh(&ptp->lock);
 420
 421        kfree(ptp);
 422        edev->ptp = NULL;
 423}
 424
 425static int qede_ptp_init(struct qede_dev *edev, bool init_tc)
 426{
 427        struct qede_ptp *ptp;
 428        int rc;
 429
 430        ptp = edev->ptp;
 431        if (!ptp)
 432                return -EINVAL;
 433
 434        spin_lock_init(&ptp->lock);
 435
 436        /* Configure PTP in HW */
 437        rc = ptp->ops->enable(edev->cdev);
 438        if (rc) {
 439                DP_INFO(edev, "PTP HW enable failed\n");
 440                return rc;
 441        }
 442
 443        /* Init work queue for Tx timestamping */
 444        INIT_WORK(&ptp->work, qede_ptp_task);
 445
 446        /* Init cyclecounter and timecounter. This is done only in the first
 447         * load. If done in every load, PTP application will fail when doing
 448         * unload / load (e.g. MTU change) while it is running.
 449         */
 450        if (init_tc) {
 451                memset(&ptp->cc, 0, sizeof(ptp->cc));
 452                ptp->cc.read = qede_ptp_read_cc;
 453                ptp->cc.mask = CYCLECOUNTER_MASK(64);
 454                ptp->cc.shift = 0;
 455                ptp->cc.mult = 1;
 456
 457                timecounter_init(&ptp->tc, &ptp->cc,
 458                                 ktime_to_ns(ktime_get_real()));
 459        }
 460
 461        return rc;
 462}
 463
 464int qede_ptp_enable(struct qede_dev *edev, bool init_tc)
 465{
 466        struct qede_ptp *ptp;
 467        int rc;
 468
 469        ptp = kzalloc(sizeof(*ptp), GFP_KERNEL);
 470        if (!ptp) {
 471                DP_INFO(edev, "Failed to allocate struct for PTP\n");
 472                return -ENOMEM;
 473        }
 474
 475        ptp->edev = edev;
 476        ptp->ops = edev->ops->ptp;
 477        if (!ptp->ops) {
 478                DP_INFO(edev, "PTP enable failed\n");
 479                rc = -EIO;
 480                goto err1;
 481        }
 482
 483        edev->ptp = ptp;
 484
 485        rc = qede_ptp_init(edev, init_tc);
 486        if (rc)
 487                goto err1;
 488
 489        qede_ptp_cfg_filters(edev);
 490
 491        /* Fill the ptp_clock_info struct and register PTP clock */
 492        ptp->clock_info.owner = THIS_MODULE;
 493        snprintf(ptp->clock_info.name, 16, "%s", edev->ndev->name);
 494        ptp->clock_info.max_adj = QED_MAX_PHC_DRIFT_PPB;
 495        ptp->clock_info.n_alarm = 0;
 496        ptp->clock_info.n_ext_ts = 0;
 497        ptp->clock_info.n_per_out = 0;
 498        ptp->clock_info.pps = 0;
 499        ptp->clock_info.adjfreq = qede_ptp_adjfreq;
 500        ptp->clock_info.adjtime = qede_ptp_adjtime;
 501        ptp->clock_info.gettime64 = qede_ptp_gettime;
 502        ptp->clock_info.settime64 = qede_ptp_settime;
 503        ptp->clock_info.enable = qede_ptp_ancillary_feature_enable;
 504
 505        ptp->clock = ptp_clock_register(&ptp->clock_info, &edev->pdev->dev);
 506        if (IS_ERR(ptp->clock)) {
 507                DP_ERR(edev, "PTP clock registration failed\n");
 508                qede_ptp_disable(edev);
 509                rc = -EINVAL;
 510                goto err2;
 511        }
 512
 513        return 0;
 514
 515err1:
 516        kfree(ptp);
 517err2:
 518        edev->ptp = NULL;
 519
 520        return rc;
 521}
 522
 523void qede_ptp_tx_ts(struct qede_dev *edev, struct sk_buff *skb)
 524{
 525        struct qede_ptp *ptp;
 526
 527        ptp = edev->ptp;
 528        if (!ptp)
 529                return;
 530
 531        if (test_and_set_bit_lock(QEDE_FLAGS_PTP_TX_IN_PRORGESS,
 532                                  &edev->flags)) {
 533                DP_ERR(edev, "Timestamping in progress\n");
 534                edev->ptp_skip_txts++;
 535                return;
 536        }
 537
 538        if (unlikely(!test_bit(QEDE_FLAGS_TX_TIMESTAMPING_EN, &edev->flags))) {
 539                DP_ERR(edev,
 540                       "Tx timestamping was not enabled, this packet will not be timestamped\n");
 541                clear_bit_unlock(QEDE_FLAGS_PTP_TX_IN_PRORGESS, &edev->flags);
 542                edev->ptp_skip_txts++;
 543        } else if (unlikely(ptp->tx_skb)) {
 544                DP_ERR(edev,
 545                       "The device supports only a single outstanding packet to timestamp, this packet will not be timestamped\n");
 546                clear_bit_unlock(QEDE_FLAGS_PTP_TX_IN_PRORGESS, &edev->flags);
 547                edev->ptp_skip_txts++;
 548        } else {
 549                skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
 550                /* schedule check for Tx timestamp */
 551                ptp->tx_skb = skb_get(skb);
 552                ptp->ptp_tx_start = jiffies;
 553                schedule_work(&ptp->work);
 554        }
 555}
 556
 557void qede_ptp_rx_ts(struct qede_dev *edev, struct sk_buff *skb)
 558{
 559        struct qede_ptp *ptp;
 560        u64 timestamp, ns;
 561        int rc;
 562
 563        ptp = edev->ptp;
 564        if (!ptp)
 565                return;
 566
 567        spin_lock_bh(&ptp->lock);
 568        rc = ptp->ops->read_rx_ts(edev->cdev, &timestamp);
 569        if (rc) {
 570                spin_unlock_bh(&ptp->lock);
 571                DP_INFO(edev, "Invalid Rx timestamp\n");
 572                return;
 573        }
 574
 575        ns = timecounter_cyc2time(&ptp->tc, timestamp);
 576        spin_unlock_bh(&ptp->lock);
 577        skb_hwtstamps(skb)->hwtstamp = ns_to_ktime(ns);
 578        DP_VERBOSE(edev, QED_MSG_DEBUG,
 579                   "Rx timestamp, timestamp cycles = %llu, ns = %llu\n",
 580                   timestamp, ns);
 581}
 582