| rfkill - RF switch subsystem support | |
| ==================================== | |
| 1 Implementation details | |
| 2 Driver support | |
| 3 Userspace support | |
| =============================================================================== | |
| 1: Implementation details | |
| The rfkill switch subsystem offers support for keys often found on laptops | |
| to enable wireless devices like WiFi and Bluetooth. | |
| This is done by providing the user 3 possibilities: | |
| 1 - The rfkill system handles all events; userspace is not aware of events. | |
| 2 - The rfkill system handles all events; userspace is informed about the events. | |
| 3 - The rfkill system does not handle events; userspace handles all events. | |
| The buttons to enable and disable the wireless radios are important in | |
| situations where the user is for example using his laptop on a location where | |
| wireless radios _must_ be disabled (e.g. airplanes). | |
| Because of this requirement, userspace support for the keys should not be | |
| made mandatory. Because userspace might want to perform some additional smarter | |
| tasks when the key is pressed, rfkill still provides userspace the possibility | |
| to take over the task to handle the key events. | |
| The system inside the kernel has been split into 2 separate sections: | |
| 1 - RFKILL | |
| 2 - RFKILL_INPUT | |
| The first option enables rfkill support and will make sure userspace will | |
| be notified of any events through the input device. It also creates several | |
| sysfs entries which can be used by userspace. See section "Userspace support". | |
| The second option provides an rfkill input handler. This handler will | |
| listen to all rfkill key events and will toggle the radio accordingly. | |
| With this option enabled userspace could either do nothing or simply | |
| perform monitoring tasks. | |
| ==================================== | |
| 2: Driver support | |
| To build a driver with rfkill subsystem support, the driver should | |
| depend on the Kconfig symbol RFKILL; it should _not_ depend on | |
| RKFILL_INPUT. | |
| Unless key events trigger an interrupt to which the driver listens, polling | |
| will be required to determine the key state changes. For this the input | |
| layer providers the input-polldev handler. | |
| A driver should implement a few steps to correctly make use of the | |
| rfkill subsystem. First for non-polling drivers: | |
| - rfkill_allocate() | |
| - input_allocate_device() | |
| - rfkill_register() | |
| - input_register_device() | |
| For polling drivers: | |
| - rfkill_allocate() | |
| - input_allocate_polled_device() | |
| - rfkill_register() | |
| - input_register_polled_device() | |
| When a key event has been detected, the correct event should be | |
| sent over the input device which has been registered by the driver. | |
| ==================================== | |
| 3: Userspace support | |
| For each key an input device will be created which will send out the correct | |
| key event when the rfkill key has been pressed. | |
| The following sysfs entries will be created: | |
| name: Name assigned by driver to this key (interface or driver name). | |
| type: Name of the key type ("wlan", "bluetooth", etc). | |
| state: Current state of the key. 1: On, 0: Off. | |
| claim: 1: Userspace handles events, 0: Kernel handles events | |
| Both the "state" and "claim" entries are also writable. For the "state" entry | |
| this means that when 1 or 0 is written all radios, not yet in the requested | |
| state, will be will be toggled accordingly. | |
| For the "claim" entry writing 1 to it means that the kernel no longer handles | |
| key events even though RFKILL_INPUT input was enabled. When "claim" has been | |
| set to 0, userspace should make sure that it listens for the input events or | |
| check the sysfs "state" entry regularly to correctly perform the required | |
| tasks when the rkfill key is pressed. |