mirror of
https://github.com/Telecominfraproject/OpenNetworkLinux.git
synced 2025-12-24 16:57:02 +00:00
Merge pull request #555 from akenliu/wedge100bf_32x_change_psu_sysfs
we change the method to get PSU's EEPROM data.
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user