diff options
Diffstat (limited to 'include/linux/sfp.h')
| -rw-r--r-- | include/linux/sfp.h | 95 | 
1 files changed, 66 insertions, 29 deletions
diff --git a/include/linux/sfp.h b/include/linux/sfp.h index 487fd9412d10..38893e4dd0f0 100644 --- a/include/linux/sfp.h +++ b/include/linux/sfp.h @@ -275,6 +275,61 @@ struct sfp_diag {  	__be16 cal_v_offset;  } __packed; +/* SFF8024 defined constants */ +enum { +	SFF8024_ID_UNK			= 0x00, +	SFF8024_ID_SFF_8472		= 0x02, +	SFF8024_ID_SFP			= 0x03, +	SFF8024_ID_DWDM_SFP		= 0x0b, +	SFF8024_ID_QSFP_8438		= 0x0c, +	SFF8024_ID_QSFP_8436_8636	= 0x0d, +	SFF8024_ID_QSFP28_8636		= 0x11, + +	SFF8024_ENCODING_UNSPEC		= 0x00, +	SFF8024_ENCODING_8B10B		= 0x01, +	SFF8024_ENCODING_4B5B		= 0x02, +	SFF8024_ENCODING_NRZ		= 0x03, +	SFF8024_ENCODING_8472_MANCHESTER= 0x04, +	SFF8024_ENCODING_8472_SONET	= 0x05, +	SFF8024_ENCODING_8472_64B66B	= 0x06, +	SFF8024_ENCODING_8436_MANCHESTER= 0x06, +	SFF8024_ENCODING_8436_SONET	= 0x04, +	SFF8024_ENCODING_8436_64B66B	= 0x05, +	SFF8024_ENCODING_256B257B	= 0x07, +	SFF8024_ENCODING_PAM4		= 0x08, + +	SFF8024_CONNECTOR_UNSPEC	= 0x00, +	/* codes 01-05 not supportable on SFP, but some modules have single SC */ +	SFF8024_CONNECTOR_SC		= 0x01, +	SFF8024_CONNECTOR_FIBERJACK	= 0x06, +	SFF8024_CONNECTOR_LC		= 0x07, +	SFF8024_CONNECTOR_MT_RJ		= 0x08, +	SFF8024_CONNECTOR_MU		= 0x09, +	SFF8024_CONNECTOR_SG		= 0x0a, +	SFF8024_CONNECTOR_OPTICAL_PIGTAIL= 0x0b, +	SFF8024_CONNECTOR_MPO_1X12	= 0x0c, +	SFF8024_CONNECTOR_MPO_2X16	= 0x0d, +	SFF8024_CONNECTOR_HSSDC_II	= 0x20, +	SFF8024_CONNECTOR_COPPER_PIGTAIL= 0x21, +	SFF8024_CONNECTOR_RJ45		= 0x22, +	SFF8024_CONNECTOR_NOSEPARATE	= 0x23, +	SFF8024_CONNECTOR_MXC_2X16	= 0x24, + +	SFF8024_ECC_UNSPEC		= 0x00, +	SFF8024_ECC_100G_25GAUI_C2M_AOC	= 0x01, +	SFF8024_ECC_100GBASE_SR4_25GBASE_SR = 0x02, +	SFF8024_ECC_100GBASE_LR4_25GBASE_LR = 0x03, +	SFF8024_ECC_100GBASE_ER4_25GBASE_ER = 0x04, +	SFF8024_ECC_100GBASE_SR10	= 0x05, +	SFF8024_ECC_100GBASE_CR4	= 0x0b, +	SFF8024_ECC_25GBASE_CR_S	= 0x0c, +	SFF8024_ECC_25GBASE_CR_N	= 0x0d, +	SFF8024_ECC_10GBASE_T_SFI	= 0x16, +	SFF8024_ECC_10GBASE_T_SR	= 0x1c, +	SFF8024_ECC_5GBASE_T		= 0x1d, +	SFF8024_ECC_2_5GBASE_T		= 0x1e, +}; +  /* SFP EEPROM registers */  enum {  	SFP_PHYS_ID			= 0x00, @@ -309,34 +364,7 @@ enum {  	SFP_SFF8472_COMPLIANCE		= 0x5e,  	SFP_CC_EXT			= 0x5f, -	SFP_PHYS_ID_SFF			= 0x02, -	SFP_PHYS_ID_SFP			= 0x03,  	SFP_PHYS_EXT_ID_SFP		= 0x04, -	SFP_CONNECTOR_UNSPEC		= 0x00, -	/* codes 01-05 not supportable on SFP, but some modules have single SC */ -	SFP_CONNECTOR_SC		= 0x01, -	SFP_CONNECTOR_FIBERJACK		= 0x06, -	SFP_CONNECTOR_LC		= 0x07, -	SFP_CONNECTOR_MT_RJ		= 0x08, -	SFP_CONNECTOR_MU		= 0x09, -	SFP_CONNECTOR_SG		= 0x0a, -	SFP_CONNECTOR_OPTICAL_PIGTAIL	= 0x0b, -	SFP_CONNECTOR_MPO_1X12		= 0x0c, -	SFP_CONNECTOR_MPO_2X16		= 0x0d, -	SFP_CONNECTOR_HSSDC_II		= 0x20, -	SFP_CONNECTOR_COPPER_PIGTAIL	= 0x21, -	SFP_CONNECTOR_RJ45		= 0x22, -	SFP_CONNECTOR_NOSEPARATE	= 0x23, -	SFP_CONNECTOR_MXC_2X16		= 0x24, -	SFP_ENCODING_UNSPEC		= 0x00, -	SFP_ENCODING_8B10B		= 0x01, -	SFP_ENCODING_4B5B		= 0x02, -	SFP_ENCODING_NRZ		= 0x03, -	SFP_ENCODING_8472_MANCHESTER	= 0x04, -	SFP_ENCODING_8472_SONET		= 0x05, -	SFP_ENCODING_8472_64B66B	= 0x06, -	SFP_ENCODING_256B257B		= 0x07, -	SFP_ENCODING_PAM4		= 0x08,  	SFP_OPTIONS_HIGH_POWER_LEVEL	= BIT(13),  	SFP_OPTIONS_PAGING_A2		= BIT(12),  	SFP_OPTIONS_RETIMER		= BIT(11), @@ -479,6 +507,8 @@ struct sfp_bus;   * @module_insert: called after a module has been detected to determine   *   whether the module is supported for the upstream device.   * @module_remove: called after the module has been removed. + * @module_start: called after the PHY probe step + * @module_stop: called before the PHY is removed   * @link_down: called when the link is non-operational for whatever   *   reason.   * @link_up: called when the link is operational. @@ -492,6 +522,8 @@ struct sfp_upstream_ops {  	void (*detach)(void *priv, struct sfp_bus *bus);  	int (*module_insert)(void *priv, const struct sfp_eeprom_id *id);  	void (*module_remove)(void *priv); +	int (*module_start)(void *priv); +	void (*module_stop)(void *priv);  	void (*link_down)(void *priv);  	void (*link_up)(void *priv);  	int (*connect_phy)(void *priv, struct phy_device *); @@ -501,10 +533,10 @@ struct sfp_upstream_ops {  #if IS_ENABLED(CONFIG_SFP)  int sfp_parse_port(struct sfp_bus *bus, const struct sfp_eeprom_id *id,  		   unsigned long *support); +bool sfp_may_have_phy(struct sfp_bus *bus, const struct sfp_eeprom_id *id);  void sfp_parse_support(struct sfp_bus *bus, const struct sfp_eeprom_id *id,  		       unsigned long *support);  phy_interface_t sfp_select_interface(struct sfp_bus *bus, -				     const struct sfp_eeprom_id *id,  				     unsigned long *link_modes);  int sfp_get_module_info(struct sfp_bus *bus, struct ethtool_modinfo *modinfo); @@ -525,6 +557,12 @@ static inline int sfp_parse_port(struct sfp_bus *bus,  	return PORT_OTHER;  } +static inline bool sfp_may_have_phy(struct sfp_bus *bus, +				    const struct sfp_eeprom_id *id) +{ +	return false; +} +  static inline void sfp_parse_support(struct sfp_bus *bus,  				     const struct sfp_eeprom_id *id,  				     unsigned long *support) @@ -532,7 +570,6 @@ static inline void sfp_parse_support(struct sfp_bus *bus,  }  static inline phy_interface_t sfp_select_interface(struct sfp_bus *bus, -						   const struct sfp_eeprom_id *id,  						   unsigned long *link_modes)  {  	return PHY_INTERFACE_MODE_NA;  |