linux/drivers/net/phy/sfp-bus.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2#include <linux/export.h>
   3#include <linux/kref.h>
   4#include <linux/list.h>
   5#include <linux/mutex.h>
   6#include <linux/phylink.h>
   7#include <linux/property.h>
   8#include <linux/rtnetlink.h>
   9#include <linux/slab.h>
  10
  11#include "sfp.h"
  12
  13struct sfp_quirk {
  14        const char *vendor;
  15        const char *part;
  16        void (*modes)(const struct sfp_eeprom_id *id, unsigned long *modes);
  17};
  18
  19/**
  20 * struct sfp_bus - internal representation of a sfp bus
  21 */
  22struct sfp_bus {
  23        /* private: */
  24        struct kref kref;
  25        struct list_head node;
  26        struct fwnode_handle *fwnode;
  27
  28        const struct sfp_socket_ops *socket_ops;
  29        struct device *sfp_dev;
  30        struct sfp *sfp;
  31        const struct sfp_quirk *sfp_quirk;
  32
  33        const struct sfp_upstream_ops *upstream_ops;
  34        void *upstream;
  35        struct phy_device *phydev;
  36
  37        bool registered;
  38        bool started;
  39};
  40
  41static void sfp_quirk_2500basex(const struct sfp_eeprom_id *id,
  42                                unsigned long *modes)
  43{
  44        phylink_set(modes, 2500baseX_Full);
  45}
  46
  47static void sfp_quirk_ubnt_uf_instant(const struct sfp_eeprom_id *id,
  48                                      unsigned long *modes)
  49{
  50        /* Ubiquiti U-Fiber Instant module claims that support all transceiver
  51         * types including 10G Ethernet which is not truth. So clear all claimed
  52         * modes and set only one mode which module supports: 1000baseX_Full.
  53         */
  54        phylink_zero(modes);
  55        phylink_set(modes, 1000baseX_Full);
  56}
  57
  58static const struct sfp_quirk sfp_quirks[] = {
  59        {
  60                // Alcatel Lucent G-010S-P can operate at 2500base-X, but
  61                // incorrectly report 2500MBd NRZ in their EEPROM
  62                .vendor = "ALCATELLUCENT",
  63                .part = "G010SP",
  64                .modes = sfp_quirk_2500basex,
  65        }, {
  66                // Alcatel Lucent G-010S-A can operate at 2500base-X, but
  67                // report 3.2GBd NRZ in their EEPROM
  68                .vendor = "ALCATELLUCENT",
  69                .part = "3FE46541AA",
  70                .modes = sfp_quirk_2500basex,
  71        }, {
  72                // Huawei MA5671A can operate at 2500base-X, but report 1.2GBd
  73                // NRZ in their EEPROM
  74                .vendor = "HUAWEI",
  75                .part = "MA5671A",
  76                .modes = sfp_quirk_2500basex,
  77        }, {
  78                .vendor = "UBNT",
  79                .part = "UF-INSTANT",
  80                .modes = sfp_quirk_ubnt_uf_instant,
  81        },
  82};
  83
  84static size_t sfp_strlen(const char *str, size_t maxlen)
  85{
  86        size_t size, i;
  87
  88        /* Trailing characters should be filled with space chars */
  89        for (i = 0, size = 0; i < maxlen; i++)
  90                if (str[i] != ' ')
  91                        size = i + 1;
  92
  93        return size;
  94}
  95
  96static bool sfp_match(const char *qs, const char *str, size_t len)
  97{
  98        if (!qs)
  99                return true;
 100        if (strlen(qs) != len)
 101                return false;
 102        return !strncmp(qs, str, len);
 103}
 104
 105static const struct sfp_quirk *sfp_lookup_quirk(const struct sfp_eeprom_id *id)
 106{
 107        const struct sfp_quirk *q;
 108        unsigned int i;
 109        size_t vs, ps;
 110
 111        vs = sfp_strlen(id->base.vendor_name, ARRAY_SIZE(id->base.vendor_name));
 112        ps = sfp_strlen(id->base.vendor_pn, ARRAY_SIZE(id->base.vendor_pn));
 113
 114        for (i = 0, q = sfp_quirks; i < ARRAY_SIZE(sfp_quirks); i++, q++)
 115                if (sfp_match(q->vendor, id->base.vendor_name, vs) &&
 116                    sfp_match(q->part, id->base.vendor_pn, ps))
 117                        return q;
 118
 119        return NULL;
 120}
 121
 122/**
 123 * sfp_parse_port() - Parse the EEPROM base ID, setting the port type
 124 * @bus: a pointer to the &struct sfp_bus structure for the sfp module
 125 * @id: a pointer to the module's &struct sfp_eeprom_id
 126 * @support: optional pointer to an array of unsigned long for the
 127 *   ethtool support mask
 128 *
 129 * Parse the EEPROM identification given in @id, and return one of
 130 * %PORT_TP, %PORT_FIBRE or %PORT_OTHER. If @support is non-%NULL,
 131 * also set the ethtool %ETHTOOL_LINK_MODE_xxx_BIT corresponding with
 132 * the connector type.
 133 *
 134 * If the port type is not known, returns %PORT_OTHER.
 135 */
 136int sfp_parse_port(struct sfp_bus *bus, const struct sfp_eeprom_id *id,
 137                   unsigned long *support)
 138{
 139        int port;
 140
 141        /* port is the physical connector, set this from the connector field. */
 142        switch (id->base.connector) {
 143        case SFF8024_CONNECTOR_SC:
 144        case SFF8024_CONNECTOR_FIBERJACK:
 145        case SFF8024_CONNECTOR_LC:
 146        case SFF8024_CONNECTOR_MT_RJ:
 147        case SFF8024_CONNECTOR_MU:
 148        case SFF8024_CONNECTOR_OPTICAL_PIGTAIL:
 149        case SFF8024_CONNECTOR_MPO_1X12:
 150        case SFF8024_CONNECTOR_MPO_2X16:
 151                port = PORT_FIBRE;
 152                break;
 153
 154        case SFF8024_CONNECTOR_RJ45:
 155                port = PORT_TP;
 156                break;
 157
 158        case SFF8024_CONNECTOR_COPPER_PIGTAIL:
 159                port = PORT_DA;
 160                break;
 161
 162        case SFF8024_CONNECTOR_UNSPEC:
 163                if (id->base.e1000_base_t) {
 164                        port = PORT_TP;
 165                        break;
 166                }
 167                fallthrough;
 168        case SFF8024_CONNECTOR_SG: /* guess */
 169        case SFF8024_CONNECTOR_HSSDC_II:
 170        case SFF8024_CONNECTOR_NOSEPARATE:
 171        case SFF8024_CONNECTOR_MXC_2X16:
 172                port = PORT_OTHER;
 173                break;
 174        default:
 175                dev_warn(bus->sfp_dev, "SFP: unknown connector id 0x%02x\n",
 176                         id->base.connector);
 177                port = PORT_OTHER;
 178                break;
 179        }
 180
 181        if (support) {
 182                switch (port) {
 183                case PORT_FIBRE:
 184                        phylink_set(support, FIBRE);
 185                        break;
 186
 187                case PORT_TP:
 188                        phylink_set(support, TP);
 189                        break;
 190                }
 191        }
 192
 193        return port;
 194}
 195EXPORT_SYMBOL_GPL(sfp_parse_port);
 196
 197/**
 198 * sfp_may_have_phy() - indicate whether the module may have a PHY
 199 * @bus: a pointer to the &struct sfp_bus structure for the sfp module
 200 * @id: a pointer to the module's &struct sfp_eeprom_id
 201 *
 202 * Parse the EEPROM identification given in @id, and return whether
 203 * this module may have a PHY.
 204 */
 205bool sfp_may_have_phy(struct sfp_bus *bus, const struct sfp_eeprom_id *id)
 206{
 207        if (id->base.e1000_base_t)
 208                return true;
 209
 210        if (id->base.phys_id != SFF8024_ID_DWDM_SFP) {
 211                switch (id->base.extended_cc) {
 212                case SFF8024_ECC_10GBASE_T_SFI:
 213                case SFF8024_ECC_10GBASE_T_SR:
 214                case SFF8024_ECC_5GBASE_T:
 215                case SFF8024_ECC_2_5GBASE_T:
 216                        return true;
 217                }
 218        }
 219
 220        return false;
 221}
 222EXPORT_SYMBOL_GPL(sfp_may_have_phy);
 223
 224/**
 225 * sfp_parse_support() - Parse the eeprom id for supported link modes
 226 * @bus: a pointer to the &struct sfp_bus structure for the sfp module
 227 * @id: a pointer to the module's &struct sfp_eeprom_id
 228 * @support: pointer to an array of unsigned long for the ethtool support mask
 229 *
 230 * Parse the EEPROM identification information and derive the supported
 231 * ethtool link modes for the module.
 232 */
 233void sfp_parse_support(struct sfp_bus *bus, const struct sfp_eeprom_id *id,
 234                       unsigned long *support)
 235{
 236        unsigned int br_min, br_nom, br_max;
 237        __ETHTOOL_DECLARE_LINK_MODE_MASK(modes) = { 0, };
 238
 239        /* Decode the bitrate information to MBd */
 240        br_min = br_nom = br_max = 0;
 241        if (id->base.br_nominal) {
 242                if (id->base.br_nominal != 255) {
 243                        br_nom = id->base.br_nominal * 100;
 244                        br_min = br_nom - id->base.br_nominal * id->ext.br_min;
 245                        br_max = br_nom + id->base.br_nominal * id->ext.br_max;
 246                } else if (id->ext.br_max) {
 247                        br_nom = 250 * id->ext.br_max;
 248                        br_max = br_nom + br_nom * id->ext.br_min / 100;
 249                        br_min = br_nom - br_nom * id->ext.br_min / 100;
 250                }
 251
 252                /* When using passive cables, in case neither BR,min nor BR,max
 253                 * are specified, set br_min to 0 as the nominal value is then
 254                 * used as the maximum.
 255                 */
 256                if (br_min == br_max && id->base.sfp_ct_passive)
 257                        br_min = 0;
 258        }
 259
 260        /* Set ethtool support from the compliance fields. */
 261        if (id->base.e10g_base_sr)
 262                phylink_set(modes, 10000baseSR_Full);
 263        if (id->base.e10g_base_lr)
 264                phylink_set(modes, 10000baseLR_Full);
 265        if (id->base.e10g_base_lrm)
 266                phylink_set(modes, 10000baseLRM_Full);
 267        if (id->base.e10g_base_er)
 268                phylink_set(modes, 10000baseER_Full);
 269        if (id->base.e1000_base_sx ||
 270            id->base.e1000_base_lx ||
 271            id->base.e1000_base_cx)
 272                phylink_set(modes, 1000baseX_Full);
 273        if (id->base.e1000_base_t) {
 274                phylink_set(modes, 1000baseT_Half);
 275                phylink_set(modes, 1000baseT_Full);
 276        }
 277
 278        /* 1000Base-PX or 1000Base-BX10 */
 279        if ((id->base.e_base_px || id->base.e_base_bx10) &&
 280            br_min <= 1300 && br_max >= 1200)
 281                phylink_set(modes, 1000baseX_Full);
 282
 283        /* 100Base-FX, 100Base-LX, 100Base-PX, 100Base-BX10 */
 284        if (id->base.e100_base_fx || id->base.e100_base_lx)
 285                phylink_set(modes, 100baseFX_Full);
 286        if ((id->base.e_base_px || id->base.e_base_bx10) && br_nom == 100)
 287                phylink_set(modes, 100baseFX_Full);
 288
 289        /* For active or passive cables, select the link modes
 290         * based on the bit rates and the cable compliance bytes.
 291         */
 292        if ((id->base.sfp_ct_passive || id->base.sfp_ct_active) && br_nom) {
 293                /* This may look odd, but some manufacturers use 12000MBd */
 294                if (br_min <= 12000 && br_max >= 10300)
 295                        phylink_set(modes, 10000baseCR_Full);
 296                if (br_min <= 3200 && br_max >= 3100)
 297                        phylink_set(modes, 2500baseX_Full);
 298                if (br_min <= 1300 && br_max >= 1200)
 299                        phylink_set(modes, 1000baseX_Full);
 300        }
 301        if (id->base.sfp_ct_passive) {
 302                if (id->base.passive.sff8431_app_e)
 303                        phylink_set(modes, 10000baseCR_Full);
 304        }
 305        if (id->base.sfp_ct_active) {
 306                if (id->base.active.sff8431_app_e ||
 307                    id->base.active.sff8431_lim) {
 308                        phylink_set(modes, 10000baseCR_Full);
 309                }
 310        }
 311
 312        switch (id->base.extended_cc) {
 313        case SFF8024_ECC_UNSPEC:
 314                break;
 315        case SFF8024_ECC_100GBASE_SR4_25GBASE_SR:
 316                phylink_set(modes, 100000baseSR4_Full);
 317                phylink_set(modes, 25000baseSR_Full);
 318                break;
 319        case SFF8024_ECC_100GBASE_LR4_25GBASE_LR:
 320        case SFF8024_ECC_100GBASE_ER4_25GBASE_ER:
 321                phylink_set(modes, 100000baseLR4_ER4_Full);
 322                break;
 323        case SFF8024_ECC_100GBASE_CR4:
 324                phylink_set(modes, 100000baseCR4_Full);
 325                fallthrough;
 326        case SFF8024_ECC_25GBASE_CR_S:
 327        case SFF8024_ECC_25GBASE_CR_N:
 328                phylink_set(modes, 25000baseCR_Full);
 329                break;
 330        case SFF8024_ECC_10GBASE_T_SFI:
 331        case SFF8024_ECC_10GBASE_T_SR:
 332                phylink_set(modes, 10000baseT_Full);
 333                break;
 334        case SFF8024_ECC_5GBASE_T:
 335                phylink_set(modes, 5000baseT_Full);
 336                break;
 337        case SFF8024_ECC_2_5GBASE_T:
 338                phylink_set(modes, 2500baseT_Full);
 339                break;
 340        default:
 341                dev_warn(bus->sfp_dev,
 342                         "Unknown/unsupported extended compliance code: 0x%02x\n",
 343                         id->base.extended_cc);
 344                break;
 345        }
 346
 347        /* For fibre channel SFP, derive possible BaseX modes */
 348        if (id->base.fc_speed_100 ||
 349            id->base.fc_speed_200 ||
 350            id->base.fc_speed_400) {
 351                if (id->base.br_nominal >= 31)
 352                        phylink_set(modes, 2500baseX_Full);
 353                if (id->base.br_nominal >= 12)
 354                        phylink_set(modes, 1000baseX_Full);
 355        }
 356
 357        /* If we haven't discovered any modes that this module supports, try
 358         * the bitrate to determine supported modes. Some BiDi modules (eg,
 359         * 1310nm/1550nm) are not 1000BASE-BX compliant due to the differing
 360         * wavelengths, so do not set any transceiver bits.
 361         *
 362         * Do the same for modules supporting 2500BASE-X. Note that some
 363         * modules use 2500Mbaud rather than 3100 or 3200Mbaud for
 364         * 2500BASE-X, so we allow some slack here.
 365         */
 366        if (bitmap_empty(modes, __ETHTOOL_LINK_MODE_MASK_NBITS) && br_nom) {
 367                if (br_min <= 1300 && br_max >= 1200)
 368                        phylink_set(modes, 1000baseX_Full);
 369                if (br_min <= 3200 && br_max >= 2500)
 370                        phylink_set(modes, 2500baseX_Full);
 371        }
 372
 373        if (bus->sfp_quirk)
 374                bus->sfp_quirk->modes(id, modes);
 375
 376        bitmap_or(support, support, modes, __ETHTOOL_LINK_MODE_MASK_NBITS);
 377
 378        phylink_set(support, Autoneg);
 379        phylink_set(support, Pause);
 380        phylink_set(support, Asym_Pause);
 381}
 382EXPORT_SYMBOL_GPL(sfp_parse_support);
 383
 384/**
 385 * sfp_select_interface() - Select appropriate phy_interface_t mode
 386 * @bus: a pointer to the &struct sfp_bus structure for the sfp module
 387 * @link_modes: ethtool link modes mask
 388 *
 389 * Derive the phy_interface_t mode for the SFP module from the link
 390 * modes mask.
 391 */
 392phy_interface_t sfp_select_interface(struct sfp_bus *bus,
 393                                     unsigned long *link_modes)
 394{
 395        if (phylink_test(link_modes, 10000baseCR_Full) ||
 396            phylink_test(link_modes, 10000baseSR_Full) ||
 397            phylink_test(link_modes, 10000baseLR_Full) ||
 398            phylink_test(link_modes, 10000baseLRM_Full) ||
 399            phylink_test(link_modes, 10000baseER_Full) ||
 400            phylink_test(link_modes, 10000baseT_Full))
 401                return PHY_INTERFACE_MODE_10GBASER;
 402
 403        if (phylink_test(link_modes, 5000baseT_Full))
 404                return PHY_INTERFACE_MODE_5GBASER;
 405
 406        if (phylink_test(link_modes, 2500baseX_Full))
 407                return PHY_INTERFACE_MODE_2500BASEX;
 408
 409        if (phylink_test(link_modes, 1000baseT_Half) ||
 410            phylink_test(link_modes, 1000baseT_Full))
 411                return PHY_INTERFACE_MODE_SGMII;
 412
 413        if (phylink_test(link_modes, 1000baseX_Full))
 414                return PHY_INTERFACE_MODE_1000BASEX;
 415
 416        if (phylink_test(link_modes, 100baseFX_Full))
 417                return PHY_INTERFACE_MODE_100BASEX;
 418
 419        dev_warn(bus->sfp_dev, "Unable to ascertain link mode\n");
 420
 421        return PHY_INTERFACE_MODE_NA;
 422}
 423EXPORT_SYMBOL_GPL(sfp_select_interface);
 424
 425static LIST_HEAD(sfp_buses);
 426static DEFINE_MUTEX(sfp_mutex);
 427
 428static const struct sfp_upstream_ops *sfp_get_upstream_ops(struct sfp_bus *bus)
 429{
 430        return bus->registered ? bus->upstream_ops : NULL;
 431}
 432
 433static struct sfp_bus *sfp_bus_get(struct fwnode_handle *fwnode)
 434{
 435        struct sfp_bus *sfp, *new, *found = NULL;
 436
 437        new = kzalloc(sizeof(*new), GFP_KERNEL);
 438
 439        mutex_lock(&sfp_mutex);
 440
 441        list_for_each_entry(sfp, &sfp_buses, node) {
 442                if (sfp->fwnode == fwnode) {
 443                        kref_get(&sfp->kref);
 444                        found = sfp;
 445                        break;
 446                }
 447        }
 448
 449        if (!found && new) {
 450                kref_init(&new->kref);
 451                new->fwnode = fwnode;
 452                list_add(&new->node, &sfp_buses);
 453                found = new;
 454                new = NULL;
 455        }
 456
 457        mutex_unlock(&sfp_mutex);
 458
 459        kfree(new);
 460
 461        return found;
 462}
 463
 464static void sfp_bus_release(struct kref *kref)
 465{
 466        struct sfp_bus *bus = container_of(kref, struct sfp_bus, kref);
 467
 468        list_del(&bus->node);
 469        mutex_unlock(&sfp_mutex);
 470        kfree(bus);
 471}
 472
 473/**
 474 * sfp_bus_put() - put a reference on the &struct sfp_bus
 475 * @bus: the &struct sfp_bus found via sfp_bus_find_fwnode()
 476 *
 477 * Put a reference on the &struct sfp_bus and free the underlying structure
 478 * if this was the last reference.
 479 */
 480void sfp_bus_put(struct sfp_bus *bus)
 481{
 482        if (bus)
 483                kref_put_mutex(&bus->kref, sfp_bus_release, &sfp_mutex);
 484}
 485EXPORT_SYMBOL_GPL(sfp_bus_put);
 486
 487static int sfp_register_bus(struct sfp_bus *bus)
 488{
 489        const struct sfp_upstream_ops *ops = bus->upstream_ops;
 490        int ret;
 491
 492        if (ops) {
 493                if (ops->link_down)
 494                        ops->link_down(bus->upstream);
 495                if (ops->connect_phy && bus->phydev) {
 496                        ret = ops->connect_phy(bus->upstream, bus->phydev);
 497                        if (ret)
 498                                return ret;
 499                }
 500        }
 501        bus->registered = true;
 502        bus->socket_ops->attach(bus->sfp);
 503        if (bus->started)
 504                bus->socket_ops->start(bus->sfp);
 505        bus->upstream_ops->attach(bus->upstream, bus);
 506        return 0;
 507}
 508
 509static void sfp_unregister_bus(struct sfp_bus *bus)
 510{
 511        const struct sfp_upstream_ops *ops = bus->upstream_ops;
 512
 513        if (bus->registered) {
 514                bus->upstream_ops->detach(bus->upstream, bus);
 515                if (bus->started)
 516                        bus->socket_ops->stop(bus->sfp);
 517                bus->socket_ops->detach(bus->sfp);
 518                if (bus->phydev && ops && ops->disconnect_phy)
 519                        ops->disconnect_phy(bus->upstream);
 520        }
 521        bus->registered = false;
 522}
 523
 524/**
 525 * sfp_get_module_info() - Get the ethtool_modinfo for a SFP module
 526 * @bus: a pointer to the &struct sfp_bus structure for the sfp module
 527 * @modinfo: a &struct ethtool_modinfo
 528 *
 529 * Fill in the type and eeprom_len parameters in @modinfo for a module on
 530 * the sfp bus specified by @bus.
 531 *
 532 * Returns 0 on success or a negative errno number.
 533 */
 534int sfp_get_module_info(struct sfp_bus *bus, struct ethtool_modinfo *modinfo)
 535{
 536        return bus->socket_ops->module_info(bus->sfp, modinfo);
 537}
 538EXPORT_SYMBOL_GPL(sfp_get_module_info);
 539
 540/**
 541 * sfp_get_module_eeprom() - Read the SFP module EEPROM
 542 * @bus: a pointer to the &struct sfp_bus structure for the sfp module
 543 * @ee: a &struct ethtool_eeprom
 544 * @data: buffer to contain the EEPROM data (must be at least @ee->len bytes)
 545 *
 546 * Read the EEPROM as specified by the supplied @ee. See the documentation
 547 * for &struct ethtool_eeprom for the region to be read.
 548 *
 549 * Returns 0 on success or a negative errno number.
 550 */
 551int sfp_get_module_eeprom(struct sfp_bus *bus, struct ethtool_eeprom *ee,
 552                          u8 *data)
 553{
 554        return bus->socket_ops->module_eeprom(bus->sfp, ee, data);
 555}
 556EXPORT_SYMBOL_GPL(sfp_get_module_eeprom);
 557
 558/**
 559 * sfp_get_module_eeprom_by_page() - Read a page from the SFP module EEPROM
 560 * @bus: a pointer to the &struct sfp_bus structure for the sfp module
 561 * @page: a &struct ethtool_module_eeprom
 562 * @extack: extack for reporting problems
 563 *
 564 * Read an EEPROM page as specified by the supplied @page. See the
 565 * documentation for &struct ethtool_module_eeprom for the page to be read.
 566 *
 567 * Returns 0 on success or a negative errno number. More error
 568 * information might be provided via extack
 569 */
 570int sfp_get_module_eeprom_by_page(struct sfp_bus *bus,
 571                                  const struct ethtool_module_eeprom *page,
 572                                  struct netlink_ext_ack *extack)
 573{
 574        return bus->socket_ops->module_eeprom_by_page(bus->sfp, page, extack);
 575}
 576EXPORT_SYMBOL_GPL(sfp_get_module_eeprom_by_page);
 577
 578/**
 579 * sfp_upstream_start() - Inform the SFP that the network device is up
 580 * @bus: a pointer to the &struct sfp_bus structure for the sfp module
 581 *
 582 * Inform the SFP socket that the network device is now up, so that the
 583 * module can be enabled by allowing TX_DISABLE to be deasserted. This
 584 * should be called from the network device driver's &struct net_device_ops
 585 * ndo_open() method.
 586 */
 587void sfp_upstream_start(struct sfp_bus *bus)
 588{
 589        if (bus->registered)
 590                bus->socket_ops->start(bus->sfp);
 591        bus->started = true;
 592}
 593EXPORT_SYMBOL_GPL(sfp_upstream_start);
 594
 595/**
 596 * sfp_upstream_stop() - Inform the SFP that the network device is down
 597 * @bus: a pointer to the &struct sfp_bus structure for the sfp module
 598 *
 599 * Inform the SFP socket that the network device is now up, so that the
 600 * module can be disabled by asserting TX_DISABLE, disabling the laser
 601 * in optical modules. This should be called from the network device
 602 * driver's &struct net_device_ops ndo_stop() method.
 603 */
 604void sfp_upstream_stop(struct sfp_bus *bus)
 605{
 606        if (bus->registered)
 607                bus->socket_ops->stop(bus->sfp);
 608        bus->started = false;
 609}
 610EXPORT_SYMBOL_GPL(sfp_upstream_stop);
 611
 612static void sfp_upstream_clear(struct sfp_bus *bus)
 613{
 614        bus->upstream_ops = NULL;
 615        bus->upstream = NULL;
 616}
 617
 618/**
 619 * sfp_bus_find_fwnode() - parse and locate the SFP bus from fwnode
 620 * @fwnode: firmware node for the parent device (MAC or PHY)
 621 *
 622 * Parse the parent device's firmware node for a SFP bus, and locate
 623 * the sfp_bus structure, incrementing its reference count.  This must
 624 * be put via sfp_bus_put() when done.
 625 *
 626 * Returns:
 627 *          - on success, a pointer to the sfp_bus structure,
 628 *          - %NULL if no SFP is specified,
 629 *          - on failure, an error pointer value:
 630 *
 631 *            - corresponding to the errors detailed for
 632 *              fwnode_property_get_reference_args().
 633 *            - %-ENOMEM if we failed to allocate the bus.
 634 *            - an error from the upstream's connect_phy() method.
 635 */
 636struct sfp_bus *sfp_bus_find_fwnode(struct fwnode_handle *fwnode)
 637{
 638        struct fwnode_reference_args ref;
 639        struct sfp_bus *bus;
 640        int ret;
 641
 642        ret = fwnode_property_get_reference_args(fwnode, "sfp", NULL,
 643                                                 0, 0, &ref);
 644        if (ret == -ENOENT)
 645                return NULL;
 646        else if (ret < 0)
 647                return ERR_PTR(ret);
 648
 649        bus = sfp_bus_get(ref.fwnode);
 650        fwnode_handle_put(ref.fwnode);
 651        if (!bus)
 652                return ERR_PTR(-ENOMEM);
 653
 654        return bus;
 655}
 656EXPORT_SYMBOL_GPL(sfp_bus_find_fwnode);
 657
 658/**
 659 * sfp_bus_add_upstream() - parse and register the neighbouring device
 660 * @bus: the &struct sfp_bus found via sfp_bus_find_fwnode()
 661 * @upstream: the upstream private data
 662 * @ops: the upstream's &struct sfp_upstream_ops
 663 *
 664 * Add upstream driver for the SFP bus, and if the bus is complete, register
 665 * the SFP bus using sfp_register_upstream().  This takes a reference on the
 666 * bus, so it is safe to put the bus after this call.
 667 *
 668 * Returns:
 669 *          - on success, a pointer to the sfp_bus structure,
 670 *          - %NULL if no SFP is specified,
 671 *          - on failure, an error pointer value:
 672 *
 673 *            - corresponding to the errors detailed for
 674 *              fwnode_property_get_reference_args().
 675 *            - %-ENOMEM if we failed to allocate the bus.
 676 *            - an error from the upstream's connect_phy() method.
 677 */
 678int sfp_bus_add_upstream(struct sfp_bus *bus, void *upstream,
 679                         const struct sfp_upstream_ops *ops)
 680{
 681        int ret;
 682
 683        /* If no bus, return success */
 684        if (!bus)
 685                return 0;
 686
 687        rtnl_lock();
 688        kref_get(&bus->kref);
 689        bus->upstream_ops = ops;
 690        bus->upstream = upstream;
 691
 692        if (bus->sfp) {
 693                ret = sfp_register_bus(bus);
 694                if (ret)
 695                        sfp_upstream_clear(bus);
 696        } else {
 697                ret = 0;
 698        }
 699        rtnl_unlock();
 700
 701        if (ret)
 702                sfp_bus_put(bus);
 703
 704        return ret;
 705}
 706EXPORT_SYMBOL_GPL(sfp_bus_add_upstream);
 707
 708/**
 709 * sfp_bus_del_upstream() - Delete a sfp bus
 710 * @bus: a pointer to the &struct sfp_bus structure for the sfp module
 711 *
 712 * Delete a previously registered upstream connection for the SFP
 713 * module. @bus should have been added by sfp_bus_add_upstream().
 714 */
 715void sfp_bus_del_upstream(struct sfp_bus *bus)
 716{
 717        if (bus) {
 718                rtnl_lock();
 719                if (bus->sfp)
 720                        sfp_unregister_bus(bus);
 721                sfp_upstream_clear(bus);
 722                rtnl_unlock();
 723
 724                sfp_bus_put(bus);
 725        }
 726}
 727EXPORT_SYMBOL_GPL(sfp_bus_del_upstream);
 728
 729/* Socket driver entry points */
 730int sfp_add_phy(struct sfp_bus *bus, struct phy_device *phydev)
 731{
 732        const struct sfp_upstream_ops *ops = sfp_get_upstream_ops(bus);
 733        int ret = 0;
 734
 735        if (ops && ops->connect_phy)
 736                ret = ops->connect_phy(bus->upstream, phydev);
 737
 738        if (ret == 0)
 739                bus->phydev = phydev;
 740
 741        return ret;
 742}
 743EXPORT_SYMBOL_GPL(sfp_add_phy);
 744
 745void sfp_remove_phy(struct sfp_bus *bus)
 746{
 747        const struct sfp_upstream_ops *ops = sfp_get_upstream_ops(bus);
 748
 749        if (ops && ops->disconnect_phy)
 750                ops->disconnect_phy(bus->upstream);
 751        bus->phydev = NULL;
 752}
 753EXPORT_SYMBOL_GPL(sfp_remove_phy);
 754
 755void sfp_link_up(struct sfp_bus *bus)
 756{
 757        const struct sfp_upstream_ops *ops = sfp_get_upstream_ops(bus);
 758
 759        if (ops && ops->link_up)
 760                ops->link_up(bus->upstream);
 761}
 762EXPORT_SYMBOL_GPL(sfp_link_up);
 763
 764void sfp_link_down(struct sfp_bus *bus)
 765{
 766        const struct sfp_upstream_ops *ops = sfp_get_upstream_ops(bus);
 767
 768        if (ops && ops->link_down)
 769                ops->link_down(bus->upstream);
 770}
 771EXPORT_SYMBOL_GPL(sfp_link_down);
 772
 773int sfp_module_insert(struct sfp_bus *bus, const struct sfp_eeprom_id *id)
 774{
 775        const struct sfp_upstream_ops *ops = sfp_get_upstream_ops(bus);
 776        int ret = 0;
 777
 778        bus->sfp_quirk = sfp_lookup_quirk(id);
 779
 780        if (ops && ops->module_insert)
 781                ret = ops->module_insert(bus->upstream, id);
 782
 783        return ret;
 784}
 785EXPORT_SYMBOL_GPL(sfp_module_insert);
 786
 787void sfp_module_remove(struct sfp_bus *bus)
 788{
 789        const struct sfp_upstream_ops *ops = sfp_get_upstream_ops(bus);
 790
 791        if (ops && ops->module_remove)
 792                ops->module_remove(bus->upstream);
 793
 794        bus->sfp_quirk = NULL;
 795}
 796EXPORT_SYMBOL_GPL(sfp_module_remove);
 797
 798int sfp_module_start(struct sfp_bus *bus)
 799{
 800        const struct sfp_upstream_ops *ops = sfp_get_upstream_ops(bus);
 801        int ret = 0;
 802
 803        if (ops && ops->module_start)
 804                ret = ops->module_start(bus->upstream);
 805
 806        return ret;
 807}
 808EXPORT_SYMBOL_GPL(sfp_module_start);
 809
 810void sfp_module_stop(struct sfp_bus *bus)
 811{
 812        const struct sfp_upstream_ops *ops = sfp_get_upstream_ops(bus);
 813
 814        if (ops && ops->module_stop)
 815                ops->module_stop(bus->upstream);
 816}
 817EXPORT_SYMBOL_GPL(sfp_module_stop);
 818
 819static void sfp_socket_clear(struct sfp_bus *bus)
 820{
 821        bus->sfp_dev = NULL;
 822        bus->sfp = NULL;
 823        bus->socket_ops = NULL;
 824}
 825
 826struct sfp_bus *sfp_register_socket(struct device *dev, struct sfp *sfp,
 827                                    const struct sfp_socket_ops *ops)
 828{
 829        struct sfp_bus *bus = sfp_bus_get(dev->fwnode);
 830        int ret = 0;
 831
 832        if (bus) {
 833                rtnl_lock();
 834                bus->sfp_dev = dev;
 835                bus->sfp = sfp;
 836                bus->socket_ops = ops;
 837
 838                if (bus->upstream_ops) {
 839                        ret = sfp_register_bus(bus);
 840                        if (ret)
 841                                sfp_socket_clear(bus);
 842                }
 843                rtnl_unlock();
 844        }
 845
 846        if (ret) {
 847                sfp_bus_put(bus);
 848                bus = NULL;
 849        }
 850
 851        return bus;
 852}
 853EXPORT_SYMBOL_GPL(sfp_register_socket);
 854
 855void sfp_unregister_socket(struct sfp_bus *bus)
 856{
 857        rtnl_lock();
 858        if (bus->upstream_ops)
 859                sfp_unregister_bus(bus);
 860        sfp_socket_clear(bus);
 861        rtnl_unlock();
 862
 863        sfp_bus_put(bus);
 864}
 865EXPORT_SYMBOL_GPL(sfp_unregister_socket);
 866