* Re: rfkill rewrite bug [not found] ` <1240043283.5792.0.camel@johannes.local> @ 2009-04-18 9:43 ` Alan Jenkins 2009-04-18 12:24 ` Johannes Berg 0 siblings, 1 reply; 17+ messages in thread From: Alan Jenkins @ 2009-04-18 9:43 UTC (permalink / raw) To: Johannes Berg; +Cc: linux-wireless@vger.kernel.org Johannes Berg wrote: > On Sat, 2009-04-18 at 09:17 +0100, Alan Jenkins wrote: > > >> When I looked at the code earlier, I saw no obvious replacement for >> rfkill_set_default(). So I tried disabling the wireless and rebooting >> to see what happened. It didn't like that :-). >> > > Ok that wasn't too hard -- try this on top if you get a chance: > Great, that fixes the crash. 1) I think we need to add a resume method to eeepc-laptop. Without this, funny things happen when I hibernate, disable wireless in the BIOS, and resume: ath5k phy0: failed to wake up the MAC chip It's an really stupid thing to do, but it can happen. It's bad from a UI point of view. E.g. in network-manager, you can see a "wlan0" device, but it doesn't work. The EEE rfkill is unusual in that it hotplugs the PCI device, making eeepc-laptop something like a custom pci hotplug driver. With your rewrite, eeepc-laptop doesn't notice the state change on resume. Previously, the rfkill-core would restore the pre-hibernation state, which would sort everything out. I don't think anything else does this, so we can just add a resume method to eeepc-laptop. The resume method would re-check the state and do the PCI hotplug dance if necessary. If you agree, I can do the patch for this and send it to you. 2) Do you have any thoughts about an rfkill_set_default() equivalent? AFAICS your current patch simply removes it. This means that when I boot linux, it doesn't respect the previous rfkill state. I can no longer disable the wireless in the BIOS setup screen, and the rfkill state won't be preserved over reboots. I don't have a strong feeling about reboots _on their own_. But I would be annoyed if the option in the BIOS setup screen stopped working in a future version of linux. Admittedly it's only a matter of principle / nostalgia - since the eeepc-laptop was fixed to implement rfkill properly, I've never used the BIOS option in anger. Thanks Alan ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: rfkill rewrite bug 2009-04-18 9:43 ` rfkill rewrite bug Alan Jenkins @ 2009-04-18 12:24 ` Johannes Berg 2009-04-18 13:29 ` Rfkill rewrite: eeepc-laptop resume Alan Jenkins ` (2 more replies) 0 siblings, 3 replies; 17+ messages in thread From: Johannes Berg @ 2009-04-18 12:24 UTC (permalink / raw) To: Alan Jenkins; +Cc: linux-wireless@vger.kernel.org [-- Attachment #1: Type: text/plain, Size: 2719 bytes --] On Sat, 2009-04-18 at 10:43 +0100, Alan Jenkins wrote: > >> When I looked at the code earlier, I saw no obvious replacement for > >> rfkill_set_default(). So I tried disabling the wireless and rebooting > >> to see what happened. It didn't like that :-). > >> > > > > Ok that wasn't too hard -- try this on top if you get a chance: > > > > Great, that fixes the crash. > > > 1) I think we need to add a resume method to eeepc-laptop. > > Without this, funny things happen when I hibernate, disable wireless in > the BIOS, and resume: > > ath5k phy0: failed to wake up the MAC chip > > It's an really stupid thing to do, but it can happen. It's bad from a > UI point of view. E.g. in network-manager, you can see a "wlan0" > device, but it doesn't work. > > The EEE rfkill is unusual in that it hotplugs the PCI device, making > eeepc-laptop something like a custom pci hotplug driver. With your > rewrite, eeepc-laptop doesn't notice the state change on resume. > Previously, the rfkill-core would restore the pre-hibernation state, > which would sort everything out. I don't think anything else does this, > so we can just add a resume method to eeepc-laptop. The resume method > would re-check the state and do the PCI hotplug dance if necessary. > > If you agree, I can do the patch for this and send it to you. Sounds good to me, yeah. I could make the rfkill core do that at resume, but I'm not really sure it's what we want -- there are too many cases imho: * hard rfkill might have changed * soft rfkill might still be ok in hw * soft rfkill might need reconfiguring etc. I think generally it's saner to let the driver sort it out -- it can always ask for the current state by using set_hw_state() or so. > 2) Do you have any thoughts about an rfkill_set_default() equivalent? > AFAICS your current patch simply removes it. > > This means that when I boot linux, it doesn't respect the previous > rfkill state. I can no longer disable the wireless in the BIOS setup > screen, and the rfkill state won't be preserved over reboots. > > I don't have a strong feeling about reboots _on their own_. But I would > be annoyed if the option in the BIOS setup screen stopped working in a > future version of linux. Admittedly it's only a matter of principle / > nostalgia - since the eeepc-laptop was fixed to implement rfkill > properly, I've never used the BIOS option in anger. That's odd, I thought I added a set_sw_state() to rfkill which would disable that rfkill. But there's rfkill_set_global_sw_state() which should do what you want -- can you try replacing the EEE set_sw_state call with that? johannes [-- Attachment #2: This is a digitally signed message part --] [-- Type: application/pgp-signature, Size: 836 bytes --] ^ permalink raw reply [flat|nested] 17+ messages in thread
* Rfkill rewrite: eeepc-laptop resume 2009-04-18 12:24 ` Johannes Berg @ 2009-04-18 13:29 ` Alan Jenkins 2009-04-18 13:33 ` Johannes Berg 2009-04-18 15:49 ` rfkill rewrite bug Alan Jenkins 2009-04-18 17:42 ` Alan Jenkins 2 siblings, 1 reply; 17+ messages in thread From: Alan Jenkins @ 2009-04-18 13:29 UTC (permalink / raw) To: Johannes Berg; +Cc: linux-wireless@vger.kernel.org Johannes Berg wrote: > On Sat, 2009-04-18 at 10:43 +0100, Alan Jenkins wrote: > >> >> >> 1) I think we need to add a resume method to eeepc-laptop. >> >> Without this, funny things happen when I hibernate, disable wireless in >> the BIOS, and resume: >> >> ath5k phy0: failed to wake up the MAC chip >> >> It's an really stupid thing to do, but it can happen. It's bad from a >> UI point of view. E.g. in network-manager, you can see a "wlan0" >> device, but it doesn't work. >> >> The EEE rfkill is unusual in that it hotplugs the PCI device, making >> eeepc-laptop something like a custom pci hotplug driver. With your >> rewrite, eeepc-laptop doesn't notice the state change on resume. >> Previously, the rfkill-core would restore the pre-hibernation state, >> which would sort everything out. I don't think anything else does this, >> so we can just add a resume method to eeepc-laptop. The resume method >> would re-check the state and do the PCI hotplug dance if necessary. >> >> If you agree, I can do the patch for this and send it to you. >> > > Sounds good to me, yeah. > > I could make the rfkill core do that at resume, but I'm not really sure > it's what we want -- there are too many cases imho: > * hard rfkill might have changed > * soft rfkill might still be ok in hw > * soft rfkill might need reconfiguring > etc. I think generally it's saner to let the driver sort it out -- it > can always ask for the current state by using set_hw_state() or so. > API nit: * This function tells the rfkill core that the device is capable of * remembering soft blocks (which it is notified of via the set_block * method) -- this means that the driver may ignore the return value * from rfkill_set_hw_state(). Doesn't this conflict with the declaration of rfkill_set_sw_state() as __must_check? Ta Alan ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: Rfkill rewrite: eeepc-laptop resume 2009-04-18 13:29 ` Rfkill rewrite: eeepc-laptop resume Alan Jenkins @ 2009-04-18 13:33 ` Johannes Berg 2009-04-18 14:02 ` Alan Jenkins 0 siblings, 1 reply; 17+ messages in thread From: Johannes Berg @ 2009-04-18 13:33 UTC (permalink / raw) To: Alan Jenkins; +Cc: linux-wireless@vger.kernel.org [-- Attachment #1: Type: text/plain, Size: 682 bytes --] On Sat, 2009-04-18 at 14:29 +0100, Alan Jenkins wrote: > API nit: > > * This function tells the rfkill core that the device is capable of > * remembering soft blocks (which it is notified of via the set_block > * method) -- this means that the driver may ignore the return value > * from rfkill_set_hw_state(). > > Doesn't this conflict with the declaration of rfkill_set_sw_state() as > __must_check? Yeah, in a way it does, but I figure it's rare enough that those who really can ignore it can write (void) rfkill_set_sw_state(...) Don't really have a strong opinion, it just seemed the mistake in the other direction would be more common. johannes [-- Attachment #2: This is a digitally signed message part --] [-- Type: application/pgp-signature, Size: 836 bytes --] ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: Rfkill rewrite: eeepc-laptop resume 2009-04-18 13:33 ` Johannes Berg @ 2009-04-18 14:02 ` Alan Jenkins 2009-04-18 14:10 ` Johannes Berg 0 siblings, 1 reply; 17+ messages in thread From: Alan Jenkins @ 2009-04-18 14:02 UTC (permalink / raw) To: Johannes Berg; +Cc: linux-wireless@vger.kernel.org Johannes Berg wrote: > On Sat, 2009-04-18 at 14:29 +0100, Alan Jenkins wrote: > > >> API nit: >> >> * This function tells the rfkill core that the device is capable of >> * remembering soft blocks (which it is notified of via the set_block >> * method) -- this means that the driver may ignore the return value >> * from rfkill_set_hw_state(). >> >> Doesn't this conflict with the declaration of rfkill_set_sw_state() as >> __must_check? >> > > Yeah, in a way it does, but I figure it's rare enough that those who > really can ignore it can write > (void) rfkill_set_sw_state(...) > > Don't really have a strong opinion, it just seemed the mistake in the > other direction would be more common. > Oops... I meant to write rfkill_set_hw_state(), I think you copied me. Ok. So then why is the _sw_ variant marked __must_check? That looks like a mistake. I don't see what I can sensibly do with the return value. Unless you want EPO to veto a firmware-initiated enable? Thanks Alan ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: Rfkill rewrite: eeepc-laptop resume 2009-04-18 14:02 ` Alan Jenkins @ 2009-04-18 14:10 ` Johannes Berg 0 siblings, 0 replies; 17+ messages in thread From: Johannes Berg @ 2009-04-18 14:10 UTC (permalink / raw) To: Alan Jenkins; +Cc: linux-wireless@vger.kernel.org [-- Attachment #1: Type: text/plain, Size: 1228 bytes --] On Sat, 2009-04-18 at 15:02 +0100, Alan Jenkins wrote: > >> * This function tells the rfkill core that the device is capable of > >> * remembering soft blocks (which it is notified of via the set_block > >> * method) -- this means that the driver may ignore the return value > >> * from rfkill_set_hw_state(). > >> > >> Doesn't this conflict with the declaration of rfkill_set_sw_state() as > >> __must_check? > >> > > > > Yeah, in a way it does, but I figure it's rare enough that those who > > really can ignore it can write > > (void) rfkill_set_sw_state(...) > > > > Don't really have a strong opinion, it just seemed the mistake in the > > other direction would be more common. > > > Oops... I meant to write rfkill_set_hw_state(), I think you copied me. Ok. I, uh, didn't even pay that much attention. > So then why is the _sw_ variant marked __must_check? That looks like a > mistake. I don't see what I can sensibly do with the return value. > Unless you want EPO to veto a firmware-initiated enable? Good question. It gives you the hardware enable state but I guess you know about that already. Hmm :) Yeah it seems that we should remove that __must_check. johannes [-- Attachment #2: This is a digitally signed message part --] [-- Type: application/pgp-signature, Size: 836 bytes --] ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: rfkill rewrite bug 2009-04-18 12:24 ` Johannes Berg 2009-04-18 13:29 ` Rfkill rewrite: eeepc-laptop resume Alan Jenkins @ 2009-04-18 15:49 ` Alan Jenkins 2009-04-18 15:57 ` Johannes Berg 2009-04-18 17:42 ` Alan Jenkins 2 siblings, 1 reply; 17+ messages in thread From: Alan Jenkins @ 2009-04-18 15:49 UTC (permalink / raw) To: Johannes Berg; +Cc: linux-wireless@vger.kernel.org Johannes Berg wrote: > On Sat, 2009-04-18 at 10:43 +0100, Alan Jenkins wrote: > > >>>> When I looked at the code earlier, I saw no obvious replacement for >>>> rfkill_set_default(). So I tried disabling the wireless and rebooting >>>> to see what happened. It didn't like that :-). >>>> >>>> >>> Ok that wasn't too hard -- try this on top if you get a chance: >>> >>> >> Great, that fixes the crash. >> >> >> 1) I think we need to add a resume method to eeepc-laptop. >> >> Without this, funny things happen when I hibernate, disable wireless in >> the BIOS, and resume: >> >> ath5k phy0: failed to wake up the MAC chip >> >> It's an really stupid thing to do, but it can happen. It's bad from a >> UI point of view. E.g. in network-manager, you can see a "wlan0" >> device, but it doesn't work. >> >> The EEE rfkill is unusual in that it hotplugs the PCI device, making >> eeepc-laptop something like a custom pci hotplug driver. With your >> rewrite, eeepc-laptop doesn't notice the state change on resume. >> Previously, the rfkill-core would restore the pre-hibernation state, >> which would sort everything out. I don't think anything else does this, >> so we can just add a resume method to eeepc-laptop. The resume method >> would re-check the state and do the PCI hotplug dance if necessary. >> >> If you agree, I can do the patch for this and send it to you. >> > > Sounds good to me, yeah. > > I could make the rfkill core do that at resume, but I'm not really sure > it's what we want -- there are too many cases imho: > * hard rfkill might have changed > * soft rfkill might still be ok in hw > * soft rfkill might need reconfiguring > etc. I think generally it's saner to let the driver sort it out -- it > can always ask for the current state by using set_hw_state() or so. > > >> 2) Do you have any thoughts about an rfkill_set_default() equivalent? >> AFAICS your current patch simply removes it. >> >> This means that when I boot linux, it doesn't respect the previous >> rfkill state. I can no longer disable the wireless in the BIOS setup >> screen, and the rfkill state won't be preserved over reboots. >> >> I don't have a strong feeling about reboots _on their own_. But I would >> be annoyed if the option in the BIOS setup screen stopped working in a >> future version of linux. Admittedly it's only a matter of principle / >> nostalgia - since the eeepc-laptop was fixed to implement rfkill >> properly, I've never used the BIOS option in anger. >> > > That's odd, I thought I added a set_sw_state() to rfkill which would > disable that rfkill. But there's rfkill_set_global_sw_state() which > should do what you want -- can you try replacing the EEE set_sw_state > call with that? > > johannes > Well, I think the problem is clear :-P. if (!(rfkill_states_default_locked & BIT(rfkill->type))) { /* first of its kind */ BUILD_BUG_ON(NUM_RFKILL_TYPES > sizeof(rfkill_states_default_locked) * 8); rfkill_states_default_locked |= BIT(rfkill->type); rfkill_global_states[rfkill->type].cur = rfkill_global_states[rfkill->type].def; } One would expect to see a reference to rfkill->blocked in here. Alan ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: rfkill rewrite bug 2009-04-18 15:49 ` rfkill rewrite bug Alan Jenkins @ 2009-04-18 15:57 ` Johannes Berg 2009-04-18 17:48 ` Alan Jenkins 0 siblings, 1 reply; 17+ messages in thread From: Johannes Berg @ 2009-04-18 15:57 UTC (permalink / raw) To: Alan Jenkins; +Cc: linux-wireless@vger.kernel.org [-- Attachment #1: Type: text/plain, Size: 978 bytes --] On Sat, 2009-04-18 at 16:49 +0100, Alan Jenkins wrote: > > That's odd, I thought I added a set_sw_state() to rfkill which would > > disable that rfkill. But there's rfkill_set_global_sw_state() which > > should do what you want -- can you try replacing the EEE set_sw_state > > call with that? > > > > johannes > > > > Well, I think the problem is clear :-P. > > if (!(rfkill_states_default_locked & BIT(rfkill->type))) { > /* first of its kind */ > BUILD_BUG_ON(NUM_RFKILL_TYPES > > sizeof(rfkill_states_default_locked) * 8); > rfkill_states_default_locked |= BIT(rfkill->type); > rfkill_global_states[rfkill->type].cur = > rfkill_global_states[rfkill->type].def; > } > > One would expect to see a reference to rfkill->blocked in here. No, that's done asynchronously in rfkill_sync_work(). But actually, heh, that means set_sw_state can _not_ work before registering. johannes [-- Attachment #2: This is a digitally signed message part --] [-- Type: application/pgp-signature, Size: 836 bytes --] ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: rfkill rewrite bug 2009-04-18 15:57 ` Johannes Berg @ 2009-04-18 17:48 ` Alan Jenkins 2009-04-18 17:57 ` Johannes Berg 0 siblings, 1 reply; 17+ messages in thread From: Alan Jenkins @ 2009-04-18 17:48 UTC (permalink / raw) To: Johannes Berg; +Cc: linux-wireless@vger.kernel.org Johannes Berg wrote: > On Sat, 2009-04-18 at 16:49 +0100, Alan Jenkins wrote: > > >>> That's odd, I thought I added a set_sw_state() to rfkill which would >>> disable that rfkill. But there's rfkill_set_global_sw_state() which >>> should do what you want -- can you try replacing the EEE set_sw_state >>> call with that? >>> > No, that's done asynchronously in rfkill_sync_work(). But actually, heh, > that means set_sw_state can _not_ work before registering. > Ah, I think I see it now. Um, what's the use-case for calling set_sw_state() before registration? Is it actually needed? I think it was doing _something_. If the initial wireless state is soft-blocked, but rfkill.default_state = 1 (unblocked), then without the set_sw_state() call, the wireless would remain soft blocked. When the first sync_work calls rfkill_set_block(false), the "prev" value would also be false, so it would return without calling .set_block(). And you'd have an inconsistency, because "/sys/class/rfkill/rfkill0/state" would say "1" (unblocked). You'd have a similar problem the other way around, if the wireless was initially enabled, but the user specified rfkill.default_state = 0. So maybe you need a "first time, force sync" flag instead. That would also help if you had a write-only rfkill line, no? Regards Alan ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: rfkill rewrite bug 2009-04-18 17:48 ` Alan Jenkins @ 2009-04-18 17:57 ` Johannes Berg 2009-04-18 18:03 ` Alan Jenkins 0 siblings, 1 reply; 17+ messages in thread From: Johannes Berg @ 2009-04-18 17:57 UTC (permalink / raw) To: Alan Jenkins; +Cc: linux-wireless@vger.kernel.org [-- Attachment #1: Type: text/plain, Size: 1171 bytes --] On Sat, 2009-04-18 at 18:48 +0100, Alan Jenkins wrote: > Ah, I think I see it now. > > Um, what's the use-case for calling set_sw_state() before registration? > Is it actually needed? Probably not. I thought you would use it to update the core's idea of your state. But the core always forces you to its idea of the state :) > I think it was doing _something_. If the initial wireless state is > soft-blocked, but rfkill.default_state = 1 (unblocked), then without the > set_sw_state() call, the wireless would remain soft blocked. When the > first sync_work calls rfkill_set_block(false), the "prev" value would > also be false, so it would return without calling .set_block(). And > you'd have an inconsistency, because "/sys/class/rfkill/rfkill0/state" > would say "1" (unblocked). > > You'd have a similar problem the other way around, if the wireless was > initially enabled, but the user specified rfkill.default_state = 0. > > So maybe you need a "first time, force sync" flag instead. That would > also help if you had a write-only rfkill line, no? Not sure what you mean -- the sync is always done on register()? johannes [-- Attachment #2: This is a digitally signed message part --] [-- Type: application/pgp-signature, Size: 836 bytes --] ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: rfkill rewrite bug 2009-04-18 17:57 ` Johannes Berg @ 2009-04-18 18:03 ` Alan Jenkins 0 siblings, 0 replies; 17+ messages in thread From: Alan Jenkins @ 2009-04-18 18:03 UTC (permalink / raw) To: Johannes Berg; +Cc: linux-wireless@vger.kernel.org Johannes Berg wrote: > On Sat, 2009-04-18 at 18:48 +0100, Alan Jenkins wrote: > > >> Ah, I think I see it now. >> >> Um, what's the use-case for calling set_sw_state() before registration? >> Is it actually needed? >> > > Probably not. I thought you would use it to update the core's idea of > your state. But the core always forces you to its idea of the state :) > > >> I think it was doing _something_. If the initial wireless state is >> soft-blocked, but rfkill.default_state = 1 (unblocked), then without the >> set_sw_state() call, the wireless would remain soft blocked. When the >> first sync_work calls rfkill_set_block(false), the "prev" value would >> also be false, so it would return without calling .set_block(). And >> you'd have an inconsistency, because "/sys/class/rfkill/rfkill0/state" >> would say "1" (unblocked). >> >> You'd have a similar problem the other way around, if the wireless was >> initially enabled, but the user specified rfkill.default_state = 0. >> >> So maybe you need a "first time, force sync" flag instead. That would >> also help if you had a write-only rfkill line, no? >> > > Not sure what you mean -- the sync is always done on register()? > > johannes > Sorry, I misread the code again. I thought rfkill_set_block() returned early if the new state was equal to the old one, but it doesn't. ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: rfkill rewrite bug 2009-04-18 12:24 ` Johannes Berg 2009-04-18 13:29 ` Rfkill rewrite: eeepc-laptop resume Alan Jenkins 2009-04-18 15:49 ` rfkill rewrite bug Alan Jenkins @ 2009-04-18 17:42 ` Alan Jenkins 2009-04-18 17:59 ` Johannes Berg 2 siblings, 1 reply; 17+ messages in thread From: Alan Jenkins @ 2009-04-18 17:42 UTC (permalink / raw) To: Johannes Berg; +Cc: linux-wireless@vger.kernel.org Johannes Berg wrote: > On Sat, 2009-04-18 at 10:43 +0100, Alan Jenkins wrote: > > >>>> When I looked at the code earlier, I saw no obvious replacement for >>>> rfkill_set_default(). So I tried disabling the wireless and rebooting >>>> to see what happened. It didn't like that :-). >>>> >>>> >>> Ok that wasn't too hard -- try this on top if you get a chance: >>> >>> >> Great, that fixes the crash. >> >> >> 1) I think we need to add a resume method to eeepc-laptop. >> >> Without this, funny things happen when I hibernate, disable wireless in >> the BIOS, and resume: >> >> ath5k phy0: failed to wake up the MAC chip >> >> It's an really stupid thing to do, but it can happen. It's bad from a >> UI point of view. E.g. in network-manager, you can see a "wlan0" >> device, but it doesn't work. >> >> The EEE rfkill is unusual in that it hotplugs the PCI device, making >> eeepc-laptop something like a custom pci hotplug driver. With your >> rewrite, eeepc-laptop doesn't notice the state change on resume. >> Previously, the rfkill-core would restore the pre-hibernation state, >> which would sort everything out. I don't think anything else does this, >> so we can just add a resume method to eeepc-laptop. The resume method >> would re-check the state and do the PCI hotplug dance if necessary. >> >> If you agree, I can do the patch for this and send it to you. >> > > Sounds good to me, yeah. > > I could make the rfkill core do that at resume, but I'm not really sure > it's what we want -- there are too many cases imho: > * hard rfkill might have changed > * soft rfkill might still be ok in hw > * soft rfkill might need reconfiguring > etc. I think generally it's saner to let the driver sort it out -- it > can always ask for the current state by using set_hw_state() or so. > > >> 2) Do you have any thoughts about an rfkill_set_default() equivalent? >> AFAICS your current patch simply removes it. >> >> This means that when I boot linux, it doesn't respect the previous >> rfkill state. I can no longer disable the wireless in the BIOS setup >> screen, and the rfkill state won't be preserved over reboots. >> >> I don't have a strong feeling about reboots _on their own_. But I would >> be annoyed if the option in the BIOS setup screen stopped working in a >> future version of linux. Admittedly it's only a matter of principle / >> nostalgia - since the eeepc-laptop was fixed to implement rfkill >> properly, I've never used the BIOS option in anger. >> > > That's odd, I thought I added a set_sw_state() to rfkill which would > disable that rfkill. But there's rfkill_set_global_sw_state() which > should do what you want -- can you try replacing the EEE set_sw_state > call with that? > > johannes > Yes, that fixes it. Now it works the same as the old code which used rfkill_set_default(). Here's my resume code for eeepc-laptop. diff --git a/drivers/platform/x86/eeepc-laptop.c b/drivers/platform/x86/eeepc-laptop.c index c822bfa..5f594c6 100644 --- a/drivers/platform/x86/eeepc-laptop.c +++ b/drivers/platform/x86/eeepc-laptop.c @@ -177,6 +177,7 @@ static struct key_entry eeepc_keymap[] = { */ static int eeepc_hotk_add(struct acpi_device *device); static int eeepc_hotk_remove(struct acpi_device *device, int type); +static int eeepc_hotk_resume(struct acpi_device *device); static const struct acpi_device_id eeepc_device_ids[] = { {EEEPC_HOTK_HID, 0}, @@ -191,6 +192,7 @@ static struct acpi_driver eeepc_hotk_driver = { .ops = { .add = eeepc_hotk_add, .remove = eeepc_hotk_remove, + .resume = eeepc_hotk_resume }, }; @@ -495,14 +497,11 @@ static void notify_brn(void) bd->props.brightness = read_brightness(bd); } -static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data) +static void eeepc_rfkill_hotplug() { struct pci_dev *dev; struct pci_bus *bus = pci_find_bus(0, 1); - if (event != ACPI_NOTIFY_BUS_CHECK) - return; - if (!bus) { printk(EEEPC_WARNING "Unable to find PCI bus 1?\n"); return; @@ -530,6 +529,14 @@ static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data) } } +static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data) +{ + if (event != ACPI_NOTIFY_BUS_CHECK) + return; + + eeepc_rfkill_hotplug(); +} + static void eeepc_hotk_notify(acpi_handle handle, u32 event, void *data) { static struct key_entry *key; @@ -695,6 +702,22 @@ static int eeepc_hotk_remove(struct acpi_device *device, int type) return 0; } +static int eeepc_hotk_resume(struct acpi_device *device) +{ + if (ehotk->eeepc_wlan_rfkill) { + rfkill_set_sw_state(ehotk->eeepc_wlan_rfkill, + get_acpi(CM_ASL_WLAN) != 1); + + eeepc_rfkill_hotplug(); + } + + if (ehotk->eeepc_bluetooth_rfkill) + rfkill_set_sw_state(ehotk->eeepc_bluetooth_rfkill, + get_acpi(CM_ASL_BLUETOOTH) != 1); + + return 0; +} + /* * Hwmon */ ^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: rfkill rewrite bug 2009-04-18 17:42 ` Alan Jenkins @ 2009-04-18 17:59 ` Johannes Berg 2009-04-20 8:33 ` Alan Jenkins 0 siblings, 1 reply; 17+ messages in thread From: Johannes Berg @ 2009-04-18 17:59 UTC (permalink / raw) To: Alan Jenkins; +Cc: linux-wireless@vger.kernel.org [-- Attachment #1: Type: text/plain, Size: 1068 bytes --] On Sat, 2009-04-18 at 18:42 +0100, Alan Jenkins wrote: > > That's odd, I thought I added a set_sw_state() to rfkill which would > > disable that rfkill. But there's rfkill_set_global_sw_state() which > > should do what you want -- can you try replacing the EEE set_sw_state > > call with that? > Yes, that fixes it. Now it works the same as the old code which used > rfkill_set_default(). Cool. > +static int eeepc_hotk_resume(struct acpi_device *device); > > static const struct acpi_device_id eeepc_device_ids[] = { > {EEEPC_HOTK_HID, 0}, > @@ -191,6 +192,7 @@ static struct acpi_driver eeepc_hotk_driver = { > .ops = { > .add = eeepc_hotk_add, > .remove = eeepc_hotk_remove, > + .resume = eeepc_hotk_resume Please add a , at the end so other people updating that in the future don't need to change that line too. > +static void eeepc_rfkill_hotplug() Need (void) not () If you change those and give me a S-o-b I'll integrate it into my patch with something like S-o-b: <you> [eeepc driver parts] johannes [-- Attachment #2: This is a digitally signed message part --] [-- Type: application/pgp-signature, Size: 836 bytes --] ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: rfkill rewrite bug 2009-04-18 17:59 ` Johannes Berg @ 2009-04-20 8:33 ` Alan Jenkins 2009-04-20 8:44 ` Johannes Berg 0 siblings, 1 reply; 17+ messages in thread From: Alan Jenkins @ 2009-04-20 8:33 UTC (permalink / raw) To: Johannes Berg; +Cc: linux-wireless@vger.kernel.org Johannes Berg wrote: > On Sat, 2009-04-18 at 18:42 +0100, Alan Jenkins wrote: > > >>> That's odd, I thought I added a set_sw_state() to rfkill which would >>> disable that rfkill. But there's rfkill_set_global_sw_state() which >>> should do what you want -- can you try replacing the EEE set_sw_state >>> call with that? >>> > > >> Yes, that fixes it. Now it works the same as the old code which used >> rfkill_set_default(). >> > > Cool. > > >> +static int eeepc_hotk_resume(struct acpi_device *device); >> >> static const struct acpi_device_id eeepc_device_ids[] = { >> {EEEPC_HOTK_HID, 0}, >> @@ -191,6 +192,7 @@ static struct acpi_driver eeepc_hotk_driver = { >> .ops = { >> .add = eeepc_hotk_add, >> .remove = eeepc_hotk_remove, >> + .resume = eeepc_hotk_resume >> > > Please add a , at the end so other people updating that in the future > don't need to change that line too. > > >> +static void eeepc_rfkill_hotplug() >> > > Need (void) not () > > If you change those and give me a S-o-b I'll integrate it into my patch > with something like > > S-o-b: <you> [eeepc driver parts] > > > johannes Ok, revised patch is below. Don't forget the set_sw_state() -> set_global_sw_state() change; I didn't include that. Note that there other pending changes to the rfkill code in eeepc-laptop. "[PATCH] eee-laptop: Register as a pci-hotplug device" <http://thread.gmane.org/gmane.linux.kernel/791730/focus=38724> "[PATCH] eeepc-laptop: Work around rfkill firmware bug" <http://thread.gmane.org/gmane.linux.acpi.devel/38424> The second is mine; sorry for not warning about it sooner. So you/we probably need to co-ordinate with the maintainer. I'd CC linux-acpi, because that's where most platform driver changes are submitted. --- Signed-off-by: Alan Jenkins <alan-jenkins@tuffmail.co.uk> diff --git a/drivers/platform/x86/eeepc-laptop.c b/drivers/platform/x86/eeepc-laptop.c index 0e7a946..10366b2 100644 --- a/drivers/platform/x86/eeepc-laptop.c +++ b/drivers/platform/x86/eeepc-laptop.c @@ -177,6 +177,7 @@ static struct key_entry eeepc_keymap[] = { */ static int eeepc_hotk_add(struct acpi_device *device); static int eeepc_hotk_remove(struct acpi_device *device, int type); +static int eeepc_hotk_resume(struct acpi_device *device); static const struct acpi_device_id eeepc_device_ids[] = { {EEEPC_HOTK_HID, 0}, @@ -191,6 +192,7 @@ static struct acpi_driver eeepc_hotk_driver = { .ops = { .add = eeepc_hotk_add, .remove = eeepc_hotk_remove, + .resume = eeepc_hotk_resume, }, }; @@ -495,14 +497,11 @@ static void notify_brn(void) bd->props.brightness = read_brightness(bd); } -static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data) +static void eeepc_rfkill_hotplug(void) { struct pci_dev *dev; struct pci_bus *bus = pci_find_bus(0, 1); - if (event != ACPI_NOTIFY_BUS_CHECK) - return; - if (!bus) { printk(EEEPC_WARNING "Unable to find PCI bus 1?\n"); return; @@ -530,6 +529,14 @@ static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data) } } +static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data) +{ + if (event != ACPI_NOTIFY_BUS_CHECK) + return; + + eeepc_rfkill_hotplug(); +} + static void eeepc_hotk_notify(acpi_handle handle, u32 event, void *data) { static struct key_entry *key; @@ -695,6 +702,22 @@ static int eeepc_hotk_remove(struct acpi_device *device, int type) return 0; } +static int eeepc_hotk_resume(struct acpi_device *device) +{ + if (ehotk->eeepc_wlan_rfkill) { + rfkill_set_sw_state(ehotk->eeepc_wlan_rfkill, + get_acpi(CM_ASL_WLAN) != 1); + + eeepc_rfkill_hotplug(); + } + + if (ehotk->eeepc_bluetooth_rfkill) + rfkill_set_sw_state(ehotk->eeepc_bluetooth_rfkill, + get_acpi(CM_ASL_BLUETOOTH) != 1); + + return 0; +} + /* * Hwmon */ ^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: rfkill rewrite bug 2009-04-20 8:33 ` Alan Jenkins @ 2009-04-20 8:44 ` Johannes Berg 2009-04-20 9:20 ` Alan Jenkins 0 siblings, 1 reply; 17+ messages in thread From: Johannes Berg @ 2009-04-20 8:44 UTC (permalink / raw) To: Alan Jenkins; +Cc: linux-wireless@vger.kernel.org [-- Attachment #1: Type: text/plain, Size: 894 bytes --] On Mon, 2009-04-20 at 09:33 +0100, Alan Jenkins wrote: > Ok, revised patch is below. Don't forget the set_sw_state() -> > set_global_sw_state() change; I didn't include that. Ok, will do. Thanks for the patch, I'll integrate it into mine. > Note that there other pending changes to the rfkill code in eeepc-laptop. > > "[PATCH] eee-laptop: Register as a pci-hotplug device" > <http://thread.gmane.org/gmane.linux.kernel/791730/focus=38724> > > "[PATCH] eeepc-laptop: Work around rfkill firmware bug" > <http://thread.gmane.org/gmane.linux.acpi.devel/38424> > > The second is mine; sorry for not warning about it sooner. So you/we > probably need to co-ordinate with the maintainer. I'd CC linux-acpi, > because that's where most platform driver changes are submitted. Ok, thanks for the heads up. Do you think this will generate significant conflicts? johannes [-- Attachment #2: This is a digitally signed message part --] [-- Type: application/pgp-signature, Size: 836 bytes --] ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: rfkill rewrite bug 2009-04-20 8:44 ` Johannes Berg @ 2009-04-20 9:20 ` Alan Jenkins 2009-04-20 11:28 ` Johannes Berg 0 siblings, 1 reply; 17+ messages in thread From: Alan Jenkins @ 2009-04-20 9:20 UTC (permalink / raw) To: Johannes Berg; +Cc: linux-wireless@vger.kernel.org Johannes Berg wrote: > On Mon, 2009-04-20 at 09:33 +0100, Alan Jenkins wrote: > > >> Ok, revised patch is below. Don't forget the set_sw_state() -> >> set_global_sw_state() change; I didn't include that. >> > > Ok, will do. Thanks for the patch, I'll integrate it into mine. > > >> Note that there other pending changes to the rfkill code in eeepc-laptop. >> >> "[PATCH] eee-laptop: Register as a pci-hotplug device" >> <http://thread.gmane.org/gmane.linux.kernel/791730/focus=38724> >> >> "[PATCH] eeepc-laptop: Work around rfkill firmware bug" >> <http://thread.gmane.org/gmane.linux.acpi.devel/38424> >> >> The second is mine; sorry for not warning about it sooner. So you/we >> probably need to co-ordinate with the maintainer. I'd CC linux-acpi, >> because that's where most platform driver changes are submitted. >> > > Ok, thanks for the heads up. Do you think this will generate significant > conflicts? > I'm not quite sure what would be considered significant, but it's not trivial. At a high level, I don't think the new behaviours conflict with the new rfkill semantics :-). But the firmware bug workaround can't be resolved completely mechanically. And the pci-hotplug patch touches the rfkill error path. ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: rfkill rewrite bug 2009-04-20 9:20 ` Alan Jenkins @ 2009-04-20 11:28 ` Johannes Berg 0 siblings, 0 replies; 17+ messages in thread From: Johannes Berg @ 2009-04-20 11:28 UTC (permalink / raw) To: Alan Jenkins; +Cc: linux-wireless@vger.kernel.org [-- Attachment #1: Type: text/plain, Size: 623 bytes --] On Mon, 2009-04-20 at 10:20 +0100, Alan Jenkins wrote: > > Ok, thanks for the heads up. Do you think this will generate significant > > conflicts? > > > > I'm not quite sure what would be considered significant, but it's not > trivial. At a high level, I don't think the new behaviours conflict > with the new rfkill semantics :-). But the firmware bug workaround > can't be resolved completely mechanically. And the pci-hotplug patch > touches the rfkill error path. Ok, that helps, I think I'll just resolve the conflict when it hits linux-next. Might need to ask for your help then :) johannes [-- Attachment #2: This is a digitally signed message part --] [-- Type: application/pgp-signature, Size: 836 bytes --] ^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2009-04-20 11:28 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <49DCA88E.6060400@tuffmail.co.uk>
[not found] ` <1239204090.16477.1.camel@johannes.local>
[not found] ` <49DCDD2E.80705@tuffmail.co.uk>
[not found] ` <49E38BBC.5010708@tuffmail.co.uk>
[not found] ` <1239741968.4205.1.camel@johannes.local>
[not found] ` <49E98C86.2040308@tuffmail.co.uk>
[not found] ` <1240043283.5792.0.camel@johannes.local>
2009-04-18 9:43 ` rfkill rewrite bug Alan Jenkins
2009-04-18 12:24 ` Johannes Berg
2009-04-18 13:29 ` Rfkill rewrite: eeepc-laptop resume Alan Jenkins
2009-04-18 13:33 ` Johannes Berg
2009-04-18 14:02 ` Alan Jenkins
2009-04-18 14:10 ` Johannes Berg
2009-04-18 15:49 ` rfkill rewrite bug Alan Jenkins
2009-04-18 15:57 ` Johannes Berg
2009-04-18 17:48 ` Alan Jenkins
2009-04-18 17:57 ` Johannes Berg
2009-04-18 18:03 ` Alan Jenkins
2009-04-18 17:42 ` Alan Jenkins
2009-04-18 17:59 ` Johannes Berg
2009-04-20 8:33 ` Alan Jenkins
2009-04-20 8:44 ` Johannes Berg
2009-04-20 9:20 ` Alan Jenkins
2009-04-20 11:28 ` Johannes Berg
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).