• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /freebsd-12-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);
555 } else if (lm_context->static_values != 0) {
556 lm_context->rx_param_dirty = 0;
558 if ((lm_context->serdes_obj->rx_advanced_params_set) == 0) {
563 if ((lm_context->retimer_exist == 0) &&
564 (lm_context->mode == AL_ETH_LM_MODE_10G_DA))
565 lm_context->serdes_obj->rx_advanced_params_set(
566 lm_context->serdes_obj,
567 lm_context->lane,
570 lm_context->serdes_obj->rx_advanced_params_set(
571 lm_context->serdes_obj,
572 lm_context->lane,
578 al_eth_rx_equal_run(struct al_eth_lm_context *lm_context)
588 lm_context->serdes_obj->rx_advanced_params_set(lm_context->serdes_obj,
589 lm_context->lane, &rx_params);
595 lm_context->serdes_obj->dcgain_set(
596 lm_context->serdes_obj,
599 test_score = lm_context->serdes_obj->rx_equalization(
600 lm_context->serdes_obj,
601 lm_context->lane);
613 lm_context->serdes_obj->rx_advanced_params_get(
614 lm_context->serdes_obj,
615 lm_context->lane,
626 lm_context->serdes_obj->dcgain_set(
627 lm_context->serdes_obj,
632 test_score = lm_context->serdes_obj->rx_equalization(
633 lm_context->serdes_obj,
634 lm_context->lane);
643 lm_context->serdes_obj->rx_advanced_params_get(
644 lm_context->serdes_obj,
645 lm_context->lane,
652 lm_context->serdes_obj->rx_advanced_params_set(
653 lm_context->serdes_obj,
654 lm_context->lane,
668 static int al_eth_lm_retimer_boost_config(struct al_eth_lm_context *lm_context)
674 al_eth_retimer_boost_addr[lm_context->retimer_channel][lm_context->retimer_type];
676 if (lm_context->mode != AL_ETH_LM_MODE_10G_DA) {
677 boost = al_eth_retimer_boost_value[0][lm_context->retimer_type];
680 if (lm_context->da_len <= al_eth_retimer_boost_lens[i]) {
681 boost = al_eth_retimer_boost_value[i][lm_context->retimer_type];
687 boost = al_eth_retimer_boost_value[RETIMER_LENS_MAX][lm_context->retimer_type];
691 lm_context->retimer_channel, boost_addr, boost);
693 rc = lm_context->i2c_write(lm_context->i2c_context,
694 lm_context->retimer_bus_id, lm_context->retimer_i2c_addr,
700 __func__, rc, lm_context->retimer_bus_id,
701 lm_context->retimer_i2c_addr);
732 static int al_eth_lm_retimer_ds25_write_reg(struct al_eth_lm_context *lm_context,
740 rc = lm_context->i2c_read(lm_context->i2c_context,
741 lm_context->retimer_bus_id,
742 lm_context->retimer_i2c_addr,
752 rc = lm_context->i2c_write(lm_context->i2c_context,
753 lm_context->retimer_bus_id,
754 lm_context->retimer_i2c_addr,
764 static int al_eth_lm_retimer_ds25_channel_select(struct al_eth_lm_context *lm_context,
770 rc = al_eth_lm_retimer_ds25_write_reg(lm_context,
778 rc = al_eth_lm_retimer_ds25_write_reg(lm_context,
786 static int al_eth_lm_retimer_ds25_channel_config(struct al_eth_lm_context *lm_context,
794 rc = al_eth_lm_retimer_ds25_channel_select(lm_context, channel);
799 rc = al_eth_lm_retimer_ds25_write_reg(lm_context,
818 static int al_eth_lm_retimer_ds25_cdr_reset(struct al_eth_lm_context *lm_context, uint32_t channel)
824 rc = al_eth_lm_retimer_ds25_channel_select(lm_context, channel);
828 rc = al_eth_lm_retimer_ds25_write_reg(lm_context,
836 rc = al_eth_lm_retimer_ds25_write_reg(lm_context,
852 static boolean_t al_eth_lm_retimer_ds25_signal_detect(struct al_eth_lm_context *lm_context,
858 rc = al_eth_lm_retimer_ds25_channel_select(lm_context, channel);
862 rc = lm_context->i2c_read(lm_context->i2c_context,
863 lm_context->retimer_bus_id,
864 lm_context->retimer_i2c_addr,
882 static boolean_t al_eth_lm_retimer_ds25_cdr_lock(struct al_eth_lm_context *lm_context,
888 rc = al_eth_lm_retimer_ds25_channel_select(lm_context, channel);
892 rc = lm_context->i2c_read(lm_context->i2c_context,
893 lm_context->retimer_bus_id,
894 lm_context->retimer_i2c_addr,
912 static boolean_t al_eth_lm_wait_for_lock(struct al_eth_lm_context *lm_context,
922 lock = retimer[lm_context->retimer_type].cdr_lock(lm_context, channel);
932 static void al_eth_lm_retimer_signal_lock_check(struct al_eth_lm_context *lm_context,
939 if (retimer[lm_context->retimer_type].signal_detect) {
940 if (!retimer[lm_context->retimer_type].signal_detect(lm_context, channel)) {
945 if (retimer[lm_context->retimer_type].cdr_lock) {
946 cdr_lock = retimer[lm_context->retimer_type].cdr_lock(
947 lm_context,
950 if (retimer[lm_context->retimer_type].reset) {
951 retimer[lm_context->retimer_type].reset(lm_context,
954 cdr_lock = al_eth_lm_wait_for_lock(lm_context,
968 static int al_eth_lm_retimer_ds25_full_config(struct al_eth_lm_context *lm_context)
977 if (lm_context->mode == AL_ETH_LM_MODE_25G) {
993 rc = al_eth_lm_retimer_ds25_channel_config(lm_context,
994 lm_context->retimer_channel,
1001 rc = al_eth_lm_retimer_ds25_channel_config(lm_context,
1002 lm_context->retimer_tx_channel,
1009 if (lm_context->serdes_obj->type_get() == AL_SRDS_TYPE_25G) {
1011 al_eth_gearbox_reset(lm_context->adapter, TRUE, TRUE);
1015 al_eth_lm_retimer_signal_lock_check(lm_context, lm_context->retimer_tx_channel, &ready);
1027 static int al_eth_lm_retimer_25g_rx_adaptation(struct al_eth_lm_context *lm_context)
1032 al_eth_lm_retimer_signal_lock_check(lm_context, lm_context->retimer_channel, &ready);
1036 __func__, lm_context->retimer_channel);
1046 static int al_eth_lm_check_for_link(struct al_eth_lm_context *lm_context, boolean_t *link_up)
1051 al_eth_link_status_clear(lm_context->adapter);
1052 al_eth_link_status_get(lm_context->adapter, &status);
1056 al_eth_led_set(lm_context->adapter, AL_TRUE);
1057 lm_context->link_state = AL_ETH_LM_LINK_UP;
1062 lm_context->link_state = AL_ETH_LM_LINK_DOWN;
1063 al_eth_led_set(lm_context->adapter, AL_FALSE);
1069 lm_context->link_state = AL_ETH_LM_LINK_DOWN_RF;
1070 al_eth_led_set(lm_context->adapter, AL_FALSE);
1083 al_eth_lm_init(struct al_eth_lm_context *lm_context,
1087 lm_context->adapter = params->adapter;
1088 lm_context->serdes_obj = params->serdes_obj;
1089 lm_context->lane = params->lane;
1090 lm_context->sfp_detection = params->sfp_detection;
1091 lm_context->sfp_bus_id = params->sfp_bus_id;
1092 lm_context->sfp_i2c_addr = params->sfp_i2c_addr;
1094 lm_context->retimer_exist = params->retimer_exist;
1095 lm_context->retimer_type = params->retimer_type;
1096 lm_context->retimer_bus_id = params->retimer_bus_id;
1097 lm_context->retimer_i2c_addr = params->retimer_i2c_addr;
1098 lm_context->retimer_channel = params->retimer_channel;
1099 lm_context->retimer_tx_channel = params->retimer_tx_channel;
1101 lm_context->default_mode = params->default_mode;
1102 lm_context->default_dac_len = params->default_dac_len;
1103 lm_context->link_training = params->link_training;
1104 lm_context->rx_equal = params->rx_equal;
1105 lm_context->static_values = params->static_values;
1106 lm_context->i2c_read = params->i2c_read;
1107 lm_context->i2c_write = params->i2c_write;
1108 lm_context->i2c_context = params->i2c_context;
1109 lm_context->get_random_byte = params->get_random_byte;
1112 al_assert((lm_context->sfp_detection == FALSE) ||
1113 (lm_context->i2c_read != NULL));
1115 al_assert((lm_context->retimer_exist == FALSE) ||
1116 (lm_context->i2c_write != NULL));
1118 lm_context->local_adv.selector_field = 1;
1119 lm_context->local_adv.capability = 0;
1120 lm_context->local_adv.remote_fault = 0;
1121 lm_context->local_adv.acknowledge = 0;
1122 lm_context->local_adv.next_page = 0;
1123 lm_context->local_adv.technology = AL_ETH_AN_TECH_10GBASE_KR;
1124 lm_context->local_adv.fec_capability = params->kr_fec_enable;
1126 lm_context->mode = AL_ETH_LM_MODE_DISCONNECTED;
1127 lm_context->serdes_tx_params_valid = FALSE;
1128 lm_context->serdes_rx_params_valid = FALSE;
1130 lm_context->rx_param_dirty = 1;
1131 lm_context->tx_param_dirty = 1;
1133 lm_context->gpio_get = params->gpio_get;
1134 lm_context->gpio_present = params->gpio_present;
1136 lm_context->max_speed = params->max_speed;
1137 lm_context->sfp_detect_force_mode = params->sfp_detect_force_mode;
1139 lm_context->lm_pause = params->lm_pause;
1141 lm_context->led_config = params->led_config;
1143 lm_context->retimer_configured = FALSE;
1145 lm_context->link_state = AL_ETH_LM_LINK_DOWN;
1151 al_eth_lm_link_detection(struct al_eth_lm_context *lm_context,
1158 al_assert(lm_context != NULL);
1167 if (lm_context->lm_pause != NULL) {
1168 boolean_t lm_pause = lm_context->lm_pause(lm_context->i2c_context);
1172 if (lm_context->link_state == AL_ETH_LM_LINK_UP)
1182 *old_mode = lm_context->mode;
1183 *new_mode = lm_context->mode;
1188 switch (lm_context->link_state) {
1190 al_eth_link_status_get(lm_context->adapter, &status);
1196 al_eth_led_set(lm_context->adapter, TRUE);
1201 lm_context->link_state = AL_ETH_LM_LINK_DOWN;
1204 lm_context->link_state = AL_ETH_LM_LINK_DOWN_RF;
1209 al_eth_link_status_get(lm_context->adapter, &status);
1213 lm_context->link_state = AL_ETH_LM_LINK_DOWN;
1218 lm_context->link_state = AL_ETH_LM_LINK_UP;
1226 al_eth_led_set(lm_context->adapter, FALSE);
1228 if (lm_context->sfp_detection) {
1229 err = al_eth_module_detect(lm_context, new_mode);
1235 lm_context->mode = *new_mode;
1237 lm_context->mode = lm_context->default_mode;
1238 *new_mode = lm_context->mode;
1246 lm_context->rx_param_dirty = 1;
1247 lm_context->tx_param_dirty = 1;
1249 lm_context->new_port = TRUE;
1251 if ((*new_mode != AL_ETH_LM_MODE_DISCONNECTED) && (lm_context->led_config)) {
1269 lm_context->led_config(lm_context->i2c_context, &data);
1277 al_eth_lm_link_establish(struct al_eth_lm_context *lm_context, boolean_t *link_up)
1282 switch (lm_context->link_state) {
1301 if (lm_context->lm_pause) {
1302 boolean_t lm_pause = lm_context->lm_pause(lm_context->i2c_context);
1310 if ((lm_context->new_port) && (lm_context->retimer_exist)) {
1311 al_eth_serdes_static_rx_params_set(lm_context);
1312 al_eth_serdes_static_tx_params_set(lm_context);
1314 al_eth_lm_retimer_config(lm_context);
1318 if (retimer[lm_context->retimer_type].config(lm_context)) {
1325 lm_context->new_port = FALSE;
1330 if (lm_context->retimer_exist) {
1331 if (retimer[lm_context->retimer_type].rx_adaptation) {
1332 ret = retimer[lm_context->retimer_type].rx_adaptation(lm_context);
1343 signal_detected = lm_context->serdes_obj->signal_is_detected(
1344 lm_context->serdes_obj,
1345 lm_context->lane);
1354 if (lm_context->serdes_obj->type_get() == AL_SRDS_TYPE_25G) {
1356 al_eth_gearbox_reset(lm_context->adapter, FALSE, TRUE);
1361 if (lm_context->retimer_exist) {
1364 ret = al_eth_lm_check_for_link(lm_context, link_up);
1374 if ((lm_context->mode == AL_ETH_LM_MODE_10G_DA) && (lm_context->link_training)) {
1375 lm_context->local_adv.transmitted_nonce = lm_context->get_random_byte();
1376 lm_context->local_adv.transmitted_nonce &= 0x1f;
1378 ret = al_eth_an_lt_execute(lm_context->adapter,
1379 lm_context->serdes_obj,
1380 lm_context->lane,
1381 &lm_context->local_adv,
1382 &lm_context->partner_adv);
1384 lm_context->rx_param_dirty = 1;
1385 lm_context->tx_param_dirty = 1;
1389 lm_context->link_training_failures = 0;
1390 ret = al_eth_lm_check_for_link(lm_context, link_up);
1399 lm_context->link_training_failures++;
1400 if (lm_context->link_training_failures > AL_ETH_LT_FAILURES_TO_RESET) {
1404 lm_context->serdes_obj->pma_hard_reset_lane(
1405 lm_context->serdes_obj,
1406 lm_context->lane,
1408 lm_context->serdes_obj->pma_hard_reset_lane(
1409 lm_context->serdes_obj,
1410 lm_context->lane,
1412 lm_context->link_training_failures = 0;
1416 al_eth_serdes_static_tx_params_set(lm_context);
1418 if ((lm_context->mode == AL_ETH_LM_MODE_10G_DA) &&
1419 (lm_context->rx_equal)) {
1420 ret = al_eth_rx_equal_run(lm_context);
1424 ret = al_eth_lm_check_for_link(lm_context, link_up);
1433 al_eth_serdes_static_rx_params_set(lm_context);
1437 ret = al_eth_lm_check_for_link(lm_context, link_up);
1449 al_eth_lm_static_parameters_override(struct al_eth_lm_context *lm_context,
1455 lm_context->tx_params_override = *tx_params;
1456 lm_context->tx_param_dirty = 1;
1457 lm_context->serdes_tx_params_valid = TRUE;
1461 lm_context->rx_params_override = *rx_params;
1462 lm_context->rx_param_dirty = 1;
1463 lm_context->serdes_rx_params_valid = TRUE;
1470 al_eth_lm_static_parameters_override_disable(struct al_eth_lm_context *lm_context,
1475 lm_context->serdes_tx_params_valid = FALSE;
1477 lm_context->serdes_tx_params_valid = FALSE;
1483 al_eth_lm_static_parameters_get(struct al_eth_lm_context *lm_context,
1489 if (lm_context->serdes_tx_params_valid)
1490 *tx_params = lm_context->tx_params_override;
1492 lm_context->serdes_obj->tx_advanced_params_get(
1493 lm_context->serdes_obj,
1494 lm_context->lane,
1499 if (lm_context->serdes_rx_params_valid)
1500 *rx_params = lm_context->rx_params_override;
1502 lm_context->serdes_obj->rx_advanced_params_get(
1503 lm_context->serdes_obj,
1504 lm_context->lane,
1532 al_eth_lm_debug_mode_set(struct al_eth_lm_context *lm_context,
1536 lm_context->debug = enable;