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, 25000baseCR_Full) ||
 396            phylink_test(link_modes, 25000baseKR_Full) ||
 397            phylink_test(link_modes, 25000baseSR_Full))
 398                return PHY_INTERFACE_MODE_25GBASER;
 399
 400        if (phylink_test(link_modes, 10000baseCR_Full) ||
 401            phylink_test(link_modes, 10000baseSR_Full) ||
 402            phylink_test(link_modes, 10000baseLR_Full) ||
 403            phylink_test(link_modes, 10000baseLRM_Full) ||
 404            phylink_test(link_modes, 10000baseER_Full) ||
 405            phylink_test(link_modes, 10000baseT_Full))
 406                return PHY_INTERFACE_MODE_10GBASER;
 407
 408        if (phylink_test(link_modes, 5000baseT_Full))
 409                return PHY_INTERFACE_MODE_5GBASER;
 410
 411        if (phylink_test(link_modes, 2500baseX_Full))
 412                return PHY_INTERFACE_MODE_2500BASEX;
 413
 414        if (phylink_test(link_modes, 1000baseT_Half) ||
 415            phylink_test(link_modes, 1000baseT_Full))
 416                return PHY_INTERFACE_MODE_SGMII;
 417
 418        if (phylink_test(link_modes, 1000baseX_Full))
 419                return PHY_INTERFACE_MODE_1000BASEX;
 420
 421        if (phylink_test(link_modes, 100baseFX_Full))
 422                return PHY_INTERFACE_MODE_100BASEX;
 423
 424        dev_warn(bus->sfp_dev, "Unable to ascertain link mode\n");
 425
 426        return PHY_INTERFACE_MODE_NA;
 427}
 428EXPORT_SYMBOL_GPL(sfp_select_interface);
 429
 430static LIST_HEAD(sfp_buses);
 431static DEFINE_MUTEX(sfp_mutex);
 432
 433static const struct sfp_upstream_ops *sfp_get_upstream_ops(struct sfp_bus *bus)
 434{
 435        return bus->registered ? bus->upstream_ops : NULL;
 436}
 437
 438static struct sfp_bus *sfp_bus_get(struct fwnode_handle *fwnode)
 439{
 440        struct sfp_bus *sfp, *new, *found = NULL;
 441
 442        new = kzalloc(sizeof(*new), GFP_KERNEL);
 443
 444        mutex_lock(&sfp_mutex);
 445
 446        list_for_each_entry(sfp, &sfp_buses, node) {
 447                if (sfp->fwnode == fwnode) {
 448                        kref_get(&sfp->kref);
 449                        found = sfp;
 450                        break;
 451                }
 452        }
 453
 454        if (!found && new) {
 455                kref_init(&new->kref);
 456                new->fwnode = fwnode;
 457                list_add(&new->node, &sfp_buses);
 458                found = new;
 459                new = NULL;
 460        }
 461
 462        mutex_unlock(&sfp_mutex);
 463
 464        kfree(new);
 465
 466        return found;
 467}
 468
 469static void sfp_bus_release(struct kref *kref)
 470{
 471        struct sfp_bus *bus = container_of(kref, struct sfp_bus, kref);
 472
 473        list_del(&bus->node);
 474        mutex_unlock(&sfp_mutex);
 475        kfree(bus);
 476}
 477
 478/**
 479 * sfp_bus_put() - put a reference on the &struct sfp_bus
 480 * @bus: the &struct sfp_bus found via sfp_bus_find_fwnode()
 481 *
 482 * Put a reference on the &struct sfp_bus and free the underlying structure
 483 * if this was the last reference.
 484 */
 485void sfp_bus_put(struct sfp_bus *bus)
 486{
 487        if (bus)
 488                kref_put_mutex(&bus->kref, sfp_bus_release, &sfp_mutex);
 489}
 490EXPORT_SYMBOL_GPL(sfp_bus_put);
 491
 492static int sfp_register_bus(struct sfp_bus *bus)
 493{
 494        const struct sfp_upstream_ops *ops = bus->upstream_ops;
 495        int ret;
 496
 497        if (ops) {
 498                if (ops->link_down)
 499                        ops->link_down(bus->upstream);
 500                if (ops->connect_phy && bus->phydev) {
 501                        ret = ops->connect_phy(bus->upstream, bus->phydev);
 502                        if (ret)
 503                                return ret;
 504                }
 505        }
 506        bus->registered = true;
 507        bus->socket_ops->attach(bus->sfp);
 508        if (bus->started)
 509                bus->socket_ops->start(bus->sfp);
 510        bus->upstream_ops->attach(bus->upstream, bus);
 511        return 0;
 512}
 513
 514static void sfp_unregister_bus(struct sfp_bus *bus)
 515{
 516        const struct sfp_upstream_ops *ops = bus->upstream_ops;
 517
 518        if (bus->registered) {
 519                bus->upstream_ops->detach(bus->upstream, bus);
 520                if (bus->started)
 521                        bus->socket_ops->stop(bus->sfp);
 522                bus->socket_ops->detach(bus->sfp);
 523                if (bus->phydev && ops && ops->disconnect_phy)
 524                        ops->disconnect_phy(bus->upstream);
 525        }
 526        bus->registered = false;
 527}
 528
 529/**
 530 * sfp_get_module_info() - Get the ethtool_modinfo for a SFP module
 531 * @bus: a pointer to the &struct sfp_bus structure for the sfp module
 532 * @modinfo: a &struct ethtool_modinfo
 533 *
 534 * Fill in the type and eeprom_len parameters in @modinfo for a module on
 535 * the sfp bus specified by @bus.
 536 *
 537 * Returns 0 on success or a negative errno number.
 538 */
 539int sfp_get_module_info(struct sfp_bus *bus, struct ethtool_modinfo *modinfo)
 540{
 541        return bus->socket_ops->module_info(bus->sfp, modinfo);
 542}
 543EXPORT_SYMBOL_GPL(sfp_get_module_info);
 544
 545/**
 546 * sfp_get_module_eeprom() - Read the SFP module EEPROM
 547 * @bus: a pointer to the &struct sfp_bus structure for the sfp module
 548 * @ee: a &struct ethtool_eeprom
 549 * @data: buffer to contain the EEPROM data (must be at least @ee->len bytes)
 550 *
 551 * Read the EEPROM as specified by the supplied @ee. See the documentation
 552 * for &struct ethtool_eeprom for the region to be read.
 553 *
 554 * Returns 0 on success or a negative errno number.
 555 */
 556int sfp_get_module_eeprom(struct sfp_bus *bus, struct ethtool_eeprom *ee,
 557                          u8 *data)
 558{
 559        return bus->socket_ops->module_eeprom(bus->sfp, ee, data);
 560}
 561EXPORT_SYMBOL_GPL(sfp_get_module_eeprom);
 562
 563/**
 564 * sfp_get_module_eeprom_by_page() - Read a page from the SFP module EEPROM
 565 * @bus: a pointer to the &struct sfp_bus structure for the sfp module
 566 * @page: a &struct ethtool_module_eeprom
 567 * @extack: extack for reporting problems
 568 *
 569 * Read an EEPROM page as specified by the supplied @page. See the
 570 * documentation for &struct ethtool_module_eeprom for the page to be read.
 571 *
 572 * Returns 0 on success or a negative errno number. More error
 573 * information might be provided via extack
 574 */
 575int sfp_get_module_eeprom_by_page(struct sfp_bus *bus,
 576                                  const struct ethtool_module_eeprom *page,
 577                                  struct netlink_ext_ack *extack)
 578{
 579        return bus->socket_ops->module_eeprom_by_page(bus->sfp, page, extack);
 580}
 581EXPORT_SYMBOL_GPL(sfp_get_module_eeprom_by_page);
 582
 583/**
 584 * sfp_upstream_start() - Inform the SFP that the network device is up
 585 * @bus: a pointer to the &struct sfp_bus structure for the sfp module
 586 *
 587 * Inform the SFP socket that the network device is now up, so that the
 588 * module can be enabled by allowing TX_DISABLE to be deasserted. This
 589 * should be called from the network device driver's &struct net_device_ops
 590 * ndo_open() method.
 591 */
 592void sfp_upstream_start(struct sfp_bus *bus)
 593{
 594        if (bus->registered)
 595                bus->socket_ops->start(bus->sfp);
 596        bus->started = true;
 597}
 598EXPORT_SYMBOL_GPL(sfp_upstream_start);
 599
 600/**
 601 * sfp_upstream_stop() - Inform the SFP that the network device is down
 602 * @bus: a pointer to the &struct sfp_bus structure for the sfp module
 603 *
 604 * Inform the SFP socket that the network device is now up, so that the
 605 * module can be disabled by asserting TX_DISABLE, disabling the laser
 606 * in optical modules. This should be called from the network device
 607 * driver's &struct net_device_ops ndo_stop() method.
 608 */
 609void sfp_upstream_stop(struct sfp_bus *bus)
 610{
 611        if (bus->registered)
 612                bus->socket_ops->stop(bus->sfp);
 613        bus->started = false;
 614}
 615EXPORT_SYMBOL_GPL(sfp_upstream_stop);
 616
 617static void sfp_upstream_clear(struct sfp_bus *bus)
 618{
 619        bus->upstream_ops = NULL;
 620        bus->upstream = NULL;
 621}
 622
 623/**
 624 * sfp_bus_find_fwnode() - parse and locate the SFP bus from fwnode
 625 * @fwnode: firmware node for the parent device (MAC or PHY)
 626 *
 627 * Parse the parent device's firmware node for a SFP bus, and locate
 628 * the sfp_bus structure, incrementing its reference count.  This must
 629 * be put via sfp_bus_put() when done.
 630 *
 631 * Returns:
 632 *      - on success, a pointer to the sfp_bus structure,
 633 *      - %NULL if no SFP is specified,
 634 *      - on failure, an error pointer value:
 635 *
 636 *      - corresponding to the errors detailed for
 637 *        fwnode_property_get_reference_args().
 638 *      - %-ENOMEM if we failed to allocate the bus.
 639 *      - an error from the upstream's connect_phy() method.
 640 */
 641struct sfp_bus *sfp_bus_find_fwnode(struct fwnode_handle *fwnode)
 642{
 643        struct fwnode_reference_args ref;
 644        struct sfp_bus *bus;
 645        int ret;
 646
 647        ret = fwnode_property_get_reference_args(fwnode, "sfp", NULL,
 648                                                 0, 0, &ref);
 649        if (ret == -ENOENT)
 650                return NULL;
 651        else if (ret < 0)
 652                return ERR_PTR(ret);
 653
 654        bus = sfp_bus_get(ref.fwnode);
 655        fwnode_handle_put(ref.fwnode);
 656        if (!bus)
 657                return ERR_PTR(-ENOMEM);
 658
 659        return bus;
 660}
 661EXPORT_SYMBOL_GPL(sfp_bus_find_fwnode);
 662
 663/**
 664 * sfp_bus_add_upstream() - parse and register the neighbouring device
 665 * @bus: the &struct sfp_bus found via sfp_bus_find_fwnode()
 666 * @upstream: the upstream private data
 667 * @ops: the upstream's &struct sfp_upstream_ops
 668 *
 669 * Add upstream driver for the SFP bus, and if the bus is complete, register
 670 * the SFP bus using sfp_register_upstream().  This takes a reference on the
 671 * bus, so it is safe to put the bus after this call.
 672 *
 673 * Returns:
 674 *      - on success, a pointer to the sfp_bus structure,
 675 *      - %NULL if no SFP is specified,
 676 *      - on failure, an error pointer value:
 677 *
 678 *      - corresponding to the errors detailed for
 679 *        fwnode_property_get_reference_args().
 680 *      - %-ENOMEM if we failed to allocate the bus.
 681 *      - an error from the upstream's connect_phy() method.
 682 */
 683int sfp_bus_add_upstream(struct sfp_bus *bus, void *upstream,
 684                         const struct sfp_upstream_ops *ops)
 685{
 686        int ret;
 687
 688        /* If no bus, return success */
 689        if (!bus)
 690                return 0;
 691
 692        rtnl_lock();
 693        kref_get(&bus->kref);
 694        bus->upstream_ops = ops;
 695        bus->upstream = upstream;
 696
 697        if (bus->sfp) {
 698                ret = sfp_register_bus(bus);
 699                if (ret)
 700                        sfp_upstream_clear(bus);
 701        } else {
 702                ret = 0;
 703        }
 704        rtnl_unlock();
 705
 706        if (ret)
 707                sfp_bus_put(bus);
 708
 709        return ret;
 710}
 711EXPORT_SYMBOL_GPL(sfp_bus_add_upstream);
 712
 713/**
 714 * sfp_bus_del_upstream() - Delete a sfp bus
 715 * @bus: a pointer to the &struct sfp_bus structure for the sfp module
 716 *
 717 * Delete a previously registered upstream connection for the SFP
 718 * module. @bus should have been added by sfp_bus_add_upstream().
 719 */
 720void sfp_bus_del_upstream(struct sfp_bus *bus)
 721{
 722        if (bus) {
 723                rtnl_lock();
 724                if (bus->sfp)
 725                        sfp_unregister_bus(bus);
 726                sfp_upstream_clear(bus);
 727                rtnl_unlock();
 728
 729                sfp_bus_put(bus);
 730        }
 731}
 732EXPORT_SYMBOL_GPL(sfp_bus_del_upstream);
 733
 734/* Socket driver entry points */
 735int sfp_add_phy(struct sfp_bus *bus, struct phy_device *phydev)
 736{
 737        const struct sfp_upstream_ops *ops = sfp_get_upstream_ops(bus);
 738        int ret = 0;
 739
 740        if (ops && ops->connect_phy)
 741                ret = ops->connect_phy(bus->upstream, phydev);
 742
 743        if (ret == 0)
 744                bus->phydev = phydev;
 745
 746        return ret;
 747}
 748EXPORT_SYMBOL_GPL(sfp_add_phy);
 749
 750void sfp_remove_phy(struct sfp_bus *bus)
 751{
 752        const struct sfp_upstream_ops *ops = sfp_get_upstream_ops(bus);
 753
 754        if (ops && ops->disconnect_phy)
 755                ops->disconnect_phy(bus->upstream);
 756        bus->phydev = NULL;
 757}
 758EXPORT_SYMBOL_GPL(sfp_remove_phy);
 759
 760void sfp_link_up(struct sfp_bus *bus)
 761{
 762        const struct sfp_upstream_ops *ops = sfp_get_upstream_ops(bus);
 763
 764        if (ops && ops->link_up)
 765                ops->link_up(bus->upstream);
 766}
 767EXPORT_SYMBOL_GPL(sfp_link_up);
 768
 769void sfp_link_down(struct sfp_bus *bus)
 770{
 771        const struct sfp_upstream_ops *ops = sfp_get_upstream_ops(bus);
 772
 773        if (ops && ops->link_down)
 774                ops->link_down(bus->upstream);
 775}
 776EXPORT_SYMBOL_GPL(sfp_link_down);
 777
 778int sfp_module_insert(struct sfp_bus *bus, const struct sfp_eeprom_id *id)
 779{
 780        const struct sfp_upstream_ops *ops = sfp_get_upstream_ops(bus);
 781        int ret = 0;
 782
 783        bus->sfp_quirk = sfp_lookup_quirk(id);
 784
 785        if (ops && ops->module_insert)
 786                ret = ops->module_insert(bus->upstream, id);
 787
 788        return ret;
 789}
 790EXPORT_SYMBOL_GPL(sfp_module_insert);
 791
 792void sfp_module_remove(struct sfp_bus *bus)
 793{
 794        const struct sfp_upstream_ops *ops = sfp_get_upstream_ops(bus);
 795
 796        if (ops && ops->module_remove)
 797                ops->module_remove(bus->upstream);
 798
 799        bus->sfp_quirk = NULL;
 800}
 801EXPORT_SYMBOL_GPL(sfp_module_remove);
 802
 803int sfp_module_start(struct sfp_bus *bus)
 804{
 805        const struct sfp_upstream_ops *ops = sfp_get_upstream_ops(bus);
 806        int ret = 0;
 807
 808        if (ops && ops->module_start)
 809                ret = ops->module_start(bus->upstream);
 810
 811        return ret;
 812}
 813EXPORT_SYMBOL_GPL(sfp_module_start);
 814
 815void sfp_module_stop(struct sfp_bus *bus)
 816{
 817        const struct sfp_upstream_ops *ops = sfp_get_upstream_ops(bus);
 818
 819        if (ops && ops->module_stop)
 820                ops->module_stop(bus->upstream);
 821}
 822EXPORT_SYMBOL_GPL(sfp_module_stop);
 823
 824static void sfp_socket_clear(struct sfp_bus *bus)
 825{
 826        bus->sfp_dev = NULL;
 827        bus->sfp = NULL;
 828        bus->socket_ops = NULL;
 829}
 830
 831struct sfp_bus *sfp_register_socket(struct device *dev, struct sfp *sfp,
 832                                    const struct sfp_socket_ops *ops)
 833{
 834        struct sfp_bus *bus = sfp_bus_get(dev->fwnode);
 835        int ret = 0;
 836
 837        if (bus) {
 838                rtnl_lock();
 839                bus->sfp_dev = dev;
 840                bus->sfp = sfp;
 841                bus->socket_ops = ops;
 842
 843                if (bus->upstream_ops) {
 844                        ret = sfp_register_bus(bus);
 845                        if (ret)
 846                                sfp_socket_clear(bus);
 847                }
 848                rtnl_unlock();
 849        }
 850
 851        if (ret) {
 852                sfp_bus_put(bus);
 853                bus = NULL;
 854        }
 855
 856        return bus;
 857}
 858EXPORT_SYMBOL_GPL(sfp_register_socket);
 859
 860void sfp_unregister_socket(struct sfp_bus *bus)
 861{
 862        rtnl_lock();
 863        if (bus->upstream_ops)
 864                sfp_unregister_bus(bus);
 865        sfp_socket_clear(bus);
 866        rtnl_unlock();
 867
 868        sfp_bus_put(bus);
 869}
 870EXPORT_SYMBOL_GPL(sfp_unregister_socket);
 871