diff options
Diffstat (limited to 'Documentation/rfkill.txt')
| -rw-r--r-- | Documentation/rfkill.txt | 137 |
1 files changed, 69 insertions, 68 deletions
diff --git a/Documentation/rfkill.txt b/Documentation/rfkill.txt index 1b74b5f30af4..c8acd8659e91 100644 --- a/Documentation/rfkill.txt +++ b/Documentation/rfkill.txt | |||
| @@ -3,9 +3,8 @@ rfkill - RF kill switch support | |||
| 3 | 3 | ||
| 4 | 1. Introduction | 4 | 1. Introduction |
| 5 | 2. Implementation details | 5 | 2. Implementation details |
| 6 | 3. Kernel driver guidelines | 6 | 3. Kernel API |
| 7 | 4. Kernel API | 7 | 4. Userspace support |
| 8 | 5. Userspace support | ||
| 9 | 8 | ||
| 10 | 9 | ||
| 11 | 1. Introduction | 10 | 1. Introduction |
| @@ -19,82 +18,62 @@ disable all transmitters of a certain type (or all). This is intended for | |||
| 19 | situations where transmitters need to be turned off, for example on | 18 | situations where transmitters need to be turned off, for example on |
| 20 | aircraft. | 19 | aircraft. |
| 21 | 20 | ||
| 21 | The rfkill subsystem has a concept of "hard" and "soft" block, which | ||
| 22 | differ little in their meaning (block == transmitters off) but rather in | ||
| 23 | whether they can be changed or not: | ||
| 24 | - hard block: read-only radio block that cannot be overriden by software | ||
| 25 | - soft block: writable radio block (need not be readable) that is set by | ||
| 26 | the system software. | ||
| 22 | 27 | ||
| 23 | 28 | ||
| 24 | 2. Implementation details | 29 | 2. Implementation details |
| 25 | 30 | ||
| 26 | The rfkill subsystem is composed of various components: the rfkill class, the | 31 | The rfkill subsystem is composed of three main components: |
| 27 | rfkill-input module (an input layer handler), and some specific input layer | 32 | * the rfkill core, |
| 28 | events. | 33 | * the deprecated rfkill-input module (an input layer handler, being |
| 29 | 34 | replaced by userspace policy code) and | |
| 30 | The rfkill class is provided for kernel drivers to register their radio | 35 | * the rfkill drivers. |
| 31 | transmitter with the kernel, provide methods for turning it on and off and, | ||
| 32 | optionally, letting the system know about hardware-disabled states that may | ||
| 33 | be implemented on the device. This code is enabled with the CONFIG_RFKILL | ||
| 34 | Kconfig option, which drivers can "select". | ||
| 35 | |||
| 36 | The rfkill class code also notifies userspace of state changes, this is | ||
| 37 | achieved via uevents. It also provides some sysfs files for userspace to | ||
| 38 | check the status of radio transmitters. See the "Userspace support" section | ||
| 39 | below. | ||
| 40 | 36 | ||
| 37 | The rfkill core provides API for kernel drivers to register their radio | ||
| 38 | transmitter with the kernel, methods for turning it on and off and, letting | ||
| 39 | the system know about hardware-disabled states that may be implemented on | ||
| 40 | the device. | ||
| 41 | 41 | ||
| 42 | The rfkill-input code implements a basic response to rfkill buttons -- it | 42 | The rfkill core code also notifies userspace of state changes, and provides |
| 43 | implements turning on/off all devices of a certain class (or all). | 43 | ways for userspace to query the current states. See the "Userspace support" |
| 44 | section below. | ||
| 44 | 45 | ||
| 45 | When the device is hard-blocked (either by a call to rfkill_set_hw_state() | 46 | When the device is hard-blocked (either by a call to rfkill_set_hw_state() |
| 46 | or from query_hw_block) set_block() will be invoked but drivers can well | 47 | or from query_hw_block) set_block() will be invoked for additional software |
| 47 | ignore the method call since they can use the return value of the function | 48 | block, but drivers can ignore the method call since they can use the return |
| 48 | rfkill_set_hw_state() to sync the software state instead of keeping track | 49 | value of the function rfkill_set_hw_state() to sync the software state |
| 49 | of calls to set_block(). | 50 | instead of keeping track of calls to set_block(). In fact, drivers should |
| 50 | 51 | use the return value of rfkill_set_hw_state() unless the hardware actually | |
| 51 | 52 | keeps track of soft and hard block separately. | |
| 52 | The entire functionality is spread over more than one subsystem: | ||
| 53 | |||
| 54 | * The kernel input layer generates KEY_WWAN, KEY_WLAN etc. and | ||
| 55 | SW_RFKILL_ALL -- when the user presses a button. Drivers for radio | ||
| 56 | transmitters generally do not register to the input layer, unless the | ||
| 57 | device really provides an input device (i.e. a button that has no | ||
| 58 | effect other than generating a button press event) | ||
| 59 | |||
| 60 | * The rfkill-input code hooks up to these events and switches the soft-block | ||
| 61 | of the various radio transmitters, depending on the button type. | ||
| 62 | |||
| 63 | * The rfkill drivers turn off/on their transmitters as requested. | ||
| 64 | |||
| 65 | * The rfkill class will generate userspace notifications (uevents) to tell | ||
| 66 | userspace what the current state is. | ||
| 67 | 53 | ||
| 68 | 54 | ||
| 55 | 3. Kernel API | ||
| 69 | 56 | ||
| 70 | 3. Kernel driver guidelines | ||
| 71 | 57 | ||
| 72 | 58 | Drivers for radio transmitters normally implement an rfkill driver. | |
| 73 | Drivers for radio transmitters normally implement only the rfkill class. | ||
| 74 | These drivers may not unblock the transmitter based on own decisions, they | ||
| 75 | should act on information provided by the rfkill class only. | ||
| 76 | 59 | ||
| 77 | Platform drivers might implement input devices if the rfkill button is just | 60 | Platform drivers might implement input devices if the rfkill button is just |
| 78 | that, a button. If that button influences the hardware then you need to | 61 | that, a button. If that button influences the hardware then you need to |
| 79 | implement an rfkill class instead. This also applies if the platform provides | 62 | implement an rfkill driver instead. This also applies if the platform provides |
| 80 | a way to turn on/off the transmitter(s). | 63 | a way to turn on/off the transmitter(s). |
| 81 | 64 | ||
| 82 | During suspend/hibernation, transmitters should only be left enabled when | 65 | For some platforms, it is possible that the hardware state changes during |
| 83 | wake-on wlan or similar functionality requires it and the device wasn't | 66 | suspend/hibernation, in which case it will be necessary to update the rfkill |
| 84 | blocked before suspend/hibernate. Note that it may be necessary to update | 67 | core with the current state is at resume time. |
| 85 | the rfkill subsystem's idea of what the current state is at resume time if | ||
| 86 | the state may have changed over suspend. | ||
| 87 | |||
| 88 | 68 | ||
| 69 | To create an rfkill driver, driver's Kconfig needs to have | ||
| 89 | 70 | ||
| 90 | 4. Kernel API | 71 | depends on RFKILL || !RFKILL |
| 91 | 72 | ||
| 92 | To build a driver with rfkill subsystem support, the driver should depend on | 73 | to ensure the driver cannot be built-in when rfkill is modular. The !RFKILL |
| 93 | (or select) the Kconfig symbol RFKILL. | 74 | case allows the driver to be built when rfkill is not configured, which which |
| 94 | 75 | case all rfkill API can still be used but will be provided by static inlines | |
| 95 | The hardware the driver talks to may be write-only (where the current state | 76 | which compile to almost nothing. |
| 96 | of the hardware is unknown), or read-write (where the hardware can be queried | ||
| 97 | about its current state). | ||
| 98 | 77 | ||
| 99 | Calling rfkill_set_hw_state() when a state change happens is required from | 78 | Calling rfkill_set_hw_state() when a state change happens is required from |
| 100 | rfkill drivers that control devices that can be hard-blocked unless they also | 79 | rfkill drivers that control devices that can be hard-blocked unless they also |
| @@ -105,10 +84,33 @@ device). Don't do this unless you cannot get the event in any other way. | |||
| 105 | 84 | ||
| 106 | 5. Userspace support | 85 | 5. Userspace support |
| 107 | 86 | ||
| 108 | The following sysfs entries exist for every rfkill device: | 87 | The recommended userspace interface to use is /dev/rfkill, which is a misc |
| 88 | character device that allows userspace to obtain and set the state of rfkill | ||
| 89 | devices and sets of devices. It also notifies userspace about device addition | ||
| 90 | and removal. The API is a simple read/write API that is defined in | ||
| 91 | linux/rfkill.h, with one ioctl that allows turning off the deprecated input | ||
| 92 | handler in the kernel for the transition period. | ||
| 93 | |||
| 94 | Except for the one ioctl, communication with the kernel is done via read() | ||
| 95 | and write() of instances of 'struct rfkill_event'. In this structure, the | ||
| 96 | soft and hard block are properly separated (unlike sysfs, see below) and | ||
| 97 | userspace is able to get a consistent snapshot of all rfkill devices in the | ||
| 98 | system. Also, it is possible to switch all rfkill drivers (or all drivers of | ||
| 99 | a specified type) into a state which also updates the default state for | ||
| 100 | hotplugged devices. | ||
| 101 | |||
| 102 | After an application opens /dev/rfkill, it can read the current state of | ||
| 103 | all devices, and afterwards can poll the descriptor for hotplug or state | ||
| 104 | change events. | ||
| 105 | |||
| 106 | Applications must ignore operations (the "op" field) they do not handle, | ||
| 107 | this allows the API to be extended in the future. | ||
| 108 | |||
| 109 | Additionally, each rfkill device is registered in sysfs and there has the | ||
| 110 | following attributes: | ||
| 109 | 111 | ||
| 110 | name: Name assigned by driver to this key (interface or driver name). | 112 | name: Name assigned by driver to this key (interface or driver name). |
| 111 | type: Name of the key type ("wlan", "bluetooth", etc). | 113 | type: Driver type string ("wlan", "bluetooth", etc). |
| 112 | state: Current state of the transmitter | 114 | state: Current state of the transmitter |
| 113 | 0: RFKILL_STATE_SOFT_BLOCKED | 115 | 0: RFKILL_STATE_SOFT_BLOCKED |
| 114 | transmitter is turned off by software | 116 | transmitter is turned off by software |
| @@ -117,7 +119,12 @@ The following sysfs entries exist for every rfkill device: | |||
| 117 | 2: RFKILL_STATE_HARD_BLOCKED | 119 | 2: RFKILL_STATE_HARD_BLOCKED |
| 118 | transmitter is forced off by something outside of | 120 | transmitter is forced off by something outside of |
| 119 | the driver's control. | 121 | the driver's control. |
| 120 | claim: 0: Kernel handles events (currently always reads that value) | 122 | This file is deprecated because it can only properly show |
| 123 | three of the four possible states, soft-and-hard-blocked is | ||
| 124 | missing. | ||
| 125 | claim: 0: Kernel handles events | ||
| 126 | This file is deprecated because there no longer is a way to | ||
| 127 | claim just control over a single rfkill instance. | ||
| 121 | 128 | ||
| 122 | rfkill devices also issue uevents (with an action of "change"), with the | 129 | rfkill devices also issue uevents (with an action of "change"), with the |
| 123 | following environment variables set: | 130 | following environment variables set: |
| @@ -128,9 +135,3 @@ RFKILL_TYPE | |||
| 128 | 135 | ||
| 129 | The contents of these variables corresponds to the "name", "state" and | 136 | The contents of these variables corresponds to the "name", "state" and |
| 130 | "type" sysfs files explained above. | 137 | "type" sysfs files explained above. |
| 131 | |||
| 132 | An alternative userspace interface exists as a misc device /dev/rfkill, | ||
| 133 | which allows userspace to obtain and set the state of rfkill devices and | ||
| 134 | sets of devices. It also notifies userspace about device addition and | ||
| 135 | removal. The API is a simple read/write API that is defined in | ||
| 136 | linux/rfkill.h. | ||
