Ejemplo n.º 1
0
int
onlp_sfpi_eeprom_read(int port, uint8_t data[256])
{
    /*
     * Read the SFP eeprom into data[]
     *
     * Return MISSING if SFP is missing.
     * Return OK if eeprom is read
     */
    int size = 0;
    if(port <0 || port >= 54)
        return ONLP_STATUS_E_INTERNAL;
    if(port < 48)
        return ONLP_STATUS_E_UNSUPPORTED;
    
    memset(data, 0, 256);

	if(onlp_file_read(data, 256, &size, PORT_EEPROM_FORMAT, onlp_sfpi_map_bus_index(port-48)) != ONLP_STATUS_OK) {
        AIM_LOG_ERROR("Unable to read eeprom from port(%d)\r\n", port);
        return ONLP_STATUS_E_INTERNAL;
    }

    if (size != 256) {
        AIM_LOG_ERROR("Unable to read eeprom from port(%d), size is different!\r\n", port);
        return ONLP_STATUS_E_INTERNAL;
    }

    return ONLP_STATUS_OK;
}
Ejemplo n.º 2
0
int
onlp_ledi_info_get(onlp_oid_t id, onlp_led_info_t* info)
{
    int  len, local_id = 0;
    uint8_t data[driver_value_len] = {0};

    VALIDATE(id);

    local_id = ONLP_OID_ID_GET(id);

    /* Set the onlp_oid_hdr_t and capabilities */
    *info = linfo[ONLP_OID_ID_GET(id)];

    /* Get LED mode */
    if (onlp_file_read(data, sizeof(data), &len, "%s%s",
    		prefix_path, file_names[local_id]) != 0) {
        return ONLP_STATUS_E_INTERNAL;
    }

    info->mode = driver_to_onlp_led_mode(local_id, (char*)data);

    /* Set the on/off status */
    if (info->mode != ONLP_LED_MODE_OFF) {
        info->status |= ONLP_LED_STATUS_ON;
    }

    return ONLP_STATUS_OK;
}
Ejemplo n.º 3
0
int
onlp_file_vread_all(uint8_t** data, const char* fmt, va_list vargs)
{
    int rv;
    uint8_t* contents = NULL;
    char * fname = NULL;
    int fsize, rsize;

    if(data == NULL || fmt == NULL) {
        return ONLP_STATUS_E_PARAM;
    }

    fname = aim_vdfstrdup(fmt, vargs);

    *data = NULL;

    if((fsize = onlp_file_size(fname)) > 0) {
        contents = aim_zmalloc(fsize);
        if((rv = onlp_file_read(contents, fsize,  &rsize, fname)) >= 0) {
            *data = contents;
            rv = rsize;
        }
    }
    else {
        rv = fsize;
    }
    aim_free(fname);
    return rv;
}
Ejemplo n.º 4
0
/**
 * @brief Get the PSU's operational status.
 * @param id The PSU OID.
 * @param rv [out] Receives the operational status.
 */
