linux/drivers/net/phy/adin.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 *  Driver for Analog Devices Industrial Ethernet PHYs
   4 *
   5 * Copyright 2019 Analog Devices Inc.
   6 */
   7#include <linux/kernel.h>
   8#include <linux/bitfield.h>
   9#include <linux/delay.h>
  10#include <linux/errno.h>
  11#include <linux/ethtool_netlink.h>
  12#include <linux/init.h>
  13#include <linux/module.h>
  14#include <linux/mii.h>
  15#include <linux/phy.h>
  16#include <linux/property.h>
  17
  18#define PHY_ID_ADIN1200                         0x0283bc20
  19#define PHY_ID_ADIN1300                         0x0283bc30
  20
  21#define ADIN1300_MII_EXT_REG_PTR                0x0010
  22#define ADIN1300_MII_EXT_REG_DATA               0x0011
  23
  24#define ADIN1300_PHY_CTRL1                      0x0012
  25#define   ADIN1300_AUTO_MDI_EN                  BIT(10)
  26#define   ADIN1300_MAN_MDIX_EN                  BIT(9)
  27#define   ADIN1300_DIAG_CLK_EN                  BIT(2)
  28
  29#define ADIN1300_RX_ERR_CNT                     0x0014
  30
  31#define ADIN1300_PHY_CTRL_STATUS2               0x0015
  32#define   ADIN1300_NRG_PD_EN                    BIT(3)
  33#define   ADIN1300_NRG_PD_TX_EN                 BIT(2)
  34#define   ADIN1300_NRG_PD_STATUS                BIT(1)
  35
  36#define ADIN1300_PHY_CTRL2                      0x0016
  37#define   ADIN1300_DOWNSPEED_AN_100_EN          BIT(11)
  38#define   ADIN1300_DOWNSPEED_AN_10_EN           BIT(10)
  39#define   ADIN1300_GROUP_MDIO_EN                BIT(6)
  40#define   ADIN1300_DOWNSPEEDS_EN        \
  41        (ADIN1300_DOWNSPEED_AN_100_EN | ADIN1300_DOWNSPEED_AN_10_EN)
  42
  43#define ADIN1300_PHY_CTRL3                      0x0017
  44#define   ADIN1300_LINKING_EN                   BIT(13)
  45#define   ADIN1300_DOWNSPEED_RETRIES_MSK        GENMASK(12, 10)
  46
  47#define ADIN1300_INT_MASK_REG                   0x0018
  48#define   ADIN1300_INT_MDIO_SYNC_EN             BIT(9)
  49#define   ADIN1300_INT_ANEG_STAT_CHNG_EN        BIT(8)
  50#define   ADIN1300_INT_ANEG_PAGE_RX_EN          BIT(6)
  51#define   ADIN1300_INT_IDLE_ERR_CNT_EN          BIT(5)
  52#define   ADIN1300_INT_MAC_FIFO_OU_EN           BIT(4)
  53#define   ADIN1300_INT_RX_STAT_CHNG_EN          BIT(3)
  54#define   ADIN1300_INT_LINK_STAT_CHNG_EN        BIT(2)
  55#define   ADIN1300_INT_SPEED_CHNG_EN            BIT(1)
  56#define   ADIN1300_INT_HW_IRQ_EN                BIT(0)
  57#define ADIN1300_INT_MASK_EN    \
  58        (ADIN1300_INT_LINK_STAT_CHNG_EN | ADIN1300_INT_HW_IRQ_EN)
  59#define ADIN1300_INT_STATUS_REG                 0x0019
  60
  61#define ADIN1300_PHY_STATUS1                    0x001a
  62#define   ADIN1300_PAIR_01_SWAP                 BIT(11)
  63
  64/* EEE register addresses, accessible via Clause 22 access using
  65 * ADIN1300_MII_EXT_REG_PTR & ADIN1300_MII_EXT_REG_DATA.
  66 * The bit-fields are the same as specified by IEEE for EEE.
  67 */
  68#define ADIN1300_EEE_CAP_REG                    0x8000
  69#define ADIN1300_EEE_ADV_REG                    0x8001
  70#define ADIN1300_EEE_LPABLE_REG                 0x8002
  71#define ADIN1300_CLOCK_STOP_REG                 0x9400
  72#define ADIN1300_LPI_WAKE_ERR_CNT_REG           0xa000
  73
  74#define ADIN1300_CDIAG_RUN                      0xba1b
  75#define   ADIN1300_CDIAG_RUN_EN                 BIT(0)
  76
  77/*
  78 * The XSIM3/2/1 and XSHRT3/2/1 are actually relative.
  79 * For CDIAG_DTLD_RSLTS(0) it's ADIN1300_CDIAG_RSLT_XSIM3/2/1
  80 * For CDIAG_DTLD_RSLTS(1) it's ADIN1300_CDIAG_RSLT_XSIM3/2/0
  81 * For CDIAG_DTLD_RSLTS(2) it's ADIN1300_CDIAG_RSLT_XSIM3/1/0
  82 * For CDIAG_DTLD_RSLTS(3) it's ADIN1300_CDIAG_RSLT_XSIM2/1/0
  83 */
  84#define ADIN1300_CDIAG_DTLD_RSLTS(x)            (0xba1d + (x))
  85#define   ADIN1300_CDIAG_RSLT_BUSY              BIT(10)
  86#define   ADIN1300_CDIAG_RSLT_XSIM3             BIT(9)
  87#define   ADIN1300_CDIAG_RSLT_XSIM2             BIT(8)
  88#define   ADIN1300_CDIAG_RSLT_XSIM1             BIT(7)
  89#define   ADIN1300_CDIAG_RSLT_SIM               BIT(6)
  90#define   ADIN1300_CDIAG_RSLT_XSHRT3            BIT(5)
  91#define   ADIN1300_CDIAG_RSLT_XSHRT2            BIT(4)
  92#define   ADIN1300_CDIAG_RSLT_XSHRT1            BIT(3)
  93#define   ADIN1300_CDIAG_RSLT_SHRT              BIT(2)
  94#define   ADIN1300_CDIAG_RSLT_OPEN              BIT(1)
  95#define   ADIN1300_CDIAG_RSLT_GOOD              BIT(0)
  96
  97#define ADIN1300_CDIAG_FLT_DIST(x)              (0xba21 + (x))
  98
  99#define ADIN1300_GE_SOFT_RESET_REG              0xff0c
 100#define   ADIN1300_GE_SOFT_RESET                BIT(0)
 101
 102#define ADIN1300_GE_RGMII_CFG_REG               0xff23
 103#define   ADIN1300_GE_RGMII_RX_MSK              GENMASK(8, 6)
 104#define   ADIN1300_GE_RGMII_RX_SEL(x)           \
 105                FIELD_PREP(ADIN1300_GE_RGMII_RX_MSK, x)
 106#define   ADIN1300_GE_RGMII_GTX_MSK             GENMASK(5, 3)
 107#define   ADIN1300_GE_RGMII_GTX_SEL(x)          \
 108                FIELD_PREP(ADIN1300_GE_RGMII_GTX_MSK, x)
 109#define   ADIN1300_GE_RGMII_RXID_EN             BIT(2)
 110#define   ADIN1300_GE_RGMII_TXID_EN             BIT(1)
 111#define   ADIN1300_GE_RGMII_EN                  BIT(0)
 112
 113/* RGMII internal delay settings for rx and tx for ADIN1300 */
 114#define ADIN1300_RGMII_1_60_NS                  0x0001
 115#define ADIN1300_RGMII_1_80_NS                  0x0002
 116#define ADIN1300_RGMII_2_00_NS                  0x0000
 117#define ADIN1300_RGMII_2_20_NS                  0x0006
 118#define ADIN1300_RGMII_2_40_NS                  0x0007
 119
 120#define ADIN1300_GE_RMII_CFG_REG                0xff24
 121#define   ADIN1300_GE_RMII_FIFO_DEPTH_MSK       GENMASK(6, 4)
 122#define   ADIN1300_GE_RMII_FIFO_DEPTH_SEL(x)    \
 123                FIELD_PREP(ADIN1300_GE_RMII_FIFO_DEPTH_MSK, x)
 124#define   ADIN1300_GE_RMII_EN                   BIT(0)
 125
 126/* RMII fifo depth values */
 127#define ADIN1300_RMII_4_BITS                    0x0000
 128#define ADIN1300_RMII_8_BITS                    0x0001
 129#define ADIN1300_RMII_12_BITS                   0x0002
 130#define ADIN1300_RMII_16_BITS                   0x0003
 131#define ADIN1300_RMII_20_BITS                   0x0004
 132#define ADIN1300_RMII_24_BITS                   0x0005
 133
 134/**
 135 * struct adin_cfg_reg_map - map a config value to aregister value
 136 * @cfg:        value in device configuration
 137 * @reg:        value in the register
 138 */
 139struct adin_cfg_reg_map {
 140        int cfg;
 141        int reg;
 142};
 143
 144static const struct adin_cfg_reg_map adin_rgmii_delays[] = {
 145        { 1600, ADIN1300_RGMII_1_60_NS },
 146        { 1800, ADIN1300_RGMII_1_80_NS },
 147        { 2000, ADIN1300_RGMII_2_00_NS },
 148        { 2200, ADIN1300_RGMII_2_20_NS },
 149        { 2400, ADIN1300_RGMII_2_40_NS },
 150        { },
 151};
 152
 153static const struct adin_cfg_reg_map adin_rmii_fifo_depths[] = {
 154        { 4,  ADIN1300_RMII_4_BITS },
 155        { 8,  ADIN1300_RMII_8_BITS },
 156        { 12, ADIN1300_RMII_12_BITS },
 157        { 16, ADIN1300_RMII_16_BITS },
 158        { 20, ADIN1300_RMII_20_BITS },
 159        { 24, ADIN1300_RMII_24_BITS },
 160        { },
 161};
 162
 163/**
 164 * struct adin_clause45_mmd_map - map to convert Clause 45 regs to Clause 22
 165 * @devad:              device address used in Clause 45 access
 166 * @cl45_regnum:        register address defined by Clause 45
 167 * @adin_regnum:        equivalent register address accessible via Clause 22
 168 */
 169struct adin_clause45_mmd_map {
 170        int devad;
 171        u16 cl45_regnum;
 172        u16 adin_regnum;
 173};
 174
 175static const struct adin_clause45_mmd_map adin_clause45_mmd_map[] = {
 176        { MDIO_MMD_PCS, MDIO_PCS_EEE_ABLE,      ADIN1300_EEE_CAP_REG },
 177        { MDIO_MMD_AN,  MDIO_AN_EEE_LPABLE,     ADIN1300_EEE_LPABLE_REG },
 178        { MDIO_MMD_AN,  MDIO_AN_EEE_ADV,        ADIN1300_EEE_ADV_REG },
 179        { MDIO_MMD_PCS, MDIO_CTRL1,             ADIN1300_CLOCK_STOP_REG },
 180        { MDIO_MMD_PCS, MDIO_PCS_EEE_WK_ERR,    ADIN1300_LPI_WAKE_ERR_CNT_REG },
 181};
 182
 183struct adin_hw_stat {
 184        const char *string;
 185        u16 reg1;
 186        u16 reg2;
 187};
 188
 189static const struct adin_hw_stat adin_hw_stats[] = {
 190        { "total_frames_checked_count",         0x940A, 0x940B }, /* hi + lo */
 191        { "length_error_frames_count",          0x940C },
 192        { "alignment_error_frames_count",       0x940D },
 193        { "symbol_error_count",                 0x940E },
 194        { "oversized_frames_count",             0x940F },
 195        { "undersized_frames_count",            0x9410 },
 196        { "odd_nibble_frames_count",            0x9411 },
 197        { "odd_preamble_packet_count",          0x9412 },
 198        { "dribble_bits_frames_count",          0x9413 },
 199        { "false_carrier_events_count",         0x9414 },
 200};
 201
 202/**
 203 * struct adin_priv - ADIN PHY driver private data
 204 * @stats:              statistic counters for the PHY
 205 */
 206struct adin_priv {
 207        u64                     stats[ARRAY_SIZE(adin_hw_stats)];
 208};
 209
 210static int adin_lookup_reg_value(const struct adin_cfg_reg_map *tbl, int cfg)
 211{
 212        size_t i;
 213
 214        for (i = 0; tbl[i].cfg; i++) {
 215                if (tbl[i].cfg == cfg)
 216                        return tbl[i].reg;
 217        }
 218
 219        return -EINVAL;
 220}
 221
 222static u32 adin_get_reg_value(struct phy_device *phydev,
 223                              const char *prop_name,
 224                              const struct adin_cfg_reg_map *tbl,
 225                              u32 dflt)
 226{
 227        struct device *dev = &phydev->mdio.dev;
 228        u32 val;
 229        int rc;
 230
 231        if (device_property_read_u32(dev, prop_name, &val))
 232                return dflt;
 233
 234        rc = adin_lookup_reg_value(tbl, val);
 235        if (rc < 0) {
 236                phydev_warn(phydev,
 237                            "Unsupported value %u for %s using default (%u)\n",
 238                            val, prop_name, dflt);
 239                return dflt;
 240        }
 241
 242        return rc;
 243}
 244
 245static int adin_config_rgmii_mode(struct phy_device *phydev)
 246{
 247        u32 val;
 248        int reg;
 249
 250        if (!phy_interface_is_rgmii(phydev))
 251                return phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
 252                                          ADIN1300_GE_RGMII_CFG_REG,
 253                                          ADIN1300_GE_RGMII_EN);
 254
 255        reg = phy_read_mmd(phydev, MDIO_MMD_VEND1, ADIN1300_GE_RGMII_CFG_REG);
 256        if (reg < 0)
 257                return reg;
 258
 259        reg |= ADIN1300_GE_RGMII_EN;
 260
 261        if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
 262            phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID) {
 263                reg |= ADIN1300_GE_RGMII_RXID_EN;
 264
 265                val = adin_get_reg_value(phydev, "adi,rx-internal-delay-ps",
 266                                         adin_rgmii_delays,
 267                                         ADIN1300_RGMII_2_00_NS);
 268                reg &= ~ADIN1300_GE_RGMII_RX_MSK;
 269                reg |= ADIN1300_GE_RGMII_RX_SEL(val);
 270        } else {
 271                reg &= ~ADIN1300_GE_RGMII_RXID_EN;
 272        }
 273
 274        if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
 275            phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) {
 276                reg |= ADIN1300_GE_RGMII_TXID_EN;
 277
 278                val = adin_get_reg_value(phydev, "adi,tx-internal-delay-ps",
 279                                         adin_rgmii_delays,
 280                                         ADIN1300_RGMII_2_00_NS);
 281                reg &= ~ADIN1300_GE_RGMII_GTX_MSK;
 282                reg |= ADIN1300_GE_RGMII_GTX_SEL(val);
 283        } else {
 284                reg &= ~ADIN1300_GE_RGMII_TXID_EN;
 285        }
 286
 287        return phy_write_mmd(phydev, MDIO_MMD_VEND1,
 288                             ADIN1300_GE_RGMII_CFG_REG, reg);
 289}
 290
 291static int adin_config_rmii_mode(struct phy_device *phydev)
 292{
 293        u32 val;
 294        int reg;
 295
 296        if (phydev->interface != PHY_INTERFACE_MODE_RMII)
 297                return phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
 298                                          ADIN1300_GE_RMII_CFG_REG,
 299                                          ADIN1300_GE_RMII_EN);
 300
 301        reg = phy_read_mmd(phydev, MDIO_MMD_VEND1, ADIN1300_GE_RMII_CFG_REG);
 302        if (reg < 0)
 303                return reg;
 304
 305        reg |= ADIN1300_GE_RMII_EN;
 306
 307        val = adin_get_reg_value(phydev, "adi,fifo-depth-bits",
 308                                 adin_rmii_fifo_depths,
 309                                 ADIN1300_RMII_8_BITS);
 310
 311        reg &= ~ADIN1300_GE_RMII_FIFO_DEPTH_MSK;
 312        reg |= ADIN1300_GE_RMII_FIFO_DEPTH_SEL(val);
 313
 314        return phy_write_mmd(phydev, MDIO_MMD_VEND1,
 315                             ADIN1300_GE_RMII_CFG_REG, reg);
 316}
 317
 318static int adin_get_downshift(struct phy_device *phydev, u8 *data)
 319{
 320        int val, cnt, enable;
 321
 322        val = phy_read(phydev, ADIN1300_PHY_CTRL2);
 323        if (val < 0)
 324                return val;
 325
 326        cnt = phy_read(phydev, ADIN1300_PHY_CTRL3);
 327        if (cnt < 0)
 328                return cnt;
 329
 330        enable = FIELD_GET(ADIN1300_DOWNSPEEDS_EN, val);
 331        cnt = FIELD_GET(ADIN1300_DOWNSPEED_RETRIES_MSK, cnt);
 332
 333        *data = (enable && cnt) ? cnt : DOWNSHIFT_DEV_DISABLE;
 334
 335        return 0;
 336}
 337
 338static int adin_set_downshift(struct phy_device *phydev, u8 cnt)
 339{
 340        u16 val;
 341        int rc;
 342
 343        if (cnt == DOWNSHIFT_DEV_DISABLE)
 344                return phy_clear_bits(phydev, ADIN1300_PHY_CTRL2,
 345                                      ADIN1300_DOWNSPEEDS_EN);
 346
 347        if (cnt > 7)
 348                return -E2BIG;
 349
 350        val = FIELD_PREP(ADIN1300_DOWNSPEED_RETRIES_MSK, cnt);
 351
 352        rc = phy_modify(phydev, ADIN1300_PHY_CTRL3,
 353                        ADIN1300_DOWNSPEED_RETRIES_MSK,
 354                        val);
 355        if (rc < 0)
 356                return rc;
 357
 358        return phy_set_bits(phydev, ADIN1300_PHY_CTRL2,
 359                            ADIN1300_DOWNSPEEDS_EN);
 360}
 361
 362static int adin_get_edpd(struct phy_device *phydev, u16 *tx_interval)
 363{
 364        int val;
 365
 366        val = phy_read(phydev, ADIN1300_PHY_CTRL_STATUS2);
 367        if (val < 0)
 368                return val;
 369
 370        if (ADIN1300_NRG_PD_EN & val) {
 371                if (val & ADIN1300_NRG_PD_TX_EN)
 372                        /* default is 1 second */
 373                        *tx_interval = ETHTOOL_PHY_EDPD_DFLT_TX_MSECS;
 374                else
 375                        *tx_interval = ETHTOOL_PHY_EDPD_NO_TX;
 376        } else {
 377                *tx_interval = ETHTOOL_PHY_EDPD_DISABLE;
 378        }
 379
 380        return 0;
 381}
 382
 383static int adin_set_edpd(struct phy_device *phydev, u16 tx_interval)
 384{
 385        u16 val;
 386
 387        if (tx_interval == ETHTOOL_PHY_EDPD_DISABLE)
 388                return phy_clear_bits(phydev, ADIN1300_PHY_CTRL_STATUS2,
 389                                (ADIN1300_NRG_PD_EN | ADIN1300_NRG_PD_TX_EN));
 390
 391        val = ADIN1300_NRG_PD_EN;
 392
 393        switch (tx_interval) {
 394        case 1000: /* 1 second */
 395                fallthrough;
 396        case ETHTOOL_PHY_EDPD_DFLT_TX_MSECS:
 397                val |= ADIN1300_NRG_PD_TX_EN;
 398                fallthrough;
 399        case ETHTOOL_PHY_EDPD_NO_TX:
 400                break;
 401        default:
 402                return -EINVAL;
 403        }
 404
 405        return phy_modify(phydev, ADIN1300_PHY_CTRL_STATUS2,
 406                          (ADIN1300_NRG_PD_EN | ADIN1300_NRG_PD_TX_EN),
 407                          val);
 408}
 409
 410static int adin_get_tunable(struct phy_device *phydev,
 411                            struct ethtool_tunable *tuna, void *data)
 412{
 413        switch (tuna->id) {
 414        case ETHTOOL_PHY_DOWNSHIFT:
 415                return adin_get_downshift(phydev, data);
 416        case ETHTOOL_PHY_EDPD:
 417                return adin_get_edpd(phydev, data);
 418        default:
 419                return -EOPNOTSUPP;
 420        }
 421}
 422
 423static int adin_set_tunable(struct phy_device *phydev,
 424                            struct ethtool_tunable *tuna, const void *data)
 425{
 426        switch (tuna->id) {
 427        case ETHTOOL_PHY_DOWNSHIFT:
 428                return adin_set_downshift(phydev, *(const u8 *)data);
 429        case ETHTOOL_PHY_EDPD:
 430                return adin_set_edpd(phydev, *(const u16 *)data);
 431        default:
 432                return -EOPNOTSUPP;
 433        }
 434}
 435
 436static int adin_config_init(struct phy_device *phydev)
 437{
 438        int rc;
 439
 440        phydev->mdix_ctrl = ETH_TP_MDI_AUTO;
 441
 442        rc = adin_config_rgmii_mode(phydev);
 443        if (rc < 0)
 444                return rc;
 445
 446        rc = adin_config_rmii_mode(phydev);
 447        if (rc < 0)
 448                return rc;
 449
 450        rc = adin_set_downshift(phydev, 4);
 451        if (rc < 0)
 452                return rc;
 453
 454        rc = adin_set_edpd(phydev, ETHTOOL_PHY_EDPD_DFLT_TX_MSECS);
 455        if (rc < 0)
 456                return rc;
 457
 458        phydev_dbg(phydev, "PHY is using mode '%s'\n",
 459                   phy_modes(phydev->interface));
 460
 461        return 0;
 462}
 463
 464static int adin_phy_ack_intr(struct phy_device *phydev)
 465{
 466        /* Clear pending interrupts */
 467        int rc = phy_read(phydev, ADIN1300_INT_STATUS_REG);
 468
 469        return rc < 0 ? rc : 0;
 470}
 471
 472static int adin_phy_config_intr(struct phy_device *phydev)
 473{
 474        int err;
 475
 476        if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
 477                err = adin_phy_ack_intr(phydev);
 478                if (err)
 479                        return err;
 480
 481                err = phy_set_bits(phydev, ADIN1300_INT_MASK_REG,
 482                                   ADIN1300_INT_MASK_EN);
 483        } else {
 484                err = phy_clear_bits(phydev, ADIN1300_INT_MASK_REG,
 485                                     ADIN1300_INT_MASK_EN);
 486                if (err)
 487                        return err;
 488
 489                err = adin_phy_ack_intr(phydev);
 490        }
 491
 492        return err;
 493}
 494
 495static irqreturn_t adin_phy_handle_interrupt(struct phy_device *phydev)
 496{
 497        int irq_status;
 498
 499        irq_status = phy_read(phydev, ADIN1300_INT_STATUS_REG);
 500        if (irq_status < 0) {
 501                phy_error(phydev);
 502                return IRQ_NONE;
 503        }
 504
 505        if (!(irq_status & ADIN1300_INT_LINK_STAT_CHNG_EN))
 506                return IRQ_NONE;
 507
 508        phy_trigger_machine(phydev);
 509
 510        return IRQ_HANDLED;
 511}
 512
 513static int adin_cl45_to_adin_reg(struct phy_device *phydev, int devad,
 514                                 u16 cl45_regnum)
 515{
 516        const struct adin_clause45_mmd_map *m;
 517        int i;
 518
 519        if (devad == MDIO_MMD_VEND1)
 520                return cl45_regnum;
 521
 522        for (i = 0; i < ARRAY_SIZE(adin_clause45_mmd_map); i++) {
 523                m = &adin_clause45_mmd_map[i];
 524                if (m->devad == devad && m->cl45_regnum == cl45_regnum)
 525                        return m->adin_regnum;
 526        }
 527
 528        phydev_err(phydev,
 529                   "No translation available for devad: %d reg: %04x\n",
 530                   devad, cl45_regnum);
 531
 532        return -EINVAL;
 533}
 534
 535static int adin_read_mmd(struct phy_device *phydev, int devad, u16 regnum)
 536{
 537        struct mii_bus *bus = phydev->mdio.bus;
 538        int phy_addr = phydev->mdio.addr;
 539        int adin_regnum;
 540        int err;
 541
 542        adin_regnum = adin_cl45_to_adin_reg(phydev, devad, regnum);
 543        if (adin_regnum < 0)
 544                return adin_regnum;
 545
 546        err = __mdiobus_write(bus, phy_addr, ADIN1300_MII_EXT_REG_PTR,
 547                              adin_regnum);
 548        if (err)
 549                return err;
 550
 551        return __mdiobus_read(bus, phy_addr, ADIN1300_MII_EXT_REG_DATA);
 552}
 553
 554static int adin_write_mmd(struct phy_device *phydev, int devad, u16 regnum,
 555                          u16 val)
 556{
 557        struct mii_bus *bus = phydev->mdio.bus;
 558        int phy_addr = phydev->mdio.addr;
 559        int adin_regnum;
 560        int err;
 561
 562        adin_regnum = adin_cl45_to_adin_reg(phydev, devad, regnum);
 563        if (adin_regnum < 0)
 564                return adin_regnum;
 565
 566        err = __mdiobus_write(bus, phy_addr, ADIN1300_MII_EXT_REG_PTR,
 567                              adin_regnum);
 568        if (err)
 569                return err;
 570
 571        return __mdiobus_write(bus, phy_addr, ADIN1300_MII_EXT_REG_DATA, val);
 572}
 573
 574static int adin_config_mdix(struct phy_device *phydev)
 575{
 576        bool auto_en, mdix_en;
 577        int reg;
 578
 579        mdix_en = false;
 580        auto_en = false;
 581        switch (phydev->mdix_ctrl) {
 582        case ETH_TP_MDI:
 583                break;
 584        case ETH_TP_MDI_X:
 585                mdix_en = true;
 586                break;
 587        case ETH_TP_MDI_AUTO:
 588                auto_en = true;
 589                break;
 590        default:
 591                return -EINVAL;
 592        }
 593
 594        reg = phy_read(phydev, ADIN1300_PHY_CTRL1);
 595        if (reg < 0)
 596                return reg;
 597
 598        if (mdix_en)
 599                reg |= ADIN1300_MAN_MDIX_EN;
 600        else
 601                reg &= ~ADIN1300_MAN_MDIX_EN;
 602
 603        if (auto_en)
 604                reg |= ADIN1300_AUTO_MDI_EN;
 605        else
 606                reg &= ~ADIN1300_AUTO_MDI_EN;
 607
 608        return phy_write(phydev, ADIN1300_PHY_CTRL1, reg);
 609}
 610
 611static int adin_config_aneg(struct phy_device *phydev)
 612{
 613        int ret;
 614
 615        ret = phy_clear_bits(phydev, ADIN1300_PHY_CTRL1, ADIN1300_DIAG_CLK_EN);
 616        if (ret < 0)
 617                return ret;
 618
 619        ret = phy_set_bits(phydev, ADIN1300_PHY_CTRL3, ADIN1300_LINKING_EN);
 620        if (ret < 0)
 621                return ret;
 622
 623        ret = adin_config_mdix(phydev);
 624        if (ret)
 625                return ret;
 626
 627        return genphy_config_aneg(phydev);
 628}
 629
 630static int adin_mdix_update(struct phy_device *phydev)
 631{
 632        bool auto_en, mdix_en;
 633        bool swapped;
 634        int reg;
 635
 636        reg = phy_read(phydev, ADIN1300_PHY_CTRL1);
 637        if (reg < 0)
 638                return reg;
 639
 640        auto_en = !!(reg & ADIN1300_AUTO_MDI_EN);
 641        mdix_en = !!(reg & ADIN1300_MAN_MDIX_EN);
 642
 643        /* If MDI/MDIX is forced, just read it from the control reg */
 644        if (!auto_en) {
 645                if (mdix_en)
 646                        phydev->mdix = ETH_TP_MDI_X;
 647                else
 648                        phydev->mdix = ETH_TP_MDI;
 649                return 0;
 650        }
 651
 652        /**
 653         * Otherwise, we need to deduce it from the PHY status2 reg.
 654         * When Auto-MDI is enabled, the ADIN1300_MAN_MDIX_EN bit implies
 655         * a preference for MDIX when it is set.
 656         */
 657        reg = phy_read(phydev, ADIN1300_PHY_STATUS1);
 658        if (reg < 0)
 659                return reg;
 660
 661        swapped = !!(reg & ADIN1300_PAIR_01_SWAP);
 662
 663        if (mdix_en != swapped)
 664                phydev->mdix = ETH_TP_MDI_X;
 665        else
 666                phydev->mdix = ETH_TP_MDI;
 667
 668        return 0;
 669}
 670
 671static int adin_read_status(struct phy_device *phydev)
 672{
 673        int ret;
 674
 675        ret = adin_mdix_update(phydev);
 676        if (ret < 0)
 677                return ret;
 678
 679        return genphy_read_status(phydev);
 680}
 681
 682static int adin_soft_reset(struct phy_device *phydev)
 683{
 684        int rc;
 685
 686        /* The reset bit is self-clearing, set it and wait */
 687        rc = phy_set_bits_mmd(phydev, MDIO_MMD_VEND1,
 688                              ADIN1300_GE_SOFT_RESET_REG,
 689                              ADIN1300_GE_SOFT_RESET);
 690        if (rc < 0)
 691                return rc;
 692
 693        msleep(20);
 694
 695        /* If we get a read error something may be wrong */
 696        rc = phy_read_mmd(phydev, MDIO_MMD_VEND1,
 697                          ADIN1300_GE_SOFT_RESET_REG);
 698
 699        return rc < 0 ? rc : 0;
 700}
 701
 702static int adin_get_sset_count(struct phy_device *phydev)
 703{
 704        return ARRAY_SIZE(adin_hw_stats);
 705}
 706
 707static void adin_get_strings(struct phy_device *phydev, u8 *data)
 708{
 709        int i;
 710
 711        for (i = 0; i < ARRAY_SIZE(adin_hw_stats); i++) {
 712                strlcpy(&data[i * ETH_GSTRING_LEN],
 713                        adin_hw_stats[i].string, ETH_GSTRING_LEN);
 714        }
 715}
 716
 717static int adin_read_mmd_stat_regs(struct phy_device *phydev,
 718                                   const struct adin_hw_stat *stat,
 719                                   u32 *val)
 720{
 721        int ret;
 722
 723        ret = phy_read_mmd(phydev, MDIO_MMD_VEND1, stat->reg1);
 724        if (ret < 0)
 725                return ret;
 726
 727        *val = (ret & 0xffff);
 728
 729        if (stat->reg2 == 0)
 730                return 0;
 731
 732        ret = phy_read_mmd(phydev, MDIO_MMD_VEND1, stat->reg2);
 733        if (ret < 0)
 734                return ret;
 735
 736        *val <<= 16;
 737        *val |= (ret & 0xffff);
 738
 739        return 0;
 740}
 741
 742static u64 adin_get_stat(struct phy_device *phydev, int i)
 743{
 744        const struct adin_hw_stat *stat = &adin_hw_stats[i];
 745        struct adin_priv *priv = phydev->priv;
 746        u32 val;
 747        int ret;
 748
 749        if (stat->reg1 > 0x1f) {
 750                ret = adin_read_mmd_stat_regs(phydev, stat, &val);
 751                if (ret < 0)
 752                        return (u64)(~0);
 753        } else {
 754                ret = phy_read(phydev, stat->reg1);
 755                if (ret < 0)
 756                        return (u64)(~0);
 757                val = (ret & 0xffff);
 758        }
 759
 760        priv->stats[i] += val;
 761
 762        return priv->stats[i];
 763}
 764
 765static void adin_get_stats(struct phy_device *phydev,
 766                           struct ethtool_stats *stats, u64 *data)
 767{
 768        int i, rc;
 769
 770        /* latch copies of all the frame-checker counters */
 771        rc = phy_read(phydev, ADIN1300_RX_ERR_CNT);
 772        if (rc < 0)
 773                return;
 774
 775        for (i = 0; i < ARRAY_SIZE(adin_hw_stats); i++)
 776                data[i] = adin_get_stat(phydev, i);
 777}
 778
 779static int adin_probe(struct phy_device *phydev)
 780{
 781        struct device *dev = &phydev->mdio.dev;
 782        struct adin_priv *priv;
 783
 784        priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
 785        if (!priv)
 786                return -ENOMEM;
 787
 788        phydev->priv = priv;
 789
 790        return 0;
 791}
 792
 793static int adin_cable_test_start(struct phy_device *phydev)
 794{
 795        int ret;
 796
 797        ret = phy_clear_bits(phydev, ADIN1300_PHY_CTRL3, ADIN1300_LINKING_EN);
 798        if (ret < 0)
 799                return ret;
 800
 801        ret = phy_clear_bits(phydev, ADIN1300_PHY_CTRL1, ADIN1300_DIAG_CLK_EN);
 802        if (ret < 0)
 803                return ret;
 804
 805        /* wait a bit for the clock to stabilize */
 806        msleep(50);
 807
 808        return phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, ADIN1300_CDIAG_RUN,
 809                                ADIN1300_CDIAG_RUN_EN);
 810}
 811
 812static int adin_cable_test_report_trans(int result)
 813{
 814        int mask;
 815
 816        if (result & ADIN1300_CDIAG_RSLT_GOOD)
 817                return ETHTOOL_A_CABLE_RESULT_CODE_OK;
 818        if (result & ADIN1300_CDIAG_RSLT_OPEN)
 819                return ETHTOOL_A_CABLE_RESULT_CODE_OPEN;
 820
 821        /* short with other pairs */
 822        mask = ADIN1300_CDIAG_RSLT_XSHRT3 |
 823               ADIN1300_CDIAG_RSLT_XSHRT2 |
 824               ADIN1300_CDIAG_RSLT_XSHRT1;
 825        if (result & mask)
 826                return ETHTOOL_A_CABLE_RESULT_CODE_CROSS_SHORT;
 827
 828        if (result & ADIN1300_CDIAG_RSLT_SHRT)
 829                return ETHTOOL_A_CABLE_RESULT_CODE_SAME_SHORT;
 830
 831        return ETHTOOL_A_CABLE_RESULT_CODE_UNSPEC;
 832}
 833
 834static int adin_cable_test_report_pair(struct phy_device *phydev,
 835                                       unsigned int pair)
 836{
 837        int fault_rslt;
 838        int ret;
 839
 840        ret = phy_read_mmd(phydev, MDIO_MMD_VEND1,
 841                           ADIN1300_CDIAG_DTLD_RSLTS(pair));
 842        if (ret < 0)
 843                return ret;
 844
 845        fault_rslt = adin_cable_test_report_trans(ret);
 846
 847        ret = ethnl_cable_test_result(phydev, pair, fault_rslt);
 848        if (ret < 0)
 849                return ret;
 850
 851        ret = phy_read_mmd(phydev, MDIO_MMD_VEND1,
 852                           ADIN1300_CDIAG_FLT_DIST(pair));
 853        if (ret < 0)
 854                return ret;
 855
 856        switch (fault_rslt) {
 857        case ETHTOOL_A_CABLE_RESULT_CODE_OPEN:
 858        case ETHTOOL_A_CABLE_RESULT_CODE_SAME_SHORT:
 859        case ETHTOOL_A_CABLE_RESULT_CODE_CROSS_SHORT:
 860                return ethnl_cable_test_fault_length(phydev, pair, ret * 100);
 861        default:
 862                return  0;
 863        }
 864}
 865
 866static int adin_cable_test_report(struct phy_device *phydev)
 867{
 868        unsigned int pair;
 869        int ret;
 870
 871        for (pair = ETHTOOL_A_CABLE_PAIR_A; pair <= ETHTOOL_A_CABLE_PAIR_D; pair++) {
 872                ret = adin_cable_test_report_pair(phydev, pair);
 873                if (ret < 0)
 874                        return ret;
 875        }
 876
 877        return 0;
 878}
 879
 880static int adin_cable_test_get_status(struct phy_device *phydev,
 881                                      bool *finished)
 882{
 883        int ret;
 884
 885        *finished = false;
 886
 887        ret = phy_read_mmd(phydev, MDIO_MMD_VEND1, ADIN1300_CDIAG_RUN);
 888        if (ret < 0)
 889                return ret;
 890
 891        if (ret & ADIN1300_CDIAG_RUN_EN)
 892                return 0;
 893
 894        *finished = true;
 895
 896        return adin_cable_test_report(phydev);
 897}
 898
 899static struct phy_driver adin_driver[] = {
 900        {
 901                PHY_ID_MATCH_MODEL(PHY_ID_ADIN1200),
 902                .name           = "ADIN1200",
 903                .flags          = PHY_POLL_CABLE_TEST,
 904                .probe          = adin_probe,
 905                .config_init    = adin_config_init,
 906                .soft_reset     = adin_soft_reset,
 907                .config_aneg    = adin_config_aneg,
 908                .read_status    = adin_read_status,
 909                .get_tunable    = adin_get_tunable,
 910                .set_tunable    = adin_set_tunable,
 911                .config_intr    = adin_phy_config_intr,
 912                .handle_interrupt = adin_phy_handle_interrupt,
 913                .get_sset_count = adin_get_sset_count,
 914                .get_strings    = adin_get_strings,
 915                .get_stats      = adin_get_stats,
 916                .resume         = genphy_resume,
 917                .suspend        = genphy_suspend,
 918                .read_mmd       = adin_read_mmd,
 919                .write_mmd      = adin_write_mmd,
 920                .cable_test_start       = adin_cable_test_start,
 921                .cable_test_get_status  = adin_cable_test_get_status,
 922        },
 923        {
 924                PHY_ID_MATCH_MODEL(PHY_ID_ADIN1300),
 925                .name           = "ADIN1300",
 926                .flags          = PHY_POLL_CABLE_TEST,
 927                .probe          = adin_probe,
 928                .config_init    = adin_config_init,
 929                .soft_reset     = adin_soft_reset,
 930                .config_aneg    = adin_config_aneg,
 931                .read_status    = adin_read_status,
 932                .get_tunable    = adin_get_tunable,
 933                .set_tunable    = adin_set_tunable,
 934                .config_intr    = adin_phy_config_intr,
 935                .handle_interrupt = adin_phy_handle_interrupt,
 936                .get_sset_count = adin_get_sset_count,
 937                .get_strings    = adin_get_strings,
 938                .get_stats      = adin_get_stats,
 939                .resume         = genphy_resume,
 940                .suspend        = genphy_suspend,
 941                .read_mmd       = adin_read_mmd,
 942                .write_mmd      = adin_write_mmd,
 943                .cable_test_start       = adin_cable_test_start,
 944                .cable_test_get_status  = adin_cable_test_get_status,
 945        },
 946};
 947
 948module_phy_driver(adin_driver);
 949
 950static struct mdio_device_id __maybe_unused adin_tbl[] = {
 951        { PHY_ID_MATCH_MODEL(PHY_ID_ADIN1200) },
 952        { PHY_ID_MATCH_MODEL(PHY_ID_ADIN1300) },
 953        { }
 954};
 955
 956MODULE_DEVICE_TABLE(mdio, adin_tbl);
 957MODULE_DESCRIPTION("Analog Devices Industrial Ethernet PHY driver");
 958MODULE_LICENSE("GPL");
 959