Re: [PATCH 0/8] [Resend] ideapad: using EC command to control rf/camera power

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

 



Hello Ike,

On Wed, Aug 25, 2010 at 07:59:30PM +0800, Ike Panhc wrote:
> On 08/20/2010 05:08 PM, Mario 'BitKoenig' Holbe wrote:
> > On Fri, Aug 20, 2010 at 03:01:07PM +0800, Ike Panhc wrote:
> >> Could you attach or upload the DSDT of S12 somewhere I can reach?
> > 
> > http://sandbox.fem.tu-ilmenau.de/s12/dsdt-s12-via.dsl
> > 
> >> I check DSDT for S10-3 and B550, return value of _CFG is fixed.
> >> [Ref: http://people.ubuntu.com/~ikepanhc/DSDTs]
> > 
> > Looks more fixed than on my S12, indeed.
> > I don't really speak AML, but while S10-3 ILDD (called from _CFG) seems
> > to read fixed values only, here on S12 PHSR (called from _CFG) seems to
> > do some kind of I/O operation. I'm not sure about this, but it somehow
> > looks like.
> > 
> It accesses something in system memory, but I have no idea what will happen
> after writing..

Well, the pattern looks like I/O - mmapped I/O.
        Store (Arg1, \_SB.INF0)
        Store (Arg0, \_SB.BCMD)
        Store (Zero, \_SB.SMIC)
        Store (\_SB.INF0, Local0)

Note that INF0 is written before and read after writing SMIC. Hence,
for this to be useful, something must have happened inbetween, i.e.
I/O :)

> There are two variables need to be written for turning on/off bluetooth. They are
> BTST(in memory) and BTEN(is EC register). I will guess there are some sync failed
> when enable bluetooth.

What exactly do you mean with "there are some sync failed"? I don't see
anything like that in the logs.

> This could be a plan. I have several idea to go and need your help.
> - Add some debug message to read BTST/BTEN when turning on/off bluetooth.
> - Force to set BTST/BTEN before reading _CFG
> - Provide a module parm to force enable rf devices.
> 
> Will have the drivers and please test it and let me know the result.

Hmmm, I don't know if I got you right. I didn't find any new drivers to
test, so I tried to add some more debug code myself. Hope this helps.
I added some code to show_ideapad_cam() to be able to asynchronously
trigger reading of BTST, BTEN, and BTPS. As before: the patch attached
is not for inclusion but to show what I did. I'm usually not a kernel
hacker, so please take a serious look at what I did before trusting the
results :)

I attached a full protocol of actions I performed including kernel
dmesges. Typed commands are prepended by #, manual actions and comments
are enclosed in <>, kernel messages are timestamped, the rest is output
of the commands.
Basically I did the following:
0. I started with a fresh powered up system, all RF devices powered on.
1. I hw-switched RF off and back on, which went okay.
2. I sw-switched BT off and back on, which resulted in erroneous
initialization.
3. I again sw-switched BT off and back on, which resulted in BT being
completely gone.
4. I hw-switched RF off and back on, which brought BT back and
operational.

> > I played with the hardware killswitch under Linux. The bluetooth device
> > disappears and re-appears there and always seems to initialize
> > correctly. No USB read errors this way.
...
> > I'm not exactly sure what this means - especially because I don't know
> > how the hardware killswitch works internally.
> > It *could* mean, the initialization problem is proably something that
> > could be dealt with in the USB layer long term (and would then probably
> > not have to be worked around anymore in ideapad_laptop). I'm not sure
> > about this, because this would mean the hard killswitch power-cut
> > somehow differs from the soft killswitch power-cut.
> Usually the hw rf switch turning off PHY only. When turning off, device and
> its driver is still there. I believe S12 is designed in this way after
> reading your test result.

Hmmm, I don't understand your reasoning here.
I said the device disappears and re-appears when using the hw rf switch,
this doesn't look like it would turn off PHY only.


best regards
   Mario
-- 
We know that communication is a problem, but the company is not going to
discuss it with the employees.
                       -- Switching supervisor, AT&T Long Lines Division
--- ideapad_laptop.c.orig	2010-08-18 13:35:36.087735426 +0200
+++ ideapad_laptop.c	2010-08-30 19:05:53.116031145 +0200
@@ -170,6 +170,18 @@ static ssize_t show_ideapad_cam(struct d
 	struct ideapad_private *priv = dev_get_drvdata(dev);
 	acpi_handle handle = priv->handle;
 	unsigned long result;
+	acpi_status res;
+	u64 res64;
+
+	res = acpi_evaluate_integer(handle, "\\_SB.BTST", NULL, &res64);
+	if(!ACPI_FAILURE(res))
+		printk(KERN_INFO "BTST: 0x%llx\n", res64);
+	res = acpi_evaluate_integer(handle, "\\_SB.BTPS", NULL, &res64);
+	if(!ACPI_FAILURE(res))
+		printk(KERN_INFO "BTPS: 0x%llx\n", res64);
+	res = acpi_evaluate_integer(handle, "\\_SB.PCI0.PIB.EC0.BTEN", NULL, &res64);
+	if(!ACPI_FAILURE(res))
+		printk(KERN_INFO "BTEN: 0x%llx\n", res64);
 
 	if (read_ec_data(handle, 0x1D, &result))
 		return sprintf(buf, "-1\n");
@@ -279,11 +291,19 @@ static int ideapad_acpi_add(struct acpi_
 	if (read_method_int(adevice->handle, "_CFG", &cfg))
 		return -ENODEV;
 
+	printk(KERN_INFO "ideapad_acpi_add(): cfg=0x%x\n", cfg);
+
 	for (i = IDEAPAD_DEV_CAMERA; i < IDEAPAD_DEV_KILLSW; i++) {
-		if (test_bit(ideapad_rfk_data[i].cfgbit, (unsigned long *)&cfg))
+		if (test_bit(ideapad_rfk_data[i].cfgbit, (unsigned long *)&cfg)) {
 			devs_present[i] = 1;
-		else
-			devs_present[i] = 0;
+			printk(KERN_INFO "ideapad_acpi_add(): found: %s\n", ideapad_rfk_data[i].name);
+		} else {
+			if(ideapad_rfk_data[i].type == RFKILL_TYPE_BLUETOOTH) {
+				devs_present[i] = 1;
+				printk(KERN_INFO "ideapad_acpi_add(): forced: %s\n", ideapad_rfk_data[i].name);
+			} else
+				devs_present[i] = 0;
+		}
 	}
 
 	/* The hardware switch is always present */
<fresh powered up system>
# cat $(find /sys -name camera_power)
[  140.121467] BTST: 0x1
[  140.121475] BTPS: 0x1
[  140.122378] BTEN: 0x1
1
<hw killswitch off>
[  199.296090] usb 4-1: USB disconnect, address 2
[  199.296789] btusb_intr_complete: hci0 urb f6990300 failed to resubmit (19)
[  199.296808] btusb_bulk_complete: hci0 urb f6990380 failed to resubmit (19)
[  199.297789] btusb_bulk_complete: hci0 urb f6990000 failed to resubmit (19)
[  199.297991] btusb_send_frame: hci0 urb f6766200 submission failed
[  199.784704] wlan0: deauthenticating from 00:1c:f0:e4:3d:a9 by local choice (reason=3)
[  199.786981] cfg80211: Calling CRDA to update world regulatory domain
[  200.852176] b43-phy0: Radio hardware status changed to DISABLED
# cat $(find /sys -name camera_power)
[  219.129098] BTST: 0x1
[  219.129105] BTPS: 0x1
[  219.130017] BTEN: 0x1
1
<hw killswitch on>
[  257.968055] usb 4-1: new full speed USB device using uhci_hcd and address 3
[  258.141407] usb 4-1: New USB device found, idVendor=0a5c, idProduct=2150
[  258.141420] usb 4-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  258.141431] usb 4-1: Product: BCM2046 Bluetooth Device
[  258.141440] usb 4-1: Manufacturer: Broadcom Corp
[  258.141448] usb 4-1: SerialNumber: 0C6076DC9FD0
[  260.852114] b43-phy0: Radio hardware status changed to ENABLED
[  261.076117] b43-phy0: Loading firmware version 410.2160 (2007-05-26 15:32:10)
[  266.592252] b43-pci-bridge 0000:02:00.0: PCI: Disallowing DAC for device
[  266.592264] b43-phy0: DMA mask fallback from 64-bit to 32-bit
[  266.633509] ADDRCONF(NETDEV_UP): wlan0: link is not ready
[  269.380720] wlan0: authenticate with 00:1c:f0:e4:3d:a9 (try 1)
[  269.382273] wlan0: authenticated
[  269.382689] wlan0: associate with 00:1c:f0:e4:3d:a9 (try 1)
[  269.385522] wlan0: RX AssocResp from 00:1c:f0:e4:3d:a9 (capab=0x431 status=0 aid=1)
[  269.385534] wlan0: associated
[  269.392770] ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
[  279.928033] wlan0: no IPv6 routers present
# cat $(find /sys -name camera_power)
[  291.431607] BTST: 0x1
[  291.431614] BTPS: 0x1
[  291.433096] BTEN: 0x1
1
# rfkill block $(rfkill list | awk -F: '/ideapad_bluetooth/{print $1}')
[  341.416077] usb 4-1: USB disconnect, address 3
[  341.416547] btusb_intr_complete: hci0 urb f6747b80 failed to resubmit (19)
[  341.416559] btusb_bulk_complete: hci0 urb f6798300 failed to resubmit (19)
[  341.417546] btusb_bulk_complete: hci0 urb f674e080 failed to resubmit (19)
[  341.417944] btusb_send_frame: hci0 urb f67e5500 submission failed
# cat $(find /sys -name camera_power)
[  364.592492] BTST: 0x0
[  364.592499] BTPS: 0x1
[  364.593586] BTEN: 0x0
1
# rfkill unblock $(rfkill list | awk -F: '/ideapad_bluetooth/{print $1}')
[  392.192070] usb 4-1: new full speed USB device using uhci_hcd and address 4
[  392.312040] usb 4-1: device descriptor read/64, error -71
[  392.536066] usb 4-1: device descriptor read/64, error -71
[  392.752073] usb 4-1: new full speed USB device using uhci_hcd and address 5
[  392.872077] usb 4-1: device descriptor read/64, error -71
[  393.096059] usb 4-1: device descriptor read/64, error -71
[  393.312043] usb 4-1: new full speed USB device using uhci_hcd and address 6
[  393.720143] usb 4-1: device not accepting address 6, error -71
[  393.832051] usb 4-1: new full speed USB device using uhci_hcd and address 7
[  394.240083] usb 4-1: device not accepting address 7, error -71
[  394.240105] hub 4-0:1.0: unable to enumerate USB device on port 1
# cat $(find /sys -name camera_power)
[  458.669365] BTST: 0x1
[  458.669372] BTPS: 0x1
[  458.670744] BTEN: 0x1
1
# rfkill block $(rfkill list | awk -F: '/ideapad_bluetooth/{print $1}')
<absolutely no messages, no errors, nothing>
# cat $(find /sys -name camera_power)
[  576.981559] BTST: 0x0
[  576.981567] BTPS: 0x1
[  576.982900] BTEN: 0x0
1
# rfkill unblock $(rfkill list | awk -F: '/ideapad_bluetooth/{print $1}')
<absolutely no messages, device does not appear, no errors, nothing>
# cat $(find /sys -name camera_power)
[  652.939495] BTST: 0x1
[  652.939503] BTPS: 0x1
[  652.941192] BTEN: 0x1
1
<hw killswitch off>
[  701.234772] wlan0: deauthenticating from 00:1c:f0:e4:3d:a9 by local choice (reason=3)
[  701.237446] cfg80211: Calling CRDA to update world regulatory domain
[  702.036108] b43-phy0: Radio hardware status changed to DISABLED
# cat $(find /sys -name camera_power)
[  722.962717] BTST: 0x1
[  722.962724] BTPS: 0x1
[  722.964822] BTEN: 0x1
1
<hw killswitch on>
[  757.028180] b43-phy0: Radio hardware status changed to ENABLED
[  757.379142] usb 4-1: new full speed USB device using uhci_hcd and address 8
[  757.432136] b43-phy0: Loading firmware version 410.2160 (2007-05-26 15:32:10)
[  757.552383] usb 4-1: New USB device found, idVendor=0a5c, idProduct=2150
[  757.552396] usb 4-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  757.552407] usb 4-1: Product: BCM2046 Bluetooth Device
[  757.552415] usb 4-1: Manufacturer: Broadcom Corp
[  757.552423] usb 4-1: SerialNumber: 0C6076DC9FD0
[  762.952258] b43-pci-bridge 0000:02:00.0: PCI: Disallowing DAC for device
[  762.952271] b43-phy0: DMA mask fallback from 64-bit to 32-bit
[  762.985688] ADDRCONF(NETDEV_UP): wlan0: link is not ready
[  765.728762] wlan0: authenticate with 00:1c:f0:e4:3d:a9 (try 1)
[  765.730314] wlan0: authenticated
[  765.730738] wlan0: associate with 00:1c:f0:e4:3d:a9 (try 1)
[  765.734126] wlan0: RX AssocResp from 00:1c:f0:e4:3d:a9 (capab=0x431 status=0 aid=1)
[  765.734137] wlan0: associated
[  765.738373] ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
[  775.760029] wlan0: no IPv6 routers present
# cat $(find /sys -name camera_power)
[  797.842123] BTST: 0x1
[  797.842131] BTPS: 0x1
[  797.843030] BTEN: 0x1
1

Attachment: signature.asc
Description: Digital signature


[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux