• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /freebsd-13-stable/sys/dev/al_eth/

Lines Matching refs:lm_context

207 static int al_eth_lm_retimer_boost_config(struct al_eth_lm_context *lm_context);
208 static int al_eth_lm_retimer_ds25_full_config(struct al_eth_lm_context *lm_context);
210 struct al_eth_lm_context *lm_context, uint32_t channel);
211 static int al_eth_lm_retimer_ds25_cdr_reset(struct al_eth_lm_context *lm_context, uint32_t channel);
213 struct al_eth_lm_context *lm_context, uint32_t channel);
214 static int al_eth_lm_retimer_25g_rx_adaptation(struct al_eth_lm_context *lm_context);
217 int (*config)(struct al_eth_lm_context *lm_context);
218 int (*reset)(struct al_eth_lm_context *lm_context, uint32_t channel);
219 int (*signal_detect)(struct al_eth_lm_context *lm_context, uint32_t channel);
220 int (*cdr_lock)(struct al_eth_lm_context *lm_context, uint32_t channel);
221 int (*rx_adaptation)(struct al_eth_lm_context *lm_context);
241 if (lm_context->debug) \
248 al_eth_sfp_detect(struct al_eth_lm_context *lm_context,
259 rc = lm_context->i2c_read(lm_context->i2c_context,
260 lm_context->sfp_bus_id, lm_context->sfp_i2c_addr,
265 rc = lm_context->i2c_read(lm_context->i2c_context,
266 lm_context->sfp_bus_id, lm_context->sfp_i2c_addr,
271 rc = lm_context->i2c_read(lm_context->i2c_context,
272 lm_context->sfp_bus_id, lm_context->sfp_i2c_addr,
277 rc = lm_context->i2c_read(lm_context->i2c_context,
278 lm_context->sfp_bus_id, lm_context->sfp_i2c_addr,
283 rc = lm_context->i2c_read(lm_context->i2c_context,
284 lm_context->sfp_bus_id,
285 lm_context->sfp_i2c_addr,
293 if (lm_context->mode != AL_ETH_LM_MODE_DISCONNECTED)
301 ((lm_context->max_speed == AL_ETH_LM_MAX_SPEED_25G) ||
302 (lm_context->max_speed == AL_ETH_LM_MAX_SPEED_MAX)))
305 ((lm_context->max_speed == AL_ETH_LM_MAX_SPEED_10G) ||
306 (lm_context->max_speed == AL_ETH_LM_MAX_SPEED_MAX)))
318 lm_context->da_len = (sfp_cable_tech & SFP_10G_DA_PASSIVE) ? sfp_da_len : 0;
329 al_eth_lm_mode_convert_to_str(lm_context->default_mode));
330 *new_mode = lm_context->default_mode;
331 lm_context->da_len = lm_context->default_dac_len;
334 if ((lm_context->sfp_detect_force_mode) && (*new_mode != AL_ETH_LM_MODE_DISCONNECTED) &&
335 (*new_mode != lm_context->default_mode)) {
337 __func__, al_eth_lm_mode_convert_to_str(lm_context->default_mode),
340 *new_mode = lm_context->default_mode;
343 lm_context->mode = *new_mode;
349 al_eth_qsfp_detect(struct al_eth_lm_context *lm_context,
357 rc = lm_context->i2c_read(lm_context->i2c_context,
358 lm_context->sfp_bus_id, lm_context->sfp_i2c_addr,
363 rc = lm_context->i2c_read(lm_context->i2c_context,
364 lm_context->sfp_bus_id, lm_context->sfp_i2c_addr,
382 lm_context->da_len = qsfp_da_len;
389 al_eth_lm_mode_convert_to_str(lm_context->default_mode));
390 *new_mode = lm_context->default_mode;
391 lm_context->da_len = lm_context->default_dac_len;
394 lm_context->mode = *new_mode;
400 al_eth_module_detect(struct al_eth_lm_context *lm_context,
407 if ((lm_context->gpio_get) && (lm_context->gpio_present != 0))
408 sfp_present = lm_context->gpio_get(lm_context->gpio_present);
417 rc = lm_context->i2c_read(lm_context->i2c_context,
418 lm_context->sfp_bus_id, lm_context->sfp_i2c_addr,
423 if (lm_context->mode != AL_ETH_LM_MODE_DISCONNECTED)
433 return (al_eth_qsfp_detect(lm_context, new_mode));
435 return (al_eth_sfp_detect(lm_context, new_mode));
489 al_eth_serdes_static_tx_params_set(struct al_eth_lm_context *lm_context)
492 if (lm_context->tx_param_dirty == 0)
495 if (lm_context->serdes_tx_params_valid != 0) {
496 lm_context->tx_param_dirty = 0;
498 lm_context->tx_params_override.override = TRUE;
500 if ((lm_context->serdes_obj->tx_advanced_params_set) == 0) {
505 lm_context->serdes_obj->tx_advanced_params_set(
506 lm_context->serdes_obj,
507 lm_context->lane,
508 &lm_context->tx_params_override);
510 } else if (lm_context->static_values != 0) {
511 lm_context->tx_param_dirty = 0;
513 if ((lm_context->serdes_obj->tx_advanced_params_set) == 0) {
518 if ((lm_context->retimer_exist == 0) &&
519 (lm_context->mode == AL_ETH_LM_MODE_10G_DA))
520 lm_context->serdes_obj->tx_advanced_params_set(
521 lm_context->serdes_obj,
522 lm_context->lane,
525 lm_context->serdes_obj->tx_advanced_params_set(
526 lm_context->serdes_obj,
527 lm_context->lane,
533 al_eth_serdes_static_rx_params_set(struct al_eth_lm_context *lm_context)
536 if (lm_context->rx_param_dirty == 0)
539 if (lm_context->serdes_rx_params_valid != 0) {
540 lm_context->rx_param_dirty = 0;
542 lm_context->rx_params_override.override = TRUE;
544 if ((lm_context->serdes_obj->rx_advanced_params_set) == 0) {
549 lm_context->serdes_obj->rx_advanced_params_set(
550 lm_context->serdes_obj,
551 lm_context->lane,
552 &lm_context->rx_params_override);
554 } else if (lm_context->static_values != 0) {
555 lm_context->rx_param_dirty = 0;
557 if ((lm_context->serdes_obj->rx_advanced_params_set) == 0) {
562 if ((lm_context->retimer_exist == 0) &&
563 (lm_context->mode == AL_ETH_LM_MODE_10G_DA))
564 lm_context->serdes_obj->rx_advanced_params_set(
565 lm_context->serdes_obj,
566 lm_context->lane,
569 lm_context->serdes_obj->rx_advanced_params_set(
570 lm_context->serdes_obj,
571 lm_context->lane,
577 al_eth_rx_equal_run(struct al_eth_lm_context *lm_context)
587 lm_context->serdes_obj->rx_advanced_params_set(lm_context->serdes_obj,
588 lm_context->lane, &rx_params);
594 lm_context->serdes_obj->dcgain_set(
595 lm_context->serdes_obj,
598 test_score = lm_context->serdes_obj->rx_equalization(
599 lm_context->serdes_obj,
600 lm_context->lane);
612 lm_context->serdes_obj->rx_advanced_params_get(
613 lm_context->serdes_obj,
614 lm_context->lane,
625 lm_context->serdes_obj->dcgain_set(
626 lm_context->serdes_obj,
631 test_score = lm_context->serdes_obj->rx_equalization(
632 lm_context->serdes_obj,
633 lm_context->lane);
642 lm_context->serdes_obj->rx_advanced_params_get(
643 lm_context->serdes_obj,
644 lm_context->lane,
651 lm_context->serdes_obj->rx_advanced_params_set(
652 lm_context->serdes_obj,
653 lm_context->lane,
667 static int al_eth_lm_retimer_boost_config(struct al_eth_lm_context *lm_context)
673 al_eth_retimer_boost_addr[lm_context->retimer_channel][lm_context->retimer_type];
675 if (lm_context->mode != AL_ETH_LM_MODE_10G_DA) {
676 boost = al_eth_retimer_boost_value[0][lm_context->retimer_type];
679 if (lm_context->da_len <= al_eth_retimer_boost_lens[i]) {
680 boost = al_eth_retimer_boost_value[i][lm_context->retimer_type];
686 boost = al_eth_retimer_boost_value[RETIMER_LENS_MAX][lm_context->retimer_type];
690 lm_context->retimer_channel, boost_addr, boost);
692 rc = lm_context->i2c_write(lm_context->i2c_context,
693 lm_context->retimer_bus_id, lm_context->retimer_i2c_addr,
699 __func__, rc, lm_context->retimer_bus_id,
700 lm_context->retimer_i2c_addr);
731 static int al_eth_lm_retimer_ds25_write_reg(struct al_eth_lm_context *lm_context,
739 rc = lm_context->i2c_read(lm_context->i2c_context,
740 lm_context->retimer_bus_id,
741 lm_context->retimer_i2c_addr,
751 rc = lm_context->i2c_write(lm_context->i2c_context,
752 lm_context->retimer_bus_id,
753 lm_context->retimer_i2c_addr,
763 static int al_eth_lm_retimer_ds25_channel_select(struct al_eth_lm_context *lm_context,
769 rc = al_eth_lm_retimer_ds25_write_reg(lm_context,
777 rc = al_eth_lm_retimer_ds25_write_reg(lm_context,
785 static int al_eth_lm_retimer_ds25_channel_config(struct al_eth_lm_context *lm_context,
793 rc = al_eth_lm_retimer_ds25_channel_select(lm_context, channel);
798 rc = al_eth_lm_retimer_ds25_write_reg(lm_context,
817 static int al_eth_lm_retimer_ds25_cdr_reset(struct al_eth_lm_context *lm_context, uint32_t channel)
823 rc = al_eth_lm_retimer_ds25_channel_select(lm_context, channel);
827 rc = al_eth_lm_retimer_ds25_write_reg(lm_context,
835 rc = al_eth_lm_retimer_ds25_write_reg(lm_context,
851 static boolean_t al_eth_lm_retimer_ds25_signal_detect(struct al_eth_lm_context *lm_context,
857 rc = al_eth_lm_retimer_ds25_channel_select(lm_context, channel);
861 rc = lm_context->i2c_read(lm_context->i2c_context,
862 lm_context->retimer_bus_id,
863 lm_context->retimer_i2c_addr,
881 static boolean_t al_eth_lm_retimer_ds25_cdr_lock(struct al_eth_lm_context *lm_context,
887 rc = al_eth_lm_retimer_ds25_channel_select(lm_context, channel);
891 rc = lm_context->i2c_read(lm_context->i2c_context,
892 lm_context->retimer_bus_id,
893 lm_context->retimer_i2c_addr,
911 static boolean_t al_eth_lm_wait_for_lock(struct al_eth_lm_context *lm_context,
921 lock = retimer[lm_context->retimer_type].cdr_lock(lm_context, channel);
931 static void al_eth_lm_retimer_signal_lock_check(struct al_eth_lm_context *lm_context,
938 if (retimer[lm_context->retimer_type].signal_detect) {
939 if (!retimer[lm_context->retimer_type].signal_detect(lm_context, channel)) {
944 if (retimer[lm_context->retimer_type].cdr_lock) {
945 cdr_lock = retimer[lm_context->retimer_type].cdr_lock(
946 lm_context,
949 if (retimer[lm_context->retimer_type].reset) {
950 retimer[lm_context->retimer_type].reset(lm_context,
953 cdr_lock = al_eth_lm_wait_for_lock(lm_context,
967 static int al_eth_lm_retimer_ds25_full_config(struct al_eth_lm_context *lm_context)
976 if (lm_context->mode == AL_ETH_LM_MODE_25G) {
991 rc = al_eth_lm_retimer_ds25_channel_config(lm_context,
992 lm_context->retimer_channel,
999 rc = al_eth_lm_retimer_ds25_channel_config(lm_context,
1000 lm_context->retimer_tx_channel,
1007 if (lm_context->serdes_obj->type_get() == AL_SRDS_TYPE_25G) {
1009 al_eth_gearbox_reset(lm_context->adapter, TRUE, TRUE);
1013 al_eth_lm_retimer_signal_lock_check(lm_context, lm_context->retimer_tx_channel, &ready);
1025 static int al_eth_lm_retimer_25g_rx_adaptation(struct al_eth_lm_context *lm_context)
1030 al_eth_lm_retimer_signal_lock_check(lm_context, lm_context->retimer_channel, &ready);
1034 __func__, lm_context->retimer_channel);
1044 static int al_eth_lm_check_for_link(struct al_eth_lm_context *lm_context, boolean_t *link_up)
1049 al_eth_link_status_clear(lm_context->adapter);
1050 al_eth_link_status_get(lm_context->adapter, &status);
1054 al_eth_led_set(lm_context->adapter, AL_TRUE);
1055 lm_context->link_state = AL_ETH_LM_LINK_UP;
1060 lm_context->link_state = AL_ETH_LM_LINK_DOWN;
1061 al_eth_led_set(lm_context->adapter, AL_FALSE);
1067 lm_context->link_state = AL_ETH_LM_LINK_DOWN_RF;
1068 al_eth_led_set(lm_context->adapter, AL_FALSE);
1081 al_eth_lm_init(struct al_eth_lm_context *lm_context,
1085 lm_context->adapter = params->adapter;
1086 lm_context->serdes_obj = params->serdes_obj;
1087 lm_context->lane = params->lane;
1088 lm_context->sfp_detection = params->sfp_detection;
1089 lm_context->sfp_bus_id = params->sfp_bus_id;
1090 lm_context->sfp_i2c_addr = params->sfp_i2c_addr;
1092 lm_context->retimer_exist = params->retimer_exist;
1093 lm_context->retimer_type = params->retimer_type;
1094 lm_context->retimer_bus_id = params->retimer_bus_id;
1095 lm_context->retimer_i2c_addr = params->retimer_i2c_addr;
1096 lm_context->retimer_channel = params->retimer_channel;
1097 lm_context->retimer_tx_channel = params->retimer_tx_channel;
1099 lm_context->default_mode = params->default_mode;
1100 lm_context->default_dac_len = params->default_dac_len;
1101 lm_context->link_training = params->link_training;
1102 lm_context->rx_equal = params->rx_equal;
1103 lm_context->static_values = params->static_values;
1104 lm_context->i2c_read = params->i2c_read;
1105 lm_context->i2c_write = params->i2c_write;
1106 lm_context->i2c_context = params->i2c_context;
1107 lm_context->get_random_byte = params->get_random_byte;
1110 al_assert((lm_context->sfp_detection == FALSE) ||
1111 (lm_context->i2c_read != NULL));
1113 al_assert((lm_context->retimer_exist == FALSE) ||
1114 (lm_context->i2c_write != NULL));
1116 lm_context->local_adv.selector_field = 1;
1117 lm_context->local_adv.capability = 0;
1118 lm_context->local_adv.remote_fault = 0;
1119 lm_context->local_adv.acknowledge = 0;
1120 lm_context->local_adv.next_page = 0;
1121 lm_context->local_adv.technology = AL_ETH_AN_TECH_10GBASE_KR;
1122 lm_context->local_adv.fec_capability = params->kr_fec_enable;
1124 lm_context->mode = AL_ETH_LM_MODE_DISCONNECTED;
1125 lm_context->serdes_tx_params_valid = FALSE;
1126 lm_context->serdes_rx_params_valid = FALSE;
1128 lm_context->rx_param_dirty = 1;
1129 lm_context->tx_param_dirty = 1;
1131 lm_context->gpio_get = params->gpio_get;
1132 lm_context->gpio_present = params->gpio_present;
1134 lm_context->max_speed = params->max_speed;
1135 lm_context->sfp_detect_force_mode = params->sfp_detect_force_mode;
1137 lm_context->lm_pause = params->lm_pause;
1139 lm_context->led_config = params->led_config;
1141 lm_context->retimer_configured = FALSE;
1143 lm_context->link_state = AL_ETH_LM_LINK_DOWN;
1149 al_eth_lm_link_detection(struct al_eth_lm_context *lm_context,
1156 al_assert(lm_context != NULL);
1165 if (lm_context->lm_pause != NULL) {
1166 boolean_t lm_pause = lm_context->lm_pause(lm_context->i2c_context);
1170 if (lm_context->link_state == AL_ETH_LM_LINK_UP)
1180 *old_mode = lm_context->mode;
1181 *new_mode = lm_context->mode;
1186 switch (lm_context->link_state) {
1188 al_eth_link_status_get(lm_context->adapter, &status);
1194 al_eth_led_set(lm_context->adapter, TRUE);
1199 lm_context->link_state = AL_ETH_LM_LINK_DOWN;
1202 lm_context->link_state = AL_ETH_LM_LINK_DOWN_RF;
1207 al_eth_link_status_get(lm_context->adapter, &status);
1211 lm_context->link_state = AL_ETH_LM_LINK_DOWN;
1216 lm_context->link_state = AL_ETH_LM_LINK_UP;
1224 al_eth_led_set(lm_context->adapter, FALSE);
1226 if (lm_context->sfp_detection) {
1227 err = al_eth_module_detect(lm_context, new_mode);
1233 lm_context->mode = *new_mode;
1235 lm_context->mode = lm_context->default_mode;
1236 *new_mode = lm_context->mode;
1244 lm_context->rx_param_dirty = 1;
1245 lm_context->tx_param_dirty = 1;
1247 lm_context->new_port = TRUE;
1249 if ((*new_mode != AL_ETH_LM_MODE_DISCONNECTED) && (lm_context->led_config)) {
1267 lm_context->led_config(lm_context->i2c_context, &data);
1275 al_eth_lm_link_establish(struct al_eth_lm_context *lm_context, boolean_t *link_up)
1280 switch (lm_context->link_state) {
1299 if (lm_context->lm_pause) {
1300 boolean_t lm_pause = lm_context->lm_pause(lm_context->i2c_context);
1308 if ((lm_context->new_port) && (lm_context->retimer_exist)) {
1309 al_eth_serdes_static_rx_params_set(lm_context);
1310 al_eth_serdes_static_tx_params_set(lm_context);
1312 al_eth_lm_retimer_config(lm_context);
1316 if (retimer[lm_context->retimer_type].config(lm_context)) {
1323 lm_context->new_port = FALSE;
1328 if (lm_context->retimer_exist) {
1329 if (retimer[lm_context->retimer_type].rx_adaptation) {
1330 ret = retimer[lm_context->retimer_type].rx_adaptation(lm_context);
1341 signal_detected = lm_context->serdes_obj->signal_is_detected(
1342 lm_context->serdes_obj,
1343 lm_context->lane);
1352 if (lm_context->serdes_obj->type_get() == AL_SRDS_TYPE_25G) {
1354 al_eth_gearbox_reset(lm_context->adapter, FALSE, TRUE);
1358 if (lm_context->retimer_exist) {
1361 ret = al_eth_lm_check_for_link(lm_context, link_up);
1371 if ((lm_context->mode == AL_ETH_LM_MODE_10G_DA) && (lm_context->link_training)) {
1372 lm_context->local_adv.transmitted_nonce = lm_context->get_random_byte();
1373 lm_context->local_adv.transmitted_nonce &= 0x1f;
1375 ret = al_eth_an_lt_execute(lm_context->adapter,
1376 lm_context->serdes_obj,
1377 lm_context->lane,
1378 &lm_context->local_adv,
1379 &lm_context->partner_adv);
1381 lm_context->rx_param_dirty = 1;
1382 lm_context->tx_param_dirty = 1;
1386 lm_context->link_training_failures = 0;
1387 ret = al_eth_lm_check_for_link(lm_context, link_up);
1395 lm_context->link_training_failures++;
1396 if (lm_context->link_training_failures > AL_ETH_LT_FAILURES_TO_RESET) {
1400 lm_context->serdes_obj->pma_hard_reset_lane(
1401 lm_context->serdes_obj,
1402 lm_context->lane,
1404 lm_context->serdes_obj->pma_hard_reset_lane(
1405 lm_context->serdes_obj,
1406 lm_context->lane,
1408 lm_context->link_training_failures = 0;
1412 al_eth_serdes_static_tx_params_set(lm_context);
1414 if ((lm_context->mode == AL_ETH_LM_MODE_10G_DA) &&
1415 (lm_context->rx_equal)) {
1416 ret = al_eth_rx_equal_run(lm_context);
1420 ret = al_eth_lm_check_for_link(lm_context, link_up);
1429 al_eth_serdes_static_rx_params_set(lm_context);
1433 ret = al_eth_lm_check_for_link(lm_context, link_up);
1445 al_eth_lm_static_parameters_override(struct al_eth_lm_context *lm_context,
1451 lm_context->tx_params_override = *tx_params;
1452 lm_context->tx_param_dirty = 1;
1453 lm_context->serdes_tx_params_valid = TRUE;
1457 lm_context->rx_params_override = *rx_params;
1458 lm_context->rx_param_dirty = 1;
1459 lm_context->serdes_rx_params_valid = TRUE;
1466 al_eth_lm_static_parameters_override_disable(struct al_eth_lm_context *lm_context,
1471 lm_context->serdes_tx_params_valid = FALSE;
1473 lm_context->serdes_tx_params_valid = FALSE;
1479 al_eth_lm_static_parameters_get(struct al_eth_lm_context *lm_context,
1485 if (lm_context->serdes_tx_params_valid)
1486 *tx_params = lm_context->tx_params_override;
1488 lm_context->serdes_obj->tx_advanced_params_get(
1489 lm_context->serdes_obj,
1490 lm_context->lane,
1495 if (lm_context->serdes_rx_params_valid)
1496 *rx_params = lm_context->rx_params_override;
1498 lm_context->serdes_obj->rx_advanced_params_get(
1499 lm_context->serdes_obj,
1500 lm_context->lane,
1528 al_eth_lm_debug_mode_set(struct al_eth_lm_context *lm_context,
1532 lm_context->debug = enable;