From 41094a602f368390928ef93aa1f78db397166c86 Mon Sep 17 00:00:00 2001 From: Willy Liu Date: Tue, 11 Nov 2025 18:33:16 +0800 Subject: [PATCH 1/4] [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 e186159d22..423cecdc19 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 76f8d37dbf..73cab29ac1 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 301daff7f3aa276a33a679939e915df60025cc81 Mon Sep 17 00:00:00 2001 From: Willy Liu Date: Tue, 18 Nov 2025 15:58:58 +0800 Subject: [PATCH 2/4] Remove read model name for length 8 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 423cecdc19..90083c3baa 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; } From bc75184b6d447174f12f7b33d9aa771a313d3fa3 Mon Sep 17 00:00:00 2001 From: Eric Yang Date: Wed, 26 Nov 2025 09:20:05 +0000 Subject: [PATCH 3/4] [ACCTON][AS7816-64x] Support Goreal PSU G1441-0850WNB Signed-off-by: Eric Yang --- packages/base/any/kernels/modules/ym2651y.c | 12 ++-- .../module/src/fani.c | 19 +++++-- .../module/src/platform_lib.c | 16 ++++++ .../module/src/platform_lib.h | 3 + .../module/src/psui.c | 56 +++++++++++++++++++ 5 files changed, 98 insertions(+), 8 deletions(-) diff --git a/packages/base/any/kernels/modules/ym2651y.c b/packages/base/any/kernels/modules/ym2651y.c index d85e84541c..4240a8b7cf 100755 --- a/packages/base/any/kernels/modules/ym2651y.c +++ b/packages/base/any/kernels/modules/ym2651y.c @@ -312,7 +312,8 @@ static ssize_t show_linear(struct device *dev, struct device_attribute *da, (strncmp(ptr, "FSF019", strlen("FSF019")) == 0)|| (strncmp(ptr, "FSF045", strlen("FSF045")) == 0)|| (strncmp(ptr, "SPAACTN-04", strlen("SPAACTN-04")) == 0)|| - (strncmp(ptr, "SPAACTN-03", strlen("SPAACTN-03")) == 0)) { + (strncmp(ptr, "SPAACTN-03", strlen("SPAACTN-03")) == 0)|| + (strncmp(ptr, "G1441-0850WNB", strlen("G1441-0850WNB")) == 0)) { value = data->v_in; } break; @@ -323,7 +324,8 @@ static ssize_t show_linear(struct device *dev, struct device_attribute *da, (strncmp(ptr, "FSF019", strlen("FSF019")) == 0)|| (strncmp(ptr, "FSF045", strlen("FSF045")) == 0)|| (strncmp(ptr, "SPAACTN-04", strlen("SPAACTN-04")) == 0)|| - (strncmp(ptr, "SPAACTN-03", strlen("SPAACTN-03")) == 0)) { + (strncmp(ptr, "SPAACTN-03", strlen("SPAACTN-03")) == 0)|| + (strncmp(ptr, "G1441-0850WNB", strlen("G1441-0850WNB")) == 0)) { value = data->i_in; } break; @@ -334,7 +336,8 @@ static ssize_t show_linear(struct device *dev, struct device_attribute *da, (strncmp(ptr, "FSF019", strlen("FSF019")) == 0)|| (strncmp(ptr, "FSF045", strlen("FSF045")) == 0)|| (strncmp(ptr, "SPAACTN-04", strlen("SPAACTN-04")) == 0)|| - (strncmp(ptr, "SPAACTN-03", strlen("SPAACTN-03")) == 0)) { + (strncmp(ptr, "SPAACTN-03", strlen("SPAACTN-03")) == 0)|| + (strncmp(ptr, "G1441-0850WNB", strlen("G1441-0850WNB")) == 0)) { value = data->p_in; } break; @@ -518,7 +521,8 @@ static ssize_t show_vout(struct device *dev, struct device_attribute *da, return show_vout_by_mode(dev, da, buf); } else if ((strncmp(ptr, "DPS-850A", strlen("DPS-850A")) == 0)|| - (strncmp(ptr, "YM-2851J", strlen("YM-2851J")) == 0)) { + (strncmp(ptr, "YM-2851J", strlen("YM-2851J")) == 0) || + (strncmp(ptr, "G1441-0850WNB", strlen("G1441-0850WNB")) == 0)) { return show_vout_by_mode(dev, da, buf); } else { diff --git a/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/fani.c b/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/fani.c index 62cec4a48a..6e399e952e 100755 --- a/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/fani.c +++ b/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/fani.c @@ -165,6 +165,7 @@ _onlp_get_fan_direction_on_psu(void) case PSU_TYPE_AC_DPS850_F2B: case PSU_TYPE_AC_YM2851FCR_F2B: case PSU_TYPE_DC_YM2851JER_F2B: + case PSU_TYPE_DC_G1441_0850WNB_F2B: return ONLP_FAN_STATUS_F2B; case PSU_TYPE_AC_DPS850_B2F: case PSU_TYPE_AC_YM2851FDR_B2F: @@ -202,12 +203,22 @@ _onlp_fani_info_get_fan_on_psu(int pid, onlp_fan_info_t* info) { if (psu_dps850_pmbus_info_get(pid, "psu_fan1_speed_rpm", &val) == ONLP_STATUS_OK) { - info->rpm = val; - info->percentage = (info->rpm * 100) / MAX_PSU_FAN_SPEED; - info->status |= (val == 0) ? ONLP_FAN_STATUS_FAILED : 0; + info->rpm = val; + info->percentage = (info->rpm * 100) / MAX_PSU_FAN_SPEED; + info->status |= (val == 0) ? ONLP_FAN_STATUS_FAILED : 0; + } } + + if (psu_type == PSU_TYPE_DC_G1441_0850WNB_F2B) + { + if (psu_g1441_pmbus_info_get(pid, "psu_fan1_speed_rpm", &val) == ONLP_STATUS_OK) + { + info->rpm = val; + info->percentage = (info->rpm * 100) / MAX_PSU_FAN_SPEED; + info->status |= (val == 0) ? ONLP_FAN_STATUS_FAILED : 0; + } } - + if (psu_type == PSU_TYPE_AC_YM2851FCR_F2B || psu_type == PSU_TYPE_AC_YM2851FDR_B2F || psu_type == PSU_TYPE_DC_YM2851JER_F2B || psu_type == PSU_TYPE_DC_YM2851JFR_B2F) { 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 90083c3baa..64b6987ea6 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 @@ -142,6 +142,9 @@ psu_type_t psu_type_get(int id, char* modelname, int modelname_len) AIM_FREE_IF_PTR(model_string); return PSU_TYPE_AC_DPS850_F2B; } + }else if(strncmp(model_string, "G1441-0850WNB", strlen("G1441-0850WNB")) == 0){ + AIM_FREE_IF_PTR(model_string); + return PSU_TYPE_DC_G1441_0850WNB_F2B; } /* Access length 8 data for 3Y PSU model compare */ if (modelname) { @@ -252,6 +255,19 @@ int psu_dps850_pmbus_info_get(int id, char *node, int *value) return ONLP_STATUS_OK; } +int psu_g1441_pmbus_info_get(int id, char *node, int *value) +{ + char *prefix = psu_pmbus_path(id); + *value = 0; + + if (onlp_file_read_int(value, "%s%s", prefix, node) < 0) { + AIM_LOG_ERROR("Unable to read status from file(%s%s)\r\n", prefix, node); + return ONLP_STATUS_E_INTERNAL; + } + + return ONLP_STATUS_OK; +} + enum onlp_fan_dir onlp_get_fan_dir(void) { int value = FAN_DIR_F2B; 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 73cab29ac1..91e9a1ad2b 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 @@ -83,6 +83,7 @@ typedef enum psu_type { PSU_TYPE_AC_DPS850_B2F, PSU_TYPE_DC_YM2851JER_F2B, PSU_TYPE_DC_YM2851JFR_B2F, + PSU_TYPE_DC_G1441_0850WNB_F2B, } psu_type_t; enum onlp_fan_dir { @@ -98,6 +99,8 @@ int psu_serial_number_get(int id, char *serial, int serial_len); int psu_ym2651y_pmbus_info_get(int id, char *node, int *value); int psu_ym2651y_pmbus_info_set(int id, char *node, int value); int psu_dps850_pmbus_info_get(int id, char *node, int *value); +int psu_g1441_pmbus_info_get(int id, char *node, int *value); + char* psu_pmbus_path(int pid); #define AIM_FREE_IF_PTR(p) \ diff --git a/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/psui.c b/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/psui.c index 28ea31c729..fb88a7d25c 100755 --- a/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/psui.c +++ b/packages/platforms/accton/x86-64/as7816-64x/onlp/builds/x86_64_accton_as7816_64x/module/src/psui.c @@ -167,6 +167,59 @@ psu_dps850_info_get(onlp_psu_info_t* info) return ONLP_STATUS_OK; } +static int +psu_g1441_info_get(onlp_psu_info_t* info) +{ + int val = 0; + int index = ONLP_OID_ID_GET(info->hdr.id); + + /* Set capability + */ + info->caps = ONLP_PSU_CAPS_AC; + if (info->status & ONLP_PSU_STATUS_FAILED) { + return ONLP_STATUS_OK; + } + + /* Set the associated oid_table */ + info->hdr.coids[0] = ONLP_FAN_ID_CREATE(index + CHASSIS_FAN_COUNT); + info->hdr.coids[1] = ONLP_THERMAL_ID_CREATE(index + CHASSIS_THERMAL_COUNT); + + /* Read voltage, current and power */ + if (psu_g1441_pmbus_info_get(index, "psu_v_out", &val) == 0) { + info->mvout = val; + info->caps |= ONLP_PSU_CAPS_VOUT; + } + + if (psu_g1441_pmbus_info_get(index, "psu_v_in", &val) == 0) { + info->mvin = val; + info->caps |= ONLP_PSU_CAPS_VIN; + } + + if (psu_g1441_pmbus_info_get(index, "psu_i_out", &val) == 0) { + info->miout = val; + info->caps |= ONLP_PSU_CAPS_IOUT; + } + + if (psu_g1441_pmbus_info_get(index, "psu_i_in", &val) == 0) { + info->miin = val; + info->caps |= ONLP_PSU_CAPS_IIN; + } + + if (psu_g1441_pmbus_info_get(index, "psu_p_out", &val) == 0) { + info->mpout = val; + info->caps |= ONLP_PSU_CAPS_POUT; + } + + if (psu_g1441_pmbus_info_get(index, "psu_p_in", &val) == 0) { + info->mpin = val; + info->caps |= ONLP_PSU_CAPS_PIN; + } + + psu_serial_number_get(index, info->serial, sizeof(info->serial)); + + return ONLP_STATUS_OK; +} + /* * Get all information about the given PSU oid. @@ -226,6 +279,9 @@ onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info) case PSU_TYPE_AC_DPS850_B2F: ret = psu_dps850_info_get(info); break; + case PSU_TYPE_DC_G1441_0850WNB_F2B: + ret = psu_g1441_info_get(info); + break; case PSU_TYPE_AC_YM2851FCR_F2B: case PSU_TYPE_AC_YM2851FDR_B2F: info->caps = ONLP_PSU_CAPS_AC; /* Set capability */ From 2c4f329a1125120369bd1f817cd723eb09fe5f35 Mon Sep 17 00:00:00 2001 From: Eric Yang Date: Tue, 20 Jan 2026 03:09:29 +0000 Subject: [PATCH 4/4] [ACCTON][AS7816-64x] Add support for retrieving PSU fan direction via PMBus register 0xC3 Signed-off-by: Eric Yang --- packages/base/any/kernels/modules/ym2651y.c | 3 ++- .../module/src/platform_lib.c | 19 +++++++++++++++++-- .../module/src/platform_lib.h | 1 + 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/packages/base/any/kernels/modules/ym2651y.c b/packages/base/any/kernels/modules/ym2651y.c index 4240a8b7cf..b0a3ad9887 100755 --- a/packages/base/any/kernels/modules/ym2651y.c +++ b/packages/base/any/kernels/modules/ym2651y.c @@ -443,7 +443,8 @@ static ssize_t show_ascii(struct device *dev, struct device_attribute *da, /* FAN direction for PTT1600's PSU, depends on 4th and 3rd bit of return value of 0xC3 command */ if ((strncmp((data->mfr_model + 1),"PTT1600", strlen("PTT1600")) == 0) || - (strncmp((data->mfr_model + 1),"DPS-650AB-11 C", strlen("DPS-650AB-11 C")) == 0)){ + (strncmp((data->mfr_model + 1),"DPS-650AB-11 C", strlen("DPS-650AB-11 C")) == 0) || + (strncmp((data->mfr_model + 1),"G1441-0850WNB", strlen("G1441-0850WNB")) == 0)){ /* Check if 4th bit is '1' and 3rd bit is '0' for "F2B (AFO)" FAN direction */ if((((data->fan_dir[0] >> 3) & 1) == 0) && (((data->fan_dir[0] >> 4) & 1) == 1)) { strcpy(ptr,"AFO"); 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 64b6987ea6..da547266c2 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 @@ -143,8 +143,23 @@ psu_type_t psu_type_get(int id, char* modelname, int modelname_len) return PSU_TYPE_AC_DPS850_F2B; } }else if(strncmp(model_string, "G1441-0850WNB", strlen("G1441-0850WNB")) == 0){ - AIM_FREE_IF_PTR(model_string); - return PSU_TYPE_DC_G1441_0850WNB_F2B; + 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, "AFI", strlen("AFI")) == 0) + { + AIM_FREE_IF_PTR(model_string); + return PSU_TYPE_DC_G1441_0850WNB_B2F; + } + else + { + AIM_FREE_IF_PTR(model_string); + return PSU_TYPE_DC_G1441_0850WNB_F2B; + } } /* Access length 8 data for 3Y PSU model compare */ if (modelname) { 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 91e9a1ad2b..e702af8bba 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 @@ -84,6 +84,7 @@ typedef enum psu_type { PSU_TYPE_DC_YM2851JER_F2B, PSU_TYPE_DC_YM2851JFR_B2F, PSU_TYPE_DC_G1441_0850WNB_F2B, + PSU_TYPE_DC_G1441_0850WNB_B2F, } psu_type_t; enum onlp_fan_dir {