Re: [PATCH 4/4] Detect the WiFi/Bluetooth/3G devices available

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Dmitry, 

Thank's for your review.

æ äï2010-10-18 æ 08:55 -0700ïDmitry Torokhov æåï
> Hi,
> 
> On Mon, Oct 18, 2010 at 11:07:43PM +0800, Lee, Chun-Yi wrote:
> > +static void type_aa_dmi_decode(const struct dmi_header *header, void *dummy)
> > +{
> > +	/* We are looking for OEM-specific Type Aah */
> > +	if (header->type != ACER_DMI_DEV_TYPE_AA)
> > +		return;
> > +
> > +	type_aa = (struct hotkey_function_type_aa *) header;
> > +
> > +	printk(ACER_INFO "Function biti map for Communication Button: 0x%x\n",
> > +		type_aa->commun_func_bitmap);
> > +	if (!!(type_aa->commun_func_bitmap & ACER_WMID3_GDS_WIRELESS))
> > +		interface->capability |= ACER_CAP_WIRELESS;
> > +	if (!!(type_aa->commun_func_bitmap & ACER_WMID3_GDS_THREEG))
> > +		interface->capability |= ACER_CAP_THREEG;
> > +	if (!!(type_aa->commun_func_bitmap & ACER_WMID3_GDS_BLUETOOTH))
> > +		interface->capability |= ACER_CAP_BLUETOOTH;
> 
> The "!!" is completely redundant here.
> 

Sorry my fail, removed.

> > +}
> > +
> >  static acpi_status WMID_set_capabilities(void)
> >  {
> >  	struct acpi_buffer out = {ACPI_ALLOCATE_BUFFER, NULL};
> > @@ -844,16 +875,17 @@ static acpi_status WMID_set_capabilities(void)
> >  		return AE_ERROR;
> >  	}
> >  
> > -	/* Not sure on the meaning of the relevant bits yet to detect these */
> > -	interface->capability |= ACER_CAP_WIRELESS;
> > -	interface->capability |= ACER_CAP_THREEG;
> > +	dmi_walk(type_aa_dmi_decode, NULL);
> > +	if (!type_aa) {
> > +		interface->capability |= ACER_CAP_WIRELESS;
> > +		interface->capability |= ACER_CAP_THREEG;
> > +		if (devices & 0x10)
> > +			interface->capability |= ACER_CAP_BLUETOOTH;
> > +	}
> 
> Since you are storing "type_aa" anyways it probably would be better to
> set all capabilities here, in one place...
> 

Follow your suggestion to modified the patch like following:


>From ca67b42b36dea9b5e8d3ac8560f29622447ea470 Mon Sep 17 00:00:00 2001
From: Lee, Chun-Yi <jlee@xxxxxxxxxx>
Date: Wed, 20 Oct 2010 10:50:46 +0100
Subject: [PATCH 4/4] Detect the WiFi/Bluetooth/3G devices available

Check the Acer OEM-specific Type AA to detect the WiFi/Bluetooth/3G
devices available or not, and set the devices capability flag.

Signed-off-by: Lee, Chun-Yi <jlee@xxxxxxxxxx>
---
 drivers/platform/x86/acer-wmi.c |   50
++++++++++++++++++++++++++++++++------
 1 files changed, 42 insertions(+), 8 deletions(-)

diff --git a/drivers/platform/x86/acer-wmi.c
b/drivers/platform/x86/acer-wmi.c
index 7a17ebe..a5ac42c 100644
--- a/drivers/platform/x86/acer-wmi.c
+++ b/drivers/platform/x86/acer-wmi.c
@@ -39,6 +39,7 @@
 #include <linux/slab.h>
 #include <linux/input.h>
 #include <linux/input/sparse-keymap.h>
+#include <linux/dmi.h>
 
 #include <acpi/acpi_drivers.h>
 
@@ -138,7 +139,9 @@ struct lm_return_value {
 /*
  * GUID3 Get Device Status device flags
  */
-#define ACER_WMID3_GDS_THREEG		(1<<6)	/* 3G */
+#define ACER_WMID3_GDS_WIRELESS           (1<<0)  /* WiFi */
+#define ACER_WMID3_GDS_THREEG             (1<<6)  /* 3G */
+#define ACER_WMID3_GDS_BLUETOOTH          (1<<11) /* BT */
 
 struct wmid3_gds_input_param {	/* Get Device Status input parameter */
 	u8 function_num;	/* Function Number */
@@ -153,6 +156,15 @@ struct wmid3_gds_return_value {	/* Get Device
Status return value*/
 	u32 reserved;
 } __attribute__((packed));
 
+#define ACER_DMI_DEV_TYPE_AA		170
+
+struct hotkey_function_type_aa {
+	u8 type;
+	u8 length;
+	u16 handle;
+	u16 commun_func_bitmap;
+} __attribute__((packed));
+
 /*
  * Interface capability flags
  */
@@ -184,6 +196,7 @@ static int brightness = -1;
 static int threeg = -1;
 static int force_series;
 static bool launch_manager;
+static struct hotkey_function_type_aa *type_aa;
 
 module_param(mailled, int, 0444);
 module_param(brightness, int, 0444);
@@ -824,6 +837,18 @@ static acpi_status WMID_set_u32(u32 value, u32 cap,
struct wmi_interface *iface)
 	return WMI_execute_u32(method_id, (u32)value, NULL);
 }
 
+static void type_aa_dmi_decode(const struct dmi_header *header, void
*dummy)
+{
+	/* We are looking for OEM-specific Type Aah */
+	if (header->type != ACER_DMI_DEV_TYPE_AA)
+		return;
+
+	type_aa = (struct hotkey_function_type_aa *) header;
+
+	printk(ACER_INFO "Function biti map for Communication Button: 0x%x\n",
+		type_aa->commun_func_bitmap);
+}
+
 static acpi_status WMID_set_capabilities(void)
 {
 	struct acpi_buffer out = {ACPI_ALLOCATE_BUFFER, NULL};
@@ -844,16 +869,24 @@ static acpi_status WMID_set_capabilities(void)
 		return AE_ERROR;
 	}
 
-	/* Not sure on the meaning of the relevant bits yet to detect these */
-	interface->capability |= ACER_CAP_WIRELESS;
-	interface->capability |= ACER_CAP_THREEG;
+	dmi_walk(type_aa_dmi_decode, NULL);
+	if (type_aa) {
+		if (type_aa->commun_func_bitmap & ACER_WMID3_GDS_WIRELESS)
+			interface->capability |= ACER_CAP_WIRELESS;
+		if (type_aa->commun_func_bitmap & ACER_WMID3_GDS_THREEG)
+			interface->capability |= ACER_CAP_THREEG;
+		if (type_aa->commun_func_bitmap & ACER_WMID3_GDS_BLUETOOTH)
+			interface->capability |= ACER_CAP_BLUETOOTH;
+	} else {
+		interface->capability |= ACER_CAP_WIRELESS;
+		interface->capability |= ACER_CAP_THREEG;
+		if (devices & 0x10)
+			interface->capability |= ACER_CAP_BLUETOOTH;
+	}
 
 	/* WMID always provides brightness methods */
 	interface->capability |= ACER_CAP_BRIGHTNESS;
 
-	if (devices & 0x10)
-		interface->capability |= ACER_CAP_BLUETOOTH;
-
 	if (!(devices & 0x20))
 		max_brightness = 0x9;
 
@@ -932,7 +965,8 @@ static void __init acer_commandline_init(void)
 	 * capability isn't available on the given interface
 	 */
 	set_u32(mailled, ACER_CAP_MAILLED);
-	set_u32(threeg, ACER_CAP_THREEG);
+	if (!type_aa)
+		set_u32(threeg, ACER_CAP_THREEG);
 	set_u32(brightness, ACER_CAP_BRIGHTNESS);
 }
 
-- 
1.6.0.2



--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux