diff --git a/packages/platforms/accton/x86-64/as9716_32d/modules/builds/x86-64-accton-as9716-32d-psu.c b/packages/platforms/accton/x86-64/as9716_32d/modules/builds/x86-64-accton-as9716-32d-psu.c index 9375b933e1..2a1afa7bf7 100755 --- a/packages/platforms/accton/x86-64/as9716_32d/modules/builds/x86-64-accton-as9716-32d-psu.c +++ b/packages/platforms/accton/x86-64/as9716_32d/modules/builds/x86-64-accton-as9716-32d-psu.c @@ -34,7 +34,7 @@ #include #include -#define MAX_MODEL_NAME 16 +#define MAX_MODEL_NAME 20 #define MAX_SERIAL_NUMBER 20 static ssize_t show_status(struct device *dev, struct device_attribute *da, char *buf); @@ -75,7 +75,6 @@ static SENSOR_DEVICE_ATTR(psu_model_name, S_IRUGO, show_string, NULL, PSU_MOD static SENSOR_DEVICE_ATTR(psu_power_good, S_IRUGO, show_status, NULL, PSU_POWER_GOOD); static SENSOR_DEVICE_ATTR(psu_serial_number, S_IRUGO, show_string, NULL, PSU_SERIAL_NUMBER); - static struct attribute *as9716_32d_psu_attributes[] = { &sensor_dev_attr_psu_present.dev_attr.attr, &sensor_dev_attr_psu_model_name.dev_attr.attr, @@ -270,72 +269,69 @@ static struct as9716_32d_psu_data *as9716_32d_psu_update_device(struct device *d if (time_after(jiffies, data->last_updated + HZ + HZ / 2) || !data->valid) { int status; - int power_good = 0; dev_dbg(&client->dev, "Starting as9716_32d update\n"); /* Read psu status */ status = as9716_32d_cpld_read(0x60, 0x3); - if (status < 0) { dev_dbg(&client->dev, "cpld reg 0x60 err %d\n", status); } else { data->status = status; } - /* Read model name */ memset(data->model_name, 0, sizeof(data->model_name)); memset(data->serial_number, 0, sizeof(data->serial_number)); - power_good = (data->status >> (3-data->index) & 0x1); - - if (power_good) { - status = as9716_32d_psu_read_block(client, 0x20, data->model_name, + + status = as9716_32d_psu_read_block(client, 0x20, data->model_name, ARRAY_SIZE(data->model_name)-1); - if (status < 0) { - data->model_name[0] = '\0'; - dev_dbg(&client->dev, "unable to read model name from (0x%x)\n", client->addr); + if (status < 0) { + data->model_name[0] = '\0'; + dev_dbg(&client->dev, "unable to read model name from (0x%x)\n", client->addr); + } + else + { + if (!strncmp(data->model_name, "FSH082", strlen("FSH082"))) + { + data->model_name[strlen("FSH082")]='\0'; } - else + else if (!strncmp(data->model_name, "FSH095", strlen("FSH095"))) { - if (!strncmp(data->model_name, "FSH082", strlen("FSH082"))) - { - data->model_name[strlen("FSH082")]='\0'; - } - else if (!strncmp(data->model_name, "YESM1300", strlen("YESM1300"))) - { - if (data->model_name[9]=='A' && data->model_name[10]=='M') - { - data->model_name[8]='A'; - data->model_name[9]='M'; - data->model_name[strlen("YESM1300AM")]='\0'; - } - else - data->model_name[strlen("YESM1300")]='\0'; - } - else if (!strncmp(data->model_name, "YM-2651Y", strlen("YM-2651Y"))) + data->model_name[strlen("FSH095")]='\0'; + } + else if (!strncmp(data->model_name, "YESM1300", strlen("YESM1300"))) + { + /* Adjust model name for YESM1300AM-2A01P10 and YESM1300AM-2R01P10 */ + memmove(&data->model_name[8], &data->model_name[9], 10); + if (data->model_name[8]=='A' && data->model_name[9]=='M') { - data->model_name[strlen("YM-2651Y")]='\0'; - } + data->model_name[strlen("YESM1300AM-2A01P10")]='\0'; + } else - data->model_name[ARRAY_SIZE(data->model_name)-1] = '\0'; - + data->model_name[strlen("YESM1300")]='\0'; } - /* Read from offset 0x35 ~ 0x47 */ - status = as9716_32d_psu_read_block(client, 0x35,data->serial_number, MAX_SERIAL_NUMBER); - if (status < 0) + else if (!strncmp(data->model_name, "YM-2651Y", strlen("YM-2651Y"))) { - data->serial_number[0] = '\0'; - dev_dbg(&client->dev, "unable to read model name from (0x%x) offset(0x2e)\n", client->addr); + data->model_name[strlen("YM-2651Y")]='\0'; } - if (!strncmp(data->model_name, "YESM1300AM", strlen("YESM1300AM"))) /*for YESM1300AM, SN length=19*/ - { - data->serial_number[MAX_SERIAL_NUMBER-1]='\0'; - } - else /*for FSH082, SN length=18*/ - data->serial_number[MAX_SERIAL_NUMBER-2]='\0'; - + else + data->model_name[ARRAY_SIZE(data->model_name)-1] = '\0'; + } + /* Read from offset 0x35 ~ 0x47 */ + status = as9716_32d_psu_read_block(client, 0x35,data->serial_number, MAX_SERIAL_NUMBER); + if (status < 0) + { + data->serial_number[0] = '\0'; + dev_dbg(&client->dev, "unable to read model name from (0x%x) offset(0x2e)\n", client->addr); + } + if ((!strncmp(data->model_name, "YESM1300AM-2A01P10", strlen("YESM1300AM-2A01P10"))) + || (!strncmp(data->model_name, "YESM1300AM-2R01P10", strlen("YESM1300AM-2R01P10"))) ) /*for YESM1300AM, SN length=19*/ + { + data->serial_number[MAX_SERIAL_NUMBER-1]='\0'; } + else /*for FSH082, SN length=18*/ + data->serial_number[MAX_SERIAL_NUMBER-2]='\0'; data->last_updated = jiffies; data->valid = 1; diff --git a/packages/platforms/accton/x86-64/as9716_32d/onlp/builds/x86_64_accton_as9716_32d/module/src/fani.c b/packages/platforms/accton/x86-64/as9716_32d/onlp/builds/x86_64_accton_as9716_32d/module/src/fani.c index e82f8a7775..55e2d9d8ac 100755 --- a/packages/platforms/accton/x86-64/as9716_32d/onlp/builds/x86_64_accton_as9716_32d/module/src/fani.c +++ b/packages/platforms/accton/x86-64/as9716_32d/onlp/builds/x86_64_accton_as9716_32d/module/src/fani.c @@ -129,7 +129,7 @@ _onlp_fani_info_get_fan(int fid, onlp_fan_info_t* info) return ONLP_STATUS_E_INTERNAL; } - info->status |= value ? ONLP_FAN_STATUS_F2B : ONLP_FAN_STATUS_B2F; + info->status |= value ? ONLP_FAN_STATUS_B2F : ONLP_FAN_STATUS_F2B; /* get front fan speed @@ -182,7 +182,8 @@ _onlp_get_fan_direction_on_psu(void) continue; } - if (PSU_TYPE_AC_F2B == psu_type) { + if ((PSU_TYPE_ACBEL_FSH082_F2B == psu_type) + || (PSU_TYPE_3Y_YESM1300AM_2A_F2B == psu_type)) { return ONLP_FAN_STATUS_F2B; } else { @@ -193,13 +194,13 @@ _onlp_get_fan_direction_on_psu(void) return 0; } + static int _onlp_fani_info_get_fan_on_psu(int pid, onlp_fan_info_t* info) { - int val = 0; - - info->status |= ONLP_FAN_STATUS_PRESENT; + int val = 0; + info->status |= ONLP_FAN_STATUS_PRESENT; /* get fan direction */ info->status |= _onlp_get_fan_direction_on_psu(); @@ -214,7 +215,7 @@ _onlp_fani_info_get_fan_on_psu(int pid, onlp_fan_info_t* info) */ if (psu_ym2651y_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->percentage = (info->rpm * 100) / MAX_PSU_FAN_SPEED; } return ONLP_STATUS_OK; diff --git a/packages/platforms/accton/x86-64/as9716_32d/onlp/builds/x86_64_accton_as9716_32d/module/src/platform_lib.c b/packages/platforms/accton/x86-64/as9716_32d/onlp/builds/x86_64_accton_as9716_32d/module/src/platform_lib.c index 59c449fb4d..96d0403f8c 100755 --- a/packages/platforms/accton/x86-64/as9716_32d/onlp/builds/x86_64_accton_as9716_32d/module/src/platform_lib.c +++ b/packages/platforms/accton/x86-64/as9716_32d/onlp/builds/x86_64_accton_as9716_32d/module/src/platform_lib.c @@ -90,7 +90,7 @@ int onlp_file_read_string(char *filename, char *buffer, int buf_size, int data_l return ret; } -#define I2C_PSU_MODEL_NAME_LEN 10 +#define I2C_PSU_MODEL_NAME_LEN 20 #define I2C_PSU_FAN_DIR_LEN 3 psu_type_t get_psu_type(int id, char* modelname, int modelname_len) @@ -99,34 +99,47 @@ psu_type_t get_psu_type(int id, char* modelname, int modelname_len) char model_name[I2C_PSU_MODEL_NAME_LEN + 1] = {0}; /* Check model name */ - node = (id == PSU1_ID) ? PSU1_AC_PMBUS_NODE(psu_mfr_model) : PSU2_AC_PMBUS_NODE(psu_mfr_model); + node = (id == PSU1_ID) ? PSU1_AC_HWMON_NODE(psu_model_name) : PSU2_AC_HWMON_NODE(psu_model_name); memset(model_name, 0x0, I2C_PSU_MODEL_NAME_LEN + 1); memset(modelname, 0x0, modelname_len); if (onlp_file_read_string(node, model_name, sizeof(model_name), 0) != 0) { - return PSU_TYPE_UNKNOWN; } - + if (!strncmp(model_name, "FSH082", strlen("FSH082"))) { if (modelname) aim_strlcpy(modelname, model_name, strlen("FSH082")<(modelname_len-1)?(strlen("FSH082")+1):(modelname_len-1)); - - return PSU_TYPE_ACBEL; + return PSU_TYPE_ACBEL_FSH082_F2B; } - - if (!strncmp(model_name, "YESM1300AM", strlen("YESM1300AM"))) + + if (!strncmp(model_name, "FSH095", strlen("FSH095"))) { if (modelname) - aim_strlcpy(modelname, model_name, strlen("YESM1300AM")<(modelname_len-1)?(strlen("YESM1300AM")+1):(modelname_len-1)); + aim_strlcpy(modelname, model_name, strlen("FSH095")<(modelname_len-1)?(strlen("FSH095")+1):(modelname_len-1)); + return PSU_TYPE_ACBEL_FSH095_B2F; + } - return PSU_TYPE_YESM1300; + if (!strncmp(model_name, "YESM1300AM", strlen("YESM1300AM"))) + { + if (strstr(model_name, "-2A")) + { + if (modelname) + aim_strlcpy(modelname, model_name, strlen("YESM1300AM-2A01P10")<(modelname_len-1)?(strlen("YESM1300AM-2A01P10")+1):(modelname_len-1)); + return PSU_TYPE_3Y_YESM1300AM_2A_F2B; + } + else if (strstr(model_name, "-2R")) + { + if (modelname) + aim_strlcpy(modelname, model_name, strlen("YESM1300AM-2R01P10")<(modelname_len-1)?(strlen("YESM1300AM-2R01P10")+1):(modelname_len-1)); + return PSU_TYPE_3Y_YESM1300AM_2R_B2F; + } } if (!strncmp(model_name, "YM-2651Y", strlen("YM-2651Y"))) { if (modelname) - aim_strlcpy(modelname, model_name, modelname_len-1); + aim_strlcpy(modelname, model_name, modelname_len-1); return PSU_TYPE_YM2651Y; } diff --git a/packages/platforms/accton/x86-64/as9716_32d/onlp/builds/x86_64_accton_as9716_32d/module/src/platform_lib.h b/packages/platforms/accton/x86-64/as9716_32d/onlp/builds/x86_64_accton_as9716_32d/module/src/platform_lib.h index 3d07146956..0a76bdcd74 100755 --- a/packages/platforms/accton/x86-64/as9716_32d/onlp/builds/x86_64_accton_as9716_32d/module/src/platform_lib.h +++ b/packages/platforms/accton/x86-64/as9716_32d/onlp/builds/x86_64_accton_as9716_32d/module/src/platform_lib.h @@ -43,15 +43,15 @@ #define PSU_NODE_MAX_INT_LEN 8 #define PSU_NODE_MAX_PATH_LEN 64 -#define PSU1_AC_PMBUS_PREFIX "/sys/bus/i2c/devices/10-0059/" -#define PSU2_AC_PMBUS_PREFIX "/sys/bus/i2c/devices/9-0058/" +#define PSU1_AC_PMBUS_PREFIX "/sys/bus/i2c/devices/9-0058/" +#define PSU2_AC_PMBUS_PREFIX "/sys/bus/i2c/devices/10-0059/" #define PSU1_AC_PMBUS_NODE(node) PSU1_AC_PMBUS_PREFIX#node #define PSU2_AC_PMBUS_NODE(node) PSU2_AC_PMBUS_PREFIX#node -#define PSU1_AC_HWMON_PREFIX "/sys/bus/i2c/devices/10-0051/" -#define PSU2_AC_HWMON_PREFIX "/sys/bus/i2c/devices/9-0050/" +#define PSU1_AC_HWMON_PREFIX "/sys/bus/i2c/devices/9-0050/" +#define PSU2_AC_HWMON_PREFIX "/sys/bus/i2c/devices/10-0051/" @@ -76,11 +76,11 @@ int psu_status_info_get(int id, char *node, int *value); typedef enum psu_type { PSU_TYPE_UNKNOWN, - PSU_TYPE_ACBEL, - PSU_TYPE_YESM1300, - PSU_TYPE_YM2651Y, - PSU_TYPE_AC_F2B, - PSU_TYPE_AC_B2F + PSU_TYPE_ACBEL_FSH082_F2B, + PSU_TYPE_ACBEL_FSH095_B2F, + PSU_TYPE_3Y_YESM1300AM_2A_F2B, + PSU_TYPE_3Y_YESM1300AM_2R_B2F, + PSU_TYPE_YM2651Y } psu_type_t; psu_type_t get_psu_type(int id, char* modelname, int modelname_len); @@ -94,5 +94,14 @@ int psu_serial_number_get(int id, char *serial, int serial_len, char* model_name #define DEBUG_PRINT(format, ...) #endif +#define AIM_FREE_IF_PTR(p) \ + do \ + { \ + if (p) { \ + aim_free(p); \ + p = NULL; \ + } \ + } while (0) + #endif /* __PLATFORM_LIB_H__ */ diff --git a/packages/platforms/accton/x86-64/as9716_32d/onlp/builds/x86_64_accton_as9716_32d/module/src/psui.c b/packages/platforms/accton/x86-64/as9716_32d/onlp/builds/x86_64_accton_as9716_32d/module/src/psui.c index a7205f7ecd..2aedb2b31e 100755 --- a/packages/platforms/accton/x86-64/as9716_32d/onlp/builds/x86_64_accton_as9716_32d/module/src/psui.c +++ b/packages/platforms/accton/x86-64/as9716_32d/onlp/builds/x86_64_accton_as9716_32d/module/src/psui.c @@ -182,17 +182,18 @@ onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info) } if (val != PSU_STATUS_POWER_GOOD) { - info->status |= ONLP_PSU_STATUS_FAILED; + info->status |= ONLP_PSU_STATUS_UNPLUGGED; } /* Get PSU type */ psu_type = get_psu_type(index, info->model, sizeof(info->model)); - switch (psu_type) { - case PSU_TYPE_ACBEL: - case PSU_TYPE_YESM1300: + case PSU_TYPE_ACBEL_FSH082_F2B: + case PSU_TYPE_ACBEL_FSH095_B2F: + case PSU_TYPE_3Y_YESM1300AM_2A_F2B: + case PSU_TYPE_3Y_YESM1300AM_2R_B2F: ret = psu_data_info_get(info); break; case PSU_TYPE_YM2651Y: