aq_ptp.c (34031B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* Atlantic Network Driver 3 * 4 * Copyright (C) 2014-2019 aQuantia Corporation 5 * Copyright (C) 2019-2020 Marvell International Ltd. 6 */ 7 8/* File aq_ptp.c: 9 * Definition of functions for Linux PTP support. 10 */ 11 12#include <linux/ptp_clock_kernel.h> 13#include <linux/ptp_classify.h> 14#include <linux/interrupt.h> 15#include <linux/clocksource.h> 16 17#include "aq_nic.h" 18#include "aq_ptp.h" 19#include "aq_ring.h" 20#include "aq_phy.h" 21#include "aq_filters.h" 22 23#if IS_REACHABLE(CONFIG_PTP_1588_CLOCK) 24 25#define AQ_PTP_TX_TIMEOUT (HZ * 10) 26 27#define POLL_SYNC_TIMER_MS 15 28 29enum ptp_speed_offsets { 30 ptp_offset_idx_10 = 0, 31 ptp_offset_idx_100, 32 ptp_offset_idx_1000, 33 ptp_offset_idx_2500, 34 ptp_offset_idx_5000, 35 ptp_offset_idx_10000, 36}; 37 38struct ptp_skb_ring { 39 struct sk_buff **buff; 40 spinlock_t lock; 41 unsigned int size; 42 unsigned int head; 43 unsigned int tail; 44}; 45 46struct ptp_tx_timeout { 47 spinlock_t lock; 48 bool active; 49 unsigned long tx_start; 50}; 51 52struct aq_ptp_s { 53 struct aq_nic_s *aq_nic; 54 struct hwtstamp_config hwtstamp_config; 55 spinlock_t ptp_lock; 56 spinlock_t ptp_ring_lock; 57 struct ptp_clock *ptp_clock; 58 struct ptp_clock_info ptp_info; 59 60 atomic_t offset_egress; 61 atomic_t offset_ingress; 62 63 struct aq_ring_param_s ptp_ring_param; 64 65 struct ptp_tx_timeout ptp_tx_timeout; 66 67 unsigned int idx_vector; 68 struct napi_struct napi; 69 70 struct aq_ring_s ptp_tx; 71 struct aq_ring_s ptp_rx; 72 struct aq_ring_s hwts_rx; 73 74 struct ptp_skb_ring skb_ring; 75 76 struct aq_rx_filter_l3l4 udp_filter; 77 struct aq_rx_filter_l2 eth_type_filter; 78 79 struct delayed_work poll_sync; 80 u32 poll_timeout_ms; 81 82 bool extts_pin_enabled; 83 u64 last_sync1588_ts; 84 85 bool a1_ptp; 86}; 87 88struct ptp_tm_offset { 89 unsigned int mbps; 90 int egress; 91 int ingress; 92}; 93 94static struct ptp_tm_offset ptp_offset[6]; 95 96void aq_ptp_tm_offset_set(struct aq_nic_s *aq_nic, unsigned int mbps) 97{ 98 struct aq_ptp_s *aq_ptp = aq_nic->aq_ptp; 99 int i, egress, ingress; 100 101 if (!aq_ptp) 102 return; 103 104 egress = 0; 105 ingress = 0; 106 107 for (i = 0; i < ARRAY_SIZE(ptp_offset); i++) { 108 if (mbps == ptp_offset[i].mbps) { 109 egress = ptp_offset[i].egress; 110 ingress = ptp_offset[i].ingress; 111 break; 112 } 113 } 114 115 atomic_set(&aq_ptp->offset_egress, egress); 116 atomic_set(&aq_ptp->offset_ingress, ingress); 117} 118 119static int __aq_ptp_skb_put(struct ptp_skb_ring *ring, struct sk_buff *skb) 120{ 121 unsigned int next_head = (ring->head + 1) % ring->size; 122 123 if (next_head == ring->tail) 124 return -ENOMEM; 125 126 ring->buff[ring->head] = skb_get(skb); 127 ring->head = next_head; 128 129 return 0; 130} 131 132static int aq_ptp_skb_put(struct ptp_skb_ring *ring, struct sk_buff *skb) 133{ 134 unsigned long flags; 135 int ret; 136 137 spin_lock_irqsave(&ring->lock, flags); 138 ret = __aq_ptp_skb_put(ring, skb); 139 spin_unlock_irqrestore(&ring->lock, flags); 140 141 return ret; 142} 143 144static struct sk_buff *__aq_ptp_skb_get(struct ptp_skb_ring *ring) 145{ 146 struct sk_buff *skb; 147 148 if (ring->tail == ring->head) 149 return NULL; 150 151 skb = ring->buff[ring->tail]; 152 ring->tail = (ring->tail + 1) % ring->size; 153 154 return skb; 155} 156 157static struct sk_buff *aq_ptp_skb_get(struct ptp_skb_ring *ring) 158{ 159 unsigned long flags; 160 struct sk_buff *skb; 161 162 spin_lock_irqsave(&ring->lock, flags); 163 skb = __aq_ptp_skb_get(ring); 164 spin_unlock_irqrestore(&ring->lock, flags); 165 166 return skb; 167} 168 169static unsigned int aq_ptp_skb_buf_len(struct ptp_skb_ring *ring) 170{ 171 unsigned long flags; 172 unsigned int len; 173 174 spin_lock_irqsave(&ring->lock, flags); 175 len = (ring->head >= ring->tail) ? 176 ring->head - ring->tail : 177 ring->size - ring->tail + ring->head; 178 spin_unlock_irqrestore(&ring->lock, flags); 179 180 return len; 181} 182 183static int aq_ptp_skb_ring_init(struct ptp_skb_ring *ring, unsigned int size) 184{ 185 struct sk_buff **buff = kmalloc(sizeof(*buff) * size, GFP_KERNEL); 186 187 if (!buff) 188 return -ENOMEM; 189 190 spin_lock_init(&ring->lock); 191 192 ring->buff = buff; 193 ring->size = size; 194 ring->head = 0; 195 ring->tail = 0; 196 197 return 0; 198} 199 200static void aq_ptp_skb_ring_clean(struct ptp_skb_ring *ring) 201{ 202 struct sk_buff *skb; 203 204 while ((skb = aq_ptp_skb_get(ring)) != NULL) 205 dev_kfree_skb_any(skb); 206} 207 208static void aq_ptp_skb_ring_release(struct ptp_skb_ring *ring) 209{ 210 if (ring->buff) { 211 aq_ptp_skb_ring_clean(ring); 212 kfree(ring->buff); 213 ring->buff = NULL; 214 } 215} 216 217static void aq_ptp_tx_timeout_init(struct ptp_tx_timeout *timeout) 218{ 219 spin_lock_init(&timeout->lock); 220 timeout->active = false; 221} 222 223static void aq_ptp_tx_timeout_start(struct aq_ptp_s *aq_ptp) 224{ 225 struct ptp_tx_timeout *timeout = &aq_ptp->ptp_tx_timeout; 226 unsigned long flags; 227 228 spin_lock_irqsave(&timeout->lock, flags); 229 timeout->active = true; 230 timeout->tx_start = jiffies; 231 spin_unlock_irqrestore(&timeout->lock, flags); 232} 233 234static void aq_ptp_tx_timeout_update(struct aq_ptp_s *aq_ptp) 235{ 236 if (!aq_ptp_skb_buf_len(&aq_ptp->skb_ring)) { 237 struct ptp_tx_timeout *timeout = &aq_ptp->ptp_tx_timeout; 238 unsigned long flags; 239 240 spin_lock_irqsave(&timeout->lock, flags); 241 timeout->active = false; 242 spin_unlock_irqrestore(&timeout->lock, flags); 243 } 244} 245 246static void aq_ptp_tx_timeout_check(struct aq_ptp_s *aq_ptp) 247{ 248 struct ptp_tx_timeout *timeout = &aq_ptp->ptp_tx_timeout; 249 unsigned long flags; 250 bool timeout_flag; 251 252 timeout_flag = false; 253 254 spin_lock_irqsave(&timeout->lock, flags); 255 if (timeout->active) { 256 timeout_flag = time_is_before_jiffies(timeout->tx_start + 257 AQ_PTP_TX_TIMEOUT); 258 /* reset active flag if timeout detected */ 259 if (timeout_flag) 260 timeout->active = false; 261 } 262 spin_unlock_irqrestore(&timeout->lock, flags); 263 264 if (timeout_flag) { 265 aq_ptp_skb_ring_clean(&aq_ptp->skb_ring); 266 netdev_err(aq_ptp->aq_nic->ndev, 267 "PTP Timeout. Clearing Tx Timestamp SKBs\n"); 268 } 269} 270 271/* aq_ptp_adjfine 272 * @ptp: the ptp clock structure 273 * @ppb: parts per billion adjustment from base 274 * 275 * adjust the frequency of the ptp cycle counter by the 276 * indicated ppb from the base frequency. 277 */ 278static int aq_ptp_adjfine(struct ptp_clock_info *ptp, long scaled_ppm) 279{ 280 struct aq_ptp_s *aq_ptp = container_of(ptp, struct aq_ptp_s, ptp_info); 281 struct aq_nic_s *aq_nic = aq_ptp->aq_nic; 282 283 mutex_lock(&aq_nic->fwreq_mutex); 284 aq_nic->aq_hw_ops->hw_adj_clock_freq(aq_nic->aq_hw, 285 scaled_ppm_to_ppb(scaled_ppm)); 286 mutex_unlock(&aq_nic->fwreq_mutex); 287 288 return 0; 289} 290 291/* aq_ptp_adjtime 292 * @ptp: the ptp clock structure 293 * @delta: offset to adjust the cycle counter by 294 * 295 * adjust the timer by resetting the timecounter structure. 296 */ 297static int aq_ptp_adjtime(struct ptp_clock_info *ptp, s64 delta) 298{ 299 struct aq_ptp_s *aq_ptp = container_of(ptp, struct aq_ptp_s, ptp_info); 300 struct aq_nic_s *aq_nic = aq_ptp->aq_nic; 301 unsigned long flags; 302 303 spin_lock_irqsave(&aq_ptp->ptp_lock, flags); 304 aq_nic->aq_hw_ops->hw_adj_sys_clock(aq_nic->aq_hw, delta); 305 spin_unlock_irqrestore(&aq_ptp->ptp_lock, flags); 306 307 return 0; 308} 309 310/* aq_ptp_gettime 311 * @ptp: the ptp clock structure 312 * @ts: timespec structure to hold the current time value 313 * 314 * read the timecounter and return the correct value on ns, 315 * after converting it into a struct timespec. 316 */ 317static int aq_ptp_gettime(struct ptp_clock_info *ptp, struct timespec64 *ts) 318{ 319 struct aq_ptp_s *aq_ptp = container_of(ptp, struct aq_ptp_s, ptp_info); 320 struct aq_nic_s *aq_nic = aq_ptp->aq_nic; 321 unsigned long flags; 322 u64 ns; 323 324 spin_lock_irqsave(&aq_ptp->ptp_lock, flags); 325 aq_nic->aq_hw_ops->hw_get_ptp_ts(aq_nic->aq_hw, &ns); 326 spin_unlock_irqrestore(&aq_ptp->ptp_lock, flags); 327 328 *ts = ns_to_timespec64(ns); 329 330 return 0; 331} 332 333/* aq_ptp_settime 334 * @ptp: the ptp clock structure 335 * @ts: the timespec containing the new time for the cycle counter 336 * 337 * reset the timecounter to use a new base value instead of the kernel 338 * wall timer value. 339 */ 340static int aq_ptp_settime(struct ptp_clock_info *ptp, 341 const struct timespec64 *ts) 342{ 343 struct aq_ptp_s *aq_ptp = container_of(ptp, struct aq_ptp_s, ptp_info); 344 struct aq_nic_s *aq_nic = aq_ptp->aq_nic; 345 unsigned long flags; 346 u64 ns = timespec64_to_ns(ts); 347 u64 now; 348 349 spin_lock_irqsave(&aq_ptp->ptp_lock, flags); 350 aq_nic->aq_hw_ops->hw_get_ptp_ts(aq_nic->aq_hw, &now); 351 aq_nic->aq_hw_ops->hw_adj_sys_clock(aq_nic->aq_hw, (s64)ns - (s64)now); 352 353 spin_unlock_irqrestore(&aq_ptp->ptp_lock, flags); 354 355 return 0; 356} 357 358static void aq_ptp_convert_to_hwtstamp(struct aq_ptp_s *aq_ptp, 359 struct skb_shared_hwtstamps *hwtstamp, 360 u64 timestamp) 361{ 362 memset(hwtstamp, 0, sizeof(*hwtstamp)); 363 hwtstamp->hwtstamp = ns_to_ktime(timestamp); 364} 365 366static int aq_ptp_hw_pin_conf(struct aq_nic_s *aq_nic, u32 pin_index, u64 start, 367 u64 period) 368{ 369 if (period) 370 netdev_dbg(aq_nic->ndev, 371 "Enable GPIO %d pulsing, start time %llu, period %u\n", 372 pin_index, start, (u32)period); 373 else 374 netdev_dbg(aq_nic->ndev, 375 "Disable GPIO %d pulsing, start time %llu, period %u\n", 376 pin_index, start, (u32)period); 377 378 /* Notify hardware of request to being sending pulses. 379 * If period is ZERO then pulsen is disabled. 380 */ 381 mutex_lock(&aq_nic->fwreq_mutex); 382 aq_nic->aq_hw_ops->hw_gpio_pulse(aq_nic->aq_hw, pin_index, 383 start, (u32)period); 384 mutex_unlock(&aq_nic->fwreq_mutex); 385 386 return 0; 387} 388 389static int aq_ptp_perout_pin_configure(struct ptp_clock_info *ptp, 390 struct ptp_clock_request *rq, int on) 391{ 392 struct aq_ptp_s *aq_ptp = container_of(ptp, struct aq_ptp_s, ptp_info); 393 struct ptp_clock_time *t = &rq->perout.period; 394 struct ptp_clock_time *s = &rq->perout.start; 395 struct aq_nic_s *aq_nic = aq_ptp->aq_nic; 396 u64 start, period; 397 u32 pin_index = rq->perout.index; 398 399 /* verify the request channel is there */ 400 if (pin_index >= ptp->n_per_out) 401 return -EINVAL; 402 403 /* we cannot support periods greater 404 * than 4 seconds due to reg limit 405 */ 406 if (t->sec > 4 || t->sec < 0) 407 return -ERANGE; 408 409 /* convert to unsigned 64b ns, 410 * verify we can put it in a 32b register 411 */ 412 period = on ? t->sec * NSEC_PER_SEC + t->nsec : 0; 413 414 /* verify the value is in range supported by hardware */ 415 if (period > U32_MAX) 416 return -ERANGE; 417 /* convert to unsigned 64b ns */ 418 /* TODO convert to AQ time */ 419 start = on ? s->sec * NSEC_PER_SEC + s->nsec : 0; 420 421 aq_ptp_hw_pin_conf(aq_nic, pin_index, start, period); 422 423 return 0; 424} 425 426static int aq_ptp_pps_pin_configure(struct ptp_clock_info *ptp, 427 struct ptp_clock_request *rq, int on) 428{ 429 struct aq_ptp_s *aq_ptp = container_of(ptp, struct aq_ptp_s, ptp_info); 430 struct aq_nic_s *aq_nic = aq_ptp->aq_nic; 431 u64 start, period; 432 u32 pin_index = 0; 433 u32 rest = 0; 434 435 /* verify the request channel is there */ 436 if (pin_index >= ptp->n_per_out) 437 return -EINVAL; 438 439 aq_nic->aq_hw_ops->hw_get_ptp_ts(aq_nic->aq_hw, &start); 440 div_u64_rem(start, NSEC_PER_SEC, &rest); 441 period = on ? NSEC_PER_SEC : 0; /* PPS - pulse per second */ 442 start = on ? start - rest + NSEC_PER_SEC * 443 (rest > 990000000LL ? 2 : 1) : 0; 444 445 aq_ptp_hw_pin_conf(aq_nic, pin_index, start, period); 446 447 return 0; 448} 449 450static void aq_ptp_extts_pin_ctrl(struct aq_ptp_s *aq_ptp) 451{ 452 struct aq_nic_s *aq_nic = aq_ptp->aq_nic; 453 u32 enable = aq_ptp->extts_pin_enabled; 454 455 if (aq_nic->aq_hw_ops->hw_extts_gpio_enable) 456 aq_nic->aq_hw_ops->hw_extts_gpio_enable(aq_nic->aq_hw, 0, 457 enable); 458} 459 460static int aq_ptp_extts_pin_configure(struct ptp_clock_info *ptp, 461 struct ptp_clock_request *rq, int on) 462{ 463 struct aq_ptp_s *aq_ptp = container_of(ptp, struct aq_ptp_s, ptp_info); 464 465 u32 pin_index = rq->extts.index; 466 467 if (pin_index >= ptp->n_ext_ts) 468 return -EINVAL; 469 470 aq_ptp->extts_pin_enabled = !!on; 471 if (on) { 472 aq_ptp->poll_timeout_ms = POLL_SYNC_TIMER_MS; 473 cancel_delayed_work_sync(&aq_ptp->poll_sync); 474 schedule_delayed_work(&aq_ptp->poll_sync, 475 msecs_to_jiffies(aq_ptp->poll_timeout_ms)); 476 } 477 478 aq_ptp_extts_pin_ctrl(aq_ptp); 479 return 0; 480} 481 482/* aq_ptp_gpio_feature_enable 483 * @ptp: the ptp clock structure 484 * @rq: the requested feature to change 485 * @on: whether to enable or disable the feature 486 */ 487static int aq_ptp_gpio_feature_enable(struct ptp_clock_info *ptp, 488 struct ptp_clock_request *rq, int on) 489{ 490 switch (rq->type) { 491 case PTP_CLK_REQ_EXTTS: 492 return aq_ptp_extts_pin_configure(ptp, rq, on); 493 case PTP_CLK_REQ_PEROUT: 494 return aq_ptp_perout_pin_configure(ptp, rq, on); 495 case PTP_CLK_REQ_PPS: 496 return aq_ptp_pps_pin_configure(ptp, rq, on); 497 default: 498 return -EOPNOTSUPP; 499 } 500 501 return 0; 502} 503 504/* aq_ptp_verify 505 * @ptp: the ptp clock structure 506 * @pin: index of the pin in question 507 * @func: the desired function to use 508 * @chan: the function channel index to use 509 */ 510static int aq_ptp_verify(struct ptp_clock_info *ptp, unsigned int pin, 511 enum ptp_pin_function func, unsigned int chan) 512{ 513 /* verify the requested pin is there */ 514 if (!ptp->pin_config || pin >= ptp->n_pins) 515 return -EINVAL; 516 517 /* enforce locked channels, no changing them */ 518 if (chan != ptp->pin_config[pin].chan) 519 return -EINVAL; 520 521 /* we want to keep the functions locked as well */ 522 if (func != ptp->pin_config[pin].func) 523 return -EINVAL; 524 525 return 0; 526} 527 528/* aq_ptp_tx_hwtstamp - utility function which checks for TX time stamp 529 * @adapter: the private adapter struct 530 * 531 * if the timestamp is valid, we convert it into the timecounter ns 532 * value, then store that result into the hwtstamps structure which 533 * is passed up the network stack 534 */ 535void aq_ptp_tx_hwtstamp(struct aq_nic_s *aq_nic, u64 timestamp) 536{ 537 struct aq_ptp_s *aq_ptp = aq_nic->aq_ptp; 538 struct sk_buff *skb = aq_ptp_skb_get(&aq_ptp->skb_ring); 539 struct skb_shared_hwtstamps hwtstamp; 540 541 if (!skb) { 542 netdev_err(aq_nic->ndev, "have timestamp but tx_queues empty\n"); 543 return; 544 } 545 546 timestamp += atomic_read(&aq_ptp->offset_egress); 547 aq_ptp_convert_to_hwtstamp(aq_ptp, &hwtstamp, timestamp); 548 skb_tstamp_tx(skb, &hwtstamp); 549 dev_kfree_skb_any(skb); 550 551 aq_ptp_tx_timeout_update(aq_ptp); 552} 553 554/* aq_ptp_rx_hwtstamp - utility function which checks for RX time stamp 555 * @adapter: pointer to adapter struct 556 * @skb: particular skb to send timestamp with 557 * 558 * if the timestamp is valid, we convert it into the timecounter ns 559 * value, then store that result into the hwtstamps structure which 560 * is passed up the network stack 561 */ 562static void aq_ptp_rx_hwtstamp(struct aq_ptp_s *aq_ptp, struct sk_buff *skb, 563 u64 timestamp) 564{ 565 timestamp -= atomic_read(&aq_ptp->offset_ingress); 566 aq_ptp_convert_to_hwtstamp(aq_ptp, skb_hwtstamps(skb), timestamp); 567} 568 569void aq_ptp_hwtstamp_config_get(struct aq_ptp_s *aq_ptp, 570 struct hwtstamp_config *config) 571{ 572 *config = aq_ptp->hwtstamp_config; 573} 574 575static void aq_ptp_prepare_filters(struct aq_ptp_s *aq_ptp) 576{ 577 aq_ptp->udp_filter.cmd = HW_ATL_RX_ENABLE_FLTR_L3L4 | 578 HW_ATL_RX_ENABLE_CMP_PROT_L4 | 579 HW_ATL_RX_UDP | 580 HW_ATL_RX_ENABLE_CMP_DEST_PORT_L4 | 581 HW_ATL_RX_HOST << HW_ATL_RX_ACTION_FL3F4_SHIFT | 582 HW_ATL_RX_ENABLE_QUEUE_L3L4 | 583 aq_ptp->ptp_rx.idx << HW_ATL_RX_QUEUE_FL3L4_SHIFT; 584 aq_ptp->udp_filter.p_dst = PTP_EV_PORT; 585 586 aq_ptp->eth_type_filter.ethertype = ETH_P_1588; 587 aq_ptp->eth_type_filter.queue = aq_ptp->ptp_rx.idx; 588} 589 590int aq_ptp_hwtstamp_config_set(struct aq_ptp_s *aq_ptp, 591 struct hwtstamp_config *config) 592{ 593 struct aq_nic_s *aq_nic = aq_ptp->aq_nic; 594 const struct aq_hw_ops *hw_ops; 595 int err = 0; 596 597 hw_ops = aq_nic->aq_hw_ops; 598 if (config->tx_type == HWTSTAMP_TX_ON || 599 config->rx_filter == HWTSTAMP_FILTER_PTP_V2_EVENT) { 600 aq_ptp_prepare_filters(aq_ptp); 601 if (hw_ops->hw_filter_l3l4_set) { 602 err = hw_ops->hw_filter_l3l4_set(aq_nic->aq_hw, 603 &aq_ptp->udp_filter); 604 } 605 if (!err && hw_ops->hw_filter_l2_set) { 606 err = hw_ops->hw_filter_l2_set(aq_nic->aq_hw, 607 &aq_ptp->eth_type_filter); 608 } 609 aq_utils_obj_set(&aq_nic->flags, AQ_NIC_PTP_DPATH_UP); 610 } else { 611 aq_ptp->udp_filter.cmd &= ~HW_ATL_RX_ENABLE_FLTR_L3L4; 612 if (hw_ops->hw_filter_l3l4_set) { 613 err = hw_ops->hw_filter_l3l4_set(aq_nic->aq_hw, 614 &aq_ptp->udp_filter); 615 } 616 if (!err && hw_ops->hw_filter_l2_clear) { 617 err = hw_ops->hw_filter_l2_clear(aq_nic->aq_hw, 618 &aq_ptp->eth_type_filter); 619 } 620 aq_utils_obj_clear(&aq_nic->flags, AQ_NIC_PTP_DPATH_UP); 621 } 622 623 if (err) 624 return -EREMOTEIO; 625 626 aq_ptp->hwtstamp_config = *config; 627 628 return 0; 629} 630 631bool aq_ptp_ring(struct aq_nic_s *aq_nic, struct aq_ring_s *ring) 632{ 633 struct aq_ptp_s *aq_ptp = aq_nic->aq_ptp; 634 635 if (!aq_ptp) 636 return false; 637 638 return &aq_ptp->ptp_tx == ring || 639 &aq_ptp->ptp_rx == ring || &aq_ptp->hwts_rx == ring; 640} 641 642u16 aq_ptp_extract_ts(struct aq_nic_s *aq_nic, struct sk_buff *skb, u8 *p, 643 unsigned int len) 644{ 645 struct aq_ptp_s *aq_ptp = aq_nic->aq_ptp; 646 u64 timestamp = 0; 647 u16 ret = aq_nic->aq_hw_ops->rx_extract_ts(aq_nic->aq_hw, 648 p, len, ×tamp); 649 650 if (ret > 0) 651 aq_ptp_rx_hwtstamp(aq_ptp, skb, timestamp); 652 653 return ret; 654} 655 656static int aq_ptp_poll(struct napi_struct *napi, int budget) 657{ 658 struct aq_ptp_s *aq_ptp = container_of(napi, struct aq_ptp_s, napi); 659 struct aq_nic_s *aq_nic = aq_ptp->aq_nic; 660 bool was_cleaned = false; 661 int work_done = 0; 662 int err; 663 664 /* Processing PTP TX traffic */ 665 err = aq_nic->aq_hw_ops->hw_ring_tx_head_update(aq_nic->aq_hw, 666 &aq_ptp->ptp_tx); 667 if (err < 0) 668 goto err_exit; 669 670 if (aq_ptp->ptp_tx.sw_head != aq_ptp->ptp_tx.hw_head) { 671 aq_ring_tx_clean(&aq_ptp->ptp_tx); 672 673 was_cleaned = true; 674 } 675 676 /* Processing HW_TIMESTAMP RX traffic */ 677 err = aq_nic->aq_hw_ops->hw_ring_hwts_rx_receive(aq_nic->aq_hw, 678 &aq_ptp->hwts_rx); 679 if (err < 0) 680 goto err_exit; 681 682 if (aq_ptp->hwts_rx.sw_head != aq_ptp->hwts_rx.hw_head) { 683 aq_ring_hwts_rx_clean(&aq_ptp->hwts_rx, aq_nic); 684 685 err = aq_nic->aq_hw_ops->hw_ring_hwts_rx_fill(aq_nic->aq_hw, 686 &aq_ptp->hwts_rx); 687 if (err < 0) 688 goto err_exit; 689 690 was_cleaned = true; 691 } 692 693 /* Processing PTP RX traffic */ 694 err = aq_nic->aq_hw_ops->hw_ring_rx_receive(aq_nic->aq_hw, 695 &aq_ptp->ptp_rx); 696 if (err < 0) 697 goto err_exit; 698 699 if (aq_ptp->ptp_rx.sw_head != aq_ptp->ptp_rx.hw_head) { 700 unsigned int sw_tail_old; 701 702 err = aq_ring_rx_clean(&aq_ptp->ptp_rx, napi, &work_done, budget); 703 if (err < 0) 704 goto err_exit; 705 706 sw_tail_old = aq_ptp->ptp_rx.sw_tail; 707 err = aq_ring_rx_fill(&aq_ptp->ptp_rx); 708 if (err < 0) 709 goto err_exit; 710 711 err = aq_nic->aq_hw_ops->hw_ring_rx_fill(aq_nic->aq_hw, 712 &aq_ptp->ptp_rx, 713 sw_tail_old); 714 if (err < 0) 715 goto err_exit; 716 } 717 718 if (was_cleaned) 719 work_done = budget; 720 721 if (work_done < budget) { 722 napi_complete_done(napi, work_done); 723 aq_nic->aq_hw_ops->hw_irq_enable(aq_nic->aq_hw, 724 BIT_ULL(aq_ptp->ptp_ring_param.vec_idx)); 725 } 726 727err_exit: 728 return work_done; 729} 730 731static irqreturn_t aq_ptp_isr(int irq, void *private) 732{ 733 struct aq_ptp_s *aq_ptp = private; 734 int err = 0; 735 736 if (!aq_ptp) { 737 err = -EINVAL; 738 goto err_exit; 739 } 740 napi_schedule(&aq_ptp->napi); 741 742err_exit: 743 return err >= 0 ? IRQ_HANDLED : IRQ_NONE; 744} 745 746int aq_ptp_xmit(struct aq_nic_s *aq_nic, struct sk_buff *skb) 747{ 748 struct aq_ptp_s *aq_ptp = aq_nic->aq_ptp; 749 struct aq_ring_s *ring = &aq_ptp->ptp_tx; 750 unsigned long irq_flags; 751 int err = NETDEV_TX_OK; 752 unsigned int frags; 753 754 if (skb->len <= 0) { 755 dev_kfree_skb_any(skb); 756 goto err_exit; 757 } 758 759 frags = skb_shinfo(skb)->nr_frags + 1; 760 /* Frags cannot be bigger 16KB 761 * because PTP usually works 762 * without Jumbo even in a background 763 */ 764 if (frags > AQ_CFG_SKB_FRAGS_MAX || frags > aq_ring_avail_dx(ring)) { 765 /* Drop packet because it doesn't make sence to delay it */ 766 dev_kfree_skb_any(skb); 767 goto err_exit; 768 } 769 770 err = aq_ptp_skb_put(&aq_ptp->skb_ring, skb); 771 if (err) { 772 netdev_err(aq_nic->ndev, "SKB Ring is overflow (%u)!\n", 773 ring->size); 774 return NETDEV_TX_BUSY; 775 } 776 skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; 777 aq_ptp_tx_timeout_start(aq_ptp); 778 skb_tx_timestamp(skb); 779 780 spin_lock_irqsave(&aq_nic->aq_ptp->ptp_ring_lock, irq_flags); 781 frags = aq_nic_map_skb(aq_nic, skb, ring); 782 783 if (likely(frags)) { 784 err = aq_nic->aq_hw_ops->hw_ring_tx_xmit(aq_nic->aq_hw, 785 ring, frags); 786 if (err >= 0) { 787 u64_stats_update_begin(&ring->stats.tx.syncp); 788 ++ring->stats.tx.packets; 789 ring->stats.tx.bytes += skb->len; 790 u64_stats_update_end(&ring->stats.tx.syncp); 791 } 792 } else { 793 err = NETDEV_TX_BUSY; 794 } 795 spin_unlock_irqrestore(&aq_nic->aq_ptp->ptp_ring_lock, irq_flags); 796 797err_exit: 798 return err; 799} 800 801void aq_ptp_service_task(struct aq_nic_s *aq_nic) 802{ 803 struct aq_ptp_s *aq_ptp = aq_nic->aq_ptp; 804 805 if (!aq_ptp) 806 return; 807 808 aq_ptp_tx_timeout_check(aq_ptp); 809} 810 811int aq_ptp_irq_alloc(struct aq_nic_s *aq_nic) 812{ 813 struct pci_dev *pdev = aq_nic->pdev; 814 struct aq_ptp_s *aq_ptp = aq_nic->aq_ptp; 815 int err = 0; 816 817 if (!aq_ptp) 818 return 0; 819 820 if (pdev->msix_enabled || pdev->msi_enabled) { 821 err = request_irq(pci_irq_vector(pdev, aq_ptp->idx_vector), 822 aq_ptp_isr, 0, aq_nic->ndev->name, aq_ptp); 823 } else { 824 err = -EINVAL; 825 goto err_exit; 826 } 827 828err_exit: 829 return err; 830} 831 832void aq_ptp_irq_free(struct aq_nic_s *aq_nic) 833{ 834 struct aq_ptp_s *aq_ptp = aq_nic->aq_ptp; 835 struct pci_dev *pdev = aq_nic->pdev; 836 837 if (!aq_ptp) 838 return; 839 840 free_irq(pci_irq_vector(pdev, aq_ptp->idx_vector), aq_ptp); 841} 842 843int aq_ptp_ring_init(struct aq_nic_s *aq_nic) 844{ 845 struct aq_ptp_s *aq_ptp = aq_nic->aq_ptp; 846 int err = 0; 847 848 if (!aq_ptp) 849 return 0; 850 851 err = aq_ring_init(&aq_ptp->ptp_tx, ATL_RING_TX); 852 if (err < 0) 853 goto err_exit; 854 err = aq_nic->aq_hw_ops->hw_ring_tx_init(aq_nic->aq_hw, 855 &aq_ptp->ptp_tx, 856 &aq_ptp->ptp_ring_param); 857 if (err < 0) 858 goto err_exit; 859 860 err = aq_ring_init(&aq_ptp->ptp_rx, ATL_RING_RX); 861 if (err < 0) 862 goto err_exit; 863 err = aq_nic->aq_hw_ops->hw_ring_rx_init(aq_nic->aq_hw, 864 &aq_ptp->ptp_rx, 865 &aq_ptp->ptp_ring_param); 866 if (err < 0) 867 goto err_exit; 868 869 err = aq_ring_rx_fill(&aq_ptp->ptp_rx); 870 if (err < 0) 871 goto err_rx_free; 872 err = aq_nic->aq_hw_ops->hw_ring_rx_fill(aq_nic->aq_hw, 873 &aq_ptp->ptp_rx, 874 0U); 875 if (err < 0) 876 goto err_rx_free; 877 878 err = aq_ring_init(&aq_ptp->hwts_rx, ATL_RING_RX); 879 if (err < 0) 880 goto err_rx_free; 881 err = aq_nic->aq_hw_ops->hw_ring_rx_init(aq_nic->aq_hw, 882 &aq_ptp->hwts_rx, 883 &aq_ptp->ptp_ring_param); 884 if (err < 0) 885 goto err_exit; 886 err = aq_nic->aq_hw_ops->hw_ring_hwts_rx_fill(aq_nic->aq_hw, 887 &aq_ptp->hwts_rx); 888 if (err < 0) 889 goto err_exit; 890 891 return err; 892 893err_rx_free: 894 aq_ring_rx_deinit(&aq_ptp->ptp_rx); 895err_exit: 896 return err; 897} 898 899int aq_ptp_ring_start(struct aq_nic_s *aq_nic) 900{ 901 struct aq_ptp_s *aq_ptp = aq_nic->aq_ptp; 902 int err = 0; 903 904 if (!aq_ptp) 905 return 0; 906 907 err = aq_nic->aq_hw_ops->hw_ring_tx_start(aq_nic->aq_hw, &aq_ptp->ptp_tx); 908 if (err < 0) 909 goto err_exit; 910 911 err = aq_nic->aq_hw_ops->hw_ring_rx_start(aq_nic->aq_hw, &aq_ptp->ptp_rx); 912 if (err < 0) 913 goto err_exit; 914 915 err = aq_nic->aq_hw_ops->hw_ring_rx_start(aq_nic->aq_hw, 916 &aq_ptp->hwts_rx); 917 if (err < 0) 918 goto err_exit; 919 920 napi_enable(&aq_ptp->napi); 921 922err_exit: 923 return err; 924} 925 926void aq_ptp_ring_stop(struct aq_nic_s *aq_nic) 927{ 928 struct aq_ptp_s *aq_ptp = aq_nic->aq_ptp; 929 930 if (!aq_ptp) 931 return; 932 933 aq_nic->aq_hw_ops->hw_ring_tx_stop(aq_nic->aq_hw, &aq_ptp->ptp_tx); 934 aq_nic->aq_hw_ops->hw_ring_rx_stop(aq_nic->aq_hw, &aq_ptp->ptp_rx); 935 936 aq_nic->aq_hw_ops->hw_ring_rx_stop(aq_nic->aq_hw, &aq_ptp->hwts_rx); 937 938 napi_disable(&aq_ptp->napi); 939} 940 941void aq_ptp_ring_deinit(struct aq_nic_s *aq_nic) 942{ 943 struct aq_ptp_s *aq_ptp = aq_nic->aq_ptp; 944 945 if (!aq_ptp || !aq_ptp->ptp_tx.aq_nic || !aq_ptp->ptp_rx.aq_nic) 946 return; 947 948 aq_ring_tx_clean(&aq_ptp->ptp_tx); 949 aq_ring_rx_deinit(&aq_ptp->ptp_rx); 950} 951 952int aq_ptp_ring_alloc(struct aq_nic_s *aq_nic) 953{ 954 struct aq_ptp_s *aq_ptp = aq_nic->aq_ptp; 955 unsigned int tx_ring_idx, rx_ring_idx; 956 struct aq_ring_s *hwts; 957 struct aq_ring_s *ring; 958 int err; 959 960 if (!aq_ptp) 961 return 0; 962 963 tx_ring_idx = aq_ptp_ring_idx(aq_nic->aq_nic_cfg.tc_mode); 964 965 ring = aq_ring_tx_alloc(&aq_ptp->ptp_tx, aq_nic, 966 tx_ring_idx, &aq_nic->aq_nic_cfg); 967 if (!ring) { 968 err = -ENOMEM; 969 goto err_exit; 970 } 971 972 rx_ring_idx = aq_ptp_ring_idx(aq_nic->aq_nic_cfg.tc_mode); 973 974 ring = aq_ring_rx_alloc(&aq_ptp->ptp_rx, aq_nic, 975 rx_ring_idx, &aq_nic->aq_nic_cfg); 976 if (!ring) { 977 err = -ENOMEM; 978 goto err_exit_ptp_tx; 979 } 980 981 hwts = aq_ring_hwts_rx_alloc(&aq_ptp->hwts_rx, aq_nic, PTP_HWST_RING_IDX, 982 aq_nic->aq_nic_cfg.rxds, 983 aq_nic->aq_nic_cfg.aq_hw_caps->rxd_size); 984 if (!hwts) { 985 err = -ENOMEM; 986 goto err_exit_ptp_rx; 987 } 988 989 err = aq_ptp_skb_ring_init(&aq_ptp->skb_ring, aq_nic->aq_nic_cfg.rxds); 990 if (err != 0) { 991 err = -ENOMEM; 992 goto err_exit_hwts_rx; 993 } 994 995 aq_ptp->ptp_ring_param.vec_idx = aq_ptp->idx_vector; 996 aq_ptp->ptp_ring_param.cpu = aq_ptp->ptp_ring_param.vec_idx + 997 aq_nic_get_cfg(aq_nic)->aq_rss.base_cpu_number; 998 cpumask_set_cpu(aq_ptp->ptp_ring_param.cpu, 999 &aq_ptp->ptp_ring_param.affinity_mask); 1000 1001 return 0; 1002 1003err_exit_hwts_rx: 1004 aq_ring_free(&aq_ptp->hwts_rx); 1005err_exit_ptp_rx: 1006 aq_ring_free(&aq_ptp->ptp_rx); 1007err_exit_ptp_tx: 1008 aq_ring_free(&aq_ptp->ptp_tx); 1009err_exit: 1010 return err; 1011} 1012 1013void aq_ptp_ring_free(struct aq_nic_s *aq_nic) 1014{ 1015 struct aq_ptp_s *aq_ptp = aq_nic->aq_ptp; 1016 1017 if (!aq_ptp) 1018 return; 1019 1020 aq_ring_free(&aq_ptp->ptp_tx); 1021 aq_ring_free(&aq_ptp->ptp_rx); 1022 aq_ring_free(&aq_ptp->hwts_rx); 1023 1024 aq_ptp_skb_ring_release(&aq_ptp->skb_ring); 1025} 1026 1027#define MAX_PTP_GPIO_COUNT 4 1028 1029static struct ptp_clock_info aq_ptp_clock = { 1030 .owner = THIS_MODULE, 1031 .name = "atlantic ptp", 1032 .max_adj = 999999999, 1033 .n_ext_ts = 0, 1034 .pps = 0, 1035 .adjfine = aq_ptp_adjfine, 1036 .adjtime = aq_ptp_adjtime, 1037 .gettime64 = aq_ptp_gettime, 1038 .settime64 = aq_ptp_settime, 1039 .n_per_out = 0, 1040 .enable = aq_ptp_gpio_feature_enable, 1041 .n_pins = 0, 1042 .verify = aq_ptp_verify, 1043 .pin_config = NULL, 1044}; 1045 1046#define ptp_offset_init(__idx, __mbps, __egress, __ingress) do { \ 1047 ptp_offset[__idx].mbps = (__mbps); \ 1048 ptp_offset[__idx].egress = (__egress); \ 1049 ptp_offset[__idx].ingress = (__ingress); } \ 1050 while (0) 1051 1052static void aq_ptp_offset_init_from_fw(const struct hw_atl_ptp_offset *offsets) 1053{ 1054 int i; 1055 1056 /* Load offsets for PTP */ 1057 for (i = 0; i < ARRAY_SIZE(ptp_offset); i++) { 1058 switch (i) { 1059 /* 100M */ 1060 case ptp_offset_idx_100: 1061 ptp_offset_init(i, 100, 1062 offsets->egress_100, 1063 offsets->ingress_100); 1064 break; 1065 /* 1G */ 1066 case ptp_offset_idx_1000: 1067 ptp_offset_init(i, 1000, 1068 offsets->egress_1000, 1069 offsets->ingress_1000); 1070 break; 1071 /* 2.5G */ 1072 case ptp_offset_idx_2500: 1073 ptp_offset_init(i, 2500, 1074 offsets->egress_2500, 1075 offsets->ingress_2500); 1076 break; 1077 /* 5G */ 1078 case ptp_offset_idx_5000: 1079 ptp_offset_init(i, 5000, 1080 offsets->egress_5000, 1081 offsets->ingress_5000); 1082 break; 1083 /* 10G */ 1084 case ptp_offset_idx_10000: 1085 ptp_offset_init(i, 10000, 1086 offsets->egress_10000, 1087 offsets->ingress_10000); 1088 break; 1089 } 1090 } 1091} 1092 1093static void aq_ptp_offset_init(const struct hw_atl_ptp_offset *offsets) 1094{ 1095 memset(ptp_offset, 0, sizeof(ptp_offset)); 1096 1097 aq_ptp_offset_init_from_fw(offsets); 1098} 1099 1100static void aq_ptp_gpio_init(struct ptp_clock_info *info, 1101 struct hw_atl_info *hw_info) 1102{ 1103 struct ptp_pin_desc pin_desc[MAX_PTP_GPIO_COUNT]; 1104 u32 extts_pin_cnt = 0; 1105 u32 out_pin_cnt = 0; 1106 u32 i; 1107 1108 memset(pin_desc, 0, sizeof(pin_desc)); 1109 1110 for (i = 0; i < MAX_PTP_GPIO_COUNT - 1; i++) { 1111 if (hw_info->gpio_pin[i] == 1112 (GPIO_PIN_FUNCTION_PTP0 + out_pin_cnt)) { 1113 snprintf(pin_desc[out_pin_cnt].name, 1114 sizeof(pin_desc[out_pin_cnt].name), 1115 "AQ_GPIO%d", i); 1116 pin_desc[out_pin_cnt].index = out_pin_cnt; 1117 pin_desc[out_pin_cnt].chan = out_pin_cnt; 1118 pin_desc[out_pin_cnt++].func = PTP_PF_PEROUT; 1119 } 1120 } 1121 1122 info->n_per_out = out_pin_cnt; 1123 1124 if (hw_info->caps_ex & BIT(CAPS_EX_PHY_CTRL_TS_PIN)) { 1125 extts_pin_cnt += 1; 1126 1127 snprintf(pin_desc[out_pin_cnt].name, 1128 sizeof(pin_desc[out_pin_cnt].name), 1129 "AQ_GPIO%d", out_pin_cnt); 1130 pin_desc[out_pin_cnt].index = out_pin_cnt; 1131 pin_desc[out_pin_cnt].chan = 0; 1132 pin_desc[out_pin_cnt].func = PTP_PF_EXTTS; 1133 } 1134 1135 info->n_pins = out_pin_cnt + extts_pin_cnt; 1136 info->n_ext_ts = extts_pin_cnt; 1137 1138 if (!info->n_pins) 1139 return; 1140 1141 info->pin_config = kcalloc(info->n_pins, sizeof(struct ptp_pin_desc), 1142 GFP_KERNEL); 1143 1144 if (!info->pin_config) 1145 return; 1146 1147 memcpy(info->pin_config, &pin_desc, 1148 sizeof(struct ptp_pin_desc) * info->n_pins); 1149} 1150 1151void aq_ptp_clock_init(struct aq_nic_s *aq_nic) 1152{ 1153 struct aq_ptp_s *aq_ptp = aq_nic->aq_ptp; 1154 struct timespec64 ts; 1155 1156 ktime_get_real_ts64(&ts); 1157 aq_ptp_settime(&aq_ptp->ptp_info, &ts); 1158} 1159 1160static void aq_ptp_poll_sync_work_cb(struct work_struct *w); 1161 1162int aq_ptp_init(struct aq_nic_s *aq_nic, unsigned int idx_vec) 1163{ 1164 bool a1_ptp = ATL_HW_IS_CHIP_FEATURE(aq_nic->aq_hw, ATLANTIC); 1165 struct hw_atl_utils_mbox mbox; 1166 struct ptp_clock *clock; 1167 struct aq_ptp_s *aq_ptp; 1168 int err = 0; 1169 1170 if (!a1_ptp) { 1171 aq_nic->aq_ptp = NULL; 1172 return 0; 1173 } 1174 1175 if (!aq_nic->aq_hw_ops->hw_get_ptp_ts) { 1176 aq_nic->aq_ptp = NULL; 1177 return 0; 1178 } 1179 1180 if (!aq_nic->aq_fw_ops->enable_ptp) { 1181 aq_nic->aq_ptp = NULL; 1182 return 0; 1183 } 1184 1185 hw_atl_utils_mpi_read_stats(aq_nic->aq_hw, &mbox); 1186 1187 if (!(mbox.info.caps_ex & BIT(CAPS_EX_PHY_PTP_EN))) { 1188 aq_nic->aq_ptp = NULL; 1189 return 0; 1190 } 1191 1192 aq_ptp_offset_init(&mbox.info.ptp_offset); 1193 1194 aq_ptp = kzalloc(sizeof(*aq_ptp), GFP_KERNEL); 1195 if (!aq_ptp) { 1196 err = -ENOMEM; 1197 goto err_exit; 1198 } 1199 1200 aq_ptp->aq_nic = aq_nic; 1201 aq_ptp->a1_ptp = a1_ptp; 1202 1203 spin_lock_init(&aq_ptp->ptp_lock); 1204 spin_lock_init(&aq_ptp->ptp_ring_lock); 1205 1206 aq_ptp->ptp_info = aq_ptp_clock; 1207 aq_ptp_gpio_init(&aq_ptp->ptp_info, &mbox.info); 1208 clock = ptp_clock_register(&aq_ptp->ptp_info, &aq_nic->ndev->dev); 1209 if (IS_ERR(clock)) { 1210 netdev_err(aq_nic->ndev, "ptp_clock_register failed\n"); 1211 err = PTR_ERR(clock); 1212 goto err_exit; 1213 } 1214 aq_ptp->ptp_clock = clock; 1215 aq_ptp_tx_timeout_init(&aq_ptp->ptp_tx_timeout); 1216 1217 atomic_set(&aq_ptp->offset_egress, 0); 1218 atomic_set(&aq_ptp->offset_ingress, 0); 1219 1220 netif_napi_add(aq_nic_get_ndev(aq_nic), &aq_ptp->napi, 1221 aq_ptp_poll, NAPI_POLL_WEIGHT); 1222 1223 aq_ptp->idx_vector = idx_vec; 1224 1225 aq_nic->aq_ptp = aq_ptp; 1226 1227 /* enable ptp counter */ 1228 aq_utils_obj_set(&aq_nic->aq_hw->flags, AQ_HW_PTP_AVAILABLE); 1229 mutex_lock(&aq_nic->fwreq_mutex); 1230 aq_nic->aq_fw_ops->enable_ptp(aq_nic->aq_hw, 1); 1231 aq_ptp_clock_init(aq_nic); 1232 mutex_unlock(&aq_nic->fwreq_mutex); 1233 1234 INIT_DELAYED_WORK(&aq_ptp->poll_sync, &aq_ptp_poll_sync_work_cb); 1235 aq_ptp->eth_type_filter.location = 1236 aq_nic_reserve_filter(aq_nic, aq_rx_filter_ethertype); 1237 aq_ptp->udp_filter.location = 1238 aq_nic_reserve_filter(aq_nic, aq_rx_filter_l3l4); 1239 1240 return 0; 1241 1242err_exit: 1243 if (aq_ptp) 1244 kfree(aq_ptp->ptp_info.pin_config); 1245 kfree(aq_ptp); 1246 aq_nic->aq_ptp = NULL; 1247 return err; 1248} 1249 1250void aq_ptp_unregister(struct aq_nic_s *aq_nic) 1251{ 1252 struct aq_ptp_s *aq_ptp = aq_nic->aq_ptp; 1253 1254 if (!aq_ptp) 1255 return; 1256 1257 ptp_clock_unregister(aq_ptp->ptp_clock); 1258} 1259 1260void aq_ptp_free(struct aq_nic_s *aq_nic) 1261{ 1262 struct aq_ptp_s *aq_ptp = aq_nic->aq_ptp; 1263 1264 if (!aq_ptp) 1265 return; 1266 1267 aq_nic_release_filter(aq_nic, aq_rx_filter_ethertype, 1268 aq_ptp->eth_type_filter.location); 1269 aq_nic_release_filter(aq_nic, aq_rx_filter_l3l4, 1270 aq_ptp->udp_filter.location); 1271 cancel_delayed_work_sync(&aq_ptp->poll_sync); 1272 /* disable ptp */ 1273 mutex_lock(&aq_nic->fwreq_mutex); 1274 aq_nic->aq_fw_ops->enable_ptp(aq_nic->aq_hw, 0); 1275 mutex_unlock(&aq_nic->fwreq_mutex); 1276 1277 kfree(aq_ptp->ptp_info.pin_config); 1278 1279 netif_napi_del(&aq_ptp->napi); 1280 kfree(aq_ptp); 1281 aq_nic->aq_ptp = NULL; 1282} 1283 1284struct ptp_clock *aq_ptp_get_ptp_clock(struct aq_ptp_s *aq_ptp) 1285{ 1286 return aq_ptp->ptp_clock; 1287} 1288 1289/* PTP external GPIO nanoseconds count */ 1290static uint64_t aq_ptp_get_sync1588_ts(struct aq_nic_s *aq_nic) 1291{ 1292 u64 ts = 0; 1293 1294 if (aq_nic->aq_hw_ops->hw_get_sync_ts) 1295 aq_nic->aq_hw_ops->hw_get_sync_ts(aq_nic->aq_hw, &ts); 1296 1297 return ts; 1298} 1299 1300static void aq_ptp_start_work(struct aq_ptp_s *aq_ptp) 1301{ 1302 if (aq_ptp->extts_pin_enabled) { 1303 aq_ptp->poll_timeout_ms = POLL_SYNC_TIMER_MS; 1304 aq_ptp->last_sync1588_ts = 1305 aq_ptp_get_sync1588_ts(aq_ptp->aq_nic); 1306 schedule_delayed_work(&aq_ptp->poll_sync, 1307 msecs_to_jiffies(aq_ptp->poll_timeout_ms)); 1308 } 1309} 1310 1311int aq_ptp_link_change(struct aq_nic_s *aq_nic) 1312{ 1313 struct aq_ptp_s *aq_ptp = aq_nic->aq_ptp; 1314 1315 if (!aq_ptp) 1316 return 0; 1317 1318 if (aq_nic->aq_hw->aq_link_status.mbps) 1319 aq_ptp_start_work(aq_ptp); 1320 else 1321 cancel_delayed_work_sync(&aq_ptp->poll_sync); 1322 1323 return 0; 1324} 1325 1326static bool aq_ptp_sync_ts_updated(struct aq_ptp_s *aq_ptp, u64 *new_ts) 1327{ 1328 struct aq_nic_s *aq_nic = aq_ptp->aq_nic; 1329 u64 sync_ts2; 1330 u64 sync_ts; 1331 1332 sync_ts = aq_ptp_get_sync1588_ts(aq_nic); 1333 1334 if (sync_ts != aq_ptp->last_sync1588_ts) { 1335 sync_ts2 = aq_ptp_get_sync1588_ts(aq_nic); 1336 if (sync_ts != sync_ts2) { 1337 sync_ts = sync_ts2; 1338 sync_ts2 = aq_ptp_get_sync1588_ts(aq_nic); 1339 if (sync_ts != sync_ts2) { 1340 netdev_err(aq_nic->ndev, 1341 "%s: Unable to get correct GPIO TS", 1342 __func__); 1343 sync_ts = 0; 1344 } 1345 } 1346 1347 *new_ts = sync_ts; 1348 return true; 1349 } 1350 return false; 1351} 1352 1353static int aq_ptp_check_sync1588(struct aq_ptp_s *aq_ptp) 1354{ 1355 struct aq_nic_s *aq_nic = aq_ptp->aq_nic; 1356 u64 sync_ts; 1357 1358 /* Sync1588 pin was triggered */ 1359 if (aq_ptp_sync_ts_updated(aq_ptp, &sync_ts)) { 1360 if (aq_ptp->extts_pin_enabled) { 1361 struct ptp_clock_event ptp_event; 1362 u64 time = 0; 1363 1364 aq_nic->aq_hw_ops->hw_ts_to_sys_clock(aq_nic->aq_hw, 1365 sync_ts, &time); 1366 ptp_event.index = aq_ptp->ptp_info.n_pins - 1; 1367 ptp_event.timestamp = time; 1368 1369 ptp_event.type = PTP_CLOCK_EXTTS; 1370 ptp_clock_event(aq_ptp->ptp_clock, &ptp_event); 1371 } 1372 1373 aq_ptp->last_sync1588_ts = sync_ts; 1374 } 1375 1376 return 0; 1377} 1378 1379static void aq_ptp_poll_sync_work_cb(struct work_struct *w) 1380{ 1381 struct delayed_work *dw = to_delayed_work(w); 1382 struct aq_ptp_s *aq_ptp = container_of(dw, struct aq_ptp_s, poll_sync); 1383 1384 aq_ptp_check_sync1588(aq_ptp); 1385 1386 if (aq_ptp->extts_pin_enabled) { 1387 unsigned long timeout = msecs_to_jiffies(aq_ptp->poll_timeout_ms); 1388 1389 schedule_delayed_work(&aq_ptp->poll_sync, timeout); 1390 } 1391} 1392 1393int aq_ptp_get_ring_cnt(struct aq_nic_s *aq_nic, const enum atl_ring_type ring_type) 1394{ 1395 if (!aq_nic->aq_ptp) 1396 return 0; 1397 1398 /* Additional RX ring is allocated for PTP HWTS on A1 */ 1399 return (aq_nic->aq_ptp->a1_ptp && ring_type == ATL_RING_RX) ? 2 : 1; 1400} 1401 1402u64 *aq_ptp_get_stats(struct aq_nic_s *aq_nic, u64 *data) 1403{ 1404 struct aq_ptp_s *aq_ptp = aq_nic->aq_ptp; 1405 unsigned int count = 0U; 1406 1407 if (!aq_ptp) 1408 return data; 1409 1410 count = aq_ring_fill_stats_data(&aq_ptp->ptp_rx, data); 1411 data += count; 1412 count = aq_ring_fill_stats_data(&aq_ptp->ptp_tx, data); 1413 data += count; 1414 1415 if (aq_ptp->a1_ptp) { 1416 /* Only Receive ring for HWTS */ 1417 count = aq_ring_fill_stats_data(&aq_ptp->hwts_rx, data); 1418 data += count; 1419 } 1420 1421 return data; 1422} 1423 1424#endif