int onlp_psui_status_get(onlp_oid_t id, uint32_t* rv)
{
    int result = ONLP_STATUS_OK;
    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((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 ( psu_state == HWMON_PSU_NORMAL) {
            *rv = ONLP_PSU_STATUS_PRESENT;
        } else if( psu_state == HWMON_PSU_FAULT) {
            *rv = ONLP_PSU_STATUS_PRESENT|ONLP_PSU_STATUS_FAILED;
        } else if( psu_state == HWMON_PSU_NOT_INSTALLED) {
            *rv = 0;
        } else {
            result = ONLP_STATUS_E_INVALID;
        }
    }
    return result;
}
Ejemplo n.º 5
0
int
onlp_fani_info_get(onlp_oid_t id, onlp_fan_info_t* rv)
{
    *rv = fans__[ONLP_OID_ID_GET(id)];
    rv->caps |= ONLP_FAN_CAPS_GET_RPM;

    int len;
    char direction[16] = {0};

    int fid = ONLP_OID_ID_GET(id);

    /* Read the current airflow direction */
    onlp_file_read((uint8_t*)direction, sizeof(direction), &len,
                   SYS_HWMON_PREFIX "/fan_dir");

#define FAN_DIR_F2B "front-to-back"
#define FAN_DIR_B2F "back-to-front"

    if(!strncmp(direction, FAN_DIR_F2B, strlen(FAN_DIR_F2B))) {
        rv->status |= ONLP_FAN_STATUS_F2B;
        rv->caps |= ONLP_FAN_CAPS_F2B;
    }
    else if(!strncmp(direction, FAN_DIR_B2F, strlen(FAN_DIR_B2F))) {
        rv->status |= ONLP_FAN_STATUS_B2F;
        rv->caps |= ONLP_FAN_CAPS_B2F;
    }
    else {
        AIM_LOG_WARN("Invalid fan direction: '%s'", direction);
    }


    switch(fid)
        {
        case FAN_ID_FAN1:
        case FAN_ID_FAN2:
        case FAN_ID_FAN3:
        case FAN_ID_FAN4:
            {
                if(rv->status & ONLP_FAN_STATUS_F2B) {
                    return sys_fan_info_get__(rv, fid);
                }
                if(rv->status & ONLP_FAN_STATUS_B2F) {
                    return sys_fan_info_get__(rv, fid+4);
                }
                return ONLP_STATUS_E_INTERNAL;
            }

        case FAN_ID_FAN5:
        case FAN_ID_FAN6:
            {
                return psu_fan_info_get__(rv, fid);
            }
        }

    return ONLP_STATUS_E_INVALID;
}
Ejemplo n.º 6
0
psu_type_t get_psu_type(int id, char* modelname, int modelname_len)
{
    int   ret = 0, value = 0;
    char  model[PSU_MODEL_NAME_LEN + 1] = {0};
    char  fan_dir[PSU_FAN_DIR_LEN + 1] = {0};
    char *path = NULL;

    if (modelname && modelname_len < PSU_MODEL_NAME_LEN) {
        return PSU_TYPE_UNKNOWN;
    }

    /* Check AC model name */
    path = (id == PSU1_ID) ? PSU1_AC_EEPROM_NODE(psu_model_name) : PSU2_AC_EEPROM_NODE(psu_model_name);
    ret = onlp_file_read((uint8_t*)model, PSU_MODEL_NAME_LEN, &value, path);
    if (ret != ONLP_STATUS_OK || value != PSU_MODEL_NAME_LEN) {
		return PSU_TYPE_UNKNOWN;

    }
	
    if (strncmp(model, "YM-2651Y", strlen("YM-2651Y")) != 0) {
        return PSU_TYPE_UNKNOWN;
    }

    if (modelname) {
        strncpy(modelname, model, modelname_len-1);
    }

    path = (id == PSU1_ID) ? PSU1_AC_PMBUS_NODE(psu_fan_dir) : PSU2_AC_PMBUS_NODE(psu_fan_dir);
    ret = onlp_file_read((uint8_t*)fan_dir, sizeof(fan_dir), &value, path);
    if (ret != ONLP_STATUS_OK) {
        return PSU_TYPE_UNKNOWN;
    }

    if (strncmp(fan_dir, "F2B", strlen("F2B")) == 0) {
        return PSU_TYPE_AC_F2B;
    }

    if (strncmp(fan_dir, "B2F", strlen("B2F")) == 0) {
        return PSU_TYPE_AC_B2F;
    }

    return PSU_TYPE_UNKNOWN;
}
Ejemplo n.º 7
0
int
wnc_sys_eeprom_parse_file(const char* file, wnc_sys_eeprom_t* e)
{
    int rv;
    uint8_t data[256];
    int len;

    rv = onlp_file_read(data, sizeof(data), &len, (char*)file);
    if(rv >= 0) {
        rv = wnc_sys_eeprom_parse_data(data, sizeof(data), e);
    }
    return rv;
}
Ejemplo n.º 8
0
static void
psu_module_name_get(int id, onlp_psu_info_t* info)
{
    char node_path[ONLP_NODE_MAX_PATH_LEN] = {0};
    uint8_t temp[ONLP_CONFIG_INFO_STR_MAX] = {0};
    int ret, len;

#if 1
    strncpy(info->model, "N/A", 3);
#else
    memset(node_path, 0, ONLP_NODE_MAX_PATH_LEN);
    sprintf(node_path, module_devfiles__[id], "model");
    ret = onlp_file_read(temp, ONLP_CONFIG_INFO_STR_MAX, &len, node_path);
    if (ret == 0) {
	/*remove the '\n'*/
	temp[strlen((char*)temp)-1] = 0;
	snprintf(info->model, ONLP_CONFIG_INFO_STR_MAX, "%s", temp);
    }
    else {
	AIM_LOG_ERROR("Unable to read model name from file(%s)\r\n", node_path);
	strncpy(info->model, "N/A", 3);
    }
#endif

    memset(node_path, 0, ONLP_NODE_MAX_PATH_LEN);
    sprintf(node_path, module_devfiles__[id], "serial");
    ret = onlp_file_read(temp, ONLP_CONFIG_INFO_STR_MAX, &len, node_path);
    if (ret == 0) {
	/*remove the '\n'*/
	temp[strlen((char*)temp)-1] = 0;
	snprintf(info->serial, ONLP_CONFIG_INFO_STR_MAX, "%s", temp);
    }
    else {
	AIM_LOG_ERROR("Unable to read model name from file(%s)\r\n", node_path);
	strncpy(info->serial, "N/A", 3);
    }
}
Ejemplo n.º 9
0
int
onlp_sysi_onie_data_get(uint8_t** data, int* size)
{
    uint8_t* rdata = aim_zmalloc(256);
    if(onlp_file_read(rdata, 256, size, EEPROM_NODE(eeprom)) == ONLP_STATUS_OK) {
        if(*size == 256) {
            *data = rdata;
            return ONLP_STATUS_OK;
        }
    }

    aim_free(rdata);
    *size = 0;
    return ONLP_STATUS_E_INTERNAL;
}
Ejemplo n.º 10
0
static int
psu_power_info_get(int id, char *node, int *value)
{
    int len, ret = 0;
    char buf[PSU_NODE_MAX_INT_LEN + 1] = {0};

    *value = 0;

    ret = onlp_file_read((uint8_t*)buf, sizeof(buf), &len,
    		PSU_POWER_PREFIX, id, node);
    if (ret == 0) {
        *value = atoi(buf);
    }

    return ret;
}
Ejemplo n.º 11
0
static int
psu2_thermal_info_get__(onlp_thermal_info_t* info, int id)
{
    int rv;
    uint8_t buffer[64];
    double dvalue;
    int len;

    memset(buffer, 0, sizeof(buffer));
    rv = onlp_file_read(buffer, sizeof(buffer), &len, SYS_HWMON2_PREFIX "/psu2_temp_%d", id);
    if (rv == ONLP_STATUS_OK)
    {
        dvalue = atof((const char *)buffer);
        info->mcelsius = (int)(dvalue * 1000);
    }
    return rv;
}
Ejemplo n.º 12
0
int
onlp_sfpi_eeprom_read(int port, uint8_t data[256])
{
    char* path;
    int len = 0;
    /*
     * Read the SFP eeprom into data[]
     *
     * Return MISSING if SFP is missing.
     * Return OK if eeprom is read
     */
    memset(data, 0, 256);
    path = sfp_get_port_path(port, "eeprom");
    if (onlp_file_read(&data[0], 256, &len, path) < 0) {
        AIM_LOG_ERROR("Unable to read eeprom from port(%d)\r\n", port);
        return ONLP_STATUS_E_INTERNAL;
    }
    return ONLP_STATUS_OK;
}
Ejemplo n.º 13
0
static int
msn2100_sfp_node_read_int(char *node_path, int *value)
{
    int data_len = 0, ret = 0;
    char buf[SFP_SYSFS_VALUE_LEN] = {0};
    *value = -1;

    ret = onlp_file_read((uint8_t*)buf, sizeof(buf), &data_len, node_path);

    if (ret == 0) {
        if (!strncmp(buf, SFP_PRESENT_STATUS, strlen(SFP_PRESENT_STATUS))) {
            *value = 1;
        } else if (!strncmp(buf, SFP_NOT_PRESENT_STATUS, strlen(SFP_NOT_PRESENT_STATUS))) {
            *value = 0;
        }
    }

    return ret;
}
Ejemplo n.º 14
0
int psu_serial_number_get(int id, char *serial, int serial_len)
{
    int   size = 0;
    int   ret  = ONLP_STATUS_OK;
    char *prefix = NULL;

    if (serial == NULL || serial_len < PSU_SERIAL_NUMBER_LEN) {
        return ONLP_STATUS_E_PARAM;
    }

    prefix = (id == PSU1_ID) ? PSU1_AC_PMBUS_PREFIX : PSU2_AC_PMBUS_PREFIX;

    ret = onlp_file_read((uint8_t*)serial, PSU_SERIAL_NUMBER_LEN, &size, "%s%s", prefix, "psu_mfr_serial");
    if (ret != ONLP_STATUS_OK || size != PSU_SERIAL_NUMBER_LEN) {
        return ONLP_STATUS_E_INTERNAL;
    }

    serial[PSU_SERIAL_NUMBER_LEN] = '\0';
    return ONLP_STATUS_OK;
}
Ejemplo n.º 15
0
/*
 * Retrieve the information structure for the given thermal OID.
 *
 * If the OID is invalid, return ONLP_E_STATUS_INVALID.
 * If an unexpected error occurs, return ONLP_E_STATUS_INTERNAL.
 * Otherwise, return ONLP_STATUS_OK with the OID's information.
 *
 * Note -- it is expected that you fill out the information
 * structure even if the sensor described by the OID is not present.
 */
int
onlp_thermali_info_get(onlp_oid_t id, onlp_thermal_info_t* info)
{
    int   rv, len = 10, temp_base=1, local_id = 0;
    char  r_data[10]   = {0};
    VALIDATE(id);

    local_id = ONLP_OID_ID_GET(id);

    /* Set the onlp_oid_hdr_t and capabilities */
    *info = linfo[local_id];

    rv = onlp_file_read((uint8_t*)r_data, sizeof(r_data), &len, "%s/%s",
    		prefix_path, last_path[local_id]);
	if (rv < 0) {
		return ONLP_STATUS_E_INTERNAL;
	}

    info->mcelsius = atoi(r_data) / temp_base;

    return ONLP_STATUS_OK;
}
Ejemplo n.º 16
0
static int
sys_thermal_info_get__(onlp_thermal_info_t* info, int id)
{
    int rv;

    if (id == THERMAL_ID_THERMAL3)
    {
        rv = onlp_file_read_int(&info->mcelsius, SYS_HWMON1_PREFIX "/mac_temp");
        info->mcelsius *= 1000;
    }
    else
    {
        uint8_t buffer[64];
        double dvalue;
        int len;

        memset(buffer, 0, sizeof(buffer));
        rv = onlp_file_read(buffer, sizeof(buffer), &len, SYS_HWMON1_PREFIX "/remote_temp%d", id);
        if (rv == ONLP_STATUS_OK)
        {
            dvalue = atof((const char *)buffer);
            info->mcelsius = (int)(dvalue * 1000);
        }
    }

    if(rv == ONLP_STATUS_E_INTERNAL)
        return rv;

    if(rv == ONLP_STATUS_E_MISSING)
    {
        info->status &= ~(ONLP_THERMAL_STATUS_PRESENT);
        return ONLP_STATUS_OK;
    }

    return ONLP_STATUS_OK;
}
Ejemplo n.º 17
0
int
onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info)
{
    int ret   = ONLP_STATUS_OK;
    int len;
    int local_id = ONLP_OID_ID_GET(id);
    uint8_t temp[ONLP_CONFIG_INFO_STR_MAX] = {0};

    VALIDATE(id);

    if(local_id >= ONLP_PSU_MAX) {
        return ONLP_STATUS_E_INVALID;
    }


    *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, 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, 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; }

    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;
        }

        /* 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;
        }
    }
    return ret;
}
Ejemplo n.º 18
0
/*
 * Retrieve the information structure for the given thermal OID.
 *
 * If the OID is invalid, return ONLP_E_STATUS_INVALID.
 * If an unexpected error occurs, return ONLP_E_STATUS_INTERNAL.
 * Otherwise, return ONLP_STATUS_OK with the OID's information.
 *
 * Note -- it is expected that you fill out the information
 * structure even if the sensor described by the OID is not present.
 */
