linux/drivers/net/ethernet/microchip/lan743x_ptp.c
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0+ */
   2/* Copyright (C) 2018 Microchip Technology Inc. */
   3
   4#include <linux/netdevice.h>
   5
   6#include <linux/ptp_clock_kernel.h>
   7#include <linux/module.h>
   8#include <linux/pci.h>
   9#include <linux/net_tstamp.h>
  10#include "lan743x_main.h"
  11
  12#include "lan743x_ptp.h"
  13
  14#define LAN743X_LED0_ENABLE             20      /* LED0 offset in HW_CFG */
  15#define LAN743X_LED_ENABLE(pin)         BIT(LAN743X_LED0_ENABLE + (pin))
  16
  17#define LAN743X_PTP_MAX_FREQ_ADJ_IN_PPB         (31249999)
  18#define LAN743X_PTP_MAX_FINE_ADJ_IN_SCALED_PPM  (2047999934)
  19
  20static bool lan743x_ptp_is_enabled(struct lan743x_adapter *adapter);
  21static void lan743x_ptp_enable(struct lan743x_adapter *adapter);
  22static void lan743x_ptp_disable(struct lan743x_adapter *adapter);
  23static void lan743x_ptp_reset(struct lan743x_adapter *adapter);
  24static void lan743x_ptp_clock_set(struct lan743x_adapter *adapter,
  25                                  u32 seconds, u32 nano_seconds,
  26                                  u32 sub_nano_seconds);
  27
  28int lan743x_gpio_init(struct lan743x_adapter *adapter)
  29{
  30        struct lan743x_gpio *gpio = &adapter->gpio;
  31
  32        spin_lock_init(&gpio->gpio_lock);
  33
  34        gpio->gpio_cfg0 = 0; /* set all direction to input, data = 0 */
  35        gpio->gpio_cfg1 = 0x0FFF0000;/* disable all gpio, set to open drain */
  36        gpio->gpio_cfg2 = 0;/* set all to 1588 low polarity level */
  37        gpio->gpio_cfg3 = 0;/* disable all 1588 output */
  38        lan743x_csr_write(adapter, GPIO_CFG0, gpio->gpio_cfg0);
  39        lan743x_csr_write(adapter, GPIO_CFG1, gpio->gpio_cfg1);
  40        lan743x_csr_write(adapter, GPIO_CFG2, gpio->gpio_cfg2);
  41        lan743x_csr_write(adapter, GPIO_CFG3, gpio->gpio_cfg3);
  42
  43        return 0;
  44}
  45
  46static void lan743x_ptp_wait_till_cmd_done(struct lan743x_adapter *adapter,
  47                                           u32 bit_mask)
  48{
  49        int timeout = 1000;
  50        u32 data = 0;
  51
  52        while (timeout &&
  53               (data = (lan743x_csr_read(adapter, PTP_CMD_CTL) &
  54               bit_mask))) {
  55                usleep_range(1000, 20000);
  56                timeout--;
  57        }
  58        if (data) {
  59                netif_err(adapter, drv, adapter->netdev,
  60                          "timeout waiting for cmd to be done, cmd = 0x%08X\n",
  61                          bit_mask);
  62        }
  63}
  64
  65static void lan743x_ptp_tx_ts_enqueue_ts(struct lan743x_adapter *adapter,
  66                                         u32 seconds, u32 nano_seconds,
  67                                         u32 header)
  68{
  69        struct lan743x_ptp *ptp = &adapter->ptp;
  70
  71        spin_lock_bh(&ptp->tx_ts_lock);
  72        if (ptp->tx_ts_queue_size < LAN743X_PTP_NUMBER_OF_TX_TIMESTAMPS) {
  73                ptp->tx_ts_seconds_queue[ptp->tx_ts_queue_size] = seconds;
  74                ptp->tx_ts_nseconds_queue[ptp->tx_ts_queue_size] = nano_seconds;
  75                ptp->tx_ts_header_queue[ptp->tx_ts_queue_size] = header;
  76                ptp->tx_ts_queue_size++;
  77        } else {
  78                netif_err(adapter, drv, adapter->netdev,
  79                          "tx ts queue overflow\n");
  80        }
  81        spin_unlock_bh(&ptp->tx_ts_lock);
  82}
  83
  84static void lan743x_ptp_tx_ts_complete(struct lan743x_adapter *adapter)
  85{
  86        struct lan743x_ptp *ptp = &adapter->ptp;
  87        struct skb_shared_hwtstamps tstamps;
  88        u32 header, nseconds, seconds;
  89        bool ignore_sync = false;
  90        struct sk_buff *skb;
  91        int c, i;
  92
  93        spin_lock_bh(&ptp->tx_ts_lock);
  94        c = ptp->tx_ts_skb_queue_size;
  95
  96        if (c > ptp->tx_ts_queue_size)
  97                c = ptp->tx_ts_queue_size;
  98        if (c <= 0)
  99                goto done;
 100
 101        for (i = 0; i < c; i++) {
 102                ignore_sync = ((ptp->tx_ts_ignore_sync_queue &
 103                                BIT(i)) != 0);
 104                skb = ptp->tx_ts_skb_queue[i];
 105                nseconds = ptp->tx_ts_nseconds_queue[i];
 106                seconds = ptp->tx_ts_seconds_queue[i];
 107                header = ptp->tx_ts_header_queue[i];
 108
 109                memset(&tstamps, 0, sizeof(tstamps));
 110                tstamps.hwtstamp = ktime_set(seconds, nseconds);
 111                if (!ignore_sync ||
 112                    ((header & PTP_TX_MSG_HEADER_MSG_TYPE_) !=
 113                    PTP_TX_MSG_HEADER_MSG_TYPE_SYNC_))
 114                        skb_tstamp_tx(skb, &tstamps);
 115
 116                dev_kfree_skb(skb);
 117
 118                ptp->tx_ts_skb_queue[i] = NULL;
 119                ptp->tx_ts_seconds_queue[i] = 0;
 120                ptp->tx_ts_nseconds_queue[i] = 0;
 121                ptp->tx_ts_header_queue[i] = 0;
 122        }
 123
 124        /* shift queue */
 125        ptp->tx_ts_ignore_sync_queue >>= c;
 126        for (i = c; i < LAN743X_PTP_NUMBER_OF_TX_TIMESTAMPS; i++) {
 127                ptp->tx_ts_skb_queue[i - c] = ptp->tx_ts_skb_queue[i];
 128                ptp->tx_ts_seconds_queue[i - c] = ptp->tx_ts_seconds_queue[i];
 129                ptp->tx_ts_nseconds_queue[i - c] = ptp->tx_ts_nseconds_queue[i];
 130                ptp->tx_ts_header_queue[i - c] = ptp->tx_ts_header_queue[i];
 131
 132                ptp->tx_ts_skb_queue[i] = NULL;
 133                ptp->tx_ts_seconds_queue[i] = 0;
 134                ptp->tx_ts_nseconds_queue[i] = 0;
 135                ptp->tx_ts_header_queue[i] = 0;
 136        }
 137        ptp->tx_ts_skb_queue_size -= c;
 138        ptp->tx_ts_queue_size -= c;
 139done:
 140        ptp->pending_tx_timestamps -= c;
 141        spin_unlock_bh(&ptp->tx_ts_lock);
 142}
 143
 144static int lan743x_ptp_reserve_event_ch(struct lan743x_adapter *adapter,
 145                                        int event_channel)
 146{
 147        struct lan743x_ptp *ptp = &adapter->ptp;
 148        int result = -ENODEV;
 149
 150        mutex_lock(&ptp->command_lock);
 151        if (!(test_bit(event_channel, &ptp->used_event_ch))) {
 152                ptp->used_event_ch |= BIT(event_channel);
 153                result = event_channel;
 154        } else {
 155                netif_warn(adapter, drv, adapter->netdev,
 156                           "attempted to reserved a used event_channel = %d\n",
 157                           event_channel);
 158        }
 159        mutex_unlock(&ptp->command_lock);
 160        return result;
 161}
 162
 163static void lan743x_ptp_release_event_ch(struct lan743x_adapter *adapter,
 164                                         int event_channel)
 165{
 166        struct lan743x_ptp *ptp = &adapter->ptp;
 167
 168        mutex_lock(&ptp->command_lock);
 169        if (test_bit(event_channel, &ptp->used_event_ch)) {
 170                ptp->used_event_ch &= ~BIT(event_channel);
 171        } else {
 172                netif_warn(adapter, drv, adapter->netdev,
 173                           "attempted release on a not used event_channel = %d\n",
 174                           event_channel);
 175        }
 176        mutex_unlock(&ptp->command_lock);
 177}
 178
 179static void lan743x_ptp_clock_get(struct lan743x_adapter *adapter,
 180                                  u32 *seconds, u32 *nano_seconds,
 181                                  u32 *sub_nano_seconds);
 182static void lan743x_ptp_clock_step(struct lan743x_adapter *adapter,
 183                                   s64 time_step_ns);
 184
 185static void lan743x_led_mux_enable(struct lan743x_adapter *adapter,
 186                                   int pin, bool enable)
 187{
 188        struct lan743x_ptp *ptp = &adapter->ptp;
 189
 190        if (ptp->leds_multiplexed &&
 191            ptp->led_enabled[pin]) {
 192                u32 val = lan743x_csr_read(adapter, HW_CFG);
 193
 194                if (enable)
 195                        val |= LAN743X_LED_ENABLE(pin);
 196                else
 197                        val &= ~LAN743X_LED_ENABLE(pin);
 198
 199                lan743x_csr_write(adapter, HW_CFG, val);
 200        }
 201}
 202
 203static void lan743x_led_mux_save(struct lan743x_adapter *adapter)
 204{
 205        struct lan743x_ptp *ptp = &adapter->ptp;
 206        u32 id_rev = adapter->csr.id_rev & ID_REV_ID_MASK_;
 207
 208        if (id_rev == ID_REV_ID_LAN7430_) {
 209                int i;
 210                u32 val = lan743x_csr_read(adapter, HW_CFG);
 211
 212                for (i = 0; i < LAN7430_N_LED; i++) {
 213                        bool led_enabled = (val & LAN743X_LED_ENABLE(i)) != 0;
 214
 215                        ptp->led_enabled[i] = led_enabled;
 216                }
 217                ptp->leds_multiplexed = true;
 218        } else {
 219                ptp->leds_multiplexed = false;
 220        }
 221}
 222
 223static void lan743x_led_mux_restore(struct lan743x_adapter *adapter)
 224{
 225        u32 id_rev = adapter->csr.id_rev & ID_REV_ID_MASK_;
 226
 227        if (id_rev == ID_REV_ID_LAN7430_) {
 228                int i;
 229
 230                for (i = 0; i < LAN7430_N_LED; i++)
 231                        lan743x_led_mux_enable(adapter, i, true);
 232        }
 233}
 234
 235static int lan743x_gpio_rsrv_ptp_out(struct lan743x_adapter *adapter,
 236                                     int pin, int event_channel)
 237{
 238        struct lan743x_gpio *gpio = &adapter->gpio;
 239        unsigned long irq_flags = 0;
 240        int bit_mask = BIT(pin);
 241        int ret = -EBUSY;
 242
 243        spin_lock_irqsave(&gpio->gpio_lock, irq_flags);
 244
 245        if (!(gpio->used_bits & bit_mask)) {
 246                gpio->used_bits |= bit_mask;
 247                gpio->output_bits |= bit_mask;
 248                gpio->ptp_bits |= bit_mask;
 249
 250                /* assign pin to GPIO function */
 251                lan743x_led_mux_enable(adapter, pin, false);
 252
 253                /* set as output, and zero initial value */
 254                gpio->gpio_cfg0 |= GPIO_CFG0_GPIO_DIR_BIT_(pin);
 255                gpio->gpio_cfg0 &= ~GPIO_CFG0_GPIO_DATA_BIT_(pin);
 256                lan743x_csr_write(adapter, GPIO_CFG0, gpio->gpio_cfg0);
 257
 258                /* enable gpio, and set buffer type to push pull */
 259                gpio->gpio_cfg1 &= ~GPIO_CFG1_GPIOEN_BIT_(pin);
 260                gpio->gpio_cfg1 |= GPIO_CFG1_GPIOBUF_BIT_(pin);
 261                lan743x_csr_write(adapter, GPIO_CFG1, gpio->gpio_cfg1);
 262
 263                /* set 1588 polarity to high */
 264                gpio->gpio_cfg2 |= GPIO_CFG2_1588_POL_BIT_(pin);
 265                lan743x_csr_write(adapter, GPIO_CFG2, gpio->gpio_cfg2);
 266
 267                if (event_channel == 0) {
 268                        /* use channel A */
 269                        gpio->gpio_cfg3 &= ~GPIO_CFG3_1588_CH_SEL_BIT_(pin);
 270                } else {
 271                        /* use channel B */
 272                        gpio->gpio_cfg3 |= GPIO_CFG3_1588_CH_SEL_BIT_(pin);
 273                }
 274                gpio->gpio_cfg3 |= GPIO_CFG3_1588_OE_BIT_(pin);
 275                lan743x_csr_write(adapter, GPIO_CFG3, gpio->gpio_cfg3);
 276
 277                ret = pin;
 278        }
 279        spin_unlock_irqrestore(&gpio->gpio_lock, irq_flags);
 280        return ret;
 281}
 282
 283static void lan743x_gpio_release(struct lan743x_adapter *adapter, int pin)
 284{
 285        struct lan743x_gpio *gpio = &adapter->gpio;
 286        unsigned long irq_flags = 0;
 287        int bit_mask = BIT(pin);
 288
 289        spin_lock_irqsave(&gpio->gpio_lock, irq_flags);
 290        if (gpio->used_bits & bit_mask) {
 291                gpio->used_bits &= ~bit_mask;
 292                if (gpio->output_bits & bit_mask) {
 293                        gpio->output_bits &= ~bit_mask;
 294
 295                        if (gpio->ptp_bits & bit_mask) {
 296                                gpio->ptp_bits &= ~bit_mask;
 297                                /* disable ptp output */
 298                                gpio->gpio_cfg3 &= ~GPIO_CFG3_1588_OE_BIT_(pin);
 299                                lan743x_csr_write(adapter, GPIO_CFG3,
 300                                                  gpio->gpio_cfg3);
 301                        }
 302                        /* release gpio output */
 303
 304                        /* disable gpio */
 305                        gpio->gpio_cfg1 |= GPIO_CFG1_GPIOEN_BIT_(pin);
 306                        gpio->gpio_cfg1 &= ~GPIO_CFG1_GPIOBUF_BIT_(pin);
 307                        lan743x_csr_write(adapter, GPIO_CFG1, gpio->gpio_cfg1);
 308
 309                        /* reset back to input */
 310                        gpio->gpio_cfg0 &= ~GPIO_CFG0_GPIO_DIR_BIT_(pin);
 311                        gpio->gpio_cfg0 &= ~GPIO_CFG0_GPIO_DATA_BIT_(pin);
 312                        lan743x_csr_write(adapter, GPIO_CFG0, gpio->gpio_cfg0);
 313
 314                        /* assign pin to original function */
 315                        lan743x_led_mux_enable(adapter, pin, true);
 316                }
 317        }
 318        spin_unlock_irqrestore(&gpio->gpio_lock, irq_flags);
 319}
 320
 321static int lan743x_ptpci_adjfine(struct ptp_clock_info *ptpci, long scaled_ppm)
 322{
 323        struct lan743x_ptp *ptp =
 324                container_of(ptpci, struct lan743x_ptp, ptp_clock_info);
 325        struct lan743x_adapter *adapter =
 326                container_of(ptp, struct lan743x_adapter, ptp);
 327        u32 lan743x_rate_adj = 0;
 328        bool positive = true;
 329        u64 u64_delta = 0;
 330
 331        if ((scaled_ppm < (-LAN743X_PTP_MAX_FINE_ADJ_IN_SCALED_PPM)) ||
 332            scaled_ppm > LAN743X_PTP_MAX_FINE_ADJ_IN_SCALED_PPM) {
 333                return -EINVAL;
 334        }
 335        if (scaled_ppm > 0) {
 336                u64_delta = (u64)scaled_ppm;
 337                positive = true;
 338        } else {
 339                u64_delta = (u64)(-scaled_ppm);
 340                positive = false;
 341        }
 342        u64_delta = (u64_delta << 19);
 343        lan743x_rate_adj = div_u64(u64_delta, 1000000);
 344
 345        if (positive)
 346                lan743x_rate_adj |= PTP_CLOCK_RATE_ADJ_DIR_;
 347
 348        lan743x_csr_write(adapter, PTP_CLOCK_RATE_ADJ,
 349                          lan743x_rate_adj);
 350
 351        return 0;
 352}
 353
 354static int lan743x_ptpci_adjfreq(struct ptp_clock_info *ptpci, s32 delta_ppb)
 355{
 356        struct lan743x_ptp *ptp =
 357                container_of(ptpci, struct lan743x_ptp, ptp_clock_info);
 358        struct lan743x_adapter *adapter =
 359                container_of(ptp, struct lan743x_adapter, ptp);
 360        u32 lan743x_rate_adj = 0;
 361        bool positive = true;
 362        u32 u32_delta = 0;
 363        u64 u64_delta = 0;
 364
 365        if ((delta_ppb < (-LAN743X_PTP_MAX_FREQ_ADJ_IN_PPB)) ||
 366            delta_ppb > LAN743X_PTP_MAX_FREQ_ADJ_IN_PPB) {
 367                return -EINVAL;
 368        }
 369        if (delta_ppb > 0) {
 370                u32_delta = (u32)delta_ppb;
 371                positive = true;
 372        } else {
 373                u32_delta = (u32)(-delta_ppb);
 374                positive = false;
 375        }
 376        u64_delta = (((u64)u32_delta) << 35);
 377        lan743x_rate_adj = div_u64(u64_delta, 1000000000);
 378
 379        if (positive)
 380                lan743x_rate_adj |= PTP_CLOCK_RATE_ADJ_DIR_;
 381
 382        lan743x_csr_write(adapter, PTP_CLOCK_RATE_ADJ,
 383                          lan743x_rate_adj);
 384
 385        return 0;
 386}
 387
 388static int lan743x_ptpci_adjtime(struct ptp_clock_info *ptpci, s64 delta)
 389{
 390        struct lan743x_ptp *ptp =
 391                container_of(ptpci, struct lan743x_ptp, ptp_clock_info);
 392        struct lan743x_adapter *adapter =
 393                container_of(ptp, struct lan743x_adapter, ptp);
 394
 395        lan743x_ptp_clock_step(adapter, delta);
 396
 397        return 0;
 398}
 399
 400static int lan743x_ptpci_gettime64(struct ptp_clock_info *ptpci,
 401                                   struct timespec64 *ts)
 402{
 403        struct lan743x_ptp *ptp =
 404                container_of(ptpci, struct lan743x_ptp, ptp_clock_info);
 405        struct lan743x_adapter *adapter =
 406                container_of(ptp, struct lan743x_adapter, ptp);
 407        u32 nano_seconds = 0;
 408        u32 seconds = 0;
 409
 410        lan743x_ptp_clock_get(adapter, &seconds, &nano_seconds, NULL);
 411        ts->tv_sec = seconds;
 412        ts->tv_nsec = nano_seconds;
 413
 414        return 0;
 415}
 416
 417static int lan743x_ptpci_settime64(struct ptp_clock_info *ptpci,
 418                                   const struct timespec64 *ts)
 419{
 420        struct lan743x_ptp *ptp =
 421                container_of(ptpci, struct lan743x_ptp, ptp_clock_info);
 422        struct lan743x_adapter *adapter =
 423                container_of(ptp, struct lan743x_adapter, ptp);
 424        u32 nano_seconds = 0;
 425        u32 seconds = 0;
 426
 427        if (ts) {
 428                if (ts->tv_sec > 0xFFFFFFFFLL ||
 429                    ts->tv_sec < 0) {
 430                        netif_warn(adapter, drv, adapter->netdev,
 431                                   "ts->tv_sec out of range, %lld\n",
 432                                   ts->tv_sec);
 433                        return -ERANGE;
 434                }
 435                if (ts->tv_nsec >= 1000000000L ||
 436                    ts->tv_nsec < 0) {
 437                        netif_warn(adapter, drv, adapter->netdev,
 438                                   "ts->tv_nsec out of range, %ld\n",
 439                                   ts->tv_nsec);
 440                        return -ERANGE;
 441                }
 442                seconds = ts->tv_sec;
 443                nano_seconds = ts->tv_nsec;
 444                lan743x_ptp_clock_set(adapter, seconds, nano_seconds, 0);
 445        } else {
 446                netif_warn(adapter, drv, adapter->netdev, "ts == NULL\n");
 447                return -EINVAL;
 448        }
 449
 450        return 0;
 451}
 452
 453static void lan743x_ptp_perout_off(struct lan743x_adapter *adapter,
 454                                   unsigned int index)
 455{
 456        struct lan743x_ptp *ptp = &adapter->ptp;
 457        u32 general_config = 0;
 458        struct lan743x_ptp_perout *perout = &ptp->perout[index];
 459
 460        if (perout->gpio_pin >= 0) {
 461                lan743x_gpio_release(adapter, perout->gpio_pin);
 462                perout->gpio_pin = -1;
 463        }
 464
 465        if (perout->event_ch >= 0) {
 466                /* set target to far in the future, effectively disabling it */
 467                lan743x_csr_write(adapter,
 468                                  PTP_CLOCK_TARGET_SEC_X(perout->event_ch),
 469                                  0xFFFF0000);
 470                lan743x_csr_write(adapter,
 471                                  PTP_CLOCK_TARGET_NS_X(perout->event_ch),
 472                                  0);
 473
 474                general_config = lan743x_csr_read(adapter, PTP_GENERAL_CONFIG);
 475                general_config |= PTP_GENERAL_CONFIG_RELOAD_ADD_X_
 476                                  (perout->event_ch);
 477                lan743x_csr_write(adapter, PTP_GENERAL_CONFIG, general_config);
 478                lan743x_ptp_release_event_ch(adapter, perout->event_ch);
 479                perout->event_ch = -1;
 480        }
 481}
 482
 483static int lan743x_ptp_perout(struct lan743x_adapter *adapter, int on,
 484                              struct ptp_perout_request *perout_request)
 485{
 486        struct lan743x_ptp *ptp = &adapter->ptp;
 487        u32 period_sec = 0, period_nsec = 0;
 488        u32 start_sec = 0, start_nsec = 0;
 489        u32 general_config = 0;
 490        int pulse_width = 0;
 491        int perout_pin = 0;
 492        unsigned int index = perout_request->index;
 493        struct lan743x_ptp_perout *perout = &ptp->perout[index];
 494
 495        /* Reject requests with unsupported flags */
 496        if (perout_request->flags)
 497                return -EOPNOTSUPP;
 498
 499        if (on) {
 500                perout_pin = ptp_find_pin(ptp->ptp_clock, PTP_PF_PEROUT,
 501                                          perout_request->index);
 502                if (perout_pin < 0)
 503                        return -EBUSY;
 504        } else {
 505                lan743x_ptp_perout_off(adapter, index);
 506                return 0;
 507        }
 508
 509        if (perout->event_ch >= 0 ||
 510            perout->gpio_pin >= 0) {
 511                /* already on, turn off first */
 512                lan743x_ptp_perout_off(adapter, index);
 513        }
 514
 515        perout->event_ch = lan743x_ptp_reserve_event_ch(adapter, index);
 516
 517        if (perout->event_ch < 0) {
 518                netif_warn(adapter, drv, adapter->netdev,
 519                           "Failed to reserve event channel %d for PEROUT\n",
 520                           index);
 521                goto failed;
 522        }
 523
 524        perout->gpio_pin = lan743x_gpio_rsrv_ptp_out(adapter,
 525                                                     perout_pin,
 526                                                     perout->event_ch);
 527
 528        if (perout->gpio_pin < 0) {
 529                netif_warn(adapter, drv, adapter->netdev,
 530                           "Failed to reserve gpio %d for PEROUT\n",
 531                           perout_pin);
 532                goto failed;
 533        }
 534
 535        start_sec = perout_request->start.sec;
 536        start_sec += perout_request->start.nsec / 1000000000;
 537        start_nsec = perout_request->start.nsec % 1000000000;
 538
 539        period_sec = perout_request->period.sec;
 540        period_sec += perout_request->period.nsec / 1000000000;
 541        period_nsec = perout_request->period.nsec % 1000000000;
 542
 543        if (period_sec == 0) {
 544                if (period_nsec >= 400000000) {
 545                        pulse_width = PTP_GENERAL_CONFIG_CLOCK_EVENT_200MS_;
 546                } else if (period_nsec >= 20000000) {
 547                        pulse_width = PTP_GENERAL_CONFIG_CLOCK_EVENT_10MS_;
 548                } else if (period_nsec >= 2000000) {
 549                        pulse_width = PTP_GENERAL_CONFIG_CLOCK_EVENT_1MS_;
 550                } else if (period_nsec >= 200000) {
 551                        pulse_width = PTP_GENERAL_CONFIG_CLOCK_EVENT_100US_;
 552                } else if (period_nsec >= 20000) {
 553                        pulse_width = PTP_GENERAL_CONFIG_CLOCK_EVENT_10US_;
 554                } else if (period_nsec >= 200) {
 555                        pulse_width = PTP_GENERAL_CONFIG_CLOCK_EVENT_100NS_;
 556                } else {
 557                        netif_warn(adapter, drv, adapter->netdev,
 558                                   "perout period too small, minimum is 200nS\n");
 559                        goto failed;
 560                }
 561        } else {
 562                pulse_width = PTP_GENERAL_CONFIG_CLOCK_EVENT_200MS_;
 563        }
 564
 565        /* turn off by setting target far in future */
 566        lan743x_csr_write(adapter,
 567                          PTP_CLOCK_TARGET_SEC_X(perout->event_ch),
 568                          0xFFFF0000);
 569        lan743x_csr_write(adapter,
 570                          PTP_CLOCK_TARGET_NS_X(perout->event_ch), 0);
 571
 572        /* Configure to pulse every period */
 573        general_config = lan743x_csr_read(adapter, PTP_GENERAL_CONFIG);
 574        general_config &= ~(PTP_GENERAL_CONFIG_CLOCK_EVENT_X_MASK_
 575                          (perout->event_ch));
 576        general_config |= PTP_GENERAL_CONFIG_CLOCK_EVENT_X_SET_
 577                          (perout->event_ch, pulse_width);
 578        general_config &= ~PTP_GENERAL_CONFIG_RELOAD_ADD_X_
 579                          (perout->event_ch);
 580        lan743x_csr_write(adapter, PTP_GENERAL_CONFIG, general_config);
 581
 582        /* set the reload to one toggle cycle */
 583        lan743x_csr_write(adapter,
 584                          PTP_CLOCK_TARGET_RELOAD_SEC_X(perout->event_ch),
 585                          period_sec);
 586        lan743x_csr_write(adapter,
 587                          PTP_CLOCK_TARGET_RELOAD_NS_X(perout->event_ch),
 588                          period_nsec);
 589
 590        /* set the start time */
 591        lan743x_csr_write(adapter,
 592                          PTP_CLOCK_TARGET_SEC_X(perout->event_ch),
 593                          start_sec);
 594        lan743x_csr_write(adapter,
 595                          PTP_CLOCK_TARGET_NS_X(perout->event_ch),
 596                          start_nsec);
 597
 598        return 0;
 599
 600failed:
 601        lan743x_ptp_perout_off(adapter, index);
 602        return -ENODEV;
 603}
 604
 605static int lan743x_ptpci_enable(struct ptp_clock_info *ptpci,
 606                                struct ptp_clock_request *request, int on)
 607{
 608        struct lan743x_ptp *ptp =
 609                container_of(ptpci, struct lan743x_ptp, ptp_clock_info);
 610        struct lan743x_adapter *adapter =
 611                container_of(ptp, struct lan743x_adapter, ptp);
 612
 613        if (request) {
 614                switch (request->type) {
 615                case PTP_CLK_REQ_EXTTS:
 616                        return -EINVAL;
 617                case PTP_CLK_REQ_PEROUT:
 618                        if (request->perout.index < ptpci->n_per_out)
 619                                return lan743x_ptp_perout(adapter, on,
 620                                                          &request->perout);
 621                        return -EINVAL;
 622                case PTP_CLK_REQ_PPS:
 623                        return -EINVAL;
 624                default:
 625                        netif_err(adapter, drv, adapter->netdev,
 626                                  "request->type == %d, Unknown\n",
 627                                  request->type);
 628                        break;
 629                }
 630        } else {
 631                netif_err(adapter, drv, adapter->netdev, "request == NULL\n");
 632        }
 633        return 0;
 634}
 635
 636static int lan743x_ptpci_verify_pin_config(struct ptp_clock_info *ptp,
 637                                           unsigned int pin,
 638                                           enum ptp_pin_function func,
 639                                           unsigned int chan)
 640{
 641        int result = 0;
 642
 643        /* Confirm the requested function is supported. Parameter
 644         * validation is done by the caller.
 645         */
 646        switch (func) {
 647        case PTP_PF_NONE:
 648        case PTP_PF_PEROUT:
 649                break;
 650        case PTP_PF_EXTTS:
 651        case PTP_PF_PHYSYNC:
 652        default:
 653                result = -1;
 654                break;
 655        }
 656        return result;
 657}
 658
 659static long lan743x_ptpci_do_aux_work(struct ptp_clock_info *ptpci)
 660{
 661        struct lan743x_ptp *ptp =
 662                container_of(ptpci, struct lan743x_ptp, ptp_clock_info);
 663        struct lan743x_adapter *adapter =
 664                container_of(ptp, struct lan743x_adapter, ptp);
 665        u32 cap_info, cause, header, nsec, seconds;
 666        bool new_timestamp_available = false;
 667        int count = 0;
 668
 669        while ((count < 100) &&
 670               (lan743x_csr_read(adapter, PTP_INT_STS) & PTP_INT_BIT_TX_TS_)) {
 671                count++;
 672                cap_info = lan743x_csr_read(adapter, PTP_CAP_INFO);
 673
 674                if (PTP_CAP_INFO_TX_TS_CNT_GET_(cap_info) > 0) {
 675                        seconds = lan743x_csr_read(adapter,
 676                                                   PTP_TX_EGRESS_SEC);
 677                        nsec = lan743x_csr_read(adapter, PTP_TX_EGRESS_NS);
 678                        cause = (nsec &
 679                                 PTP_TX_EGRESS_NS_CAPTURE_CAUSE_MASK_);
 680                        header = lan743x_csr_read(adapter,
 681                                                  PTP_TX_MSG_HEADER);
 682
 683                        if (cause == PTP_TX_EGRESS_NS_CAPTURE_CAUSE_SW_) {
 684                                nsec &= PTP_TX_EGRESS_NS_TS_NS_MASK_;
 685                                lan743x_ptp_tx_ts_enqueue_ts(adapter,
 686                                                             seconds, nsec,
 687                                                             header);
 688                                new_timestamp_available = true;
 689                        } else if (cause ==
 690                                PTP_TX_EGRESS_NS_CAPTURE_CAUSE_AUTO_) {
 691                                netif_err(adapter, drv, adapter->netdev,
 692                                          "Auto capture cause not supported\n");
 693                        } else {
 694                                netif_warn(adapter, drv, adapter->netdev,
 695                                           "unknown tx timestamp capture cause\n");
 696                        }
 697                } else {
 698                        netif_warn(adapter, drv, adapter->netdev,
 699                                   "TX TS INT but no TX TS CNT\n");
 700                }
 701                lan743x_csr_write(adapter, PTP_INT_STS, PTP_INT_BIT_TX_TS_);
 702        }
 703
 704        if (new_timestamp_available)
 705                lan743x_ptp_tx_ts_complete(adapter);
 706
 707        lan743x_csr_write(adapter, INT_EN_SET, INT_BIT_1588_);
 708
 709        return -1;
 710}
 711
 712static void lan743x_ptp_clock_get(struct lan743x_adapter *adapter,
 713                                  u32 *seconds, u32 *nano_seconds,
 714                                  u32 *sub_nano_seconds)
 715{
 716        struct lan743x_ptp *ptp = &adapter->ptp;
 717
 718        mutex_lock(&ptp->command_lock);
 719
 720        lan743x_csr_write(adapter, PTP_CMD_CTL, PTP_CMD_CTL_PTP_CLOCK_READ_);
 721        lan743x_ptp_wait_till_cmd_done(adapter, PTP_CMD_CTL_PTP_CLOCK_READ_);
 722
 723        if (seconds)
 724                (*seconds) = lan743x_csr_read(adapter, PTP_CLOCK_SEC);
 725
 726        if (nano_seconds)
 727                (*nano_seconds) = lan743x_csr_read(adapter, PTP_CLOCK_NS);
 728
 729        if (sub_nano_seconds)
 730                (*sub_nano_seconds) =
 731                lan743x_csr_read(adapter, PTP_CLOCK_SUBNS);
 732
 733        mutex_unlock(&ptp->command_lock);
 734}
 735
 736static void lan743x_ptp_clock_step(struct lan743x_adapter *adapter,
 737                                   s64 time_step_ns)
 738{
 739        struct lan743x_ptp *ptp = &adapter->ptp;
 740        u32 nano_seconds_step = 0;
 741        u64 abs_time_step_ns = 0;
 742        u32 unsigned_seconds = 0;
 743        u32 nano_seconds = 0;
 744        u32 remainder = 0;
 745        s32 seconds = 0;
 746
 747        if (time_step_ns >  15000000000LL) {
 748                /* convert to clock set */
 749                lan743x_ptp_clock_get(adapter, &unsigned_seconds,
 750                                      &nano_seconds, NULL);
 751                unsigned_seconds += div_u64_rem(time_step_ns, 1000000000LL,
 752                                                &remainder);
 753                nano_seconds += remainder;
 754                if (nano_seconds >= 1000000000) {
 755                        unsigned_seconds++;
 756                        nano_seconds -= 1000000000;
 757                }
 758                lan743x_ptp_clock_set(adapter, unsigned_seconds,
 759                                      nano_seconds, 0);
 760                return;
 761        } else if (time_step_ns < -15000000000LL) {
 762                /* convert to clock set */
 763                time_step_ns = -time_step_ns;
 764
 765                lan743x_ptp_clock_get(adapter, &unsigned_seconds,
 766                                      &nano_seconds, NULL);
 767                unsigned_seconds -= div_u64_rem(time_step_ns, 1000000000LL,
 768                                                &remainder);
 769                nano_seconds_step = remainder;
 770                if (nano_seconds < nano_seconds_step) {
 771                        unsigned_seconds--;
 772                        nano_seconds += 1000000000;
 773                }
 774                nano_seconds -= nano_seconds_step;
 775                lan743x_ptp_clock_set(adapter, unsigned_seconds,
 776                                      nano_seconds, 0);
 777                return;
 778        }
 779
 780        /* do clock step */
 781        if (time_step_ns >= 0) {
 782                abs_time_step_ns = (u64)(time_step_ns);
 783                seconds = (s32)div_u64_rem(abs_time_step_ns, 1000000000,
 784                                           &remainder);
 785                nano_seconds = (u32)remainder;
 786        } else {
 787                abs_time_step_ns = (u64)(-time_step_ns);
 788                seconds = -((s32)div_u64_rem(abs_time_step_ns, 1000000000,
 789                                             &remainder));
 790                nano_seconds = (u32)remainder;
 791                if (nano_seconds > 0) {
 792                        /* subtracting nano seconds is not allowed
 793                         * convert to subtracting from seconds,
 794                         * and adding to nanoseconds
 795                         */
 796                        seconds--;
 797                        nano_seconds = (1000000000 - nano_seconds);
 798                }
 799        }
 800
 801        if (nano_seconds > 0) {
 802                /* add 8 ns to cover the likely normal increment */
 803                nano_seconds += 8;
 804        }
 805
 806        if (nano_seconds >= 1000000000) {
 807                /* carry into seconds */
 808                seconds++;
 809                nano_seconds -= 1000000000;
 810        }
 811
 812        while (seconds) {
 813                mutex_lock(&ptp->command_lock);
 814                if (seconds > 0) {
 815                        u32 adjustment_value = (u32)seconds;
 816
 817                        if (adjustment_value > 0xF)
 818                                adjustment_value = 0xF;
 819                        lan743x_csr_write(adapter, PTP_CLOCK_STEP_ADJ,
 820                                          PTP_CLOCK_STEP_ADJ_DIR_ |
 821                                          adjustment_value);
 822                        seconds -= ((s32)adjustment_value);
 823                } else {
 824                        u32 adjustment_value = (u32)(-seconds);
 825
 826                        if (adjustment_value > 0xF)
 827                                adjustment_value = 0xF;
 828                        lan743x_csr_write(adapter, PTP_CLOCK_STEP_ADJ,
 829                                          adjustment_value);
 830                        seconds += ((s32)adjustment_value);
 831                }
 832                lan743x_csr_write(adapter, PTP_CMD_CTL,
 833                                  PTP_CMD_CTL_PTP_CLOCK_STEP_SEC_);
 834                lan743x_ptp_wait_till_cmd_done(adapter,
 835                                               PTP_CMD_CTL_PTP_CLOCK_STEP_SEC_);
 836                mutex_unlock(&ptp->command_lock);
 837        }
 838        if (nano_seconds) {
 839                mutex_lock(&ptp->command_lock);
 840                lan743x_csr_write(adapter, PTP_CLOCK_STEP_ADJ,
 841                                  PTP_CLOCK_STEP_ADJ_DIR_ |
 842                                  (nano_seconds &
 843                                  PTP_CLOCK_STEP_ADJ_VALUE_MASK_));
 844                lan743x_csr_write(adapter, PTP_CMD_CTL,
 845                                  PTP_CMD_CTL_PTP_CLK_STP_NSEC_);
 846                lan743x_ptp_wait_till_cmd_done(adapter,
 847                                               PTP_CMD_CTL_PTP_CLK_STP_NSEC_);
 848                mutex_unlock(&ptp->command_lock);
 849        }
 850}
 851
 852void lan743x_ptp_isr(void *context)
 853{
 854        struct lan743x_adapter *adapter = (struct lan743x_adapter *)context;
 855        struct lan743x_ptp *ptp = NULL;
 856        int enable_flag = 1;
 857        u32 ptp_int_sts = 0;
 858
 859        ptp = &adapter->ptp;
 860
 861        lan743x_csr_write(adapter, INT_EN_CLR, INT_BIT_1588_);
 862
 863        ptp_int_sts = lan743x_csr_read(adapter, PTP_INT_STS);
 864        ptp_int_sts &= lan743x_csr_read(adapter, PTP_INT_EN_SET);
 865
 866        if (ptp_int_sts & PTP_INT_BIT_TX_TS_) {
 867                ptp_schedule_worker(ptp->ptp_clock, 0);
 868                enable_flag = 0;/* tasklet will re-enable later */
 869        }
 870        if (ptp_int_sts & PTP_INT_BIT_TX_SWTS_ERR_) {
 871                netif_err(adapter, drv, adapter->netdev,
 872                          "PTP TX Software Timestamp Error\n");
 873                /* clear int status bit */
 874                lan743x_csr_write(adapter, PTP_INT_STS,
 875                                  PTP_INT_BIT_TX_SWTS_ERR_);
 876        }
 877        if (ptp_int_sts & PTP_INT_BIT_TIMER_B_) {
 878                /* clear int status bit */
 879                lan743x_csr_write(adapter, PTP_INT_STS,
 880                                  PTP_INT_BIT_TIMER_B_);
 881        }
 882        if (ptp_int_sts & PTP_INT_BIT_TIMER_A_) {
 883                /* clear int status bit */
 884                lan743x_csr_write(adapter, PTP_INT_STS,
 885                                  PTP_INT_BIT_TIMER_A_);
 886        }
 887
 888        if (enable_flag) {
 889                /* re-enable isr */
 890                lan743x_csr_write(adapter, INT_EN_SET, INT_BIT_1588_);
 891        }
 892}
 893
 894static void lan743x_ptp_tx_ts_enqueue_skb(struct lan743x_adapter *adapter,
 895                                          struct sk_buff *skb, bool ignore_sync)
 896{
 897        struct lan743x_ptp *ptp = &adapter->ptp;
 898
 899        spin_lock_bh(&ptp->tx_ts_lock);
 900        if (ptp->tx_ts_skb_queue_size < LAN743X_PTP_NUMBER_OF_TX_TIMESTAMPS) {
 901                ptp->tx_ts_skb_queue[ptp->tx_ts_skb_queue_size] = skb;
 902                if (ignore_sync)
 903                        ptp->tx_ts_ignore_sync_queue |=
 904                                BIT(ptp->tx_ts_skb_queue_size);
 905                ptp->tx_ts_skb_queue_size++;
 906        } else {
 907                /* this should never happen, so long as the tx channel
 908                 * calls and honors the result from
 909                 * lan743x_ptp_request_tx_timestamp
 910                 */
 911                netif_err(adapter, drv, adapter->netdev,
 912                          "tx ts skb queue overflow\n");
 913                dev_kfree_skb(skb);
 914        }
 915        spin_unlock_bh(&ptp->tx_ts_lock);
 916}
 917
 918static void lan743x_ptp_sync_to_system_clock(struct lan743x_adapter *adapter)
 919{
 920        struct timespec64 ts;
 921
 922        ktime_get_clocktai_ts64(&ts);
 923
 924        lan743x_ptp_clock_set(adapter, ts.tv_sec, ts.tv_nsec, 0);
 925}
 926
 927void lan743x_ptp_update_latency(struct lan743x_adapter *adapter,
 928                                u32 link_speed)
 929{
 930        switch (link_speed) {
 931        case 10:
 932                lan743x_csr_write(adapter, PTP_LATENCY,
 933                                  PTP_LATENCY_TX_SET_(0) |
 934                                  PTP_LATENCY_RX_SET_(0));
 935                break;
 936        case 100:
 937                lan743x_csr_write(adapter, PTP_LATENCY,
 938                                  PTP_LATENCY_TX_SET_(181) |
 939                                  PTP_LATENCY_RX_SET_(594));
 940                break;
 941        case 1000:
 942                lan743x_csr_write(adapter, PTP_LATENCY,
 943                                  PTP_LATENCY_TX_SET_(30) |
 944                                  PTP_LATENCY_RX_SET_(525));
 945                break;
 946        }
 947}
 948
 949int lan743x_ptp_init(struct lan743x_adapter *adapter)
 950{
 951        struct lan743x_ptp *ptp = &adapter->ptp;
 952        int i;
 953
 954        mutex_init(&ptp->command_lock);
 955        spin_lock_init(&ptp->tx_ts_lock);
 956        ptp->used_event_ch = 0;
 957
 958        for (i = 0; i < LAN743X_PTP_N_EVENT_CHAN; i++) {
 959                ptp->perout[i].event_ch = -1;
 960                ptp->perout[i].gpio_pin = -1;
 961        }
 962
 963        lan743x_led_mux_save(adapter);
 964
 965        return 0;
 966}
 967
 968int lan743x_ptp_open(struct lan743x_adapter *adapter)
 969{
 970        struct lan743x_ptp *ptp = &adapter->ptp;
 971        int ret = -ENODEV;
 972        u32 temp;
 973        int i;
 974        int n_pins;
 975
 976        lan743x_ptp_reset(adapter);
 977        lan743x_ptp_sync_to_system_clock(adapter);
 978        temp = lan743x_csr_read(adapter, PTP_TX_MOD2);
 979        temp |= PTP_TX_MOD2_TX_PTP_CLR_UDPV4_CHKSUM_;
 980        lan743x_csr_write(adapter, PTP_TX_MOD2, temp);
 981        lan743x_ptp_enable(adapter);
 982        lan743x_csr_write(adapter, INT_EN_SET, INT_BIT_1588_);
 983        lan743x_csr_write(adapter, PTP_INT_EN_SET,
 984                          PTP_INT_BIT_TX_SWTS_ERR_ | PTP_INT_BIT_TX_TS_);
 985        ptp->flags |= PTP_FLAG_ISR_ENABLED;
 986
 987        if (!IS_ENABLED(CONFIG_PTP_1588_CLOCK))
 988                return 0;
 989
 990        switch (adapter->csr.id_rev & ID_REV_ID_MASK_) {
 991        case ID_REV_ID_LAN7430_:
 992                n_pins = LAN7430_N_GPIO;
 993                break;
 994        case ID_REV_ID_LAN7431_:
 995                n_pins = LAN7431_N_GPIO;
 996                break;
 997        default:
 998                netif_warn(adapter, drv, adapter->netdev,
 999                           "Unknown LAN743x (%08x). Assuming no GPIO\n",
1000                           adapter->csr.id_rev);
1001                n_pins = 0;
1002                break;
1003        }
1004
1005        if (n_pins > LAN743X_PTP_N_GPIO)
1006                n_pins = LAN743X_PTP_N_GPIO;
1007
1008        for (i = 0; i < n_pins; i++) {
1009                struct ptp_pin_desc *ptp_pin = &ptp->pin_config[i];
1010
1011                snprintf(ptp_pin->name,
1012                         sizeof(ptp_pin->name), "lan743x_ptp_pin_%02d", i);
1013                ptp_pin->index = i;
1014                ptp_pin->func = PTP_PF_NONE;
1015        }
1016
1017        ptp->ptp_clock_info.owner = THIS_MODULE;
1018        snprintf(ptp->ptp_clock_info.name, 16, "%pm",
1019                 adapter->netdev->dev_addr);
1020        ptp->ptp_clock_info.max_adj = LAN743X_PTP_MAX_FREQ_ADJ_IN_PPB;
1021        ptp->ptp_clock_info.n_alarm = 0;
1022        ptp->ptp_clock_info.n_ext_ts = 0;
1023        ptp->ptp_clock_info.n_per_out = LAN743X_PTP_N_EVENT_CHAN;
1024        ptp->ptp_clock_info.n_pins = n_pins;
1025        ptp->ptp_clock_info.pps = 0;
1026        ptp->ptp_clock_info.pin_config = ptp->pin_config;
1027        ptp->ptp_clock_info.adjfine = lan743x_ptpci_adjfine;
1028        ptp->ptp_clock_info.adjfreq = lan743x_ptpci_adjfreq;
1029        ptp->ptp_clock_info.adjtime = lan743x_ptpci_adjtime;
1030        ptp->ptp_clock_info.gettime64 = lan743x_ptpci_gettime64;
1031        ptp->ptp_clock_info.getcrosststamp = NULL;
1032        ptp->ptp_clock_info.settime64 = lan743x_ptpci_settime64;
1033        ptp->ptp_clock_info.enable = lan743x_ptpci_enable;
1034        ptp->ptp_clock_info.do_aux_work = lan743x_ptpci_do_aux_work;
1035        ptp->ptp_clock_info.verify = lan743x_ptpci_verify_pin_config;
1036
1037        ptp->ptp_clock = ptp_clock_register(&ptp->ptp_clock_info,
1038                                            &adapter->pdev->dev);
1039
1040        if (IS_ERR(ptp->ptp_clock)) {
1041                netif_err(adapter, ifup, adapter->netdev,
1042                          "ptp_clock_register failed\n");
1043                goto done;
1044        }
1045        ptp->flags |= PTP_FLAG_PTP_CLOCK_REGISTERED;
1046        netif_info(adapter, ifup, adapter->netdev,
1047                   "successfully registered ptp clock\n");
1048
1049        return 0;
1050done:
1051        lan743x_ptp_close(adapter);
1052        return ret;
1053}
1054
1055void lan743x_ptp_close(struct lan743x_adapter *adapter)
1056{
1057        struct lan743x_ptp *ptp = &adapter->ptp;
1058        int index;
1059
1060        if (IS_ENABLED(CONFIG_PTP_1588_CLOCK) &&
1061            (ptp->flags & PTP_FLAG_PTP_CLOCK_REGISTERED)) {
1062                ptp_clock_unregister(ptp->ptp_clock);
1063                ptp->ptp_clock = NULL;
1064                ptp->flags &= ~PTP_FLAG_PTP_CLOCK_REGISTERED;
1065                netif_info(adapter, drv, adapter->netdev,
1066                           "ptp clock unregister\n");
1067        }
1068
1069        if (ptp->flags & PTP_FLAG_ISR_ENABLED) {
1070                lan743x_csr_write(adapter, PTP_INT_EN_CLR,
1071                                  PTP_INT_BIT_TX_SWTS_ERR_ |
1072                                  PTP_INT_BIT_TX_TS_);
1073                lan743x_csr_write(adapter, INT_EN_CLR, INT_BIT_1588_);
1074                ptp->flags &= ~PTP_FLAG_ISR_ENABLED;
1075        }
1076
1077        /* clean up pending timestamp requests */
1078        lan743x_ptp_tx_ts_complete(adapter);
1079        spin_lock_bh(&ptp->tx_ts_lock);
1080        for (index = 0;
1081                index < LAN743X_PTP_NUMBER_OF_TX_TIMESTAMPS;
1082                index++) {
1083                struct sk_buff *skb = ptp->tx_ts_skb_queue[index];
1084
1085                dev_kfree_skb(skb);
1086                ptp->tx_ts_skb_queue[index] = NULL;
1087                ptp->tx_ts_seconds_queue[index] = 0;
1088                ptp->tx_ts_nseconds_queue[index] = 0;
1089        }
1090        ptp->tx_ts_skb_queue_size = 0;
1091        ptp->tx_ts_queue_size = 0;
1092        ptp->pending_tx_timestamps = 0;
1093        spin_unlock_bh(&ptp->tx_ts_lock);
1094
1095        lan743x_led_mux_restore(adapter);
1096
1097        lan743x_ptp_disable(adapter);
1098}
1099
1100static void lan743x_ptp_set_sync_ts_insert(struct lan743x_adapter *adapter,
1101                                           bool ts_insert_enable)
1102{
1103        u32 ptp_tx_mod = lan743x_csr_read(adapter, PTP_TX_MOD);
1104
1105        if (ts_insert_enable)
1106                ptp_tx_mod |= PTP_TX_MOD_TX_PTP_SYNC_TS_INSERT_;
1107        else
1108                ptp_tx_mod &= ~PTP_TX_MOD_TX_PTP_SYNC_TS_INSERT_;
1109
1110        lan743x_csr_write(adapter, PTP_TX_MOD, ptp_tx_mod);
1111}
1112
1113static bool lan743x_ptp_is_enabled(struct lan743x_adapter *adapter)
1114{
1115        if (lan743x_csr_read(adapter, PTP_CMD_CTL) & PTP_CMD_CTL_PTP_ENABLE_)
1116                return true;
1117        return false;
1118}
1119
1120static void lan743x_ptp_enable(struct lan743x_adapter *adapter)
1121{
1122        struct lan743x_ptp *ptp = &adapter->ptp;
1123
1124        mutex_lock(&ptp->command_lock);
1125
1126        if (lan743x_ptp_is_enabled(adapter)) {
1127                netif_warn(adapter, drv, adapter->netdev,
1128                           "PTP already enabled\n");
1129                goto done;
1130        }
1131        lan743x_csr_write(adapter, PTP_CMD_CTL, PTP_CMD_CTL_PTP_ENABLE_);
1132done:
1133        mutex_unlock(&ptp->command_lock);
1134}
1135
1136static void lan743x_ptp_disable(struct lan743x_adapter *adapter)
1137{
1138        struct lan743x_ptp *ptp = &adapter->ptp;
1139
1140        mutex_lock(&ptp->command_lock);
1141        if (!lan743x_ptp_is_enabled(adapter)) {
1142                netif_warn(adapter, drv, adapter->netdev,
1143                           "PTP already disabled\n");
1144                goto done;
1145        }
1146        lan743x_csr_write(adapter, PTP_CMD_CTL, PTP_CMD_CTL_PTP_DISABLE_);
1147        lan743x_ptp_wait_till_cmd_done(adapter, PTP_CMD_CTL_PTP_ENABLE_);
1148done:
1149        mutex_unlock(&ptp->command_lock);
1150}
1151
1152static void lan743x_ptp_reset(struct lan743x_adapter *adapter)
1153{
1154        struct lan743x_ptp *ptp = &adapter->ptp;
1155
1156        mutex_lock(&ptp->command_lock);
1157
1158        if (lan743x_ptp_is_enabled(adapter)) {
1159                netif_err(adapter, drv, adapter->netdev,
1160                          "Attempting reset while enabled\n");
1161                goto done;
1162        }
1163
1164        lan743x_csr_write(adapter, PTP_CMD_CTL, PTP_CMD_CTL_PTP_RESET_);
1165        lan743x_ptp_wait_till_cmd_done(adapter, PTP_CMD_CTL_PTP_RESET_);
1166done:
1167        mutex_unlock(&ptp->command_lock);
1168}
1169
1170static void lan743x_ptp_clock_set(struct lan743x_adapter *adapter,
1171                                  u32 seconds, u32 nano_seconds,
1172                                  u32 sub_nano_seconds)
1173{
1174        struct lan743x_ptp *ptp = &adapter->ptp;
1175
1176        mutex_lock(&ptp->command_lock);
1177
1178        lan743x_csr_write(adapter, PTP_CLOCK_SEC, seconds);
1179        lan743x_csr_write(adapter, PTP_CLOCK_NS, nano_seconds);
1180        lan743x_csr_write(adapter, PTP_CLOCK_SUBNS, sub_nano_seconds);
1181
1182        lan743x_csr_write(adapter, PTP_CMD_CTL, PTP_CMD_CTL_PTP_CLOCK_LOAD_);
1183        lan743x_ptp_wait_till_cmd_done(adapter, PTP_CMD_CTL_PTP_CLOCK_LOAD_);
1184        mutex_unlock(&ptp->command_lock);
1185}
1186
1187bool lan743x_ptp_request_tx_timestamp(struct lan743x_adapter *adapter)
1188{
1189        struct lan743x_ptp *ptp = &adapter->ptp;
1190        bool result = false;
1191
1192        spin_lock_bh(&ptp->tx_ts_lock);
1193        if (ptp->pending_tx_timestamps < LAN743X_PTP_NUMBER_OF_TX_TIMESTAMPS) {
1194                /* request granted */
1195                ptp->pending_tx_timestamps++;
1196                result = true;
1197        }
1198        spin_unlock_bh(&ptp->tx_ts_lock);
1199        return result;
1200}
1201
1202void lan743x_ptp_unrequest_tx_timestamp(struct lan743x_adapter *adapter)
1203{
1204        struct lan743x_ptp *ptp = &adapter->ptp;
1205
1206        spin_lock_bh(&ptp->tx_ts_lock);
1207        if (ptp->pending_tx_timestamps > 0)
1208                ptp->pending_tx_timestamps--;
1209        else
1210                netif_err(adapter, drv, adapter->netdev,
1211                          "unrequest failed, pending_tx_timestamps==0\n");
1212        spin_unlock_bh(&ptp->tx_ts_lock);
1213}
1214
1215void lan743x_ptp_tx_timestamp_skb(struct lan743x_adapter *adapter,
1216                                  struct sk_buff *skb, bool ignore_sync)
1217{
1218        lan743x_ptp_tx_ts_enqueue_skb(adapter, skb, ignore_sync);
1219
1220        lan743x_ptp_tx_ts_complete(adapter);
1221}
1222
1223int lan743x_ptp_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
1224{
1225        struct lan743x_adapter *adapter = netdev_priv(netdev);
1226        struct hwtstamp_config config;
1227        int ret = 0;
1228        int index;
1229
1230        if (!ifr) {
1231                netif_err(adapter, drv, adapter->netdev,
1232                          "SIOCSHWTSTAMP, ifr == NULL\n");
1233                return -EINVAL;
1234        }
1235
1236        if (copy_from_user(&config, ifr->ifr_data, sizeof(config)))
1237                return -EFAULT;
1238
1239        if (config.flags) {
1240                netif_warn(adapter, drv, adapter->netdev,
1241                           "ignoring hwtstamp_config.flags == 0x%08X, expected 0\n",
1242                           config.flags);
1243        }
1244
1245        switch (config.tx_type) {
1246        case HWTSTAMP_TX_OFF:
1247                for (index = 0; index < LAN743X_MAX_TX_CHANNELS;
1248                        index++)
1249                        lan743x_tx_set_timestamping_mode(&adapter->tx[index],
1250                                                         false, false);
1251                lan743x_ptp_set_sync_ts_insert(adapter, false);
1252                break;
1253        case HWTSTAMP_TX_ON:
1254                for (index = 0; index < LAN743X_MAX_TX_CHANNELS;
1255                        index++)
1256                        lan743x_tx_set_timestamping_mode(&adapter->tx[index],
1257                                                         true, false);
1258                lan743x_ptp_set_sync_ts_insert(adapter, false);
1259                break;
1260        case HWTSTAMP_TX_ONESTEP_SYNC:
1261                for (index = 0; index < LAN743X_MAX_TX_CHANNELS;
1262                        index++)
1263                        lan743x_tx_set_timestamping_mode(&adapter->tx[index],
1264                                                         true, true);
1265
1266                lan743x_ptp_set_sync_ts_insert(adapter, true);
1267                break;
1268        case HWTSTAMP_TX_ONESTEP_P2P:
1269                ret = -ERANGE;
1270                break;
1271        default:
1272                netif_warn(adapter, drv, adapter->netdev,
1273                           "  tx_type = %d, UNKNOWN\n", config.tx_type);
1274                ret = -EINVAL;
1275                break;
1276        }
1277
1278        if (!ret)
1279                return copy_to_user(ifr->ifr_data, &config,
1280                        sizeof(config)) ? -EFAULT : 0;
1281        return ret;
1282}
1283