diff mbox

rfkill hard state after booting

Message ID 4ABB89B2.8070302@tuffmail.co.uk (mailing list archive)
State Not Applicable, archived
Headers show

Commit Message

Alan Jenkins Sept. 24, 2009, 3:01 p.m. UTC
Johannes Berg wrote:
> On Thu, 2009-09-24 at 15:02 +0200, Norbert Preining wrote:
>
>   
>> I recently (on a flight) I found out that when I boot with the hard-switch
>> activated, so turning off all wireless activity on my laptop, the state
>> is not correctly announced in /dev/rfkill (reading it with rfkill command,
>> or my own gnome applet). All the devices seem to be in normal state but
>> one.
>>     
>
> Very strange.
>
>   
>> Here some outputs:
>> $ cd /sys/class/rfkill
>> $ ls
>> rfkill0@  rfkill1@  rfkill2@  rfkill3@	rfkill4@  rfkill5@
>> $ cat rfkill?/name
>> sony-wifi
>> sony-bluetooth
>> sony-wwan
>> hso-0
>> hci0
>> phy0
>> $
>>
>> and the three sony-* are the ones for actually turning on/off the devices,
>> but they showed all soft 0 hard 0 at initial startup. Only phy0 (AFAIR)
>> had hard 1.
>>     
>
> Makes sense. I mean, that phy0 was hard blocked.
>
>   
>> After turning off and on again the hard-switch the events were right.
>>     
>
> I can't decide where this bug is. I suspect it's in the sony code.
> Anyone feel responsible for that code?
>
> johannes
>   

I think it's pretty clear it's in the sony code.  It doesn't call
set_hw_state() during init.  I.e. (completely untested):


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

Comments

Alan Jenkins Sept. 24, 2009, 3:12 p.m. UTC | #1
Johannes Berg wrote:
> On Thu, 2009-09-24 at 16:01 +0100, Alan Jenkins wrote:
>
>   
>> I think it's pretty clear it's in the sony code.  It doesn't call
>> set_hw_state() during init.  I.e. (completely untested):
>>     
>
> Agree, looking at the code this seems reasonable.
>
> Although maybe it should just call sony_nc_rfkill_update() after
> registering all of them?
>
> johannes
>   

That means the initial "add" uevents etc. will contain wrong values (and
then be updated immediately after).  Do we care about that?  It's
unlikely to matter in practice for platform devices which only get
loaded at boot-time, but perhaps it would set a bad example.

Regards
Alan
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Norbert Preining Sept. 24, 2009, 4:19 p.m. UTC | #2
On Do, 24 Sep 2009, Alan Jenkins wrote:
> +	sony_call_snc_handle(0x124, 0x200, &result);
> +	hwblock = !(result & 0x1);
> +	rfkill_set_hw_state(rfk, hwblock);
> +

I confirm that the (full) patch fixed that problem. Thanks!

Best wishes

Norbert

-------------------------------------------------------------------------------
Dr. Norbert Preining <preining@logic.at>        Vienna University of Technology
Debian Developer <preining@debian.org>                         Debian TeX Group
gpg DSA: 0x09C5B094      fp: 14DF 2E6C 0307 BE6D AD76  A9C0 D2BF 4AA3 09C5 B094
-------------------------------------------------------------------------------
GOLANT (adj.)
Blank, sly and faintly embarrassed. Pertaining to the expression seen
on the face of someone who has clearly forgotten your name.
			--- Douglas Adams, The Meaning of Liff
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Johannes Berg Sept. 24, 2009, 5:29 p.m. UTC | #3
On Thu, 2009-09-24 at 16:12 +0100, Alan Jenkins wrote:

> > Although maybe it should just call sony_nc_rfkill_update() after
> > registering all of them?

> That means the initial "add" uevents etc. will contain wrong values (and
> then be updated immediately after).  Do we care about that?  It's
> unlikely to matter in practice for platform devices which only get
> loaded at boot-time, but perhaps it would set a bad example.

Ah, good point. I was just a little concerned about the logic
difference, but I don't really understand the _update() logic.

johannes
diff mbox

Patch

diff --git a/drivers/platform/x86/sony-laptop.c b/drivers/platform/x86/sony-laptop.c
index dafaa4a..a234a9d 100644
--- a/drivers/platform/x86/sony-laptop.c
+++ b/drivers/platform/x86/sony-laptop.c
@@ -1081,6 +1081,8 @@  static int sony_nc_setup_rfkill(struct acpi_device *device,
 	struct rfkill *rfk;
 	enum rfkill_type type;
 	const char *name;
+	int result;
+	bool hwblock;
 
 	switch (nc_type) {
 	case SONY_WIFI:
@@ -1108,6 +1110,10 @@  static int sony_nc_setup_rfkill(struct acpi_device *device,
 	if (!rfk)
 		return -ENOMEM;
 
+	sony_call_snc_handle(0x124, 0x200, &result);
+	hwblock = !(result & 0x1);
+	rfkill_set_hw_state(rfk, hwblock);
+
 	err = rfkill_register(rfk);
 	if (err) {
 		rfkill_destroy(rfk);