dell-laptop: Clear buffer before each SMBIOS call
authorPali Rohár <pali.rohar@gmail.com>
Mon, 6 Jul 2015 10:08:55 +0000 (12:08 +0200)
committerDarren Hart <dvhart@linux.intel.com>
Mon, 6 Jul 2015 22:33:38 +0000 (15:33 -0700)
Make sure that before initializing SMBIOS call, the input buffer does
not contain any garbage (e.g. values from previous SMBIOS call). This
fixes problems with passing undefined/random parameters to SMBIOS
functions.

Signed-off-by: Pali Rohár <pali.rohar@gmail.com>
Signed-off-by: Darren Hart <dvhart@linux.intel.com>
drivers/platform/x86/dell-laptop.c

index ed317cc..85fbe7c 100644 (file)
@@ -311,10 +311,15 @@ static DEFINE_MUTEX(buffer_mutex);
 
 static int hwswitch_state;
 
+static void clear_buffer(void)
+{
+       memset(buffer, 0, sizeof(struct calling_interface_buffer));
+}
+
 static void get_buffer(void)
 {
        mutex_lock(&buffer_mutex);
-       memset(buffer, 0, sizeof(struct calling_interface_buffer));
+       clear_buffer();
 }
 
 static void release_buffer(void)
@@ -558,6 +563,8 @@ static int dell_rfkill_set(void *data, bool blocked)
            !(buffer->output[1] & BIT(16)))
                disable = 1;
 
+       clear_buffer();
+
        buffer->input[0] = (1 | (radio<<8) | (disable << 16));
        dell_send_request(buffer, 17, 11);
 
@@ -572,6 +579,7 @@ static void dell_rfkill_update_sw_state(struct rfkill *rfkill, int radio,
        if (status & BIT(0)) {
                /* Has hw-switch, sync sw_state to BIOS */
                int block = rfkill_blocked(rfkill);
+               clear_buffer();
                buffer->input[0] = (1 | (radio << 8) | (block << 16));
                dell_send_request(buffer, 17, 11);
        } else {
@@ -774,6 +782,7 @@ static int __init dell_setup_rfkill(void)
        get_buffer();
        dell_send_request(buffer, 17, 11);
        status = buffer->output[1];
+       clear_buffer();
        buffer->input[0] = 0x2;
        dell_send_request(buffer, 17, 11);
        hwswitch_state = buffer->output[1];