diff options
Diffstat (limited to 'drivers/platform/x86/hp-wmi.c')
| -rw-r--r-- | drivers/platform/x86/hp-wmi.c | 32 | 
1 files changed, 22 insertions, 10 deletions
diff --git a/drivers/platform/x86/hp-wmi.c b/drivers/platform/x86/hp-wmi.c index 667f94bba905..bc7020e9df9e 100644 --- a/drivers/platform/x86/hp-wmi.c +++ b/drivers/platform/x86/hp-wmi.c @@ -38,6 +38,7 @@ MODULE_ALIAS("wmi:5FB7F034-2C63-45e9-BE91-3D44E2C707E4");  #define HPWMI_EVENT_GUID "95F24279-4D7B-4334-9387-ACCDC67EF61C"  #define HPWMI_BIOS_GUID "5FB7F034-2C63-45e9-BE91-3D44E2C707E4"  #define HP_OMEN_EC_THERMAL_PROFILE_OFFSET 0x95 +#define zero_if_sup(tmp) (zero_insize_support?0:sizeof(tmp)) // use when zero insize is required  /* DMI board names of devices that should use the omen specific path for   * thermal profiles. @@ -88,6 +89,7 @@ enum hp_wmi_event_ids {  	HPWMI_BACKLIT_KB_BRIGHTNESS	= 0x0D,  	HPWMI_PEAKSHIFT_PERIOD		= 0x0F,  	HPWMI_BATTERY_CHARGE_PERIOD	= 0x10, +	HPWMI_SANITIZATION_MODE		= 0x17,  };  /* @@ -220,6 +222,7 @@ static struct input_dev *hp_wmi_input_dev;  static struct platform_device *hp_wmi_platform_dev;  static struct platform_profile_handler platform_profile_handler;  static bool platform_profile_support; +static bool zero_insize_support;  static struct rfkill *wifi_rfkill;  static struct rfkill *bluetooth_rfkill; @@ -290,14 +293,16 @@ static int hp_wmi_perform_query(int query, enum hp_wmi_command command,  	struct bios_return *bios_return;  	union acpi_object *obj = NULL;  	struct bios_args *args = NULL; -	int mid, actual_outsize, ret; +	int mid, actual_insize, actual_outsize;  	size_t bios_args_size; +	int ret;  	mid = encode_outsize_for_pvsz(outsize);  	if (WARN_ON(mid < 0))  		return mid; -	bios_args_size = struct_size(args, data, insize); +	actual_insize = max(insize, 128); +	bios_args_size = struct_size(args, data, actual_insize);  	args = kmalloc(bios_args_size, GFP_KERNEL);  	if (!args)  		return -ENOMEM; @@ -374,7 +379,7 @@ static int hp_wmi_read_int(int query)  	int val = 0, ret;  	ret = hp_wmi_perform_query(query, HPWMI_READ, &val, -				   0, sizeof(val)); +				   zero_if_sup(val), sizeof(val));  	if (ret)  		return ret < 0 ? ret : -EINVAL; @@ -410,7 +415,8 @@ static int hp_wmi_get_tablet_mode(void)  		return -ENODEV;  	ret = hp_wmi_perform_query(HPWMI_SYSTEM_DEVICE_MODE, HPWMI_READ, -				   system_device_mode, 0, sizeof(system_device_mode)); +				   system_device_mode, zero_if_sup(system_device_mode), +				   sizeof(system_device_mode));  	if (ret < 0)  		return ret; @@ -497,7 +503,7 @@ static int hp_wmi_fan_speed_max_get(void)  	int val = 0, ret;  	ret = hp_wmi_perform_query(HPWMI_FAN_SPEED_MAX_GET_QUERY, HPWMI_GM, -				   &val, 0, sizeof(val)); +				   &val, zero_if_sup(val), sizeof(val));  	if (ret)  		return ret < 0 ? ret : -EINVAL; @@ -509,7 +515,7 @@ static int __init hp_wmi_bios_2008_later(void)  {  	int state = 0;  	int ret = hp_wmi_perform_query(HPWMI_FEATURE_QUERY, HPWMI_READ, &state, -				       0, sizeof(state)); +				       zero_if_sup(state), sizeof(state));  	if (!ret)  		return 1; @@ -520,7 +526,7 @@ static int __init hp_wmi_bios_2009_later(void)  {  	u8 state[128];  	int ret = hp_wmi_perform_query(HPWMI_FEATURE2_QUERY, HPWMI_READ, &state, -				       0, sizeof(state)); +				       zero_if_sup(state), sizeof(state));  	if (!ret)  		return 1; @@ -598,7 +604,7 @@ static int hp_wmi_rfkill2_refresh(void)  	int err, i;  	err = hp_wmi_perform_query(HPWMI_WIRELESS2_QUERY, HPWMI_READ, &state, -				   0, sizeof(state)); +				   zero_if_sup(state), sizeof(state));  	if (err)  		return err; @@ -848,6 +854,8 @@ static void hp_wmi_notify(u32 value, void *context)  		break;  	case HPWMI_BATTERY_CHARGE_PERIOD:  		break; +	case HPWMI_SANITIZATION_MODE: +		break;  	default:  		pr_info("Unknown event_id - %d - 0x%x\n", event_id, event_data);  		break; @@ -1007,7 +1015,7 @@ static int __init hp_wmi_rfkill2_setup(struct platform_device *device)  	int err, i;  	err = hp_wmi_perform_query(HPWMI_WIRELESS2_QUERY, HPWMI_READ, &state, -				   0, sizeof(state)); +				   zero_if_sup(state), sizeof(state));  	if (err)  		return err < 0 ? err : -EINVAL; @@ -1483,11 +1491,15 @@ static int __init hp_wmi_init(void)  {  	int event_capable = wmi_has_guid(HPWMI_EVENT_GUID);  	int bios_capable = wmi_has_guid(HPWMI_BIOS_GUID); -	int err; +	int err, tmp = 0;  	if (!bios_capable && !event_capable)  		return -ENODEV; +	if (hp_wmi_perform_query(HPWMI_HARDWARE_QUERY, HPWMI_READ, &tmp, +				 sizeof(tmp), sizeof(tmp)) == HPWMI_RET_INVALID_PARAMETERS) +		zero_insize_support = true; +  	if (event_capable) {  		err = hp_wmi_input_setup();  		if (err)  |