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 --- |