diff --git a/packages/platforms/accton/x86-64/as5916-54xks/onlp/builds/x86_64_accton_as5916_54xks/module/src/sfpi.c b/packages/platforms/accton/x86-64/as5916-54xks/onlp/builds/x86_64_accton_as5916_54xks/module/src/sfpi.c index 4d97bc46f9..3f746b5724 100755 --- a/packages/platforms/accton/x86-64/as5916-54xks/onlp/builds/x86_64_accton_as5916_54xks/module/src/sfpi.c +++ b/packages/platforms/accton/x86-64/as5916-54xks/onlp/builds/x86_64_accton_as5916_54xks/module/src/sfpi.c @@ -34,9 +34,23 @@ #define MODULE_RXLOS_FORMAT "/sys/devices/platform/as5916_54xks_sfp/module_rx_los_%d" #define MODULE_TXFAULT_FORMAT "/sys/devices/platform/as5916_54xks_sfp/module_tx_fault_%d" #define MODULE_TXDISABLE_FORMAT "/sys/devices/platform/as5916_54xks_sfp/module_tx_disable_%d" +#define MODULE_RESET_FORMAT "/sys/devices/platform/as5916_54xks_sfp/module_reset_%d" +#define MODULE_LPMODE_FORMAT "/sys/devices/platform/as5916_54xks_sfp/module_lpmode_%d" #define MODULE_PRESENT_ALL_ATTR "/sys/devices/platform/as5916_54xks_sfp/module_present_all" #define MODULE_RXLOS_ALL_ATTR "/sys/devices/platform/as5916_54xks_sfp/module_rxlos_all" +#define PORT_MAX_NUM 54 +#define VALIDATE_SFP(_port) \ + do { \ + if (_port < 0 || _port >= 48) \ + return ONLP_STATUS_E_UNSUPPORTED; \ + } while(0) + +#define VALIDATE_QSFP(_port) \ + do { \ + if (_port < 48 || _port >= PORT_MAX_NUM) \ + return ONLP_STATUS_E_UNSUPPORTED; \ + } while(0) /************************************************************ * * SFPI Entry Points @@ -201,6 +215,8 @@ 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, (port+1)) < 0) { AIM_LOG_ERROR("Unable to set tx_disable status to port(%d)\r\n", port); rv = ONLP_STATUS_E_INTERNAL; @@ -211,6 +227,34 @@ 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, (port+1)) < 0) { + AIM_LOG_ERROR("Unable to set reset status to port(%d)\r\n", port); + rv = ONLP_STATUS_E_INTERNAL; + } + else { + rv = ONLP_STATUS_OK; + } + 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 set 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; @@ -232,9 +276,7 @@ onlp_sfpi_control_get(int port, onlp_sfp_control_t control, int* value) { case ONLP_SFP_CONTROL_RX_LOS: { - if (port >= 48) { - return ONLP_STATUS_E_UNSUPPORTED; - } + VALIDATE_SFP(port); if (onlp_file_read_int(value, MODULE_RXLOS_FORMAT, (port+1)) < 0) { AIM_LOG_ERROR("Unable to read rx_loss status from port(%d)\r\n", port); @@ -248,9 +290,7 @@ onlp_sfpi_control_get(int port, onlp_sfp_control_t control, int* value) case ONLP_SFP_CONTROL_TX_FAULT: { - if (port >= 48) { - return ONLP_STATUS_E_UNSUPPORTED; - } + VALIDATE_SFP(port); if (onlp_file_read_int(value, MODULE_TXFAULT_FORMAT, (port+1)) < 0) { AIM_LOG_ERROR("Unable to read tx_fault status from port(%d)\r\n", port); @@ -264,6 +304,8 @@ onlp_sfpi_control_get(int port, onlp_sfp_control_t control, int* value) 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); rv = ONLP_STATUS_E_INTERNAL; @@ -274,6 +316,35 @@ 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, (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; + } + + 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; }