1  #include <linux/export.h>
2  #include <linux/kref.h>
3  #include <linux/list.h>
4  #include <linux/mutex.h>
5  #include <linux/phylink.h>
6  #include <linux/rtnetlink.h>
7  #include <linux/slab.h>
8  
9  #include "sfp.h"
10  
11  /**
12   * struct sfp_bus - internal representation of a sfp bus
13   */
14  struct sfp_bus {
15  	/* private: */
16  	struct kref kref;
17  	struct list_head node;
18  	struct fwnode_handle *fwnode;
19  
20  	const struct sfp_socket_ops *socket_ops;
21  	struct device *sfp_dev;
22  	struct sfp *sfp;
23  
24  	const struct sfp_upstream_ops *upstream_ops;
25  	void *upstream;
26  	struct net_device *netdev;
27  	struct phy_device *phydev;
28  
29  	bool registered;
30  	bool started;
31  };
32  
33  /**
34   * sfp_parse_port() - Parse the EEPROM base ID, setting the port type
35   * @bus: a pointer to the &struct sfp_bus structure for the sfp module
36   * @id: a pointer to the module's &struct sfp_eeprom_id
37   * @support: optional pointer to an array of unsigned long for the
38   *   ethtool support mask
39   *
40   * Parse the EEPROM identification given in @id, and return one of
41   * %PORT_TP, %PORT_FIBRE or %PORT_OTHER. If @support is non-%NULL,
42   * also set the ethtool %ETHTOOL_LINK_MODE_xxx_BIT corresponding with
43   * the connector type.
44   *
45   * If the port type is not known, returns %PORT_OTHER.
46   */
sfp_parse_port(struct sfp_bus * bus,const struct sfp_eeprom_id * id,unsigned long * support)47  int sfp_parse_port(struct sfp_bus *bus, const struct sfp_eeprom_id *id,
48  		   unsigned long *support)
49  {
50  	int port;
51  
52  	/* port is the physical connector, set this from the connector field. */
53  	switch (id->base.connector) {
54  	case SFP_CONNECTOR_SC:
55  	case SFP_CONNECTOR_FIBERJACK:
56  	case SFP_CONNECTOR_LC:
57  	case SFP_CONNECTOR_MT_RJ:
58  	case SFP_CONNECTOR_MU:
59  	case SFP_CONNECTOR_OPTICAL_PIGTAIL:
60  		port = PORT_FIBRE;
61  		break;
62  
63  	case SFP_CONNECTOR_RJ45:
64  		port = PORT_TP;
65  		break;
66  
67  	case SFP_CONNECTOR_COPPER_PIGTAIL:
68  		port = PORT_DA;
69  		break;
70  
71  	case SFP_CONNECTOR_UNSPEC:
72  		if (id->base.e1000_base_t) {
73  			port = PORT_TP;
74  			break;
75  		}
76  		/* fallthrough */
77  	case SFP_CONNECTOR_SG: /* guess */
78  	case SFP_CONNECTOR_MPO_1X12:
79  	case SFP_CONNECTOR_MPO_2X16:
80  	case SFP_CONNECTOR_HSSDC_II:
81  	case SFP_CONNECTOR_NOSEPARATE:
82  	case SFP_CONNECTOR_MXC_2X16:
83  		port = PORT_OTHER;
84  		break;
85  	default:
86  		dev_warn(bus->sfp_dev, "SFP: unknown connector id 0x%02x\n",
87  			 id->base.connector);
88  		port = PORT_OTHER;
89  		break;
90  	}
91  
92  	if (support) {
93  		switch (port) {
94  		case PORT_FIBRE:
95  			phylink_set(support, FIBRE);
96  			break;
97  
98  		case PORT_TP:
99  			phylink_set(support, TP);
100  			break;
101  		}
102  	}
103  
104  	return port;
105  }
106  EXPORT_SYMBOL_GPL(sfp_parse_port);
107  
108  /**
109   * sfp_parse_support() - Parse the eeprom id for supported link modes
110   * @bus: a pointer to the &struct sfp_bus structure for the sfp module
111   * @id: a pointer to the module's &struct sfp_eeprom_id
112   * @support: pointer to an array of unsigned long for the ethtool support mask
113   *
114   * Parse the EEPROM identification information and derive the supported
115   * ethtool link modes for the module.
116   */
sfp_parse_support(struct sfp_bus * bus,const struct sfp_eeprom_id * id,unsigned long * support)117  void sfp_parse_support(struct sfp_bus *bus, const struct sfp_eeprom_id *id,
118  		       unsigned long *support)
119  {
120  	unsigned int br_min, br_nom, br_max;
121  	__ETHTOOL_DECLARE_LINK_MODE_MASK(modes) = { 0, };
122  
123  	/* Decode the bitrate information to MBd */
124  	br_min = br_nom = br_max = 0;
125  	if (id->base.br_nominal) {
126  		if (id->base.br_nominal != 255) {
127  			br_nom = id->base.br_nominal * 100;
128  			br_min = br_nom - id->base.br_nominal * id->ext.br_min;
129  			br_max = br_nom + id->base.br_nominal * id->ext.br_max;
130  		} else if (id->ext.br_max) {
131  			br_nom = 250 * id->ext.br_max;
132  			br_max = br_nom + br_nom * id->ext.br_min / 100;
133  			br_min = br_nom - br_nom * id->ext.br_min / 100;
134  		}
135  
136  		/* When using passive cables, in case neither BR,min nor BR,max
137  		 * are specified, set br_min to 0 as the nominal value is then
138  		 * used as the maximum.
139  		 */
140  		if (br_min == br_max && id->base.sfp_ct_passive)
141  			br_min = 0;
142  	}
143  
144  	/* Set ethtool support from the compliance fields. */
145  	if (id->base.e10g_base_sr)
146  		phylink_set(modes, 10000baseSR_Full);
147  	if (id->base.e10g_base_lr)
148  		phylink_set(modes, 10000baseLR_Full);
149  	if (id->base.e10g_base_lrm)
150  		phylink_set(modes, 10000baseLRM_Full);
151  	if (id->base.e10g_base_er)
152  		phylink_set(modes, 10000baseER_Full);
153  	if (id->base.e1000_base_sx ||
154  	    id->base.e1000_base_lx ||
155  	    id->base.e1000_base_cx)
156  		phylink_set(modes, 1000baseX_Full);
157  	if (id->base.e1000_base_t) {
158  		phylink_set(modes, 1000baseT_Half);
159  		phylink_set(modes, 1000baseT_Full);
160  	}
161  
162  	/* 1000Base-PX or 1000Base-BX10 */
163  	if ((id->base.e_base_px || id->base.e_base_bx10) &&
164  	    br_min <= 1300 && br_max >= 1200)
165  		phylink_set(support, 1000baseX_Full);
166  
167  	/* For active or passive cables, select the link modes
168  	 * based on the bit rates and the cable compliance bytes.
169  	 */
170  	if ((id->base.sfp_ct_passive || id->base.sfp_ct_active) && br_nom) {
171  		/* This may look odd, but some manufacturers use 12000MBd */
172  		if (br_min <= 12000 && br_max >= 10300)
173  			phylink_set(modes, 10000baseCR_Full);
174  		if (br_min <= 3200 && br_max >= 3100)
175  			phylink_set(modes, 2500baseX_Full);
176  		if (br_min <= 1300 && br_max >= 1200)
177  			phylink_set(modes, 1000baseX_Full);
178  	}
179  	if (id->base.sfp_ct_passive) {
180  		if (id->base.passive.sff8431_app_e)
181  			phylink_set(modes, 10000baseCR_Full);
182  	}
183  	if (id->base.sfp_ct_active) {
184  		if (id->base.active.sff8431_app_e ||
185  		    id->base.active.sff8431_lim) {
186  			phylink_set(modes, 10000baseCR_Full);
187  		}
188  	}
189  
190  	switch (id->base.extended_cc) {
191  	case 0x00: /* Unspecified */
192  		break;
193  	case 0x02: /* 100Gbase-SR4 or 25Gbase-SR */
194  		phylink_set(modes, 100000baseSR4_Full);
195  		phylink_set(modes, 25000baseSR_Full);
196  		break;
197  	case 0x03: /* 100Gbase-LR4 or 25Gbase-LR */
198  	case 0x04: /* 100Gbase-ER4 or 25Gbase-ER */
199  		phylink_set(modes, 100000baseLR4_ER4_Full);
200  		break;
201  	case 0x0b: /* 100Gbase-CR4 or 25Gbase-CR CA-L */
202  	case 0x0c: /* 25Gbase-CR CA-S */
203  	case 0x0d: /* 25Gbase-CR CA-N */
204  		phylink_set(modes, 100000baseCR4_Full);
205  		phylink_set(modes, 25000baseCR_Full);
206  		break;
207  	default:
208  		dev_warn(bus->sfp_dev,
209  			 "Unknown/unsupported extended compliance code: 0x%02x\n",
210  			 id->base.extended_cc);
211  		break;
212  	}
213  
214  	/* For fibre channel SFP, derive possible BaseX modes */
215  	if (id->base.fc_speed_100 ||
216  	    id->base.fc_speed_200 ||
217  	    id->base.fc_speed_400) {
218  		if (id->base.br_nominal >= 31)
219  			phylink_set(modes, 2500baseX_Full);
220  		if (id->base.br_nominal >= 12)
221  			phylink_set(modes, 1000baseX_Full);
222  	}
223  
224  	/* If we haven't discovered any modes that this module supports, try
225  	 * the encoding and bitrate to determine supported modes. Some BiDi
226  	 * modules (eg, 1310nm/1550nm) are not 1000BASE-BX compliant due to
227  	 * the differing wavelengths, so do not set any transceiver bits.
228  	 */
229  	if (bitmap_empty(modes, __ETHTOOL_LINK_MODE_MASK_NBITS)) {
230  		/* If the encoding and bit rate allows 1000baseX */
231  		if (id->base.encoding == SFP_ENCODING_8B10B && br_nom &&
232  		    br_min <= 1300 && br_max >= 1200)
233  			phylink_set(modes, 1000baseX_Full);
234  	}
235  
236  	bitmap_or(support, support, modes, __ETHTOOL_LINK_MODE_MASK_NBITS);
237  
238  	phylink_set(support, Autoneg);
239  	phylink_set(support, Pause);
240  	phylink_set(support, Asym_Pause);
241  }
242  EXPORT_SYMBOL_GPL(sfp_parse_support);
243  
244  /**
245   * sfp_select_interface() - Select appropriate phy_interface_t mode
246   * @bus: a pointer to the &struct sfp_bus structure for the sfp module
247   * @id: a pointer to the module's &struct sfp_eeprom_id
248   * @link_modes: ethtool link modes mask
249   *
250   * Derive the phy_interface_t mode for the information found in the
251   * module's identifying EEPROM and the link modes mask. There is no
252   * standard or defined way to derive this information, so we decide
253   * based upon the link mode mask.
254   */
sfp_select_interface(struct sfp_bus * bus,const struct sfp_eeprom_id * id,unsigned long * link_modes)255  phy_interface_t sfp_select_interface(struct sfp_bus *bus,
256  				     const struct sfp_eeprom_id *id,
257  				     unsigned long *link_modes)
258  {
259  	if (phylink_test(link_modes, 10000baseCR_Full) ||
260  	    phylink_test(link_modes, 10000baseSR_Full) ||
261  	    phylink_test(link_modes, 10000baseLR_Full) ||
262  	    phylink_test(link_modes, 10000baseLRM_Full) ||
263  	    phylink_test(link_modes, 10000baseER_Full))
264  		return PHY_INTERFACE_MODE_10GKR;
265  
266  	if (phylink_test(link_modes, 2500baseX_Full))
267  		return PHY_INTERFACE_MODE_2500BASEX;
268  
269  	if (id->base.e1000_base_t ||
270  	    id->base.e100_base_lx ||
271  	    id->base.e100_base_fx)
272  		return PHY_INTERFACE_MODE_SGMII;
273  
274  	if (phylink_test(link_modes, 1000baseX_Full))
275  		return PHY_INTERFACE_MODE_1000BASEX;
276  
277  	dev_warn(bus->sfp_dev, "Unable to ascertain link mode\n");
278  
279  	return PHY_INTERFACE_MODE_NA;
280  }
281  EXPORT_SYMBOL_GPL(sfp_select_interface);
282  
283  static LIST_HEAD(sfp_buses);
284  static DEFINE_MUTEX(sfp_mutex);
285  
sfp_get_upstream_ops(struct sfp_bus * bus)286  static const struct sfp_upstream_ops *sfp_get_upstream_ops(struct sfp_bus *bus)
287  {
288  	return bus->registered ? bus->upstream_ops : NULL;
289  }
290  
sfp_bus_get(struct fwnode_handle * fwnode)291  static struct sfp_bus *sfp_bus_get(struct fwnode_handle *fwnode)
292  {
293  	struct sfp_bus *sfp, *new, *found = NULL;
294  
295  	new = kzalloc(sizeof(*new), GFP_KERNEL);
296  
297  	mutex_lock(&sfp_mutex);
298  
299  	list_for_each_entry(sfp, &sfp_buses, node) {
300  		if (sfp->fwnode == fwnode) {
301  			kref_get(&sfp->kref);
302  			found = sfp;
303  			break;
304  		}
305  	}
306  
307  	if (!found && new) {
308  		kref_init(&new->kref);
309  		new->fwnode = fwnode;
310  		list_add(&new->node, &sfp_buses);
311  		found = new;
312  		new = NULL;
313  	}
314  
315  	mutex_unlock(&sfp_mutex);
316  
317  	kfree(new);
318  
319  	return found;
320  }
321  
sfp_bus_release(struct kref * kref)322  static void sfp_bus_release(struct kref *kref)
323  {
324  	struct sfp_bus *bus = container_of(kref, struct sfp_bus, kref);
325  
326  	list_del(&bus->node);
327  	mutex_unlock(&sfp_mutex);
328  	kfree(bus);
329  }
330  
sfp_bus_put(struct sfp_bus * bus)331  static void sfp_bus_put(struct sfp_bus *bus)
332  {
333  	kref_put_mutex(&bus->kref, sfp_bus_release, &sfp_mutex);
334  }
335  
sfp_register_bus(struct sfp_bus * bus)336  static int sfp_register_bus(struct sfp_bus *bus)
337  {
338  	const struct sfp_upstream_ops *ops = bus->upstream_ops;
339  	int ret;
340  
341  	if (ops) {
342  		if (ops->link_down)
343  			ops->link_down(bus->upstream);
344  		if (ops->connect_phy && bus->phydev) {
345  			ret = ops->connect_phy(bus->upstream, bus->phydev);
346  			if (ret)
347  				return ret;
348  		}
349  	}
350  	if (bus->started)
351  		bus->socket_ops->start(bus->sfp);
352  	bus->netdev->sfp_bus = bus;
353  	bus->registered = true;
354  	return 0;
355  }
356  
sfp_unregister_bus(struct sfp_bus * bus)357  static void sfp_unregister_bus(struct sfp_bus *bus)
358  {
359  	const struct sfp_upstream_ops *ops = bus->upstream_ops;
360  
361  	bus->netdev->sfp_bus = NULL;
362  	if (bus->registered) {
363  		if (bus->started)
364  			bus->socket_ops->stop(bus->sfp);
365  		if (bus->phydev && ops && ops->disconnect_phy)
366  			ops->disconnect_phy(bus->upstream);
367  	}
368  	bus->registered = false;
369  }
370  
371  /**
372   * sfp_get_module_info() - Get the ethtool_modinfo for a SFP module
373   * @bus: a pointer to the &struct sfp_bus structure for the sfp module
374   * @modinfo: a &struct ethtool_modinfo
375   *
376   * Fill in the type and eeprom_len parameters in @modinfo for a module on
377   * the sfp bus specified by @bus.
378   *
379   * Returns 0 on success or a negative errno number.
380   */
sfp_get_module_info(struct sfp_bus * bus,struct ethtool_modinfo * modinfo)381  int sfp_get_module_info(struct sfp_bus *bus, struct ethtool_modinfo *modinfo)
382  {
383  	return bus->socket_ops->module_info(bus->sfp, modinfo);
384  }
385  EXPORT_SYMBOL_GPL(sfp_get_module_info);
386  
387  /**
388   * sfp_get_module_eeprom() - Read the SFP module EEPROM
389   * @bus: a pointer to the &struct sfp_bus structure for the sfp module
390   * @ee: a &struct ethtool_eeprom
391   * @data: buffer to contain the EEPROM data (must be at least @ee->len bytes)
392   *
393   * Read the EEPROM as specified by the supplied @ee. See the documentation
394   * for &struct ethtool_eeprom for the region to be read.
395   *
396   * Returns 0 on success or a negative errno number.
397   */
sfp_get_module_eeprom(struct sfp_bus * bus,struct ethtool_eeprom * ee,u8 * data)398  int sfp_get_module_eeprom(struct sfp_bus *bus, struct ethtool_eeprom *ee,
399  			  u8 *data)
400  {
401  	return bus->socket_ops->module_eeprom(bus->sfp, ee, data);
402  }
403  EXPORT_SYMBOL_GPL(sfp_get_module_eeprom);
404  
405  /**
406   * sfp_upstream_start() - Inform the SFP that the network device is up
407   * @bus: a pointer to the &struct sfp_bus structure for the sfp module
408   *
409   * Inform the SFP socket that the network device is now up, so that the
410   * module can be enabled by allowing TX_DISABLE to be deasserted. This
411   * should be called from the network device driver's &struct net_device_ops
412   * ndo_open() method.
413   */
sfp_upstream_start(struct sfp_bus * bus)414  void sfp_upstream_start(struct sfp_bus *bus)
415  {
416  	if (bus->registered)
417  		bus->socket_ops->start(bus->sfp);
418  	bus->started = true;
419  }
420  EXPORT_SYMBOL_GPL(sfp_upstream_start);
421  
422  /**
423   * sfp_upstream_stop() - Inform the SFP that the network device is down
424   * @bus: a pointer to the &struct sfp_bus structure for the sfp module
425   *
426   * Inform the SFP socket that the network device is now up, so that the
427   * module can be disabled by asserting TX_DISABLE, disabling the laser
428   * in optical modules. This should be called from the network device
429   * driver's &struct net_device_ops ndo_stop() method.
430   */
sfp_upstream_stop(struct sfp_bus * bus)431  void sfp_upstream_stop(struct sfp_bus *bus)
432  {
433  	if (bus->registered)
434  		bus->socket_ops->stop(bus->sfp);
435  	bus->started = false;
436  }
437  EXPORT_SYMBOL_GPL(sfp_upstream_stop);
438  
sfp_upstream_clear(struct sfp_bus * bus)439  static void sfp_upstream_clear(struct sfp_bus *bus)
440  {
441  	bus->upstream_ops = NULL;
442  	bus->upstream = NULL;
443  	bus->netdev = NULL;
444  }
445  
446  /**
447   * sfp_register_upstream() - Register the neighbouring device
448   * @fwnode: firmware node for the SFP bus
449   * @ndev: network device associated with the interface
450   * @upstream: the upstream private data
451   * @ops: the upstream's &struct sfp_upstream_ops
452   *
453   * Register the upstream device (eg, PHY) with the SFP bus. MAC drivers
454   * should use phylink, which will call this function for them. Returns
455   * a pointer to the allocated &struct sfp_bus.
456   *
457   * On error, returns %NULL.
458   */
sfp_register_upstream(struct fwnode_handle * fwnode,struct net_device * ndev,void * upstream,const struct sfp_upstream_ops * ops)459  struct sfp_bus *sfp_register_upstream(struct fwnode_handle *fwnode,
460  				      struct net_device *ndev, void *upstream,
461  				      const struct sfp_upstream_ops *ops)
462  {
463  	struct sfp_bus *bus = sfp_bus_get(fwnode);
464  	int ret = 0;
465  
466  	if (bus) {
467  		rtnl_lock();
468  		bus->upstream_ops = ops;
469  		bus->upstream = upstream;
470  		bus->netdev = ndev;
471  
472  		if (bus->sfp) {
473  			ret = sfp_register_bus(bus);
474  			if (ret)
475  				sfp_upstream_clear(bus);
476  		}
477  		rtnl_unlock();
478  	}
479  
480  	if (ret) {
481  		sfp_bus_put(bus);
482  		bus = NULL;
483  	}
484  
485  	return bus;
486  }
487  EXPORT_SYMBOL_GPL(sfp_register_upstream);
488  
489  /**
490   * sfp_unregister_upstream() - Unregister sfp bus
491   * @bus: a pointer to the &struct sfp_bus structure for the sfp module
492   *
493   * Unregister a previously registered upstream connection for the SFP
494   * module. @bus is returned from sfp_register_upstream().
495   */
sfp_unregister_upstream(struct sfp_bus * bus)496  void sfp_unregister_upstream(struct sfp_bus *bus)
497  {
498  	rtnl_lock();
499  	if (bus->sfp)
500  		sfp_unregister_bus(bus);
501  	sfp_upstream_clear(bus);
502  	rtnl_unlock();
503  
504  	sfp_bus_put(bus);
505  }
506  EXPORT_SYMBOL_GPL(sfp_unregister_upstream);
507  
508  /* Socket driver entry points */
sfp_add_phy(struct sfp_bus * bus,struct phy_device * phydev)509  int sfp_add_phy(struct sfp_bus *bus, struct phy_device *phydev)
510  {
511  	const struct sfp_upstream_ops *ops = sfp_get_upstream_ops(bus);
512  	int ret = 0;
513  
514  	if (ops && ops->connect_phy)
515  		ret = ops->connect_phy(bus->upstream, phydev);
516  
517  	if (ret == 0)
518  		bus->phydev = phydev;
519  
520  	return ret;
521  }
522  EXPORT_SYMBOL_GPL(sfp_add_phy);
523  
sfp_remove_phy(struct sfp_bus * bus)524  void sfp_remove_phy(struct sfp_bus *bus)
525  {
526  	const struct sfp_upstream_ops *ops = sfp_get_upstream_ops(bus);
527  
528  	if (ops && ops->disconnect_phy)
529  		ops->disconnect_phy(bus->upstream);
530  	bus->phydev = NULL;
531  }
532  EXPORT_SYMBOL_GPL(sfp_remove_phy);
533  
sfp_link_up(struct sfp_bus * bus)534  void sfp_link_up(struct sfp_bus *bus)
535  {
536  	const struct sfp_upstream_ops *ops = sfp_get_upstream_ops(bus);
537  
538  	if (ops && ops->link_up)
539  		ops->link_up(bus->upstream);
540  }
541  EXPORT_SYMBOL_GPL(sfp_link_up);
542  
sfp_link_down(struct sfp_bus * bus)543  void sfp_link_down(struct sfp_bus *bus)
544  {
545  	const struct sfp_upstream_ops *ops = sfp_get_upstream_ops(bus);
546  
547  	if (ops && ops->link_down)
548  		ops->link_down(bus->upstream);
549  }
550  EXPORT_SYMBOL_GPL(sfp_link_down);
551  
sfp_module_insert(struct sfp_bus * bus,const struct sfp_eeprom_id * id)552  int sfp_module_insert(struct sfp_bus *bus, const struct sfp_eeprom_id *id)
553  {
554  	const struct sfp_upstream_ops *ops = sfp_get_upstream_ops(bus);
555  	int ret = 0;
556  
557  	if (ops && ops->module_insert)
558  		ret = ops->module_insert(bus->upstream, id);
559  
560  	return ret;
561  }
562  EXPORT_SYMBOL_GPL(sfp_module_insert);
563  
sfp_module_remove(struct sfp_bus * bus)564  void sfp_module_remove(struct sfp_bus *bus)
565  {
566  	const struct sfp_upstream_ops *ops = sfp_get_upstream_ops(bus);
567  
568  	if (ops && ops->module_remove)
569  		ops->module_remove(bus->upstream);
570  }
571  EXPORT_SYMBOL_GPL(sfp_module_remove);
572  
sfp_socket_clear(struct sfp_bus * bus)573  static void sfp_socket_clear(struct sfp_bus *bus)
574  {
575  	bus->sfp_dev = NULL;
576  	bus->sfp = NULL;
577  	bus->socket_ops = NULL;
578  }
579  
sfp_register_socket(struct device * dev,struct sfp * sfp,const struct sfp_socket_ops * ops)580  struct sfp_bus *sfp_register_socket(struct device *dev, struct sfp *sfp,
581  				    const struct sfp_socket_ops *ops)
582  {
583  	struct sfp_bus *bus = sfp_bus_get(dev->fwnode);
584  	int ret = 0;
585  
586  	if (bus) {
587  		rtnl_lock();
588  		bus->sfp_dev = dev;
589  		bus->sfp = sfp;
590  		bus->socket_ops = ops;
591  
592  		if (bus->netdev) {
593  			ret = sfp_register_bus(bus);
594  			if (ret)
595  				sfp_socket_clear(bus);
596  		}
597  		rtnl_unlock();
598  	}
599  
600  	if (ret) {
601  		sfp_bus_put(bus);
602  		bus = NULL;
603  	}
604  
605  	return bus;
606  }
607  EXPORT_SYMBOL_GPL(sfp_register_socket);
608  
sfp_unregister_socket(struct sfp_bus * bus)609  void sfp_unregister_socket(struct sfp_bus *bus)
610  {
611  	rtnl_lock();
612  	if (bus->netdev)
613  		sfp_unregister_bus(bus);
614  	sfp_socket_clear(bus);
615  	rtnl_unlock();
616  
617  	sfp_bus_put(bus);
618  }
619  EXPORT_SYMBOL_GPL(sfp_unregister_socket);
620