Back to home page

LXR

 
 

    


0001 rfkill - RF kill switch support
0002 ===============================
0003 
0004 1. Introduction
0005 2. Implementation details
0006 3. Kernel API
0007 4. Userspace support
0008 
0009 
0010 1. Introduction
0011 
0012 The rfkill subsystem provides a generic interface to disabling any radio
0013 transmitter in the system. When a transmitter is blocked, it shall not
0014 radiate any power.
0015 
0016 The subsystem also provides the ability to react on button presses and
0017 disable all transmitters of a certain type (or all). This is intended for
0018 situations where transmitters need to be turned off, for example on
0019 aircraft.
0020 
0021 The rfkill subsystem has a concept of "hard" and "soft" block, which
0022 differ little in their meaning (block == transmitters off) but rather in
0023 whether they can be changed or not:
0024  - hard block: read-only radio block that cannot be overridden by software
0025  - soft block: writable radio block (need not be readable) that is set by
0026                the system software.
0027 
0028 The rfkill subsystem has two parameters, rfkill.default_state and
0029 rfkill.master_switch_mode, which are documented in admin-guide/kernel-parameters.rst.
0030 
0031 
0032 2. Implementation details
0033 
0034 The rfkill subsystem is composed of three main components:
0035  * the rfkill core,
0036  * the deprecated rfkill-input module (an input layer handler, being
0037    replaced by userspace policy code) and
0038  * the rfkill drivers.
0039 
0040 The rfkill core provides API for kernel drivers to register their radio
0041 transmitter with the kernel, methods for turning it on and off and, letting
0042 the system know about hardware-disabled states that may be implemented on
0043 the device.
0044 
0045 The rfkill core code also notifies userspace of state changes, and provides
0046 ways for userspace to query the current states. See the "Userspace support"
0047 section below.
0048 
0049 When the device is hard-blocked (either by a call to rfkill_set_hw_state()
0050 or from query_hw_block) set_block() will be invoked for additional software
0051 block, but drivers can ignore the method call since they can use the return
0052 value of the function rfkill_set_hw_state() to sync the software state
0053 instead of keeping track of calls to set_block(). In fact, drivers should
0054 use the return value of rfkill_set_hw_state() unless the hardware actually
0055 keeps track of soft and hard block separately.
0056 
0057 
0058 3. Kernel API
0059 
0060 
0061 Drivers for radio transmitters normally implement an rfkill driver.
0062 
0063 Platform drivers might implement input devices if the rfkill button is just
0064 that, a button. If that button influences the hardware then you need to
0065 implement an rfkill driver instead. This also applies if the platform provides
0066 a way to turn on/off the transmitter(s).
0067 
0068 For some platforms, it is possible that the hardware state changes during
0069 suspend/hibernation, in which case it will be necessary to update the rfkill
0070 core with the current state is at resume time.
0071 
0072 To create an rfkill driver, driver's Kconfig needs to have
0073 
0074         depends on RFKILL || !RFKILL
0075 
0076 to ensure the driver cannot be built-in when rfkill is modular. The !RFKILL
0077 case allows the driver to be built when rfkill is not configured, which
0078 case all rfkill API can still be used but will be provided by static inlines
0079 which compile to almost nothing.
0080 
0081 Calling rfkill_set_hw_state() when a state change happens is required from
0082 rfkill drivers that control devices that can be hard-blocked unless they also
0083 assign the poll_hw_block() callback (then the rfkill core will poll the
0084 device). Don't do this unless you cannot get the event in any other way.
0085 
0086 RFKill provides per-switch LED triggers, which can be used to drive LEDs
0087 according to the switch state (LED_FULL when blocked, LED_OFF otherwise).
0088 
0089 
0090 5. Userspace support
0091 
0092 The recommended userspace interface to use is /dev/rfkill, which is a misc
0093 character device that allows userspace to obtain and set the state of rfkill
0094 devices and sets of devices. It also notifies userspace about device addition
0095 and removal. The API is a simple read/write API that is defined in
0096 linux/rfkill.h, with one ioctl that allows turning off the deprecated input
0097 handler in the kernel for the transition period.
0098 
0099 Except for the one ioctl, communication with the kernel is done via read()
0100 and write() of instances of 'struct rfkill_event'. In this structure, the
0101 soft and hard block are properly separated (unlike sysfs, see below) and
0102 userspace is able to get a consistent snapshot of all rfkill devices in the
0103 system. Also, it is possible to switch all rfkill drivers (or all drivers of
0104 a specified type) into a state which also updates the default state for
0105 hotplugged devices.
0106 
0107 After an application opens /dev/rfkill, it can read the current state of all
0108 devices. Changes can be either obtained by either polling the descriptor for
0109 hotplug or state change events or by listening for uevents emitted by the
0110 rfkill core framework.
0111 
0112 Additionally, each rfkill device is registered in sysfs and emits uevents.
0113 
0114 rfkill devices issue uevents (with an action of "change"), with the following
0115 environment variables set:
0116 
0117 RFKILL_NAME
0118 RFKILL_STATE
0119 RFKILL_TYPE
0120 
0121 The contents of these variables corresponds to the "name", "state" and
0122 "type" sysfs files explained above.
0123 
0124 
0125 For further details consult Documentation/ABI/stable/sysfs-class-rfkill.