diff options
Diffstat (limited to 'dell-smm-hwmon.patch')
-rw-r--r-- | dell-smm-hwmon.patch | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/dell-smm-hwmon.patch b/dell-smm-hwmon.patch new file mode 100644 index 000000000000..84a2d5901780 --- /dev/null +++ b/dell-smm-hwmon.patch @@ -0,0 +1,67 @@ +--- drivers/hwmon/dell-smm-hwmon.c 2017-06-17 06:43:47.000000000 +0200 ++++ drivers/hwmon/dell-smm-hwmon.c.modded 2017-06-22 17:56:45.768725404 +0200 +@@ -41,6 +41,8 @@ + + #include <linux/i8k.h> + ++#define I8K_SMM _IOWR('i', 0x88, size_t) ++ + #define I8K_SMM_FN_STATUS 0x0025 + #define I8K_SMM_POWER_STATUS 0x0069 + #define I8K_SMM_SET_FAN 0x01a3 +@@ -409,6 +411,18 @@ + return (regs.eax & 0xff) == I8K_POWER_AC ? I8K_AC : I8K_BATTERY; + } + ++static int i8k_smm_raw(int eax,int ebx,int ecx,int edx,int esi,int edi) ++{ ++ struct smm_regs regs = { .eax=eax, .ebx=ebx, .ecx=ecx, .edx=edx, .esi=esi, .edi=edi}; ++ int rc; ++ ++ rc = i8k_smm(®s); ++ if (rc < 0) ++ return rc; ++ ++ return 0; ++} ++ + /* + * Procfs interface + */ +@@ -420,6 +434,7 @@ + int speed; + unsigned char buff[16]; + int __user *argp = (int __user *)arg; ++ int eax; int ebx; int ecx; int edx; int esi; int edi; + + if (!argp) + return -EINVAL; +@@ -481,6 +496,28 @@ + val = i8k_set_fan(val, speed); + break; + ++ case I8K_SMM: ++ if (copy_from_user(&eax, argp, sizeof(int))) ++ return -EFAULT; ++ ++ if (copy_from_user(&ebx, argp+1, sizeof(int))) ++ return -EFAULT; ++ ++ if (copy_from_user(&ecx, argp+2, sizeof(int))) ++ return -EFAULT; ++ ++ if (copy_from_user(&edx, argp+3, sizeof(int))) ++ return -EFAULT; ++ ++ if (copy_from_user(&esi, argp+4, sizeof(int))) ++ return -EFAULT; ++ ++ if (copy_from_user(&edi, argp+5, sizeof(int))) ++ return -EFAULT; ++ ++ val = i8k_smm_raw(eax,ebx,ecx,edx,esi,edi); ++ break; ++ + default: + return -EINVAL; + } |