Skip to content

Commit f7a132e

Browse files
committed
Fixed link flap for 400G on X732Q-T
1 parent 9ddc82b commit f7a132e

File tree

8 files changed

+64
-163
lines changed

8 files changed

+64
-163
lines changed

README.md

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,9 +152,24 @@ Using TARGET_CONFIG_FILE /usr/local/sde/share/p4/targets/tofino2/diag.conf
152152
If you're running tofino2 based X-T bare metal switch and facing link issue with modules, please try to have this patch appiled to your SDE, which will significantly improve link stability.
153153
```
154154
diff --git a/pkgsrc/bf-drivers/src/bf_pm/port_fsm/tof2_fsm/bf_pm_fsm_dfe.c b/pkgsrc/bf-drivers/src/bf_pm/port_fsm/tof2_fsm/bf_pm_fsm_dfe.c
155-
index a66d0e8..036488e 100644
155+
index a66d0e8d..79f65cc5 100644
156156
--- a/pkgsrc/bf-drivers/src/bf_pm/port_fsm/tof2_fsm/bf_pm_fsm_dfe.c
157157
+++ b/pkgsrc/bf-drivers/src/bf_pm/port_fsm/tof2_fsm/bf_pm_fsm_dfe.c
158+
@@ -228,12 +228,12 @@ static bf_status_t bf_pm_fsm_wait_rx_signal(bf_dev_id_t dev_id,
159+
if (rc != BF_SUCCESS) return BF_INVALID_ARG;
160+
if (!sig_detect || !phy_ready) return BF_NOT_READY;
161+
}
162+
-
163+
+#if 0
164+
/* reset serdes to force re-adapt */
165+
for (ln = 0; ln < num_lanes; ln++) {
166+
bf_tof2_serdes_lane_reset_set(dev_id, dev_port, ln);
167+
}
168+
-
169+
+#endif
170+
bf_port_signal_detect_time_set(dev_id, dev_port);
171+
return BF_SUCCESS;
172+
}
158173
@@ -812,7 +812,11 @@ static bf_status_t bf_pm_fsm_ber_check_done(bf_dev_id_t dev_id,
159174
dev_port,
160175
ctr,

drivers/include/bf_qsfp/bf_qsfp.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -634,16 +634,8 @@ double bf_qsfp_get_cached_module_temper (
634634

635635
int bf_qsfp_get_cdr_support (int port,
636636
bool *rx_cdr_support, bool *tx_cdr_support);
637-
int bf_qsfp_get_rx_cdr_ctrl_support (int port,
638-
bool *rx_cdr_ctrl_support);
639637
int bf_qsfp_get_rxtx_cdr_ctrl_state (int port,
640638
uint8_t *cdr_ctrl_state);
641-
int bf_qsfp_get_tx_cdr_ctrl_support (int port,
642-
bool *tx_cdr_ctrl_support);
643-
int bf_qsfp_get_rx_cdr_lol_support (int port,
644-
bool *rx_cdr_lol_support);
645-
int bf_qsfp_get_tx_cdr_lol_support (int port,
646-
bool *tx_cdr_lol_support);
647639
void bf_qsfp_print_ddm (int conn_id, qsfp_global_sensor_t *trans, qsfp_channel_t *chnl);
648640

649641
int bf_qsfp_ctrlmask_set (int port,

drivers/src/bf_port_mgmt/bf_pm_intf.c

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,6 @@ static uint32_t
8585
qsfp_quick_rmv_pres_mask[3]; // 0->lower mask, 1->upper mask
8686
// 2->cpu port mask
8787

88-
static uint32_t bf_pltfm_pm_dbnc_thres = 0;
89-
9088
static int bf_pm_num_qsfp = 0;
9189
static int bf_pm_num_mac = 0;
9290

@@ -1708,9 +1706,6 @@ bf_pltfm_status_t bf_pltfm_pm_init (
17081706
bf_pm_num_qsfp = bf_qsfp_get_max_qsfp_ports();
17091707
bf_pm_num_mac = platform_num_ports_get ();
17101708

1711-
/* Port debounce threshold. */
1712-
bf_pltfm_get_debounce_threshold (&bf_pltfm_pm_dbnc_thres);
1713-
17141709
for (conn_id = 0; conn_id < bf_pm_num_qsfp;
17151710
conn_id++) {
17161711
qsfp_info_clear (conn_id);
@@ -1988,8 +1983,3 @@ bf_pm_qsfp_info_t *bf_pltfm_get_pm_qsfp_info_ptr (
19881983
{
19891984
return &pm_qsfp_info_arr[connector];
19901985
}
1991-
1992-
uint32_t bf_pltfm_pm_dbnc_thres_get()
1993-
{
1994-
return bf_pltfm_pm_dbnc_thres;
1995-
}

drivers/src/bf_port_mgmt/bf_pm_intf_tf2.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include <bf_pm/bf_pm_intf.h>
2323
#include <bf_pltfm.h>
2424
#include <bf_pltfm_ext_phy.h>
25+
#include "bf_pltfm_chss_mgmt_intf.h"
2526
#include "bf_pm_priv.h"
2627

2728
static bf_pm_intf_t intf_obj[MAX_CONNECTORS][MAX_CHAN_PER_CONNECTOR];
@@ -462,7 +463,8 @@ static void bf_pm_intf_set_debounce_thresh(bf_pm_intf_cfg_t *icfg,
462463
bf_pm_qsfp_info_t *qsfp_info) {
463464
bf_pal_front_port_handle_t port_hdl;
464465
bf_dev_id_t dev_id;
465-
uint32_t debounce_value = bf_pltfm_pm_dbnc_thres_get();
466+
uint32_t debounce_value = 0;
467+
bf_pltfm_get_debounce_threshold(&debounce_value);
466468

467469
if (!icfg || !intf || !qsfp_info) return;
468470

@@ -476,10 +478,8 @@ static void bf_pm_intf_set_debounce_thresh(bf_pm_intf_cfg_t *icfg,
476478
port_hdl.chnl_id = icfg->channel;
477479

478480
port_hdl = port_hdl;
479-
if ((!qsfp_info->is_optic) && (icfg->encoding == BF_PLTFM_ENCODING_PAM4)) {
480-
if (!bf_pm_intf_is_qsfpdd_short(qsfp_info->qsfpdd_type)) {
481+
if (icfg->encoding == BF_PLTFM_ENCODING_PAM4) {
481482
bfn_pp_dbnc_set(dev_id, &port_hdl, debounce_value);
482-
}
483483
}
484484
}
485485

@@ -835,6 +835,9 @@ static void bf_pm_interface_fsm_run(bf_pm_intf_cfg_t *icfg,
835835
// restore debounce threshold
836836
bf_pm_intf_restore_debounce_thresh(icfg, intf, qsfp_info);
837837

838+
// Set debounce threshold for PAM4
839+
bf_pm_intf_set_debounce_thresh(icfg, intf, qsfp_info);
840+
838841
// enable SERDES TX
839842
if (qsfp_info->is_optic) {
840843
bf_pm_pltfm_front_port_eligible_for_autoneg(
@@ -940,6 +943,7 @@ static void bf_pm_interface_fsm_run(bf_pm_intf_cfg_t *icfg,
940943
intf->rxlos_debounce_cntr =
941944
bf_qsfp_rxlos_debounce_get(port_hdl.conn_id);
942945
next_st = PM_INTF_FSM_SET_RX_READY;
946+
next_st = PM_INTF_FSM_WAIT_MEDIA_RX_LOS; // by tsihang, 2025/07/28.
943947
break;
944948
}
945949

@@ -1044,8 +1048,6 @@ static void bf_pm_interface_fsm_run(bf_pm_intf_cfg_t *icfg,
10441048
break;
10451049
case PM_INTF_FSM_SET_RX_READY:
10461050
if ((!bf_pltfm_pm_is_ha_mode()) && qsfp_info->is_present) {
1047-
/* Set debounce threshold before set Rx ready. */
1048-
bf_pm_intf_set_debounce_thresh(icfg, intf, qsfp_info);
10491051
/* If Rx not ready, bf_pm_fsm_run will keep in BF_PM_FSM_ST_WAIT_SIGNAL_OK state. */
10501052
bf_pm_port_serdes_rx_ready_for_bringup_set(
10511053
icfg->dev_id, &port_hdl, true);

drivers/src/bf_port_mgmt/bf_pm_priv.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,6 @@ bf_status_t bf_pltfm_pm_media_type_get (
153153
bf_pltfm_status_t bf_pltfm_pm_ha_mode_set();
154154
bf_pltfm_status_t bf_pltfm_pm_ha_mode_clear();
155155
bool bf_pltfm_pm_is_ha_mode();
156-
uint32_t bf_pltfm_pm_dbnc_thres_get();
157156

158157
#if defined(HAVE_SFP)
159158
bf_pm_sfp_info_t *bf_pltfm_get_pm_sfp_info_ptr (

drivers/src/bf_qsfp/bf_qsfp_comm.c

Lines changed: 0 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -8375,70 +8375,6 @@ int bf_qsfp_get_cdr_support (int port,
83758375
return 0;
83768376
}
83778377

8378-
/* TF1, by tsihang 2023-05-10. */
8379-
int bf_qsfp_get_rx_cdr_ctrl_support (int port,
8380-
bool *rx_cdr_ctrl_support)
8381-
{
8382-
int rc;
8383-
uint8_t readval[3];
8384-
8385-
if (port > bf_plt_max_qsfp) {
8386-
return 0;
8387-
}
8388-
8389-
if (bf_qsfp_is_passive_cu (port)) {
8390-
*rx_cdr_ctrl_support = false;
8391-
return 0;
8392-
}
8393-
8394-
if (bf_qsfp_is_sff8636 (port)) {
8395-
rc = bf_qsfp_field_read_onebank (
8396-
port, OPTIONS, 0, 0, sizeof (readval),
8397-
readval);
8398-
if (rc == 0) {
8399-
*rx_cdr_ctrl_support = (readval[1] >> 6) & 0x1;
8400-
} else {
8401-
return -1;
8402-
}
8403-
} else {
8404-
*rx_cdr_ctrl_support = false;
8405-
}
8406-
8407-
return 0;
8408-
}
8409-
8410-
/* TF1, by tsihang 2023-05-10. */
8411-
int bf_qsfp_get_tx_cdr_ctrl_support (int port,
8412-
bool *tx_cdr_ctrl_support)
8413-
{
8414-
int rc;
8415-
uint8_t readval[3];
8416-
8417-
if (port > bf_plt_max_qsfp) {
8418-
return 0;
8419-
}
8420-
8421-
if (bf_qsfp_is_passive_cu (port)) {
8422-
*tx_cdr_ctrl_support = false;
8423-
return 0;
8424-
}
8425-
8426-
if (bf_qsfp_is_sff8636 (port)) {
8427-
rc = bf_qsfp_field_read_onebank (
8428-
port, OPTIONS, 0, 0, sizeof (readval),
8429-
readval);
8430-
if (rc == 0) {
8431-
*tx_cdr_ctrl_support = (readval[1] >> 7) & 0x1;
8432-
} else {
8433-
return -1;
8434-
}
8435-
} else {
8436-
*tx_cdr_ctrl_support = false;
8437-
}
8438-
8439-
return 0;
8440-
}
8441-
84428378
/* SFF-8636 only, by tsihang 2023-05-10. */
84438379
int bf_qsfp_get_rxtx_cdr_ctrl_state (int port,
84448380
uint8_t *cdr_ctrl_state)
@@ -8472,67 +8408,6 @@ int bf_qsfp_get_rxtx_cdr_ctrl_state (int port,
84728408
return 0;
84738409
}
84748410

8475-
/* TF1, by tsihang 2023-05-10. */
8476-
int bf_qsfp_get_rx_cdr_lol_support (int port,
8477-
bool *rx_cdr_lol_support)
8478-
{
8479-
int rc;
8480-
uint8_t readval[3];
8481-
8482-
if (port > bf_plt_max_qsfp) {
8483-
return 0;
8484-
}
8485-
8486-
if (bf_qsfp_is_passive_cu (port)) {
8487-
*rx_cdr_lol_support = false;
8488-
return 0;
8489-
}
8490-
8491-
if (bf_qsfp_is_sff8636 (port)) {
8492-
rc = bf_qsfp_field_read_onebank (
8493-
port, OPTIONS, 0, 0, sizeof (readval),
8494-
readval);
8495-
if (rc == 0) {
8496-
*rx_cdr_lol_support = (readval[1] >> 4) & 0x1;
8497-
} else {
8498-
return -1;
8499-
}
8500-
} else {
8501-
*rx_cdr_lol_support = false;
8502-
}
8503-
return 0;
8504-
}
8505-
/* TF1, by tsihang 2023-05-10. */
8506-
int bf_qsfp_get_tx_cdr_lol_support (int port,
8507-
bool *tx_cdr_lol_support)
8508-
{
8509-
int rc;
8510-
uint8_t readval[3];
8511-
8512-
if (port > bf_plt_max_qsfp) {
8513-
return 0;
8514-
}
8515-
8516-
if (bf_qsfp_is_passive_cu (port)) {
8517-
*tx_cdr_lol_support = false;
8518-
return 0;
8519-
}
8520-
8521-
if (bf_qsfp_is_sff8636 (port)) {
8522-
rc = bf_qsfp_field_read_onebank (
8523-
port, OPTIONS, 0, 0, sizeof (readval),
8524-
readval);
8525-
if (rc == 0) {
8526-
*tx_cdr_lol_support = (readval[1] >> 5) & 0x1;
8527-
} else {
8528-
return -1;
8529-
}
8530-
} else {
8531-
*tx_cdr_lol_support = false;
8532-
}
8533-
return 0;
8534-
}
8535-
85368411
int bf_qsfp_is_cdr_required (int port, bool *rx_cdr_required, bool *tx_cdr_required) {
85378412
if (port > bf_plt_max_qsfp) {
85388413
return 0;

platforms/asterfusion-bf/src/platform_mgr/platform_health_mntr.c

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ static void bf_pltfm_onlp_mntr_transceiver()
410410
int module;
411411
int max_sfp_modules;
412412
int max_qsfp_modules;
413-
uint8_t buf[MAX_QSFP_PAGE_SIZE * 4] = {0};
413+
uint8_t buf[MAX_QSFP_PAGE_SIZE * 6] = {0};
414414
uint32_t flags = bf_pltfm_mgr_ctx()->flags;
415415

416416
struct qsfp_ctx_t *qsfp, *qsfp_ctx;
@@ -491,6 +491,14 @@ static void bf_pltfm_onlp_mntr_transceiver()
491491
}
492492
}
493493

494+
495+
/* Providing limited memory pages should be enough since
496+
the claim is only for DDM information.
497+
SFF8436 & SFF8636: LP00h + UP(00-03)h, 128 * 5
498+
CMIS: LM + P(00-04)h, 128 * 6
499+
Thus we need a buffer of at least size 128 * 6.
500+
By SunZheng, 2025/04/11.
501+
*/
494502
if (bf_qsfp_get_cached_info (i,
495503
QSFP_PAGE0_LOWER, buf)) {
496504
continue;
@@ -500,13 +508,33 @@ static void bf_pltfm_onlp_mntr_transceiver()
500508
buf + MAX_QSFP_PAGE_SIZE)) {
501509
continue;
502510
}
503-
#if 0
504-
if (bf_qsfp_is_cmis (i)) {
511+
if (bf_qsfp_get_cached_info (
512+
i, QSFP_PAGE1,
513+
buf + MAX_QSFP_PAGE_SIZE * 2)) {
505514
continue;
506515
}
507-
#endif
508-
onlp_save (path, (char *)buf,
509-
MAX_QSFP_PAGE_SIZE * 2);
516+
if (bf_qsfp_get_cached_info (
517+
i, QSFP_PAGE2,
518+
buf + MAX_QSFP_PAGE_SIZE * 3)) {
519+
continue;
520+
}
521+
if (bf_qsfp_get_cached_info (
522+
i, QSFP_PAGE3,
523+
buf + MAX_QSFP_PAGE_SIZE * 4)) {
524+
continue;
525+
}
526+
if (bf_qsfp_is_cmis (i)) {
527+
if (bf_qsfp_get_cached_info (
528+
i, QSFP_PAGE4,
529+
buf + MAX_QSFP_PAGE_SIZE * 5)) {
530+
continue;
531+
}
532+
onlp_save (path, (char *)buf,
533+
MAX_QSFP_PAGE_SIZE * 6);
534+
} else {
535+
onlp_save (path, (char *)buf,
536+
MAX_QSFP_PAGE_SIZE * 5);
537+
}
510538
}
511539
sprintf (path, ONLP_LOG_QSFP_PRES_PATH,
512540
"presence");
@@ -573,12 +601,12 @@ static void bf_pltfm_onlp_mntr_transceiver()
573601
continue;
574602
}
575603
if (bf_sfp_get_cached_info (i, 1,
576-
buf + 2 * MAX_QSFP_PAGE_SIZE) ) {
604+
buf + MAX_QSFP_PAGE_SIZE) ) {
577605
continue;
578606
}
579607
/* $ hexdump /var/asterfusion/qsfp_10_eeprom is helpful. */
580608
onlp_save (path, (char *)buf,
581-
MAX_QSFP_PAGE_SIZE * 4);
609+
MAX_QSFP_PAGE_SIZE * 2);
582610
}
583611
sprintf (path, ONLP_LOG_SFP_PRES_PATH,
584612
"presence");

platforms/asterfusion-bf/utils/quick-start.sh

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
# You could get the version of current ONL via 'cat /etc/onl/rootfs/manifest.json'.
1515
# The following VERSION in quick-start.sh should never be changed by user.
16-
VERSION="25.0414"
16+
VERSION="25.0811"
1717

1818
PKGS=/root/bfnplatform
1919

@@ -44,11 +44,11 @@ xt_platform='X312P-T'
4444
# - install bsp-lts_Y.M-sde9u3_generic_amd64.deb
4545
#
4646
################################################################
47-
bfnplatform_debs_bsp=("$PKGS/bsp-lts_25.03-sde9u9_generic_amd64.deb")
47+
bfnplatform_debs_bsp=("$PKGS/bsp-lts_25.08-sde9u9_generic_amd64.deb")
4848
# sde-x.y.z_1.**.deb for tof1 only
4949
bfnplatform_debs_sde=("$PKGS/sde-9.13.3_1.00-all_generic_amd64.deb")
5050
# sde-x.y.z_2.**.deb for tof2 only
51-
bfnplatform_debs_sde_tof2=("$PKGS/sde-9.13.3_2.00-2.4E0-4-all_generic_amd64.deb")
51+
bfnplatform_debs_sde_tof2=("$PKGS/sde-9.13.3_2.01-2.4E0-4-all_generic_amd64.deb")
5252

5353
################################################################
5454
# Install dependencies. And should never forget to modify
@@ -78,7 +78,7 @@ bfnplatform_debs_sde_common=("$PKGS/p4c-9.13.3_1.00-all_generic_amd64.deb"
7878
"$PKGS/protobuf-cpp_3.15.8_generic_amd64.deb")
7979

8080
# LEGACY: For tof1 based X5/X3 only
81-
bfnplatform_debs_97x_bsp=("$PKGS/bsp-lts_25.03-sde9u3_generic_amd64.deb")
81+
bfnplatform_debs_97x_bsp=("$PKGS/bsp-lts_25.08-sde9u3_generic_amd64.deb")
8282
bfnplatform_debs_97x=("$PKGS/sde-9.7.4_1.00-all_generic_amd64.deb"
8383
"$PKGS/thrift_0.13.0_generic_amd64.deb"
8484
"$PKGS/grpc_1.17.0-r1_generic_amd64.deb"

0 commit comments

Comments
 (0)