xref: /openbmc/linux/include/linux/sfp.h (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
1  #ifndef LINUX_SFP_H
2  #define LINUX_SFP_H
3  
4  #include <linux/phy.h>
5  
6  struct sfp_eeprom_base {
7  	u8 phys_id;
8  	u8 phys_ext_id;
9  	u8 connector;
10  #if defined __BIG_ENDIAN_BITFIELD
11  	u8 e10g_base_er:1;
12  	u8 e10g_base_lrm:1;
13  	u8 e10g_base_lr:1;
14  	u8 e10g_base_sr:1;
15  	u8 if_1x_sx:1;
16  	u8 if_1x_lx:1;
17  	u8 if_1x_copper_active:1;
18  	u8 if_1x_copper_passive:1;
19  
20  	u8 escon_mmf_1310_led:1;
21  	u8 escon_smf_1310_laser:1;
22  	u8 sonet_oc192_short_reach:1;
23  	u8 sonet_reach_bit1:1;
24  	u8 sonet_reach_bit2:1;
25  	u8 sonet_oc48_long_reach:1;
26  	u8 sonet_oc48_intermediate_reach:1;
27  	u8 sonet_oc48_short_reach:1;
28  
29  	u8 unallocated_5_7:1;
30  	u8 sonet_oc12_smf_long_reach:1;
31  	u8 sonet_oc12_smf_intermediate_reach:1;
32  	u8 sonet_oc12_short_reach:1;
33  	u8 unallocated_5_3:1;
34  	u8 sonet_oc3_smf_long_reach:1;
35  	u8 sonet_oc3_smf_intermediate_reach:1;
36  	u8 sonet_oc3_short_reach:1;
37  
38  	u8 e_base_px:1;
39  	u8 e_base_bx10:1;
40  	u8 e100_base_fx:1;
41  	u8 e100_base_lx:1;
42  	u8 e1000_base_t:1;
43  	u8 e1000_base_cx:1;
44  	u8 e1000_base_lx:1;
45  	u8 e1000_base_sx:1;
46  
47  	u8 fc_ll_v:1;
48  	u8 fc_ll_s:1;
49  	u8 fc_ll_i:1;
50  	u8 fc_ll_l:1;
51  	u8 fc_ll_m:1;
52  	u8 fc_tech_sa:1;
53  	u8 fc_tech_lc:1;
54  	u8 fc_tech_electrical_inter_enclosure:1;
55  
56  	u8 fc_tech_electrical_intra_enclosure:1;
57  	u8 fc_tech_sn:1;
58  	u8 fc_tech_sl:1;
59  	u8 fc_tech_ll:1;
60  	u8 sfp_ct_active:1;
61  	u8 sfp_ct_passive:1;
62  	u8 unallocated_8_1:1;
63  	u8 unallocated_8_0:1;
64  
65  	u8 fc_media_tw:1;
66  	u8 fc_media_tp:1;
67  	u8 fc_media_mi:1;
68  	u8 fc_media_tv:1;
69  	u8 fc_media_m6:1;
70  	u8 fc_media_m5:1;
71  	u8 unallocated_9_1:1;
72  	u8 fc_media_sm:1;
73  
74  	u8 fc_speed_1200:1;
75  	u8 fc_speed_800:1;
76  	u8 fc_speed_1600:1;
77  	u8 fc_speed_400:1;
78  	u8 fc_speed_3200:1;
79  	u8 fc_speed_200:1;
80  	u8 unallocated_10_1:1;
81  	u8 fc_speed_100:1;
82  #elif defined __LITTLE_ENDIAN_BITFIELD
83  	u8 if_1x_copper_passive:1;
84  	u8 if_1x_copper_active:1;
85  	u8 if_1x_lx:1;
86  	u8 if_1x_sx:1;
87  	u8 e10g_base_sr:1;
88  	u8 e10g_base_lr:1;
89  	u8 e10g_base_lrm:1;
90  	u8 e10g_base_er:1;
91  
92  	u8 sonet_oc3_short_reach:1;
93  	u8 sonet_oc3_smf_intermediate_reach:1;
94  	u8 sonet_oc3_smf_long_reach:1;
95  	u8 unallocated_5_3:1;
96  	u8 sonet_oc12_short_reach:1;
97  	u8 sonet_oc12_smf_intermediate_reach:1;
98  	u8 sonet_oc12_smf_long_reach:1;
99  	u8 unallocated_5_7:1;
100  
101  	u8 sonet_oc48_short_reach:1;
102  	u8 sonet_oc48_intermediate_reach:1;
103  	u8 sonet_oc48_long_reach:1;
104  	u8 sonet_reach_bit2:1;
105  	u8 sonet_reach_bit1:1;
106  	u8 sonet_oc192_short_reach:1;
107  	u8 escon_smf_1310_laser:1;
108  	u8 escon_mmf_1310_led:1;
109  
110  	u8 e1000_base_sx:1;
111  	u8 e1000_base_lx:1;
112  	u8 e1000_base_cx:1;
113  	u8 e1000_base_t:1;
114  	u8 e100_base_lx:1;
115  	u8 e100_base_fx:1;
116  	u8 e_base_bx10:1;
117  	u8 e_base_px:1;
118  
119  	u8 fc_tech_electrical_inter_enclosure:1;
120  	u8 fc_tech_lc:1;
121  	u8 fc_tech_sa:1;
122  	u8 fc_ll_m:1;
123  	u8 fc_ll_l:1;
124  	u8 fc_ll_i:1;
125  	u8 fc_ll_s:1;
126  	u8 fc_ll_v:1;
127  
128  	u8 unallocated_8_0:1;
129  	u8 unallocated_8_1:1;
130  	u8 sfp_ct_passive:1;
131  	u8 sfp_ct_active:1;
132  	u8 fc_tech_ll:1;
133  	u8 fc_tech_sl:1;
134  	u8 fc_tech_sn:1;
135  	u8 fc_tech_electrical_intra_enclosure:1;
136  
137  	u8 fc_media_sm:1;
138  	u8 unallocated_9_1:1;
139  	u8 fc_media_m5:1;
140  	u8 fc_media_m6:1;
141  	u8 fc_media_tv:1;
142  	u8 fc_media_mi:1;
143  	u8 fc_media_tp:1;
144  	u8 fc_media_tw:1;
145  
146  	u8 fc_speed_100:1;
147  	u8 unallocated_10_1:1;
148  	u8 fc_speed_200:1;
149  	u8 fc_speed_3200:1;
150  	u8 fc_speed_400:1;
151  	u8 fc_speed_1600:1;
152  	u8 fc_speed_800:1;
153  	u8 fc_speed_1200:1;
154  #else
155  #error Unknown Endian
156  #endif
157  	u8 encoding;
158  	u8 br_nominal;
159  	u8 rate_id;
160  	u8 link_len[6];
161  	char vendor_name[16];
162  	u8 extended_cc;
163  	char vendor_oui[3];
164  	char vendor_pn[16];
165  	char vendor_rev[4];
166  	union {
167  		__be16 optical_wavelength;
168  		__be16 cable_compliance;
169  		struct {
170  #if defined __BIG_ENDIAN_BITFIELD
171  			u8 reserved60_2:6;
172  			u8 fc_pi_4_app_h:1;
173  			u8 sff8431_app_e:1;
174  			u8 reserved61:8;
175  #elif defined __LITTLE_ENDIAN_BITFIELD
176  			u8 sff8431_app_e:1;
177  			u8 fc_pi_4_app_h:1;
178  			u8 reserved60_2:6;
179  			u8 reserved61:8;
180  #else
181  #error Unknown Endian
182  #endif
183  		} __packed passive;
184  		struct {
185  #if defined __BIG_ENDIAN_BITFIELD
186  			u8 reserved60_4:4;
187  			u8 fc_pi_4_lim:1;
188  			u8 sff8431_lim:1;
189  			u8 fc_pi_4_app_h:1;
190  			u8 sff8431_app_e:1;
191  			u8 reserved61:8;
192  #elif defined __LITTLE_ENDIAN_BITFIELD
193  			u8 sff8431_app_e:1;
194  			u8 fc_pi_4_app_h:1;
195  			u8 sff8431_lim:1;
196  			u8 fc_pi_4_lim:1;
197  			u8 reserved60_4:4;
198  			u8 reserved61:8;
199  #else
200  #error Unknown Endian
201  #endif
202  		} __packed active;
203  	} __packed;
204  	u8 reserved62;
205  	u8 cc_base;
206  } __packed;
207  
208  struct sfp_eeprom_ext {
209  	__be16 options;
210  	u8 br_max;
211  	u8 br_min;
212  	char vendor_sn[16];
213  	char datecode[8];
214  	u8 diagmon;
215  	u8 enhopts;
216  	u8 sff8472_compliance;
217  	u8 cc_ext;
218  } __packed;
219  
220  /**
221   * struct sfp_eeprom_id - raw SFP module identification information
222   * @base: base SFP module identification structure
223   * @ext: extended SFP module identification structure
224   *
225   * See the SFF-8472 specification and related documents for the definition
226   * of these structure members. This can be obtained from
227   * https://www.snia.org/technology-communities/sff/specifications
228   */
229  struct sfp_eeprom_id {
230  	struct sfp_eeprom_base base;
231  	struct sfp_eeprom_ext ext;
232  } __packed;
233  
234  struct sfp_diag {
235  	__be16 temp_high_alarm;
236  	__be16 temp_low_alarm;
237  	__be16 temp_high_warn;
238  	__be16 temp_low_warn;
239  	__be16 volt_high_alarm;
240  	__be16 volt_low_alarm;
241  	__be16 volt_high_warn;
242  	__be16 volt_low_warn;
243  	__be16 bias_high_alarm;
244  	__be16 bias_low_alarm;
245  	__be16 bias_high_warn;
246  	__be16 bias_low_warn;
247  	__be16 txpwr_high_alarm;
248  	__be16 txpwr_low_alarm;
249  	__be16 txpwr_high_warn;
250  	__be16 txpwr_low_warn;
251  	__be16 rxpwr_high_alarm;
252  	__be16 rxpwr_low_alarm;
253  	__be16 rxpwr_high_warn;
254  	__be16 rxpwr_low_warn;
255  	__be16 laser_temp_high_alarm;
256  	__be16 laser_temp_low_alarm;
257  	__be16 laser_temp_high_warn;
258  	__be16 laser_temp_low_warn;
259  	__be16 tec_cur_high_alarm;
260  	__be16 tec_cur_low_alarm;
261  	__be16 tec_cur_high_warn;
262  	__be16 tec_cur_low_warn;
263  	__be32 cal_rxpwr4;
264  	__be32 cal_rxpwr3;
265  	__be32 cal_rxpwr2;
266  	__be32 cal_rxpwr1;
267  	__be32 cal_rxpwr0;
268  	__be16 cal_txi_slope;
269  	__be16 cal_txi_offset;
270  	__be16 cal_txpwr_slope;
271  	__be16 cal_txpwr_offset;
272  	__be16 cal_t_slope;
273  	__be16 cal_t_offset;
274  	__be16 cal_v_slope;
275  	__be16 cal_v_offset;
276  } __packed;
277  
278  /* SFF8024 defined constants */
279  enum {
280  	SFF8024_ID_UNK			= 0x00,
281  	SFF8024_ID_SFF_8472		= 0x02,
282  	SFF8024_ID_SFP			= 0x03,
283  	SFF8024_ID_DWDM_SFP		= 0x0b,
284  	SFF8024_ID_QSFP_8438		= 0x0c,
285  	SFF8024_ID_QSFP_8436_8636	= 0x0d,
286  	SFF8024_ID_QSFP28_8636		= 0x11,
287  
288  	SFF8024_ENCODING_UNSPEC		= 0x00,
289  	SFF8024_ENCODING_8B10B		= 0x01,
290  	SFF8024_ENCODING_4B5B		= 0x02,
291  	SFF8024_ENCODING_NRZ		= 0x03,
292  	SFF8024_ENCODING_8472_MANCHESTER= 0x04,
293  	SFF8024_ENCODING_8472_SONET	= 0x05,
294  	SFF8024_ENCODING_8472_64B66B	= 0x06,
295  	SFF8024_ENCODING_8436_MANCHESTER= 0x06,
296  	SFF8024_ENCODING_8436_SONET	= 0x04,
297  	SFF8024_ENCODING_8436_64B66B	= 0x05,
298  	SFF8024_ENCODING_256B257B	= 0x07,
299  	SFF8024_ENCODING_PAM4		= 0x08,
300  
301  	SFF8024_CONNECTOR_UNSPEC	= 0x00,
302  	/* codes 01-05 not supportable on SFP, but some modules have single SC */
303  	SFF8024_CONNECTOR_SC		= 0x01,
304  	SFF8024_CONNECTOR_FIBERJACK	= 0x06,
305  	SFF8024_CONNECTOR_LC		= 0x07,
306  	SFF8024_CONNECTOR_MT_RJ		= 0x08,
307  	SFF8024_CONNECTOR_MU		= 0x09,
308  	SFF8024_CONNECTOR_SG		= 0x0a,
309  	SFF8024_CONNECTOR_OPTICAL_PIGTAIL= 0x0b,
310  	SFF8024_CONNECTOR_MPO_1X12	= 0x0c,
311  	SFF8024_CONNECTOR_MPO_2X16	= 0x0d,
312  	SFF8024_CONNECTOR_HSSDC_II	= 0x20,
313  	SFF8024_CONNECTOR_COPPER_PIGTAIL= 0x21,
314  	SFF8024_CONNECTOR_RJ45		= 0x22,
315  	SFF8024_CONNECTOR_NOSEPARATE	= 0x23,
316  	SFF8024_CONNECTOR_MXC_2X16	= 0x24,
317  
318  	SFF8024_ECC_UNSPEC		= 0x00,
319  	SFF8024_ECC_100G_25GAUI_C2M_AOC	= 0x01,
320  	SFF8024_ECC_100GBASE_SR4_25GBASE_SR = 0x02,
321  	SFF8024_ECC_100GBASE_LR4_25GBASE_LR = 0x03,
322  	SFF8024_ECC_100GBASE_ER4_25GBASE_ER = 0x04,
323  	SFF8024_ECC_100GBASE_SR10	= 0x05,
324  	SFF8024_ECC_100GBASE_CR4	= 0x0b,
325  	SFF8024_ECC_25GBASE_CR_S	= 0x0c,
326  	SFF8024_ECC_25GBASE_CR_N	= 0x0d,
327  	SFF8024_ECC_10GBASE_T_SFI	= 0x16,
328  	SFF8024_ECC_10GBASE_T_SR	= 0x1c,
329  	SFF8024_ECC_5GBASE_T		= 0x1d,
330  	SFF8024_ECC_2_5GBASE_T		= 0x1e,
331  };
332  
333  /* SFP EEPROM registers */
334  enum {
335  	SFP_PHYS_ID			= 0,
336  
337  	SFP_PHYS_EXT_ID			= 1,
338  	SFP_PHYS_EXT_ID_SFP		= 0x04,
339  
340  	SFP_CONNECTOR			= 2,
341  	SFP_COMPLIANCE			= 3,
342  	SFP_ENCODING			= 11,
343  	SFP_BR_NOMINAL			= 12,
344  	SFP_RATE_ID			= 13,
345  	SFF_RID_8079			= 0x01,
346  	SFF_RID_8431_RX_ONLY		= 0x02,
347  	SFF_RID_8431_TX_ONLY		= 0x04,
348  	SFF_RID_8431			= 0x06,
349  	SFF_RID_10G8G			= 0x0e,
350  
351  	SFP_LINK_LEN_SM_KM		= 14,
352  	SFP_LINK_LEN_SM_100M		= 15,
353  	SFP_LINK_LEN_50UM_OM2_10M	= 16,
354  	SFP_LINK_LEN_62_5UM_OM1_10M	= 17,
355  	SFP_LINK_LEN_COPPER_1M		= 18,
356  	SFP_LINK_LEN_50UM_OM4_10M	= 18,
357  	SFP_LINK_LEN_50UM_OM3_10M	= 19,
358  	SFP_VENDOR_NAME			= 20,
359  	SFP_VENDOR_OUI			= 37,
360  	SFP_VENDOR_PN			= 40,
361  	SFP_VENDOR_REV			= 56,
362  	SFP_OPTICAL_WAVELENGTH_MSB	= 60,
363  	SFP_OPTICAL_WAVELENGTH_LSB	= 61,
364  	SFP_CABLE_SPEC			= 60,
365  	SFP_CC_BASE			= 63,
366  
367  	SFP_OPTIONS			= 64,	/* 2 bytes, MSB, LSB */
368  	SFP_OPTIONS_HIGH_POWER_LEVEL	= BIT(13),
369  	SFP_OPTIONS_PAGING_A2		= BIT(12),
370  	SFP_OPTIONS_RETIMER		= BIT(11),
371  	SFP_OPTIONS_COOLED_XCVR		= BIT(10),
372  	SFP_OPTIONS_POWER_DECL		= BIT(9),
373  	SFP_OPTIONS_RX_LINEAR_OUT	= BIT(8),
374  	SFP_OPTIONS_RX_DECISION_THRESH	= BIT(7),
375  	SFP_OPTIONS_TUNABLE_TX		= BIT(6),
376  	SFP_OPTIONS_RATE_SELECT		= BIT(5),
377  	SFP_OPTIONS_TX_DISABLE		= BIT(4),
378  	SFP_OPTIONS_TX_FAULT		= BIT(3),
379  	SFP_OPTIONS_LOS_INVERTED	= BIT(2),
380  	SFP_OPTIONS_LOS_NORMAL		= BIT(1),
381  
382  	SFP_BR_MAX			= 66,
383  	SFP_BR_MIN			= 67,
384  	SFP_VENDOR_SN			= 68,
385  	SFP_DATECODE			= 84,
386  
387  	SFP_DIAGMON			= 92,
388  	SFP_DIAGMON_DDM			= BIT(6),
389  	SFP_DIAGMON_INT_CAL		= BIT(5),
390  	SFP_DIAGMON_EXT_CAL		= BIT(4),
391  	SFP_DIAGMON_RXPWR_AVG		= BIT(3),
392  	SFP_DIAGMON_ADDRMODE		= BIT(2),
393  
394  	SFP_ENHOPTS			= 93,
395  	SFP_ENHOPTS_ALARMWARN		= BIT(7),
396  	SFP_ENHOPTS_SOFT_TX_DISABLE	= BIT(6),
397  	SFP_ENHOPTS_SOFT_TX_FAULT	= BIT(5),
398  	SFP_ENHOPTS_SOFT_RX_LOS		= BIT(4),
399  	SFP_ENHOPTS_SOFT_RATE_SELECT	= BIT(3),
400  	SFP_ENHOPTS_APP_SELECT_SFF8079	= BIT(2),
401  	SFP_ENHOPTS_SOFT_RATE_SFF8431	= BIT(1),
402  
403  	SFP_SFF8472_COMPLIANCE		= 94,
404  	SFP_SFF8472_COMPLIANCE_NONE	= 0x00,
405  	SFP_SFF8472_COMPLIANCE_REV9_3	= 0x01,
406  	SFP_SFF8472_COMPLIANCE_REV9_5	= 0x02,
407  	SFP_SFF8472_COMPLIANCE_REV10_2	= 0x03,
408  	SFP_SFF8472_COMPLIANCE_REV10_4	= 0x04,
409  	SFP_SFF8472_COMPLIANCE_REV11_0	= 0x05,
410  	SFP_SFF8472_COMPLIANCE_REV11_3	= 0x06,
411  	SFP_SFF8472_COMPLIANCE_REV11_4	= 0x07,
412  	SFP_SFF8472_COMPLIANCE_REV12_0	= 0x08,
413  
414  	SFP_CC_EXT			= 95,
415  };
416  
417  /* SFP Diagnostics */
418  enum {
419  	/* Alarm and warnings stored MSB at lower address then LSB */
420  	SFP_TEMP_HIGH_ALARM		= 0,
421  	SFP_TEMP_LOW_ALARM		= 2,
422  	SFP_TEMP_HIGH_WARN		= 4,
423  	SFP_TEMP_LOW_WARN		= 6,
424  	SFP_VOLT_HIGH_ALARM		= 8,
425  	SFP_VOLT_LOW_ALARM		= 10,
426  	SFP_VOLT_HIGH_WARN		= 12,
427  	SFP_VOLT_LOW_WARN		= 14,
428  	SFP_BIAS_HIGH_ALARM		= 16,
429  	SFP_BIAS_LOW_ALARM		= 18,
430  	SFP_BIAS_HIGH_WARN		= 20,
431  	SFP_BIAS_LOW_WARN		= 22,
432  	SFP_TXPWR_HIGH_ALARM		= 24,
433  	SFP_TXPWR_LOW_ALARM		= 26,
434  	SFP_TXPWR_HIGH_WARN		= 28,
435  	SFP_TXPWR_LOW_WARN		= 30,
436  	SFP_RXPWR_HIGH_ALARM		= 32,
437  	SFP_RXPWR_LOW_ALARM		= 34,
438  	SFP_RXPWR_HIGH_WARN		= 36,
439  	SFP_RXPWR_LOW_WARN		= 38,
440  	SFP_LASER_TEMP_HIGH_ALARM	= 40,
441  	SFP_LASER_TEMP_LOW_ALARM	= 42,
442  	SFP_LASER_TEMP_HIGH_WARN	= 44,
443  	SFP_LASER_TEMP_LOW_WARN		= 46,
444  	SFP_TEC_CUR_HIGH_ALARM		= 48,
445  	SFP_TEC_CUR_LOW_ALARM		= 50,
446  	SFP_TEC_CUR_HIGH_WARN		= 52,
447  	SFP_TEC_CUR_LOW_WARN		= 54,
448  	SFP_CAL_RXPWR4			= 56,
449  	SFP_CAL_RXPWR3			= 60,
450  	SFP_CAL_RXPWR2			= 64,
451  	SFP_CAL_RXPWR1			= 68,
452  	SFP_CAL_RXPWR0			= 72,
453  	SFP_CAL_TXI_SLOPE		= 76,
454  	SFP_CAL_TXI_OFFSET		= 78,
455  	SFP_CAL_TXPWR_SLOPE		= 80,
456  	SFP_CAL_TXPWR_OFFSET		= 82,
457  	SFP_CAL_T_SLOPE			= 84,
458  	SFP_CAL_T_OFFSET		= 86,
459  	SFP_CAL_V_SLOPE			= 88,
460  	SFP_CAL_V_OFFSET		= 90,
461  	SFP_CHKSUM			= 95,
462  
463  	SFP_TEMP			= 96,
464  	SFP_VCC				= 98,
465  	SFP_TX_BIAS			= 100,
466  	SFP_TX_POWER			= 102,
467  	SFP_RX_POWER			= 104,
468  	SFP_LASER_TEMP			= 106,
469  	SFP_TEC_CUR			= 108,
470  
471  	SFP_STATUS			= 110,
472  	SFP_STATUS_TX_DISABLE		= BIT(7),
473  	SFP_STATUS_TX_DISABLE_FORCE	= BIT(6),
474  	SFP_STATUS_RS0_SELECT		= BIT(3),
475  	SFP_STATUS_TX_FAULT		= BIT(2),
476  	SFP_STATUS_RX_LOS		= BIT(1),
477  	SFP_ALARM0			= 112,
478  	SFP_ALARM0_TEMP_HIGH		= BIT(7),
479  	SFP_ALARM0_TEMP_LOW		= BIT(6),
480  	SFP_ALARM0_VCC_HIGH		= BIT(5),
481  	SFP_ALARM0_VCC_LOW		= BIT(4),
482  	SFP_ALARM0_TX_BIAS_HIGH		= BIT(3),
483  	SFP_ALARM0_TX_BIAS_LOW		= BIT(2),
484  	SFP_ALARM0_TXPWR_HIGH		= BIT(1),
485  	SFP_ALARM0_TXPWR_LOW		= BIT(0),
486  
487  	SFP_ALARM1			= 113,
488  	SFP_ALARM1_RXPWR_HIGH		= BIT(7),
489  	SFP_ALARM1_RXPWR_LOW		= BIT(6),
490  
491  	SFP_WARN0			= 116,
492  	SFP_WARN0_TEMP_HIGH		= BIT(7),
493  	SFP_WARN0_TEMP_LOW		= BIT(6),
494  	SFP_WARN0_VCC_HIGH		= BIT(5),
495  	SFP_WARN0_VCC_LOW		= BIT(4),
496  	SFP_WARN0_TX_BIAS_HIGH		= BIT(3),
497  	SFP_WARN0_TX_BIAS_LOW		= BIT(2),
498  	SFP_WARN0_TXPWR_HIGH		= BIT(1),
499  	SFP_WARN0_TXPWR_LOW		= BIT(0),
500  
501  	SFP_WARN1			= 117,
502  	SFP_WARN1_RXPWR_HIGH		= BIT(7),
503  	SFP_WARN1_RXPWR_LOW		= BIT(6),
504  
505  	SFP_EXT_STATUS			= 118,
506  	SFP_EXT_STATUS_RS1_SELECT	= BIT(3),
507  	SFP_EXT_STATUS_PWRLVL_SELECT	= BIT(0),
508  
509  	SFP_VSL				= 120,
510  	SFP_PAGE			= 127,
511  };
512  
513  struct fwnode_handle;
514  struct ethtool_eeprom;
515  struct ethtool_modinfo;
516  struct sfp_bus;
517  
518  /**
519   * struct sfp_upstream_ops - upstream operations structure
520   * @attach: called when the sfp socket driver is bound to the upstream
521   *   (mandatory).
522   * @detach: called when the sfp socket driver is unbound from the upstream
523   *   (mandatory).
524   * @module_insert: called after a module has been detected to determine
525   *   whether the module is supported for the upstream device.
526   * @module_remove: called after the module has been removed.
527   * @module_start: called after the PHY probe step
528   * @module_stop: called before the PHY is removed
529   * @link_down: called when the link is non-operational for whatever
530   *   reason.
531   * @link_up: called when the link is operational.
532   * @connect_phy: called when an I2C accessible PHY has been detected
533   *   on the module.
534   * @disconnect_phy: called when a module with an I2C accessible PHY has
535   *   been removed.
536   */
537  struct sfp_upstream_ops {
538  	void (*attach)(void *priv, struct sfp_bus *bus);
539  	void (*detach)(void *priv, struct sfp_bus *bus);
540  	int (*module_insert)(void *priv, const struct sfp_eeprom_id *id);
541  	void (*module_remove)(void *priv);
542  	int (*module_start)(void *priv);
543  	void (*module_stop)(void *priv);
544  	void (*link_down)(void *priv);
545  	void (*link_up)(void *priv);
546  	int (*connect_phy)(void *priv, struct phy_device *);
547  	void (*disconnect_phy)(void *priv);
548  };
549  
550  #if IS_ENABLED(CONFIG_SFP)
551  int sfp_parse_port(struct sfp_bus *bus, const struct sfp_eeprom_id *id,
552  		   unsigned long *support);
553  bool sfp_may_have_phy(struct sfp_bus *bus, const struct sfp_eeprom_id *id);
554  void sfp_parse_support(struct sfp_bus *bus, const struct sfp_eeprom_id *id,
555  		       unsigned long *support, unsigned long *interfaces);
556  phy_interface_t sfp_select_interface(struct sfp_bus *bus,
557  				     unsigned long *link_modes);
558  
559  int sfp_get_module_info(struct sfp_bus *bus, struct ethtool_modinfo *modinfo);
560  int sfp_get_module_eeprom(struct sfp_bus *bus, struct ethtool_eeprom *ee,
561  			  u8 *data);
562  int sfp_get_module_eeprom_by_page(struct sfp_bus *bus,
563  				  const struct ethtool_module_eeprom *page,
564  				  struct netlink_ext_ack *extack);
565  void sfp_upstream_start(struct sfp_bus *bus);
566  void sfp_upstream_stop(struct sfp_bus *bus);
567  void sfp_upstream_set_signal_rate(struct sfp_bus *bus, unsigned int rate_kbd);
568  void sfp_bus_put(struct sfp_bus *bus);
569  struct sfp_bus *sfp_bus_find_fwnode(const struct fwnode_handle *fwnode);
570  int sfp_bus_add_upstream(struct sfp_bus *bus, void *upstream,
571  			 const struct sfp_upstream_ops *ops);
572  void sfp_bus_del_upstream(struct sfp_bus *bus);
573  #else
sfp_parse_port(struct sfp_bus * bus,const struct sfp_eeprom_id * id,unsigned long * support)574  static inline int sfp_parse_port(struct sfp_bus *bus,
575  				 const struct sfp_eeprom_id *id,
576  				 unsigned long *support)
577  {
578  	return PORT_OTHER;
579  }
580  
sfp_may_have_phy(struct sfp_bus * bus,const struct sfp_eeprom_id * id)581  static inline bool sfp_may_have_phy(struct sfp_bus *bus,
582  				    const struct sfp_eeprom_id *id)
583  {
584  	return false;
585  }
586  
sfp_parse_support(struct sfp_bus * bus,const struct sfp_eeprom_id * id,unsigned long * support,unsigned long * interfaces)587  static inline void sfp_parse_support(struct sfp_bus *bus,
588  				     const struct sfp_eeprom_id *id,
589  				     unsigned long *support,
590  				     unsigned long *interfaces)
591  {
592  }
593  
sfp_select_interface(struct sfp_bus * bus,unsigned long * link_modes)594  static inline phy_interface_t sfp_select_interface(struct sfp_bus *bus,
595  						   unsigned long *link_modes)
596  {
597  	return PHY_INTERFACE_MODE_NA;
598  }
599  
sfp_get_module_info(struct sfp_bus * bus,struct ethtool_modinfo * modinfo)600  static inline int sfp_get_module_info(struct sfp_bus *bus,
601  				      struct ethtool_modinfo *modinfo)
602  {
603  	return -EOPNOTSUPP;
604  }
605  
sfp_get_module_eeprom(struct sfp_bus * bus,struct ethtool_eeprom * ee,u8 * data)606  static inline int sfp_get_module_eeprom(struct sfp_bus *bus,
607  					struct ethtool_eeprom *ee, u8 *data)
608  {
609  	return -EOPNOTSUPP;
610  }
611  
sfp_get_module_eeprom_by_page(struct sfp_bus * bus,const struct ethtool_module_eeprom * page,struct netlink_ext_ack * extack)612  static inline int sfp_get_module_eeprom_by_page(struct sfp_bus *bus,
613  						const struct ethtool_module_eeprom *page,
614  						struct netlink_ext_ack *extack)
615  {
616  	return -EOPNOTSUPP;
617  }
618  
sfp_upstream_start(struct sfp_bus * bus)619  static inline void sfp_upstream_start(struct sfp_bus *bus)
620  {
621  }
622  
sfp_upstream_stop(struct sfp_bus * bus)623  static inline void sfp_upstream_stop(struct sfp_bus *bus)
624  {
625  }
626  
sfp_upstream_set_signal_rate(struct sfp_bus * bus,unsigned int rate_kbd)627  static inline void sfp_upstream_set_signal_rate(struct sfp_bus *bus,
628  						unsigned int rate_kbd)
629  {
630  }
631  
sfp_bus_put(struct sfp_bus * bus)632  static inline void sfp_bus_put(struct sfp_bus *bus)
633  {
634  }
635  
636  static inline struct sfp_bus *
sfp_bus_find_fwnode(const struct fwnode_handle * fwnode)637  sfp_bus_find_fwnode(const struct fwnode_handle *fwnode)
638  {
639  	return NULL;
640  }
641  
sfp_bus_add_upstream(struct sfp_bus * bus,void * upstream,const struct sfp_upstream_ops * ops)642  static inline int sfp_bus_add_upstream(struct sfp_bus *bus, void *upstream,
643  				       const struct sfp_upstream_ops *ops)
644  {
645  	return 0;
646  }
647  
sfp_bus_del_upstream(struct sfp_bus * bus)648  static inline void sfp_bus_del_upstream(struct sfp_bus *bus)
649  {
650  }
651  #endif
652  
653  #endif
654