Lines Matching +full:tx +full:- +full:ts +full:- +full:mask

1 // SPDX-License-Identifier: (GPL-2.0 OR MIT)
19 int ocelot_ptp_gettime64(struct ptp_clock_info *ptp, struct timespec64 *ts)
27 spin_lock_irqsave(&ocelot->ptp_clock_lock, flags);
39 spin_unlock_irqrestore(&ocelot->ptp_clock_lock, flags);
43 s--;
48 set_normalized_timespec64(ts, s, ns);
54 const struct timespec64 *ts)
60 spin_lock_irqsave(&ocelot->ptp_clock_lock, flags);
68 ocelot_write_rix(ocelot, lower_32_bits(ts->tv_sec), PTP_PIN_TOD_SEC_LSB,
70 ocelot_write_rix(ocelot, upper_32_bits(ts->tv_sec), PTP_PIN_TOD_SEC_MSB,
72 ocelot_write_rix(ocelot, ts->tv_nsec, PTP_PIN_TOD_NSEC, TOD_ACC_PIN);
80 spin_unlock_irqrestore(&ocelot->ptp_clock_lock, flags);
82 if (ocelot->ops->tas_clock_adjust)
83 ocelot->ops->tas_clock_adjust(ocelot);
91 if (delta > -(NSEC_PER_SEC / 2) && delta < (NSEC_PER_SEC / 2)) {
97 spin_lock_irqsave(&ocelot->ptp_clock_lock, flags);
117 spin_unlock_irqrestore(&ocelot->ptp_clock_lock, flags);
119 if (ocelot->ops->tas_clock_adjust)
120 ocelot->ops->tas_clock_adjust(ocelot);
123 struct timespec64 ts;
126 ocelot_ptp_gettime64(ptp, &ts);
128 now = ktime_to_ns(timespec64_to_ktime(ts));
129 ts = ns_to_timespec64(now + delta);
131 ocelot_ptp_settime64(ptp, &ts);
145 spin_lock_irqsave(&ocelot->ptp_clock_lock, flags);
152 scaled_ppm = -scaled_ppm;
173 spin_unlock_irqrestore(&ocelot->ptp_clock_lock, flags);
179 spin_unlock_irqrestore(&ocelot->ptp_clock_lock, flags);
193 return -1;
207 int pin = -1;
212 switch (rq->type) {
214 pin = ptp_find_pin(ocelot->ptp_clock, PTP_PF_PEROUT,
215 rq->perout.index);
225 return -EBUSY;
227 ts_period.tv_sec = rq->perout.period.sec;
228 ts_period.tv_nsec = rq->perout.period.nsec;
235 spin_lock_irqsave(&ocelot->ptp_clock_lock, flags);
238 spin_unlock_irqrestore(&ocelot->ptp_clock_lock, flags);
242 if (rq->perout.flags & PTP_PEROUT_PHASE) {
243 ts_phase.tv_sec = rq->perout.phase.sec;
244 ts_phase.tv_nsec = rq->perout.phase.nsec;
247 ts_phase.tv_sec = rq->perout.start.sec;
248 ts_phase.tv_nsec = rq->perout.start.nsec;
251 dev_warn(ocelot->dev,
253 dev_warn(ocelot->dev,
255 return -EINVAL;
259 if (rq->perout.flags & PTP_PEROUT_DUTY_CYCLE) {
262 ts_on.tv_sec = rq->perout.on.sec;
263 ts_on.tv_nsec = rq->perout.on.nsec;
276 wf_low -= wf_high;
280 spin_lock_irqsave(&ocelot->ptp_clock_lock, flags);
288 spin_unlock_irqrestore(&ocelot->ptp_clock_lock, flags);
294 return -EINVAL;
296 return -EINVAL;
298 spin_lock_irqsave(&ocelot->ptp_clock_lock, flags);
305 spin_unlock_irqrestore(&ocelot->ptp_clock_lock, flags);
308 return -EOPNOTSUPP;
316 trap->key_type = OCELOT_VCAP_KEY_ETYPE;
317 *(__be16 *)trap->key.etype.etype.value = htons(ETH_P_1588);
318 *(__be16 *)trap->key.etype.etype.mask = htons(0xffff);
324 trap->key_type = OCELOT_VCAP_KEY_IPV4;
325 trap->key.ipv4.proto.value[0] = IPPROTO_UDP;
326 trap->key.ipv4.proto.mask[0] = 0xff;
327 trap->key.ipv4.dport.value = PTP_EV_PORT;
328 trap->key.ipv4.dport.mask = 0xffff;
334 trap->key_type = OCELOT_VCAP_KEY_IPV6;
335 trap->key.ipv6.proto.value[0] = IPPROTO_UDP;
336 trap->key.ipv6.proto.mask[0] = 0xff;
337 trap->key.ipv6.dport.value = PTP_EV_PORT;
338 trap->key.ipv6.dport.mask = 0xffff;
344 trap->key_type = OCELOT_VCAP_KEY_IPV4;
345 trap->key.ipv4.proto.value[0] = IPPROTO_UDP;
346 trap->key.ipv4.proto.mask[0] = 0xff;
347 trap->key.ipv4.dport.value = PTP_GEN_PORT;
348 trap->key.ipv4.dport.mask = 0xffff;
354 trap->key_type = OCELOT_VCAP_KEY_IPV6;
355 trap->key.ipv6.proto.value[0] = IPPROTO_UDP;
356 trap->key.ipv6.proto.mask[0] = 0xff;
357 trap->key.ipv6.dport.value = PTP_GEN_PORT;
358 trap->key.ipv6.dport.mask = 0xffff;
439 struct ocelot_port *ocelot_port = ocelot->ports[port];
442 ocelot_port->trap_proto &= ~(OCELOT_PROTO_PTP_L2 |
469 ocelot_port->trap_proto |= OCELOT_PROTO_PTP_L2;
471 ocelot_port->trap_proto |= OCELOT_PROTO_PTP_L4;
511 return -ERANGE;
520 struct ocelot_port *ocelot_port = ocelot->ports[port];
522 switch (ocelot_port->ptp_cmd) {
524 cfg->tx_type = HWTSTAMP_TX_ON;
527 cfg->tx_type = HWTSTAMP_TX_ONESTEP_SYNC;
530 cfg->tx_type = HWTSTAMP_TX_OFF;
534 cfg->rx_filter = ocelot_traps_to_ptp_rx_filter(ocelot_port->trap_proto);
542 struct ocelot_port *ocelot_port = ocelot->ports[port];
547 /* Tx type sanity check */
548 err = ocelot_ptp_tx_type_to_cmd(cfg->tx_type, &ptp_cmd);
552 switch (cfg->rx_filter) {
572 return -ERANGE;
579 ocelot_port->ptp_cmd = ptp_cmd;
581 cfg->rx_filter = ocelot_traps_to_ptp_rx_filter(ocelot_port->trap_proto);
590 if (ocelot->ptp_clock) {
591 info->phc_index = ptp_clock_index(ocelot->ptp_clock);
593 info->so_timestamping |= SOF_TIMESTAMPING_TX_SOFTWARE;
596 info->so_timestamping |= SOF_TIMESTAMPING_TX_SOFTWARE |
600 info->tx_types = BIT(HWTSTAMP_TX_OFF) | BIT(HWTSTAMP_TX_ON) |
602 info->rx_filters = BIT(HWTSTAMP_FILTER_NONE) |
615 struct ocelot_port *ocelot_port = ocelot->ports[port];
619 spin_lock(&ocelot->ts_id_lock);
621 skb_queue_walk_safe(&ocelot_port->tx_skbs, skb, skb_tmp) {
622 if (OCELOT_SKB_CB(skb)->ts_id != ts_id)
627 * NULL, because we've pre-validated the packet's ptp_class.
629 hdr = ptp_parse_header(skb, OCELOT_SKB_CB(skb)->ptp_class);
630 if (seqid != ntohs(hdr->sequence_id))
633 __skb_unlink(skb, &ocelot_port->tx_skbs);
634 ocelot->ptp_skbs_in_flight--;
639 spin_unlock(&ocelot->ts_id_lock);
647 struct ocelot_port *ocelot_port = ocelot->ports[port];
652 spin_lock(&ocelot->ts_id_lock);
655 * stale packets still waiting in the TX timestamping queue. They are
658 skb_queue_walk_safe(&ocelot_port->tx_skbs, skb, skb_tmp) {
659 if (time_before(OCELOT_SKB_CB(skb)->ptp_tx_time +
661 u64_stats_update_begin(&ocelot_port->ts_stats->syncp);
662 ocelot_port->ts_stats->lost++;
663 u64_stats_update_end(&ocelot_port->ts_stats->syncp);
665 dev_dbg_ratelimited(ocelot->dev,
667 port, OCELOT_SKB_CB(skb)->ts_id);
669 __skb_unlink(skb, &ocelot_port->tx_skbs);
671 ocelot->ptp_skbs_in_flight--;
673 __set_bit(OCELOT_SKB_CB(skb)->ts_id, ts_id_in_flight);
677 if (ocelot->ptp_skbs_in_flight == OCELOT_PTP_FIFO_SIZE) {
678 spin_unlock(&ocelot->ts_id_lock);
679 return -EBUSY;
684 spin_unlock(&ocelot->ts_id_lock);
685 return -EBUSY;
689 OCELOT_SKB_CB(clone)->ts_id = n;
690 OCELOT_SKB_CB(clone)->ptp_tx_time = jiffies;
691 ocelot->ptp_skbs_in_flight++;
692 __skb_queue_tail(&ocelot_port->tx_skbs, clone);
694 spin_unlock(&ocelot->ts_id_lock);
696 dev_dbg_ratelimited(ocelot->dev, "port %d timestamp id %lu\n", port, n);
712 twostep = hdr->flag_field[0] & 0x2;
724 struct ocelot_port *ocelot_port = ocelot->ports[port];
725 u8 ptp_cmd = ocelot_port->ptp_cmd;
735 err = -EINVAL;
739 /* Store ptp_cmd in OCELOT_SKB_CB(skb)->ptp_cmd */
742 OCELOT_SKB_CB(skb)->ptp_cmd = ptp_cmd;
744 u64_stats_update_begin(&ocelot_port->ts_stats->syncp);
745 ocelot_port->ts_stats->onestep_pkts_unconfirmed++;
746 u64_stats_update_end(&ocelot_port->ts_stats->syncp);
751 /* Fall back to two-step timestamping */
758 err = -ENOMEM;
762 /* Store timestamp ID in OCELOT_SKB_CB(clone)->ts_id */
769 skb_shinfo(*clone)->tx_flags |= SKBTX_IN_PROGRESS;
770 OCELOT_SKB_CB(skb)->ptp_cmd = ptp_cmd;
771 OCELOT_SKB_CB(*clone)->ptp_class = ptp_class;
777 u64_stats_update_begin(&ocelot_port->ts_stats->syncp);
778 ocelot_port->ts_stats->err++;
779 u64_stats_update_end(&ocelot_port->ts_stats->syncp);
785 struct timespec64 *ts)
790 spin_lock_irqsave(&ocelot->ptp_clock_lock, flags);
798 ts->tv_sec = ocelot_read_rix(ocelot, PTP_PIN_TOD_SEC_LSB, TOD_ACC_PIN);
802 ts->tv_nsec = SYS_PTP_TXSTAMP_PTP_TXSTAMP(val);
804 /* Sec has incremented since the ts was registered */
805 if ((ts->tv_sec & 0x1) != !!(val & SYS_PTP_TXSTAMP_PTP_TXSTAMP_SEC))
806 ts->tv_sec--;
808 spin_unlock_irqrestore(&ocelot->ptp_clock_lock, flags);
815 while (budget--) {
820 struct timespec64 ts;
830 /* Retrieve the ts ID and Tx port */
834 ocelot_port = ocelot->ports[txport];
840 u64_stats_update_begin(&ocelot_port->ts_stats->syncp);
841 ocelot_port->ts_stats->err++;
842 u64_stats_update_end(&ocelot_port->ts_stats->syncp);
844 dev_dbg_ratelimited(ocelot->dev,
845 "port %d received TX timestamp (seqid %d, ts id %u) for packet previously declared stale\n",
851 u64_stats_update_begin(&ocelot_port->ts_stats->syncp);
852 ocelot_port->ts_stats->pkts++;
853 u64_stats_update_end(&ocelot_port->ts_stats->syncp);
856 ocelot_get_hwtimestamp(ocelot, &ts);
860 shhwtstamps.hwtstamp = ktime_set(ts.tv_sec, ts.tv_nsec);
875 ocelot->ptp_info = *info;
878 struct ptp_pin_desc *p = &ocelot->ptp_pins[i];
880 snprintf(p->name, sizeof(p->name), "switch_1588_dat%d", i);
881 p->index = i;
882 p->func = PTP_PF_NONE;
885 ocelot->ptp_info.pin_config = &ocelot->ptp_pins[0];
887 ptp_clock = ptp_clock_register(&ocelot->ptp_info, ocelot->dev);
894 ocelot->ptp_clock = ptp_clock;
908 if (ocelot->ptp_clock)
909 ptp_clock_unregister(ocelot->ptp_clock);