mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-01 06:33:07 +00:00
hwmon: (dell-smm) Speed up setting of fan speed
commit c0d79987a0
upstream.
When setting the fan speed, i8k_set_fan() calls i8k_get_fan_status(),
causing an unnecessary SMM call since from the two users of this
function, only i8k_ioctl_unlocked() needs to know the new fan status
while dell_smm_write() ignores the new fan status.
Since SMM calls can be very slow while also making error reporting
difficult for dell_smm_write(), remove the function call from
i8k_set_fan() and call it separately in i8k_ioctl_unlocked().
Tested on a Dell Inspiron 3505.
Signed-off-by: Armin Wolf <W_Armin@gmx.de>
Reviewed-by: Pali Rohár <pali@kernel.org>
Link: https://lore.kernel.org/r/20211021190531.17379-6-W_Armin@gmx.de
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
b39e0213e5
commit
83e80414c8
1 changed files with 8 additions and 4 deletions
|
@ -294,7 +294,7 @@ static int i8k_get_fan_nominal_speed(int fan, int speed)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set the fan speed (off, low, high). Returns the new fan status.
|
* Set the fan speed (off, low, high, ...).
|
||||||
*/
|
*/
|
||||||
static int i8k_set_fan(int fan, int speed)
|
static int i8k_set_fan(int fan, int speed)
|
||||||
{
|
{
|
||||||
|
@ -303,7 +303,7 @@ static int i8k_set_fan(int fan, int speed)
|
||||||
speed = (speed < 0) ? 0 : ((speed > i8k_fan_max) ? i8k_fan_max : speed);
|
speed = (speed < 0) ? 0 : ((speed > i8k_fan_max) ? i8k_fan_max : speed);
|
||||||
regs.ebx = (fan & 0xff) | (speed << 8);
|
regs.ebx = (fan & 0xff) | (speed << 8);
|
||||||
|
|
||||||
return i8k_smm(®s) ? : i8k_get_fan_status(fan);
|
return i8k_smm(®s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int i8k_get_temp_type(int sensor)
|
static int i8k_get_temp_type(int sensor)
|
||||||
|
@ -417,7 +417,7 @@ static int
|
||||||
i8k_ioctl_unlocked(struct file *fp, unsigned int cmd, unsigned long arg)
|
i8k_ioctl_unlocked(struct file *fp, unsigned int cmd, unsigned long arg)
|
||||||
{
|
{
|
||||||
int val = 0;
|
int val = 0;
|
||||||
int speed;
|
int speed, err;
|
||||||
unsigned char buff[16];
|
unsigned char buff[16];
|
||||||
int __user *argp = (int __user *)arg;
|
int __user *argp = (int __user *)arg;
|
||||||
|
|
||||||
|
@ -478,7 +478,11 @@ i8k_ioctl_unlocked(struct file *fp, unsigned int cmd, unsigned long arg)
|
||||||
if (copy_from_user(&speed, argp + 1, sizeof(int)))
|
if (copy_from_user(&speed, argp + 1, sizeof(int)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
val = i8k_set_fan(val, speed);
|
err = i8k_set_fan(val, speed);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
val = i8k_get_fan_status(val);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Reference in a new issue