[remove Alan, his email address no longer works] Hi, > Sorry for I didn't really capture what your mean. Please then me > introduce the issue's background: > > For the beginning, I added this patch to acer-wmi driver: > > http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=466449cfe797b8a5d82d25d0e0e08426d8dfba19 > > Because Acer notebook's BIOS can keep the devices state when system > reboot, so, the above patch add the logic when acer-wmi driver initial > to query the devices state by wmi method then set soft-block to > acer-wmi's killswitch, including wlan, bluetooth and wwan. > > The acer-wmi used rfkill_init_sw_state to set the initial state before > rfkill register. Yeah that seems reasonable. > There have source code in rfkill_init_sw_state to set rfkill to > persistent, then rfkill/core.c replicate acer-wmi's bluetooth state to > the same type's rfkill. > > if (!rfkill->persistent || rfkill_epo_lock_active) { > schedule_work(&rfkill->sync_work); > } else { > #ifdef CONFIG_RFKILL_INPUT > bool soft_blocked = !!(rfkill->state & RFKILL_BLOCK_SW); > > if (!atomic_read(&rfkill_input_disabled)) //when rfkill-input enable > __rfkill_switch_all(rfkill->type, soft_blocked); //set sw block state to the same type > #endif > } But that's also required to actually make the persistent state have any impact at all. > No, BIOS only emit acpi notify when user press function key, acer-wmi > driver emit KEY_WLAN to userland after receive the acpi notify. Of > course at this moment, acer-wmi driver need to maintain rfkill state to > sync with real device state. So, I'm confused. Why does the driver not use the acer_wmi_notify function to update the rfkill status too, but polls it every second? > > It seems that what happens is roughly this: > > 1) at boot, all BT is set to soft-killed due to the way the BIOS > > started up > > Yes, acer BIOS's default value is bluetooth disabled. So, when system > boot, there only have acer-wmi's bluetooth killswitch: > > 0: acer-wireless: Wireless LAN > Soft blocked: no > Hard blocked: no > 1: acer-bluetooth: Bluetooth > Soft blocked: yes # default is sw block > Hard blocked: no > 2: acer-threeg: Wireless WAN > Soft blocked: no > Hard blocked: no > 4: phy0: Wireless LAN > Soft blocked: no > Hard blocked: no > > There have no hci0's killswtich, because BT device power off by BIOS > when system cold boot. Right -- I missed that part. > > 2) when you press the button, it's a toggle, so rfkill-input toggles > > all BT rfkill instances (acer and hci0) > > Per OldÅich's report, he press bluetooth hardware key then see like the > following: > > 4: phy0: Wireless LAN > Soft blocked: no > Hard blocked: no > 6: acer-wireless: Wireless LAN > Soft blocked: no > Hard blocked: no > 7: acer-bluetooth: Bluetooth > Soft blocked: no > Hard blocked: no > 8: acer-threeg: Wirele Hard blocked: no > 9: hci0: Bluetooth > Soft blocked: yes # create hci0 rfkill but default is soft blocked > Hard blocked: no > > I didn't have bluetooth HW key on my Acer machine, but I can unblock acer-wmi bluetooth > rfkill manually to reproduce this issue. Hmm, that I don't understand. Why would that reproduce the issue? Ah, ok, that's because __rfkill_switch_all() will set global_states, and it happens during init. So it gets registered with the global state, which is still blocked since you just unblocked this single thing. So, it seems that the design here only works if a) the bios stores the last state b) the driver only reports key inputs, no rfkill inputs > If only use bluetooth HW key to control the rfkill, then it should be > fine. But, OldÅich report still have problem cann't enable bluetooth > after he press HW key because hci0's bluetooth default set to soft > blocked. Yeah that's because the BT hw key seems to generate the wrong event? > If we want to remove rfkill-input, then we need re-compiler kernel. Why > don't add a option for enable/disable it ? Well I don't think we want to remove rfkill input, ever, because that just leads to a mess where the user has to take action. I'd rather have it work out of the box and be overridden by urfkill which should work fine. Of course, in this particular instance it _doesn't_ work out of the box, but shouldn't we rather fix that? But due the the behaviour you outlined earlier, I think your patch makes sense... the BIOS doesn't actually seem to _store_ the rfkill state anyway, since it's always off when you cold boot. So why bother using that state as the default anyway? That will work around the problem at hand by making the acer wmi enable BT whenever it is loaded, but that doesn't seem so bad either. As for the more generic problem, I'm not sure what to do. I really wish people would just use urfkill. johannes -- To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html