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);