Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 30 Jun 2009 22:46:32 +0200
From:      Michael Gmelin <freebsdusb@bindone.de>
To:        Rui Paulo <rpaulo@freebsd.org>, freebsd-acpi@freebsd.org
Cc:        "Paul B. Mahol" <onemda@gmail.com>
Subject:   Patches to correct my mistake (acpi_hp/acpi_wmi)
Message-ID:  <4A4A79A8.2030807@bindone.de>

next in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------040508080709060705030600
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

Hi Rui,

find attached two patches to bring the source back in synch.

Sorry again for causing extra work and confusion (at least I figured out
why this happened, it was a bad idea to call the original version .orig,
so patch overwrote these... won't happen again).

Thanks
Michael

--------------040508080709060705030600
Content-Type: application/octet-stream;
 name="acpi_hp_patches.tgz"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="acpi_hp_patches.tgz"

H4sIAAp5SkoAA+1be3fayBXvv+JTTN3TLFiAJfG2m2SJTWK6ju3aOG5PNkdHFgOoERKrR7C7
8XfvvfOQBAiwN2n3tIc5SUAzd+7cx2/u3Dsilj1zzMmsWq/OrMie/OE/0TRNa9brBD+hLX9q
ek0ziK4bhlFv1ZqtGoGeVr35B6L9R6RZanEYWQGIEvh+tIluPqHU3TC+rNz/SKtUKiScWAE9
mFoe/q0fWAkk7DgIqBcphqZ1KlqzUtOIYRzq+mGtXa0ZRrtR73TaRNVgvKCq6lpGSwxqrUPD
qLabHa3GbMUZ/PgjqejNTlmHDvw0muTHHwvkbzENHsjEGU9oGJE3/YtrAiJBl+OB5zybVslg
4oQE/twF/mfqEd8jsPwDOb0kU39I3ZBY3rBAogkN6MgPKBk6oXXn0iG5eyBDOrJiN6oWSLXn
FtRqPyIfLOj9UpXSa9UvNLjzQ1pQiwG1hhXfcx9KBfWaRoSPONEDcekX6nImpHo5K5ATzjgk
sCSuHVISPoR2BOLYlkfu4BEYOB6Q/z0QQ1Xb90akQaogyPWEnHavTm67V72COpjA6tXzaUEd
Bg4sSiYWqEtB2YDO/CACXSKfhPEMH3A1WNV1/bnjjYE0GM7BL4fAAQRTq29cUrmLXReWr9j+
dGbZEVO8oILFjrHjF9Ju6Npspde7b9XQ1dxUyAzMFU782B2SuR98Zqb3wU0wxbVmkT8LQRgr
IiNqRTFY3iK37/vgP25+dCYaHlR92z/rXcNXlC2yxqQyd4bRhOxVLy1yAN44mMzsqbMHFLDi
Ql/h995B/9tNotz+3eI/IKrRkPG/ruk6xH/4aO3i/3+jsfj/ELL9xLAggshBCoy8UwCPgEND
q7bhEGgYDV3LngIb2SVsjA7RW4d6+7CmVTtG26jXjVo7cxZ0jHKTqPBvi50Df4JI7XiUdI8v
++bppfm+Nzi9ODFPT04GvfeXCjS9vZbq5OL4J0bSWUty/L5vnvQG3f4Z0BmgyRq6D72rNxfX
PeRm6AWS8kOS7vVP5u1t99y8ODe7/Sug0e51johVwjdnN73BxcXgNKEWxPwoNHTUH7aFMIDi
gA8UCPwmRL0jRTnYJyAzeXfTP4FoH3tDsn8gqYDCHNLIctyUkD/Lg0phjRBSxGMIDkJ+ApWQ
icqZiGOPc7CGQ+BwF4+JH0ezOMosNnctz+Qx3XRGZmANHd/0vSOctsB8eY44hzOTRqONs+7c
mEawTydPXg4tabQaaEmj1SrrBjclV53sFW04nNKzpLRXxkE4+m0ahorykhwPzgb/uOyZ/fMB
+YpPb8+678yrWyB7LIOhfoW/StWzphSp94TJ9sqse0qjiT/EgXwMcaohDe3AmUWO7yGLD4sp
hWD1BIlUlAjwqPxKzm/OzspEK8sv5LFAHo+YMWq1OsuwanUDP9EaEAAjxyZffGeoFIjYqCb9
YrmxFVHTiiO0LzqnGEZBbEcJTeiPIpvsh3apQH4tVNBJZO4E1AVZj8SzR+cm8zYuEy90p+5c
HZvPM1M4IFPO/HmFc9q9yjkzJcsZ7SX5kpep8vfUNuewiSA/glxyWAztyqs521RfGEQQPdKp
kNKYt/2rHmQw1+bxxfv33fMTZn2tJGxeb8AeVmuNWrnN8ZcnIyxf0Y/EYEZI2Q/GgdUdm5qz
AHQZLchE9m6lFmIW5MN/vv/Z2ysnHikxK4wImyiQWkJ0fTNbkrBdu6/Jixfkj8XE1C/ScHkG
4fKqe9K/ABAxuwIlWUvZO+++OeudlEoAOPDD0xzGnNDRGfDrmlaGHIOHgSUIganXLsxjNFOW
aVtcmvtaP9RK5I8vCVsZojQbg31jOYEQVskZIrkTXmuHOu6GTb5hwyyKoXyYeiM7e2J5Y14O
/NkheynRsrzMk04JXZkQ5UhSXt7ADEVKLo42SquKNbaLvEi5Se4FyicKj35gqLkJaXDuR87o
obh3egmARgYgytClbIszptq9ral5HmWMHhmy6lq93AFg6fX0fEkQsrzLV2CSEuRjZXmcrJ/6
OhV7O3zIXpJ/LDkiAxrhk1xNNgFoWbJybrz/Fihx+darkNI8VYdkxlolUpI12jwXW8MUWysw
yAJMbzCAGe2lyDXfGrlu10au+YbINV8fuea5kWv+rMgF2/92zfbPYm9Zzo0Ra7686effJWKJ
aLVe3MVgtVHmFYBtEfq5aKKZSDXPj1R1DROReqMha4q8hE6BhO5oaUwM8O9sFExku1YYmpjN
c5OxZ5nEWcFYZl2gBj5grsVyprc358eDPsBycNU97hWLYNKA7JeKMRDPosCMSsQ0R7FnmyZK
z0VvapjE11up6LmQ1I7EUFoCLff6wZAGZuj8i4rUSlUyuJDUUzqFaqK4MIlldTjRHy0OlJiV
hXVkHimgNaaRObOwguZWLEJ/olYDckLwSKPZEWqJZBwskabiqIY9KQp+Ed5OZhLugEbS0Owr
UX6jnXPBgNk9KJTRJasEU6Gt4bmnNjpNef7lKcFrsuL1P66hZjFPIUc+612Z3at310KXdasL
QHEMcZV9d5g+KTQIfOF63oEqYTkln3kdxvy8Fu4LSJUPch35nFlJdqVryR652nP8sAL3ptZG
XDSN+gZccJOiU9YWZmWcQbhIGcxAbZdVI3l8xhZdQA6bc9276nfPzO41fBkUJzOBjybgAnZu
SzfgEGM717bCDdcvhxivuESL+5gFsruAWp9R7jwmoq4+xFCbcpD3GNgrpkP1znSFDRMHHikC
sZC2pbXQ8C2jKWu172kPLOLwHOIOwTN3rRlKolh7AilUTECMh8BaYmGZEquZgjGGqGCMBz/3
OS6E3TCRYx7PfWaORoc5r9WRzkuPsNxYigSP7N/EU1tdtRR+xZbLOItxfBRbo9WBPLtB1Lbe
ws91m2OlIkzCZ5KG4E4Qo/zBgdMkcCLKnxAUfMvc9M8HNYNAFLem4cfGJxDyVzhwG406lPYQ
wZN0JOHw2jjUM91ylRzC+qGW6YY1H4+SFfchuIexG2EPs9/Fm7/2jgdk37/7Z9L35ubt294V
SMykEqcTF7VUJi/4N/K4TO/HEZvA+rpnZxfH3UFPDPKLI5yjCkkUZb3yMgVa1F32JqqvkDHN
ZS9XXC63ryhSczWrucI1V7OaKNs1X6R/muZEHq4gmQjmuEt4NIBNd3PV4w94/dP70D27QS7H
wK+YACx7Q4Qvu0y8rOXXEW2DxZl2QxNxJkGxaTqei/fEGGP2U0CzszeCPHVsjgJ/aoIlqB0V
M9bZJ9BX5vPIMIx4rgKIx49SEvxd6o2jiYz9yRPmdGH0UfskMyBUFxhWXg0eZrAvRUxhl4/X
g6v++TtRHHAOMIsRXzMRq2esU9V5VG3XW+VaDdRt6eUazxHIPhlMKLlzffsz4XEYsmpIl9NV
LrvHP3Xf9ch84tgT+Z7R9j04DLzFl5yMHRQ/U8iywkP21PeG9J68p5aH4xXo0dgOu6ZRhK9F
z60pJR+5QT+xcZ2Nf7CgEiNFBlsSUgRRRCE+WGFEAyf8TKZW8Dlky4sXI4jdGOy7wMxgzC4t
MMzciSZC4DvHD8nEoYEV2JOHxRk1NqMfXlFreOG5MAru4UN1NnTihDPXeuh7N/3MWIONXdFf
Yij/wsvJQ+jYlnsJ36ln0wxhU6j/S8wG8LU0i95ojGURQ26kEE6Fu9B34wjVSzi1GCfuYeKP
yCygAa4fwq4OIXwHVlb4NrdEhkZfVLyzQmAsOUZbJqgtETDXHWfdQYqgDzt4QEDqxdPUP+SA
dJmMAripqDrzWg+oF8aSCYxzyElro5Eg5etZ+DIfIXefyqYmqFsLPDUB3vfBnppg7xnwUxP4
5SFQTRCYC0I1AeF2HKoJDr8DFNUEik9EI05oV6tt9WPr0wKczhdN0WEE34wo5lpN8NoKKkat
IzUAawuuCHsnlpf14CGBeRkLqzkpD0TPMBInxDh2AFt44LaTH9OUCzxfYQRwUN7Fo+QUgUf8
xqdgchIKB/J0iSfpImPalq087Qzm55WTlH1xBBaUTyLpNBoN2YPvRtExoSwGWZYuzkzQZESD
jzjrk5yAxHcWLw22ZRlPzZdYEegk36TM4jErtJq+0c1ILV++ovNRNtmLuihKrjJiSqoNpvR8
YXmWc1fKw13hh3K7BbmH2tGhfq+J5F4WRJVe/xxympIsldQ0G7i07M/WmFaP/RhM+OolBPik
/lgg6InzGCBdXU0hAEO9d70rzCFUmQEmGoNY63n1vYiOaVBl0RK1f2TJy8E+wJZCMgGSRviL
sCn+oAVCgB8HhN7PIFmysFIPCS4yxPs815k6+Nupz54/d+lwTHFfVTaoCnZiuiJFKu8rCEMv
XpC8KRmtVIjzMJlsMJSWZyiea22bqv/2qcbmqQwqUMMbGv4aI33HsZ5hfYO/twnT+Ia5zS1z
K78Ro9vmtjcbcNPUzm+fqm9BC59bLK6ZvQUwG1fORcxmY8ktJMYUvaauZ76ww0vk61epzHN0
eaY8xjp59GV5SmIOr6iSsCsLoGeZ+jUr/WH1Q51dRK83ehJINvvtSSzUbQbL4ZIX0ATdE1dc
sCKfyqN/1oQL8TJ5ZSUu8l8kFXV6+QVV4uD0OnlPFQWubUVFmbpsKZ75T4FerIuL5cXkgWdC
pbL4eVod38apnXpd/pBGnvZEfUnqNSY8lK4uZI4oFvWEVCXyF5HKlHJl3iN7ZZlsldi7NDRB
aiM4howSw81zta3IH32RNSoDVMsZqnzt+XgqoPp8QdQNZk+BvmJ+Pk+IoS5KsWB9Q/9e1meu
rjXxrqaTvjbjLhFJlfMJffLDzz//wDkqmX7yw8EPT0Jx7/zm/bWIKAoWREUHZkunq/oRcUDw
BASYTKjMBCu0bOPkUcu723yzS+KV/EpOU1VH7jJlm3+Z1doaSy87HXHDlS1akksu9qpQcJvQ
ezPyYSQq8jqF1yb70O94slLZv3uIKFhYFBqxFzpjdnOEBQArFRa6XB8Bmu1SJs5KF1Jh0jxB
Q7LlIBdD1V0/6dA/cTToGibM+J8UNKOT8xu6woI+Q2r7Q1rkBRXHceY9TFLaJHdoAquCUl4F
g9qx46VPMRhA5v3O4k1eDg9+q9pWOA/5xHnI2/8iVLdRibM4MEr7BmJacPz6VX77CxS0JXFb
J19V6RpEwDaaoyl/35ZXmbIfWJr+DAQTL6tsqEj3SXITP3KtcSjeV4HJ2OZHsmiC/+uC7EfD
p70olC9Et7/r469LhQFADlSZFXKgMDxWXoVQNQdfdNlfylZIvTfdk7clCYlWk5ug09hqAtv1
Q/p/aAPwP9aRqq4bDVlQrrcC6pM1AtlnRhA9sePDRsdwLK3yRL1nPpqvTNwyN4HcMPJ+I+2Z
Wvf9pc6akVxpJPsSYpSo2WG7N5JLBez/KAc/Pc3Uy7LJjQiHQyJI2rcgX/oaRkkllHxXZJSX
BcqylN/q59/7Pyvs2q7t2q7t2q7t2q7t2q7t2q7t2q7t2q7t2q7t2q7t2q7t2pPavwGJMyFs
AFAAAA==
--------------040508080709060705030600
Content-Type: text/plain;
 name="acpi_hp.4.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="acpi_hp.4.patch"

--- share/man/man4/acpi_hp.4.current	2009-06-30 22:11:38.322854998 +0200
+++ share/man/man4/acpi_hp.4	2009-06-30 22:37:22.869030000 +0200
@@ -169,10 +169,26 @@
 Query highest BIOS entry instance. This is broken on many HP models and
 therefore disabled by default.
 .El
+.It Va dev.acpi_hp.0.verbose
+(read-only)
+Set verbosity level
 .El
 .Pp
 Defaults for these sysctls can be set in
 .Xr sysctl.conf 5 .
+.Sh HARDWARE
+The
+.Nm
+driver has been reported to support the following hardware:
+.Pp
+.Bl -bullet -compact
+.It
+HP Compaq 8510p
+.It
+HP Compaq nx7300
+.El
+.Pp
+It should work on most HP laptops that feature a WMI enabled BIOS.
 .Sh FILES
 .Bl -tag -width ".Pa /dev/hpcmi"
 .It Pa /dev/hpcmi

--------------040508080709060705030600
Content-Type: text/plain;
 name="acpi_hp.c.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="acpi_hp.c.patch"

--- sys/dev/acpi_support/acpi_hp.c.current	2009-06-30 21:38:20.828552510 +0200
+++ sys/dev/acpi_support/acpi_hp.c	2009-06-29 17:18:30.928244238 +0200
@@ -92,6 +92,7 @@
 #define ACPI_HP_METHOD_HDDTEMP				18
 #define ACPI_HP_METHOD_DOCK				19
 #define ACPI_HP_METHOD_CMI_DETAIL			20
+#define ACPI_HP_METHOD_VERBOSE				21
 
 #define HP_MASK_WWAN_ON_AIR			0x1000000
 #define HP_MASK_BLUETOOTH_ON_AIR		0x10000
@@ -121,6 +122,7 @@
 	int		has_cmi;		/* CMI GUID found */
 	int		cmi_detail;		/* CMI detail level
 						   (set by sysctl) */
+	int		verbose;		/* add debug output */
 	int		wlan_enable_if_radio_on;	/* set by sysctl */
 	int		wlan_disable_if_radio_off;	/* set by sysctl */
 	int		bluetooth_enable_if_radio_on;	/* set by sysctl */
@@ -275,6 +277,12 @@
 				    "(cat /dev/hpcmi)",
 		.access		= CTLTYPE_INT | CTLFLAG_RW
 	},
