Lines Matching +full:1000 +full:base +full:- +full:x
18 * struct sfp_bus - internal representation of a sfp bus
48 // Alcatel Lucent G-010S-P can operate at 2500base-X, but
54 // Alcatel Lucent G-010S-A can operate at 2500base-X, but
60 // Huawei MA5671A can operate at 2500base-X, but report 1.2GBd
95 vs = sfp_strlen(id->base.vendor_name, ARRAY_SIZE(id->base.vendor_name)); in sfp_lookup_quirk()
96 ps = sfp_strlen(id->base.vendor_pn, ARRAY_SIZE(id->base.vendor_pn)); in sfp_lookup_quirk()
99 if (sfp_match(q->vendor, id->base.vendor_name, vs) && in sfp_lookup_quirk()
100 sfp_match(q->part, id->base.vendor_pn, ps)) in sfp_lookup_quirk()
106 * sfp_parse_port() - Parse the EEPROM base ID, setting the port type
113 * %PORT_TP, %PORT_FIBRE or %PORT_OTHER. If @support is non-%NULL,
125 switch (id->base.connector) { in sfp_parse_port()
144 if (id->base.e1000_base_t) { in sfp_parse_port()
158 dev_warn(bus->sfp_dev, "SFP: unknown connector id 0x%02x\n", in sfp_parse_port()
159 id->base.connector); in sfp_parse_port()
181 * sfp_parse_support() - Parse the eeprom id for supported link modes
197 if (id->base.br_nominal) { in sfp_parse_support()
198 if (id->base.br_nominal != 255) { in sfp_parse_support()
199 br_nom = id->base.br_nominal * 100; in sfp_parse_support()
200 br_min = br_nom - id->base.br_nominal * id->ext.br_min; in sfp_parse_support()
201 br_max = br_nom + id->base.br_nominal * id->ext.br_max; in sfp_parse_support()
202 } else if (id->ext.br_max) { in sfp_parse_support()
203 br_nom = 250 * id->ext.br_max; in sfp_parse_support()
204 br_max = br_nom + br_nom * id->ext.br_min / 100; in sfp_parse_support()
205 br_min = br_nom - br_nom * id->ext.br_min / 100; in sfp_parse_support()
212 if (br_min == br_max && id->base.sfp_ct_passive) in sfp_parse_support()
217 if (id->base.e10g_base_sr) in sfp_parse_support()
219 if (id->base.e10g_base_lr) in sfp_parse_support()
221 if (id->base.e10g_base_lrm) in sfp_parse_support()
223 if (id->base.e10g_base_er) in sfp_parse_support()
225 if (id->base.e1000_base_sx || in sfp_parse_support()
226 id->base.e1000_base_lx || in sfp_parse_support()
227 id->base.e1000_base_cx) in sfp_parse_support()
228 phylink_set(modes, 1000baseX_Full); in sfp_parse_support()
229 if (id->base.e1000_base_t) { in sfp_parse_support()
230 phylink_set(modes, 1000baseT_Half); in sfp_parse_support()
231 phylink_set(modes, 1000baseT_Full); in sfp_parse_support()
234 /* 1000Base-PX or 1000Base-BX10 */ in sfp_parse_support()
235 if ((id->base.e_base_px || id->base.e_base_bx10) && in sfp_parse_support()
237 phylink_set(modes, 1000baseX_Full); in sfp_parse_support()
242 if ((id->base.sfp_ct_passive || id->base.sfp_ct_active) && br_nom) { in sfp_parse_support()
249 phylink_set(modes, 1000baseX_Full); in sfp_parse_support()
251 if (id->base.sfp_ct_passive) { in sfp_parse_support()
252 if (id->base.passive.sff8431_app_e) in sfp_parse_support()
255 if (id->base.sfp_ct_active) { in sfp_parse_support()
256 if (id->base.active.sff8431_app_e || in sfp_parse_support()
257 id->base.active.sff8431_lim) { in sfp_parse_support()
262 switch (id->base.extended_cc) { in sfp_parse_support()
265 case 0x02: /* 100Gbase-SR4 or 25Gbase-SR */ in sfp_parse_support()
269 case 0x03: /* 100Gbase-LR4 or 25Gbase-LR */ in sfp_parse_support()
270 case 0x04: /* 100Gbase-ER4 or 25Gbase-ER */ in sfp_parse_support()
273 case 0x0b: /* 100Gbase-CR4 or 25Gbase-CR CA-L */ in sfp_parse_support()
274 case 0x0c: /* 25Gbase-CR CA-S */ in sfp_parse_support()
275 case 0x0d: /* 25Gbase-CR CA-N */ in sfp_parse_support()
280 dev_warn(bus->sfp_dev, in sfp_parse_support()
281 "Unknown/unsupported extended compliance code: 0x%02x\n", in sfp_parse_support()
282 id->base.extended_cc); in sfp_parse_support()
287 if (id->base.fc_speed_100 || in sfp_parse_support()
288 id->base.fc_speed_200 || in sfp_parse_support()
289 id->base.fc_speed_400) { in sfp_parse_support()
290 if (id->base.br_nominal >= 31) in sfp_parse_support()
292 if (id->base.br_nominal >= 12) in sfp_parse_support()
293 phylink_set(modes, 1000baseX_Full); in sfp_parse_support()
298 * modules (eg, 1310nm/1550nm) are not 1000BASE-BX compliant due to in sfp_parse_support()
302 /* If the encoding and bit rate allows 1000baseX */ in sfp_parse_support()
303 if (id->base.encoding == SFP_ENCODING_8B10B && br_nom && in sfp_parse_support()
305 phylink_set(modes, 1000baseX_Full); in sfp_parse_support()
308 if (bus->sfp_quirk) in sfp_parse_support()
309 bus->sfp_quirk->modes(id, modes); in sfp_parse_support()
320 * sfp_select_interface() - Select appropriate phy_interface_t mode
344 if (id->base.e1000_base_t || in sfp_select_interface()
345 id->base.e100_base_lx || in sfp_select_interface()
346 id->base.e100_base_fx) in sfp_select_interface()
349 if (phylink_test(link_modes, 1000baseX_Full)) in sfp_select_interface()
352 dev_warn(bus->sfp_dev, "Unable to ascertain link mode\n"); in sfp_select_interface()
363 return bus->registered ? bus->upstream_ops : NULL; in sfp_get_upstream_ops()
375 if (sfp->fwnode == fwnode) { in sfp_bus_get()
376 kref_get(&sfp->kref); in sfp_bus_get()
383 kref_init(&new->kref); in sfp_bus_get()
384 new->fwnode = fwnode; in sfp_bus_get()
385 list_add(&new->node, &sfp_buses); in sfp_bus_get()
401 list_del(&bus->node); in sfp_bus_release()
408 kref_put_mutex(&bus->kref, sfp_bus_release, &sfp_mutex); in sfp_bus_put()
413 const struct sfp_upstream_ops *ops = bus->upstream_ops; in sfp_register_bus()
417 if (ops->link_down) in sfp_register_bus()
418 ops->link_down(bus->upstream); in sfp_register_bus()
419 if (ops->connect_phy && bus->phydev) { in sfp_register_bus()
420 ret = ops->connect_phy(bus->upstream, bus->phydev); in sfp_register_bus()
425 bus->socket_ops->attach(bus->sfp); in sfp_register_bus()
426 if (bus->started) in sfp_register_bus()
427 bus->socket_ops->start(bus->sfp); in sfp_register_bus()
428 bus->netdev->sfp_bus = bus; in sfp_register_bus()
429 bus->registered = true; in sfp_register_bus()
435 const struct sfp_upstream_ops *ops = bus->upstream_ops; in sfp_unregister_bus()
437 bus->netdev->sfp_bus = NULL; in sfp_unregister_bus()
438 if (bus->registered) { in sfp_unregister_bus()
439 if (bus->started) in sfp_unregister_bus()
440 bus->socket_ops->stop(bus->sfp); in sfp_unregister_bus()
441 bus->socket_ops->detach(bus->sfp); in sfp_unregister_bus()
442 if (bus->phydev && ops && ops->disconnect_phy) in sfp_unregister_bus()
443 ops->disconnect_phy(bus->upstream); in sfp_unregister_bus()
445 bus->registered = false; in sfp_unregister_bus()
449 * sfp_get_module_info() - Get the ethtool_modinfo for a SFP module
460 return bus->socket_ops->module_info(bus->sfp, modinfo); in sfp_get_module_info()
465 * sfp_get_module_eeprom() - Read the SFP module EEPROM
468 * @data: buffer to contain the EEPROM data (must be at least @ee->len bytes)
478 return bus->socket_ops->module_eeprom(bus->sfp, ee, data); in sfp_get_module_eeprom()
483 * sfp_upstream_start() - Inform the SFP that the network device is up
493 if (bus->registered) in sfp_upstream_start()
494 bus->socket_ops->start(bus->sfp); in sfp_upstream_start()
495 bus->started = true; in sfp_upstream_start()
500 * sfp_upstream_stop() - Inform the SFP that the network device is down
510 if (bus->registered) in sfp_upstream_stop()
511 bus->socket_ops->stop(bus->sfp); in sfp_upstream_stop()
512 bus->started = false; in sfp_upstream_stop()
518 bus->upstream_ops = NULL; in sfp_upstream_clear()
519 bus->upstream = NULL; in sfp_upstream_clear()
520 bus->netdev = NULL; in sfp_upstream_clear()
524 * sfp_register_upstream() - Register the neighbouring device
545 bus->upstream_ops = ops; in sfp_register_upstream()
546 bus->upstream = upstream; in sfp_register_upstream()
547 bus->netdev = ndev; in sfp_register_upstream()
549 if (bus->sfp) { in sfp_register_upstream()
567 * sfp_unregister_upstream() - Unregister sfp bus
576 if (bus->sfp) in sfp_unregister_upstream()
591 if (ops && ops->connect_phy) in sfp_add_phy()
592 ret = ops->connect_phy(bus->upstream, phydev); in sfp_add_phy()
595 bus->phydev = phydev; in sfp_add_phy()
605 if (ops && ops->disconnect_phy) in sfp_remove_phy()
606 ops->disconnect_phy(bus->upstream); in sfp_remove_phy()
607 bus->phydev = NULL; in sfp_remove_phy()
615 if (ops && ops->link_up) in sfp_link_up()
616 ops->link_up(bus->upstream); in sfp_link_up()
624 if (ops && ops->link_down) in sfp_link_down()
625 ops->link_down(bus->upstream); in sfp_link_down()
634 bus->sfp_quirk = sfp_lookup_quirk(id); in sfp_module_insert()
636 if (ops && ops->module_insert) in sfp_module_insert()
637 ret = ops->module_insert(bus->upstream, id); in sfp_module_insert()
647 if (ops && ops->module_remove) in sfp_module_remove()
648 ops->module_remove(bus->upstream); in sfp_module_remove()
650 bus->sfp_quirk = NULL; in sfp_module_remove()
656 bus->sfp_dev = NULL; in sfp_socket_clear()
657 bus->sfp = NULL; in sfp_socket_clear()
658 bus->socket_ops = NULL; in sfp_socket_clear()
664 struct sfp_bus *bus = sfp_bus_get(dev->fwnode); in sfp_register_socket()
669 bus->sfp_dev = dev; in sfp_register_socket()
670 bus->sfp = sfp; in sfp_register_socket()
671 bus->socket_ops = ops; in sfp_register_socket()
673 if (bus->netdev) { in sfp_register_socket()
693 if (bus->netdev) in sfp_unregister_socket()