• Home
  • Raw
  • Download

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

1 // SPDX-License-Identifier: GPL-2.0
3 // Copyright (C) 2018 MOSER-BAER AG
103 #define ines_read32(s, r) __raw_readl((void __iomem *)&s->regs->r)
104 #define ines_write32(s, v, r) __raw_writel(v, (void __iomem *)&s->regs->r)
176 struct ines_timestamp *ts, struct device *dev);
179 static bool ines_timestamp_expired(struct ines_timestamp *ts);
191 port = &clock->port[i]; in ines_clock_cleanup()
192 cancel_delayed_work_sync(&port->ts_work); in ines_clock_cleanup()
199 struct device_node *node = device->of_node; in ines_clock_init()
204 INIT_LIST_HEAD(&clock->list); in ines_clock_init()
205 clock->node = node; in ines_clock_init()
206 clock->dev = device; in ines_clock_init()
207 clock->base = addr; in ines_clock_init()
208 clock->regs = clock->base; in ines_clock_init()
211 port = &clock->port[i]; in ines_clock_init()
212 port_addr = (unsigned long) clock->base + in ines_clock_init()
214 port->regs = (struct ines_port_registers *) port_addr; in ines_clock_init()
215 port->clock = clock; in ines_clock_init()
216 port->index = i; in ines_clock_init()
217 INIT_DELAYED_WORK(&port->ts_work, ines_txtstamp_work); in ines_clock_init()
218 spin_lock_init(&port->lock); in ines_clock_init()
219 INIT_LIST_HEAD(&port->events); in ines_clock_init()
220 INIT_LIST_HEAD(&port->pool); in ines_clock_init()
222 list_add(&port->pool_data[j].list, &port->pool); in ines_clock_init()
234 port = &clock->port[i]; in ines_clock_init()
250 if (clock->node == node) { in ines_find_port()
251 port = &clock->port[index]; in ines_find_port()
262 struct ines_timestamp *ts; in ines_find_rxts() local
269 spin_lock_irqsave(&port->lock, flags); in ines_find_rxts()
271 list_for_each_safe(this, next, &port->events) { in ines_find_rxts()
272 ts = list_entry(this, struct ines_timestamp, list); in ines_find_rxts()
273 if (ines_timestamp_expired(ts)) { in ines_find_rxts()
274 list_del_init(&ts->list); in ines_find_rxts()
275 list_add(&ts->list, &port->pool); in ines_find_rxts()
278 if (ines_match(skb, type, ts, port->clock->dev)) { in ines_find_rxts()
279 ns = ts->sec * 1000000000ULL + ts->nsec; in ines_find_rxts()
280 list_del_init(&ts->list); in ines_find_rxts()
281 list_add(&ts->list, &port->pool); in ines_find_rxts()
285 spin_unlock_irqrestore(&port->lock, flags); in ines_find_rxts()
293 u32 data_rd_pos, buf_stat, mask, ts_stat_tx; in ines_find_txts() local
294 struct ines_timestamp ts; in ines_find_txts() local
298 mask = TX_FIFO_NE_1 << port->index; in ines_find_txts()
300 spin_lock_irqsave(&port->lock, flags); in ines_find_txts()
304 buf_stat = ines_read32(port->clock, buf_stat); in ines_find_txts()
305 if (!(buf_stat & mask)) { in ines_find_txts()
306 dev_dbg(port->clock->dev, in ines_find_txts()
314 dev_err(port->clock->dev, in ines_find_txts()
319 ts.tag = ines_read32(port, ts_tx); in ines_find_txts()
320 ts.sec = ines_txts64(port, 3); in ines_find_txts()
321 ts.nsec = ines_txts64(port, 2); in ines_find_txts()
322 ts.clkid = ines_txts64(port, 4); in ines_find_txts()
323 ts.portnum = ines_read32(port, ts_tx); in ines_find_txts()
324 ts.seqid = ines_read32(port, ts_tx); in ines_find_txts()
326 if (ines_match(skb, class, &ts, port->clock->dev)) { in ines_find_txts()
327 ns = ts.sec * 1000000000ULL + ts.nsec; in ines_find_txts()
332 spin_unlock_irqrestore(&port->lock, flags); in ines_find_txts()
343 if (copy_from_user(&cfg, ifr->ifr_data, sizeof(cfg))) in ines_hwtstamp()
344 return -EFAULT; in ines_hwtstamp()
348 return -EINVAL; in ines_hwtstamp()
362 return -ERANGE; in ines_hwtstamp()
373 return -ERANGE; in ines_hwtstamp()
387 return -ERANGE; in ines_hwtstamp()
390 spin_lock_irqsave(&port->lock, flags); in ines_hwtstamp()
400 port->rxts_enabled = ts_stat_rx == TS_ENABLE; in ines_hwtstamp()
401 port->txts_enabled = ts_stat_tx == TS_ENABLE; in ines_hwtstamp()
403 spin_unlock_irqrestore(&port->lock, flags); in ines_hwtstamp()
405 return copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg)) ? -EFAULT : 0; in ines_hwtstamp()
415 switch (phydev->speed) { in ines_link_state()
426 dev_err(port->clock->dev, "bad speed: %d\n", phydev->speed); in ines_link_state()
429 spin_lock_irqsave(&port->lock, flags); in ines_link_state()
437 spin_unlock_irqrestore(&port->lock, flags); in ines_link_state()
441 struct ines_timestamp *ts, struct device *dev) in ines_match() argument
456 clkid = be64_to_cpup((__be64 *)&hdr->source_port_identity.clock_identity.id[0]); in ines_match()
457 portn = be16_to_cpu(hdr->source_port_identity.port_number); in ines_match()
458 seqid = be16_to_cpu(hdr->sequence_id); in ines_match()
460 if (tag_to_msgtype(ts->tag & 0x7) != msgtype) { in ines_match()
461 dev_dbg(dev, "msgtype mismatch ts %hhu != skb %hhu\n", in ines_match()
462 tag_to_msgtype(ts->tag & 0x7), msgtype); in ines_match()
465 if (ts->clkid != clkid) { in ines_match()
466 dev_dbg(dev, "clkid mismatch ts %llx != skb %llx\n", in ines_match()
467 ts->clkid, clkid); in ines_match()
470 if (ts->portnum != portn) { in ines_match()
471 dev_dbg(dev, "portn mismatch ts %hu != skb %hu\n", in ines_match()
472 ts->portnum, portn); in ines_match()
475 if (ts->seqid != seqid) { in ines_match()
476 dev_dbg(dev, "seqid mismatch ts %hu != skb %hu\n", in ines_match()
477 ts->seqid, seqid); in ines_match()
491 if (!port->rxts_enabled) in ines_rxtstamp()
499 ssh->hwtstamp = ns_to_ktime(ns); in ines_rxtstamp()
507 u32 data_rd_pos, buf_stat, mask, ts_stat_rx; in ines_rxfifo_read() local
508 struct ines_timestamp *ts; in ines_rxfifo_read() local
511 mask = RX_FIFO_NE_1 << port->index; in ines_rxfifo_read()
514 if (list_empty(&port->pool)) { in ines_rxfifo_read()
515 dev_err(port->clock->dev, "event pool is empty\n"); in ines_rxfifo_read()
516 return -1; in ines_rxfifo_read()
518 buf_stat = ines_read32(port->clock, buf_stat); in ines_rxfifo_read()
519 if (!(buf_stat & mask)) in ines_rxfifo_read()
526 dev_err(port->clock->dev, "unexpected Rx read pos %u\n", in ines_rxfifo_read()
531 ts = list_first_entry(&port->pool, struct ines_timestamp, list); in ines_rxfifo_read()
532 ts->tmo = jiffies + HZ; in ines_rxfifo_read()
533 ts->tag = ines_read32(port, ts_rx); in ines_rxfifo_read()
534 ts->sec = ines_rxts64(port, 3); in ines_rxfifo_read()
535 ts->nsec = ines_rxts64(port, 2); in ines_rxfifo_read()
536 ts->clkid = ines_rxts64(port, 4); in ines_rxfifo_read()
537 ts->portnum = ines_read32(port, ts_rx); in ines_rxfifo_read()
538 ts->seqid = ines_read32(port, ts_rx); in ines_rxfifo_read()
540 list_del_init(&ts->list); in ines_rxfifo_read()
541 list_add_tail(&ts->list, &port->events); in ines_rxfifo_read()
555 words--; in ines_rxts64()
564 static bool ines_timestamp_expired(struct ines_timestamp *ts) in ines_timestamp_expired() argument
566 return time_after(jiffies, ts->tmo); in ines_timestamp_expired()
572 info->so_timestamping = in ines_ts_info()
580 info->phc_index = -1; in ines_ts_info()
582 info->tx_types = in ines_ts_info()
587 info->rx_filters = in ines_ts_info()
602 words--; in ines_txts64()
616 spin_lock_irqsave(&port->lock, flags); in ines_txts_onestep()
618 spin_unlock_irqrestore(&port->lock, flags); in ines_txts_onestep()
633 if (!port->txts_enabled || ines_txts_onestep(port, skb, type)) { in ines_txtstamp()
638 spin_lock_irqsave(&port->lock, flags); in ines_txtstamp()
640 if (port->tx_skb) in ines_txtstamp()
641 old_skb = port->tx_skb; in ines_txtstamp()
643 port->tx_skb = skb; in ines_txtstamp()
645 spin_unlock_irqrestore(&port->lock, flags); in ines_txtstamp()
649 schedule_delayed_work(&port->ts_work, 1); in ines_txtstamp()
661 spin_lock_irqsave(&port->lock, flags); in ines_txtstamp_work()
662 skb = port->tx_skb; in ines_txtstamp_work()
663 port->tx_skb = NULL; in ines_txtstamp_work()
664 spin_unlock_irqrestore(&port->lock, flags); in ines_txtstamp_work()
713 struct device_node *node = device->of_node; in ines_ptp_probe_channel()
716 if (index > INES_N_PORTS - 1) { in ines_ptp_probe_channel()
718 return ERR_PTR(-EINVAL); in ines_ptp_probe_channel()
723 return ERR_PTR(-ENODEV); in ines_ptp_probe_channel()
725 port->mii_ts.rxtstamp = ines_rxtstamp; in ines_ptp_probe_channel()
726 port->mii_ts.txtstamp = ines_txtstamp; in ines_ptp_probe_channel()
727 port->mii_ts.hwtstamp = ines_hwtstamp; in ines_ptp_probe_channel()
728 port->mii_ts.link_state = ines_link_state; in ines_ptp_probe_channel()
729 port->mii_ts.ts_info = ines_ts_info; in ines_ptp_probe_channel()
731 return &port->mii_ts; in ines_ptp_probe_channel()
757 err = -ENOMEM; in ines_ptp_ctrl_probe()
760 if (ines_clock_init(clock, &pld->dev, addr)) { in ines_ptp_ctrl_probe()
762 err = -ENOMEM; in ines_ptp_ctrl_probe()
765 err = register_mii_tstamp_controller(&pld->dev, &ines_ctrl); in ines_ptp_ctrl_probe()
771 list_add_tail(&ines_clocks, &clock->list); in ines_ptp_ctrl_probe()
774 dev_set_drvdata(&pld->dev, clock); in ines_ptp_ctrl_probe()
781 struct ines_clock *clock = dev_get_drvdata(&pld->dev); in ines_ptp_ctrl_remove()
783 unregister_mii_tstamp_controller(&pld->dev); in ines_ptp_ctrl_remove()
785 list_del(&clock->list); in ines_ptp_ctrl_remove()
793 { .compatible = "ines,ptp-ctrl" },