Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

issues#66 Allow override of rpm check for some cases #68

Merged
merged 5 commits into from
May 24, 2019
Merged
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
69 changes: 41 additions & 28 deletions asus_fan.c
Original file line number Diff line number Diff line change
Expand Up @@ -124,12 +124,12 @@ struct asus_fan_data {


static struct asus_fan_data asus_data = {
NULL,
{-1, -1},
{false, false},
false, false,
NULL,
{-1, -1},
{false, false},
false, false,
255, 255,
10, 10,
10, 10,
"CPU Fan", "GFX Fan",
ASUS_FAN_HW_DEFAULT
};
Expand All @@ -143,6 +143,9 @@ static struct acpi_object_list params;
// force loading i.e., skip device existance check
static short force_load = false;

// allow checking but override rpm check
static short force_rpm_override = false;

// housekeeping structs
static struct asus_fan_driver asus_fan_driver = {
.name = DRIVER_NAME, .owner = THIS_MODULE,
Expand All @@ -160,6 +163,9 @@ static struct attribute_group platform_attribute_group = {
module_param(force_load, short, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
MODULE_PARM_DESC(force_load,
"Force loading of module---omit device existance check");
module_param(force_rpm_override, short, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
MODULE_PARM_DESC(force_rpm_override,
"Force loading of module---still do device existance check");

//////
////// FUNCTION PROTOTYPES
Expand Down Expand Up @@ -440,8 +446,7 @@ static int __fan_rpm(int fan) {
// acpi call
ret = acpi_evaluate_integer(NULL, "\\_SB.PCI0.LPCB.EC0.TACH", &params,
&value);

dbg_msg("|--> acpi request returned: %d", (unsigned int)ret);
dbg_msg("|--> acpi request returned: %s", acpi_format_exception(ret));
if (ret != AE_OK)
return -1;
}
Expand Down Expand Up @@ -494,9 +499,9 @@ static ssize_t _fan_set_mode(int fan, const char* buf, size_t count) {
fan_set_auto();
} else if (strncmp(buf, fan_mode_manual_string, strlen(fan_mode_manual_string)) == 0)
__fan_set_cur_state(0, (255 - asus_data.fan_minimum) >> 1);
else
err_msg("set mode", "fan id: %d | setting mode to '%s', use 'auto' or 'manual'", fan+1, buf);
else
err_msg("set mode", "fan id: %d | setting mode to '%s', use 'auto' or 'manual'", fan+1, buf);

return count;
}

Expand Down Expand Up @@ -611,7 +616,8 @@ static int fan_set_max_speed(unsigned long state, bool reset) {
ret = acpi_evaluate_integer(NULL, "\\_SB.ATKD.QMOD", &params, &value);
if (ret != AE_OK) {
err_msg("set_max_speed",
"set max fan speed(s) failed (force reset)! errcode: %d", ret);
"set max fan speed(s) failed (force reset)! errcode: %s",
acpi_format_exception(ret));
return ret;
}

Expand All @@ -632,7 +638,8 @@ static int fan_set_max_speed(unsigned long state, bool reset) {
&value);
if (ret != AE_OK) {
err_msg("set_max_speed",
"set max fan speed(s) failed (no reset) errcoded", ret);
"set max fan speed(s) failed (no reset) errcode: %s",
acpi_format_exception(ret));

return ret;
}
Expand Down Expand Up @@ -675,8 +682,8 @@ static int fan_set_auto() {
if (ret != AE_OK) {
err_msg("set_auto",
"failed reseting fan(s) to auto-mode! "
"errcode: %d - DANGER! OVERHEAT? DANGER!",
ret);
"errcode: %s - DANGER! OVERHEAT? DANGER!",
acpi_format_exception(ret));

return ret;
}
Expand Down Expand Up @@ -732,7 +739,8 @@ static ssize_t temp1_input(struct device *dev, struct device_attribute *attr,
// acpi call
ret = acpi_evaluate_integer(NULL, "\\_SB.PCI0.LPCB.EC0.TH1R", NULL, &value);
if (ret != AE_OK) {
err_msg("read_temp", "failed reading temperature, errcode: %d", ret);
err_msg("read_temp", "failed reading temperature, errcode: %s",
acpi_format_exception(ret));
return ret;
}
size = sprintf((char *)&buf, "%llu\n", value);
Expand Down Expand Up @@ -808,7 +816,7 @@ __ATTRIBUTE_GROUPS(hwmon_attr);
static int asus_fan_hwmon_init(struct asus_fan *asus) {

dbg_msg("init hwmon device");

asus->hwmon_dev = hwmon_device_register_with_groups(
&asus->platform_device->dev, "asus_fan", asus, hwmon_attr_groups);

Expand Down Expand Up @@ -924,13 +932,16 @@ static int __init fan_init(void) {
"ASUSTeK COMPUTER INC.")) {

// step by step probe available functionalities and insert into attrib grp
// @TODO TODO TODO TODO
// @TODO TODO TODO TODO

size_t temp = AE_OK;
// USE this for idx in hwmon_attrs size_t idx = 0;
// try to get RPM for first fan
rpm = __fan_rpm(0);
if (rpm == -1) {
if (force_rpm_override){
info_msg("init", "overriding rpm check: USE WITH CARE");
}
if (rpm == -1 && !force_rpm_override) {
asus_data.has_fan = false;
err_msg("init", "fan-id: 1 | failed to get rpm");
} else {
Expand All @@ -946,7 +957,7 @@ static int __init fan_init(void) {
}
// try to get RPM for second fan
rpm = __fan_rpm(1);
if (rpm == -1) {
if (rpm == -1 && !force_rpm_override) {
err_msg("init", "fan-id: 2 | failed to get rpm");
asus_data.has_gfx_fan = false;
} else {
Expand Down Expand Up @@ -981,27 +992,29 @@ static int __init fan_init(void) {
// check if reseting fan speeds works
ret = fan_set_max_speed(asus_data.max_fan_speed_default, false);
if (ret != AE_OK) {
err_msg("init", "set max speed to: '%d' failed! errcode: %d",
asus_data.max_fan_speed_default, ret);
err_msg("init", "set max speed to: '%d' failed! errcode: %s",
asus_data.max_fan_speed_default, acpi_format_exception(ret));
return -ENODEV;
}

dbg_msg("fan_set_max_speed() call succeeded, ret: %d", (unsigned int)ret);
dbg_msg("fan_set_max_speed() call succeeded, ret: %s",
acpi_format_exception(ret));

// force sane enviroment / init with automatic fan controlling
if ((ret = fan_set_auto()) != AE_OK) {
err_msg("init", "set auto-mode speed to active, failed! errcode: %d",
ret);
err_msg("init", "set auto-mode speed to active, failed! errcode: %s",
acpi_format_exception(ret));
return -ENODEV;
}

dbg_msg("fan_set_auto() call succeeded, ret: %d", (unsigned int)ret);
dbg_msg("fan_set_auto() call succeeded, ret: %s",
acpi_format_exception(ret));
}

ret = asus_fan_register_driver(&asus_fan_driver);
if (ret != AE_OK) {
err_msg("init", "set max speed to: '%d' failed! errcode: %d",
asus_data.max_fan_speed_default, ret);
err_msg("init", "set max speed to: '%d' failed! errcode: %s",
asus_data.max_fan_speed_default, acpi_format_exception(ret));
return ret;
}

Expand Down