diff --git a/packages/platforms/accton/x86-64/x86-64-accton-wedge100bf-65x/onlp/builds/src/module/src/platform_lib.c b/packages/platforms/accton/x86-64/x86-64-accton-wedge100bf-65x/onlp/builds/src/module/src/platform_lib.c index 3319a00f..64b41172 100644 --- a/packages/platforms/accton/x86-64/x86-64-accton-wedge100bf-65x/onlp/builds/src/module/src/platform_lib.c +++ b/packages/platforms/accton/x86-64/x86-64-accton-wedge100bf-65x/onlp/builds/src/module/src/platform_lib.c @@ -33,7 +33,7 @@ #define TTY_PROMPT "@bmc:" #define TTY_I2C_TIMEOUT 55000 #define TTY_BMC_LOGIN_TIMEOUT 1000000 -#define TTY_RETRY 3 +#define TTY_RETRY 10 #define MAXIMUM_TTY_BUFFER_LENGTH 1024 #define MAXIMUM_TTY_STRING_LENGTH (MAXIMUM_TTY_BUFFER_LENGTH - 1) @@ -97,7 +97,7 @@ static int tty_login(void) for (i = 1; i <= TTY_RETRY; i++) { snprintf(tty_buf, MAXIMUM_TTY_BUFFER_LENGTH, "\r\r"); - if (!tty_exec_buf(0, TTY_PROMPT)) { + if (!tty_exec_buf(TTY_BMC_LOGIN_TIMEOUT, TTY_PROMPT)) { return 0; } @@ -174,6 +174,46 @@ int bmc_send_command(char *cmd) return -1; } +int bmc_file_read_str(char *file, char *result, int slen) +{ + char *curr = NULL; + char cmd[88] = {0}; + char *delimit="^@\r\n"; + int flag = 0, ret = 0; + + ret = snprintf(cmd, sizeof(cmd), "cat %s\r\n", file); + if( ret >= sizeof(cmd) ){ + AIM_LOG_ERROR("cmd size overwrite (%d,%d)\r\n", ret, sizeof(cmd)); + return ONLP_STATUS_E_INTERNAL; + } + bmc_send_command(cmd); + + strtok(tty_buf, delimit); + flag = 0; + while( (curr = strtok(NULL, delimit)) != NULL ){ + switch (*curr) { + case '\n': + case '\r': + case '@': + case '^': + break; + default: + flag = 1; + break; + } + if( flag ){ + break; + } + } + + ret = snprintf(result, slen-1, "%s", curr); + if( ret >= (slen-1) ){ + AIM_LOG_ERROR("result size overwrite (%d,%d)\r\n", ret, slen-1); + return ONLP_STATUS_E_INTERNAL; + } + return 0; +} + int chk_numeric_char(char *data, int base) { int len, i, orig = 0; @@ -290,6 +330,14 @@ bmc_i2c_writeb(uint8_t bus, uint8_t devaddr, uint8_t addr, uint8_t value) return bmc_send_command(cmd); } +int +bmc_i2c_write_quick_mode(uint8_t bus, uint8_t devaddr, uint8_t value) +{ + char cmd[64] = {0}; + snprintf(cmd, sizeof(cmd), "i2cset -f -y %d 0x%x 0x%x\r\n", bus, devaddr, value); + return bmc_send_command(cmd); +} + int bmc_i2c_readw(uint8_t bus, uint8_t devaddr, uint8_t addr) { diff --git a/packages/platforms/accton/x86-64/x86-64-accton-wedge100bf-65x/onlp/builds/src/module/src/platform_lib.h b/packages/platforms/accton/x86-64/x86-64-accton-wedge100bf-65x/onlp/builds/src/module/src/platform_lib.h index 44cc4d33..50ed05c9 100644 --- a/packages/platforms/accton/x86-64/x86-64-accton-wedge100bf-65x/onlp/builds/src/module/src/platform_lib.h +++ b/packages/platforms/accton/x86-64/x86-64-accton-wedge100bf-65x/onlp/builds/src/module/src/platform_lib.h @@ -58,9 +58,11 @@ enum onlp_thermal_id }; int bmc_send_command(char *cmd); +int bmc_file_read_str(char *file, char *result, int slen); int bmc_file_read_int(int* value, char *file, int base); int bmc_i2c_readb(uint8_t bus, uint8_t devaddr, uint8_t addr); int bmc_i2c_writeb(uint8_t bus, uint8_t devaddr, uint8_t addr, uint8_t value); +int bmc_i2c_write_quick_mode(uint8_t bus, uint8_t devaddr, uint8_t value); int bmc_i2c_readw(uint8_t bus, uint8_t devaddr, uint8_t addr); int bmc_i2c_readraw(uint8_t bus, uint8_t devaddr, uint8_t addr, char* data, int data_size); diff --git a/packages/platforms/accton/x86-64/x86-64-accton-wedge100bf-65x/onlp/builds/src/module/src/psui.c b/packages/platforms/accton/x86-64/x86-64-accton-wedge100bf-65x/onlp/builds/src/module/src/psui.c index 7b964eb6..2e2b469c 100644 --- a/packages/platforms/accton/x86-64/x86-64-accton-wedge100bf-65x/onlp/builds/src/module/src/psui.c +++ b/packages/platforms/accton/x86-64/x86-64-accton-wedge100bf-65x/onlp/builds/src/module/src/psui.c @@ -39,6 +39,16 @@ #define PSU1_ID 1 #define PSU2_ID 2 +#define SYS_CPLD_PATH_FMT "/sys/bus/i2c/drivers/syscpld/12-0031/%s" +#define PSU_PRESENT_FMT "psu%d_present" +#define PSU_PWROK_FMT "psu%d_output_pwr_sts" + +#define PSU_PFE1100_PATH_FMT "/sys/bus/i2c/devices/7-%s/%s\r\n" +#define PSU_PFE1100_MODEL "mfr_model_label" +#define PSU_PFE1100_SERIAL "mfr_serial_label" + +static const char *psu_pfedrv_i2c_devaddr[] = {"0059", "005a"}; + /* * Get all information about the given PSU oid. */ @@ -83,10 +93,10 @@ pmbus_parse_literal_format(uint16_t value) int onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info) { - int pid, value, addr; + int pid, value, addr, ret = 0; + char file[32] = {0}; + char path[80] = {0}; - uint8_t mask = 0; - VALIDATE(id); pid = ONLP_OID_ID_GET(id); @@ -94,13 +104,22 @@ onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info) /* Get the present status */ - mask = 1 << ((pid-1) * 4); - value = onlp_i2c_readb(1, 0x32, 0x10, ONLP_I2C_F_FORCE); - if (value < 0) { + ret = snprintf(file, sizeof(file), PSU_PRESENT_FMT, pid); + if( ret >= sizeof(file) ){ + AIM_LOG_ERROR("file size overwrite (%d,%d)\r\n", ret, sizeof(file)); + return ONLP_STATUS_E_INTERNAL; + } + ret = snprintf(path, sizeof(path), SYS_CPLD_PATH_FMT, file); + if( ret >= sizeof(path) ){ + AIM_LOG_ERROR("path size overwrite (%d,%d)\r\n", ret, sizeof(path)); + return ONLP_STATUS_E_INTERNAL; + } + if (bmc_file_read_int(&value, path, 16) < 0) { + AIM_LOG_ERROR("Unable to read status from file (%s)\r\n", path); return ONLP_STATUS_E_INTERNAL; } - if (value & mask) { + if (value) { info->status &= ~ONLP_PSU_STATUS_PRESENT; return ONLP_STATUS_OK; } @@ -109,8 +128,22 @@ onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info) /* Get power good status */ - mask = 1 << ((pid-1) * 4 + 1); - if (!(value & mask)) { + ret = snprintf(file, sizeof(file), PSU_PWROK_FMT, pid); + if( ret >= sizeof(file) ){ + AIM_LOG_ERROR("file size overwrite (%d,%d)\r\n", ret, sizeof(file)); + return ONLP_STATUS_E_INTERNAL; + } + ret = snprintf(path, sizeof(path), SYS_CPLD_PATH_FMT, file); + if( ret >= sizeof(path) ){ + AIM_LOG_ERROR("path size overwrite (%d,%d)\r\n", ret, sizeof(path)); + return ONLP_STATUS_E_INTERNAL; + } + if (bmc_file_read_int(&value, path, 16) < 0) { + AIM_LOG_ERROR("Unable to read status from file (%s)\r\n", path); + return ONLP_STATUS_E_INTERNAL; + } + + if (!value) { info->status |= ONLP_PSU_STATUS_FAILED; return ONLP_STATUS_OK; } @@ -119,7 +152,8 @@ onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info) /* Get input output power status */ value = (pid == PSU1_ID) ? 0x2 : 0x1; /* mux channel for psu */ - if (bmc_i2c_writeb(7, 0x70, 0, value) < 0) { + if (bmc_i2c_write_quick_mode(7, 0x70, value) < 0) { + AIM_LOG_ERROR("Unable to set i2c device (7/0x70)\r\n"); return ONLP_STATUS_E_INTERNAL; } usleep(1200); @@ -166,10 +200,21 @@ onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info) } /* Get model name */ - bmc_i2c_readraw(7, addr, 0x9a, info->model, sizeof(info->model)); + ret = snprintf(path, sizeof(path), PSU_PFE1100_PATH_FMT, psu_pfedrv_i2c_devaddr[pid-1], PSU_PFE1100_MODEL); + if( ret >= sizeof(path) ){ + AIM_LOG_ERROR("path size overwrite (%d,%d)\r\n", ret, sizeof(path)); + return ONLP_STATUS_E_INTERNAL; + } + bmc_file_read_str(path, info->model, sizeof(info->model)); /* Get serial number */ - return bmc_i2c_readraw(7, addr, 0x9e, info->serial, sizeof(info->serial)); + ret = snprintf(path, sizeof(path), PSU_PFE1100_PATH_FMT, psu_pfedrv_i2c_devaddr[pid-1], PSU_PFE1100_SERIAL); + if( ret >= sizeof(path) ){ + AIM_LOG_ERROR("path size overwrite (%d,%d)\r\n", ret, sizeof(path)); + return ONLP_STATUS_E_INTERNAL; + } + bmc_file_read_str(path, info->serial, sizeof(info->serial)); + return ONLP_STATUS_OK; } int