Lines Matching +full:direction +full:- +full:duty +full:- +full:cycle +full:- +full:ns
1 /* SPDX-License-Identifier: GPL-2.0+ */
37 return -EINVAL; in lan743x_get_channel()
42 struct lan743x_gpio *gpio = &adapter->gpio; in lan743x_gpio_init()
44 spin_lock_init(&gpio->gpio_lock); in lan743x_gpio_init()
46 gpio->gpio_cfg0 = 0; /* set all direction to input, data = 0 */ in lan743x_gpio_init()
47 gpio->gpio_cfg1 = 0x0FFF0000;/* disable all gpio, set to open drain */ in lan743x_gpio_init()
48 gpio->gpio_cfg2 = 0;/* set all to 1588 low polarity level */ in lan743x_gpio_init()
49 gpio->gpio_cfg3 = 0;/* disable all 1588 output */ in lan743x_gpio_init()
50 lan743x_csr_write(adapter, GPIO_CFG0, gpio->gpio_cfg0); in lan743x_gpio_init()
51 lan743x_csr_write(adapter, GPIO_CFG1, gpio->gpio_cfg1); in lan743x_gpio_init()
52 lan743x_csr_write(adapter, GPIO_CFG2, gpio->gpio_cfg2); in lan743x_gpio_init()
53 lan743x_csr_write(adapter, GPIO_CFG3, gpio->gpio_cfg3); in lan743x_gpio_init()
68 timeout--; in lan743x_ptp_wait_till_cmd_done()
71 netif_err(adapter, drv, adapter->netdev, in lan743x_ptp_wait_till_cmd_done()
81 struct lan743x_ptp *ptp = &adapter->ptp; in lan743x_ptp_tx_ts_enqueue_ts()
83 spin_lock_bh(&ptp->tx_ts_lock); in lan743x_ptp_tx_ts_enqueue_ts()
84 if (ptp->tx_ts_queue_size < LAN743X_PTP_NUMBER_OF_TX_TIMESTAMPS) { in lan743x_ptp_tx_ts_enqueue_ts()
85 ptp->tx_ts_seconds_queue[ptp->tx_ts_queue_size] = seconds; in lan743x_ptp_tx_ts_enqueue_ts()
86 ptp->tx_ts_nseconds_queue[ptp->tx_ts_queue_size] = nano_seconds; in lan743x_ptp_tx_ts_enqueue_ts()
87 ptp->tx_ts_header_queue[ptp->tx_ts_queue_size] = header; in lan743x_ptp_tx_ts_enqueue_ts()
88 ptp->tx_ts_queue_size++; in lan743x_ptp_tx_ts_enqueue_ts()
90 netif_err(adapter, drv, adapter->netdev, in lan743x_ptp_tx_ts_enqueue_ts()
93 spin_unlock_bh(&ptp->tx_ts_lock); in lan743x_ptp_tx_ts_enqueue_ts()
98 struct lan743x_ptp *ptp = &adapter->ptp; in lan743x_ptp_tx_ts_complete()
105 spin_lock_bh(&ptp->tx_ts_lock); in lan743x_ptp_tx_ts_complete()
106 c = ptp->tx_ts_skb_queue_size; in lan743x_ptp_tx_ts_complete()
108 if (c > ptp->tx_ts_queue_size) in lan743x_ptp_tx_ts_complete()
109 c = ptp->tx_ts_queue_size; in lan743x_ptp_tx_ts_complete()
114 ignore_sync = ((ptp->tx_ts_ignore_sync_queue & in lan743x_ptp_tx_ts_complete()
116 skb = ptp->tx_ts_skb_queue[i]; in lan743x_ptp_tx_ts_complete()
117 nseconds = ptp->tx_ts_nseconds_queue[i]; in lan743x_ptp_tx_ts_complete()
118 seconds = ptp->tx_ts_seconds_queue[i]; in lan743x_ptp_tx_ts_complete()
119 header = ptp->tx_ts_header_queue[i]; in lan743x_ptp_tx_ts_complete()
130 ptp->tx_ts_skb_queue[i] = NULL; in lan743x_ptp_tx_ts_complete()
131 ptp->tx_ts_seconds_queue[i] = 0; in lan743x_ptp_tx_ts_complete()
132 ptp->tx_ts_nseconds_queue[i] = 0; in lan743x_ptp_tx_ts_complete()
133 ptp->tx_ts_header_queue[i] = 0; in lan743x_ptp_tx_ts_complete()
137 ptp->tx_ts_ignore_sync_queue >>= c; in lan743x_ptp_tx_ts_complete()
139 ptp->tx_ts_skb_queue[i - c] = ptp->tx_ts_skb_queue[i]; in lan743x_ptp_tx_ts_complete()
140 ptp->tx_ts_seconds_queue[i - c] = ptp->tx_ts_seconds_queue[i]; in lan743x_ptp_tx_ts_complete()
141 ptp->tx_ts_nseconds_queue[i - c] = ptp->tx_ts_nseconds_queue[i]; in lan743x_ptp_tx_ts_complete()
142 ptp->tx_ts_header_queue[i - c] = ptp->tx_ts_header_queue[i]; in lan743x_ptp_tx_ts_complete()
144 ptp->tx_ts_skb_queue[i] = NULL; in lan743x_ptp_tx_ts_complete()
145 ptp->tx_ts_seconds_queue[i] = 0; in lan743x_ptp_tx_ts_complete()
146 ptp->tx_ts_nseconds_queue[i] = 0; in lan743x_ptp_tx_ts_complete()
147 ptp->tx_ts_header_queue[i] = 0; in lan743x_ptp_tx_ts_complete()
149 ptp->tx_ts_skb_queue_size -= c; in lan743x_ptp_tx_ts_complete()
150 ptp->tx_ts_queue_size -= c; in lan743x_ptp_tx_ts_complete()
152 ptp->pending_tx_timestamps -= c; in lan743x_ptp_tx_ts_complete()
153 spin_unlock_bh(&ptp->tx_ts_lock); in lan743x_ptp_tx_ts_complete()
159 struct lan743x_ptp *ptp = &adapter->ptp; in lan743x_ptp_reserve_event_ch()
160 int result = -ENODEV; in lan743x_ptp_reserve_event_ch()
162 mutex_lock(&ptp->command_lock); in lan743x_ptp_reserve_event_ch()
163 if (!(test_bit(event_channel, &ptp->used_event_ch))) { in lan743x_ptp_reserve_event_ch()
164 ptp->used_event_ch |= BIT(event_channel); in lan743x_ptp_reserve_event_ch()
167 netif_warn(adapter, drv, adapter->netdev, in lan743x_ptp_reserve_event_ch()
171 mutex_unlock(&ptp->command_lock); in lan743x_ptp_reserve_event_ch()
178 struct lan743x_ptp *ptp = &adapter->ptp; in lan743x_ptp_release_event_ch()
180 mutex_lock(&ptp->command_lock); in lan743x_ptp_release_event_ch()
181 if (test_bit(event_channel, &ptp->used_event_ch)) { in lan743x_ptp_release_event_ch()
182 ptp->used_event_ch &= ~BIT(event_channel); in lan743x_ptp_release_event_ch()
184 netif_warn(adapter, drv, adapter->netdev, in lan743x_ptp_release_event_ch()
188 mutex_unlock(&ptp->command_lock); in lan743x_ptp_release_event_ch()
202 struct lan743x_ptp *ptp = &adapter->ptp; in lan743x_led_mux_enable()
204 if (ptp->leds_multiplexed && in lan743x_led_mux_enable()
205 ptp->led_enabled[pin]) { in lan743x_led_mux_enable()
219 struct lan743x_ptp *ptp = &adapter->ptp; in lan743x_led_mux_save()
220 u32 id_rev = adapter->csr.id_rev & ID_REV_ID_MASK_; in lan743x_led_mux_save()
229 ptp->led_enabled[i] = led_enabled; in lan743x_led_mux_save()
231 ptp->leds_multiplexed = true; in lan743x_led_mux_save()
233 ptp->leds_multiplexed = false; in lan743x_led_mux_save()
239 u32 id_rev = adapter->csr.id_rev & ID_REV_ID_MASK_; in lan743x_led_mux_restore()
252 struct lan743x_gpio *gpio = &adapter->gpio; in lan743x_gpio_rsrv_ptp_out()
255 int ret = -EBUSY; in lan743x_gpio_rsrv_ptp_out()
257 spin_lock_irqsave(&gpio->gpio_lock, irq_flags); in lan743x_gpio_rsrv_ptp_out()
259 if (!(gpio->used_bits & bit_mask)) { in lan743x_gpio_rsrv_ptp_out()
260 gpio->used_bits |= bit_mask; in lan743x_gpio_rsrv_ptp_out()
261 gpio->output_bits |= bit_mask; in lan743x_gpio_rsrv_ptp_out()
262 gpio->ptp_bits |= bit_mask; in lan743x_gpio_rsrv_ptp_out()
268 gpio->gpio_cfg0 |= GPIO_CFG0_GPIO_DIR_BIT_(pin); in lan743x_gpio_rsrv_ptp_out()
269 gpio->gpio_cfg0 &= ~GPIO_CFG0_GPIO_DATA_BIT_(pin); in lan743x_gpio_rsrv_ptp_out()
270 lan743x_csr_write(adapter, GPIO_CFG0, gpio->gpio_cfg0); in lan743x_gpio_rsrv_ptp_out()
273 gpio->gpio_cfg1 &= ~GPIO_CFG1_GPIOEN_BIT_(pin); in lan743x_gpio_rsrv_ptp_out()
274 gpio->gpio_cfg1 |= GPIO_CFG1_GPIOBUF_BIT_(pin); in lan743x_gpio_rsrv_ptp_out()
275 lan743x_csr_write(adapter, GPIO_CFG1, gpio->gpio_cfg1); in lan743x_gpio_rsrv_ptp_out()
278 gpio->gpio_cfg2 |= GPIO_CFG2_1588_POL_BIT_(pin); in lan743x_gpio_rsrv_ptp_out()
279 lan743x_csr_write(adapter, GPIO_CFG2, gpio->gpio_cfg2); in lan743x_gpio_rsrv_ptp_out()
283 gpio->gpio_cfg3 &= ~GPIO_CFG3_1588_CH_SEL_BIT_(pin); in lan743x_gpio_rsrv_ptp_out()
286 gpio->gpio_cfg3 |= GPIO_CFG3_1588_CH_SEL_BIT_(pin); in lan743x_gpio_rsrv_ptp_out()
288 gpio->gpio_cfg3 |= GPIO_CFG3_1588_OE_BIT_(pin); in lan743x_gpio_rsrv_ptp_out()
289 lan743x_csr_write(adapter, GPIO_CFG3, gpio->gpio_cfg3); in lan743x_gpio_rsrv_ptp_out()
293 spin_unlock_irqrestore(&gpio->gpio_lock, irq_flags); in lan743x_gpio_rsrv_ptp_out()
299 struct lan743x_gpio *gpio = &adapter->gpio; in lan743x_gpio_release()
303 spin_lock_irqsave(&gpio->gpio_lock, irq_flags); in lan743x_gpio_release()
304 if (gpio->used_bits & bit_mask) { in lan743x_gpio_release()
305 gpio->used_bits &= ~bit_mask; in lan743x_gpio_release()
306 if (gpio->output_bits & bit_mask) { in lan743x_gpio_release()
307 gpio->output_bits &= ~bit_mask; in lan743x_gpio_release()
309 if (gpio->ptp_bits & bit_mask) { in lan743x_gpio_release()
310 gpio->ptp_bits &= ~bit_mask; in lan743x_gpio_release()
312 gpio->gpio_cfg3 &= ~GPIO_CFG3_1588_OE_BIT_(pin); in lan743x_gpio_release()
314 gpio->gpio_cfg3); in lan743x_gpio_release()
319 gpio->gpio_cfg1 |= GPIO_CFG1_GPIOEN_BIT_(pin); in lan743x_gpio_release()
320 gpio->gpio_cfg1 &= ~GPIO_CFG1_GPIOBUF_BIT_(pin); in lan743x_gpio_release()
321 lan743x_csr_write(adapter, GPIO_CFG1, gpio->gpio_cfg1); in lan743x_gpio_release()
324 gpio->gpio_cfg0 &= ~GPIO_CFG0_GPIO_DIR_BIT_(pin); in lan743x_gpio_release()
325 gpio->gpio_cfg0 &= ~GPIO_CFG0_GPIO_DATA_BIT_(pin); in lan743x_gpio_release()
326 lan743x_csr_write(adapter, GPIO_CFG0, gpio->gpio_cfg0); in lan743x_gpio_release()
332 spin_unlock_irqrestore(&gpio->gpio_lock, irq_flags); in lan743x_gpio_release()
344 if ((scaled_ppm < (-LAN743X_PTP_MAX_FINE_ADJ_IN_SCALED_PPM)) || in lan743x_ptpci_adjfine()
346 return -EINVAL; in lan743x_ptpci_adjfine()
383 if (adapter->is_pci11x1x) in lan743x_ptpci_gettime64()
388 ts->tv_sec = seconds; in lan743x_ptpci_gettime64()
389 ts->tv_nsec = nano_seconds; in lan743x_ptpci_gettime64()
405 if (ts->tv_sec > 0xFFFFFFFFLL || in lan743x_ptpci_settime64()
406 ts->tv_sec < 0) { in lan743x_ptpci_settime64()
407 netif_warn(adapter, drv, adapter->netdev, in lan743x_ptpci_settime64()
408 "ts->tv_sec out of range, %lld\n", in lan743x_ptpci_settime64()
409 ts->tv_sec); in lan743x_ptpci_settime64()
410 return -ERANGE; in lan743x_ptpci_settime64()
412 if (ts->tv_nsec >= 1000000000L || in lan743x_ptpci_settime64()
413 ts->tv_nsec < 0) { in lan743x_ptpci_settime64()
414 netif_warn(adapter, drv, adapter->netdev, in lan743x_ptpci_settime64()
415 "ts->tv_nsec out of range, %ld\n", in lan743x_ptpci_settime64()
416 ts->tv_nsec); in lan743x_ptpci_settime64()
417 return -ERANGE; in lan743x_ptpci_settime64()
419 seconds = ts->tv_sec; in lan743x_ptpci_settime64()
420 nano_seconds = ts->tv_nsec; in lan743x_ptpci_settime64()
423 netif_warn(adapter, drv, adapter->netdev, "ts == NULL\n"); in lan743x_ptpci_settime64()
424 return -EINVAL; in lan743x_ptpci_settime64()
433 struct lan743x_ptp *ptp = &adapter->ptp; in lan743x_ptp_perout_off()
435 struct lan743x_ptp_perout *perout = &ptp->perout[index]; in lan743x_ptp_perout_off()
437 if (perout->gpio_pin >= 0) { in lan743x_ptp_perout_off()
438 lan743x_gpio_release(adapter, perout->gpio_pin); in lan743x_ptp_perout_off()
439 perout->gpio_pin = -1; in lan743x_ptp_perout_off()
442 if (perout->event_ch >= 0) { in lan743x_ptp_perout_off()
445 PTP_CLOCK_TARGET_SEC_X(perout->event_ch), in lan743x_ptp_perout_off()
448 PTP_CLOCK_TARGET_NS_X(perout->event_ch), in lan743x_ptp_perout_off()
453 (perout->event_ch); in lan743x_ptp_perout_off()
455 lan743x_ptp_release_event_ch(adapter, perout->event_ch); in lan743x_ptp_perout_off()
456 perout->event_ch = -1; in lan743x_ptp_perout_off()
463 struct lan743x_ptp *ptp = &adapter->ptp; in lan743x_ptp_perout()
469 unsigned int index = perout_request->index; in lan743x_ptp_perout()
470 struct lan743x_ptp_perout *perout = &ptp->perout[index]; in lan743x_ptp_perout()
474 if (perout_request->flags & ~PTP_PEROUT_DUTY_CYCLE) in lan743x_ptp_perout()
475 return -EOPNOTSUPP; in lan743x_ptp_perout()
478 perout_pin = ptp_find_pin(ptp->ptp_clock, PTP_PF_PEROUT, in lan743x_ptp_perout()
479 perout_request->index); in lan743x_ptp_perout()
481 return -EBUSY; in lan743x_ptp_perout()
487 if (perout->event_ch >= 0 || in lan743x_ptp_perout()
488 perout->gpio_pin >= 0) { in lan743x_ptp_perout()
493 perout->event_ch = lan743x_ptp_reserve_event_ch(adapter, index); in lan743x_ptp_perout()
495 if (perout->event_ch < 0) { in lan743x_ptp_perout()
496 netif_warn(adapter, drv, adapter->netdev, in lan743x_ptp_perout()
499 ret = -EBUSY; in lan743x_ptp_perout()
503 perout->gpio_pin = lan743x_gpio_rsrv_ptp_out(adapter, in lan743x_ptp_perout()
505 perout->event_ch); in lan743x_ptp_perout()
507 if (perout->gpio_pin < 0) { in lan743x_ptp_perout()
508 netif_warn(adapter, drv, adapter->netdev, in lan743x_ptp_perout()
511 ret = -EBUSY; in lan743x_ptp_perout()
515 start_sec = perout_request->start.sec; in lan743x_ptp_perout()
516 start_sec += perout_request->start.nsec / 1000000000; in lan743x_ptp_perout()
517 start_nsec = perout_request->start.nsec % 1000000000; in lan743x_ptp_perout()
519 period_sec = perout_request->period.sec; in lan743x_ptp_perout()
520 period_sec += perout_request->period.nsec / 1000000000; in lan743x_ptp_perout()
521 period_nsec = perout_request->period.nsec % 1000000000; in lan743x_ptp_perout()
523 if (perout_request->flags & PTP_PEROUT_DUTY_CYCLE) { in lan743x_ptp_perout()
528 ts_on.tv_sec = perout_request->on.sec; in lan743x_ptp_perout()
529 ts_on.tv_nsec = perout_request->on.nsec; in lan743x_ptp_perout()
531 ts_period.tv_sec = perout_request->period.sec; in lan743x_ptp_perout()
532 ts_period.tv_nsec = perout_request->period.nsec; in lan743x_ptp_perout()
536 netif_warn(adapter, drv, adapter->netdev, in lan743x_ptp_perout()
537 "perout period too small, minimum is 200nS\n"); in lan743x_ptp_perout()
538 ret = -EOPNOTSUPP; in lan743x_ptp_perout()
542 netif_warn(adapter, drv, adapter->netdev, in lan743x_ptp_perout()
544 ret = -EINVAL; in lan743x_ptp_perout()
550 * pulse width is the same as one of pre-defined width values. in lan743x_ptp_perout()
580 netif_warn(adapter, drv, adapter->netdev, in lan743x_ptp_perout()
581 "duty cycle specified is not supported\n"); in lan743x_ptp_perout()
582 ret = -EOPNOTSUPP; in lan743x_ptp_perout()
600 netif_warn(adapter, drv, adapter->netdev, in lan743x_ptp_perout()
601 "perout period too small, minimum is 200nS\n"); in lan743x_ptp_perout()
602 ret = -EOPNOTSUPP; in lan743x_ptp_perout()
613 PTP_CLOCK_TARGET_SEC_X(perout->event_ch), in lan743x_ptp_perout()
616 PTP_CLOCK_TARGET_NS_X(perout->event_ch), 0); in lan743x_ptp_perout()
621 (perout->event_ch)); in lan743x_ptp_perout()
623 (perout->event_ch, pulse_width); in lan743x_ptp_perout()
625 (perout->event_ch); in lan743x_ptp_perout()
628 /* set the reload to one toggle cycle */ in lan743x_ptp_perout()
630 PTP_CLOCK_TARGET_RELOAD_SEC_X(perout->event_ch), in lan743x_ptp_perout()
633 PTP_CLOCK_TARGET_RELOAD_NS_X(perout->event_ch), in lan743x_ptp_perout()
638 PTP_CLOCK_TARGET_SEC_X(perout->event_ch), in lan743x_ptp_perout()
641 PTP_CLOCK_TARGET_NS_X(perout->event_ch), in lan743x_ptp_perout()
654 struct lan743x_ptp *ptp = &adapter->ptp; in lan743x_ptp_io_perout_off()
660 event_ch = ptp->ptp_io_perout[index]; in lan743x_ptp_io_perout_off()
683 ptp->ptp_io_perout[index] = -1; in lan743x_ptp_io_perout_off()
686 perout_pin = ptp_find_pin(ptp->ptp_clock, PTP_PF_PEROUT, index); in lan743x_ptp_io_perout_off()
706 struct lan743x_ptp *ptp = &adapter->ptp; in lan743x_ptp_io_perout()
717 index = perout_request->index; in lan743x_ptp_io_perout()
718 event_ch = ptp->ptp_io_perout[index]; in lan743x_ptp_io_perout()
721 perout_pin = ptp_find_pin(ptp->ptp_clock, PTP_PF_PEROUT, index); in lan743x_ptp_io_perout()
723 return -EBUSY; in lan743x_ptp_io_perout()
736 netif_warn(adapter, drv, adapter->netdev, in lan743x_ptp_io_perout()
741 ptp->ptp_io_perout[index] = event_ch; in lan743x_ptp_io_perout()
743 if (perout_request->flags & PTP_PEROUT_DUTY_CYCLE) { in lan743x_ptp_io_perout()
744 pulse_sec = perout_request->on.sec; in lan743x_ptp_io_perout()
745 pulse_sec += perout_request->on.nsec / 1000000000; in lan743x_ptp_io_perout()
746 pulse_nsec = perout_request->on.nsec % 1000000000; in lan743x_ptp_io_perout()
748 pulse_sec = perout_request->period.sec; in lan743x_ptp_io_perout()
749 pulse_sec += perout_request->period.nsec / 1000000000; in lan743x_ptp_io_perout()
750 pulse_nsec = perout_request->period.nsec % 1000000000; in lan743x_ptp_io_perout()
783 netif_warn(adapter, drv, adapter->netdev, in lan743x_ptp_io_perout()
784 "perout period too small, min is 200nS\n"); in lan743x_ptp_io_perout()
807 /* set the reload to one toggle cycle */ in lan743x_ptp_io_perout()
808 period_sec = perout_request->period.sec; in lan743x_ptp_io_perout()
809 period_sec += perout_request->period.nsec / 1000000000; in lan743x_ptp_io_perout()
810 period_nsec = perout_request->period.nsec % 1000000000; in lan743x_ptp_io_perout()
818 start_sec = perout_request->start.sec; in lan743x_ptp_io_perout()
819 start_sec += perout_request->start.nsec / 1000000000; in lan743x_ptp_io_perout()
820 start_nsec = perout_request->start.nsec % 1000000000; in lan743x_ptp_io_perout()
857 return -ENODEV; in lan743x_ptp_io_perout()
863 struct lan743x_ptp *ptp = &adapter->ptp; in lan743x_ptp_io_extts_off()
867 extts = &ptp->extts[index]; in lan743x_ptp_io_extts_off()
869 if (extts->flags & PTP_FALLING_EDGE) in lan743x_ptp_io_extts_off()
875 /* Disables PTP-IO edge lock */ in lan743x_ptp_io_extts_off()
877 if (extts->flags & PTP_FALLING_EDGE) { in lan743x_ptp_io_extts_off()
886 /* PTP-IO De-select register */ in lan743x_ptp_io_extts_off()
892 memset(&extts->ts, 0, sizeof(struct timespec64)); in lan743x_ptp_io_extts_off()
893 extts->flags = 0; in lan743x_ptp_io_extts_off()
899 struct lan743x_ptp *ptp = &adapter->ptp; in lan743x_ptp_io_event_cap_en()
903 return -EOPNOTSUPP; in lan743x_ptp_io_event_cap_en()
905 mutex_lock(&ptp->command_lock); in lan743x_ptp_io_event_cap_en()
906 /* PTP-IO Event Capture Enable */ in lan743x_ptp_io_event_cap_en()
922 /* PTP-IO Select */ in lan743x_ptp_io_event_cap_en()
935 mutex_unlock(&ptp->command_lock); in lan743x_ptp_io_event_cap_en()
943 struct lan743x_ptp *ptp = &adapter->ptp; in lan743x_ptp_io_extts()
944 u32 flags = extts_request->flags; in lan743x_ptp_io_extts()
945 u32 index = extts_request->index; in lan743x_ptp_io_extts()
950 extts = &ptp->extts[index]; in lan743x_ptp_io_extts()
953 extts_pin = ptp_find_pin(ptp->ptp_clock, PTP_PF_EXTTS, index); in lan743x_ptp_io_extts()
955 return -EBUSY; in lan743x_ptp_io_extts()
959 extts->flags = flags; in lan743x_ptp_io_extts()
976 switch (request->type) { in lan743x_ptpci_enable()
978 if (request->extts.index < ptpci->n_ext_ts) in lan743x_ptpci_enable()
980 &request->extts); in lan743x_ptpci_enable()
981 return -EINVAL; in lan743x_ptpci_enable()
983 if (request->perout.index < ptpci->n_per_out) { in lan743x_ptpci_enable()
984 if (adapter->is_pci11x1x) in lan743x_ptpci_enable()
986 &request->perout); in lan743x_ptpci_enable()
989 &request->perout); in lan743x_ptpci_enable()
991 return -EINVAL; in lan743x_ptpci_enable()
993 return -EINVAL; in lan743x_ptpci_enable()
995 netif_err(adapter, drv, adapter->netdev, in lan743x_ptpci_enable()
996 "request->type == %d, Unknown\n", in lan743x_ptpci_enable()
997 request->type); in lan743x_ptpci_enable()
1001 netif_err(adapter, drv, adapter->netdev, "request == NULL\n"); in lan743x_ptpci_enable()
1025 if (!adapter->is_pci11x1x) in lan743x_ptpci_verify_pin_config()
1026 result = -1; in lan743x_ptpci_verify_pin_config()
1030 result = -1; in lan743x_ptpci_verify_pin_config()
1040 struct lan743x_ptp *ptp = &adapter->ptp; in lan743x_ptp_io_event_clock_get()
1044 mutex_lock(&ptp->command_lock); in lan743x_ptp_io_event_clock_get()
1053 mutex_unlock(&ptp->command_lock); in lan743x_ptp_io_event_clock_get()
1056 extts = &ptp->extts[channel]; in lan743x_ptp_io_event_clock_get()
1057 extts->ts.tv_sec = sec; in lan743x_ptp_io_event_clock_get()
1058 extts->ts.tv_nsec = nsec; in lan743x_ptp_io_event_clock_get()
1059 ts->tv_sec = sec; in lan743x_ptp_io_event_clock_get()
1060 ts->tv_nsec = nsec; in lan743x_ptp_io_event_clock_get()
1076 s64 ns; in lan743x_ptpci_do_aux_work() local
1105 netif_err(adapter, drv, adapter->netdev, in lan743x_ptpci_do_aux_work()
1108 netif_warn(adapter, drv, adapter->netdev, in lan743x_ptpci_do_aux_work()
1112 netif_warn(adapter, drv, adapter->netdev, in lan743x_ptpci_do_aux_work()
1131 ns = timespec64_to_ns(&ts); in lan743x_ptpci_do_aux_work()
1132 ptp_event.timestamp = ns; in lan743x_ptpci_do_aux_work()
1135 ptp_clock_event(ptp->ptp_clock, in lan743x_ptpci_do_aux_work()
1164 ns = timespec64_to_ns(&ts); in lan743x_ptpci_do_aux_work()
1165 ptp_event.timestamp = ns; in lan743x_ptpci_do_aux_work()
1168 ptp_clock_event(ptp->ptp_clock, in lan743x_ptpci_do_aux_work()
1193 return -1; in lan743x_ptpci_do_aux_work()
1200 struct lan743x_ptp *ptp = &adapter->ptp; in lan743x_ptp_clock_get()
1202 mutex_lock(&ptp->command_lock); in lan743x_ptp_clock_get()
1217 mutex_unlock(&ptp->command_lock); in lan743x_ptp_clock_get()
1223 struct lan743x_ptp *ptp = &adapter->ptp; in lan743x_ptp_io_clock_get()
1225 mutex_lock(&ptp->command_lock); in lan743x_ptp_io_clock_get()
1239 mutex_unlock(&ptp->command_lock); in lan743x_ptp_io_clock_get()
1245 struct lan743x_ptp *ptp = &adapter->ptp; in lan743x_ptp_clock_step()
1255 if (adapter->is_pci11x1x) in lan743x_ptp_clock_step()
1266 nano_seconds -= 1000000000; in lan743x_ptp_clock_step()
1271 } else if (time_step_ns < -15000000000LL) { in lan743x_ptp_clock_step()
1273 time_step_ns = -time_step_ns; in lan743x_ptp_clock_step()
1275 if (adapter->is_pci11x1x) { in lan743x_ptp_clock_step()
1282 unsigned_seconds -= div_u64_rem(time_step_ns, 1000000000LL, in lan743x_ptp_clock_step()
1286 unsigned_seconds--; in lan743x_ptp_clock_step()
1289 nano_seconds -= nano_seconds_step; in lan743x_ptp_clock_step()
1302 abs_time_step_ns = (u64)(-time_step_ns); in lan743x_ptp_clock_step()
1303 seconds = -((s32)div_u64_rem(abs_time_step_ns, 1000000000, in lan743x_ptp_clock_step()
1311 seconds--; in lan743x_ptp_clock_step()
1312 nano_seconds = (1000000000 - nano_seconds); in lan743x_ptp_clock_step()
1317 /* add 8 ns to cover the likely normal increment */ in lan743x_ptp_clock_step()
1324 nano_seconds -= 1000000000; in lan743x_ptp_clock_step()
1328 mutex_lock(&ptp->command_lock); in lan743x_ptp_clock_step()
1337 seconds -= ((s32)adjustment_value); in lan743x_ptp_clock_step()
1339 u32 adjustment_value = (u32)(-seconds); in lan743x_ptp_clock_step()
1351 mutex_unlock(&ptp->command_lock); in lan743x_ptp_clock_step()
1354 mutex_lock(&ptp->command_lock); in lan743x_ptp_clock_step()
1363 mutex_unlock(&ptp->command_lock); in lan743x_ptp_clock_step()
1374 ptp = &adapter->ptp; in lan743x_ptp_isr()
1382 ptp_schedule_worker(ptp->ptp_clock, 0); in lan743x_ptp_isr()
1383 enable_flag = 0;/* tasklet will re-enable later */ in lan743x_ptp_isr()
1386 netif_err(adapter, drv, adapter->netdev, in lan743x_ptp_isr()
1404 /* re-enable isr */ in lan743x_ptp_isr()
1412 struct lan743x_ptp *ptp = &adapter->ptp; in lan743x_ptp_tx_ts_enqueue_skb()
1414 spin_lock_bh(&ptp->tx_ts_lock); in lan743x_ptp_tx_ts_enqueue_skb()
1415 if (ptp->tx_ts_skb_queue_size < LAN743X_PTP_NUMBER_OF_TX_TIMESTAMPS) { in lan743x_ptp_tx_ts_enqueue_skb()
1416 ptp->tx_ts_skb_queue[ptp->tx_ts_skb_queue_size] = skb; in lan743x_ptp_tx_ts_enqueue_skb()
1418 ptp->tx_ts_ignore_sync_queue |= in lan743x_ptp_tx_ts_enqueue_skb()
1419 BIT(ptp->tx_ts_skb_queue_size); in lan743x_ptp_tx_ts_enqueue_skb()
1420 ptp->tx_ts_skb_queue_size++; in lan743x_ptp_tx_ts_enqueue_skb()
1426 netif_err(adapter, drv, adapter->netdev, in lan743x_ptp_tx_ts_enqueue_skb()
1430 spin_unlock_bh(&ptp->tx_ts_lock); in lan743x_ptp_tx_ts_enqueue_skb()
1466 struct lan743x_ptp *ptp = &adapter->ptp; in lan743x_ptp_init()
1469 mutex_init(&ptp->command_lock); in lan743x_ptp_init()
1470 spin_lock_init(&ptp->tx_ts_lock); in lan743x_ptp_init()
1471 ptp->used_event_ch = 0; in lan743x_ptp_init()
1474 ptp->perout[i].event_ch = -1; in lan743x_ptp_init()
1475 ptp->perout[i].gpio_pin = -1; in lan743x_ptp_init()
1485 struct lan743x_ptp *ptp = &adapter->ptp; in lan743x_ptp_open()
1486 int ret = -ENODEV; in lan743x_ptp_open()
1504 ptp->flags |= PTP_FLAG_ISR_ENABLED; in lan743x_ptp_open()
1509 switch (adapter->csr.id_rev & ID_REV_ID_MASK_) { in lan743x_ptp_open()
1519 netif_warn(adapter, drv, adapter->netdev, in lan743x_ptp_open()
1521 adapter->csr.id_rev); in lan743x_ptp_open()
1530 struct ptp_pin_desc *ptp_pin = &ptp->pin_config[i]; in lan743x_ptp_open()
1532 snprintf(ptp_pin->name, in lan743x_ptp_open()
1533 sizeof(ptp_pin->name), "lan743x_ptp_pin_%02d", i); in lan743x_ptp_open()
1534 ptp_pin->index = i; in lan743x_ptp_open()
1535 ptp_pin->func = PTP_PF_NONE; in lan743x_ptp_open()
1538 ptp->ptp_clock_info.owner = THIS_MODULE; in lan743x_ptp_open()
1539 snprintf(ptp->ptp_clock_info.name, 16, "%pm", in lan743x_ptp_open()
1540 adapter->netdev->dev_addr); in lan743x_ptp_open()
1541 ptp->ptp_clock_info.max_adj = LAN743X_PTP_MAX_FREQ_ADJ_IN_PPB; in lan743x_ptp_open()
1542 ptp->ptp_clock_info.n_alarm = 0; in lan743x_ptp_open()
1543 ptp->ptp_clock_info.n_ext_ts = LAN743X_PTP_N_EXTTS; in lan743x_ptp_open()
1544 ptp->ptp_clock_info.n_per_out = LAN743X_PTP_N_EVENT_CHAN; in lan743x_ptp_open()
1545 ptp->ptp_clock_info.n_pins = n_pins; in lan743x_ptp_open()
1546 ptp->ptp_clock_info.pps = LAN743X_PTP_N_PPS; in lan743x_ptp_open()
1547 ptp->ptp_clock_info.pin_config = ptp->pin_config; in lan743x_ptp_open()
1548 ptp->ptp_clock_info.adjfine = lan743x_ptpci_adjfine; in lan743x_ptp_open()
1549 ptp->ptp_clock_info.adjtime = lan743x_ptpci_adjtime; in lan743x_ptp_open()
1550 ptp->ptp_clock_info.gettime64 = lan743x_ptpci_gettime64; in lan743x_ptp_open()
1551 ptp->ptp_clock_info.getcrosststamp = NULL; in lan743x_ptp_open()
1552 ptp->ptp_clock_info.settime64 = lan743x_ptpci_settime64; in lan743x_ptp_open()
1553 ptp->ptp_clock_info.enable = lan743x_ptpci_enable; in lan743x_ptp_open()
1554 ptp->ptp_clock_info.do_aux_work = lan743x_ptpci_do_aux_work; in lan743x_ptp_open()
1555 ptp->ptp_clock_info.verify = lan743x_ptpci_verify_pin_config; in lan743x_ptp_open()
1557 ptp->ptp_clock = ptp_clock_register(&ptp->ptp_clock_info, in lan743x_ptp_open()
1558 &adapter->pdev->dev); in lan743x_ptp_open()
1560 if (IS_ERR(ptp->ptp_clock)) { in lan743x_ptp_open()
1561 netif_err(adapter, ifup, adapter->netdev, in lan743x_ptp_open()
1565 ptp->flags |= PTP_FLAG_PTP_CLOCK_REGISTERED; in lan743x_ptp_open()
1566 netif_info(adapter, ifup, adapter->netdev, in lan743x_ptp_open()
1577 struct lan743x_ptp *ptp = &adapter->ptp; in lan743x_ptp_close()
1581 (ptp->flags & PTP_FLAG_PTP_CLOCK_REGISTERED)) { in lan743x_ptp_close()
1582 ptp_clock_unregister(ptp->ptp_clock); in lan743x_ptp_close()
1583 ptp->ptp_clock = NULL; in lan743x_ptp_close()
1584 ptp->flags &= ~PTP_FLAG_PTP_CLOCK_REGISTERED; in lan743x_ptp_close()
1585 netif_info(adapter, drv, adapter->netdev, in lan743x_ptp_close()
1589 if (ptp->flags & PTP_FLAG_ISR_ENABLED) { in lan743x_ptp_close()
1594 ptp->flags &= ~PTP_FLAG_ISR_ENABLED; in lan743x_ptp_close()
1599 spin_lock_bh(&ptp->tx_ts_lock); in lan743x_ptp_close()
1603 struct sk_buff *skb = ptp->tx_ts_skb_queue[index]; in lan743x_ptp_close()
1606 ptp->tx_ts_skb_queue[index] = NULL; in lan743x_ptp_close()
1607 ptp->tx_ts_seconds_queue[index] = 0; in lan743x_ptp_close()
1608 ptp->tx_ts_nseconds_queue[index] = 0; in lan743x_ptp_close()
1610 ptp->tx_ts_skb_queue_size = 0; in lan743x_ptp_close()
1611 ptp->tx_ts_queue_size = 0; in lan743x_ptp_close()
1612 ptp->pending_tx_timestamps = 0; in lan743x_ptp_close()
1613 spin_unlock_bh(&ptp->tx_ts_lock); in lan743x_ptp_close()
1642 struct lan743x_ptp *ptp = &adapter->ptp; in lan743x_ptp_enable()
1644 mutex_lock(&ptp->command_lock); in lan743x_ptp_enable()
1647 netif_warn(adapter, drv, adapter->netdev, in lan743x_ptp_enable()
1653 mutex_unlock(&ptp->command_lock); in lan743x_ptp_enable()
1658 struct lan743x_ptp *ptp = &adapter->ptp; in lan743x_ptp_disable()
1663 mutex_lock(&ptp->command_lock); in lan743x_ptp_disable()
1665 netif_warn(adapter, drv, adapter->netdev, in lan743x_ptp_disable()
1672 mutex_unlock(&ptp->command_lock); in lan743x_ptp_disable()
1677 struct lan743x_ptp *ptp = &adapter->ptp; in lan743x_ptp_reset()
1679 mutex_lock(&ptp->command_lock); in lan743x_ptp_reset()
1682 netif_err(adapter, drv, adapter->netdev, in lan743x_ptp_reset()
1690 mutex_unlock(&ptp->command_lock); in lan743x_ptp_reset()
1697 struct lan743x_ptp *ptp = &adapter->ptp; in lan743x_ptp_clock_set()
1699 mutex_lock(&ptp->command_lock); in lan743x_ptp_clock_set()
1707 mutex_unlock(&ptp->command_lock); in lan743x_ptp_clock_set()
1712 struct lan743x_ptp *ptp = &adapter->ptp; in lan743x_ptp_request_tx_timestamp()
1715 spin_lock_bh(&ptp->tx_ts_lock); in lan743x_ptp_request_tx_timestamp()
1716 if (ptp->pending_tx_timestamps < LAN743X_PTP_NUMBER_OF_TX_TIMESTAMPS) { in lan743x_ptp_request_tx_timestamp()
1718 ptp->pending_tx_timestamps++; in lan743x_ptp_request_tx_timestamp()
1721 spin_unlock_bh(&ptp->tx_ts_lock); in lan743x_ptp_request_tx_timestamp()
1727 struct lan743x_ptp *ptp = &adapter->ptp; in lan743x_ptp_unrequest_tx_timestamp()
1729 spin_lock_bh(&ptp->tx_ts_lock); in lan743x_ptp_unrequest_tx_timestamp()
1730 if (ptp->pending_tx_timestamps > 0) in lan743x_ptp_unrequest_tx_timestamp()
1731 ptp->pending_tx_timestamps--; in lan743x_ptp_unrequest_tx_timestamp()
1733 netif_err(adapter, drv, adapter->netdev, in lan743x_ptp_unrequest_tx_timestamp()
1735 spin_unlock_bh(&ptp->tx_ts_lock); in lan743x_ptp_unrequest_tx_timestamp()
1754 netif_err(adapter, drv, adapter->netdev, in lan743x_ptp_ioctl()
1756 return -EINVAL; in lan743x_ptp_ioctl()
1759 if (copy_from_user(&config, ifr->ifr_data, sizeof(config))) in lan743x_ptp_ioctl()
1760 return -EFAULT; in lan743x_ptp_ioctl()
1764 for (index = 0; index < adapter->used_tx_channels; in lan743x_ptp_ioctl()
1766 lan743x_tx_set_timestamping_mode(&adapter->tx[index], in lan743x_ptp_ioctl()
1771 for (index = 0; index < adapter->used_tx_channels; in lan743x_ptp_ioctl()
1773 lan743x_tx_set_timestamping_mode(&adapter->tx[index], in lan743x_ptp_ioctl()
1778 for (index = 0; index < adapter->used_tx_channels; in lan743x_ptp_ioctl()
1780 lan743x_tx_set_timestamping_mode(&adapter->tx[index], in lan743x_ptp_ioctl()
1786 ret = -ERANGE; in lan743x_ptp_ioctl()
1789 netif_warn(adapter, drv, adapter->netdev, in lan743x_ptp_ioctl()
1791 ret = -EINVAL; in lan743x_ptp_ioctl()
1798 return copy_to_user(ifr->ifr_data, &config, in lan743x_ptp_ioctl()
1799 sizeof(config)) ? -EFAULT : 0; in lan743x_ptp_ioctl()