+	{
+		.name		= "verbose",
+		.method		= ACPI_HP_METHOD_VERBOSE,
+		.description	= "Verbosity level",
+		.access		= CTLTYPE_INT | CTLFLAG_RW
+	},
 
 	{ NULL, 0, NULL, 0 }
 };
@@ -334,10 +342,10 @@
 static void	
 acpi_hp_evaluate_auto_on_off(struct acpi_hp_softc *sc)
 {
-	int wireless;
-	int new_wlan_status;
-	int new_bluetooth_status;
-	int new_wwan_status;
+	int	wireless;
+	int	new_wlan_status;
+	int	new_bluetooth_status;
+	int	new_wwan_status;
 
 	wireless = acpi_hp_exec_wmi_command(sc->wmi_dev,
 		    ACPI_HP_WMI_WIRELESS_COMMAND, 0, 0);
@@ -345,7 +353,8 @@
 	new_bluetooth_status = -1;
 	new_wwan_status = -1;
 
-	device_printf(sc->wmi_dev, "Wireless status is %x\n", wireless);
+	if (sc->verbose)
+		device_printf(sc->wmi_dev, "Wireless status is %x\n", wireless);
 	if (sc->wlan_disable_if_radio_off && !(wireless & HP_MASK_WLAN_RADIO)
 	    &&  (wireless & HP_MASK_WLAN_ENABLED)) {
 		acpi_hp_exec_wmi_command(sc->wmi_dev,
@@ -391,10 +400,11 @@
 		new_wlan_status = (wireless & HP_MASK_WLAN_ON_AIR);
 		if ((new_wlan_status?1:0) != sc->was_wlan_on_air) {
 			sc->was_wlan_on_air = sc->was_wlan_on_air?0:1;
-			device_printf(sc->wmi_dev,
-			    "WLAN on air changed to %i "
-			    "(new_wlan_status is %i)\n",
-			    sc->was_wlan_on_air, new_wlan_status);
+			if (sc->verbose)
+				device_printf(sc->wmi_dev,
+			    	    "WLAN on air changed to %i "
+			    	    "(new_wlan_status is %i)\n",
+			    	    sc->was_wlan_on_air, new_wlan_status);
 			acpi_UserNotify("HP", sc->handle,
 			    0xc0+sc->was_wlan_on_air);
 		}
@@ -404,9 +414,12 @@
 		if ((new_bluetooth_status?1:0) != sc->was_bluetooth_on_air) {
 			sc->was_bluetooth_on_air = sc->was_bluetooth_on_air?
 			    0:1;
-			device_printf(sc->wmi_dev, "BLUETOOTH on air changed"
-			    " to %i (new_bluetooth_status is %i)\n",
-			    sc->was_bluetooth_on_air, new_bluetooth_status);
+			if (sc->verbose)
+				device_printf(sc->wmi_dev,
+				    "BLUETOOTH on air changed"
+				    " to %i (new_bluetooth_status is %i)\n",
+				    sc->was_bluetooth_on_air,
+				    new_bluetooth_status);
 			acpi_UserNotify("HP", sc->handle,
 			    0xd0+sc->was_bluetooth_on_air);
 		}
@@ -415,9 +428,11 @@
 		new_wwan_status = (wireless & HP_MASK_WWAN_ON_AIR);
 		if ((new_wwan_status?1:0) != sc->was_wwan_on_air) {
 			sc->was_wwan_on_air = sc->was_wwan_on_air?0:1;
-			device_printf(sc->wmi_dev, "WWAN on air changed to %i"
-			    " (new_wwan_status is %i)\n",
-			    sc->was_wwan_on_air, new_wwan_status);
+			if (sc->verbose)
+				device_printf(sc->wmi_dev,
+				    "WWAN on air changed to %i"
+			    	    " (new_wwan_status is %i)\n",
+				    sc->was_wwan_on_air, new_wwan_status);
 			acpi_UserNotify("HP", sc->handle,
 			    0xe0+sc->was_wwan_on_air);
 		}
@@ -440,7 +455,7 @@
 	struct acpi_hp_softc	*sc;
 	struct acpi_softc	*acpi_sc;
 	devclass_t		wmi_devclass;
-	int arg;
+	int			arg;
 
 	ACPI_FUNCTION_TRACE((char *)(uintptr_t) __func__);
 
@@ -460,6 +475,7 @@
 	sc->was_wwan_on_air = 0;
 	sc->cmi_detail = 0;
 	sc->cmi_order_size = -1;
+	sc->verbose = 0;
 	memset(sc->cmi_order, 0, sizeof(sc->cmi_order));
 	acpi_sc = acpi_device_get_parent_softc(dev);
 
@@ -553,7 +569,7 @@
 static int
 acpi_hp_detach(device_t dev)
 {
-	int ret;
+	int	ret;
 	
 	ACPI_FUNCTION_TRACE((char *)(uintptr_t) __func__);
 	struct acpi_hp_softc *sc = device_get_softc(dev);
@@ -580,12 +596,12 @@
 static int
 acpi_hp_sysctl(SYSCTL_HANDLER_ARGS)
 {
-	struct acpi_hp_softc *sc;
-	int	arg;
-	int oldarg;
-	int	error = 0;
-	int	function;
-	int	method;
+	struct acpi_hp_softc	*sc;
+	int			arg;
+	int			oldarg;
+	int			error = 0;
+	int			function;
+	int			method;
 	
 	ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 
@@ -608,7 +624,7 @@
 static int
 acpi_hp_sysctl_get(struct acpi_hp_softc *sc, int method)
 {
-	int val = 0;
+	int	val = 0;
 
 	ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 	ACPI_SERIAL_ASSERT(hp);
@@ -696,6 +712,9 @@
 	case ACPI_HP_METHOD_CMI_DETAIL:
 		val = sc->cmi_detail;
 		break;
+	case ACPI_HP_METHOD_VERBOSE:
+		val = sc->verbose;
+		break;
 	}
 
 	return (val);
@@ -707,7 +726,8 @@
 	ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 	ACPI_SERIAL_ASSERT(hp);
 
-	if (method != ACPI_HP_METHOD_CMI_DETAIL)
+	if (method != ACPI_HP_METHOD_CMI_DETAIL &&
+	    method != ACPI_HP_METHOD_VERBOSE)
 		arg = arg?1:0;
 
 	if (arg != oldarg) {
@@ -759,6 +779,9 @@
 			    sc->cmi_order_size = -1;
 			}
 			break;
+		case ACPI_HP_METHOD_VERBOSE:
+			sc->verbose = arg;
+			break;
 		}
 	}
 
@@ -794,15 +817,15 @@
 static int
 acpi_hp_exec_wmi_command(device_t wmi_dev, int command, int is_write, int val)
 {
-	UINT32 params[5] = { 0x55434553,
-			     is_write?2:1,
-			     command,
-			     is_write?4:0,
-			     val};
-	UINT32* result;
-	ACPI_OBJECT *obj;
-	ACPI_BUFFER in = { sizeof(params), &params };
-	ACPI_BUFFER out = { ACPI_ALLOCATE_BUFFER, NULL };
+	UINT32		params[5] = { 0x55434553,
+			    is_write?2:1,
+			    command,
+			    is_write?4:0,
+			    val};
+	UINT32*		result;
+	ACPI_OBJECT	*obj;
+	ACPI_BUFFER	in = { sizeof(params), &params };
+	ACPI_BUFFER	out = { ACPI_ALLOCATE_BUFFER, NULL };
 	int retval;
 	
 	if (ACPI_FAILURE(ACPI_WMI_EVALUATE_CALL(wmi_dev, ACPI_HP_WMI_BIOS_GUID,
@@ -827,7 +850,8 @@
 
 static __inline char*
 acpi_hp_get_string_from_object(ACPI_OBJECT* obj, char* dst, size_t size) {
-	int length;
+	int	length;
+
 	dst[0] = 0;
 	if (obj->Type == ACPI_TYPE_STRING) {
 		length = obj->String.Length+1;
@@ -847,33 +871,32 @@
  * The block returned is ACPI_TYPE_PACKAGE which should contain the following
  * elements:
  * Index Meaning
- * 0     Setting Name [string]
- * 1     Value (comma separated, asterisk marks the current value) [string]
- * 2     Path within the bios hierarchy [string]
- * 3     IsReadOnly [int]
- * 4     DisplayInUI [int]
- * 5     RequiresPhysicalPresence [int]
- * 6     Sequence for ordering within the bios settings (absolute) [int]
- * 7     Length of prerequisites array [int]
- * 8     Prerequisite1 [string]
- * 9     Prerequisite2 [string]
- * 10    Prerequisite3 [string]
- * 11    Current value (in case of enum) [string] / Array length [int]
- * 12    Enum length [int] / Array values
- * 13ff  Enum value at index x [string]
+ * 0        Setting Name [string]
+ * 1        Value (comma separated, asterisk marks the current value) [string]
+ * 2        Path within the bios hierarchy [string]
+ * 3        IsReadOnly [int]
+ * 4        DisplayInUI [int]
+ * 5        RequiresPhysicalPresence [int]
+ * 6        Sequence for ordering within the bios settings (absolute) [int]
+ * 7        Length of prerequisites array [int]
+ * 8..8+[7] PrerequisiteN [string]
+ * 9+[7]    Current value (in case of enum) [string] / Array length [int]
+ * 10+[7]   Enum length [int] / Array values
+ * 11+[7]ff Enum value at index x [string]
  */
 static int
 acpi_hp_get_cmi_block(device_t wmi_dev, const char* guid, UINT8 instance,
     char* outbuf, size_t outsize, UINT32* sequence, int detail)
 {
-	ACPI_OBJECT *obj;
-	ACPI_BUFFER out = { ACPI_ALLOCATE_BUFFER, NULL };
-	int i;
-	int outlen;
-	int size = 255;
-	int has_enums = 0;
-	char string_buffer[size];
-	int enumbase;
+	ACPI_OBJECT	*obj;
+	ACPI_BUFFER	out = { ACPI_ALLOCATE_BUFFER, NULL };
+	int		i;
+	int		outlen;
+	int		size = 255;
+	int		has_enums = 0;
+	int		valuebase = 0;
+	char		string_buffer[size];
+	int		enumbase;
 
 	outlen = 0;
 	outbuf[0] = 0;	
@@ -887,8 +910,13 @@
 		return (-EINVAL);
 	}
 
+	if (obj->Package.Count >= 8 &&
+	    obj->Package.Elements[7].Type == ACPI_TYPE_INTEGER) {
+	    valuebase = 8 + obj->Package.Elements[7].Integer.Value;
+	}
+
 	/* check if this matches our expectations based on limited knowledge */
-	if (obj->Package.Count >= 13 &&
+	if (valuebase > 7 && obj->Package.Count > valuebase + 1 &&
 	    obj->Package.Elements[0].Type == ACPI_TYPE_STRING &&
 	    obj->Package.Elements[1].Type == ACPI_TYPE_STRING &&
 	    obj->Package.Elements[2].Type == ACPI_TYPE_STRING &&
@@ -896,20 +924,12 @@
 	    obj->Package.Elements[4].Type == ACPI_TYPE_INTEGER &&
 	    obj->Package.Elements[5].Type == ACPI_TYPE_INTEGER &&
 	    obj->Package.Elements[6].Type == ACPI_TYPE_INTEGER &&
-	    obj->Package.Elements[7].Type == ACPI_TYPE_INTEGER &&
-	    obj->Package.Elements[8].Type == ACPI_TYPE_STRING &&
-	    obj->Package.Elements[9].Type == ACPI_TYPE_STRING &&
-	    obj->Package.Elements[10].Type == ACPI_TYPE_STRING &&
-	    ((obj->Package.Elements[11].Type == ACPI_TYPE_STRING &&
-	    obj->Package.Elements[12].Type == ACPI_TYPE_INTEGER &&
-	    obj->Package.Count >=
-	    	13+obj->Package.Elements[12].Integer.Value) ||
-	    (obj->Package.Elements[11].Type == ACPI_TYPE_INTEGER &&
-	    obj->Package.Count >=
-	    	12+obj->Package.Elements[11].Integer.Value))
-	    ) {
-		enumbase = obj->Package.Elements[11].Type == ACPI_TYPE_STRING?
-				12:11;
+	    obj->Package.Elements[valuebase].Type == ACPI_TYPE_STRING &&
+	    obj->Package.Elements[valuebase+1].Type == ACPI_TYPE_INTEGER &&
+	    obj->Package.Count > valuebase + 
+	        obj->Package.Elements[valuebase+1].Integer.Value
+	   ) {
+		enumbase = valuebase + 1;
 		if (detail & ACPI_HP_CMI_DETAIL_PATHS) {
 			strlcat(outbuf, acpi_hp_get_string_from_object(
 				&obj->Package.Elements[2], string_buffer, size),
@@ -924,11 +944,10 @@
 		outlen += 43;
 		while (strlen(outbuf) < outlen)
 			strlcat(outbuf, " ", outsize);
-		if (enumbase == 12)
-			strlcat(outbuf, acpi_hp_get_string_from_object(
-					    &obj->Package.Elements[11],
-					    string_buffer, size),
-					outsize);
+		strlcat(outbuf, acpi_hp_get_string_from_object(
+				&obj->Package.Elements[valuebase], string_buffer, 
+				size),
+				outsize);
 		outlen += 21;
 		while (strlen(outbuf) < outlen)
 			strlcat(outbuf, " ", outsize);
@@ -936,7 +955,7 @@
 			if (outbuf[i] == '\\')
 				outbuf[i] = '/';
 		if (detail & ACPI_HP_CMI_DETAIL_ENUMS) {
-			for (i = enumbase+1; i < enumbase + 1 +
+			for (i = enumbase + 1; i < enumbase + 1 +
 			    obj->Package.Elements[enumbase].Integer.Value;
 			    ++i) {
 				acpi_hp_get_string_from_object(
@@ -980,8 +999,8 @@
  */
 static __inline int acpi_hp_hex_to_int(const UINT8 *hexin, UINT8 *byteout)
 {
-	unsigned int hi;
-	unsigned int lo;
+	unsigned int	hi;
+	unsigned int	lo;
 
 	hi = hexin[0];
 	lo = hexin[1];
@@ -1010,10 +1029,10 @@
 static void
 acpi_hp_hex_decode(char* buffer)
 {
-	int i;
-	int length = strlen(buffer);
-	UINT8 *uin;
-	UINT8 uout;
+	int	i;
+	int	length = strlen(buffer);
+	UINT8	*uin;
+	UINT8	uout;
 
 	if (((int)length/2)*2 == length || length < 10) return;
 
@@ -1044,8 +1063,8 @@
 static int
 acpi_hp_hpcmi_open(struct cdev* dev, int flags, int mode, struct thread *td)
 {
-	struct acpi_hp_softc *sc;
-	int ret;
+	struct acpi_hp_softc	*sc;
+	int			ret;
 
 	if (dev == NULL || dev->si_drv1 == NULL)
 		return (EBADF);
@@ -1076,8 +1095,8 @@
 static int
 acpi_hp_hpcmi_close(struct cdev* dev, int flags, int mode, struct thread *td)
 {
-	struct acpi_hp_softc *sc;
-	int ret;
+	struct acpi_hp_softc	*sc;
+	int			ret;
 
 	if (dev == NULL || dev->si_drv1 == NULL)
 		return (EBADF);
@@ -1106,13 +1125,13 @@
 static int
 acpi_hp_hpcmi_read(struct cdev *dev, struct uio *buf, int flag)
 {
-	struct acpi_hp_softc *sc;
-	int pos, i, l, ret;
-	UINT8 instance;
-	UINT8 maxInstance;
-	UINT32 sequence;
-	int linesize = 1025;
-	char line[linesize];
+	struct acpi_hp_softc	*sc;
+	int			pos, i, l, ret;
+	UINT8			instance;
+	UINT8			maxInstance;
+	UINT32			sequence;
+	int			linesize = 1025;
+	char			line[linesize];
 
 	if (dev == NULL || dev->si_drv1 == NULL)
 		return (EBADF);

--------------040508080709060705030600--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4A4A79A8.2030807>