diff options
author | Henrique de Moraes Holschuh <hmh@hmh.eng.br> | 2008-06-23 16:46:43 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2008-06-26 14:21:22 -0400 |
commit | f7983f7301d530cb3f3a02618c944f6d108d11df (patch) | |
tree | 2e9fda4ae35c127db018634fa084641d0e8c9200 /Documentation/rfkill.txt | |
parent | 5005657cbd0fd6f277f807c0612a6b6d4396a02c (diff) |
rfkill: improve documentation for kernel drivers
Improve the documentation of how to use the rfkill class in kernel drivers,
based on the doubts that came up in a thread in linux-wireless.
Signed-off-by: Henrique de Moraes Holschuh <hmh@hmh.eng.br>
Acked-by: Ivo van Doorn <IvDoorn@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'Documentation/rfkill.txt')
-rw-r--r-- | Documentation/rfkill.txt | 261 |
1 files changed, 201 insertions, 60 deletions
diff --git a/Documentation/rfkill.txt b/Documentation/rfkill.txt index 5316cea95ce0..0843ed0163a5 100644 --- a/Documentation/rfkill.txt +++ b/Documentation/rfkill.txt | |||
@@ -4,6 +4,9 @@ rfkill - RF switch subsystem support | |||
4 | 1 Introduction | 4 | 1 Introduction |
5 | 2 Implementation details | 5 | 2 Implementation details |
6 | 3 Kernel driver guidelines | 6 | 3 Kernel driver guidelines |
7 | 3.1 wireless device drivers | ||
8 | 3.2 platform/switch drivers | ||
9 | 3.3 input device drivers | ||
7 | 4 Kernel API | 10 | 4 Kernel API |
8 | 5 Userspace support | 11 | 5 Userspace support |
9 | 12 | ||
@@ -14,9 +17,14 @@ The rfkill switch subsystem exists to add a generic interface to circuitry that | |||
14 | can enable or disable the signal output of a wireless *transmitter* of any | 17 | can enable or disable the signal output of a wireless *transmitter* of any |
15 | type. By far, the most common use is to disable radio-frequency transmitters. | 18 | type. By far, the most common use is to disable radio-frequency transmitters. |
16 | 19 | ||
17 | The rfkill switch subsystem offers support for keys and switches often found on | 20 | Note that disabling the signal output means that the the transmitter is to be |
18 | laptops to enable wireless devices like WiFi and Bluetooth to actually perform | 21 | made to not emit any energy when "blocked". rfkill is not about blocking data |
19 | an action. | 22 | transmissions, it is about blocking energy emission. |
23 | |||
24 | The rfkill subsystem offers support for keys and switches often found on | ||
25 | laptops to enable wireless devices like WiFi and Bluetooth, so that these keys | ||
26 | and switches actually perform an action in all wireless devices of a given type | ||
27 | attached to the system. | ||
20 | 28 | ||
21 | The buttons to enable and disable the wireless transmitters are important in | 29 | The buttons to enable and disable the wireless transmitters are important in |
22 | situations where the user is for example using his laptop on a location where | 30 | situations where the user is for example using his laptop on a location where |
@@ -30,40 +38,81 @@ take over the task to handle the key events. | |||
30 | =============================================================================== | 38 | =============================================================================== |
31 | 2: Implementation details | 39 | 2: Implementation details |
32 | 40 | ||
41 | The rfkill subsystem is composed of various components: the rfkill class, the | ||
42 | rfkill-input module (an input layer handler), and some specific input layer | ||
43 | events. | ||
44 | |||
33 | The rfkill class provides kernel drivers with an interface that allows them to | 45 | The rfkill class provides kernel drivers with an interface that allows them to |
34 | know when they should enable or disable a wireless network device transmitter. | 46 | know when they should enable or disable a wireless network device transmitter. |
47 | This is enabled by the CONFIG_RFKILL Kconfig option. | ||
48 | |||
49 | The rfkill class support makes sure userspace will be notified of all state | ||
50 | changes on rfkill devices through uevents. It provides a notification chain | ||
51 | for interested parties in the kernel to also get notified of rfkill state | ||
52 | changes in other drivers. It creates several sysfs entries which can be used | ||
53 | by userspace. See section "Userspace support". | ||
35 | 54 | ||
36 | The rfkill-input module provides the kernel with the ability to implement a | 55 | The rfkill-input module provides the kernel with the ability to implement a |
37 | basic response when the user presses a key or button (or toggles a switch) | 56 | basic response when the user presses a key or button (or toggles a switch) |
38 | related to rfkill functionality. It is an in-kernel implementation of default | 57 | related to rfkill functionality. It is an in-kernel implementation of default |
39 | policy of reacting to rfkill-related input events and neither mandatory nor | 58 | policy of reacting to rfkill-related input events and neither mandatory nor |
40 | required for wireless drivers to operate. | 59 | required for wireless drivers to operate. It is enabled by the |
60 | CONFIG_RFKILL_INPUT Kconfig option. | ||
61 | |||
62 | rfkill-input is a rfkill-related events input layer handler. This handler will | ||
63 | listen to all rfkill key events and will change the rfkill state of the | ||
64 | wireless devices accordingly. With this option enabled userspace could either | ||
65 | do nothing or simply perform monitoring tasks. | ||
41 | 66 | ||
42 | The rfkill-input module also provides EPO (emergency power-off) functionality | 67 | The rfkill-input module also provides EPO (emergency power-off) functionality |
43 | for all wireless transmitters. This function cannot be overriden, and it is | 68 | for all wireless transmitters. This function cannot be overridden, and it is |
44 | always active. rfkill EPO is related to *_RFKILL_ALL input events. | 69 | always active. rfkill EPO is related to *_RFKILL_ALL input layer events. |
70 | |||
71 | |||
72 | Important terms for the rfkill subsystem: | ||
73 | |||
74 | In order to avoid confusion, we avoid the term "switch" in rfkill when it is | ||
75 | referring to an electronic control circuit that enables or disables a | ||
76 | transmitter. We reserve it for the physical device a human manipulates | ||
77 | (which is an input device, by the way): | ||
78 | |||
79 | rfkill switch: | ||
80 | |||
81 | A physical device a human manipulates. Its state can be perceived by | ||
82 | the kernel either directly (through a GPIO pin, ACPI GPE) or by its | ||
83 | effect on a rfkill line of a wireless device. | ||
84 | |||
85 | rfkill controller: | ||
45 | 86 | ||
46 | All state changes on rfkill devices are propagated by the rfkill class to a | 87 | A hardware circuit that controls the state of a rfkill line, which a |
47 | notification chain and also to userspace through uevents. | 88 | kernel driver can interact with *to modify* that state (i.e. it has |
89 | either write-only or read/write access). | ||
48 | 90 | ||
49 | The system inside the kernel has been split into 2 separate sections: | 91 | rfkill line: |
50 | 1 - RFKILL | ||
51 | 2 - RFKILL_INPUT | ||
52 | 92 | ||
53 | The first option enables rfkill support and will make sure userspace will be | 93 | An input channel (hardware or software) of a wireless device, which |
54 | notified of any events through uevents. It provides a notification chain for | 94 | causes a wireless transmitter to stop emitting energy (BLOCK) when it |
55 | interested parties in the kernel to also get notified of rfkill state changes | 95 | is active. Point of view is extremely important here: rfkill lines are |
56 | in other drivers. It creates several sysfs entries which can be used by | 96 | always seen from the PoV of a wireless device (and its driver). |
57 | userspace. See section "Userspace support". | ||
58 | 97 | ||
59 | The second option provides an rfkill input handler. This handler will listen to | 98 | soft rfkill line/software rfkill line: |
60 | all rfkill key events and will toggle the radio accordingly. With this option | ||
61 | enabled userspace could either do nothing or simply perform monitoring tasks. | ||
62 | 99 | ||
63 | When a rfkill switch is in the RFKILL_STATE_UNBLOCKED, the wireless transmitter | 100 | A rfkill line the wireless device driver can directly change the state |
64 | (radio TX circuit for example) is *enabled*. When the rfkill switch is in the | 101 | of. Related to rfkill_state RFKILL_STATE_SOFT_BLOCKED. |
65 | RFKILL_STATE_SOFT_BLOCKED or RFKILL_STATE_HARD_BLOCKED, the wireless | 102 | |
66 | transmitter is to be *blocked* from operating. | 103 | hard rfkill line/hardware rfkill line: |
104 | |||
105 | A rfkill line that works fully in hardware or firmware, and that cannot | ||
106 | be overridden by the kernel driver. The hardware device or the | ||
107 | firmware just exports its status to the driver, but it is read-only. | ||
108 | Related to rfkill_state RFKILL_STATE_HARD_BLOCKED. | ||
109 | |||
110 | The enum rfkill_state describes the rfkill state of a transmitter: | ||
111 | |||
112 | When a rfkill line or rfkill controller is in the RFKILL_STATE_UNBLOCKED state, | ||
113 | the wireless transmitter (radio TX circuit for example) is *enabled*. When the | ||
114 | it is in the RFKILL_STATE_SOFT_BLOCKED or RFKILL_STATE_HARD_BLOCKED, the | ||
115 | wireless transmitter is to be *blocked* from operating. | ||
67 | 116 | ||
68 | RFKILL_STATE_SOFT_BLOCKED indicates that a call to toggle_radio() can change | 117 | RFKILL_STATE_SOFT_BLOCKED indicates that a call to toggle_radio() can change |
69 | that state. RFKILL_STATE_HARD_BLOCKED indicates that a call to toggle_radio() | 118 | that state. RFKILL_STATE_HARD_BLOCKED indicates that a call to toggle_radio() |
@@ -92,12 +141,12 @@ Kernel Input layer: | |||
92 | used to issue *commands* for the system to change behaviour, and these | 141 | used to issue *commands* for the system to change behaviour, and these |
93 | commands may or may not be carried out by some kernel driver or | 142 | commands may or may not be carried out by some kernel driver or |
94 | userspace application. It follows that doing user feedback based only | 143 | userspace application. It follows that doing user feedback based only |
95 | on input events is broken, there is no guarantee that an input event | 144 | on input events is broken, as there is no guarantee that an input event |
96 | will be acted upon. | 145 | will be acted upon. |
97 | 146 | ||
98 | Most wireless communication device drivers implementing rfkill | 147 | Most wireless communication device drivers implementing rfkill |
99 | functionality MUST NOT generate these events, and have no reason to | 148 | functionality MUST NOT generate these events, and have no reason to |
100 | register themselves with the input layer. This is a common | 149 | register themselves with the input layer. Doing otherwise is a common |
101 | misconception. There is an API to propagate rfkill status change | 150 | misconception. There is an API to propagate rfkill status change |
102 | information, and it is NOT the input layer. | 151 | information, and it is NOT the input layer. |
103 | 152 | ||
@@ -117,11 +166,22 @@ rfkill class: | |||
117 | 166 | ||
118 | THE RFKILL CLASS NEVER ISSUES INPUT EVENTS. THE RFKILL CLASS DOES | 167 | THE RFKILL CLASS NEVER ISSUES INPUT EVENTS. THE RFKILL CLASS DOES |
119 | NOT LISTEN TO INPUT EVENTS. NO DRIVER USING THE RFKILL CLASS SHALL | 168 | NOT LISTEN TO INPUT EVENTS. NO DRIVER USING THE RFKILL CLASS SHALL |
120 | EVER LISTEN TO, OR ACT ON RFKILL INPUT EVENTS. | 169 | EVER LISTEN TO, OR ACT ON RFKILL INPUT EVENTS. Doing otherwise is |
170 | a layering violation. | ||
121 | 171 | ||
122 | Most wireless data communication drivers in the kernel have just to | 172 | Most wireless data communication drivers in the kernel have just to |
123 | implement the rfkill class API to work properly. Interfacing to the | 173 | implement the rfkill class API to work properly. Interfacing to the |
124 | input layer is not often required (and is very often a *bug*). | 174 | input layer is not often required (and is very often a *bug*) on |
175 | wireless drivers. | ||
176 | |||
177 | Platform drivers often have to attach to the input layer to *issue* | ||
178 | (but never to listen to) rfkill events for rfkill switches, and also to | ||
179 | the rfkill class to export a control interface for the platform rfkill | ||
180 | controllers to the rfkill subsystem. This does NOT mean the rfkill | ||
181 | switch is attached to a rfkill class (doing so is almost always wrong). | ||
182 | It just means the same kernel module is the driver for different | ||
183 | devices (rfkill switches and rfkill controllers). | ||
184 | |||
125 | 185 | ||
126 | Userspace input handlers (uevents) or kernel input handlers (rfkill-input): | 186 | Userspace input handlers (uevents) or kernel input handlers (rfkill-input): |
127 | 187 | ||
@@ -153,24 +213,34 @@ rfkill notifier chain: | |||
153 | =============================================================================== | 213 | =============================================================================== |
154 | 3: Kernel driver guidelines | 214 | 3: Kernel driver guidelines |
155 | 215 | ||
216 | Remember: point-of-view is everything for a driver that connects to the rfkill | ||
217 | subsystem. All the details below must be measured/perceived from the point of | ||
218 | view of the specific driver being modified. | ||
219 | |||
156 | The first thing one needs to know is whether his driver should be talking to | 220 | The first thing one needs to know is whether his driver should be talking to |
157 | the rfkill class or to the input layer. | 221 | the rfkill class or to the input layer. In rare cases (platform drivers), it |
222 | could happen that you need to do both, as platform drivers often handle a | ||
223 | variety of devices in the same driver. | ||
158 | 224 | ||
159 | Do not mistake input devices for rfkill devices. The only type of "rfkill | 225 | Do not mistake input devices for rfkill controllers. The only type of "rfkill |
160 | switch" device that is to be registered with the rfkill class are those | 226 | switch" device that is to be registered with the rfkill class are those |
161 | directly controlling the circuits that cause a wireless transmitter to stop | 227 | directly controlling the circuits that cause a wireless transmitter to stop |
162 | working (or the software equivalent of them). Every other kind of "rfkill | 228 | working (or the software equivalent of them), i.e. what we call a rfkill |
163 | switch" is just an input device and MUST NOT be registered with the rfkill | 229 | controller. Every other kind of "rfkill switch" is just an input device and |
164 | class. | 230 | MUST NOT be registered with the rfkill class. |
165 | 231 | ||
166 | A driver should register a device with the rfkill class when ALL of the | 232 | A driver should register a device with the rfkill class when ALL of the |
167 | following conditions are met: | 233 | following conditions are met (they define a rfkill controller): |
168 | 234 | ||
169 | 1. The device is/controls a data communications wireless transmitter; | 235 | 1. The device is/controls a data communications wireless transmitter; |
170 | 236 | ||
171 | 2. The kernel can interact with the hardware/firmware to CHANGE the wireless | 237 | 2. The kernel can interact with the hardware/firmware to CHANGE the wireless |
172 | transmitter state (block/unblock TX operation); | 238 | transmitter state (block/unblock TX operation); |
173 | 239 | ||
240 | 3. The transmitter can be made to not emit any energy when "blocked": | ||
241 | rfkill is not about blocking data transmissions, it is about blocking | ||
242 | energy emission; | ||
243 | |||
174 | A driver should register a device with the input subsystem to issue | 244 | A driver should register a device with the input subsystem to issue |
175 | rfkill-related events (KEY_WLAN, KEY_BLUETOOTH, KEY_WWAN, KEY_WIMAX, | 245 | rfkill-related events (KEY_WLAN, KEY_BLUETOOTH, KEY_WWAN, KEY_WIMAX, |
176 | SW_RFKILL_ALL, etc) when ALL of the folowing conditions are met: | 246 | SW_RFKILL_ALL, etc) when ALL of the folowing conditions are met: |
@@ -186,9 +256,7 @@ SW_RFKILL_ALL, etc) when ALL of the folowing conditions are met: | |||
186 | 2. It is NOT slaved to another device, i.e. there is no other device that | 256 | 2. It is NOT slaved to another device, i.e. there is no other device that |
187 | issues rfkill-related input events in preference to this one. | 257 | issues rfkill-related input events in preference to this one. |
188 | 258 | ||
189 | Typically, the ACPI "radio kill" switch of a laptop is the master input | 259 | Please refer to the corner cases and examples section for more details. |
190 | device to issue rfkill events, and, e.g., the WLAN card is just a slave | ||
191 | device that gets disabled by its hardware radio-kill input pin. | ||
192 | 260 | ||
193 | When in doubt, do not issue input events. For drivers that should generate | 261 | When in doubt, do not issue input events. For drivers that should generate |
194 | input events in some platforms, but not in others (e.g. b43), the best solution | 262 | input events in some platforms, but not in others (e.g. b43), the best solution |
@@ -252,26 +320,102 @@ Add the SW_* events you need for switches, do NOT try to emulate a button using | |||
252 | KEY_* events just because there is no such SW_* event yet. Do NOT try to use, | 320 | KEY_* events just because there is no such SW_* event yet. Do NOT try to use, |
253 | for example, KEY_BLUETOOTH when you should be using SW_BLUETOOTH instead. | 321 | for example, KEY_BLUETOOTH when you should be using SW_BLUETOOTH instead. |
254 | 322 | ||
255 | 2. Input device switches (sources of EV_SW events) DO store their current | 323 | 2. Input device switches (sources of EV_SW events) DO store their current state |
256 | state, and that state CAN be queried from userspace through IOCTLs. There is | 324 | (so you *must* initialize it by issuing a gratuitous input layer event on |
257 | no sysfs interface for this, but that doesn't mean you should break things | 325 | driver start-up and also when resuming from sleep), and that state CAN be |
258 | trying to hook it to the rfkill class to get a sysfs interface :-) | 326 | queried from userspace through IOCTLs. There is no sysfs interface for this, |
327 | but that doesn't mean you should break things trying to hook it to the rfkill | ||
328 | class to get a sysfs interface :-) | ||
329 | |||
330 | 3. Do not issue *_RFKILL_ALL events by default, unless you are sure it is the | ||
331 | correct event for your switch/button. These events are emergency power-off | ||
332 | events when they are trying to turn the transmitters off. An example of an | ||
333 | input device which SHOULD generate *_RFKILL_ALL events is the wireless-kill | ||
334 | switch in a laptop which is NOT a hotkey, but a real switch that kills radios | ||
335 | in hardware, even if the O.S. has gone to lunch. An example of an input device | ||
336 | which SHOULD NOT generate *_RFKILL_ALL events by default, is any sort of hot | ||
337 | key that does nothing by itself, as well as any hot key that is type-specific | ||
338 | (e.g. the one for WLAN). | ||
259 | 339 | ||
260 | 3. Do not issue *_RFKILL_ALL events, unless you are sure it is the correct | ||
261 | event for your switch/button. These events are emergency power-off events when | ||
262 | they are trying to turn the transmitters off. An example of an input device | ||
263 | which SHOULD generate *_RFKILL_ALL events is the wireless-kill switch in a | ||
264 | laptop which is NOT a hotkey, but a real switch that kills radios in hardware, | ||
265 | even if the O.S. has gone to lunch. An example of an input device which SHOULD | ||
266 | NOT generate *_RFKILL_ALL events is any sort of hot key that does nothing by | ||
267 | itself, as well as any hot key that is type-specific (e.g. the one for WLAN). | ||
268 | 340 | ||
341 | 3.1 Guidelines for wireless device drivers | ||
342 | ------------------------------------------ | ||
343 | |||
344 | 1. Each independent transmitter in a wireless device (usually there is only one | ||
345 | transmitter per device) should have a SINGLE rfkill class attached to it. | ||
346 | |||
347 | 2. If the device does not have any sort of hardware assistance to allow the | ||
348 | driver to rfkill the device, the driver should emulate it by taking all actions | ||
349 | required to silence the transmitter. | ||
350 | |||
351 | 3. If it is impossible to silence the transmitter (i.e. it still emits energy, | ||
352 | even if it is just in brief pulses, when there is no data to transmit and there | ||
353 | is no hardware support to turn it off) do NOT lie to the users. Do not attach | ||
354 | it to a rfkill class. The rfkill subsystem does not deal with data | ||
355 | transmission, it deals with energy emission. If the transmitter is emitting | ||
356 | energy, it is not blocked in rfkill terms. | ||
357 | |||
358 | 4. It doesn't matter if the device has multiple rfkill input lines affecting | ||
359 | the same transmitter, their combined state is to be exported as a single state | ||
360 | per transmitter (see rule 1). | ||
361 | |||
362 | This rule exists because users of the rfkill subsystem expect to get (and set, | ||
363 | when possible) the overall transmitter rfkill state, not of a particular rfkill | ||
364 | line. | ||
365 | |||
366 | Example of a WLAN wireless driver connected to the rfkill subsystem: | ||
367 | -------------------------------------------------------------------- | ||
368 | |||
369 | A certain WLAN card has one input pin that causes it to block the transmitter | ||
370 | and makes the status of that input pin available (only for reading!) to the | ||
371 | kernel driver. This is a hard rfkill input line (it cannot be overridden by | ||
372 | the kernel driver). | ||
373 | |||
374 | The card also has one PCI register that, if manipulated by the driver, causes | ||
375 | it to block the transmitter. This is a soft rfkill input line. | ||
376 | |||
377 | It has also a thermal protection circuitry that shuts down its transmitter if | ||
378 | the card overheats, and makes the status of that protection available (only for | ||
379 | reading!) to the kernel driver. This is also a hard rfkill input line. | ||
380 | |||
381 | If either one of these rfkill lines are active, the transmitter is blocked by | ||
382 | the hardware and forced offline. | ||
383 | |||
384 | The driver should allocate and attach to its struct device *ONE* instance of | ||
385 | the rfkill class (there is only one transmitter). | ||
386 | |||
387 | It can implement the get_state() hook, and return RFKILL_STATE_HARD_BLOCKED if | ||
388 | either one of its two hard rfkill input lines are active. If the two hard | ||
389 | rfkill lines are inactive, it must return RFKILL_STATE_SOFT_BLOCKED if its soft | ||
390 | rfkill input line is active. Only if none of the rfkill input lines are | ||
391 | active, will it return RFKILL_STATE_UNBLOCKED. | ||
392 | |||
393 | If it doesn't implement the get_state() hook, it must make sure that its calls | ||
394 | to rfkill_force_state() are enough to keep the status always up-to-date, and it | ||
395 | must do a rfkill_force_state() on resume from sleep. | ||
396 | |||
397 | Every time the driver gets a notification from the card that one of its rfkill | ||
398 | lines changed state (polling might be needed on badly designed cards that don't | ||
399 | generate interrupts for such events), it recomputes the rfkill state as per | ||
400 | above, and calls rfkill_force_state() to update it. | ||
401 | |||
402 | The driver should implement the toggle_radio() hook, that: | ||
403 | |||
404 | 1. Returns an error if one of the hardware rfkill lines are active, and the | ||
405 | caller asked for RFKILL_STATE_UNBLOCKED. | ||
406 | |||
407 | 2. Activates the soft rfkill line if the caller asked for state | ||
408 | RFKILL_STATE_SOFT_BLOCKED. It should do this even if one of the hard rfkill | ||
409 | lines are active, effectively double-blocking the transmitter. | ||
410 | |||
411 | 3. Deactivates the soft rfkill line if none of the hardware rfkill lines are | ||
412 | active and the caller asked for RFKILL_STATE_UNBLOCKED. | ||
269 | 413 | ||
270 | =============================================================================== | 414 | =============================================================================== |
271 | 4: Kernel API | 415 | 4: Kernel API |
272 | 416 | ||
273 | To build a driver with rfkill subsystem support, the driver should depend on | 417 | To build a driver with rfkill subsystem support, the driver should depend on |
274 | the Kconfig symbol RFKILL; it should _not_ depend on RKFILL_INPUT. | 418 | (or select) the Kconfig symbol RFKILL; it should _not_ depend on RKFILL_INPUT. |
275 | 419 | ||
276 | The hardware the driver talks to may be write-only (where the current state | 420 | The hardware the driver talks to may be write-only (where the current state |
277 | of the hardware is unknown), or read-write (where the hardware can be queried | 421 | of the hardware is unknown), or read-write (where the hardware can be queried |
@@ -338,10 +482,10 @@ is *absolute*; do NOT violate it. | |||
338 | ******IMPORTANT****** | 482 | ******IMPORTANT****** |
339 | 483 | ||
340 | Userspace must not assume it is the only source of control for rfkill switches. | 484 | Userspace must not assume it is the only source of control for rfkill switches. |
341 | Their state CAN and WILL change on its own, due to firmware actions, direct | 485 | Their state CAN and WILL change due to firmware actions, direct user actions, |
342 | user actions, and the rfkill-input EPO override for *_RFKILL_ALL. | 486 | and the rfkill-input EPO override for *_RFKILL_ALL. |
343 | 487 | ||
344 | When rfkill-input is not active, userspace must initiate an rfkill status | 488 | When rfkill-input is not active, userspace must initiate a rfkill status |
345 | change by writing to the "state" attribute in order for anything to happen. | 489 | change by writing to the "state" attribute in order for anything to happen. |
346 | 490 | ||
347 | Take particular care to implement EV_SW SW_RFKILL_ALL properly. When that | 491 | Take particular care to implement EV_SW SW_RFKILL_ALL properly. When that |
@@ -354,19 +498,16 @@ The following sysfs entries will be created: | |||
354 | type: Name of the key type ("wlan", "bluetooth", etc). | 498 | type: Name of the key type ("wlan", "bluetooth", etc). |
355 | state: Current state of the transmitter | 499 | state: Current state of the transmitter |
356 | 0: RFKILL_STATE_SOFT_BLOCKED | 500 | 0: RFKILL_STATE_SOFT_BLOCKED |
357 | transmitter is forced off, but you can override it | 501 | transmitter is forced off, but one can override it |
358 | by a write to the state attribute, or through input | 502 | by a write to the state attribute; |
359 | events (if rfkill-input is loaded). | ||
360 | 1: RFKILL_STATE_UNBLOCKED | 503 | 1: RFKILL_STATE_UNBLOCKED |
361 | transmiter is NOT forced off, and may operate if | 504 | transmiter is NOT forced off, and may operate if |
362 | all other conditions for such operation are met | 505 | all other conditions for such operation are met |
363 | (such as interface is up and configured, etc). | 506 | (such as interface is up and configured, etc); |
364 | 2: RFKILL_STATE_HARD_BLOCKED | 507 | 2: RFKILL_STATE_HARD_BLOCKED |
365 | transmitter is forced off by something outside of | 508 | transmitter is forced off by something outside of |
366 | the driver's control. | 509 | the driver's control. One cannot set a device to |
367 | 510 | this state through writes to the state attribute; | |
368 | You cannot set a device to this state through | ||
369 | writes to the state attribute. | ||
370 | claim: 1: Userspace handles events, 0: Kernel handles events | 511 | claim: 1: Userspace handles events, 0: Kernel handles events |
371 | 512 | ||
372 | Both the "state" and "claim" entries are also writable. For the "state" entry | 513 | Both the "state" and "claim" entries are also writable. For the "state" entry |