mirror of
https://github.com/Telecominfraproject/OpenNetworkLinux.git
synced 2025-12-24 16:57:02 +00:00
update d5254 for onlp
This commit is contained in:
@@ -27,179 +27,56 @@
|
||||
#include <onlplib/file.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <onlp/platformi/psui.h>
|
||||
#include "platform_lib.h"
|
||||
|
||||
#define VALIDATE(_id) \
|
||||
do { \
|
||||
if(!ONLP_OID_IS_FAN(_id)) { \
|
||||
if(!ONLP_OID_IS_FAN(_id)) { \
|
||||
return ONLP_STATUS_E_INVALID; \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
|
||||
#define SLOW_PWM 100
|
||||
#define NORMAL_PWM 175
|
||||
#define MAX_PWM 255
|
||||
#define STEP_SIZE 100
|
||||
#define FAN_ON_MAIN_BOARD_COUNT 5
|
||||
#define LOCAL_ID_TO_PSU_ID(id) (id-FAN_ON_MAIN_BOARD_COUNT)
|
||||
|
||||
#define FAN_CAPS ONLP_FAN_CAPS_GET_RPM|ONLP_FAN_CAPS_GET_PERCENTAGE
|
||||
|
||||
typedef struct fani_info_s {
|
||||
int slow_pwm;
|
||||
int normal_pwm;
|
||||
int max_pwm;
|
||||
int step_size;
|
||||
char input_file[ONLP_CONFIG_INFO_STR_MAX];
|
||||
char pwm_file[ONLP_CONFIG_INFO_STR_MAX];
|
||||
} fani_info_t;
|
||||
static int _fani_status_failed_check(uint32_t* status, int local_id);
|
||||
static int _fani_status_present_check(uint32_t* status, int local_id);
|
||||
|
||||
|
||||
static fani_info_t __info_list[ONLP_FAN_COUNT] = {
|
||||
{},
|
||||
{
|
||||
100,175,255,100,
|
||||
"/sys/class/hwmon/hwmon1/device/fan1_input",
|
||||
"/sys/class/hwmon/hwmon1/device/pwm1"
|
||||
},
|
||||
{
|
||||
100,175,255,100,
|
||||
"/sys/class/hwmon/hwmon1/device/fan3_input",
|
||||
"/sys/class/hwmon/hwmon1/device/pwm2"
|
||||
},
|
||||
{
|
||||
100,175,255,100,
|
||||
"/sys/class/hwmon/hwmon1/device/fan5_input",
|
||||
"/sys/class/hwmon/hwmon1/device/pwm3"
|
||||
},
|
||||
{
|
||||
100,175,255,100,
|
||||
"/sys/class/hwmon/hwmon1/device/fan7_input",
|
||||
"/sys/class/hwmon/hwmon1/device/pwm4"
|
||||
},
|
||||
{
|
||||
100,175,255,100,
|
||||
"/sys/class/hwmon/hwmon1/device/fan9_input",
|
||||
"/sys/class/hwmon/hwmon1/device/pwm5" /*sync with pwm1*/
|
||||
},
|
||||
{
|
||||
100,175,255,100,
|
||||
"/sys/class/hwmon/hwmon1/device/fan2_input",
|
||||
"/sys/class/hwmon/hwmon1/device/pwm1"
|
||||
},
|
||||
{
|
||||
100,175,255,100,
|
||||
"/sys/class/hwmon/hwmon1/device/fan4_input",
|
||||
"/sys/class/hwmon/hwmon1/device/pwm2"
|
||||
},
|
||||
{
|
||||
100,175,255,100,
|
||||
"/sys/class/hwmon/hwmon1/device/fan6_input",
|
||||
"/sys/class/hwmon/hwmon1/device/pwm3"
|
||||
},
|
||||
{
|
||||
100,175,255,100,
|
||||
"/sys/class/hwmon/hwmon1/device/fan8_input",
|
||||
"/sys/class/hwmon/hwmon1/device/pwm4"
|
||||
},
|
||||
{
|
||||
100,175,255,100,
|
||||
"/sys/class/hwmon/hwmon1/device/fan10_input",
|
||||
"/sys/class/hwmon/hwmon1/device/pwm5" /*sync with pwm1*/
|
||||
},
|
||||
{
|
||||
100,175,255,100,
|
||||
"/sys/class/hwmon/hwmon1/device/rpm_psu1",
|
||||
"/sys/class/hwmon/hwmon1/device/pwm_psu1"
|
||||
},
|
||||
{
|
||||
100,175,255,100,
|
||||
"/sys/class/hwmon/hwmon1/device/rpm_psu2",
|
||||
"/sys/class/hwmon/hwmon1/device/pwm_psu2"
|
||||
#define MAKE_FAN_INFO_NODE_ON_FAN_BOARD(id) \
|
||||
{ \
|
||||
{ \
|
||||
ONLP_FAN_ID_CREATE(ONLP_FAN_##id), "Fan "#id, 0, \
|
||||
{ \
|
||||
ONLP_LED_ID_CREATE(ONLP_LED_FAN##id), \
|
||||
} \
|
||||
}, \
|
||||
0, 0 \
|
||||
}
|
||||
};
|
||||
|
||||
#define MAKE_FAN_INFO_NODE_ON_PSU(psu_id) \
|
||||
{ \
|
||||
{ ONLP_FAN_ID_CREATE(ONLP_FAN_PSU_##psu_id), "PSU-"#psu_id" Fan", ONLP_PSU_ID_CREATE(ONLP_PSU_##psu_id)}, \
|
||||
0, 0 \
|
||||
}
|
||||
|
||||
|
||||
/* Static values */
|
||||
static onlp_fan_info_t __onlp_fan_info[ONLP_FAN_COUNT] = {
|
||||
{ }, /* Not used */
|
||||
{ {
|
||||
ONLP_FAN_ID_CREATE(ONLP_FAN_1), "Fan 1", 0,
|
||||
{
|
||||
ONLP_FAN_ID_CREATE(ONLP_FAN_1_WEAK),
|
||||
ONLP_LED_ID_CREATE(ONLP_LED_FAN1_GREEN),
|
||||
ONLP_LED_ID_CREATE(ONLP_LED_FAN1_RED)
|
||||
}
|
||||
},
|
||||
ONLP_FAN_STATUS_PRESENT|ONLP_FAN_STATUS_F2B,
|
||||
ONLP_FAN_CAPS_F2B|ONLP_FAN_CAPS_GET_RPM|ONLP_FAN_CAPS_GET_PERCENTAGE
|
||||
},
|
||||
{ {
|
||||
ONLP_FAN_ID_CREATE(ONLP_FAN_2), "Fan 2", 0,
|
||||
{
|
||||
ONLP_FAN_ID_CREATE(ONLP_FAN_2_WEAK),
|
||||
ONLP_LED_ID_CREATE(ONLP_LED_FAN2_GREEN),
|
||||
ONLP_LED_ID_CREATE(ONLP_LED_FAN2_RED)
|
||||
}
|
||||
},
|
||||
ONLP_FAN_STATUS_PRESENT|ONLP_FAN_STATUS_F2B,
|
||||
ONLP_FAN_CAPS_F2B|ONLP_FAN_CAPS_GET_RPM|ONLP_FAN_CAPS_GET_PERCENTAGE
|
||||
},
|
||||
{ {
|
||||
ONLP_FAN_ID_CREATE(ONLP_FAN_3), "Fan 3", 0,
|
||||
{
|
||||
ONLP_FAN_ID_CREATE(ONLP_FAN_3_WEAK),
|
||||
ONLP_LED_ID_CREATE(ONLP_LED_FAN3_GREEN),
|
||||
ONLP_LED_ID_CREATE(ONLP_LED_FAN3_RED)
|
||||
}
|
||||
},
|
||||
ONLP_FAN_STATUS_PRESENT|ONLP_FAN_STATUS_F2B,
|
||||
ONLP_FAN_CAPS_F2B|ONLP_FAN_CAPS_GET_RPM|ONLP_FAN_CAPS_GET_PERCENTAGE
|
||||
},
|
||||
{ {
|
||||
ONLP_FAN_ID_CREATE(ONLP_FAN_4), "Fan 4", 0,
|
||||
{
|
||||
ONLP_FAN_ID_CREATE(ONLP_FAN_4_WEAK),
|
||||
ONLP_LED_ID_CREATE(ONLP_LED_FAN4_GREEN),
|
||||
ONLP_LED_ID_CREATE(ONLP_LED_FAN4_RED)
|
||||
}
|
||||
},
|
||||
ONLP_FAN_STATUS_PRESENT|ONLP_FAN_STATUS_F2B,
|
||||
ONLP_FAN_CAPS_F2B|ONLP_FAN_CAPS_GET_RPM|ONLP_FAN_CAPS_GET_PERCENTAGE
|
||||
},
|
||||
{ {
|
||||
ONLP_FAN_ID_CREATE(ONLP_FAN_5), "Fan 5", 0,
|
||||
{
|
||||
ONLP_FAN_ID_CREATE(ONLP_FAN_5_WEAK),
|
||||
ONLP_LED_ID_CREATE(ONLP_LED_FAN5_GREEN),
|
||||
ONLP_LED_ID_CREATE(ONLP_LED_FAN5_RED)
|
||||
}
|
||||
},
|
||||
ONLP_FAN_STATUS_PRESENT|ONLP_FAN_STATUS_F2B,
|
||||
ONLP_FAN_CAPS_F2B|ONLP_FAN_CAPS_GET_RPM|ONLP_FAN_CAPS_GET_PERCENTAGE
|
||||
},
|
||||
{ { ONLP_FAN_ID_CREATE(ONLP_FAN_1_WEAK), "Fan 1 WEAK", ONLP_FAN_ID_CREATE(ONLP_FAN_1)},
|
||||
ONLP_FAN_STATUS_PRESENT|ONLP_FAN_STATUS_F2B,
|
||||
ONLP_FAN_CAPS_F2B|ONLP_FAN_CAPS_GET_RPM|ONLP_FAN_CAPS_GET_PERCENTAGE
|
||||
},
|
||||
|
||||
{ { ONLP_FAN_ID_CREATE(ONLP_FAN_2_WEAK), "Fan 2 WEAK", ONLP_FAN_ID_CREATE(ONLP_FAN_2)},
|
||||
ONLP_FAN_STATUS_PRESENT|ONLP_FAN_STATUS_F2B,
|
||||
ONLP_FAN_CAPS_F2B|ONLP_FAN_CAPS_GET_RPM|ONLP_FAN_CAPS_GET_PERCENTAGE
|
||||
},
|
||||
{ { ONLP_FAN_ID_CREATE(ONLP_FAN_3_WEAK), "Fan 3 WEAK", ONLP_FAN_ID_CREATE(ONLP_FAN_3)},
|
||||
ONLP_FAN_STATUS_PRESENT|ONLP_FAN_STATUS_F2B,
|
||||
ONLP_FAN_CAPS_F2B|ONLP_FAN_CAPS_GET_RPM|ONLP_FAN_CAPS_GET_PERCENTAGE
|
||||
},
|
||||
{ { ONLP_FAN_ID_CREATE(ONLP_FAN_4_WEAK), "Fan 4 WEAK", ONLP_FAN_ID_CREATE(ONLP_FAN_4)},
|
||||
ONLP_FAN_STATUS_PRESENT|ONLP_FAN_STATUS_F2B,
|
||||
ONLP_FAN_CAPS_F2B|ONLP_FAN_CAPS_GET_RPM|ONLP_FAN_CAPS_GET_PERCENTAGE
|
||||
},
|
||||
{ { ONLP_FAN_ID_CREATE(ONLP_FAN_5_WEAK), "Fan 5 WEAK", ONLP_FAN_ID_CREATE(ONLP_FAN_5)},
|
||||
ONLP_FAN_STATUS_PRESENT|ONLP_FAN_STATUS_F2B,
|
||||
ONLP_FAN_CAPS_F2B|ONLP_FAN_CAPS_GET_RPM|ONLP_FAN_CAPS_GET_PERCENTAGE
|
||||
},
|
||||
{ { ONLP_FAN_ID_CREATE(ONLP_FAN_PSU_1), "PSU-1 Fan", ONLP_PSU_ID_CREATE(ONLP_PSU_1)},
|
||||
ONLP_FAN_STATUS_PRESENT|ONLP_FAN_STATUS_F2B,
|
||||
ONLP_FAN_CAPS_F2B|ONLP_FAN_CAPS_GET_RPM|ONLP_FAN_CAPS_GET_PERCENTAGE
|
||||
},
|
||||
{ { ONLP_FAN_ID_CREATE(ONLP_FAN_PSU_2), "PSU-2 Fan", ONLP_PSU_ID_CREATE(ONLP_PSU_2)},
|
||||
ONLP_FAN_STATUS_PRESENT|ONLP_FAN_STATUS_F2B,
|
||||
ONLP_FAN_CAPS_F2B|ONLP_FAN_CAPS_GET_RPM|ONLP_FAN_CAPS_GET_PERCENTAGE
|
||||
}
|
||||
MAKE_FAN_INFO_NODE_ON_FAN_BOARD(1),
|
||||
MAKE_FAN_INFO_NODE_ON_FAN_BOARD(2),
|
||||
MAKE_FAN_INFO_NODE_ON_FAN_BOARD(3),
|
||||
MAKE_FAN_INFO_NODE_ON_FAN_BOARD(4),
|
||||
MAKE_FAN_INFO_NODE_ON_FAN_BOARD(5),
|
||||
MAKE_FAN_INFO_NODE_ON_PSU(1),
|
||||
MAKE_FAN_INFO_NODE_ON_PSU(2),
|
||||
};
|
||||
|
||||
|
||||
@@ -217,42 +94,176 @@ onlp_fani_info_get(onlp_oid_t id, onlp_fan_info_t* info)
|
||||
{
|
||||
int rv = ONLP_STATUS_OK;
|
||||
int local_id;
|
||||
int pwm;
|
||||
int lrpm, rrpm, pwm, psu_id;
|
||||
VALIDATE(id);
|
||||
pwm = 0;
|
||||
|
||||
local_id = ONLP_OID_ID_GET(id);
|
||||
if(local_id >= ONLP_FAN_MAX) {
|
||||
rv = ONLP_STATUS_E_INVALID;
|
||||
}
|
||||
|
||||
if( ONLP_STATUS_OK == rv) {
|
||||
*info = __onlp_fan_info[local_id];
|
||||
rv = onlp_file_read_int(&info->rpm, __info_list[local_id].input_file);
|
||||
if(rv ==ONLP_STATUS_OK) {
|
||||
*info = __onlp_fan_info[LOCAL_ID_TO_INFO_IDX(local_id)];
|
||||
rv = onlp_fani_status_get(id, &info->status);
|
||||
}
|
||||
|
||||
if(ONLP_STATUS_OK == rv) {
|
||||
rv = onlp_file_read_int(&pwm, __info_list[local_id].pwm_file);
|
||||
}
|
||||
if(rv == ONLP_STATUS_OK) {
|
||||
if(info->status & ONLP_FAN_STATUS_PRESENT) {
|
||||
switch(local_id) {
|
||||
case ONLP_FAN_1:
|
||||
case ONLP_FAN_2:
|
||||
case ONLP_FAN_3:
|
||||
case ONLP_FAN_4:
|
||||
case ONLP_FAN_5:
|
||||
if(info->status & ONLP_FAN_STATUS_F2B) {
|
||||
info->caps = FAN_CAPS|ONLP_FAN_CAPS_F2B;
|
||||
} else if(info->status & ONLP_FAN_STATUS_B2F) {
|
||||
info->caps = FAN_CAPS|ONLP_FAN_CAPS_B2F;
|
||||
} else {
|
||||
info->caps = FAN_CAPS;
|
||||
}
|
||||
|
||||
if( ONLP_STATUS_OK == rv) {
|
||||
if(0 == info->rpm) {
|
||||
info->mode = ONLP_FAN_MODE_OFF;
|
||||
} else if(pwm < __info_list[local_id].slow_pwm) {
|
||||
info->mode = ONLP_FAN_MODE_SLOW;
|
||||
} else if(pwm < __info_list[local_id].normal_pwm) {
|
||||
info->mode = ONLP_FAN_MODE_NORMAL;
|
||||
} else if(pwm < __info_list[local_id].max_pwm) {
|
||||
info->mode = ONLP_FAN_MODE_FAST;
|
||||
rv = onlp_file_read_int(&lrpm, INV_HWMON_PREFIX"fan%d_input", local_id*2-1);
|
||||
if(rv != ONLP_STATUS_OK ) { return rv; }
|
||||
rv = onlp_file_read_int(&rrpm, INV_HWMON_PREFIX"fan%d_input", local_id*2);
|
||||
if(rv != ONLP_STATUS_OK ) { return rv; }
|
||||
rv = onlp_file_read_int(&pwm,INV_HWMON_PREFIX"pwm%d", local_id);
|
||||
if(rv != ONLP_STATUS_OK ) { return rv; }
|
||||
|
||||
if(lrpm <=0 && rrpm <=0) {
|
||||
info->rpm = 0;
|
||||
} else if(lrpm <= 0) {
|
||||
info->rpm = rrpm;
|
||||
} else if(rrpm <= 0) {
|
||||
info->rpm = lrpm;
|
||||
} else {
|
||||
info->rpm = (lrpm+rrpm)/2;
|
||||
}
|
||||
|
||||
break;
|
||||
case ONLP_FAN_PSU_1:
|
||||
case ONLP_FAN_PSU_2:
|
||||
info->caps = FAN_CAPS|ONLP_FAN_CAPS_F2B;
|
||||
psu_id = LOCAL_ID_TO_PSU_ID(local_id);
|
||||
rv = onlp_file_read_int(&info->rpm,INV_HWMON_PREFIX"rpm_psu%d", psu_id);
|
||||
if(rv != ONLP_STATUS_OK) { return rv; }
|
||||
rv = onlp_file_read_int(&pwm, INV_HWMON_PREFIX"pwm_psu%d", psu_id);
|
||||
if(rv != ONLP_STATUS_OK) { return rv; }
|
||||
break;
|
||||
default:
|
||||
rv = ONLP_STATUS_E_INVALID;
|
||||
break;
|
||||
}
|
||||
if(rv == ONLP_STATUS_OK) {
|
||||
if(info->rpm <= 0) {
|
||||
info->mode = ONLP_FAN_MODE_OFF;
|
||||
info->percentage = 0;
|
||||
} else {
|
||||
info->percentage = (pwm*100)/MAX_PWM;
|
||||
if(pwm < SLOW_PWM) {
|
||||
info->mode = ONLP_FAN_MODE_SLOW;
|
||||
} else if(pwm < NORMAL_PWM) {
|
||||
info->mode = ONLP_FAN_MODE_NORMAL;
|
||||
} else if(pwm < MAX_PWM) {
|
||||
info->mode = ONLP_FAN_MODE_FAST;
|
||||
} else {
|
||||
info->mode = ONLP_FAN_MODE_MAX;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
info->mode = ONLP_FAN_MODE_MAX;
|
||||
info->caps = 0;
|
||||
info->rpm = 0;
|
||||
info->percentage = 0;
|
||||
info->mode = ONLP_FAN_MODE_OFF;
|
||||
}
|
||||
|
||||
info->percentage = (pwm*100)/__info_list[local_id].max_pwm;
|
||||
snprintf(info->model, ONLP_CONFIG_INFO_STR_MAX, "NA");
|
||||
snprintf(info->serial, ONLP_CONFIG_INFO_STR_MAX, "NA");
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
static int _fani_status_failed_check(uint32_t* status, int local_id)
|
||||
{
|
||||
int rv;
|
||||
int lrpm, rrpm, rpm, pwm, psu_id;
|
||||
switch(local_id) {
|
||||
case ONLP_FAN_1:
|
||||
case ONLP_FAN_2:
|
||||
case ONLP_FAN_3:
|
||||
case ONLP_FAN_4:
|
||||
case ONLP_FAN_5:
|
||||
rv = onlp_file_read_int(&lrpm, INV_HWMON_PREFIX"fan%d_input", local_id*2-1);
|
||||
if(rv != ONLP_STATUS_OK ) { return rv; }
|
||||
rv = onlp_file_read_int(&rrpm, INV_HWMON_PREFIX"fan%d_input", local_id*2);
|
||||
if(rv != ONLP_STATUS_OK ) { return rv; }
|
||||
rv = onlp_file_read_int(&pwm,INV_HWMON_PREFIX"pwm%d", local_id);
|
||||
if(rv != ONLP_STATUS_OK ) { return rv; }
|
||||
|
||||
if( lrpm <= 0 || rrpm <=0 || pwm <=0 || pwm > MAX_PWM) {
|
||||
*status |= ONLP_FAN_STATUS_FAILED;
|
||||
*status &= (~ONLP_FAN_STATUS_B2F);
|
||||
*status &= (~ONLP_FAN_STATUS_F2B);
|
||||
} else {
|
||||
*status &= (~ONLP_FAN_STATUS_FAILED);
|
||||
}
|
||||
break;
|
||||
case ONLP_FAN_PSU_1:
|
||||
case ONLP_FAN_PSU_2:
|
||||
psu_id = LOCAL_ID_TO_PSU_ID(local_id);
|
||||
rv = onlp_file_read_int(&rpm, INV_HWMON_PREFIX"rpm_psu%d", psu_id);
|
||||
if(rv != ONLP_STATUS_OK ) { return rv; }
|
||||
rv = onlp_file_read_int(&pwm, INV_HWMON_PREFIX"pwm_psu%d", psu_id);
|
||||
if(rv != ONLP_STATUS_OK ) { return rv; }
|
||||
|
||||
if( rpm <= 0 || pwm <=0 || pwm > MAX_PWM) {
|
||||
*status |= ONLP_FAN_STATUS_FAILED;
|
||||
*status &= (~ONLP_FAN_STATUS_B2F);
|
||||
*status &= (~ONLP_FAN_STATUS_F2B);
|
||||
} else {
|
||||
*status &= (~ONLP_FAN_STATUS_FAILED);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
rv = ONLP_STATUS_E_INVALID;
|
||||
break;
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
static int _fani_status_present_check(uint32_t* status, int local_id)
|
||||
{
|
||||
int rv;
|
||||
int gpi;
|
||||
int info_idx;
|
||||
int len;
|
||||
char buf[ONLP_CONFIG_INFO_STR_MAX];
|
||||
if(local_id >= ONLP_FAN_1 && local_id <= ONLP_FAN_4){
|
||||
info_idx = LOCAL_ID_TO_INFO_IDX(local_id);
|
||||
rv = onlp_file_read((uint8_t*)buf,ONLP_CONFIG_INFO_STR_MAX, &len, INV_HWMON_PREFIX"fan_gpi");
|
||||
}else if(local_id == ONLP_FAN_5){
|
||||
info_idx = LOCAL_ID_TO_INFO_IDX(local_id)-ONLP_FAN_4;
|
||||
rv = onlp_file_read((uint8_t*)buf,ONLP_CONFIG_INFO_STR_MAX, &len, INV_HWMON_PREFIX"fan_gpi2");
|
||||
}else{
|
||||
rv = ONLP_STATUS_E_INVALID;
|
||||
}
|
||||
if( rv == ONLP_STATUS_OK ) {
|
||||
sscanf( buf, "0x%x\n", &gpi);
|
||||
/* B[0-3] installed(0)/uninstalled(1)
|
||||
B[4-7] FRtype(0)/RFtype(1) */
|
||||
if (!((gpi>>info_idx) & 1)) {
|
||||
*status |= ONLP_FAN_STATUS_PRESENT;
|
||||
if (!((gpi>>(info_idx+4)) & 1)) {
|
||||
*status |= ONLP_FAN_STATUS_F2B;
|
||||
} else {
|
||||
*status |= ONLP_FAN_STATUS_B2F;
|
||||
}
|
||||
} else {
|
||||
*status = 0;
|
||||
}
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Retrieve the fan's operational status.
|
||||
@@ -267,12 +278,42 @@ int onlp_fani_status_get(onlp_oid_t id, uint32_t* rv)
|
||||
onlp_fan_info_t* info;
|
||||
int local_id;
|
||||
VALIDATE(id);
|
||||
uint32_t psu_status;
|
||||
|
||||
local_id = ONLP_OID_ID_GET(id);
|
||||
if(local_id >= ONLP_FAN_MAX) {
|
||||
result = ONLP_STATUS_E_INVALID;
|
||||
} else {
|
||||
info = &__onlp_fan_info[local_id];
|
||||
info = &__onlp_fan_info[LOCAL_ID_TO_INFO_IDX(local_id)];
|
||||
switch(local_id) {
|
||||
case ONLP_FAN_1:
|
||||
case ONLP_FAN_2:
|
||||
case ONLP_FAN_3:
|
||||
case ONLP_FAN_4:
|
||||
case ONLP_FAN_5:
|
||||
result = _fani_status_present_check(&info->status, local_id);
|
||||
if (result == ONLP_STATUS_OK ) {
|
||||
if (info->status & ONLP_FAN_STATUS_PRESENT) {
|
||||
result = _fani_status_failed_check(&info->status, local_id);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ONLP_FAN_PSU_1:
|
||||
case ONLP_FAN_PSU_2:
|
||||
result = onlp_psui_status_get((&info->hdr)->poid, &psu_status);
|
||||
if(result != ONLP_STATUS_OK) { return result; }
|
||||
|
||||
if(psu_status & ONLP_PSU_STATUS_PRESENT) {
|
||||
info->status |= ONLP_FAN_STATUS_PRESENT;
|
||||
result = _fani_status_failed_check(&info->status, local_id);
|
||||
} else {
|
||||
info->status = 0;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
result = ONLP_STATUS_E_INVALID;
|
||||
break;
|
||||
}
|
||||
*rv = info->status;
|
||||
}
|
||||
return result;
|
||||
@@ -294,7 +335,7 @@ int onlp_fani_hdr_get(onlp_oid_t id, onlp_oid_hdr_t* hdr)
|
||||
if(local_id >= ONLP_FAN_MAX) {
|
||||
result = ONLP_STATUS_E_INVALID;
|
||||
} else {
|
||||
info = &__onlp_fan_info[local_id];
|
||||
info = &__onlp_fan_info[LOCAL_ID_TO_INFO_IDX(local_id)];
|
||||
*hdr = info->hdr;
|
||||
}
|
||||
return result;
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include <onlp/platformi/fani.h>
|
||||
|
||||
#include "platform_lib.h"
|
||||
|
||||
@@ -43,365 +44,193 @@
|
||||
*/
|
||||
|
||||
/* CAPS*/
|
||||
#define CPLD_LED_GREEN_CAPS ONLP_LED_CAPS_ON_OFF|ONLP_LED_CAPS_GREEN|ONLP_LED_CAPS_GREEN_BLINKING
|
||||
#define CPLD_LED_RED_CAPS ONLP_LED_CAPS_ON_OFF|ONLP_LED_CAPS_RED|ONLP_LED_CAPS_RED_BLINKING
|
||||
#define PSOC_LED_GREEN_CAPS ONLP_LED_CAPS_ON_OFF|ONLP_LED_CAPS_GREEN
|
||||
#define PSOC_LED_RED_CAPS ONLP_LED_CAPS_ON_OFF|ONLP_LED_CAPS_RED
|
||||
#define SYS_LED_CAPS ONLP_LED_CAPS_ON_OFF|ONLP_LED_CAPS_GREEN|ONLP_LED_CAPS_GREEN_BLINKING| \
|
||||
ONLP_LED_CAPS_RED|ONLP_LED_CAPS_RED_BLINKING|ONLP_LED_CAPS_ORANGE
|
||||
#define FAN_LED_CAPS ONLP_LED_CAPS_RED|ONLP_LED_CAPS_GREEN
|
||||
|
||||
#define LOCAL_ID_TO_FAN_ID(id) (id-1)
|
||||
|
||||
typedef enum platform_led_color_e {
|
||||
PLATFORM_LED_COLOR_NONE,
|
||||
PLATFORM_LED_COLOR_RED,
|
||||
PLATFORM_LED_COLOR_GREEN,
|
||||
PLATFORM_LED_COLOR_ANY,
|
||||
PLATFORM_LED_COLOR_MAX
|
||||
} platform_led_color_t;
|
||||
|
||||
typedef enum cpld_led_mode_e {
|
||||
CPLD_LED_MODE_OFF = 0,
|
||||
CPLD_LED_MODE_0_5_HZ = 1,
|
||||
CPLD_LED_MODE_1_HZ = 2,
|
||||
CPLD_LED_MODE_2_HZ = 3,
|
||||
CPLD_LED_MODE_ON = 7
|
||||
} cpld_led_mode_t;
|
||||
|
||||
typedef enum led_driver_mode_e {
|
||||
LED_DRIVER_MODE_NONE,
|
||||
LED_DRIVER_MODE_CPLD,
|
||||
LED_DRIVER_MODE_PSOC
|
||||
} led_driver_mode_t;
|
||||
|
||||
|
||||
typedef struct ledi_info_s {
|
||||
platform_led_color_t color;
|
||||
led_driver_mode_t driver;
|
||||
char file[ONLP_CONFIG_INFO_STR_MAX];
|
||||
} ledi_info_t;
|
||||
typedef enum sys_led_mode_e {
|
||||
SYS_LED_MODE_OFF = 0,
|
||||
SYS_LED_MODE_0_5_HZ = 1,
|
||||
SYS_LED_MODE_1_HZ = 2,
|
||||
SYS_LED_MODE_2_HZ = 3,
|
||||
SYS_LED_MODE_ON = 7
|
||||
} sys_led_mode_t;
|
||||
|
||||
/* function declarations*/
|
||||
static onlp_led_mode_t _cpld_onlp_led_mode_convert(platform_led_color_t color, cpld_led_mode_t mode);
|
||||
static int _onlp_cpld_led_mode_convert(onlp_led_mode_t onlp_led_mode, platform_led_color_t *pcolor, cpld_led_mode_t *pmode);
|
||||
static int _cpld_onlp_ledi_info_get(onlp_oid_t id, onlp_led_info_t* info);
|
||||
static int _psoc_onlp_ledi_info_get(onlp_oid_t id, onlp_led_info_t* info);
|
||||
static int _cpld_onlp_ledi_mode_set(onlp_oid_t id, onlp_led_mode_t onlp_mode);
|
||||
static int _psoc_onlp_ledi_mode_set(onlp_oid_t id, onlp_led_mode_t onlp_mode);
|
||||
|
||||
static ledi_info_t __info_list[ONLP_LED_COUNT] = {
|
||||
{},
|
||||
{PLATFORM_LED_COLOR_GREEN, LED_DRIVER_MODE_CPLD, "/sys/bus/i2c/devices/0-0055*grn_led"},
|
||||
{PLATFORM_LED_COLOR_RED, LED_DRIVER_MODE_CPLD, "/sys/bus/i2c/devices/0-0055*red_led"},
|
||||
{PLATFORM_LED_COLOR_GREEN, LED_DRIVER_MODE_PSOC,"/sys/bus/i2c/devices/0-0066*fan_led_grn1"},
|
||||
{PLATFORM_LED_COLOR_RED, LED_DRIVER_MODE_PSOC,"/sys/bus/i2c/devices/0-0066*fan_led_red1"},
|
||||
{PLATFORM_LED_COLOR_GREEN, LED_DRIVER_MODE_PSOC,"/sys/bus/i2c/devices/0-0066*fan_led_grn2"},
|
||||
{PLATFORM_LED_COLOR_RED, LED_DRIVER_MODE_PSOC,"/sys/bus/i2c/devices/0-0066*fan_led_red2"},
|
||||
{PLATFORM_LED_COLOR_GREEN, LED_DRIVER_MODE_PSOC,"/sys/bus/i2c/devices/0-0066*fan_led_grn3"},
|
||||
{PLATFORM_LED_COLOR_RED, LED_DRIVER_MODE_PSOC,"/sys/bus/i2c/devices/0-0066*fan_led_red3"},
|
||||
{PLATFORM_LED_COLOR_GREEN, LED_DRIVER_MODE_PSOC,"/sys/bus/i2c/devices/0-0066*fan_led_grn4"},
|
||||
{PLATFORM_LED_COLOR_RED, LED_DRIVER_MODE_PSOC,"/sys/bus/i2c/devices/0-0066*fan_led_red4"},
|
||||
{PLATFORM_LED_COLOR_GREEN, LED_DRIVER_MODE_PSOC,"/sys/bus/i2c/devices/0-0066*fan_led_grn5"},
|
||||
{PLATFORM_LED_COLOR_RED, LED_DRIVER_MODE_PSOC,"/sys/bus/i2c/devices/0-0066*fan_led_red5"},
|
||||
};
|
||||
|
||||
static int _sys_onlp_led_mode_convert(sys_led_mode_t grn_mode, sys_led_mode_t red_mode, onlp_led_mode_t* pmode);
|
||||
static int _sys_onlp_ledi_info_get(onlp_oid_t id, onlp_led_info_t* info);
|
||||
static int _fan_onlp_ledi_info_get(onlp_oid_t id, onlp_led_info_t* info);
|
||||
static int _sys_onlp_ledi_mode_set(onlp_led_mode_t onlp_mode);
|
||||
|
||||
/*
|
||||
* Get the information for the given LED OID.
|
||||
*/
|
||||
#define MAKE_MGMT_LED_INFO_NODE \
|
||||
{ \
|
||||
{ ONLP_LED_ID_CREATE(ONLP_LED_MGMT), "MGMT LED" , 0 }, \
|
||||
ONLP_LED_STATUS_PRESENT, \
|
||||
SYS_LED_CAPS, \
|
||||
}
|
||||
|
||||
#define MAKE_LED_INFO_NODE_ON_FAN(fan_id) \
|
||||
{ \
|
||||
{ ONLP_LED_ID_CREATE(ONLP_LED_FAN##fan_id), \
|
||||
"FAN LED "#fan_id, \
|
||||
ONLP_FAN_ID_CREATE(ONLP_FAN_##fan_id) \
|
||||
}, \
|
||||
0, \
|
||||
0, \
|
||||
}
|
||||
|
||||
static onlp_led_info_t __onlp_led_info[ONLP_LED_COUNT] = {
|
||||
{ }, /* Not used */
|
||||
{
|
||||
{ ONLP_LED_ID_CREATE(ONLP_LED_MGMT_GREEN), "MGMT LED GREEN", 0 },
|
||||
ONLP_LED_STATUS_PRESENT,
|
||||
CPLD_LED_GREEN_CAPS,
|
||||
},
|
||||
{
|
||||
{ ONLP_LED_ID_CREATE(ONLP_LED_MGMT_RED), "MGMT LED RED", 0 },
|
||||
ONLP_LED_STATUS_PRESENT,
|
||||
CPLD_LED_RED_CAPS,
|
||||
},
|
||||
{
|
||||
{ ONLP_LED_ID_CREATE(ONLP_LED_FAN1_GREEN), "FAN LED 1 GREEN", ONLP_FAN_ID_CREATE(ONLP_FAN_1) },
|
||||
ONLP_LED_STATUS_PRESENT,
|
||||
PSOC_LED_GREEN_CAPS,
|
||||
},
|
||||
{
|
||||
{ ONLP_LED_ID_CREATE(ONLP_LED_FAN1_RED), "FAN LED 1 RED", ONLP_FAN_ID_CREATE(ONLP_FAN_1) },
|
||||
ONLP_LED_STATUS_PRESENT,
|
||||
PSOC_LED_RED_CAPS,
|
||||
},
|
||||
{
|
||||
{ ONLP_LED_ID_CREATE(ONLP_LED_FAN2_GREEN), "FAN LED 2 GREEN", ONLP_FAN_ID_CREATE(ONLP_FAN_2) },
|
||||
ONLP_LED_STATUS_PRESENT,
|
||||
PSOC_LED_GREEN_CAPS,
|
||||
},
|
||||
{
|
||||
{ ONLP_LED_ID_CREATE(ONLP_LED_FAN2_RED), "FAN LED 2 RED", ONLP_FAN_ID_CREATE(ONLP_FAN_2) },
|
||||
ONLP_LED_STATUS_PRESENT,
|
||||
PSOC_LED_RED_CAPS,
|
||||
},
|
||||
{
|
||||
{ ONLP_LED_ID_CREATE(ONLP_LED_FAN3_GREEN), "FAN LED 3 GREEN", ONLP_FAN_ID_CREATE(ONLP_FAN_3) },
|
||||
ONLP_LED_STATUS_PRESENT,
|
||||
PSOC_LED_GREEN_CAPS,
|
||||
},
|
||||
{
|
||||
{ ONLP_LED_ID_CREATE(ONLP_LED_FAN3_RED), "FAN LED 3 RED", ONLP_FAN_ID_CREATE(ONLP_FAN_3) },
|
||||
ONLP_LED_STATUS_PRESENT,
|
||||
PSOC_LED_RED_CAPS,
|
||||
},
|
||||
{
|
||||
{ ONLP_LED_ID_CREATE(ONLP_LED_FAN4_GREEN), "FAN LED 4 GREEN", ONLP_FAN_ID_CREATE(ONLP_FAN_4) },
|
||||
ONLP_LED_STATUS_PRESENT,
|
||||
PSOC_LED_GREEN_CAPS,
|
||||
},
|
||||
{
|
||||
{ ONLP_LED_ID_CREATE(ONLP_LED_FAN4_RED), "FAN LED 4 RED", ONLP_FAN_ID_CREATE(ONLP_FAN_4) },
|
||||
ONLP_LED_STATUS_PRESENT,
|
||||
PSOC_LED_RED_CAPS,
|
||||
},
|
||||
{
|
||||
{ ONLP_LED_ID_CREATE(ONLP_LED_FAN5_GREEN), "FAN LED 5 GREEN", ONLP_FAN_ID_CREATE(ONLP_FAN_5) },
|
||||
ONLP_LED_STATUS_PRESENT,
|
||||
PSOC_LED_GREEN_CAPS,
|
||||
},
|
||||
{
|
||||
{ ONLP_LED_ID_CREATE(ONLP_LED_FAN5_RED), "FAN LED 5 RED", ONLP_FAN_ID_CREATE(ONLP_FAN_5) },
|
||||
ONLP_LED_STATUS_PRESENT,
|
||||
PSOC_LED_RED_CAPS,
|
||||
},
|
||||
MAKE_MGMT_LED_INFO_NODE,
|
||||
MAKE_LED_INFO_NODE_ON_FAN(1),
|
||||
MAKE_LED_INFO_NODE_ON_FAN(2),
|
||||
MAKE_LED_INFO_NODE_ON_FAN(3),
|
||||
MAKE_LED_INFO_NODE_ON_FAN(4),
|
||||
MAKE_LED_INFO_NODE_ON_FAN(5),
|
||||
};
|
||||
|
||||
|
||||
|
||||
/* convert platform led type to onlp_led_mode type*/
|
||||
static onlp_led_mode_t _cpld_onlp_led_mode_convert(platform_led_color_t color, cpld_led_mode_t mode)
|
||||
{
|
||||
onlp_led_mode_t ret = ONLP_LED_MODE_OFF;
|
||||
|
||||
/* First select the basic state */
|
||||
switch(mode) {
|
||||
case CPLD_LED_MODE_0_5_HZ:
|
||||
case CPLD_LED_MODE_1_HZ:
|
||||
case CPLD_LED_MODE_2_HZ:
|
||||
ret = ONLP_LED_MODE_BLINKING;
|
||||
break;
|
||||
case CPLD_LED_MODE_ON:
|
||||
ret = ONLP_LED_MODE_ON;
|
||||
break;
|
||||
case CPLD_LED_MODE_OFF:
|
||||
default:
|
||||
ret = ONLP_LED_MODE_OFF;
|
||||
break;
|
||||
}
|
||||
if (ret != ONLP_LED_MODE_OFF) {
|
||||
/* Add shift to color */
|
||||
switch(color) {
|
||||
case PLATFORM_LED_COLOR_RED:
|
||||
ret += (ONLP_LED_MODE_RED - ONLP_LED_MODE_ON);
|
||||
break;
|
||||
case PLATFORM_LED_COLOR_GREEN:
|
||||
ret += (ONLP_LED_MODE_GREEN - ONLP_LED_MODE_ON);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int _onlp_cpld_led_mode_convert(onlp_led_mode_t onlp_led_mode, platform_led_color_t *pcolor, cpld_led_mode_t *pmode)
|
||||
static int _sys_onlp_led_mode_convert(sys_led_mode_t grn_mode, sys_led_mode_t red_mode, onlp_led_mode_t* pmode)
|
||||
{
|
||||
int rv = ONLP_STATUS_OK;
|
||||
switch(onlp_led_mode) {
|
||||
case ONLP_LED_MODE_OFF:
|
||||
*pcolor = PLATFORM_LED_COLOR_ANY;
|
||||
*pmode = CPLD_LED_MODE_OFF;
|
||||
break;
|
||||
case ONLP_LED_MODE_ON:
|
||||
*pcolor = PLATFORM_LED_COLOR_ANY;
|
||||
*pmode = CPLD_LED_MODE_ON;
|
||||
break;
|
||||
case ONLP_LED_MODE_BLINKING:
|
||||
*pcolor = PLATFORM_LED_COLOR_ANY;
|
||||
*pmode = CPLD_LED_MODE_1_HZ;
|
||||
break;
|
||||
case ONLP_LED_MODE_RED:
|
||||
*pcolor = PLATFORM_LED_COLOR_RED;
|
||||
*pmode = CPLD_LED_MODE_ON;
|
||||
break;
|
||||
case ONLP_LED_MODE_RED_BLINKING:
|
||||
/* cannot determine the blink level currently, just choose 1Hz*/
|
||||
*pcolor = PLATFORM_LED_COLOR_RED;
|
||||
*pmode = CPLD_LED_MODE_1_HZ;
|
||||
break;
|
||||
case ONLP_LED_MODE_GREEN:
|
||||
*pcolor = PLATFORM_LED_COLOR_GREEN;
|
||||
*pmode = CPLD_LED_MODE_ON;
|
||||
break;
|
||||
case ONLP_LED_MODE_GREEN_BLINKING:
|
||||
/* cannot determine the blink level currently, just choose 1Hz*/
|
||||
*pcolor = PLATFORM_LED_COLOR_GREEN;
|
||||
*pmode = CPLD_LED_MODE_1_HZ;
|
||||
break;
|
||||
*pmode = ONLP_LED_MODE_OFF;
|
||||
|
||||
switch(grn_mode) {
|
||||
case SYS_LED_MODE_0_5_HZ:
|
||||
case SYS_LED_MODE_1_HZ:
|
||||
case SYS_LED_MODE_2_HZ:
|
||||
*pmode = ONLP_LED_MODE_GREEN_BLINKING;
|
||||
break;
|
||||
case SYS_LED_MODE_ON:
|
||||
*pmode = ONLP_LED_MODE_GREEN;
|
||||
break;
|
||||
case SYS_LED_MODE_OFF:
|
||||
*pmode = ONLP_LED_MODE_OFF;
|
||||
break;
|
||||
default:
|
||||
rv = ONLP_STATUS_E_INVALID;
|
||||
return ONLP_STATUS_E_INVALID;
|
||||
break;
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
static int _cpld_onlp_ledi_info_get(onlp_oid_t id, onlp_led_info_t* info)
|
||||
{
|
||||
int local_id;
|
||||
int rv = ONLP_STATUS_OK;
|
||||
platform_led_color_t color;
|
||||
cpld_led_mode_t mode;
|
||||
|
||||
local_id = ONLP_OID_ID_GET(id);
|
||||
|
||||
/* Set the onlp_oid_hdr_t and capabilities */
|
||||
*info = __onlp_led_info[local_id];
|
||||
|
||||
color = __info_list[local_id].color;
|
||||
|
||||
rv = onlp_file_read_int((int*)&mode, __info_list[local_id].file);
|
||||
|
||||
if( ONLP_STATUS_OK == rv ) {
|
||||
info->mode = _cpld_onlp_led_mode_convert(color, mode);
|
||||
|
||||
/* Set the on/off status */
|
||||
if (info->mode != ONLP_LED_MODE_OFF) {
|
||||
info->status |= ONLP_LED_STATUS_ON;
|
||||
switch(red_mode) {
|
||||
case SYS_LED_MODE_0_5_HZ:
|
||||
case SYS_LED_MODE_1_HZ:
|
||||
case SYS_LED_MODE_2_HZ:
|
||||
if(grn_mode == SYS_LED_MODE_OFF) {
|
||||
*pmode = ONLP_LED_MODE_RED_BLINKING;
|
||||
} else {
|
||||
info->status &= (~ONLP_LED_STATUS_ON);
|
||||
return ONLP_STATUS_E_INVALID;
|
||||
}
|
||||
break;
|
||||
case SYS_LED_MODE_ON:
|
||||
if(grn_mode == SYS_LED_MODE_OFF) {
|
||||
*pmode = ONLP_LED_MODE_RED;
|
||||
} else if(grn_mode == SYS_LED_MODE_ON) {
|
||||
*pmode = ONLP_LED_MODE_ORANGE;
|
||||
} else {
|
||||
return ONLP_STATUS_E_INVALID;
|
||||
}
|
||||
break;
|
||||
case SYS_LED_MODE_OFF:
|
||||
if(grn_mode == SYS_LED_MODE_OFF) {
|
||||
*pmode = ONLP_LED_MODE_OFF;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return ONLP_STATUS_E_INVALID;
|
||||
break;
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
static int _sys_onlp_ledi_info_get(onlp_oid_t id, onlp_led_info_t* info)
|
||||
{
|
||||
int local_id;
|
||||
int rv = ONLP_STATUS_OK;
|
||||
sys_led_mode_t grn_mode, red_mode;
|
||||
local_id = ONLP_OID_ID_GET(id);
|
||||
int idx = LOCAL_ID_TO_INFO_IDX(local_id);
|
||||
/* Set the onlp_oid_hdr_t and capabilities */
|
||||
*info = __onlp_led_info[idx];
|
||||
|
||||
rv = onlp_file_read_int((int*)&grn_mode, INV_SYSLED_PREFIX"grn_led");
|
||||
if(rv != ONLP_STATUS_OK) { return rv; }
|
||||
rv = onlp_file_read_int((int*)&red_mode, INV_SYSLED_PREFIX"red_led");
|
||||
if(rv != ONLP_STATUS_OK) { return rv; }
|
||||
|
||||
rv = _sys_onlp_led_mode_convert(grn_mode, red_mode, &info->mode);
|
||||
if(rv != ONLP_STATUS_OK) { return rv; }
|
||||
|
||||
/* Set the on/off status */
|
||||
if (info->mode != ONLP_LED_MODE_OFF) {
|
||||
info->status |= ONLP_LED_STATUS_ON;
|
||||
} else {
|
||||
info->status &= (~ONLP_LED_STATUS_ON);
|
||||
}
|
||||
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
static int _psoc_onlp_ledi_info_get(onlp_oid_t id, onlp_led_info_t* info)
|
||||
static int _fan_onlp_ledi_info_get(onlp_oid_t id, onlp_led_info_t* info)
|
||||
{
|
||||
int local_id;
|
||||
int rv = ONLP_STATUS_OK;
|
||||
int mode;
|
||||
platform_led_color_t color;
|
||||
|
||||
int grn_mode, red_mode;
|
||||
|
||||
local_id = ONLP_OID_ID_GET(id);
|
||||
|
||||
int fan_id = LOCAL_ID_TO_FAN_ID(local_id);
|
||||
int idx = LOCAL_ID_TO_INFO_IDX(local_id);
|
||||
/* Set the onlp_oid_hdr_t and capabilities */
|
||||
*info = __onlp_led_info[local_id];
|
||||
color = __info_list[local_id].color;
|
||||
*info = __onlp_led_info[idx];
|
||||
|
||||
rv = onlp_file_read_int((int*)&mode, __info_list[local_id].file);
|
||||
rv = onlp_ledi_status_get(id, &info->status);
|
||||
if( rv != ONLP_STATUS_OK ) { return rv; }
|
||||
|
||||
if( ONLP_STATUS_OK == rv ) {
|
||||
if( info->status & ONLP_LED_STATUS_PRESENT) {
|
||||
info->caps = FAN_LED_CAPS;
|
||||
rv = onlp_file_read_int((int*)&grn_mode, INV_HWMON_PREFIX"fan_led_grn%d", fan_id);
|
||||
if(rv != ONLP_STATUS_OK ) { return rv; }
|
||||
rv = onlp_file_read_int((int*)&red_mode, INV_HWMON_PREFIX"fan_led_red%d", fan_id);
|
||||
if(rv != ONLP_STATUS_OK ) { return rv; }
|
||||
|
||||
if(!mode) {
|
||||
if(grn_mode == 1 && red_mode == 0) {
|
||||
info->mode = ONLP_LED_MODE_GREEN;
|
||||
} else if(grn_mode == 0 && red_mode == 1) {
|
||||
info->mode = ONLP_LED_MODE_RED;
|
||||
} else if(grn_mode == 0 && red_mode == 0) {
|
||||
info->mode = ONLP_LED_MODE_OFF;
|
||||
} else {
|
||||
info->mode = ONLP_LED_MODE_ON;
|
||||
}
|
||||
|
||||
if(info->mode != ONLP_LED_MODE_OFF) {
|
||||
switch(color) {
|
||||
case PLATFORM_LED_COLOR_RED:
|
||||
info->mode += (ONLP_LED_MODE_RED - ONLP_LED_MODE_ON);
|
||||
break;
|
||||
case PLATFORM_LED_COLOR_GREEN:
|
||||
info->mode += (ONLP_LED_MODE_GREEN - ONLP_LED_MODE_ON);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Set the on/off status */
|
||||
if (info->mode != ONLP_LED_MODE_OFF) {
|
||||
info->status |= ONLP_LED_STATUS_ON;
|
||||
} else {
|
||||
info->status &= (~ONLP_LED_STATUS_ON);
|
||||
}
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
static int _cpld_onlp_ledi_mode_set(onlp_oid_t id, onlp_led_mode_t onlp_mode)
|
||||
{
|
||||
int local_id;
|
||||
int rv = ONLP_STATUS_OK;
|
||||
platform_led_color_t color;
|
||||
cpld_led_mode_t cpld_mode;
|
||||
|
||||
local_id = ONLP_OID_ID_GET(id);
|
||||
|
||||
|
||||
/*convert onlp_led_mode to platform mod*/
|
||||
rv = _onlp_cpld_led_mode_convert(onlp_mode, &color, &cpld_mode);
|
||||
|
||||
if( ONLP_STATUS_OK == rv) {
|
||||
if((color != __info_list[local_id].color)&&(color != PLATFORM_LED_COLOR_ANY)) {
|
||||
rv = ONLP_STATUS_E_INVALID;
|
||||
} else {
|
||||
rv = onlp_file_write_int(cpld_mode, __info_list[local_id].file);
|
||||
}
|
||||
} else {
|
||||
info->mode = ONLP_LED_MODE_OFF;
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
static int _psoc_onlp_ledi_mode_set(onlp_oid_t id, onlp_led_mode_t onlp_mode)
|
||||
static int _sys_onlp_ledi_mode_set(onlp_led_mode_t onlp_mode)
|
||||
{
|
||||
int local_id;
|
||||
int rv = ONLP_STATUS_OK;
|
||||
platform_led_color_t color;
|
||||
int psoc_mode;
|
||||
int psoc_diag;
|
||||
|
||||
local_id = ONLP_OID_ID_GET(id);
|
||||
|
||||
rv = platform_psoc_diag_enable_read(&psoc_diag);
|
||||
|
||||
if( ONLP_STATUS_OK == rv ) {
|
||||
if(!psoc_diag) {
|
||||
rv = ONLP_STATUS_E_UNSUPPORTED;
|
||||
}
|
||||
}
|
||||
|
||||
switch(onlp_mode) {
|
||||
case ONLP_LED_MODE_OFF:
|
||||
psoc_mode = 0;
|
||||
color = PLATFORM_LED_COLOR_ANY;
|
||||
break;
|
||||
case ONLP_LED_MODE_ON:
|
||||
psoc_mode = 1;
|
||||
color = PLATFORM_LED_COLOR_ANY;
|
||||
break;
|
||||
case ONLP_LED_MODE_RED:
|
||||
color = PLATFORM_LED_COLOR_RED;
|
||||
psoc_mode = 1;
|
||||
break;
|
||||
case ONLP_LED_MODE_GREEN:
|
||||
color = PLATFORM_LED_COLOR_GREEN;
|
||||
psoc_mode = 1;
|
||||
break;
|
||||
default:
|
||||
rv = ONLP_STATUS_E_INVALID;
|
||||
break;
|
||||
}
|
||||
|
||||
if( ONLP_STATUS_OK == rv) {
|
||||
if((psoc_mode)&&(color != __info_list[local_id].color)&&(color != PLATFORM_LED_COLOR_ANY)) {
|
||||
rv = ONLP_STATUS_E_INVALID;
|
||||
} else {
|
||||
rv = onlp_file_write_int(psoc_mode, __info_list[local_id].file);
|
||||
}
|
||||
if( onlp_mode == ONLP_LED_MODE_OFF) {
|
||||
rv = onlp_file_write_int(SYS_LED_MODE_OFF, INV_SYSLED_PREFIX"grn_led");
|
||||
if(rv != ONLP_STATUS_OK ) { return rv; }
|
||||
rv = onlp_file_write_int(SYS_LED_MODE_OFF, INV_SYSLED_PREFIX"red_led");
|
||||
} else {
|
||||
rv = ONLP_STATUS_E_UNSUPPORTED;
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* This function will be called prior to any other onlp_ledi_* functions.
|
||||
*/
|
||||
@@ -416,23 +245,25 @@ onlp_ledi_info_get(onlp_oid_t id, onlp_led_info_t* info)
|
||||
{
|
||||
int rv = ONLP_STATUS_OK;
|
||||
VALIDATE(id);
|
||||
|
||||
if(ONLP_OID_ID_GET(id) >= ONLP_LED_MAX) {
|
||||
int local_id;
|
||||
local_id = ONLP_OID_ID_GET(id);
|
||||
if(local_id >= ONLP_LED_MAX) {
|
||||
return ONLP_STATUS_E_INVALID;
|
||||
}
|
||||
|
||||
switch(__info_list[ONLP_OID_ID_GET(id)].driver) {
|
||||
case LED_DRIVER_MODE_NONE:
|
||||
*info = __onlp_led_info[ONLP_OID_ID_GET(id)];
|
||||
switch(local_id) {
|
||||
case ONLP_LED_MGMT:
|
||||
rv = _sys_onlp_ledi_info_get(id, info);
|
||||
break;
|
||||
case LED_DRIVER_MODE_CPLD:
|
||||
rv = _cpld_onlp_ledi_info_get(id, info);
|
||||
break;
|
||||
case LED_DRIVER_MODE_PSOC:
|
||||
rv = _psoc_onlp_ledi_info_get(id, info);
|
||||
case ONLP_LED_FAN1:
|
||||
case ONLP_LED_FAN2:
|
||||
case ONLP_LED_FAN3:
|
||||
case ONLP_LED_FAN4:
|
||||
case ONLP_LED_FAN5:
|
||||
rv = _fan_onlp_ledi_info_get(id, info);
|
||||
break;
|
||||
default:
|
||||
rv = ONLP_STATUS_E_UNSUPPORTED;
|
||||
rv = ONLP_STATUS_E_INVALID;
|
||||
break;
|
||||
}
|
||||
return rv;
|
||||
@@ -449,13 +280,70 @@ int onlp_ledi_status_get(onlp_oid_t id, uint32_t* rv)
|
||||
onlp_led_info_t* info;
|
||||
|
||||
VALIDATE(id);
|
||||
int local_id = ONLP_OID_ID_GET(id);
|
||||
int info_idx = LOCAL_ID_TO_INFO_IDX(local_id);
|
||||
int fan_id = LOCAL_ID_TO_FAN_ID(local_id);
|
||||
int mode, grn_mode, red_mode;
|
||||
onlp_led_mode_t pmode;
|
||||
uint32_t fan_status;
|
||||
|
||||
if(ONLP_OID_ID_GET(id) >= ONLP_LED_MAX) {
|
||||
if(local_id >= ONLP_LED_MAX) {
|
||||
result = ONLP_STATUS_E_INVALID;
|
||||
} else {
|
||||
info = &__onlp_led_info[ONLP_OID_ID_GET(id)];
|
||||
*rv = info->status;
|
||||
}
|
||||
if(result == ONLP_STATUS_OK) {
|
||||
info = &__onlp_led_info[info_idx];
|
||||
switch(local_id) {
|
||||
case ONLP_LED_MGMT:
|
||||
result = onlp_file_read_int((int*)&grn_mode, INV_SYSLED_PREFIX"grn_led");
|
||||
if(result != ONLP_STATUS_OK) { return result; }
|
||||
result = onlp_file_read_int((int*)&red_mode, INV_SYSLED_PREFIX"red_led");
|
||||
if(result != ONLP_STATUS_OK) { return result; }
|
||||
|
||||
result = _sys_onlp_led_mode_convert(grn_mode, red_mode, &pmode);
|
||||
if(result != ONLP_STATUS_OK) { return result; }
|
||||
|
||||
if( pmode != ONLP_LED_MODE_OFF) {
|
||||
info->status |= ONLP_LED_STATUS_ON;
|
||||
} else {
|
||||
info->status &= (~ONLP_LED_STATUS_ON);
|
||||
}
|
||||
|
||||
*rv = info->status;
|
||||
break;
|
||||
case ONLP_LED_FAN1:
|
||||
case ONLP_LED_FAN2:
|
||||
case ONLP_LED_FAN3:
|
||||
case ONLP_LED_FAN4:
|
||||
case ONLP_LED_FAN5:
|
||||
result = onlp_fani_status_get((&info->hdr)->poid, &fan_status);
|
||||
if(result != ONLP_STATUS_OK) { return result; }
|
||||
|
||||
if(fan_status & ONLP_FAN_STATUS_PRESENT) {
|
||||
info->status |= ONLP_LED_STATUS_PRESENT;
|
||||
info->status &= (~ONLP_LED_STATUS_ON);
|
||||
|
||||
result = onlp_file_read_int((int*)&mode, INV_HWMON_PREFIX"fan_led_grn%d", fan_id);
|
||||
if(result != ONLP_STATUS_OK) { return result; }
|
||||
if(mode) {
|
||||
info->status |= ONLP_LED_STATUS_ON;
|
||||
}
|
||||
|
||||
result = onlp_file_read_int((int*)&mode, INV_HWMON_PREFIX"fan_led_red%d", fan_id);
|
||||
if(result != ONLP_STATUS_OK) { return result; }
|
||||
if(mode) {
|
||||
info->status |= ONLP_LED_STATUS_ON;
|
||||
}
|
||||
} else {
|
||||
info->status = 0;
|
||||
}
|
||||
*rv = info->status;
|
||||
break;
|
||||
default:
|
||||
result = ONLP_STATUS_E_INVALID;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -471,10 +359,13 @@ int onlp_ledi_hdr_get(onlp_oid_t id, onlp_oid_hdr_t* rv)
|
||||
|
||||
VALIDATE(id);
|
||||
|
||||
if(ONLP_OID_ID_GET(id) >= ONLP_LED_MAX) {
|
||||
int local_id;
|
||||
local_id = ONLP_OID_ID_GET(id);
|
||||
int idx = LOCAL_ID_TO_INFO_IDX(local_id);
|
||||
if(local_id >= ONLP_LED_MAX) {
|
||||
result = ONLP_STATUS_E_INVALID;
|
||||
} else {
|
||||
info = &__onlp_led_info[ONLP_OID_ID_GET(id)];
|
||||
info = &__onlp_led_info[idx];
|
||||
*rv = info->hdr;
|
||||
}
|
||||
return result;
|
||||
@@ -494,13 +385,15 @@ onlp_ledi_set(onlp_oid_t id, int on_or_off)
|
||||
{
|
||||
onlp_led_mode_t mode;
|
||||
VALIDATE(id);
|
||||
int local_id;
|
||||
local_id = ONLP_OID_ID_GET(id);
|
||||
int idx = LOCAL_ID_TO_INFO_IDX(local_id);
|
||||
|
||||
if(ONLP_OID_ID_GET(id) >= ONLP_LED_MAX) {
|
||||
if(local_id >= ONLP_LED_MAX) {
|
||||
return ONLP_STATUS_E_INVALID;
|
||||
}
|
||||
|
||||
|
||||
if (__onlp_led_info[ONLP_OID_ID_GET(id)].caps & ONLP_LED_CAPS_ON_OFF) {
|
||||
if (__onlp_led_info[idx].caps & ONLP_LED_CAPS_ON_OFF) {
|
||||
mode = on_or_off?ONLP_LED_MODE_ON:ONLP_LED_MODE_OFF;
|
||||
return onlp_ledi_mode_set(id, mode);
|
||||
}
|
||||
@@ -519,22 +412,28 @@ onlp_ledi_mode_set(onlp_oid_t id, onlp_led_mode_t mode)
|
||||
{
|
||||
int rv = ONLP_STATUS_OK;
|
||||
VALIDATE(id);
|
||||
int local_id;
|
||||
local_id = ONLP_OID_ID_GET(id);
|
||||
|
||||
if(ONLP_OID_ID_GET(id) >= ONLP_LED_MAX) {
|
||||
if(local_id >= ONLP_LED_MAX) {
|
||||
return ONLP_STATUS_E_INVALID;
|
||||
}
|
||||
|
||||
switch(__info_list[ONLP_OID_ID_GET(id)].driver) {
|
||||
case LED_DRIVER_MODE_CPLD:
|
||||
rv = _cpld_onlp_ledi_mode_set(id, mode);
|
||||
switch(local_id) {
|
||||
case ONLP_LED_MGMT:
|
||||
rv = _sys_onlp_ledi_mode_set(mode);
|
||||
break;
|
||||
case LED_DRIVER_MODE_PSOC:
|
||||
rv = _psoc_onlp_ledi_mode_set(id, mode);
|
||||
break;
|
||||
default:
|
||||
case ONLP_LED_FAN1:
|
||||
case ONLP_LED_FAN2:
|
||||
case ONLP_LED_FAN3:
|
||||
case ONLP_LED_FAN4:
|
||||
case ONLP_LED_FAN5:
|
||||
rv = ONLP_STATUS_E_UNSUPPORTED;
|
||||
break;
|
||||
default:
|
||||
rv = ONLP_STATUS_E_INVALID;
|
||||
break;
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
@@ -34,17 +34,17 @@
|
||||
#include "platform_lib.h"
|
||||
|
||||
|
||||
int platform_psoc_diag_enable_read(int *enable)
|
||||
int platform_hwmon_diag_enable_read(int *enable)
|
||||
{
|
||||
int rv = ONLP_STATUS_OK;
|
||||
rv = onlp_file_read_int((int*)enable, PLATFORM_PSOC_DIAG_PATH);
|
||||
rv = onlp_file_read_int((int*)enable, INV_HWMON_PREFIX"diag");
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
int platform_psoc_diag_enable_write(int enable)
|
||||
int platform_hwmon_diag_enable_write(int enable)
|
||||
{
|
||||
int rv = ONLP_STATUS_OK;
|
||||
rv = onlp_file_write_int(enable, PLATFORM_PSOC_DIAG_PATH);
|
||||
rv = onlp_file_write_int(enable, INV_HWMON_PREFIX"diag");
|
||||
return rv;
|
||||
}
|
||||
|
||||
@@ -41,25 +41,15 @@
|
||||
* |----ONLP_THERMAL_3_ON_MAIN_BROAD
|
||||
* |----ONLP_THERMAL_4_ON_MAIN_BROAD
|
||||
* |----ONLP_THERMAL_5_ON_MAIN_BROAD
|
||||
* |----ONLP_FAN_1--------ONLP_FAN_1_WEAK
|
||||
* | |--ONLP_LED_FAN1_GREEN
|
||||
* | |--ONLP_LED_FAN1_RED
|
||||
* |----ONLP_FAN_1--------ONLP_LED_FAN1
|
||||
* |
|
||||
* |----ONLP_FAN_2--------ONLP_FAN_2_WEAK
|
||||
* | |--ONLP_LED_FAN2_GREEN
|
||||
* | |--ONLP_LED_FAN2_RED
|
||||
* |----ONLP_FAN_2--------ONLP_LED_FAN2
|
||||
* |
|
||||
* |----ONLP_FAN_3--------ONLP_FAN_3_WEAK
|
||||
* | |--ONLP_LED_FAN3_GREEN
|
||||
* | |--ONLP_LED_FAN3_RED
|
||||
* |----ONLP_FAN_3--------ONLP_LED_FAN3
|
||||
* |
|
||||
* |----ONLP_FAN_4--------ONLP_FAN_4_WEAK
|
||||
* | |--ONLP_LED_FAN4_GREEN
|
||||
* | |--ONLP_LED_FAN4_RED
|
||||
* |----ONLP_FAN_4--------ONLP_LED_FAN4
|
||||
* |
|
||||
* |----ONLP_FAN_5--------ONLP_FAN_5_WEAK
|
||||
* | |--ONLP_LED_FAN5_GREEN
|
||||
* | |--ONLP_LED_FAN5_RED
|
||||
* |----ONLP_FAN_5--------ONLP_LED_FAN5
|
||||
* |
|
||||
* |----ONLP_PSU_1--------ONLP_THERMAL_1_ON_PSU1
|
||||
* | |--ONLP_THERMAL_2_ON_PSU1
|
||||
@@ -69,14 +59,21 @@
|
||||
* | |--ONLP_THERMAL_2_ON_PSU2
|
||||
* | |--ONLP_FAN_PSU_2
|
||||
* |
|
||||
* |----ONLP_LED_MGMT_GREEN
|
||||
* |----ONLP_LED_MGMT_RED
|
||||
* |----ONLP_LED_MGMT
|
||||
*/
|
||||
|
||||
#define INV_SYSLED_PREFIX "/sys/class/hwmon/hwmon2/device/"
|
||||
#define INV_HWMON_PREFIX "/sys/class/hwmon/hwmon1/device/"
|
||||
#define INV_CTMP_PREFIX "/sys/class/hwmon/hwmon0/"
|
||||
#define INV_SFP_PREFIX "/sys/class/swps/"
|
||||
#define INV_SYS_PREFIX "/sys/class/eeprom/vpd/"
|
||||
|
||||
#define OID_MAP_TO_INFO_IDX(oid) ONLP_OID_ID_GET(oid)-1
|
||||
#define LOCAL_ID_TO_INFO_IDX(id) (id-1)
|
||||
|
||||
/* Thermal definitions*/
|
||||
enum onlp_thermal_id {
|
||||
ONLP_THERMAL_RESERVED = 0,
|
||||
ONLP_THERMAL_CPU_PHY,
|
||||
ONLP_THERMAL_CPU_PHY = 1,
|
||||
ONLP_THERMAL_CPU_CORE0,
|
||||
ONLP_THERMAL_CPU_CORE1,
|
||||
ONLP_THERMAL_CPU_CORE2,
|
||||
@@ -93,65 +90,50 @@ enum onlp_thermal_id {
|
||||
ONLP_THERMAL_MAX
|
||||
};
|
||||
|
||||
#define ONLP_THERMAL_COUNT 15 /*include "reserved"*/
|
||||
#define ONLP_THERMAL_COUNT 14 /*include "reserved"*/
|
||||
|
||||
/* Fan definitions*/
|
||||
enum onlp_fan_id {
|
||||
ONLP_FAN_RESERVED = 0,
|
||||
ONLP_FAN_1,
|
||||
ONLP_FAN_1 = 1,
|
||||
ONLP_FAN_2,
|
||||
ONLP_FAN_3,
|
||||
ONLP_FAN_4,
|
||||
ONLP_FAN_5,
|
||||
ONLP_FAN_1_WEAK,
|
||||
ONLP_FAN_2_WEAK,
|
||||
ONLP_FAN_3_WEAK,
|
||||
ONLP_FAN_4_WEAK,
|
||||
ONLP_FAN_5_WEAK,
|
||||
ONLP_FAN_PSU_1,
|
||||
ONLP_FAN_PSU_2,
|
||||
ONLP_FAN_MAX
|
||||
};
|
||||
|
||||
#define ONLP_FAN_COUNT 13 /*include "reserved"*/
|
||||
#define ONLP_FAN_COUNT 7 /*include "reserved"*/
|
||||
|
||||
/* PSU definitions*/
|
||||
enum onlp_psu_id {
|
||||
ONLP_PSU_RESERVED,
|
||||
ONLP_PSU_1,
|
||||
ONLP_PSU_1 = 1,
|
||||
ONLP_PSU_2,
|
||||
ONLP_PSU_MAX
|
||||
};
|
||||
|
||||
#define ONLP_PSU_COUNT 3 /*include "reserved"*/
|
||||
#define ONLP_PSU_COUNT 2 /*include "reserved"*/
|
||||
|
||||
/* LED definitions*/
|
||||
enum onlp_led_id {
|
||||
ONLP_LED_RESERVED = 0,
|
||||
ONLP_LED_MGMT_GREEN,
|
||||
ONLP_LED_MGMT_RED,
|
||||
ONLP_LED_FAN1_GREEN,
|
||||
ONLP_LED_FAN1_RED,
|
||||
ONLP_LED_FAN2_GREEN,
|
||||
ONLP_LED_FAN2_RED,
|
||||
ONLP_LED_FAN3_GREEN,
|
||||
ONLP_LED_FAN3_RED,
|
||||
ONLP_LED_FAN4_GREEN,
|
||||
ONLP_LED_FAN4_RED,
|
||||
ONLP_LED_FAN5_GREEN,
|
||||
ONLP_LED_FAN5_RED,
|
||||
ONLP_LED_MGMT = 1,
|
||||
ONLP_LED_FAN1,
|
||||
ONLP_LED_FAN2,
|
||||
ONLP_LED_FAN3,
|
||||
ONLP_LED_FAN4,
|
||||
ONLP_LED_FAN5,
|
||||
ONLP_LED_MAX
|
||||
};
|
||||
|
||||
#define ONLP_LED_COUNT 13 /*include "reserved"*/
|
||||
#define ONLP_LED_COUNT 6 /*include "reserved"*/
|
||||
|
||||
|
||||
/* platform functions*/
|
||||
#define PLATFORM_PSOC_DIAG_PATH "/sys/class/hwmon/hwmon1/device/diag"
|
||||
#define PLATFORM_PSOC_DIAG_LOCK platform_psoc_diag_enable_write(0)
|
||||
#define PLATFORM_PSOC_DIAG_UNLOCK platform_psoc_diag_enable_write(1)
|
||||
int platform_psoc_diag_enable_read(int *enable);
|
||||
int platform_psoc_diag_enable_write(int enable);
|
||||
#define PLATFORM_HWMON_DIAG_LOCK platform_hwmon_diag_enable_write(0)
|
||||
#define PLATFORM_HWMON_DIAG_UNLOCK platform_hwmon_diag_enable_write(1)
|
||||
int platform_hwmon_diag_enable_read(int *enable);
|
||||
int platform_hwmon_diag_enable_write(int enable);
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -36,92 +36,34 @@
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
#define PSUI_PLATFORM_PSU_MODEL "DPS-800AB-37D"
|
||||
|
||||
|
||||
typedef enum psoc_psu_state_e {
|
||||
PSOC_PSU_NORMAL = 0,
|
||||
PSOC_PSU_NA_1, //001
|
||||
PSOC_PSU_UNPOWERED, //010
|
||||
PSOC_PSU_NA_3, //011
|
||||
PSOC_PSU_FAULT, //100
|
||||
PSOC_PSU_NA_5, //101
|
||||
PSOC_PSU_NA_6, //110
|
||||
PSOC_PSU_NOT_INSTALLED //111
|
||||
} psoc_psu_state_t;
|
||||
|
||||
|
||||
typedef struct psui_info_s {
|
||||
char vendor[ONLP_CONFIG_INFO_STR_MAX];
|
||||
char serial[ONLP_CONFIG_INFO_STR_MAX];
|
||||
char state[ONLP_CONFIG_INFO_STR_MAX];
|
||||
char vin[ONLP_CONFIG_INFO_STR_MAX];
|
||||
char vout[ONLP_CONFIG_INFO_STR_MAX];
|
||||
char iin[ONLP_CONFIG_INFO_STR_MAX];
|
||||
char iout[ONLP_CONFIG_INFO_STR_MAX];
|
||||
char pin[ONLP_CONFIG_INFO_STR_MAX];
|
||||
char pout[ONLP_CONFIG_INFO_STR_MAX];
|
||||
} psui_info_t;
|
||||
|
||||
|
||||
static psui_info_t __info_list[ONLP_PSU_COUNT] = {
|
||||
{},
|
||||
{
|
||||
"/sys/class/hwmon/hwmon1/device/psoc_psu1_vendor",
|
||||
"/sys/class/hwmon/hwmon1/device/psoc_psu1_serial",
|
||||
"/sys/class/hwmon/hwmon1/device/psu1",
|
||||
"/sys/class/hwmon/hwmon1/device/psoc_psu1_vin",
|
||||
"/sys/class/hwmon/hwmon1/device/psoc_psu1_vout",
|
||||
"/sys/class/hwmon/hwmon1/device/psoc_psu1_iin",
|
||||
"/sys/class/hwmon/hwmon1/device/psoc_psu1_iout",
|
||||
"/sys/class/hwmon/hwmon1/device/psoc_psu1_pin",
|
||||
"/sys/class/hwmon/hwmon1/device/psoc_psu1_pout"
|
||||
},
|
||||
{
|
||||
"/sys/class/hwmon/hwmon1/device/psoc_psu2_vendor",
|
||||
"/sys/class/hwmon/hwmon1/device/psoc_psu2_serial",
|
||||
"/sys/class/hwmon/hwmon1/device/psu2",
|
||||
"/sys/class/hwmon/hwmon1/device/psoc_psu2_vin",
|
||||
"/sys/class/hwmon/hwmon1/device/psoc_psu2_vout",
|
||||
"/sys/class/hwmon/hwmon1/device/psoc_psu2_iin",
|
||||
"/sys/class/hwmon/hwmon1/device/psoc_psu2_iout",
|
||||
"/sys/class/hwmon/hwmon1/device/psoc_psu2_pin",
|
||||
"/sys/class/hwmon/hwmon1/device/psoc_psu2_pout"
|
||||
}
|
||||
};
|
||||
|
||||
typedef enum hwmon_psu_state_e {
|
||||
HWMON_PSU_NORMAL = 0,
|
||||
HWMON_PSU_UNPOWERED = 2, //010
|
||||
HWMON_PSU_FAULT = 4, //100
|
||||
HWMON_PSU_NOT_INSTALLED = 7 //111
|
||||
} hwmon_psu_state_t;
|
||||
|
||||
/*
|
||||
* Get all information about the given PSU oid.
|
||||
*/
|
||||
static onlp_psu_info_t __onlp_psu_info[ONLP_PSU_COUNT] = {
|
||||
{ }, /* Not used */
|
||||
{
|
||||
{
|
||||
ONLP_PSU_ID_CREATE(ONLP_PSU_1), "PSU-1", 0,
|
||||
{
|
||||
ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_1_ON_PSU1),
|
||||
ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_2_ON_PSU1),
|
||||
ONLP_FAN_ID_CREATE(ONLP_FAN_PSU_1)
|
||||
}
|
||||
},
|
||||
"","",ONLP_PSU_STATUS_PRESENT,
|
||||
ONLP_PSU_CAPS_DC12|ONLP_PSU_CAPS_VIN|ONLP_PSU_CAPS_VOUT|ONLP_PSU_CAPS_IIN|ONLP_PSU_CAPS_IOUT|ONLP_PSU_CAPS_PIN|ONLP_PSU_CAPS_POUT
|
||||
},
|
||||
{
|
||||
{
|
||||
ONLP_PSU_ID_CREATE(ONLP_PSU_2), "PSU-2", 0,
|
||||
{
|
||||
ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_1_ON_PSU2),
|
||||
ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_2_ON_PSU2),
|
||||
ONLP_FAN_ID_CREATE(ONLP_FAN_PSU_2)
|
||||
}
|
||||
},
|
||||
"","",ONLP_PSU_STATUS_PRESENT,
|
||||
ONLP_PSU_CAPS_DC12|ONLP_PSU_CAPS_VIN|ONLP_PSU_CAPS_VOUT|ONLP_PSU_CAPS_IIN|ONLP_PSU_CAPS_IOUT|ONLP_PSU_CAPS_PIN|ONLP_PSU_CAPS_POUT
|
||||
#define MAKE_PSU_NODE_INFO(id) \
|
||||
{ \
|
||||
{ \
|
||||
ONLP_PSU_ID_CREATE(ONLP_PSU_##id), "PSU-"#id, 0, \
|
||||
{ \
|
||||
ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_1_ON_PSU##id), \
|
||||
ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_2_ON_PSU##id), \
|
||||
ONLP_FAN_ID_CREATE(ONLP_FAN_PSU_##id) \
|
||||
} \
|
||||
}, \
|
||||
"","", 0, 0 \
|
||||
}
|
||||
};
|
||||
|
||||
static onlp_psu_info_t __onlp_psu_info[ONLP_PSU_COUNT] = {
|
||||
MAKE_PSU_NODE_INFO(1),
|
||||
MAKE_PSU_NODE_INFO(2)
|
||||
};
|
||||
|
||||
int
|
||||
onlp_psui_init(void)
|
||||
@@ -137,7 +79,6 @@ onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info)
|
||||
int len;
|
||||
int local_id = ONLP_OID_ID_GET(id);
|
||||
uint8_t temp[ONLP_CONFIG_INFO_STR_MAX] = {0};
|
||||
psoc_psu_state_t psoc_state;
|
||||
|
||||
VALIDATE(id);
|
||||
|
||||
@@ -146,45 +87,63 @@ onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info)
|
||||
}
|
||||
|
||||
|
||||
*info = __onlp_psu_info[local_id]; /* Set the onlp_oid_hdr_t */
|
||||
*info = __onlp_psu_info[LOCAL_ID_TO_INFO_IDX(local_id)]; /* Set the onlp_oid_hdr_t */
|
||||
|
||||
ret = onlp_file_read(temp, ONLP_CONFIG_INFO_STR_MAX, &len, __info_list[local_id].vendor);
|
||||
ret = onlp_file_read(temp, ONLP_CONFIG_INFO_STR_MAX, &len, INV_HWMON_PREFIX"psoc_psu%d_vendor", local_id);
|
||||
if(ret != ONLP_STATUS_OK) { return ret; }
|
||||
/*remove the '\n'*/
|
||||
temp[strlen((char*)temp)-1] = 0;
|
||||
snprintf(info->model, ONLP_CONFIG_INFO_STR_MAX, "%s", temp);
|
||||
|
||||
|
||||
memset(temp, 0, ONLP_CONFIG_INFO_STR_MAX);
|
||||
ret = onlp_file_read(temp, ONLP_CONFIG_INFO_STR_MAX, &len,__info_list[local_id].serial);
|
||||
ret = onlp_file_read(temp, ONLP_CONFIG_INFO_STR_MAX, &len, INV_HWMON_PREFIX"psoc_psu%d_serial", local_id);
|
||||
if(ret != ONLP_STATUS_OK) { return ret; }
|
||||
/*remove the '\n'*/
|
||||
temp[strlen((char*)temp)-1] = 0;
|
||||
snprintf(info->serial, ONLP_CONFIG_INFO_STR_MAX, "%s", temp);
|
||||
|
||||
ret = onlp_psui_status_get(id, &info->status);
|
||||
if(ret != ONLP_STATUS_OK) { return ret; }
|
||||
|
||||
ret = onlp_file_read_int((int*)&psoc_state, __info_list[local_id].state);
|
||||
if(info->status & ONLP_PSU_STATUS_PRESENT) {
|
||||
info->caps = ONLP_PSU_CAPS_AC;
|
||||
/*millivolts*/
|
||||
ret = onlp_file_read_int(&info->mvin, INV_HWMON_PREFIX"psoc_psu%d_vin", local_id);
|
||||
if(ret != ONLP_STATUS_OK) { return ret; }
|
||||
if(info->mvin >= 0) {
|
||||
info->caps |= ONLP_PSU_CAPS_VIN;
|
||||
}
|
||||
ret = onlp_file_read_int(&info->mvout, INV_HWMON_PREFIX"psoc_psu%d_vout", local_id);
|
||||
if(ret != ONLP_STATUS_OK) { return ret; }
|
||||
if(info->mvout >= 0) {
|
||||
info->caps |= ONLP_PSU_CAPS_VOUT;
|
||||
}
|
||||
|
||||
if( PSOC_PSU_UNPOWERED == psoc_state) {
|
||||
info->status = ONLP_PSU_STATUS_PRESENT|ONLP_PSU_STATUS_UNPLUGGED;
|
||||
} else if ( PSOC_PSU_NORMAL == psoc_state) {
|
||||
info->status = ONLP_PSU_STATUS_PRESENT;
|
||||
} else if( PSOC_PSU_FAULT == psoc_state) {
|
||||
info->status = ONLP_PSU_STATUS_PRESENT|ONLP_PSU_STATUS_FAILED;
|
||||
} else {
|
||||
info->status = 0;
|
||||
/* milliamps */
|
||||
ret = onlp_file_read_int(&info->miin, INV_HWMON_PREFIX"psoc_psu%d_iin", local_id);
|
||||
if(ret != ONLP_STATUS_OK) { return ret; }
|
||||
if(info->miin >= 0) {
|
||||
info->caps |= ONLP_PSU_CAPS_IIN;
|
||||
}
|
||||
ret = onlp_file_read_int(&info->miout, INV_HWMON_PREFIX"psoc_psu%d_iout", local_id);
|
||||
if(ret != ONLP_STATUS_OK) { return ret; }
|
||||
if(info->miout >= 0) {
|
||||
info->caps |= ONLP_PSU_CAPS_IOUT;
|
||||
}
|
||||
|
||||
/* milliwatts */
|
||||
ret = onlp_file_read_int(&info->mpin, INV_HWMON_PREFIX"psoc_psu%d_pin", local_id);
|
||||
if(ret != ONLP_STATUS_OK) { return ret; }
|
||||
if(info->mpin >= 0) {
|
||||
info->caps |= ONLP_PSU_CAPS_PIN;
|
||||
}
|
||||
ret = onlp_file_read_int(&info->mpout, INV_HWMON_PREFIX"psoc_psu%d_pout", local_id);
|
||||
if(ret != ONLP_STATUS_OK) { return ret; }
|
||||
if(info->mpout >= 0) {
|
||||
info->caps |= ONLP_PSU_CAPS_POUT;
|
||||
}
|
||||
}
|
||||
|
||||
/*millivolts*/
|
||||
ret = onlp_file_read_int(&info->mvin, __info_list[local_id].vin);
|
||||
ret = onlp_file_read_int(&info->mvout, __info_list[local_id].vout);
|
||||
|
||||
/* milliamps */
|
||||
ret = onlp_file_read_int(&info->miin, __info_list[local_id].iin);
|
||||
ret = onlp_file_read_int(&info->miout, __info_list[local_id].iout);
|
||||
|
||||
/* milliwatts */
|
||||
ret = onlp_file_read_int(&info->mpin, __info_list[local_id].pin);
|
||||
ret = onlp_file_read_int(&info->mpout, __info_list[local_id].pout);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -197,24 +156,29 @@ onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info)
|
||||
int onlp_psui_status_get(onlp_oid_t id, uint32_t* rv)
|
||||
{
|
||||
int result = ONLP_STATUS_OK;
|
||||
psoc_psu_state_t psoc_state;
|
||||
hwmon_psu_state_t psu_state;
|
||||
int local_id;
|
||||
VALIDATE(id);
|
||||
int len;
|
||||
char buf[ONLP_CONFIG_INFO_STR_MAX];
|
||||
|
||||
local_id = ONLP_OID_ID_GET(id);
|
||||
if(local_id >= ONLP_PSU_MAX) {
|
||||
result = ONLP_STATUS_E_INVALID;
|
||||
} else {
|
||||
result = onlp_file_read_int((int*)&psoc_state, __info_list[local_id].state);
|
||||
|
||||
if( PSOC_PSU_UNPOWERED == psoc_state) {
|
||||
result = onlp_file_read((uint8_t*)&buf, ONLP_CONFIG_INFO_STR_MAX, &len, "%s""psu%d", INV_HWMON_PREFIX, local_id);
|
||||
if( result != ONLP_STATUS_OK ) {return result;}
|
||||
psu_state = (uint8_t)strtoul(buf, NULL, 0);
|
||||
if( psu_state == HWMON_PSU_UNPOWERED) {
|
||||
*rv = ONLP_PSU_STATUS_PRESENT|ONLP_PSU_STATUS_UNPLUGGED;
|
||||
} else if ( PSOC_PSU_NORMAL == psoc_state) {
|
||||
} else if ( psu_state == HWMON_PSU_NORMAL) {
|
||||
*rv = ONLP_PSU_STATUS_PRESENT;
|
||||
} else if( PSOC_PSU_FAULT == psoc_state) {
|
||||
} else if( psu_state == HWMON_PSU_FAULT) {
|
||||
*rv = ONLP_PSU_STATUS_PRESENT|ONLP_PSU_STATUS_FAILED;
|
||||
} else {
|
||||
} else if( psu_state == HWMON_PSU_NOT_INSTALLED) {
|
||||
*rv = 0;
|
||||
} else {
|
||||
result = ONLP_STATUS_E_INVALID;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
@@ -236,7 +200,7 @@ int onlp_psui_hdr_get(onlp_oid_t id, onlp_oid_hdr_t* rv)
|
||||
if(local_id >= ONLP_PSU_MAX) {
|
||||
result = ONLP_STATUS_E_INVALID;
|
||||
} else {
|
||||
info = &__onlp_psu_info[local_id];
|
||||
info = &__onlp_psu_info[LOCAL_ID_TO_INFO_IDX(local_id)];
|
||||
*rv = info->hdr;
|
||||
}
|
||||
return result;
|
||||
|
||||
@@ -23,8 +23,8 @@
|
||||
*
|
||||
*
|
||||
***********************************************************/
|
||||
#include <onlp/platformi/sfpi.h>
|
||||
|
||||
#include <onlp/platformi/sfpi.h>
|
||||
#include <fcntl.h> /* For O_RDWR && open */
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
@@ -33,19 +33,41 @@
|
||||
#include <onlplib/i2c.h>
|
||||
#include "platform_lib.h"
|
||||
#include <dirent.h>
|
||||
#include <onlplib/file.h>
|
||||
|
||||
#define MAX_SFP_PATH 128
|
||||
//static char sfp_node_path[MAX_SFP_PATH] = {0};
|
||||
|
||||
#define MUX_START_INDEX 1
|
||||
#define MUX_START_INDEX 10
|
||||
#define QSFP_DEV_ADDR 0x50
|
||||
#define NUM_OF_SFP_PORT 48
|
||||
#define NUM_OF_QSFP_PORT 6
|
||||
#define NUM_OF_ALL_PORT (NUM_OF_SFP_PORT+NUM_OF_QSFP_PORT)
|
||||
|
||||
#define FRONT_PORT_TO_MUX_INDEX(port) (port+MUX_START_INDEX)
|
||||
/************************************************************
|
||||
*
|
||||
* SFPI Entry Points
|
||||
*
|
||||
***********************************************************/
|
||||
enum onlp_sfp_port_type {
|
||||
ONLP_PORT_TYPE_SFP = 0,
|
||||
ONLP_PORT_TYPE_QSFP,
|
||||
ONLP_PORT_TYPE_MAX
|
||||
};
|
||||
|
||||
static int
|
||||
onlp_sfpi_port_type(int port)
|
||||
{
|
||||
if(port >= 0 && port < NUM_OF_SFP_PORT) {
|
||||
return ONLP_PORT_TYPE_SFP;
|
||||
} else if(port >= NUM_OF_SFP_PORT && port < NUM_OF_ALL_PORT) {
|
||||
return ONLP_PORT_TYPE_QSFP;
|
||||
} else {
|
||||
AIM_LOG_ERROR("Invalid port(%d)\r\n", port);
|
||||
return ONLP_STATUS_E_PARAM;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
onlp_sfpi_init(void)
|
||||
{
|
||||
@@ -53,76 +75,24 @@ onlp_sfpi_init(void)
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
|
||||
int
|
||||
onlp_sfpi_port_is_valid(int port){
|
||||
if(port > NUM_OF_ALL_PORT || port < 1)
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
onlp_sfpi_get_file_byte(int port, char* attr){
|
||||
if(!onlp_sfpi_port_is_valid(port)){
|
||||
return -1;
|
||||
}
|
||||
char path[128]={0};
|
||||
int err = snprintf(path, sizeof(path), "/sys/class/swps/port%d/%s", (port-1), attr);
|
||||
if( err < 0){
|
||||
return err;
|
||||
}
|
||||
FILE* pFile = fopen(path, "r");
|
||||
if(pFile == NULL){
|
||||
return ONLP_STATUS_E_UNSUPPORTED;
|
||||
}
|
||||
char buf[8] = {0};
|
||||
fread( buf, sizeof(buf), sizeof(buf), pFile );
|
||||
int ret = strtol (buf, NULL, 10);
|
||||
fclose(pFile);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
onlp_sfpi_set_file_byte(int port, char* attr, int value){
|
||||
if(!onlp_sfpi_port_is_valid(port)){
|
||||
return -1;
|
||||
}
|
||||
if(value > 10 || value < 0){
|
||||
return -1;
|
||||
}
|
||||
char path[128]={0};
|
||||
int err = snprintf(path, sizeof(path), "/sys/class/swps/port%d/%s", (port-1), attr);
|
||||
if( err < 0){
|
||||
return err;
|
||||
}
|
||||
FILE* pFile = fopen(path, "r+");
|
||||
if(pFile == NULL){
|
||||
return ONLP_STATUS_E_UNSUPPORTED;
|
||||
}
|
||||
char buf = 0;
|
||||
buf = value+'0';
|
||||
err = fwrite(&buf, sizeof(buf), sizeof(buf), pFile);
|
||||
if(err < 0){
|
||||
return err;
|
||||
}
|
||||
fclose(pFile);
|
||||
return err;
|
||||
}
|
||||
|
||||
int
|
||||
onlp_sfpi_port2chan(int port){
|
||||
return port+9;
|
||||
int onlp_sfpi_port_map(int port, int* rport)
|
||||
{
|
||||
int p_type = onlp_sfpi_port_type(port);
|
||||
if(p_type < 0) {return ONLP_STATUS_E_INVALID;}
|
||||
*rport = port;
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
|
||||
int
|
||||
onlp_sfpi_bitmap_get(onlp_sfp_bitmap_t* bmap)
|
||||
{
|
||||
/*
|
||||
* Ports {1, 54}
|
||||
* Ports {0, 53}
|
||||
*/
|
||||
int p;
|
||||
AIM_BITMAP_CLR_ALL(bmap);
|
||||
|
||||
for(p = 1; p <= NUM_OF_ALL_PORT; p++) {
|
||||
for(p = 0; p < NUM_OF_ALL_PORT; p++) {
|
||||
AIM_BITMAP_SET(bmap, p);
|
||||
}
|
||||
|
||||
@@ -137,55 +107,101 @@ onlp_sfpi_is_present(int port)
|
||||
* Return 0 if not present.
|
||||
* Return < 0 if error.
|
||||
*/
|
||||
int present = -999;
|
||||
present = onlp_sfpi_get_file_byte(port, "present");
|
||||
if(present >= 0){
|
||||
return (-present)+1;
|
||||
int p_type = onlp_sfpi_port_type(port);
|
||||
if(p_type < 0) {return ONLP_STATUS_E_INVALID;}
|
||||
|
||||
int present;
|
||||
int rv;
|
||||
if(onlp_file_read_int(&present, INV_SFP_PREFIX"port%d/present", port) != ONLP_STATUS_OK) {
|
||||
return ONLP_STATUS_E_INTERNAL;
|
||||
}
|
||||
return present;
|
||||
if(present == 0) {
|
||||
rv = true;
|
||||
} else if (present == 1) {
|
||||
rv = false;
|
||||
} else {
|
||||
AIM_LOG_ERROR("Unvalid present status %d from port(%d)\r\n",present,port);
|
||||
return ONLP_STATUS_E_INTERNAL;
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
int
|
||||
onlp_sfpi_presence_bitmap_get(onlp_sfp_bitmap_t* dst)
|
||||
{
|
||||
AIM_BITMAP_CLR_ALL(dst);
|
||||
int port=MUX_START_INDEX;
|
||||
for(port=MUX_START_INDEX;port<=NUM_OF_ALL_PORT;port++){
|
||||
if(onlp_sfpi_is_present(port))
|
||||
AIM_BITMAP_SET(dst, port);
|
||||
int port;
|
||||
for(port = 0; port < NUM_OF_ALL_PORT; port++) {
|
||||
if(onlp_sfpi_is_present(port) == true) {
|
||||
AIM_BITMAP_MOD(dst, port, 1);
|
||||
} else if(onlp_sfpi_is_present(port) == false) {
|
||||
AIM_BITMAP_MOD(dst, port, 0);
|
||||
} else {
|
||||
return ONLP_STATUS_E_INTERNAL;
|
||||
}
|
||||
}
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
onlp_sfpi_is_rx_los(int port)
|
||||
{
|
||||
if(port <= NUM_OF_SFP_PORT){
|
||||
if (onlp_sfpi_is_present(port) == 1){
|
||||
int rxlos = onlp_sfpi_get_file_byte(port, "rxlos");
|
||||
if(rxlos < 0){
|
||||
AIM_LOG_ERROR("Unable to read rxlos from port(%d)\r\n", port);
|
||||
return ONLP_STATUS_E_INTERNAL;
|
||||
}
|
||||
return rxlos;
|
||||
int rxlos;
|
||||
int rv;
|
||||
int len;
|
||||
char buf[ONLP_CONFIG_INFO_STR_MAX];
|
||||
|
||||
int p_type = onlp_sfpi_port_type(port);
|
||||
|
||||
if(p_type == ONLP_PORT_TYPE_SFP) {
|
||||
if(onlp_file_read_int(&rxlos, INV_SFP_PREFIX"port%d/rxlos", port) != ONLP_STATUS_OK) {
|
||||
return ONLP_STATUS_E_INTERNAL;
|
||||
}
|
||||
return 0;
|
||||
if(rxlos == 0) {
|
||||
rv = true;
|
||||
} else {
|
||||
rv = false;
|
||||
}
|
||||
} else if(p_type == ONLP_PORT_TYPE_QSFP) {
|
||||
if(onlp_file_read((uint8_t*)buf, ONLP_CONFIG_INFO_STR_MAX, &len, INV_SFP_PREFIX"port%d/soft_rx_los", port) != ONLP_STATUS_OK) {
|
||||
return ONLP_STATUS_E_INTERNAL;
|
||||
}
|
||||
if(sscanf( buf, "0x%x\n", &rxlos) != 1) {
|
||||
AIM_LOG_ERROR("Unable to read rxlos from port(%d)\r\n", port);
|
||||
return ONLP_STATUS_E_INTERNAL;
|
||||
}
|
||||
if(rxlos < 0 || rxlos > 0x0f) {
|
||||
AIM_LOG_ERROR("Unable to read rxlos from port(%d)\r\n", port);
|
||||
return ONLP_STATUS_E_INTERNAL;
|
||||
} else if(rxlos == 0) {
|
||||
rv = true;
|
||||
} else {
|
||||
rv = false;
|
||||
}
|
||||
} else {
|
||||
return ONLP_STATUS_E_INVALID;
|
||||
}
|
||||
else if(port > NUM_OF_SFP_PORT){
|
||||
return 0;
|
||||
}
|
||||
AIM_LOG_ERROR("Read rxlos from port(%d) out of range.\r\n", port);
|
||||
return ONLP_STATUS_E_INTERNAL;
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
int
|
||||
onlp_sfpi_rx_los_bitmap_get(onlp_sfp_bitmap_t* dst)
|
||||
{
|
||||
{
|
||||
AIM_BITMAP_CLR_ALL(dst);
|
||||
int port=MUX_START_INDEX;
|
||||
for(port=MUX_START_INDEX;port<=NUM_OF_ALL_PORT;port++){
|
||||
if(onlp_sfpi_is_rx_los(port))
|
||||
AIM_BITMAP_SET(dst, port);
|
||||
int port;
|
||||
int isrxlos;
|
||||
for(port = 0; port < NUM_OF_ALL_PORT; port++) {
|
||||
if(onlp_sfpi_is_present(port) == true) {
|
||||
isrxlos = onlp_sfpi_is_rx_los(port);
|
||||
if(isrxlos == true) {
|
||||
AIM_BITMAP_MOD(dst, port, 1);
|
||||
} else if(isrxlos == false) {
|
||||
AIM_BITMAP_MOD(dst, port, 0);
|
||||
} else {
|
||||
return ONLP_STATUS_E_INTERNAL;
|
||||
}
|
||||
}
|
||||
}
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
@@ -212,12 +228,14 @@ onlp_sfpi_eeprom_read(int port, uint8_t data[256])
|
||||
* Return OK if eeprom is read
|
||||
*/
|
||||
memset(data, 0, 256);
|
||||
|
||||
int byte = -1;
|
||||
byte = onlp_i2c_read(onlp_sfpi_port2chan(port), 0x50, 0, 256, data, 0);
|
||||
if(byte < 0){
|
||||
|
||||
if(onlp_sfpi_port_type(port) < 0) { return ONLP_STATUS_E_INVALID; }
|
||||
int sts;
|
||||
int bus = FRONT_PORT_TO_MUX_INDEX(port);
|
||||
sts = onlp_i2c_read(bus, QSFP_DEV_ADDR, 0, 256, data, ONLP_I2C_F_FORCE);
|
||||
if(sts < 0) {
|
||||
AIM_LOG_ERROR("Unable to read eeprom from port(%d)\r\n", port);
|
||||
return ONLP_STATUS_E_INTERNAL;
|
||||
return ONLP_STATUS_E_MISSING;
|
||||
}
|
||||
return ONLP_STATUS_OK;
|
||||
}
|
||||
@@ -225,64 +243,59 @@ onlp_sfpi_eeprom_read(int port, uint8_t data[256])
|
||||
int
|
||||
onlp_sfpi_dev_readb(int port, uint8_t devaddr, uint8_t addr)
|
||||
{
|
||||
int bus = onlp_sfpi_port2chan(port);
|
||||
if(onlp_sfpi_port_type(port) < 0) { return ONLP_STATUS_E_INVALID; }
|
||||
int bus = FRONT_PORT_TO_MUX_INDEX(port);
|
||||
return onlp_i2c_readb(bus, devaddr, addr, ONLP_I2C_F_FORCE);
|
||||
}
|
||||
|
||||
int
|
||||
onlp_sfpi_dev_writeb(int port, uint8_t devaddr, uint8_t addr, uint8_t value)
|
||||
{
|
||||
int bus = onlp_sfpi_port2chan(port);
|
||||
if(onlp_sfpi_port_type(port) < 0) { return ONLP_STATUS_E_INVALID; }
|
||||
int bus = FRONT_PORT_TO_MUX_INDEX(port);
|
||||
return onlp_i2c_writeb(bus, devaddr, addr, value, ONLP_I2C_F_FORCE);
|
||||
}
|
||||
|
||||
int
|
||||
onlp_sfpi_dev_readw(int port, uint8_t devaddr, uint8_t addr)
|
||||
{
|
||||
int bus = onlp_sfpi_port2chan(port);
|
||||
if(onlp_sfpi_port_type(port) < 0) { return ONLP_STATUS_E_INVALID; }
|
||||
int bus = FRONT_PORT_TO_MUX_INDEX(port);
|
||||
return onlp_i2c_readw(bus, devaddr, addr, ONLP_I2C_F_FORCE);
|
||||
}
|
||||
|
||||
int
|
||||
onlp_sfpi_dev_writew(int port, uint8_t devaddr, uint8_t addr, uint16_t value)
|
||||
{
|
||||
int bus = onlp_sfpi_port2chan(port);
|
||||
if(onlp_sfpi_port_type(port) < 0) { return ONLP_STATUS_E_INVALID; }
|
||||
int bus = FRONT_PORT_TO_MUX_INDEX(port);
|
||||
return onlp_i2c_writew(bus, devaddr, addr, value, ONLP_I2C_F_FORCE);
|
||||
}
|
||||
|
||||
int
|
||||
onlp_sfpi_control_supported(int port, onlp_sfp_control_t control, int* rv)
|
||||
{
|
||||
*rv = 0;
|
||||
int p_type = onlp_sfpi_port_type(port);
|
||||
if(p_type < 0) { return ONLP_STATUS_E_INVALID; }
|
||||
switch (control) {
|
||||
case ONLP_SFP_CONTROL_RESET_STATE:
|
||||
if(port >= NUM_OF_SFP_PORT && port < (NUM_OF_SFP_PORT + NUM_OF_QSFP_PORT)){
|
||||
*rv = 1;
|
||||
}
|
||||
else{
|
||||
*rv = 0;
|
||||
}
|
||||
break;
|
||||
case ONLP_SFP_CONTROL_RX_LOS:
|
||||
*rv = 0;
|
||||
break;
|
||||
case ONLP_SFP_CONTROL_TX_DISABLE:
|
||||
if(port <= NUM_OF_SFP_PORT){
|
||||
*rv = 1;
|
||||
}
|
||||
else if(port >= NUM_OF_SFP_PORT && port < (NUM_OF_SFP_PORT + NUM_OF_QSFP_PORT)){
|
||||
*rv = 0;
|
||||
}
|
||||
break;
|
||||
case ONLP_SFP_CONTROL_LP_MODE:
|
||||
if(port >= NUM_OF_SFP_PORT && port < (NUM_OF_SFP_PORT + NUM_OF_QSFP_PORT)){
|
||||
*rv = 1;
|
||||
}
|
||||
else{
|
||||
*rv = 0;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
case ONLP_SFP_CONTROL_RESET_STATE:
|
||||
if(p_type == ONLP_PORT_TYPE_QSFP) {
|
||||
*rv = 1;
|
||||
}
|
||||
break;
|
||||
case ONLP_SFP_CONTROL_TX_DISABLE:
|
||||
if(p_type == ONLP_PORT_TYPE_SFP) {
|
||||
*rv = 1;
|
||||
}
|
||||
break;
|
||||
case ONLP_SFP_CONTROL_LP_MODE:
|
||||
if(p_type == ONLP_PORT_TYPE_QSFP) {
|
||||
*rv = 1;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return ONLP_STATUS_OK;
|
||||
@@ -291,100 +304,69 @@ onlp_sfpi_control_supported(int port, onlp_sfp_control_t control, int* rv)
|
||||
int
|
||||
onlp_sfpi_control_set(int port, onlp_sfp_control_t control, int value)
|
||||
{
|
||||
int ret_val = 0;
|
||||
int err = 0;
|
||||
int ret = ONLP_STATUS_E_UNSUPPORTED;
|
||||
int p_type = onlp_sfpi_port_type(port);
|
||||
if(p_type < 0) { return ONLP_STATUS_E_INVALID; }
|
||||
switch (control) {
|
||||
case ONLP_SFP_CONTROL_RESET_STATE:
|
||||
err = onlp_sfpi_set_file_byte(port, "reset", value);
|
||||
if(err == ONLP_STATUS_E_UNSUPPORTED){
|
||||
ret_val = ONLP_STATUS_E_UNSUPPORTED;
|
||||
break;
|
||||
}
|
||||
ret_val = ONLP_STATUS_OK;
|
||||
break;
|
||||
case ONLP_SFP_CONTROL_RX_LOS:
|
||||
ret_val = ONLP_STATUS_E_UNSUPPORTED;
|
||||
break;
|
||||
case ONLP_SFP_CONTROL_TX_DISABLE:
|
||||
err = onlp_sfpi_set_file_byte(port, "tx_disable", value);
|
||||
if(err == ONLP_STATUS_E_UNSUPPORTED){
|
||||
ret_val = ONLP_STATUS_E_UNSUPPORTED;
|
||||
break;
|
||||
}
|
||||
ret_val = ONLP_STATUS_OK;
|
||||
break;
|
||||
case ONLP_SFP_CONTROL_LP_MODE:
|
||||
err = onlp_sfpi_set_file_byte(port, "lpmod", value);
|
||||
if(err == ONLP_STATUS_E_UNSUPPORTED){
|
||||
ret_val = ONLP_STATUS_E_UNSUPPORTED;
|
||||
break;
|
||||
}
|
||||
ret_val = ONLP_STATUS_OK;
|
||||
break;
|
||||
default:
|
||||
ret_val = ONLP_STATUS_E_UNSUPPORTED;
|
||||
break;
|
||||
case ONLP_SFP_CONTROL_RESET_STATE:
|
||||
if(p_type == ONLP_PORT_TYPE_QSFP) {
|
||||
ret = onlp_file_write_int(value, INV_SFP_PREFIX"port%d/reset", port);
|
||||
}
|
||||
break;
|
||||
case ONLP_SFP_CONTROL_TX_DISABLE:
|
||||
if(p_type == ONLP_PORT_TYPE_SFP) {
|
||||
ret = onlp_file_write_int(value, INV_SFP_PREFIX"port%d/tx_disable", port);
|
||||
}
|
||||
break;
|
||||
case ONLP_SFP_CONTROL_LP_MODE:
|
||||
if(p_type == ONLP_PORT_TYPE_QSFP) {
|
||||
ret = onlp_file_write_int(value, INV_SFP_PREFIX"port%d/lpmod", port);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return ret_val;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
onlp_sfpi_control_get(int port, onlp_sfp_control_t control, int* value)
|
||||
{
|
||||
int ret_val = 0;
|
||||
int err = 0;
|
||||
|
||||
int ret = ONLP_STATUS_E_UNSUPPORTED;
|
||||
int p_type = onlp_sfpi_port_type(port);
|
||||
if(p_type < 0) { return ONLP_STATUS_E_INVALID; }
|
||||
switch (control) {
|
||||
case ONLP_SFP_CONTROL_RESET_STATE:
|
||||
err = onlp_sfpi_get_file_byte(port, "reset");
|
||||
if(err == ONLP_STATUS_E_UNSUPPORTED){
|
||||
ret_val = ONLP_STATUS_E_UNSUPPORTED;
|
||||
break;
|
||||
}
|
||||
*value = err;
|
||||
ret_val = ONLP_STATUS_OK;
|
||||
break;
|
||||
case ONLP_SFP_CONTROL_RX_LOS:
|
||||
err = onlp_sfpi_get_file_byte(port, "rxlos");
|
||||
if(err == ONLP_STATUS_E_UNSUPPORTED){
|
||||
ret_val = ONLP_STATUS_E_UNSUPPORTED;
|
||||
break;
|
||||
}
|
||||
*value = err;
|
||||
ret_val = ONLP_STATUS_OK;
|
||||
break;
|
||||
case ONLP_SFP_CONTROL_TX_DISABLE:
|
||||
err = onlp_sfpi_get_file_byte(port, "tx_disable");
|
||||
if(err == ONLP_STATUS_E_UNSUPPORTED){
|
||||
ret_val = ONLP_STATUS_E_UNSUPPORTED;
|
||||
break;
|
||||
}
|
||||
*value = err;
|
||||
ret_val = ONLP_STATUS_OK;
|
||||
break;
|
||||
case ONLP_SFP_CONTROL_LP_MODE:
|
||||
err = onlp_sfpi_get_file_byte(port, "lpmod");
|
||||
if(err == ONLP_STATUS_E_UNSUPPORTED){
|
||||
ret_val = ONLP_STATUS_E_UNSUPPORTED;
|
||||
break;
|
||||
}
|
||||
*value = err;
|
||||
ret_val = ONLP_STATUS_OK;
|
||||
break;
|
||||
case ONLP_SFP_CONTROL_TX_FAULT:
|
||||
err = onlp_sfpi_get_file_byte(port, "tx_fault");
|
||||
if(err == ONLP_STATUS_E_UNSUPPORTED){
|
||||
ret_val = ONLP_STATUS_E_UNSUPPORTED;
|
||||
break;
|
||||
}
|
||||
*value = err;
|
||||
ret_val = ONLP_STATUS_OK;
|
||||
break;
|
||||
default:
|
||||
ret_val = ONLP_STATUS_E_UNSUPPORTED;
|
||||
break;
|
||||
case ONLP_SFP_CONTROL_RESET_STATE:
|
||||
if(p_type == ONLP_PORT_TYPE_QSFP) {
|
||||
ret = onlp_file_read_int(value, INV_SFP_PREFIX"port%d/reset", port);
|
||||
}
|
||||
break;
|
||||
case ONLP_SFP_CONTROL_RX_LOS:
|
||||
if(p_type == ONLP_PORT_TYPE_SFP) {
|
||||
ret = onlp_file_read_int(value, INV_SFP_PREFIX"port%d/rxlos", port);
|
||||
}
|
||||
break;
|
||||
case ONLP_SFP_CONTROL_TX_DISABLE:
|
||||
if(p_type == ONLP_PORT_TYPE_SFP) {
|
||||
ret = onlp_file_read_int(value, INV_SFP_PREFIX"port%d/tx_disable", port);
|
||||
}
|
||||
break;
|
||||
case ONLP_SFP_CONTROL_LP_MODE:
|
||||
if(p_type == ONLP_PORT_TYPE_QSFP) {
|
||||
ret = onlp_file_read_int(value, INV_SFP_PREFIX"port%d/lpmod", port);
|
||||
}
|
||||
break;
|
||||
case ONLP_SFP_CONTROL_TX_FAULT:
|
||||
if(p_type == ONLP_PORT_TYPE_SFP) {
|
||||
ret = onlp_file_read_int(value, INV_SFP_PREFIX"port%d/tx_fault", port);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return ret_val;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
@@ -398,3 +380,9 @@ onlp_sfpi_debug(int port, aim_pvs_t* pvs)
|
||||
{
|
||||
aim_printf(pvs, "Debug data for port %d goes here.", port);
|
||||
}
|
||||
|
||||
int
|
||||
onlp_sfpi_ioctl(int port, va_list vargs)
|
||||
{
|
||||
return ONLP_STATUS_E_UNSUPPORTED;
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -27,6 +27,7 @@
|
||||
#include <onlplib/file.h>
|
||||
#include <onlp/platformi/thermali.h>
|
||||
#include <fcntl.h>
|
||||
#include <onlp/platformi/psui.h>
|
||||
#include "platform_lib.h"
|
||||
|
||||
#define VALIDATE(_id) \
|
||||
@@ -37,88 +38,72 @@
|
||||
} while(0)
|
||||
|
||||
|
||||
typedef struct thermali_info_s {
|
||||
typedef struct thermali_path_s {
|
||||
char file[ONLP_CONFIG_INFO_STR_MAX];
|
||||
} thermali_info_t;
|
||||
} thermali_path_t;
|
||||
|
||||
static thermali_info_t __info_list[ONLP_THERMAL_COUNT] = {
|
||||
{},
|
||||
{"/sys/class/hwmon/hwmon0/temp1_input"},
|
||||
{"/sys/class/hwmon/hwmon0/temp2_input"},
|
||||
{"/sys/class/hwmon/hwmon0/temp3_input"},
|
||||
{"/sys/class/hwmon/hwmon0/temp4_input"},
|
||||
{"/sys/class/hwmon/hwmon0/temp5_input"},
|
||||
{"/sys/class/hwmon/hwmon1/device/temp1_input"},
|
||||
{"/sys/class/hwmon/hwmon1/device/temp2_input"},
|
||||
{"/sys/class/hwmon/hwmon1/device/temp3_input"},
|
||||
{"/sys/class/hwmon/hwmon1/device/temp4_input"},
|
||||
{"/sys/class/hwmon/hwmon1/device/temp5_input"},
|
||||
{"/sys/class/hwmon/hwmon1/device/thermal_psu1"},
|
||||
{"/sys/class/hwmon/hwmon1/device/thermal2_psu1"},
|
||||
{"/sys/class/hwmon/hwmon1/device/thermal_psu2"},
|
||||
{"/sys/class/hwmon/hwmon1/device/thermal2_psu2"}
|
||||
#define MAKE_THERMAL_PATH_ON_CPU(id) { INV_CTMP_PREFIX"temp"#id"_input"}
|
||||
#define MAKE_THERMAL_PATH_ON_MAIN_BROAD(id) { INV_HWMON_PREFIX"temp"#id"_input"}
|
||||
#define MAKE_THERMAL1_PATH_ON_PSU(psu_id) { INV_HWMON_PREFIX"thermal_psu"#psu_id}
|
||||
#define MAKE_THERMAL2_PATH_ON_PSU(psu_id) { INV_HWMON_PREFIX"thermal2_psu"#psu_id}
|
||||
|
||||
static thermali_path_t __path_list[ONLP_THERMAL_COUNT] = {
|
||||
MAKE_THERMAL_PATH_ON_CPU(1),
|
||||
MAKE_THERMAL_PATH_ON_CPU(2),
|
||||
MAKE_THERMAL_PATH_ON_CPU(3),
|
||||
MAKE_THERMAL_PATH_ON_CPU(4),
|
||||
MAKE_THERMAL_PATH_ON_CPU(5),
|
||||
MAKE_THERMAL_PATH_ON_MAIN_BROAD(1),
|
||||
MAKE_THERMAL_PATH_ON_MAIN_BROAD(2),
|
||||
MAKE_THERMAL_PATH_ON_MAIN_BROAD(3),
|
||||
MAKE_THERMAL_PATH_ON_MAIN_BROAD(4),
|
||||
MAKE_THERMAL_PATH_ON_MAIN_BROAD(5),
|
||||
MAKE_THERMAL1_PATH_ON_PSU(1),
|
||||
MAKE_THERMAL2_PATH_ON_PSU(1),
|
||||
MAKE_THERMAL1_PATH_ON_PSU(2),
|
||||
MAKE_THERMAL2_PATH_ON_PSU(2)
|
||||
};
|
||||
|
||||
#define MAKE_THERMAL_INFO_NODE_ON_CPU_PHY \
|
||||
{ { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_CPU_PHY), "CPU Physical", 0}, \
|
||||
ONLP_THERMAL_STATUS_PRESENT, \
|
||||
ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS \
|
||||
}
|
||||
#define MAKE_THERMAL_INFO_NODE_ON_CPU_CORE(id) \
|
||||
{ { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_CPU_CORE##id), "CPU Core "#id, 0},\
|
||||
ONLP_THERMAL_STATUS_PRESENT, \
|
||||
ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS \
|
||||
}
|
||||
#define MAKE_THERMAL_INFO_NODE_ON_MAIN_BROAD(id) \
|
||||
{ { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_##id##_ON_MAIN_BROAD), "Thermal Sensor "#id, 0}, \
|
||||
ONLP_THERMAL_STATUS_PRESENT, \
|
||||
ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS \
|
||||
}
|
||||
#define MAKE_THERMAL_INFO_NODE_ON_PSU(thermal_id, psu_id) \
|
||||
{ { \
|
||||
ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_##thermal_id##_ON_PSU##psu_id), \
|
||||
"PSU-"#psu_id" Thermal Sensor "#thermal_id, \
|
||||
ONLP_PSU_ID_CREATE(ONLP_PSU_##psu_id) \
|
||||
}, \
|
||||
ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS \
|
||||
}
|
||||
|
||||
/* Static values */
|
||||
static onlp_thermal_info_t __onlp_thermal_info[ONLP_THERMAL_COUNT] = {
|
||||
{ }, /* Not used */
|
||||
{ { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_CPU_PHY), "CPU Physical", 0},
|
||||
ONLP_THERMAL_STATUS_PRESENT,
|
||||
ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS
|
||||
},
|
||||
{ { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_CPU_CORE0), "CPU Core0", 0},
|
||||
ONLP_THERMAL_STATUS_PRESENT,
|
||||
ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS
|
||||
},
|
||||
{ { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_CPU_CORE1), "CPU Core1", 0},
|
||||
ONLP_THERMAL_STATUS_PRESENT,
|
||||
ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS
|
||||
},
|
||||
{ { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_CPU_CORE2), "CPU Core2", 0},
|
||||
ONLP_THERMAL_STATUS_PRESENT,
|
||||
ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS
|
||||
},
|
||||
{ { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_CPU_CORE3), "CPU Core3", 0},
|
||||
ONLP_THERMAL_STATUS_PRESENT,
|
||||
ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS
|
||||
},
|
||||
{ { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_1_ON_MAIN_BROAD), "Thermal Sensor 1", 0},
|
||||
ONLP_THERMAL_STATUS_PRESENT,
|
||||
ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS
|
||||
},
|
||||
{ { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_2_ON_MAIN_BROAD), "Thermal Sensor 2", 0},
|
||||
ONLP_THERMAL_STATUS_PRESENT,
|
||||
ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS
|
||||
},
|
||||
{ { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_3_ON_MAIN_BROAD), "Thermal Sensor 3", 0},
|
||||
ONLP_THERMAL_STATUS_PRESENT,
|
||||
ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS
|
||||
},
|
||||
{ { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_4_ON_MAIN_BROAD), "Thermal Sensor 4", 0},
|
||||
ONLP_THERMAL_STATUS_PRESENT,
|
||||
ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS
|
||||
},
|
||||
{ { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_5_ON_MAIN_BROAD), "Thermal Sensor 5", 0},
|
||||
ONLP_THERMAL_STATUS_PRESENT,
|
||||
ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS
|
||||
},
|
||||
{ { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_1_ON_PSU1), "PSU-1 Thermal Sensor 1", ONLP_PSU_ID_CREATE(ONLP_PSU_1)},
|
||||
ONLP_THERMAL_STATUS_PRESENT,
|
||||
ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS
|
||||
},
|
||||
{ { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_2_ON_PSU1), "PSU-1 Thermal Sensor 2", ONLP_PSU_ID_CREATE(ONLP_PSU_1)},
|
||||
ONLP_THERMAL_STATUS_PRESENT,
|
||||
ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS
|
||||
},
|
||||
{ { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_1_ON_PSU2), "PSU-2 Thermal Sensor 1", ONLP_PSU_ID_CREATE(ONLP_PSU_2)},
|
||||
ONLP_THERMAL_STATUS_PRESENT,
|
||||
ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS
|
||||
},
|
||||
{ { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_2_ON_PSU2), "PSU-2 Thermal Sensor 2", ONLP_PSU_ID_CREATE(ONLP_PSU_2)},
|
||||
ONLP_THERMAL_STATUS_PRESENT,
|
||||
ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS
|
||||
}
|
||||
MAKE_THERMAL_INFO_NODE_ON_CPU_PHY,
|
||||
MAKE_THERMAL_INFO_NODE_ON_CPU_CORE(0),
|
||||
MAKE_THERMAL_INFO_NODE_ON_CPU_CORE(1),
|
||||
MAKE_THERMAL_INFO_NODE_ON_CPU_CORE(2),
|
||||
MAKE_THERMAL_INFO_NODE_ON_CPU_CORE(3),
|
||||
MAKE_THERMAL_INFO_NODE_ON_MAIN_BROAD(1),
|
||||
MAKE_THERMAL_INFO_NODE_ON_MAIN_BROAD(2),
|
||||
MAKE_THERMAL_INFO_NODE_ON_MAIN_BROAD(3),
|
||||
MAKE_THERMAL_INFO_NODE_ON_MAIN_BROAD(4),
|
||||
MAKE_THERMAL_INFO_NODE_ON_MAIN_BROAD(5),
|
||||
MAKE_THERMAL_INFO_NODE_ON_PSU(1,1),
|
||||
MAKE_THERMAL_INFO_NODE_ON_PSU(2,1),
|
||||
MAKE_THERMAL_INFO_NODE_ON_PSU(1,2),
|
||||
MAKE_THERMAL_INFO_NODE_ON_PSU(2,2)
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -145,6 +130,7 @@ onlp_thermali_info_get(onlp_oid_t id, onlp_thermal_info_t* info)
|
||||
{
|
||||
int local_id;
|
||||
VALIDATE(id);
|
||||
int ret;
|
||||
|
||||
local_id = ONLP_OID_ID_GET(id);
|
||||
if(local_id >= ONLP_THERMAL_MAX) {
|
||||
@@ -152,8 +138,15 @@ onlp_thermali_info_get(onlp_oid_t id, onlp_thermal_info_t* info)
|
||||
}
|
||||
|
||||
/* Set the onlp_oid_hdr_t and capabilities */
|
||||
*info = __onlp_thermal_info[local_id];
|
||||
return onlp_file_read_int(&info->mcelsius, __info_list[local_id].file);
|
||||
*info = __onlp_thermal_info[LOCAL_ID_TO_INFO_IDX(local_id)];
|
||||
ret = onlp_thermali_status_get(id, &info->status);
|
||||
if( ret != ONLP_STATUS_OK ) { return ret; }
|
||||
|
||||
if(info->status & ONLP_THERMAL_STATUS_PRESENT) {
|
||||
ret = onlp_file_read_int(&info->mcelsius, __path_list[LOCAL_ID_TO_INFO_IDX(local_id)].file);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -165,19 +158,38 @@ onlp_thermali_info_get(onlp_oid_t id, onlp_thermal_info_t* info)
|
||||
int onlp_thermali_status_get(onlp_oid_t id, uint32_t* rv)
|
||||
{
|
||||
int local_id;
|
||||
|
||||
int ret = ONLP_STATUS_OK;
|
||||
onlp_thermal_info_t* info;
|
||||
VALIDATE(id);
|
||||
uint32_t psu_status;
|
||||
|
||||
local_id = ONLP_OID_ID_GET(id);
|
||||
if(local_id >= ONLP_THERMAL_MAX) {
|
||||
return ONLP_STATUS_E_INVALID;
|
||||
}
|
||||
info = &__onlp_thermal_info[local_id];
|
||||
info = &__onlp_thermal_info[LOCAL_ID_TO_INFO_IDX(local_id)];
|
||||
|
||||
switch(local_id) {
|
||||
case ONLP_THERMAL_1_ON_PSU1:
|
||||
case ONLP_THERMAL_2_ON_PSU1:
|
||||
case ONLP_THERMAL_1_ON_PSU2:
|
||||
case ONLP_THERMAL_2_ON_PSU2:
|
||||
ret = onlp_psui_status_get((&info->hdr)->poid, &psu_status);
|
||||
if(ret != ONLP_STATUS_OK) {return ret;}
|
||||
|
||||
if(psu_status & ONLP_PSU_STATUS_PRESENT) {
|
||||
info->status |= ONLP_THERMAL_STATUS_PRESENT;
|
||||
} else {
|
||||
info->status = 0;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
*rv = info->status;
|
||||
|
||||
return ONLP_STATUS_OK;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -195,7 +207,7 @@ int onlp_thermali_hdr_get(onlp_oid_t id, onlp_oid_hdr_t* rv)
|
||||
if(local_id >= ONLP_THERMAL_MAX) {
|
||||
return ONLP_STATUS_E_INVALID;
|
||||
}
|
||||
info = &__onlp_thermal_info[local_id];
|
||||
info = &__onlp_thermal_info[LOCAL_ID_TO_INFO_IDX(local_id)];
|
||||
|
||||
*rv = info->hdr;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user