From a81e3348c7d35ad2a2501ce425326c7bf9d02a16 Mon Sep 17 00:00:00 2001 From: Alex Lai Date: Sat, 4 Apr 2026 20:30:16 +0000 Subject: [PATCH 1/2] [Accton][as7535-28xb] Enhance TX_DISABLE control function 1. added qsfp tx-disable in onlp_sfpi_control_set/get function 2. added case ONLP_SFP_CONTROL_TX_DISABLE_CHANNEL in onlp_sfpi_control_set/get function 3. fixed some comments Signed-off-by: Alex Lai --- .../module/src/sfpi.c | 130 ++++++++++++++---- 1 file changed, 104 insertions(+), 26 deletions(-) diff --git a/packages/platforms/accton/x86-64/as7535-28xb/onlp/builds/x86_64_accton_as7535_28xb/module/src/sfpi.c b/packages/platforms/accton/x86-64/as7535-28xb/onlp/builds/x86_64_accton_as7535_28xb/module/src/sfpi.c index 292039245..36d251a7e 100644 --- a/packages/platforms/accton/x86-64/as7535-28xb/onlp/builds/x86_64_accton_as7535_28xb/module/src/sfpi.c +++ b/packages/platforms/accton/x86-64/as7535-28xb/onlp/builds/x86_64_accton_as7535_28xb/module/src/sfpi.c @@ -29,6 +29,13 @@ #include "x86_64_accton_as7535_28xb_int.h" #include "x86_64_accton_as7535_28xb_log.h" +#define VALIDATE(_port) \ + do { \ + if (_port < 0 || _port > 27) { \ + return ONLP_STATUS_E_INVALID; \ + } \ + } while(0) + #define VALIDATE_SFP(_port) \ do { \ if (_port < 4 || _port > 27) \ @@ -62,6 +69,24 @@ #define SET_RATE_SELECT_BIT(x,RS_BIT_pos) (x | (1<= 0 && port <= 3) { + present = onlp_sfpi_is_present(port); + if (present == 1) { + identifier = onlp_sfpi_dev_readb(port, XCVR_PORT_EEPROM_DEVADDR, QSFP_EEPROM_OFFSET_IDENTIFIER); + + if (identifier == QSFP_DD_IDENTIFIER) { + onlp_sfpi_dev_writeb(port, XCVR_PORT_EEPROM_DEVADDR, QSFP_EEPROM_OFFSET_PAGE_SELECT, QSFP_DD_PAGE_ADVERTISING); + + if (onlp_sfpi_dev_readb(port, XCVR_PORT_EEPROM_DEVADDR, QSFP_DD_P01H_OFFSET_CONTROL_1) & QSFP_DD_P01H_TX_DISABLE_SUPPORT) { + onlp_sfpi_dev_writeb(port, XCVR_PORT_EEPROM_DEVADDR, QSFP_EEPROM_OFFSET_BANK_SELECT, 0); + onlp_sfpi_dev_writeb(port, XCVR_PORT_EEPROM_DEVADDR, QSFP_EEPROM_OFFSET_PAGE_SELECT, QSFP_DD_PAGE_LANE_CTRL); + onlp_sfpi_dev_writeb(port, XCVR_PORT_EEPROM_DEVADDR, QSFP_DD_P10H_OFFSET_OUTPUT_DISABLE_TX, value); + onlp_sfpi_dev_writeb(port, XCVR_PORT_EEPROM_DEVADDR, QSFP_EEPROM_OFFSET_PAGE_SELECT, QSFP_DD_PAGE_ADMIN_INFO); + return ONLP_STATUS_OK; + } else { + AIM_LOG_ERROR("Setting tx disable to port(%d) is not supported\r\n", port); + onlp_sfpi_dev_writeb(port, XCVR_PORT_EEPROM_DEVADDR, QSFP_EEPROM_OFFSET_PAGE_SELECT, QSFP_DD_PAGE_ADMIN_INFO); + return ONLP_STATUS_E_UNSUPPORTED; + } + } else { /* QSFP */ + /* txdis valid bit(bit0-bit3), xxxx 1111 */ + value = value&0xf; + onlp_sfpi_dev_writeb(port, XCVR_PORT_EEPROM_DEVADDR, QSFP_EEPROM_OFFSET_TXDIS, value); + return ONLP_STATUS_OK; + } + } else { + return ONLP_STATUS_E_INTERNAL; + } + } else { + if (onlp_file_write_int(value, MODULE_TXDISABLE_FORMAT, (port+1)) < 0) { + AIM_LOG_ERROR("Unable to set tx_disable status to port(%d)\r\n", port); + return ONLP_STATUS_E_INTERNAL; + } return ONLP_STATUS_OK; } - break; } case ONLP_SFP_CONTROL_RESET: { VALIDATE_QSFP(port); @@ -369,6 +426,8 @@ int onlp_sfpi_control_get(int port, onlp_sfp_control_t control, int* value) { int present = 0; + int identifier = 0; + int tx_dis = 0; int multirate = 0; int mbit_identifier; switch(control) { @@ -394,15 +453,34 @@ onlp_sfpi_control_get(int port, onlp_sfp_control_t control, int* value) return ONLP_STATUS_OK; } - case ONLP_SFP_CONTROL_TX_DISABLE: { - VALIDATE_SFP(port); - - if (onlp_file_read_int(value, MODULE_TXDISABLE_FORMAT, (port+1)) < 0) { - AIM_LOG_ERROR("Unable to read tx_disabled status from port(%d)\r\n", port); - return ONLP_STATUS_E_INTERNAL; + case ONLP_SFP_CONTROL_TX_DISABLE: + case ONLP_SFP_CONTROL_TX_DISABLE_CHANNEL: { + VALIDATE(port); + if (port >= 0 && port <= 3) { + present = onlp_sfpi_is_present(port); + if (present == 1) { + identifier = onlp_sfpi_dev_readb(port, XCVR_PORT_EEPROM_DEVADDR, QSFP_EEPROM_OFFSET_IDENTIFIER); + + if (identifier == QSFP_DD_IDENTIFIER) { + onlp_sfpi_dev_writeb(port, XCVR_PORT_EEPROM_DEVADDR, QSFP_EEPROM_OFFSET_BANK_SELECT, 0); + onlp_sfpi_dev_writeb(port, XCVR_PORT_EEPROM_DEVADDR, QSFP_EEPROM_OFFSET_PAGE_SELECT, QSFP_DD_PAGE_LANE_CTRL); + tx_dis = onlp_sfpi_dev_readb(port, XCVR_PORT_EEPROM_DEVADDR, QSFP_DD_P10H_OFFSET_OUTPUT_DISABLE_TX); + onlp_sfpi_dev_writeb(port, XCVR_PORT_EEPROM_DEVADDR, QSFP_EEPROM_OFFSET_PAGE_SELECT, QSFP_DD_PAGE_ADMIN_INFO); + } else { /* QSFP */ + tx_dis = onlp_sfpi_dev_readb(port, XCVR_PORT_EEPROM_DEVADDR, QSFP_EEPROM_OFFSET_TXDIS); + } + *value = tx_dis; + return ONLP_STATUS_OK; + } else { + return ONLP_STATUS_E_INTERNAL; + } + } else { /* SFP */ + if (onlp_file_read_int(value, MODULE_TXDISABLE_FORMAT, (port+1)) < 0) { + AIM_LOG_ERROR("Unable to read tx_disabled status from port(%d)\r\n", port); + return ONLP_STATUS_E_INTERNAL; + } + return ONLP_STATUS_OK; } - - return ONLP_STATUS_OK; } case ONLP_SFP_CONTROL_RESET: { VALIDATE_QSFP(port); From a9867ef66dabfd4b7846eebb668964ac7ae7e9db Mon Sep 17 00:00:00 2001 From: Alex Lai Date: Thu, 9 Apr 2026 07:41:30 +0000 Subject: [PATCH 2/2] [Accton][as7535-28xb] Check sfp presence for consistency Signed-off-by: Alex Lai --- .../module/src/sfpi.c | 42 ++++++++++--------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/packages/platforms/accton/x86-64/as7535-28xb/onlp/builds/x86_64_accton_as7535_28xb/module/src/sfpi.c b/packages/platforms/accton/x86-64/as7535-28xb/onlp/builds/x86_64_accton_as7535_28xb/module/src/sfpi.c index 36d251a7e..7e72a9409 100644 --- a/packages/platforms/accton/x86-64/as7535-28xb/onlp/builds/x86_64_accton_as7535_28xb/module/src/sfpi.c +++ b/packages/platforms/accton/x86-64/as7535-28xb/onlp/builds/x86_64_accton_as7535_28xb/module/src/sfpi.c @@ -324,9 +324,9 @@ onlp_sfpi_control_set(int port, onlp_sfp_control_t control, int value) case ONLP_SFP_CONTROL_TX_DISABLE: case ONLP_SFP_CONTROL_TX_DISABLE_CHANNEL: { VALIDATE(port); - if(port >= 0 && port <= 3) { - present = onlp_sfpi_is_present(port); - if (present == 1) { + present = onlp_sfpi_is_present(port); + if (present == 1) { + if (port >= 0 && port <= 3) { identifier = onlp_sfpi_dev_readb(port, XCVR_PORT_EEPROM_DEVADDR, QSFP_EEPROM_OFFSET_IDENTIFIER); if (identifier == QSFP_DD_IDENTIFIER) { @@ -350,14 +350,15 @@ onlp_sfpi_control_set(int port, onlp_sfp_control_t control, int value) return ONLP_STATUS_OK; } } else { - return ONLP_STATUS_E_INTERNAL; + if (onlp_file_write_int(value, MODULE_TXDISABLE_FORMAT, (port+1)) < 0) { + AIM_LOG_ERROR("Unable to set tx_disable status to port(%d)\r\n", port); + return ONLP_STATUS_E_INTERNAL; + } + return ONLP_STATUS_OK; } } else { - if (onlp_file_write_int(value, MODULE_TXDISABLE_FORMAT, (port+1)) < 0) { - AIM_LOG_ERROR("Unable to set tx_disable status to port(%d)\r\n", port); - return ONLP_STATUS_E_INTERNAL; - } - return ONLP_STATUS_OK; + AIM_LOG_ERROR("No transceiver is present in port(%d)\r\n", port); + return ONLP_STATUS_E_INTERNAL; } } case ONLP_SFP_CONTROL_RESET: { @@ -456,9 +457,9 @@ onlp_sfpi_control_get(int port, onlp_sfp_control_t control, int* value) case ONLP_SFP_CONTROL_TX_DISABLE: case ONLP_SFP_CONTROL_TX_DISABLE_CHANNEL: { VALIDATE(port); - if (port >= 0 && port <= 3) { - present = onlp_sfpi_is_present(port); - if (present == 1) { + present = onlp_sfpi_is_present(port); + if (present == 1) { + if (port >= 0 && port <= 3) { identifier = onlp_sfpi_dev_readb(port, XCVR_PORT_EEPROM_DEVADDR, QSFP_EEPROM_OFFSET_IDENTIFIER); if (identifier == QSFP_DD_IDENTIFIER) { @@ -471,15 +472,16 @@ onlp_sfpi_control_get(int port, onlp_sfp_control_t control, int* value) } *value = tx_dis; return ONLP_STATUS_OK; - } else { - return ONLP_STATUS_E_INTERNAL; - } - } else { /* SFP */ - if (onlp_file_read_int(value, MODULE_TXDISABLE_FORMAT, (port+1)) < 0) { - AIM_LOG_ERROR("Unable to read tx_disabled status from port(%d)\r\n", port); - return ONLP_STATUS_E_INTERNAL; + } else { /* SFP */ + if (onlp_file_read_int(value, MODULE_TXDISABLE_FORMAT, (port+1)) < 0) { + AIM_LOG_ERROR("Unable to read tx_disabled status from port(%d)\r\n", port); + return ONLP_STATUS_E_INTERNAL; + } + return ONLP_STATUS_OK; } - return ONLP_STATUS_OK; + } else { + AIM_LOG_ERROR("No transceiver is present in port(%d)\r\n", port); + return ONLP_STATUS_E_INTERNAL; } } case ONLP_SFP_CONTROL_RESET: {