Lines Matching refs:sfp
171 struct sfp { struct
180 unsigned int (*get_state)(struct sfp *); argument
181 void (*set_state)(struct sfp *, unsigned int); argument
182 int (*read)(struct sfp *, bool, u8, void *, size_t); argument
183 int (*write)(struct sfp *, bool, u8, void *, size_t); argument
237 static unsigned int sfp_gpio_get_state(struct sfp *sfp) in sfp_gpio_get_state() argument
242 if (gpio_flags[i] != GPIOD_IN || !sfp->gpio[i]) in sfp_gpio_get_state()
245 v = gpiod_get_value_cansleep(sfp->gpio[i]); in sfp_gpio_get_state()
253 static unsigned int sff_gpio_get_state(struct sfp *sfp) in sff_gpio_get_state() argument
255 return sfp_gpio_get_state(sfp) | SFP_F_PRESENT; in sff_gpio_get_state()
258 static void sfp_gpio_set_state(struct sfp *sfp, unsigned int state) in sfp_gpio_set_state() argument
262 if (sfp->gpio[GPIO_TX_DISABLE]) in sfp_gpio_set_state()
263 gpiod_direction_output(sfp->gpio[GPIO_TX_DISABLE], in sfp_gpio_set_state()
266 gpiod_direction_output(sfp->gpio[GPIO_RATE_SELECT], in sfp_gpio_set_state()
270 if (sfp->gpio[GPIO_TX_DISABLE]) in sfp_gpio_set_state()
271 gpiod_direction_input(sfp->gpio[GPIO_TX_DISABLE]); in sfp_gpio_set_state()
273 gpiod_direction_input(sfp->gpio[GPIO_RATE_SELECT]); in sfp_gpio_set_state()
277 static int sfp_i2c_read(struct sfp *sfp, bool a2, u8 dev_addr, void *buf, in sfp_i2c_read() argument
293 ret = i2c_transfer(sfp->i2c, msgs, ARRAY_SIZE(msgs)); in sfp_i2c_read()
300 static int sfp_i2c_write(struct sfp *sfp, bool a2, u8 dev_addr, void *buf, in sfp_i2c_write() argument
317 ret = i2c_transfer(sfp->i2c, msgs, ARRAY_SIZE(msgs)); in sfp_i2c_write()
327 static int sfp_i2c_configure(struct sfp *sfp, struct i2c_adapter *i2c) in sfp_i2c_configure() argument
335 sfp->i2c = i2c; in sfp_i2c_configure()
336 sfp->read = sfp_i2c_read; in sfp_i2c_configure()
337 sfp->write = sfp_i2c_write; in sfp_i2c_configure()
339 i2c_mii = mdio_i2c_alloc(sfp->dev, i2c); in sfp_i2c_configure()
352 sfp->i2c_mii = i2c_mii; in sfp_i2c_configure()
358 static unsigned int sfp_get_state(struct sfp *sfp) in sfp_get_state() argument
360 return sfp->get_state(sfp); in sfp_get_state()
363 static void sfp_set_state(struct sfp *sfp, unsigned int state) in sfp_set_state() argument
365 sfp->set_state(sfp, state); in sfp_set_state()
368 static int sfp_read(struct sfp *sfp, bool a2, u8 addr, void *buf, size_t len) in sfp_read() argument
370 return sfp->read(sfp, a2, addr, buf, len); in sfp_read()
373 static int sfp_write(struct sfp *sfp, bool a2, u8 addr, void *buf, size_t len) in sfp_write() argument
375 return sfp->write(sfp, a2, addr, buf, len); in sfp_write()
394 const struct sfp *sfp = data; in sfp_hwmon_is_visible() local
407 if (!(sfp->id.ext.enhopts & SFP_ENHOPTS_ALARMWARN)) in sfp_hwmon_is_visible()
425 if (!(sfp->id.ext.enhopts & SFP_ENHOPTS_ALARMWARN)) in sfp_hwmon_is_visible()
443 if (!(sfp->id.ext.enhopts & SFP_ENHOPTS_ALARMWARN)) in sfp_hwmon_is_visible()
458 if (sfp->id.ext.diagmon & SFP_DIAGMON_EXT_CAL && in sfp_hwmon_is_visible()
470 if (!(sfp->id.ext.enhopts & SFP_ENHOPTS_ALARMWARN)) in sfp_hwmon_is_visible()
483 static int sfp_hwmon_read_sensor(struct sfp *sfp, int reg, long *value) in sfp_hwmon_read_sensor() argument
488 err = sfp_read(sfp, true, reg, &val, sizeof(val)); in sfp_hwmon_read_sensor()
502 static void sfp_hwmon_calibrate(struct sfp *sfp, unsigned int slope, int offset, in sfp_hwmon_calibrate() argument
505 if (sfp->id.ext.diagmon & SFP_DIAGMON_EXT_CAL) in sfp_hwmon_calibrate()
509 static void sfp_hwmon_calibrate_temp(struct sfp *sfp, long *value) in sfp_hwmon_calibrate_temp() argument
511 sfp_hwmon_calibrate(sfp, be16_to_cpu(sfp->diag.cal_t_slope), in sfp_hwmon_calibrate_temp()
512 be16_to_cpu(sfp->diag.cal_t_offset), value); in sfp_hwmon_calibrate_temp()
520 static void sfp_hwmon_calibrate_vcc(struct sfp *sfp, long *value) in sfp_hwmon_calibrate_vcc() argument
522 sfp_hwmon_calibrate(sfp, be16_to_cpu(sfp->diag.cal_v_slope), in sfp_hwmon_calibrate_vcc()
523 be16_to_cpu(sfp->diag.cal_v_offset), value); in sfp_hwmon_calibrate_vcc()
528 static void sfp_hwmon_calibrate_bias(struct sfp *sfp, long *value) in sfp_hwmon_calibrate_bias() argument
530 sfp_hwmon_calibrate(sfp, be16_to_cpu(sfp->diag.cal_txi_slope), in sfp_hwmon_calibrate_bias()
531 be16_to_cpu(sfp->diag.cal_txi_offset), value); in sfp_hwmon_calibrate_bias()
536 static void sfp_hwmon_calibrate_tx_power(struct sfp *sfp, long *value) in sfp_hwmon_calibrate_tx_power() argument
538 sfp_hwmon_calibrate(sfp, be16_to_cpu(sfp->diag.cal_txpwr_slope), in sfp_hwmon_calibrate_tx_power()
539 be16_to_cpu(sfp->diag.cal_txpwr_offset), value); in sfp_hwmon_calibrate_tx_power()
544 static int sfp_hwmon_read_temp(struct sfp *sfp, int reg, long *value) in sfp_hwmon_read_temp() argument
548 err = sfp_hwmon_read_sensor(sfp, reg, value); in sfp_hwmon_read_temp()
552 sfp_hwmon_calibrate_temp(sfp, value); in sfp_hwmon_read_temp()
557 static int sfp_hwmon_read_vcc(struct sfp *sfp, int reg, long *value) in sfp_hwmon_read_vcc() argument
561 err = sfp_hwmon_read_sensor(sfp, reg, value); in sfp_hwmon_read_vcc()
565 sfp_hwmon_calibrate_vcc(sfp, value); in sfp_hwmon_read_vcc()
570 static int sfp_hwmon_read_bias(struct sfp *sfp, int reg, long *value) in sfp_hwmon_read_bias() argument
574 err = sfp_hwmon_read_sensor(sfp, reg, value); in sfp_hwmon_read_bias()
578 sfp_hwmon_calibrate_bias(sfp, value); in sfp_hwmon_read_bias()
583 static int sfp_hwmon_read_tx_power(struct sfp *sfp, int reg, long *value) in sfp_hwmon_read_tx_power() argument
587 err = sfp_hwmon_read_sensor(sfp, reg, value); in sfp_hwmon_read_tx_power()
591 sfp_hwmon_calibrate_tx_power(sfp, value); in sfp_hwmon_read_tx_power()
596 static int sfp_hwmon_read_rx_power(struct sfp *sfp, int reg, long *value) in sfp_hwmon_read_rx_power() argument
600 err = sfp_hwmon_read_sensor(sfp, reg, value); in sfp_hwmon_read_rx_power()
609 static int sfp_hwmon_temp(struct sfp *sfp, u32 attr, long *value) in sfp_hwmon_temp() argument
616 return sfp_hwmon_read_temp(sfp, SFP_TEMP, value); in sfp_hwmon_temp()
619 *value = be16_to_cpu(sfp->diag.temp_low_alarm); in sfp_hwmon_temp()
620 sfp_hwmon_calibrate_temp(sfp, value); in sfp_hwmon_temp()
624 *value = be16_to_cpu(sfp->diag.temp_low_warn); in sfp_hwmon_temp()
625 sfp_hwmon_calibrate_temp(sfp, value); in sfp_hwmon_temp()
628 *value = be16_to_cpu(sfp->diag.temp_high_warn); in sfp_hwmon_temp()
629 sfp_hwmon_calibrate_temp(sfp, value); in sfp_hwmon_temp()
633 *value = be16_to_cpu(sfp->diag.temp_high_alarm); in sfp_hwmon_temp()
634 sfp_hwmon_calibrate_temp(sfp, value); in sfp_hwmon_temp()
638 err = sfp_read(sfp, true, SFP_ALARM0, &status, sizeof(status)); in sfp_hwmon_temp()
646 err = sfp_read(sfp, true, SFP_WARN0, &status, sizeof(status)); in sfp_hwmon_temp()
654 err = sfp_read(sfp, true, SFP_WARN0, &status, sizeof(status)); in sfp_hwmon_temp()
662 err = sfp_read(sfp, true, SFP_ALARM0, &status, sizeof(status)); in sfp_hwmon_temp()
675 static int sfp_hwmon_vcc(struct sfp *sfp, u32 attr, long *value) in sfp_hwmon_vcc() argument
682 return sfp_hwmon_read_vcc(sfp, SFP_VCC, value); in sfp_hwmon_vcc()
685 *value = be16_to_cpu(sfp->diag.volt_low_alarm); in sfp_hwmon_vcc()
686 sfp_hwmon_calibrate_vcc(sfp, value); in sfp_hwmon_vcc()
690 *value = be16_to_cpu(sfp->diag.volt_low_warn); in sfp_hwmon_vcc()
691 sfp_hwmon_calibrate_vcc(sfp, value); in sfp_hwmon_vcc()
695 *value = be16_to_cpu(sfp->diag.volt_high_warn); in sfp_hwmon_vcc()
696 sfp_hwmon_calibrate_vcc(sfp, value); in sfp_hwmon_vcc()
700 *value = be16_to_cpu(sfp->diag.volt_high_alarm); in sfp_hwmon_vcc()
701 sfp_hwmon_calibrate_vcc(sfp, value); in sfp_hwmon_vcc()
705 err = sfp_read(sfp, true, SFP_ALARM0, &status, sizeof(status)); in sfp_hwmon_vcc()
713 err = sfp_read(sfp, true, SFP_WARN0, &status, sizeof(status)); in sfp_hwmon_vcc()
721 err = sfp_read(sfp, true, SFP_WARN0, &status, sizeof(status)); in sfp_hwmon_vcc()
729 err = sfp_read(sfp, true, SFP_ALARM0, &status, sizeof(status)); in sfp_hwmon_vcc()
742 static int sfp_hwmon_bias(struct sfp *sfp, u32 attr, long *value) in sfp_hwmon_bias() argument
749 return sfp_hwmon_read_bias(sfp, SFP_TX_BIAS, value); in sfp_hwmon_bias()
752 *value = be16_to_cpu(sfp->diag.bias_low_alarm); in sfp_hwmon_bias()
753 sfp_hwmon_calibrate_bias(sfp, value); in sfp_hwmon_bias()
757 *value = be16_to_cpu(sfp->diag.bias_low_warn); in sfp_hwmon_bias()
758 sfp_hwmon_calibrate_bias(sfp, value); in sfp_hwmon_bias()
762 *value = be16_to_cpu(sfp->diag.bias_high_warn); in sfp_hwmon_bias()
763 sfp_hwmon_calibrate_bias(sfp, value); in sfp_hwmon_bias()
767 *value = be16_to_cpu(sfp->diag.bias_high_alarm); in sfp_hwmon_bias()
768 sfp_hwmon_calibrate_bias(sfp, value); in sfp_hwmon_bias()
772 err = sfp_read(sfp, true, SFP_ALARM0, &status, sizeof(status)); in sfp_hwmon_bias()
780 err = sfp_read(sfp, true, SFP_WARN0, &status, sizeof(status)); in sfp_hwmon_bias()
788 err = sfp_read(sfp, true, SFP_WARN0, &status, sizeof(status)); in sfp_hwmon_bias()
796 err = sfp_read(sfp, true, SFP_ALARM0, &status, sizeof(status)); in sfp_hwmon_bias()
809 static int sfp_hwmon_tx_power(struct sfp *sfp, u32 attr, long *value) in sfp_hwmon_tx_power() argument
816 return sfp_hwmon_read_tx_power(sfp, SFP_TX_POWER, value); in sfp_hwmon_tx_power()
819 *value = be16_to_cpu(sfp->diag.txpwr_low_alarm); in sfp_hwmon_tx_power()
820 sfp_hwmon_calibrate_tx_power(sfp, value); in sfp_hwmon_tx_power()
824 *value = be16_to_cpu(sfp->diag.txpwr_low_warn); in sfp_hwmon_tx_power()
825 sfp_hwmon_calibrate_tx_power(sfp, value); in sfp_hwmon_tx_power()
829 *value = be16_to_cpu(sfp->diag.txpwr_high_warn); in sfp_hwmon_tx_power()
830 sfp_hwmon_calibrate_tx_power(sfp, value); in sfp_hwmon_tx_power()
834 *value = be16_to_cpu(sfp->diag.txpwr_high_alarm); in sfp_hwmon_tx_power()
835 sfp_hwmon_calibrate_tx_power(sfp, value); in sfp_hwmon_tx_power()
839 err = sfp_read(sfp, true, SFP_ALARM0, &status, sizeof(status)); in sfp_hwmon_tx_power()
847 err = sfp_read(sfp, true, SFP_WARN0, &status, sizeof(status)); in sfp_hwmon_tx_power()
855 err = sfp_read(sfp, true, SFP_WARN0, &status, sizeof(status)); in sfp_hwmon_tx_power()
863 err = sfp_read(sfp, true, SFP_ALARM0, &status, sizeof(status)); in sfp_hwmon_tx_power()
876 static int sfp_hwmon_rx_power(struct sfp *sfp, u32 attr, long *value) in sfp_hwmon_rx_power() argument
883 return sfp_hwmon_read_rx_power(sfp, SFP_RX_POWER, value); in sfp_hwmon_rx_power()
886 *value = be16_to_cpu(sfp->diag.rxpwr_low_alarm); in sfp_hwmon_rx_power()
891 *value = be16_to_cpu(sfp->diag.rxpwr_low_warn); in sfp_hwmon_rx_power()
896 *value = be16_to_cpu(sfp->diag.rxpwr_high_warn); in sfp_hwmon_rx_power()
901 *value = be16_to_cpu(sfp->diag.rxpwr_high_alarm); in sfp_hwmon_rx_power()
906 err = sfp_read(sfp, true, SFP_ALARM1, &status, sizeof(status)); in sfp_hwmon_rx_power()
914 err = sfp_read(sfp, true, SFP_WARN1, &status, sizeof(status)); in sfp_hwmon_rx_power()
922 err = sfp_read(sfp, true, SFP_WARN1, &status, sizeof(status)); in sfp_hwmon_rx_power()
930 err = sfp_read(sfp, true, SFP_ALARM1, &status, sizeof(status)); in sfp_hwmon_rx_power()
946 struct sfp *sfp = dev_get_drvdata(dev); in sfp_hwmon_read() local
950 return sfp_hwmon_temp(sfp, attr, value); in sfp_hwmon_read()
952 return sfp_hwmon_vcc(sfp, attr, value); in sfp_hwmon_read()
954 return sfp_hwmon_bias(sfp, attr, value); in sfp_hwmon_read()
958 return sfp_hwmon_tx_power(sfp, attr, value); in sfp_hwmon_read()
960 return sfp_hwmon_rx_power(sfp, attr, value); in sfp_hwmon_read()
1061 static int sfp_hwmon_insert(struct sfp *sfp) in sfp_hwmon_insert() argument
1065 if (sfp->id.ext.sff8472_compliance == SFP_SFF8472_COMPLIANCE_NONE) in sfp_hwmon_insert()
1068 if (!(sfp->id.ext.diagmon & SFP_DIAGMON_DDM)) in sfp_hwmon_insert()
1071 if (sfp->id.ext.diagmon & SFP_DIAGMON_ADDRMODE) in sfp_hwmon_insert()
1077 err = sfp_read(sfp, true, 0, &sfp->diag, sizeof(sfp->diag)); in sfp_hwmon_insert()
1081 sfp->hwmon_name = kstrdup(dev_name(sfp->dev), GFP_KERNEL); in sfp_hwmon_insert()
1082 if (!sfp->hwmon_name) in sfp_hwmon_insert()
1085 for (i = 0; sfp->hwmon_name[i]; i++) in sfp_hwmon_insert()
1086 if (hwmon_is_bad_char(sfp->hwmon_name[i])) in sfp_hwmon_insert()
1087 sfp->hwmon_name[i] = '_'; in sfp_hwmon_insert()
1089 sfp->hwmon_dev = hwmon_device_register_with_info(sfp->dev, in sfp_hwmon_insert()
1090 sfp->hwmon_name, sfp, in sfp_hwmon_insert()
1094 return PTR_ERR_OR_ZERO(sfp->hwmon_dev); in sfp_hwmon_insert()
1097 static void sfp_hwmon_remove(struct sfp *sfp) in sfp_hwmon_remove() argument
1099 if (!IS_ERR_OR_NULL(sfp->hwmon_dev)) { in sfp_hwmon_remove()
1100 hwmon_device_unregister(sfp->hwmon_dev); in sfp_hwmon_remove()
1101 sfp->hwmon_dev = NULL; in sfp_hwmon_remove()
1102 kfree(sfp->hwmon_name); in sfp_hwmon_remove()
1106 static int sfp_hwmon_insert(struct sfp *sfp) in sfp_hwmon_insert() argument
1111 static void sfp_hwmon_remove(struct sfp *sfp) in sfp_hwmon_remove() argument
1117 static void sfp_module_tx_disable(struct sfp *sfp) in sfp_module_tx_disable() argument
1119 dev_dbg(sfp->dev, "tx disable %u -> %u\n", in sfp_module_tx_disable()
1120 sfp->state & SFP_F_TX_DISABLE ? 1 : 0, 1); in sfp_module_tx_disable()
1121 sfp->state |= SFP_F_TX_DISABLE; in sfp_module_tx_disable()
1122 sfp_set_state(sfp, sfp->state); in sfp_module_tx_disable()
1125 static void sfp_module_tx_enable(struct sfp *sfp) in sfp_module_tx_enable() argument
1127 dev_dbg(sfp->dev, "tx disable %u -> %u\n", in sfp_module_tx_enable()
1128 sfp->state & SFP_F_TX_DISABLE ? 1 : 0, 0); in sfp_module_tx_enable()
1129 sfp->state &= ~SFP_F_TX_DISABLE; in sfp_module_tx_enable()
1130 sfp_set_state(sfp, sfp->state); in sfp_module_tx_enable()
1133 static void sfp_module_tx_fault_reset(struct sfp *sfp) in sfp_module_tx_fault_reset() argument
1135 unsigned int state = sfp->state; in sfp_module_tx_fault_reset()
1140 sfp_set_state(sfp, state | SFP_F_TX_DISABLE); in sfp_module_tx_fault_reset()
1144 sfp_set_state(sfp, state); in sfp_module_tx_fault_reset()
1148 static void sfp_sm_set_timer(struct sfp *sfp, unsigned int timeout) in sfp_sm_set_timer() argument
1151 mod_delayed_work(system_power_efficient_wq, &sfp->timeout, in sfp_sm_set_timer()
1154 cancel_delayed_work(&sfp->timeout); in sfp_sm_set_timer()
1157 static void sfp_sm_next(struct sfp *sfp, unsigned int state, in sfp_sm_next() argument
1160 sfp->sm_state = state; in sfp_sm_next()
1161 sfp_sm_set_timer(sfp, timeout); in sfp_sm_next()
1164 static void sfp_sm_ins_next(struct sfp *sfp, unsigned int state, in sfp_sm_ins_next() argument
1167 sfp->sm_mod_state = state; in sfp_sm_ins_next()
1168 sfp_sm_set_timer(sfp, timeout); in sfp_sm_ins_next()
1171 static void sfp_sm_phy_detach(struct sfp *sfp) in sfp_sm_phy_detach() argument
1173 phy_stop(sfp->mod_phy); in sfp_sm_phy_detach()
1174 sfp_remove_phy(sfp->sfp_bus); in sfp_sm_phy_detach()
1175 phy_device_remove(sfp->mod_phy); in sfp_sm_phy_detach()
1176 phy_device_free(sfp->mod_phy); in sfp_sm_phy_detach()
1177 sfp->mod_phy = NULL; in sfp_sm_phy_detach()
1180 static void sfp_sm_probe_phy(struct sfp *sfp) in sfp_sm_probe_phy() argument
1187 phy = mdiobus_scan(sfp->i2c_mii, SFP_PHY_ADDR); in sfp_sm_probe_phy()
1189 dev_info(sfp->dev, "no PHY detected\n"); in sfp_sm_probe_phy()
1193 dev_err(sfp->dev, "mdiobus scan returned %ld\n", PTR_ERR(phy)); in sfp_sm_probe_phy()
1197 err = sfp_add_phy(sfp->sfp_bus, phy); in sfp_sm_probe_phy()
1201 dev_err(sfp->dev, "sfp_add_phy failed: %d\n", err); in sfp_sm_probe_phy()
1205 sfp->mod_phy = phy; in sfp_sm_probe_phy()
1209 static void sfp_sm_link_up(struct sfp *sfp) in sfp_sm_link_up() argument
1211 sfp_link_up(sfp->sfp_bus); in sfp_sm_link_up()
1212 sfp_sm_next(sfp, SFP_S_LINK_UP, 0); in sfp_sm_link_up()
1215 static void sfp_sm_link_down(struct sfp *sfp) in sfp_sm_link_down() argument
1217 sfp_link_down(sfp->sfp_bus); in sfp_sm_link_down()
1220 static void sfp_sm_link_check_los(struct sfp *sfp) in sfp_sm_link_check_los() argument
1222 unsigned int los = sfp->state & SFP_F_LOS; in sfp_sm_link_check_los()
1227 if (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_LOS_INVERTED)) in sfp_sm_link_check_los()
1229 else if (!(sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_LOS_NORMAL))) in sfp_sm_link_check_los()
1233 sfp_sm_next(sfp, SFP_S_WAIT_LOS, 0); in sfp_sm_link_check_los()
1235 sfp_sm_link_up(sfp); in sfp_sm_link_check_los()
1238 static bool sfp_los_event_active(struct sfp *sfp, unsigned int event) in sfp_los_event_active() argument
1240 return (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_LOS_INVERTED) && in sfp_los_event_active()
1242 (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_LOS_NORMAL) && in sfp_los_event_active()
1246 static bool sfp_los_event_inactive(struct sfp *sfp, unsigned int event) in sfp_los_event_inactive() argument
1248 return (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_LOS_INVERTED) && in sfp_los_event_inactive()
1250 (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_LOS_NORMAL) && in sfp_los_event_inactive()
1254 static void sfp_sm_fault(struct sfp *sfp, bool warn) in sfp_sm_fault() argument
1256 if (sfp->sm_retries && !--sfp->sm_retries) { in sfp_sm_fault()
1257 dev_err(sfp->dev, in sfp_sm_fault()
1259 sfp_sm_next(sfp, SFP_S_TX_DISABLE, 0); in sfp_sm_fault()
1262 dev_err(sfp->dev, "module transmit fault indicated\n"); in sfp_sm_fault()
1264 sfp_sm_next(sfp, SFP_S_TX_FAULT, T_FAULT_RECOVER); in sfp_sm_fault()
1268 static void sfp_sm_mod_init(struct sfp *sfp) in sfp_sm_mod_init() argument
1270 sfp_module_tx_enable(sfp); in sfp_sm_mod_init()
1276 sfp_sm_next(sfp, SFP_S_INIT, T_INIT_JIFFIES); in sfp_sm_mod_init()
1277 sfp->sm_retries = 5; in sfp_sm_mod_init()
1288 if (sfp->id.base.e1000_base_t || in sfp_sm_mod_init()
1289 sfp->id.base.e100_base_lx || in sfp_sm_mod_init()
1290 sfp->id.base.e100_base_fx) in sfp_sm_mod_init()
1291 sfp_sm_probe_phy(sfp); in sfp_sm_mod_init()
1294 static int sfp_sm_mod_hpower(struct sfp *sfp) in sfp_sm_mod_hpower() argument
1301 if (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_POWER_DECL)) in sfp_sm_mod_hpower()
1303 if (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_HIGH_POWER_LEVEL)) in sfp_sm_mod_hpower()
1306 if (sfp->id.ext.sff8472_compliance == SFP_SFF8472_COMPLIANCE_NONE && in sfp_sm_mod_hpower()
1307 (sfp->id.ext.diagmon & (SFP_DIAGMON_DDM | SFP_DIAGMON_ADDRMODE)) != in sfp_sm_mod_hpower()
1313 if (power > sfp->max_power_mW) { in sfp_sm_mod_hpower()
1314 dev_err(sfp->dev, in sfp_sm_mod_hpower()
1322 if (power > sfp->max_power_mW) { in sfp_sm_mod_hpower()
1323 dev_warn(sfp->dev, in sfp_sm_mod_hpower()
1332 err = sfp_read(sfp, true, SFP_EXT_STATUS, &val, sizeof(val)); in sfp_sm_mod_hpower()
1334 dev_err(sfp->dev, "Failed to read EEPROM: %d\n", err); in sfp_sm_mod_hpower()
1341 err = sfp_write(sfp, true, SFP_EXT_STATUS, &val, sizeof(val)); in sfp_sm_mod_hpower()
1343 dev_err(sfp->dev, "Failed to write EEPROM: %d\n", err); in sfp_sm_mod_hpower()
1348 dev_info(sfp->dev, "Module switched to %u.%uW power level\n", in sfp_sm_mod_hpower()
1356 static int sfp_sm_mod_probe(struct sfp *sfp) in sfp_sm_mod_probe() argument
1364 ret = sfp_read(sfp, false, 0, &id, sizeof(id)); in sfp_sm_mod_probe()
1366 dev_err(sfp->dev, "failed to read EEPROM: %d\n", ret); in sfp_sm_mod_probe()
1371 dev_err(sfp->dev, "EEPROM short read: %d\n", ret); in sfp_sm_mod_probe()
1385 dev_warn(sfp->dev, in sfp_sm_mod_probe()
1389 dev_err(sfp->dev, in sfp_sm_mod_probe()
1401 dev_warn(sfp->dev, in sfp_sm_mod_probe()
1405 dev_err(sfp->dev, in sfp_sm_mod_probe()
1414 sfp->id = id; in sfp_sm_mod_probe()
1416 dev_info(sfp->dev, "module %.*s %.*s rev %.*s sn %.*s dc %.*s\n", in sfp_sm_mod_probe()
1424 if (!sfp->type->module_supported(&sfp->id)) { in sfp_sm_mod_probe()
1425 dev_err(sfp->dev, in sfp_sm_mod_probe()
1427 sfp->id.base.phys_id, sfp->id.base.phys_ext_id); in sfp_sm_mod_probe()
1432 if (sfp->id.ext.diagmon & SFP_DIAGMON_ADDRMODE) in sfp_sm_mod_probe()
1433 dev_warn(sfp->dev, in sfp_sm_mod_probe()
1436 ret = sfp_hwmon_insert(sfp); in sfp_sm_mod_probe()
1440 ret = sfp_module_insert(sfp->sfp_bus, &sfp->id); in sfp_sm_mod_probe()
1444 return sfp_sm_mod_hpower(sfp); in sfp_sm_mod_probe()
1447 static void sfp_sm_mod_remove(struct sfp *sfp) in sfp_sm_mod_remove() argument
1449 sfp_module_remove(sfp->sfp_bus); in sfp_sm_mod_remove()
1451 sfp_hwmon_remove(sfp); in sfp_sm_mod_remove()
1453 if (sfp->mod_phy) in sfp_sm_mod_remove()
1454 sfp_sm_phy_detach(sfp); in sfp_sm_mod_remove()
1456 sfp_module_tx_disable(sfp); in sfp_sm_mod_remove()
1458 memset(&sfp->id, 0, sizeof(sfp->id)); in sfp_sm_mod_remove()
1460 dev_info(sfp->dev, "module removed\n"); in sfp_sm_mod_remove()
1463 static void sfp_sm_event(struct sfp *sfp, unsigned int event) in sfp_sm_event() argument
1465 mutex_lock(&sfp->sm_mutex); in sfp_sm_event()
1467 dev_dbg(sfp->dev, "SM: enter %s:%s:%s event %s\n", in sfp_sm_event()
1468 mod_state_to_str(sfp->sm_mod_state), in sfp_sm_event()
1469 dev_state_to_str(sfp->sm_dev_state), in sfp_sm_event()
1470 sm_state_to_str(sfp->sm_state), in sfp_sm_event()
1476 switch (sfp->sm_mod_state) { in sfp_sm_event()
1479 sfp_module_tx_disable(sfp); in sfp_sm_event()
1480 sfp_sm_ins_next(sfp, SFP_MOD_PROBE, T_PROBE_INIT); in sfp_sm_event()
1486 sfp_sm_ins_next(sfp, SFP_MOD_EMPTY, 0); in sfp_sm_event()
1488 int val = sfp_sm_mod_probe(sfp); in sfp_sm_event()
1491 sfp_sm_ins_next(sfp, SFP_MOD_PRESENT, 0); in sfp_sm_event()
1493 sfp_sm_ins_next(sfp, SFP_MOD_HPOWER, val); in sfp_sm_event()
1495 sfp_sm_ins_next(sfp, SFP_MOD_ERROR, 0); in sfp_sm_event()
1497 sfp_sm_set_timer(sfp, T_PROBE_RETRY); in sfp_sm_event()
1503 sfp_sm_ins_next(sfp, SFP_MOD_PRESENT, 0); in sfp_sm_event()
1510 sfp_sm_mod_remove(sfp); in sfp_sm_event()
1511 sfp_sm_ins_next(sfp, SFP_MOD_EMPTY, 0); in sfp_sm_event()
1517 switch (sfp->sm_dev_state) { in sfp_sm_event()
1520 sfp->sm_dev_state = SFP_DEV_UP; in sfp_sm_event()
1529 if (!sfp->mod_phy) in sfp_sm_event()
1530 sfp_module_tx_disable(sfp); in sfp_sm_event()
1531 sfp->sm_dev_state = SFP_DEV_DOWN; in sfp_sm_event()
1537 if (sfp->sm_state != SFP_S_DOWN && in sfp_sm_event()
1538 (sfp->sm_mod_state != SFP_MOD_PRESENT || in sfp_sm_event()
1539 sfp->sm_dev_state != SFP_DEV_UP)) { in sfp_sm_event()
1540 if (sfp->sm_state == SFP_S_LINK_UP && in sfp_sm_event()
1541 sfp->sm_dev_state == SFP_DEV_UP) in sfp_sm_event()
1542 sfp_sm_link_down(sfp); in sfp_sm_event()
1543 if (sfp->mod_phy) in sfp_sm_event()
1544 sfp_sm_phy_detach(sfp); in sfp_sm_event()
1545 sfp_sm_next(sfp, SFP_S_DOWN, 0); in sfp_sm_event()
1546 mutex_unlock(&sfp->sm_mutex); in sfp_sm_event()
1551 switch (sfp->sm_state) { in sfp_sm_event()
1553 if (sfp->sm_mod_state == SFP_MOD_PRESENT && in sfp_sm_event()
1554 sfp->sm_dev_state == SFP_DEV_UP) in sfp_sm_event()
1555 sfp_sm_mod_init(sfp); in sfp_sm_event()
1559 if (event == SFP_E_TIMEOUT && sfp->state & SFP_F_TX_FAULT) in sfp_sm_event()
1560 sfp_sm_fault(sfp, true); in sfp_sm_event()
1562 sfp_sm_link_check_los(sfp); in sfp_sm_event()
1567 sfp_sm_fault(sfp, true); in sfp_sm_event()
1568 else if (sfp_los_event_inactive(sfp, event)) in sfp_sm_event()
1569 sfp_sm_link_up(sfp); in sfp_sm_event()
1574 sfp_sm_link_down(sfp); in sfp_sm_event()
1575 sfp_sm_fault(sfp, true); in sfp_sm_event()
1576 } else if (sfp_los_event_active(sfp, event)) { in sfp_sm_event()
1577 sfp_sm_link_down(sfp); in sfp_sm_event()
1578 sfp_sm_next(sfp, SFP_S_WAIT_LOS, 0); in sfp_sm_event()
1584 sfp_module_tx_fault_reset(sfp); in sfp_sm_event()
1585 sfp_sm_next(sfp, SFP_S_REINIT, T_INIT_JIFFIES); in sfp_sm_event()
1590 if (event == SFP_E_TIMEOUT && sfp->state & SFP_F_TX_FAULT) { in sfp_sm_event()
1591 sfp_sm_fault(sfp, false); in sfp_sm_event()
1593 dev_info(sfp->dev, "module transmit fault recovered\n"); in sfp_sm_event()
1594 sfp_sm_link_check_los(sfp); in sfp_sm_event()
1602 dev_dbg(sfp->dev, "SM: exit %s:%s:%s\n", in sfp_sm_event()
1603 mod_state_to_str(sfp->sm_mod_state), in sfp_sm_event()
1604 dev_state_to_str(sfp->sm_dev_state), in sfp_sm_event()
1605 sm_state_to_str(sfp->sm_state)); in sfp_sm_event()
1607 mutex_unlock(&sfp->sm_mutex); in sfp_sm_event()
1610 static void sfp_start(struct sfp *sfp) in sfp_start() argument
1612 sfp_sm_event(sfp, SFP_E_DEV_UP); in sfp_start()
1615 static void sfp_stop(struct sfp *sfp) in sfp_stop() argument
1617 sfp_sm_event(sfp, SFP_E_DEV_DOWN); in sfp_stop()
1620 static int sfp_module_info(struct sfp *sfp, struct ethtool_modinfo *modinfo) in sfp_module_info() argument
1624 if (sfp->id.ext.sff8472_compliance && in sfp_module_info()
1625 !(sfp->id.ext.diagmon & SFP_DIAGMON_ADDRMODE)) { in sfp_module_info()
1635 static int sfp_module_eeprom(struct sfp *sfp, struct ethtool_eeprom *ee, in sfp_module_eeprom() argument
1650 ret = sfp_read(sfp, false, first, data, len); in sfp_module_eeprom()
1662 ret = sfp_read(sfp, true, first, data, len); in sfp_module_eeprom()
1678 struct sfp *sfp = container_of(work, struct sfp, timeout.work); in sfp_timeout() local
1681 sfp_sm_event(sfp, SFP_E_TIMEOUT); in sfp_timeout()
1685 static void sfp_check_state(struct sfp *sfp) in sfp_check_state() argument
1689 state = sfp_get_state(sfp); in sfp_check_state()
1690 changed = state ^ sfp->state; in sfp_check_state()
1695 dev_dbg(sfp->dev, "%s %u -> %u\n", gpio_of_names[i], in sfp_check_state()
1696 !!(sfp->state & BIT(i)), !!(state & BIT(i))); in sfp_check_state()
1698 state |= sfp->state & (SFP_F_TX_DISABLE | SFP_F_RATE_SELECT); in sfp_check_state()
1699 sfp->state = state; in sfp_check_state()
1703 sfp_sm_event(sfp, state & SFP_F_PRESENT ? in sfp_check_state()
1707 sfp_sm_event(sfp, state & SFP_F_TX_FAULT ? in sfp_check_state()
1711 sfp_sm_event(sfp, state & SFP_F_LOS ? in sfp_check_state()
1718 struct sfp *sfp = data; in sfp_irq() local
1720 sfp_check_state(sfp); in sfp_irq()
1727 struct sfp *sfp = container_of(work, struct sfp, poll.work); in sfp_poll() local
1729 sfp_check_state(sfp); in sfp_poll()
1730 mod_delayed_work(system_wq, &sfp->poll, poll_jiffies); in sfp_poll()
1733 static struct sfp *sfp_alloc(struct device *dev) in sfp_alloc()
1735 struct sfp *sfp; in sfp_alloc() local
1737 sfp = kzalloc(sizeof(*sfp), GFP_KERNEL); in sfp_alloc()
1738 if (!sfp) in sfp_alloc()
1741 sfp->dev = dev; in sfp_alloc()
1743 mutex_init(&sfp->sm_mutex); in sfp_alloc()
1744 INIT_DELAYED_WORK(&sfp->poll, sfp_poll); in sfp_alloc()
1745 INIT_DELAYED_WORK(&sfp->timeout, sfp_timeout); in sfp_alloc()
1747 return sfp; in sfp_alloc()
1752 struct sfp *sfp = data; in sfp_cleanup() local
1754 cancel_delayed_work_sync(&sfp->poll); in sfp_cleanup()
1755 cancel_delayed_work_sync(&sfp->timeout); in sfp_cleanup()
1756 if (sfp->i2c_mii) { in sfp_cleanup()
1757 mdiobus_unregister(sfp->i2c_mii); in sfp_cleanup()
1758 mdiobus_free(sfp->i2c_mii); in sfp_cleanup()
1760 if (sfp->i2c) in sfp_cleanup()
1761 i2c_put_adapter(sfp->i2c); in sfp_cleanup()
1762 kfree(sfp); in sfp_cleanup()
1768 struct sfp *sfp; in sfp_probe() local
1772 sfp = sfp_alloc(&pdev->dev); in sfp_probe()
1773 if (IS_ERR(sfp)) in sfp_probe()
1774 return PTR_ERR(sfp); in sfp_probe()
1776 platform_set_drvdata(pdev, sfp); in sfp_probe()
1778 err = devm_add_action(sfp->dev, sfp_cleanup, sfp); in sfp_probe()
1782 sff = sfp->type = &sfp_data; in sfp_probe()
1794 sff = sfp->type = id->data; in sfp_probe()
1798 dev_err(sfp->dev, "missing 'i2c-bus' property\n"); in sfp_probe()
1807 err = sfp_i2c_configure(sfp, i2c); in sfp_probe()
1816 sfp->gpio[i] = devm_gpiod_get_optional(sfp->dev, in sfp_probe()
1818 if (IS_ERR(sfp->gpio[i])) in sfp_probe()
1819 return PTR_ERR(sfp->gpio[i]); in sfp_probe()
1822 sfp->get_state = sfp_gpio_get_state; in sfp_probe()
1823 sfp->set_state = sfp_gpio_set_state; in sfp_probe()
1826 if (!(sfp->gpio[GPIO_MODDEF0])) in sfp_probe()
1827 sfp->get_state = sff_gpio_get_state; in sfp_probe()
1830 &sfp->max_power_mW); in sfp_probe()
1831 if (!sfp->max_power_mW) in sfp_probe()
1832 sfp->max_power_mW = 1000; in sfp_probe()
1834 dev_info(sfp->dev, "Host maximum power %u.%uW\n", in sfp_probe()
1835 sfp->max_power_mW / 1000, (sfp->max_power_mW / 100) % 10); in sfp_probe()
1837 sfp->sfp_bus = sfp_register_socket(sfp->dev, sfp, &sfp_module_ops); in sfp_probe()
1838 if (!sfp->sfp_bus) in sfp_probe()
1844 sfp->state = sfp_get_state(sfp) | SFP_F_TX_DISABLE; in sfp_probe()
1846 if (sfp->gpio[GPIO_RATE_SELECT] && in sfp_probe()
1847 gpiod_get_value_cansleep(sfp->gpio[GPIO_RATE_SELECT])) in sfp_probe()
1848 sfp->state |= SFP_F_RATE_SELECT; in sfp_probe()
1849 sfp_set_state(sfp, sfp->state); in sfp_probe()
1850 sfp_module_tx_disable(sfp); in sfp_probe()
1852 if (sfp->state & SFP_F_PRESENT) in sfp_probe()
1853 sfp_sm_event(sfp, SFP_E_INSERT); in sfp_probe()
1857 if (gpio_flags[i] != GPIOD_IN || !sfp->gpio[i]) in sfp_probe()
1860 irq = gpiod_to_irq(sfp->gpio[i]); in sfp_probe()
1866 err = devm_request_threaded_irq(sfp->dev, irq, NULL, sfp_irq, in sfp_probe()
1870 dev_name(sfp->dev), sfp); in sfp_probe()
1876 mod_delayed_work(system_wq, &sfp->poll, poll_jiffies); in sfp_probe()
1883 if (!sfp->gpio[GPIO_TX_DISABLE]) in sfp_probe()
1884 dev_warn(sfp->dev, in sfp_probe()
1892 struct sfp *sfp = platform_get_drvdata(pdev); in sfp_remove() local
1894 sfp_unregister_socket(sfp->sfp_bus); in sfp_remove()