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
[-- Attachment #1 --]
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
[-- Attachment #2 --]
yJJ [{wSL,X%dMb8nO6GGGw7i9I@3wo;"=sɬZάȞ?4Mk?-jzM3Qo՚VGYjqY~n>0HT*$X=ZX $8)u*ZRӈaa]FQtD`ZFKjCèl#NY4o1
Oh7k"A<V`g#9$SHݐXް@
(:u!{ C:b7Hj?",Rk/4CZPsJF8qr&z9+8$$R>vؖG8=CUFA vNnW:iA,J&KAـ ]"p5Xu㍁4/So\R]tfSŎnloTN|fM0ŵf?A+"#jE1X"?n~t&T}?]W-Ƥ2wфU/-r 8쩳B_AM? ѐ:hİ A
S CCh
]˞%l[zU;FۨZ;stroHxt/7881OON
4'FYKro7=fCOmܼ87+uU7g74(4t0&D#E9' 3yw?h{C rܔ?˃JaRcB~ʙcsCpG8,6w-1tFf`
#|y83FܘFO'O^-ihI*7%Wm8ҳWA8mOoϺ̫[ {,~Jճʬ{J?ā|q!
E!)`TJoD+/@1j:˰ju? #&_|gب&bQӊ#/:FAlG M"v@~-TIdYijG&6./t\3S8 Sysڽ93%%6簉 ?\rXʫ9T_D=ҩҘd0f}$l^oVkZ'#,_я`FHƁ t-Dnb+')1+(ZBt}3[]ɋ/py{ҿ 1%YK;9띔J 8ƜV%.c4Si[\Z?J/ [4}c9V"^k:Ma,|z#;{byc^!{)Ѳ̓N ]HR^EJ.6J5HI'
~` ipG衸wz F Хl3ڽyeZ`|IW`cey:{;|^,9"\M6hYrn(q֫<UdZ%R5<[[+0Lo05nF5_湑kvboYk%bh^`QmhH5ϏTu
z!kNhiLlLdVsgYXf]>`r7ǃ>rp=`Ҁ엊1ϢJ4Gg&JEoj[蹐ԎPZ-fJU2S:j0eu8-ud)59V,BVrBHjd,⨆=)
~NfF+Q~s=(%Sṧ6:My)k?f1O!G>]ݫwBu@qq}w>)4|zށ*a9%yHrYIvksF\4\pSfeAH@mU#y|]@sݻw5|'3&vnK7c;
/DZQ<&>Pr+Ct
)-)ki,3wJX{)TL@Zba1`?9.0c}fF9ՑKXS[]~Ŗ8q|[Ձ<AԶuc"LgN$p"ʟ|5@'W8p:t$83r5!aśd߿gH̤T&/7LggAO#
Ie2Z]&1e/W\.(Rs55W(5_D Kx4Mwsx=A. ,{C/LmřvCq&Ai:cS@7<ulj%3'W0xǏR]ꍣtaQ$3 TV^
f/ELa׃;Qp0_3gSyTm[Z
m>L(s}3qjHU.?u|=8ŗ?SȲCQEϭ)%A?q#E[RQD!>XaD'LV9dˋ#`.-0܉&B;ġؓ56^Qkx0
Cu6t3z{7X]_b(Cؖ{ ߩgaSK4heCnNwK8'a,®!|VV6DF_TB`,9F[&-0gA;x@@?t:Zƒ sIk Y2!wʦ&[<5`S!PMB5v OD#NhWmcMaߌ(ZM
*F#5 k{'!y9)D0'8v [xඓӔ<_apPţGƧ`r
t'"cږ<畓}qO"4
كF1,Y.LdD8드w/
eO͗X$ߤ1+H-_Q6ً(J2bJ
|aysW]rѡ~^D^r,4֘VL%X ]]M! Cw+!T&XyiPed>B2F)B YR .2<י:۩Ϟ?wpLq_U6
vb"E*+C/^)T0l0g(km*P#}DZa} -s+7pooA[,0WEfc-$gKWsty<:yeyJb+g5+aC]D7zH6I,mW\"ʣք2ye%._$uzU:yOmEEl)O^gByZƩz]FD}I5&<.d(T%ʔre#{elػ44Aj#8s}5*T|x*|A
fOb~>O.J`}C^g56.I }?9*~OBq(
DEfKq@L+lQ˻|KJNSUG2eK/;qÕ-ZK.Pp{3a$*:&xRٿ{(XX:cvs +\R&JRa<AC C]??q4&4>CjCZq=LR$whR^ڱO1@M^~V8y"TQ80JbZpU~%q['_UD6)ߖWX/lHIr?rq(WGhGç(/DK@Tr0<V^P5_t_VH7ݓ% VjCh?֑
YP5gF=Fp,Dg>L270~#ZΚ\i$ba7K(?=˲ɍC"Hڷ _FI%|Wdʲ?+ڮڮڮڮڮڮڮڮڮڮڮړڿ3!l P
[-- Attachment #3 --]
--- 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
[-- Attachment #4 --]
--- 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), ¶ms };
- 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), ¶ms };
+ 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);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4A4A79A8.2030807>
