mac80211: disconnect when user changes channel
[linux-2.6-block.git] / Documentation / rfkill.txt
CommitLineData
19d337df
JB
1rfkill - RF kill switch support
2===============================
dac24ab3 3
19d337df
JB
41. Introduction
52. Implementation details
63. Kernel driver guidelines
74. Kernel API
85. Userspace support
dac24ab3 9
dc288520 10
19d337df 111. Introduction
dac24ab3 12
19d337df
JB
13The rfkill subsystem provides a generic interface to disabling any radio
14transmitter in the system. When a transmitter is blocked, it shall not
15radiate any power.
f3146aff 16
19d337df
JB
17The subsystem also provides the ability to react on button presses and
18disable all transmitters of a certain type (or all). This is intended for
19situations where transmitters need to be turned off, for example on
20aircraft.
f7983f73 21
f3146aff 22
dac24ab3 23
19d337df 242. Implementation details
dc288520 25
f7983f73
HMH
26The rfkill subsystem is composed of various components: the rfkill class, the
27rfkill-input module (an input layer handler), and some specific input layer
28events.
29
19d337df
JB
30The rfkill class is provided for kernel drivers to register their radio
31transmitter with the kernel, provide methods for turning it on and off and,
32optionally, letting the system know about hardware-disabled states that may
33be implemented on the device. This code is enabled with the CONFIG_RFKILL
34Kconfig option, which drivers can "select".
f7983f73 35
19d337df
JB
36The rfkill class code also notifies userspace of state changes, this is
37achieved via uevents. It also provides some sysfs files for userspace to
38check the status of radio transmitters. See the "Userspace support" section
39below.
bed7aac9 40
bed7aac9 41
19d337df
JB
42The rfkill-input code implements a basic response to rfkill buttons -- it
43implements turning on/off all devices of a certain class (or all).
bed7aac9 44
19d337df
JB
45When the device is hard-blocked (either by a call to rfkill_set_hw_state()
46or from query_hw_block) set_block() will be invoked but drivers can well
47ignore the method call since they can use the return value of the function
48rfkill_set_hw_state() to sync the software state instead of keeping track
49of calls to set_block().
bed7aac9 50
bed7aac9 51
19d337df 52The entire functionality is spread over more than one subsystem:
bed7aac9 53
19d337df
JB
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)
bed7aac9 59
19d337df
JB
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.
e10e0dfe 62
19d337df 63 * The rfkill drivers turn off/on their transmitters as requested.
f7983f73 64
19d337df
JB
65 * The rfkill class will generate userspace notifications (uevents) to tell
66 userspace what the current state is.
f7983f73 67
f7983f73 68
f7983f73 69
19d337df 703. Kernel driver guidelines
f7983f73 71
f7983f73 72
19d337df
JB
73Drivers for radio transmitters normally implement only the rfkill class.
74These drivers may not unblock the transmitter based on own decisions, they
75should act on information provided by the rfkill class only.
f7983f73 76
19d337df
JB
77Platform drivers might implement input devices if the rfkill button is just
78that, a button. If that button influences the hardware then you need to
79implement an rfkill class instead. This also applies if the platform provides
80a way to turn on/off the transmitter(s).
f7983f73 81
19d337df
JB
82During suspend/hibernation, transmitters should only be left enabled when
83wake-on wlan or similar functionality requires it and the device wasn't
84blocked before suspend/hibernate. Note that it may be necessary to update
85the rfkill subsystem's idea of what the current state is at resume time if
86the state may have changed over suspend.
f7983f73 87
f7983f73 88
f7983f73 89
19d337df 904. Kernel API
dc288520
HMH
91
92To build a driver with rfkill subsystem support, the driver should depend on
19d337df 93(or select) the Kconfig symbol RFKILL.
dc288520
HMH
94
95The hardware the driver talks to may be write-only (where the current state
96of the hardware is unknown), or read-write (where the hardware can be queried
97about its current state).
98
19d337df
JB
99Calling rfkill_set_hw_state() when a state change happens is required from
100rfkill drivers that control devices that can be hard-blocked unless they also
101assign the poll_hw_block() callback (then the rfkill core will poll the
102device). Don't do this unless you cannot get the event in any other way.
dac24ab3 103
5005657c 104
5005657c 105
19d337df 1065. Userspace support
dac24ab3 107
19d337df 108The following sysfs entries exist for every rfkill device:
dac24ab3
ID
109
110 name: Name assigned by driver to this key (interface or driver name).
111 type: Name of the key type ("wlan", "bluetooth", etc).
5005657c
HMH
112 state: Current state of the transmitter
113 0: RFKILL_STATE_SOFT_BLOCKED
19d337df 114 transmitter is turned off by software
5005657c 115 1: RFKILL_STATE_UNBLOCKED
f71fea23 116 transmitter is (potentially) active
5005657c
HMH
117 2: RFKILL_STATE_HARD_BLOCKED
118 transmitter is forced off by something outside of
19d337df
JB
119 the driver's control.
120 claim: 0: Kernel handles events (currently always reads that value)
121
122rfkill devices also issue uevents (with an action of "change"), with the
123following environment variables set:
124
125RFKILL_NAME
126RFKILL_STATE
127RFKILL_TYPE
128
129The contents of these variables corresponds to the "name", "state" and
130"type" sysfs files explained above.
f71fea23
JB
131
132An alternative userspace interface exists as a misc device /dev/rfkill,
133which allows userspace to obtain and set the state of rfkill devices and
134sets of devices. It also notifies userspace about device addition and
135removal. The API is a simple read/write API that is defined in
136linux/rfkill.h.