Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,15 @@ enum fan_id {
FAN_4,
FAN_5,
FAN_6,
NUM_OF_FAN
FAN_7,
FAN_8,
FAN_9,
FAN_10,
FAN_11,
FAN_12,
NUM_OF_FAN,
NUM_OF_FAN_TRAY = 6

};

enum fan_data_index {
Expand Down Expand Up @@ -86,7 +94,7 @@ struct as5916_54xks_fan_data {
struct mutex update_lock;
char valid; /* != 0 if registers are valid */
unsigned long last_updated; /* In jiffies */
unsigned char ipmi_resp[24];
unsigned char ipmi_resp[48];
struct ipmi_data ipmi;
unsigned char ipmi_tx_data[3]; /* 0: FAN id, 1: 0x02, 2: PWM */
};
Expand Down Expand Up @@ -118,6 +126,12 @@ enum as5916_54x_fan_sysfs_attrs {
FAN_ATTR(4),
FAN_ATTR(5),
FAN_ATTR(6),
FAN_ATTR(7),
FAN_ATTR(8),
FAN_ATTR(9),
FAN_ATTR(10),
FAN_ATTR(11),
FAN_ATTR(12),
NUM_OF_FAN_ATTR,
NUM_OF_PER_FAN_ATTR = (NUM_OF_FAN_ATTR/NUM_OF_FAN)
};
Expand All @@ -138,6 +152,12 @@ DECLARE_FAN_SENSOR_DEVICE_ATTR(3);
DECLARE_FAN_SENSOR_DEVICE_ATTR(4);
DECLARE_FAN_SENSOR_DEVICE_ATTR(5);
DECLARE_FAN_SENSOR_DEVICE_ATTR(6);
DECLARE_FAN_SENSOR_DEVICE_ATTR(7);
DECLARE_FAN_SENSOR_DEVICE_ATTR(8);
DECLARE_FAN_SENSOR_DEVICE_ATTR(9);
DECLARE_FAN_SENSOR_DEVICE_ATTR(10);
DECLARE_FAN_SENSOR_DEVICE_ATTR(11);
DECLARE_FAN_SENSOR_DEVICE_ATTR(12);

static struct attribute *as5916_54xks_fan_attributes[] = {
/* fan attributes */
Expand All @@ -147,6 +167,12 @@ static struct attribute *as5916_54xks_fan_attributes[] = {
DECLARE_FAN_ATTR(4),
DECLARE_FAN_ATTR(5),
DECLARE_FAN_ATTR(6),
DECLARE_FAN_ATTR(7),
DECLARE_FAN_ATTR(8),
DECLARE_FAN_ATTR(9),
DECLARE_FAN_ATTR(10),
DECLARE_FAN_ATTR(11),
DECLARE_FAN_ATTR(12),
NULL
};

Expand Down Expand Up @@ -321,6 +347,7 @@ static ssize_t show_fan(struct device *dev, struct device_attribute *da, char *b
unsigned char fid = attr->index / NUM_OF_PER_FAN_ATTR;
int value = 0;
int index = 0;
int tray_index = 0;
int present = 0;
int error = 0;

Expand All @@ -333,7 +360,8 @@ static ssize_t show_fan(struct device *dev, struct device_attribute *da, char *b
}

index = fid * FAN_DATA_COUNT; /* base index */
present = !data->ipmi_resp[index + FAN_PRESENT];
tray_index = (fid % NUM_OF_FAN_TRAY) * FAN_DATA_COUNT;
present = !data->ipmi_resp[tray_index + FAN_PRESENT];

switch (attr->index) {
case FAN1_PRESENT:
Expand All @@ -342,22 +370,40 @@ static ssize_t show_fan(struct device *dev, struct device_attribute *da, char *b
case FAN4_PRESENT:
case FAN5_PRESENT:
case FAN6_PRESENT:
value = !data->ipmi_resp[index + FAN_PRESENT];
case FAN7_PRESENT:
case FAN8_PRESENT:
case FAN9_PRESENT:
case FAN10_PRESENT:
case FAN11_PRESENT:
case FAN12_PRESENT:
value = !data->ipmi_resp[tray_index + FAN_PRESENT];
break;
case FAN1_PWM:
case FAN2_PWM:
case FAN3_PWM:
case FAN4_PWM:
case FAN5_PWM:
case FAN6_PWM:
value = (data->ipmi_resp[index + FAN_PWM] + 1) * 625 / 100;
case FAN7_PWM:
case FAN8_PWM:
case FAN9_PWM:
case FAN10_PWM:
case FAN11_PWM:
case FAN12_PWM:
value = (data->ipmi_resp[tray_index + FAN_PWM] + 1) * 625 / 100;
break;
case FAN1_INPUT:
case FAN2_INPUT:
case FAN3_INPUT:
case FAN4_INPUT:
case FAN5_INPUT:
case FAN6_INPUT:
case FAN7_INPUT:
case FAN8_INPUT:
case FAN9_INPUT:
case FAN10_INPUT:
case FAN11_INPUT:
case FAN12_INPUT:
value = (int)data->ipmi_resp[index + FAN_SPEED0] |
(int)data->ipmi_resp[index + FAN_SPEED1] << 8;
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,23 +34,41 @@ enum fan_id {
FAN_4_ON_FAN_BOARD,
FAN_5_ON_FAN_BOARD,
FAN_6_ON_FAN_BOARD,
FAN_7_ON_FAN_BOARD,
FAN_8_ON_FAN_BOARD,
FAN_9_ON_FAN_BOARD,
FAN_10_ON_FAN_BOARD,
FAN_11_ON_FAN_BOARD,
FAN_12_ON_FAN_BOARD,
FAN_1_ON_PSU_1,
FAN_1_ON_PSU_2,
};

#define MAX_FAN_SPEED 25500
#define MAX_FRONT_FAN_SPEED 21000
#define MAX_REAR_FAN_SPEED 18000

#define MAX_PSU_FAN_SPEED 25500

#define CHASSIS_FAN_INFO(fid) \
{ \
{ ONLP_FAN_ID_CREATE(FAN_##fid##_ON_FAN_BOARD), "Chassis Fan - "#fid, 0 },\
{ ONLP_FAN_ID_CREATE(FAN_##fid##_ON_FAN_BOARD), "Chassis Fan - "#fid" Front", 0 },\
0x0,\
ONLP_FAN_CAPS_SET_PERCENTAGE | ONLP_FAN_CAPS_GET_RPM | ONLP_FAN_CAPS_GET_PERCENTAGE,\
0,\
0,\
ONLP_FAN_MODE_INVALID,\
}

#define CHASSIS_REAR_FAN_INFO(fid, tid) \
{ \
{ ONLP_FAN_ID_CREATE(FAN_##fid##_ON_FAN_BOARD), "Chassis Fan - "#tid" Rear", 0 },\
0x0,\
ONLP_FAN_CAPS_SET_PERCENTAGE | ONLP_FAN_CAPS_GET_RPM | ONLP_FAN_CAPS_GET_PERCENTAGE,\
0,\
0,\
ONLP_FAN_MODE_INVALID,\
}

#define PSU_FAN_INFO(pid, fid) \
{ \
{ ONLP_FAN_ID_CREATE(FAN_##fid##_ON_PSU_##pid), "PSU "#pid" - Fan "#fid, 0 },\
Expand All @@ -70,6 +88,13 @@ onlp_fan_info_t finfo[] = {
CHASSIS_FAN_INFO(4),
CHASSIS_FAN_INFO(5),
CHASSIS_FAN_INFO(6),
CHASSIS_REAR_FAN_INFO(7, 1),
CHASSIS_REAR_FAN_INFO(8, 2),
CHASSIS_REAR_FAN_INFO(9, 3),
CHASSIS_REAR_FAN_INFO(10, 4),
CHASSIS_REAR_FAN_INFO(11, 5),
CHASSIS_REAR_FAN_INFO(12, 6),

PSU_FAN_INFO(1, 1),
PSU_FAN_INFO(2, 1)
};
Expand All @@ -85,6 +110,7 @@ static int
_onlp_fani_info_get_fan(int fid, onlp_fan_info_t* info)
{
int value, ret;
int max_fan_speed;

/* get fan present status
*/
Expand Down Expand Up @@ -112,8 +138,17 @@ _onlp_fani_info_get_fan(int fid, onlp_fan_info_t* info)
AIM_LOG_ERROR("Unable to read status from (%s)\r\n", FAN_BOARD_PATH);
return ONLP_STATUS_E_INTERNAL;
}
/* get max fan speed
*/
if (fid < 7) {
max_fan_speed = MAX_FRONT_FAN_SPEED;
}
else {
max_fan_speed = MAX_REAR_FAN_SPEED;
}

info->rpm = value;
info->percentage = (info->rpm * 100)/MAX_FAN_SPEED;
info->percentage = (info->rpm * 100)/max_fan_speed;


/* get fan fault status
Expand Down Expand Up @@ -189,6 +224,12 @@ onlp_fani_info_get(onlp_oid_t id, onlp_fan_info_t* info)
case FAN_4_ON_FAN_BOARD:
case FAN_5_ON_FAN_BOARD:
case FAN_6_ON_FAN_BOARD:
case FAN_7_ON_FAN_BOARD:
case FAN_8_ON_FAN_BOARD:
case FAN_9_ON_FAN_BOARD:
case FAN_10_ON_FAN_BOARD:
case FAN_11_ON_FAN_BOARD:
case FAN_12_ON_FAN_BOARD:
rc =_onlp_fani_info_get_fan(fid, info);
break;
default:
Expand Down Expand Up @@ -221,7 +262,7 @@ onlp_fani_percentage_set(onlp_oid_t id, int p)
return ONLP_STATUS_E_INVALID;
}

if (fid < FAN_1_ON_FAN_BOARD || fid > FAN_6_ON_FAN_BOARD) {
if (fid < FAN_1_ON_FAN_BOARD || fid > FAN_12_ON_FAN_BOARD) {
return ONLP_STATUS_E_INVALID;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@

#include "x86_64_accton_as5916_54xks_log.h"

#define CHASSIS_FAN_COUNT 6
#define CHASSIS_FAN_COUNT 12
#define CHASSIS_THERMAL_COUNT 5
#define CHASSIS_LED_COUNT 5
#define CHASSIS_PSU_COUNT 2
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ onlp_sysi_oids_get(onlp_oid_t* table, int max)
*e++ = ONLP_PSU_ID_CREATE(i);
}

/* 6 Fans on the chassis */
/* 12 Fans on the chassis */
for (i = 1; i <= CHASSIS_FAN_COUNT; i++) {
*e++ = ONLP_FAN_ID_CREATE(i);
}
Expand Down