hwtstamp.c (cf536ea3c7eefb26082836eb7f930b293dd38345) hwtstamp.c (5c5416f5d4c75fe6aba56f6c2c45a070b5e7cc78)
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Marvell 88E6xxx Switch hardware timestamping support
4 *
5 * Copyright (c) 2008 Marvell Semiconductor
6 *
7 * Copyright (c) 2017 National Instruments
8 * Erik Hons <erik.hons@ni.com>

--- 454 unchanged lines hidden (view full) ---

463 restart |= mv88e6xxx_txtstamp_work(chip, ps);
464
465 mv88e6xxx_rxtstamp_work(chip, ps);
466 }
467
468 return restart ? 1 : -1;
469}
470
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Marvell 88E6xxx Switch hardware timestamping support
4 *
5 * Copyright (c) 2008 Marvell Semiconductor
6 *
7 * Copyright (c) 2017 National Instruments
8 * Erik Hons <erik.hons@ni.com>

--- 454 unchanged lines hidden (view full) ---

463 restart |= mv88e6xxx_txtstamp_work(chip, ps);
464
465 mv88e6xxx_rxtstamp_work(chip, ps);
466 }
467
468 return restart ? 1 : -1;
469}
470
471bool mv88e6xxx_port_txtstamp(struct dsa_switch *ds, int port,
472 struct sk_buff *clone)
471void mv88e6xxx_port_txtstamp(struct dsa_switch *ds, int port,
472 struct sk_buff *skb)
473{
474 struct mv88e6xxx_chip *chip = ds->priv;
475 struct mv88e6xxx_port_hwtstamp *ps = &chip->port_hwtstamp[port];
476 struct ptp_header *hdr;
473{
474 struct mv88e6xxx_chip *chip = ds->priv;
475 struct mv88e6xxx_port_hwtstamp *ps = &chip->port_hwtstamp[port];
476 struct ptp_header *hdr;
477 struct sk_buff *clone;
477 unsigned int type;
478
478 unsigned int type;
479
479 type = ptp_classify_raw(clone);
480 type = ptp_classify_raw(skb);
480 if (type == PTP_CLASS_NONE)
481 if (type == PTP_CLASS_NONE)
481 return false;
482 return;
482
483
483 hdr = mv88e6xxx_should_tstamp(chip, port, clone, type);
484 hdr = mv88e6xxx_should_tstamp(chip, port, skb, type);
484 if (!hdr)
485 if (!hdr)
485 return false;
486 return;
486
487
488 clone = skb_clone_sk(skb);
489 if (!clone)
490 return;
491
487 if (test_and_set_bit_lock(MV88E6XXX_HWTSTAMP_TX_IN_PROGRESS,
492 if (test_and_set_bit_lock(MV88E6XXX_HWTSTAMP_TX_IN_PROGRESS,
488 &ps->state))
489 return false;
493 &ps->state)) {
494 kfree_skb(clone);
495 return;
496 }
490
491 ps->tx_skb = clone;
492 ps->tx_tstamp_start = jiffies;
493 ps->tx_seq_id = be16_to_cpu(hdr->sequence_id);
494
495 ptp_schedule_worker(chip->ptp_clock, 0);
497
498 ps->tx_skb = clone;
499 ps->tx_tstamp_start = jiffies;
500 ps->tx_seq_id = be16_to_cpu(hdr->sequence_id);
501
502 ptp_schedule_worker(chip->ptp_clock, 0);
496 return true;
497}
498
499int mv88e6165_global_disable(struct mv88e6xxx_chip *chip)
500{
501 u16 val;
502 int err;
503
504 err = mv88e6xxx_ptp_read(chip, MV88E6165_PTP_CFG, &val);

--- 109 unchanged lines hidden ---
503}
504
505int mv88e6165_global_disable(struct mv88e6xxx_chip *chip)
506{
507 u16 val;
508 int err;
509
510 err = mv88e6xxx_ptp_read(chip, MV88E6165_PTP_CFG, &val);

--- 109 unchanged lines hidden ---