From 92d5cde2b678fa40551da0875e59483438e24e40 Mon Sep 17 00:00:00 2001 From: Eric Yang Date: Wed, 11 Mar 2026 08:50:15 +0800 Subject: [PATCH 1/2] [Accton][as5835-54x][as5835-54t] Add set/get sfp module_reset functionality Signed-off-by: Eric Yang --- .../module/src/sfpi.c | 54 +++++++++++++++++- .../module/src/sfpi.c | 56 +++++++++++++++---- 2 files changed, 98 insertions(+), 12 deletions(-) diff --git a/packages/platforms/accton/x86-64/as5835-54t/onlp/builds/x86_64_accton_as5835_54t/module/src/sfpi.c b/packages/platforms/accton/x86-64/as5835-54t/onlp/builds/x86_64_accton_as5835_54t/module/src/sfpi.c index 42b7375486..eb39e38eae 100644 --- a/packages/platforms/accton/x86-64/as5835-54t/onlp/builds/x86_64_accton_as5835_54t/module/src/sfpi.c +++ b/packages/platforms/accton/x86-64/as5835-54t/onlp/builds/x86_64_accton_as5835_54t/module/src/sfpi.c @@ -31,11 +31,18 @@ int sfp_map[] = {28,29,26,30,31,27}; +#define VALIDATE_QSFP(_port) \ + do { \ + if (_port < 48 || _port > 53 ) \ + return ONLP_STATUS_E_UNSUPPORTED; \ + } while(0) + #define PORT_BUS_INDEX(port) (sfp_map[port-48]) #define PORT_EEPROM_FORMAT "/sys/bus/i2c/devices/%d-0050/eeprom" #define MODULE_PRESENT_FORMAT "/sys/bus/i2c/devices/3-0062/module_present_%d" #define MODULE_PRESENT_ALL_ATTR "/sys/bus/i2c/devices/3-0062/module_present_all" +#define MODULE_RESET_FORMAT "/sys/bus/i2c/devices/3-0062/module_reset_%d" /************************************************************ * @@ -214,13 +221,56 @@ onlp_sfpi_dev_writew(int port, uint8_t devaddr, uint8_t addr, uint16_t value) int onlp_sfpi_control_set(int port, onlp_sfp_control_t control, int value) { - return ONLP_STATUS_E_UNSUPPORTED; + int rv; + + switch(control) + { + case ONLP_SFP_CONTROL_RESET: + { + VALIDATE_QSFP(port); + if (onlp_file_write_int(value, MODULE_RESET_FORMAT, (port+1)) < 0) { + AIM_LOG_ERROR("Unable to write reset status to port(%d)\r\n", port); + rv = ONLP_STATUS_E_INTERNAL; + } + else { + rv = ONLP_STATUS_OK; + } + break; + } + + default: + rv = ONLP_STATUS_E_UNSUPPORTED; + break; + } + + return rv; } int onlp_sfpi_control_get(int port, onlp_sfp_control_t control, int* value) { - return ONLP_STATUS_E_UNSUPPORTED; + int rv; + + switch(control) + { + case ONLP_SFP_CONTROL_RESET: + { + VALIDATE_QSFP(port); + if (onlp_file_read_int(value, MODULE_RESET_FORMAT, (port+1)) < 0) { + AIM_LOG_ERROR("Unable to read reset status from port(%d)\r\n", port); + rv = ONLP_STATUS_E_INTERNAL; + } + else { + rv = ONLP_STATUS_OK; + } + break; + } + + default: + rv = ONLP_STATUS_E_UNSUPPORTED; + } + + return rv; } int diff --git a/packages/platforms/accton/x86-64/as5835-54x/onlp/builds/x86_64_accton_as5835_54x/module/src/sfpi.c b/packages/platforms/accton/x86-64/as5835-54x/onlp/builds/x86_64_accton_as5835_54x/module/src/sfpi.c index 8053f9f8db..853332cd86 100644 --- a/packages/platforms/accton/x86-64/as5835-54x/onlp/builds/x86_64_accton_as5835_54x/module/src/sfpi.c +++ b/packages/platforms/accton/x86-64/as5835-54x/onlp/builds/x86_64_accton_as5835_54x/module/src/sfpi.c @@ -38,6 +38,18 @@ int sfp_map[] = { 26,30,31,27 }; +#define VALIDATE_SFP(_port) \ + do { \ + if (_port < 0 || _port > 47) \ + return ONLP_STATUS_E_UNSUPPORTED; \ + } while(0) + +#define VALIDATE_QSFP(_port) \ + do { \ + if (_port < 48 || _port > 53 ) \ + return ONLP_STATUS_E_UNSUPPORTED; \ + } while(0) + #define PORT_BUS_INDEX(port) (sfp_map[port]) #define PORT_EEPROM_FORMAT "/sys/bus/i2c/devices/%d-0050/eeprom" @@ -45,6 +57,7 @@ int sfp_map[] = { #define MODULE_RXLOS_FORMAT "/sys/bus/i2c/devices/%d-00%d/module_rx_los_%d" #define MODULE_TXFAULT_FORMAT "/sys/bus/i2c/devices/%d-00%d/module_tx_fault_%d" #define MODULE_TXDISABLE_FORMAT "/sys/bus/i2c/devices/%d-00%d/module_tx_disable_%d" +#define MODULE_RESET_FORMAT "/sys/bus/i2c/devices/%d-00%d/module_reset_%d" #define MODULE_PRESENT_ALL_ATTR "/sys/bus/i2c/devices/%d-00%d/module_present_all" #define MODULE_RXLOS_ALL_ATTR_CPLD2 "/sys/bus/i2c/devices/3-0061/module_rx_los_all" #define MODULE_RXLOS_ALL_ATTR_CPLD3 "/sys/bus/i2c/devices/3-0062/module_rx_los_all" @@ -324,9 +337,6 @@ onlp_sfpi_control_set(int port, onlp_sfp_control_t control, int value) { int rv; - if (port < 0 || port >= 48) { - return ONLP_STATUS_E_UNSUPPORTED; - } int addr = (port < 38) ? 61 : 62; @@ -334,6 +344,7 @@ onlp_sfpi_control_set(int port, onlp_sfp_control_t control, int value) { case ONLP_SFP_CONTROL_TX_DISABLE: { + VALIDATE_SFP(port); if (onlp_file_write_int(value, MODULE_TXDISABLE_FORMAT, 3, addr, (port+1)) < 0) { AIM_LOG_ERROR("Unable to set tx_disable status to port(%d)\r\n", port); rv = ONLP_STATUS_E_INTERNAL; @@ -344,6 +355,19 @@ onlp_sfpi_control_set(int port, onlp_sfp_control_t control, int value) break; } + case ONLP_SFP_CONTROL_RESET: + { + VALIDATE_QSFP(port); + if (onlp_file_write_int(value, MODULE_RESET_FORMAT, 3, addr, (port+1)) < 0) { + AIM_LOG_ERROR("Unable to write reset status to port(%d)\r\n", port); + rv = ONLP_STATUS_E_INTERNAL; + } + else { + rv = ONLP_STATUS_OK; + } + break; + } + default: rv = ONLP_STATUS_E_UNSUPPORTED; break; @@ -357,17 +381,14 @@ onlp_sfpi_control_get(int port, onlp_sfp_control_t control, int* value) { int rv; - if (port < 0 || port >= 48) { - return ONLP_STATUS_E_UNSUPPORTED; - } - int addr = (port < 38) ? 61 : 62; switch(control) { case ONLP_SFP_CONTROL_RX_LOS: { - if (onlp_file_read_int(value, MODULE_RXLOS_FORMAT, 3, addr, (port+1)) < 0) { + VALIDATE_SFP(port); + if (onlp_file_read_int(value, MODULE_RXLOS_FORMAT, 3, addr, (port+1)) < 0) { AIM_LOG_ERROR("Unable to read rx_loss status from port(%d)\r\n", port); rv = ONLP_STATUS_E_INTERNAL; } @@ -379,7 +400,8 @@ onlp_sfpi_control_get(int port, onlp_sfp_control_t control, int* value) case ONLP_SFP_CONTROL_TX_FAULT: { - if (onlp_file_read_int(value, MODULE_TXFAULT_FORMAT, 3, addr, (port+1)) < 0) { + VALIDATE_SFP(port); + if (onlp_file_read_int(value, MODULE_TXFAULT_FORMAT, 3, addr, (port+1)) < 0) { AIM_LOG_ERROR("Unable to read tx_fault status from port(%d)\r\n", port); rv = ONLP_STATUS_E_INTERNAL; } @@ -391,7 +413,8 @@ onlp_sfpi_control_get(int port, onlp_sfp_control_t control, int* value) case ONLP_SFP_CONTROL_TX_DISABLE: { - if (onlp_file_read_int(value, MODULE_TXDISABLE_FORMAT, 3, addr, (port+1)) < 0) { + VALIDATE_SFP(port); + if (onlp_file_read_int(value, MODULE_TXDISABLE_FORMAT, 3, addr, (port+1)) < 0) { AIM_LOG_ERROR("Unable to read tx_disabled status from port(%d)\r\n", port); rv = ONLP_STATUS_E_INTERNAL; } @@ -401,6 +424,19 @@ onlp_sfpi_control_get(int port, onlp_sfp_control_t control, int* value) break; } + case ONLP_SFP_CONTROL_RESET: + { + VALIDATE_QSFP(port); + if (onlp_file_read_int(value, MODULE_RESET_FORMAT, 3, addr, (port+1)) < 0) { + AIM_LOG_ERROR("Unable to read reset status from port(%d)\r\n", port); + rv = ONLP_STATUS_E_INTERNAL; + } + else { + rv = ONLP_STATUS_OK; + } + break; + } + default: rv = ONLP_STATUS_E_UNSUPPORTED; } From 85ef9df339b1453299c69dfce92e5a7ebafd16cb Mon Sep 17 00:00:00 2001 From: Eric Yang Date: Tue, 24 Mar 2026 05:53:59 +0000 Subject: [PATCH 2/2] [Accton][as5835-54x][as5835-54t] Add set/get sfp lpmode and tx_disable(QSFP) functionality --- .../module/src/sfpi.c | 76 ++++++++++++- .../module/src/sfpi.c | 104 +++++++++++++++--- 2 files changed, 164 insertions(+), 16 deletions(-) diff --git a/packages/platforms/accton/x86-64/as5835-54t/onlp/builds/x86_64_accton_as5835_54t/module/src/sfpi.c b/packages/platforms/accton/x86-64/as5835-54t/onlp/builds/x86_64_accton_as5835_54t/module/src/sfpi.c index eb39e38eae..19bd691ed9 100644 --- a/packages/platforms/accton/x86-64/as5835-54t/onlp/builds/x86_64_accton_as5835_54t/module/src/sfpi.c +++ b/packages/platforms/accton/x86-64/as5835-54t/onlp/builds/x86_64_accton_as5835_54t/module/src/sfpi.c @@ -31,9 +31,11 @@ int sfp_map[] = {28,29,26,30,31,27}; +#define QSFP_PORT_MIN 48 +#define QSFP_PORT_MAX 53 #define VALIDATE_QSFP(_port) \ do { \ - if (_port < 48 || _port > 53 ) \ + if (_port < QSFP_PORT_MIN || _port > QSFP_PORT_MAX ) \ return ONLP_STATUS_E_UNSUPPORTED; \ } while(0) @@ -43,6 +45,11 @@ int sfp_map[] = {28,29,26,30,31,27}; #define MODULE_PRESENT_FORMAT "/sys/bus/i2c/devices/3-0062/module_present_%d" #define MODULE_PRESENT_ALL_ATTR "/sys/bus/i2c/devices/3-0062/module_present_all" #define MODULE_RESET_FORMAT "/sys/bus/i2c/devices/3-0062/module_reset_%d" +#define MODULE_LPMODE_FORMAT "/sys/bus/i2c/devices/3-0062/module_lpmode_%d" + +/*QSFP tx_disable*/ +#define PORT_EEPROM_DEVADDR 0x50 +#define QSFP_EEPROM_OFFSET_TXDIS 0x56 /************************************************************ * @@ -222,9 +229,30 @@ int onlp_sfpi_control_set(int port, onlp_sfp_control_t control, int value) { int rv; + int present = 0; switch(control) { + case ONLP_SFP_CONTROL_TX_DISABLE: + case ONLP_SFP_CONTROL_TX_DISABLE_CHANNEL: + { + VALIDATE_QSFP(port); + present = onlp_sfpi_is_present(port); + if(present == 1) + { + /* txdis valid bit(bit0-bit3), xxxx 1111 */ + value = value & 0xf; + onlp_sfpi_dev_writeb(port, PORT_EEPROM_DEVADDR, QSFP_EEPROM_OFFSET_TXDIS, value); + + rv = ONLP_STATUS_OK; + } + else + { + rv = ONLP_STATUS_E_INTERNAL; + } + break; + } + case ONLP_SFP_CONTROL_RESET: { VALIDATE_QSFP(port); @@ -238,6 +266,19 @@ onlp_sfpi_control_set(int port, onlp_sfp_control_t control, int value) break; } + case ONLP_SFP_CONTROL_LP_MODE: + { + VALIDATE_QSFP(port); + if (onlp_file_write_int(value, MODULE_LPMODE_FORMAT, (port+1)) < 0) { + AIM_LOG_ERROR("Unable to write lpmode status to port(%d)\r\n", port); + rv = ONLP_STATUS_E_INTERNAL; + } + else { + rv = ONLP_STATUS_OK; + } + break; + } + default: rv = ONLP_STATUS_E_UNSUPPORTED; break; @@ -250,9 +291,29 @@ int onlp_sfpi_control_get(int port, onlp_sfp_control_t control, int* value) { int rv; + int tx_dis_val = 0; + int present = 0; switch(control) { + case ONLP_SFP_CONTROL_TX_DISABLE: + case ONLP_SFP_CONTROL_TX_DISABLE_CHANNEL: + { + VALIDATE_QSFP(port); + present = onlp_sfpi_is_present(port); + if(present == 1){ + /* txdis valid bit(bit0-bit3), xxxx 1111 */ + tx_dis_val = onlp_sfpi_dev_readb(port, PORT_EEPROM_DEVADDR, QSFP_EEPROM_OFFSET_TXDIS); + *value = tx_dis_val; + + rv = ONLP_STATUS_OK; + } + else{ + rv = ONLP_STATUS_E_INTERNAL; + } + break; + } + case ONLP_SFP_CONTROL_RESET: { VALIDATE_QSFP(port); @@ -266,6 +327,19 @@ onlp_sfpi_control_get(int port, onlp_sfp_control_t control, int* value) break; } + case ONLP_SFP_CONTROL_LP_MODE: + { + VALIDATE_QSFP(port); + if (onlp_file_read_int(value, MODULE_LPMODE_FORMAT, (port+1)) < 0) { + AIM_LOG_ERROR("Unable to read lpmode status from port(%d)\r\n", port); + rv = ONLP_STATUS_E_INTERNAL; + } + else { + rv = ONLP_STATUS_OK; + } + break; + } + default: rv = ONLP_STATUS_E_UNSUPPORTED; } diff --git a/packages/platforms/accton/x86-64/as5835-54x/onlp/builds/x86_64_accton_as5835_54x/module/src/sfpi.c b/packages/platforms/accton/x86-64/as5835-54x/onlp/builds/x86_64_accton_as5835_54x/module/src/sfpi.c index 853332cd86..3f5cff89bd 100644 --- a/packages/platforms/accton/x86-64/as5835-54x/onlp/builds/x86_64_accton_as5835_54x/module/src/sfpi.c +++ b/packages/platforms/accton/x86-64/as5835-54x/onlp/builds/x86_64_accton_as5835_54x/module/src/sfpi.c @@ -38,15 +38,19 @@ int sfp_map[] = { 26,30,31,27 }; +#define SFP_PORT_MIN 0 +#define SFP_PORT_MAX 47 +#define QSFP_PORT_MIN 48 +#define QSFP_PORT_MAX 53 #define VALIDATE_SFP(_port) \ do { \ - if (_port < 0 || _port > 47) \ + if (_port < SFP_PORT_MIN || _port > SFP_PORT_MAX) \ return ONLP_STATUS_E_UNSUPPORTED; \ } while(0) #define VALIDATE_QSFP(_port) \ do { \ - if (_port < 48 || _port > 53 ) \ + if (_port < QSFP_PORT_MIN || _port > QSFP_PORT_MAX ) \ return ONLP_STATUS_E_UNSUPPORTED; \ } while(0) @@ -58,10 +62,15 @@ int sfp_map[] = { #define MODULE_TXFAULT_FORMAT "/sys/bus/i2c/devices/%d-00%d/module_tx_fault_%d" #define MODULE_TXDISABLE_FORMAT "/sys/bus/i2c/devices/%d-00%d/module_tx_disable_%d" #define MODULE_RESET_FORMAT "/sys/bus/i2c/devices/%d-00%d/module_reset_%d" +#define MODULE_LPMODE_FORMAT "/sys/bus/i2c/devices/%d-00%d/module_lpmode_%d" #define MODULE_PRESENT_ALL_ATTR "/sys/bus/i2c/devices/%d-00%d/module_present_all" #define MODULE_RXLOS_ALL_ATTR_CPLD2 "/sys/bus/i2c/devices/3-0061/module_rx_los_all" #define MODULE_RXLOS_ALL_ATTR_CPLD3 "/sys/bus/i2c/devices/3-0062/module_rx_los_all" +/*QSFP tx_disable*/ +#define PORT_EEPROM_DEVADDR 0x50 +#define QSFP_EEPROM_OFFSET_TXDIS 0x56 + /************************************************************ * * SFPI Entry Points @@ -336,21 +345,41 @@ int onlp_sfpi_control_set(int port, onlp_sfp_control_t control, int value) { int rv; - - int addr = (port < 38) ? 61 : 62; + int present = 0; switch(control) { case ONLP_SFP_CONTROL_TX_DISABLE: + case ONLP_SFP_CONTROL_TX_DISABLE_CHANNEL: { - VALIDATE_SFP(port); - if (onlp_file_write_int(value, MODULE_TXDISABLE_FORMAT, 3, addr, (port+1)) < 0) { - AIM_LOG_ERROR("Unable to set tx_disable status to port(%d)\r\n", port); - rv = ONLP_STATUS_E_INTERNAL; + if (port >= SFP_PORT_MIN && port <= SFP_PORT_MAX) { //SFP + if (onlp_file_write_int(value, MODULE_TXDISABLE_FORMAT, 3, addr, (port+1)) < 0) { + AIM_LOG_ERROR("Unable to set tx_disable status to port(%d)\r\n", port); + rv = ONLP_STATUS_E_INTERNAL; + } + else { + rv = ONLP_STATUS_OK; + } + } + else if(port >= QSFP_PORT_MIN && port <= QSFP_PORT_MAX){ //QSFP + present = onlp_sfpi_is_present(port); + + if(present == 1) + { + /* txdis valid bit(bit0-bit3), xxxx 1111 */ + value = value & 0xf; + onlp_sfpi_dev_writeb(port, PORT_EEPROM_DEVADDR, QSFP_EEPROM_OFFSET_TXDIS, value); + + rv = ONLP_STATUS_OK; + } + else + { + rv = ONLP_STATUS_E_INTERNAL; + } } else { - rv = ONLP_STATUS_OK; + rv = ONLP_STATUS_E_UNSUPPORTED; } break; } @@ -368,6 +397,19 @@ onlp_sfpi_control_set(int port, onlp_sfp_control_t control, int value) break; } + case ONLP_SFP_CONTROL_LP_MODE: + { + VALIDATE_QSFP(port); + if (onlp_file_write_int(value, MODULE_LPMODE_FORMAT, 3, addr, (port+1)) < 0) { + AIM_LOG_ERROR("Unable to write lpmode status to port(%d)\r\n", port); + rv = ONLP_STATUS_E_INTERNAL; + } + else { + rv = ONLP_STATUS_OK; + } + break; + } + default: rv = ONLP_STATUS_E_UNSUPPORTED; break; @@ -380,8 +422,9 @@ int onlp_sfpi_control_get(int port, onlp_sfp_control_t control, int* value) { int rv; - int addr = (port < 38) ? 61 : 62; + int tx_dis_val = 0; + int present = 0; switch(control) { @@ -412,14 +455,32 @@ 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_SFP(port); - if (onlp_file_read_int(value, MODULE_TXDISABLE_FORMAT, 3, addr, (port+1)) < 0) { - AIM_LOG_ERROR("Unable to read tx_disabled status from port(%d)\r\n", port); - rv = ONLP_STATUS_E_INTERNAL; + if (port >= SFP_PORT_MIN && port <= SFP_PORT_MAX) { //SFP + if (onlp_file_read_int(value, MODULE_TXDISABLE_FORMAT, 3, addr, (port+1)) < 0) { + AIM_LOG_ERROR("Unable to read tx_disabled status from port(%d)\r\n", port); + rv = ONLP_STATUS_E_INTERNAL; + } + else { + rv = ONLP_STATUS_OK; + } + } + else if(port >= QSFP_PORT_MIN && port <= QSFP_PORT_MAX){ //QSFP + present = onlp_sfpi_is_present(port); + if(present == 1){ + /* txdis valid bit(bit0-bit3), xxxx 1111 */ + tx_dis_val = onlp_sfpi_dev_readb(port, PORT_EEPROM_DEVADDR, QSFP_EEPROM_OFFSET_TXDIS); + *value = tx_dis_val; + + rv = ONLP_STATUS_OK; + } + else{ + rv = ONLP_STATUS_E_INTERNAL; + } } else { - rv = ONLP_STATUS_OK; + rv = ONLP_STATUS_E_UNSUPPORTED; } break; } @@ -437,6 +498,19 @@ onlp_sfpi_control_get(int port, onlp_sfp_control_t control, int* value) break; } + case ONLP_SFP_CONTROL_LP_MODE: + { + VALIDATE_QSFP(port); + if (onlp_file_read_int(value, MODULE_LPMODE_FORMAT, 3, addr, (port+1)) < 0) { + AIM_LOG_ERROR("Unable to read lpmode status from port(%d)\r\n", port); + rv = ONLP_STATUS_E_INTERNAL; + } + else { + rv = ONLP_STATUS_OK; + } + break; + } + default: rv = ONLP_STATUS_E_UNSUPPORTED; }