diff --git a/packages/base/any/kernels/modules/ym2651y.c b/packages/base/any/kernels/modules/ym2651y.c index 5ac4ca77b..870af5194 100755 --- a/packages/base/any/kernels/modules/ym2651y.c +++ b/packages/base/any/kernels/modules/ym2651y.c @@ -869,6 +869,7 @@ static struct ym2651y_data *ym2651y_update_device(struct device *dev) } if ((strncmp((data->mfr_model+1), "YM-2851J", strlen("YM-2851J")) == 0)|| + (strncmp((data->mfr_model+1), "YM-2851F", strlen("YM-2851F")) == 0)|| (strncmp((data->mfr_model+1), "YM-2651Y", strlen("YM-2651Y")) == 0)|| (strncmp((data->mfr_model+1), "YPEB1200AM", strlen("YPEB1200AM")) == 0)) { diff --git a/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.c b/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.c index e186159d2..90083c3ba 100644 --- a/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.c +++ b/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.c @@ -95,10 +95,11 @@ int psu_serial_number_get(int id, char *serial, int serial_len) psu_type_t psu_type_get(int id, char* modelname, int modelname_len) { int value = 0; - int ret = ONLP_STATUS_OK; - char model[PSU_MODEL_NAME_LEN + 1] = {0}; + int ret = ONLP_STATUS_OK; char *prefix = psu_pmbus_path(id); char fan_dir[PSU_FAN_DIR_LEN + 1] = {0}; + char *model_string = NULL; + int len = 0; if (modelname && modelname_len < PSU_MODEL_NAME_LEN) { return PSU_TYPE_UNKNOWN; @@ -114,73 +115,102 @@ psu_type_t psu_type_get(int id, char* modelname, int modelname_len) if (!value) { return PSU_TYPE_UNKNOWN; } - - /* Read mode name */ - ret = onlp_file_read((uint8_t*)model, PSU_MODEL_NAME_LEN, &value, "%s%s", prefix, "psu_mfr_model"); - if (ret != ONLP_STATUS_OK || value != PSU_MODEL_NAME_LEN) { - return PSU_TYPE_UNKNOWN; - - } - - if (modelname) { - memcpy(modelname, model, sizeof(model)); + /* Read full model name */ + len = onlp_file_read_str(&model_string, "%spsu_mfr_model", prefix); + if (!model_string || len <= 0) + { + AIM_FREE_IF_PTR(model_string); + return PSU_TYPE_UNKNOWN; } - - if (strncmp(model, "DPS-850A", strlen("DPS-850A")) == 0) { + if (modelname) + strcpy(modelname, model_string); + if ((strstr(model_string, "DPS-850AB-5") != NULL)){ ret = onlp_file_read((uint8_t*)fan_dir, PSU_FAN_DIR_LEN, &value, "%s%s", prefix, "psu_fan_dir"); - if (strncmp(fan_dir, "B2F", strlen("B2F")) == 0) { + if (ret != ONLP_STATUS_OK) + { + AIM_LOG_ERROR("Unable to read psu fan dir\r\n"); + AIM_FREE_IF_PTR(model_string); + return ONLP_STATUS_E_INTERNAL; + } + if (strncmp(fan_dir, "B2F", strlen("B2F")) == 0) + { + AIM_FREE_IF_PTR(model_string); return PSU_TYPE_AC_DPS850_B2F; } - return PSU_TYPE_AC_DPS850_F2B; + else + { + AIM_FREE_IF_PTR(model_string); + return PSU_TYPE_AC_DPS850_F2B; + } } - - if (strncmp(model, "YM-2851F", strlen("YM-2851F")) == 0) { + /* Access length 8 data for 3Y PSU model compare */ + if (modelname) { + memcpy(modelname, model_string, PSU_MODEL_NAME_LEN); + } + if (strncmp(model_string, "YM-2851F", strlen("YM-2851F")) == 0) { char model_opt[PSU_MODEL_NAME_LEN + 1] = {0}; ret = onlp_file_read((uint8_t*)model_opt, PSU_MODEL_NAME_LEN, &value, "%s%s", prefix, "psu_mfr_model_opt"); + if (ret != ONLP_STATUS_OK) + { + AIM_LOG_ERROR("Unable to read psu model opt\r\n"); + AIM_FREE_IF_PTR(model_string); + return ONLP_STATUS_E_INTERNAL; + } if (modelname && value) { memcpy(modelname + PSU_MODEL_NAME_LEN, model_opt, strlen(model_opt)-1); } if ((strncmp(model_opt, "DR", strlen("DR")) == 0) || (strncmp(model_opt, "D01R", strlen("D01R")) == 0)) { + AIM_FREE_IF_PTR(model_string); return PSU_TYPE_AC_YM2851FDR_B2F; /* YM-2851FDR or YM-2851FD01R */ } else if ((strncmp(model_opt, "CR", strlen("CR")) == 0) || (strncmp(model_opt, "C01R", strlen("C01R")) == 0)) { + AIM_FREE_IF_PTR(model_string); return PSU_TYPE_AC_YM2851FCR_F2B; /* YM-2851FDR or YM-2851FD01R */ } ret = onlp_file_read((uint8_t*)fan_dir, PSU_FAN_DIR_LEN, &value, "%s%s", prefix, "psu_fan_dir"); if ((strncmp(fan_dir, "B2F", strlen("B2F")) == 0) || (strncmp(fan_dir, "AFI", strlen("AFI")) == 0)) { + AIM_FREE_IF_PTR(model_string); return PSU_TYPE_AC_YM2851FDR_B2F; } - + AIM_FREE_IF_PTR(model_string); return PSU_TYPE_AC_YM2851FCR_F2B; } - if (strncmp(model, "YM-2851J", strlen("YM-2851J")) == 0) { + if (strncmp(model_string, "YM-2851J", strlen("YM-2851J")) == 0) { char model_opt[PSU_MODEL_NAME_LEN + 1] = {0}; ret = onlp_file_read((uint8_t*)model_opt, PSU_MODEL_NAME_LEN, &value, "%s%s", prefix, "psu_mfr_model_opt"); + if (ret != ONLP_STATUS_OK) + { + AIM_LOG_ERROR("Unable to read psu model opt\r\n"); + AIM_FREE_IF_PTR(model_string); + return ONLP_STATUS_E_INTERNAL; + } if (modelname && value) { memcpy(modelname + PSU_MODEL_NAME_LEN, model_opt, strlen(model_opt)-1); } if (strncmp(model_opt, "FR", strlen("FR")) == 0) { + AIM_FREE_IF_PTR(model_string); return PSU_TYPE_DC_YM2851JFR_B2F; } else if (strncmp(model_opt, "ER", strlen("ER")) == 0) { + AIM_FREE_IF_PTR(model_string); return PSU_TYPE_DC_YM2851JER_F2B; } ret = onlp_file_read((uint8_t*)fan_dir, PSU_FAN_DIR_LEN, &value, "%s%s", prefix, "psu_fan_dir"); if ((strncmp(fan_dir, "B2F", strlen("B2F")) == 0) || (strncmp(fan_dir, "AFI", strlen("AFI")) == 0)) { + AIM_FREE_IF_PTR(model_string); return PSU_TYPE_DC_YM2851JFR_B2F; } - - + AIM_FREE_IF_PTR(model_string); return PSU_TYPE_DC_YM2851JER_F2B; /* YM-2851JER */ } - + AIM_FREE_IF_PTR(model_string); return PSU_TYPE_UNKNOWN; } diff --git a/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.h b/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.h index 76f8d37db..73cab29ac 100644 --- a/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.h +++ b/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/platform_lib.h @@ -100,6 +100,15 @@ int psu_ym2651y_pmbus_info_set(int id, char *node, int value); int psu_dps850_pmbus_info_get(int id, char *node, int *value); char* psu_pmbus_path(int pid); +#define AIM_FREE_IF_PTR(p) \ + do \ + { \ + if (p) { \ + aim_free(p); \ + p = NULL; \ + } \ + } while (0) + #define DEBUG_MODE 0 #if (DEBUG_MODE == 1)