Lines Matching refs:ptp
348 static int efx_phc_adjfine(struct ptp_clock_info *ptp, long scaled_ppm);
349 static int efx_phc_adjtime(struct ptp_clock_info *ptp, s64 delta);
350 static int efx_phc_gettime(struct ptp_clock_info *ptp, struct timespec64 *ts);
351 static int efx_phc_settime(struct ptp_clock_info *ptp,
353 static int efx_phc_enable(struct ptp_clock_info *ptp,
546 struct efx_ptp_data *ptp, in efx_ptp_mac_nic_to_ktime_correction() argument
590 kt = ptp->nic_to_kernel_time(nic_major, nic_minor, in efx_ptp_mac_nic_to_ktime_correction()
599 struct efx_ptp_data *ptp = efx->ptp_data; in efx_ptp_nic_to_kernel_time() local
603 kt = efx_ptp_mac_nic_to_ktime_correction(efx, ptp, in efx_ptp_nic_to_kernel_time()
606 ptp->ts_corrections.general_tx); in efx_ptp_nic_to_kernel_time()
608 kt = ptp->nic_to_kernel_time( in efx_ptp_nic_to_kernel_time()
611 ptp->ts_corrections.general_tx); in efx_ptp_nic_to_kernel_time()
620 struct efx_ptp_data *ptp = efx->ptp_data; in efx_ptp_get_attributes() local
648 ptp->ns_to_nic_time = efx_ptp_ns_to_s27; in efx_ptp_get_attributes()
649 ptp->nic_to_kernel_time = efx_ptp_s27_to_ktime_correction; in efx_ptp_get_attributes()
650 ptp->nic_time.minor_max = 1 << 27; in efx_ptp_get_attributes()
651 ptp->nic_time.sync_event_minor_shift = 19; in efx_ptp_get_attributes()
654 ptp->ns_to_nic_time = efx_ptp_ns_to_s_qns; in efx_ptp_get_attributes()
655 ptp->nic_to_kernel_time = efx_ptp_s_qns_to_ktime_correction; in efx_ptp_get_attributes()
656 ptp->nic_time.minor_max = 4000000000UL; in efx_ptp_get_attributes()
657 ptp->nic_time.sync_event_minor_shift = 24; in efx_ptp_get_attributes()
669 ptp->nic_time.sync_event_diff_min = ptp->nic_time.minor_max in efx_ptp_get_attributes()
670 - (ptp->nic_time.minor_max / 10); in efx_ptp_get_attributes()
671 ptp->nic_time.sync_event_diff_max = (ptp->nic_time.minor_max / 4) in efx_ptp_get_attributes()
672 + (ptp->nic_time.minor_max / 10); in efx_ptp_get_attributes()
683 ptp->min_synchronisation_ns = in efx_ptp_get_attributes()
687 ptp->min_synchronisation_ns = DEFAULT_MIN_SYNCHRONISATION_NS; in efx_ptp_get_attributes()
691 ptp->capabilities = MCDI_DWORD(outbuf, in efx_ptp_get_attributes()
694 ptp->capabilities = 0; in efx_ptp_get_attributes()
700 if (ptp->capabilities & (1 << MC_CMD_PTP_OUT_GET_ATTRIBUTES_FP44_FREQ_ADJ_LBN)) in efx_ptp_get_attributes()
701 ptp->adjfreq_ppb_shift = PPB_SHIFT_FP44; in efx_ptp_get_attributes()
703 ptp->adjfreq_ppb_shift = PPB_SHIFT_FP40; in efx_ptp_get_attributes()
842 struct efx_ptp_data *ptp = efx->ptp_data; in efx_ptp_send_times() local
843 int *mc_running = ptp->start.addr; in efx_ptp_send_times()
913 struct efx_ptp_data *ptp = efx->ptp_data; in efx_ptp_process_times() local
935 &ptp->timeset[i]); in efx_ptp_process_times()
938 ptp->nic_to_kernel_time(0, ptp->timeset[i].wait, 0)); in efx_ptp_process_times()
939 window = ptp->timeset[i].window; in efx_ptp_process_times()
952 ++ptp->invalid_sync_windows; in efx_ptp_process_times()
954 ++ptp->oversize_sync_windows; in efx_ptp_process_times()
955 } else if (corrected < ptp->min_synchronisation_ns) { in efx_ptp_process_times()
956 ++ptp->undersize_sync_windows; in efx_ptp_process_times()
975 start_sec = ptp->timeset[last_good].host_start >> MC_NANOSECOND_BITS; in efx_ptp_process_times()
986 (ptp->timeset[last_good].host_start & MC_NANOSECOND_MASK); in efx_ptp_process_times()
992 mc_time = ptp->nic_to_kernel_time(ptp->timeset[last_good].major, in efx_ptp_process_times()
993 ptp->timeset[last_good].minor, 0); in efx_ptp_process_times()
999 ptp->host_time_pps = *last_time; in efx_ptp_process_times()
1000 pps_sub_ts(&ptp->host_time_pps, delta); in efx_ptp_process_times()
1008 struct efx_ptp_data *ptp = efx->ptp_data; in efx_ptp_synchronize() local
1015 int *start = ptp->start.addr; in efx_ptp_synchronize()
1022 ptp->start.dma_addr); in efx_ptp_synchronize()
1038 ++ptp->fast_syncs; in efx_ptp_synchronize()
1040 ++ptp->sync_timeouts; in efx_ptp_synchronize()
1054 ++ptp->good_syncs; in efx_ptp_synchronize()
1056 ++ptp->no_time_syncs; in efx_ptp_synchronize()
1063 ++ptp->bad_syncs; in efx_ptp_synchronize()
1173 struct efx_ptp_data *ptp = efx->ptp_data; in efx_ptp_process_events() local
1176 while ((skb = skb_dequeue(&ptp->rxq))) { in efx_ptp_process_events()
1184 ++ptp->rx_no_timestamp; in efx_ptp_process_events()
1188 skb_queue_head(&ptp->rxq, skb); in efx_ptp_process_events()
1250 struct efx_ptp_data *ptp = efx->ptp_data; in efx_ptp_insert_filter() local
1275 queue_delayed_work(ptp->workwq, &ptp->cleanup_work, in efx_ptp_insert_filter()
1311 struct efx_ptp_data *ptp = efx->ptp_data; in efx_ptp_insert_eth_multicast_filter() local
1319 return efx_ptp_insert_filter(efx, &ptp->rxfilters_mcast, &spec, 0); in efx_ptp_insert_eth_multicast_filter()
1324 struct efx_ptp_data *ptp = efx->ptp_data; in efx_ptp_insert_multicast_filters() local
1327 if (!ptp->channel || !list_empty(&ptp->rxfilters_mcast)) in efx_ptp_insert_multicast_filters()
1333 rc = efx_ptp_insert_ipv4_filter(efx, &ptp->rxfilters_mcast, in efx_ptp_insert_multicast_filters()
1339 rc = efx_ptp_insert_ipv4_filter(efx, &ptp->rxfilters_mcast, in efx_ptp_insert_multicast_filters()
1351 rc = efx_ptp_insert_ipv6_filter(efx, &ptp->rxfilters_mcast, in efx_ptp_insert_multicast_filters()
1356 rc = efx_ptp_insert_ipv6_filter(efx, &ptp->rxfilters_mcast, in efx_ptp_insert_multicast_filters()
1371 efx_ptp_remove_filters(efx, &ptp->rxfilters_mcast); in efx_ptp_insert_multicast_filters()
1394 struct efx_ptp_data *ptp = efx->ptp_data; in efx_ptp_insert_unicast_filter() local
1406 rc = efx_ptp_insert_ipv4_filter(efx, &ptp->rxfilters_ucast, in efx_ptp_insert_unicast_filter()
1411 rc = efx_ptp_insert_ipv4_filter(efx, &ptp->rxfilters_ucast, in efx_ptp_insert_unicast_filter()
1417 rc = efx_ptp_insert_ipv6_filter(efx, &ptp->rxfilters_ucast, in efx_ptp_insert_unicast_filter()
1422 rc = efx_ptp_insert_ipv6_filter(efx, &ptp->rxfilters_ucast, in efx_ptp_insert_unicast_filter()
1434 struct efx_ptp_data *ptp = efx->ptp_data; in efx_ptp_start() local
1437 ptp->reset_required = false; in efx_ptp_start()
1447 ptp->evt_frag_idx = 0; in efx_ptp_start()
1448 ptp->current_adjfreq = 0; in efx_ptp_start()
1453 efx_ptp_remove_filters(efx, &ptp->rxfilters_mcast); in efx_ptp_start()
1459 struct efx_ptp_data *ptp = efx->ptp_data; in efx_ptp_stop() local
1462 if (ptp == NULL) in efx_ptp_stop()
1467 efx_ptp_remove_filters(efx, &ptp->rxfilters_mcast); in efx_ptp_stop()
1468 efx_ptp_remove_filters(efx, &ptp->rxfilters_ucast); in efx_ptp_stop()
1486 struct efx_ptp_data *ptp = in efx_ptp_pps_worker() local
1488 struct efx_nic *efx = ptp->efx; in efx_ptp_pps_worker()
1495 ptp_evt.pps_times = ptp->host_time_pps; in efx_ptp_pps_worker()
1496 ptp_clock_event(ptp->phc_clock, &ptp_evt); in efx_ptp_pps_worker()
1525 struct efx_ptp_data *ptp = in efx_ptp_cleanup_worker() local
1529 list_for_each_entry_safe(rxfilter, tmp, &ptp->rxfilters_ucast, list) { in efx_ptp_cleanup_worker()
1531 efx_ptp_remove_one_filter(ptp->efx, rxfilter); in efx_ptp_cleanup_worker()
1534 if (!list_empty(&ptp->rxfilters_ucast)) { in efx_ptp_cleanup_worker()
1535 queue_delayed_work(ptp->workwq, &ptp->cleanup_work, in efx_ptp_cleanup_worker()
1559 struct efx_ptp_data *ptp; in efx_ptp_probe() local
1567 ptp = kzalloc(sizeof(struct efx_ptp_data), GFP_KERNEL); in efx_ptp_probe()
1568 efx->ptp_data = ptp; in efx_ptp_probe()
1572 ptp->efx = efx; in efx_ptp_probe()
1573 ptp->channel = channel; in efx_ptp_probe()
1575 rc = efx_nic_alloc_buffer(efx, &ptp->start, sizeof(int), GFP_KERNEL); in efx_ptp_probe()
1579 skb_queue_head_init(&ptp->rxq); in efx_ptp_probe()
1580 skb_queue_head_init(&ptp->txq); in efx_ptp_probe()
1581 ptp->workwq = create_singlethread_workqueue("sfc_ptp"); in efx_ptp_probe()
1582 if (!ptp->workwq) { in efx_ptp_probe()
1588 ptp->xmit_skb = efx_ptp_xmit_skb_queue; in efx_ptp_probe()
1592 ptp->xmit_skb = efx_ptp_xmit_skb_mc; in efx_ptp_probe()
1595 INIT_WORK(&ptp->work, efx_ptp_worker); in efx_ptp_probe()
1596 INIT_DELAYED_WORK(&ptp->cleanup_work, efx_ptp_cleanup_worker); in efx_ptp_probe()
1597 ptp->config.flags = 0; in efx_ptp_probe()
1598 ptp->config.tx_type = HWTSTAMP_TX_OFF; in efx_ptp_probe()
1599 ptp->config.rx_filter = HWTSTAMP_FILTER_NONE; in efx_ptp_probe()
1600 INIT_LIST_HEAD(&ptp->rxfilters_mcast); in efx_ptp_probe()
1601 INIT_LIST_HEAD(&ptp->rxfilters_ucast); in efx_ptp_probe()
1615 ptp->phc_clock_info = efx_phc_clock_info; in efx_ptp_probe()
1616 ptp->phc_clock = ptp_clock_register(&ptp->phc_clock_info, in efx_ptp_probe()
1618 if (IS_ERR(ptp->phc_clock)) { in efx_ptp_probe()
1619 rc = PTR_ERR(ptp->phc_clock); in efx_ptp_probe()
1621 } else if (ptp->phc_clock) { in efx_ptp_probe()
1622 INIT_WORK(&ptp->pps_work, efx_ptp_pps_worker); in efx_ptp_probe()
1623 ptp->pps_workwq = create_singlethread_workqueue("sfc_pps"); in efx_ptp_probe()
1624 if (!ptp->pps_workwq) { in efx_ptp_probe()
1630 ptp->nic_ts_enabled = false; in efx_ptp_probe()
1640 efx_nic_free_buffer(efx, &ptp->start); in efx_ptp_probe()
1737 struct efx_ptp_data *ptp = efx->ptp_data; in efx_ptp_rx() local
1745 if (ptp->mode == MC_CMD_PTP_MODE_V1) { in efx_ptp_rx()
1778 skb_queue_tail(&ptp->rxq, skb); in efx_ptp_rx()
1779 queue_work(ptp->workwq, &ptp->work); in efx_ptp_rx()
1790 struct efx_ptp_data *ptp = efx->ptp_data; in efx_ptp_tx() local
1792 skb_queue_tail(&ptp->txq, skb); in efx_ptp_tx()
1797 queue_work(ptp->workwq, &ptp->work); in efx_ptp_tx()
1868 struct efx_ptp_data *ptp = efx->ptp_data; in efx_ptp_get_ts_info() local
1873 if (!ptp) in efx_ptp_get_ts_info()
1894 ts_info->rx_filters = ptp->efx->type->hwtstamp_filters; in efx_ptp_get_ts_info()
1928 struct efx_ptp_data *ptp = efx->ptp_data; in ptp_event_failure() local
1932 ptp->evt_frag_idx, expected_frag_len); in ptp_event_failure()
1933 ptp->reset_required = true; in ptp_event_failure()
1934 queue_work(ptp->workwq, &ptp->work); in ptp_event_failure()
1937 static void ptp_event_fault(struct efx_nic *efx, struct efx_ptp_data *ptp) in ptp_event_fault() argument
1939 int code = EFX_QWORD_FIELD(ptp->evt_frags[0], MCDI_EVENT_DATA); in ptp_event_fault()
1940 if (ptp->evt_frag_idx != 1) { in ptp_event_fault()
1948 static void ptp_event_pps(struct efx_nic *efx, struct efx_ptp_data *ptp) in ptp_event_pps() argument
1950 if (ptp->nic_ts_enabled) in ptp_event_pps()
1951 queue_work(ptp->pps_workwq, &ptp->pps_work); in ptp_event_pps()
1956 struct efx_ptp_data *ptp = efx->ptp_data; in efx_ptp_event() local
1959 if (!ptp) { in efx_ptp_event()
1968 if (!ptp->enabled) in efx_ptp_event()
1971 if (ptp->evt_frag_idx == 0) { in efx_ptp_event()
1972 ptp->evt_code = code; in efx_ptp_event()
1973 } else if (ptp->evt_code != code) { in efx_ptp_event()
1976 ptp->evt_frag_idx = 0; in efx_ptp_event()
1979 ptp->evt_frags[ptp->evt_frag_idx++] = *ev; in efx_ptp_event()
1984 ptp_event_fault(efx, ptp); in efx_ptp_event()
1987 ptp_event_pps(efx, ptp); in efx_ptp_event()
1994 ptp->evt_frag_idx = 0; in efx_ptp_event()
1995 } else if (MAX_EVENT_FRAGS == ptp->evt_frag_idx) { in efx_ptp_event()
1998 ptp->evt_frag_idx = 0; in efx_ptp_event()
2005 struct efx_ptp_data *ptp = efx->ptp_data; in efx_time_sync_event() local
2016 << ptp->nic_time.sync_event_minor_shift; in efx_time_sync_event()
2042 struct efx_ptp_data *ptp = efx->ptp_data; in __efx_rx_skb_attach_timestamp() local
2057 diff += ptp->nic_time.minor_max; in __efx_rx_skb_attach_timestamp()
2060 carry = (channel->sync_timestamp_minor >= ptp->nic_time.minor_max - diff) ? in __efx_rx_skb_attach_timestamp()
2063 if (diff <= ptp->nic_time.sync_event_diff_max) { in __efx_rx_skb_attach_timestamp()
2068 } else if (diff >= ptp->nic_time.sync_event_diff_min) { in __efx_rx_skb_attach_timestamp()
2090 ptp->nic_to_kernel_time(pkt_timestamp_major, in __efx_rx_skb_attach_timestamp()
2092 ptp->ts_corrections.general_rx); in __efx_rx_skb_attach_timestamp()
2095 static int efx_phc_adjfine(struct ptp_clock_info *ptp, long scaled_ppm) in efx_phc_adjfine() argument
2097 struct efx_ptp_data *ptp_data = container_of(ptp, in efx_phc_adjfine()
2130 static int efx_phc_adjtime(struct ptp_clock_info *ptp, s64 delta) in efx_phc_adjtime() argument
2133 struct efx_ptp_data *ptp_data = container_of(ptp, in efx_phc_adjtime()
2150 static int efx_phc_gettime(struct ptp_clock_info *ptp, struct timespec64 *ts) in efx_phc_gettime() argument
2152 struct efx_ptp_data *ptp_data = container_of(ptp, in efx_phc_gettime()
2176 static int efx_phc_settime(struct ptp_clock_info *ptp, in efx_phc_settime() argument
2187 rc = efx_phc_gettime(ptp, &time_now); in efx_phc_settime()
2193 rc = efx_phc_adjtime(ptp, timespec64_to_ns(&delta)); in efx_phc_settime()
2200 static int efx_phc_enable(struct ptp_clock_info *ptp, in efx_phc_enable() argument
2204 struct efx_ptp_data *ptp_data = container_of(ptp, in efx_phc_enable()