int
onlp_thermali_info_get(onlp_oid_t id, onlp_thermal_info_t* info)
{
    int   tid;
    int size;
    char     cmd[THERMAL_MAX_LENGTH/2] = {0};
    char     temp[4];
    uint8_t  data[THERMAL_MAX_LENGTH] = {0};
    //char  *ipmi_cmd;
    char  * tag, *p;
    struct  timeval    new_tv;
    long    last_time;
    int     get_data_by_ipmi=0;
       
    VALIDATE(id);
	
    tid = ONLP_OID_ID_GET(id);
	
    if(tid > THERMAL_1_ON_PSU2 || tid <= THERMAL_RESERVED)
        return ONLP_STATUS_E_INTERNAL;
    /* Set the onlp_oid_hdr_t and capabilities */
    *info = linfo[tid];
    
    if(tid == THERMAL_CPU_CORE) {    	 
        return onlp_file_read_int_max(&info->mcelsius, cpu_coretemp_files);
    }
    if(thermali_time_exist())
    {
        if(onlp_file_read(data, THERMAL_MAX_LENGTH, &size, THERMAL_CHECK_TIME)!=ONLP_STATUS_OK)
        {
            last_time=0; 
        }
        else
           last_time = atol((char*)data);
    }
    else
        last_time=0;

    gettimeofday(&new_tv,NULL);    

    if(last_time==0) /* first time */
    {
        get_data_by_ipmi=1;
    }
    else
    {
         if(new_tv.tv_sec > last_time)
         {
             if((new_tv.tv_sec - last_time) > THERMAL_CAN_SET_IPMI_TIME)
             {
                get_data_by_ipmi=1;
             }
             else
                get_data_by_ipmi=0;
         }
         else if(new_tv.tv_sec == last_time)
            get_data_by_ipmi=0;
         else
            get_data_by_ipmi=1;
            
    }
    memset(data ,0x0, THERMAL_MAX_LENGTH);
    snprintf((char*)data, THERMAL_MAX_LENGTH-1, "%ld", new_tv.tv_sec);
    if(onlp_file_write_str((char*)data, THERMAL_CHECK_TIME)!=ONLP_STATUS_OK)
    {
        return ONLP_STATUS_E_INTERNAL;
    }
    if(get_data_by_ipmi || !thermali_sdr_file_exist()) /* Set ipmitool cmd to get all data and save to file*/
    {
        /* set ipmi cmd */
        snprintf(cmd, (THERMAL_MAX_LENGTH/2) -1, "%s > %s ", THERMAL_IPMI_SDR_CMD, THERMAL_IPMI_SDR_FILE);
        system(cmd);
        fflush(stdout);
    }    
    tag= thermal_sensor_table[tid].tag;
    
    if(tag==NULL)
        return ONLP_STATUS_E_INTERNAL; 
    
    snprintf(cmd, (THERMAL_MAX_LENGTH/2) -1, "cat %s|grep %s > %s ", THERMAL_IPMI_SDR_FILE, tag, THERMAL_IPMI_TMP_FILE);
    system(cmd);
    
    if(onlp_file_read(data, THERMAL_MAX_LENGTH, &size, THERMAL_IPMI_TMP_FILE)!=ONLP_STATUS_OK)
    {
        return ONLP_STATUS_E_INTERNAL;
    }
    p=strstr((char*)data, THERMAL_IPMI_TMP_FILE_FIND);
    if(p==NULL)
    {
        return ONLP_STATUS_E_INTERNAL;
    }
    if(((uint8_t*)p-data) < sizeof(temp)/sizeof(char))
    {
       return ONLP_STATUS_E_INTERNAL;
    }
    
    temp[0]=data[(uint8_t*)p-data-4];
    temp[1]=data[(uint8_t*)p-data-3];
    temp[2]=data[(uint8_t*)p-data-2];
    info->mcelsius=ONLPLIB_ATOI(temp) * 1000;
       
    return ONLP_STATUS_OK;
}