From 14a7c7262bb016603ca1678b5f53db4bdd2bbed7 Mon Sep 17 00:00:00 2001 From: Willy Liu Date: Thu, 13 Nov 2025 16:41:01 +0800 Subject: [PATCH 1/3] [ACCTON][AS7816-64x] Fix PSU model name Fix PSU model name for Delta PSU DPS-850AB-5 B Signed-off-by: Willy Liu --- .../module/src/platform_lib.c | 43 ++++++++++++------- .../module/src/platform_lib.h | 9 ++++ 2 files changed, 37 insertions(+), 15 deletions(-) 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..423cecdc1 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 @@ -99,6 +99,8 @@ psu_type_t psu_type_get(int id, char* modelname, int modelname_len) char model[PSU_MODEL_NAME_LEN + 1] = {0}; 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,24 +116,36 @@ 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; - + /* Read full model name for PSU except 3y PSU */ + 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 (modelname) { - memcpy(modelname, model, sizeof(model)); - } - - 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 (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; + } + } + /* 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)); } if (strncmp(model, "YM-2851F", strlen("YM-2851F")) == 0) { @@ -177,7 +191,6 @@ psu_type_t psu_type_get(int id, char* modelname, int modelname_len) return PSU_TYPE_DC_YM2851JFR_B2F; } - return PSU_TYPE_DC_YM2851JER_F2B; /* YM-2851JER */ } 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) From 4f17dd18abde978392987f19a15756cd2d5eb586 Mon Sep 17 00:00:00 2001 From: Willy Liu Date: Mon, 17 Nov 2025 10:55:26 +0800 Subject: [PATCH 2/3] [ACCTON][AS7816-64x] Fix model name for 3Y PSU 1. Support PSU mfr_model_opt for YM-2851F, abd then the 3Y full model name can be shown Signed-off-by: Willy Liu --- packages/base/any/kernels/modules/ym2651y.c | 1 + 1 file changed, 1 insertion(+) 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)) { From abee558c2c540b45a59dddafcbfbe14046beae39 Mon Sep 17 00:00:00 2001 From: Willy Liu Date: Tue, 18 Nov 2025 16:58:44 +0800 Subject: [PATCH 3/3] [ACCTON][AS7816-64X] Remove read model name for length 8 and add free model string Signed-off-by: Willy Liu --- .../module/src/platform_lib.c | 49 +++++++++++++------ 1 file changed, 33 insertions(+), 16 deletions(-) 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 423cecdc1..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,8 +95,7 @@ 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; @@ -116,7 +115,7 @@ psu_type_t psu_type_get(int id, char* modelname, int modelname_len) if (!value) { return PSU_TYPE_UNKNOWN; } - /* Read full model name for PSU except 3y PSU */ + /* Read full model name */ len = onlp_file_read_str(&model_string, "%spsu_mfr_model", prefix); if (!model_string || len <= 0) { @@ -127,6 +126,12 @@ psu_type_t psu_type_get(int id, char* modelname, int modelname_len) 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 (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); @@ -138,62 +143,74 @@ psu_type_t psu_type_get(int id, char* modelname, int modelname_len) return PSU_TYPE_AC_DPS850_F2B; } } - /* 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; - } - + /* Access length 8 data for 3Y PSU model compare */ if (modelname) { - memcpy(modelname, model, sizeof(model)); + memcpy(modelname, model_string, PSU_MODEL_NAME_LEN); } - - if (strncmp(model, "YM-2851F", strlen("YM-2851F")) == 0) { + 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; }