Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

rfkill: rewrite

This patch completely rewrites the rfkill core to address
the following deficiencies:

* all rfkill drivers need to implement polling where necessary
rather than having one central implementation

* updating the rfkill state cannot be done from arbitrary
contexts, forcing drivers to use schedule_work and requiring
lots of code

* rfkill drivers need to keep track of soft/hard blocked
internally -- the core should do this

* the rfkill API has many unexpected quirks, for example being
asymmetric wrt. alloc/free and register/unregister

* rfkill can call back into a driver from within a function the
driver called -- this is prone to deadlocks and generally
should be avoided

* rfkill-input pointlessly is a separate module

* drivers need to #ifdef rfkill functions (unless they want to
depend on or select RFKILL) -- rfkill should provide inlines
that do nothing if it isn't compiled in

* the rfkill structure is not opaque -- drivers need to initialise
it correctly (lots of sanity checking code required) -- instead
force drivers to pass the right variables to rfkill_alloc()

* the documentation is hard to read because it always assumes the
reader is completely clueless and contains way TOO MANY CAPS

* the rfkill code needlessly uses a lot of locks and atomic
operations in locked sections

* fix LED trigger to actually change the LED when the radio state
changes -- this wasn't done before

Tested-by: Alan Jenkins <alan-jenkins@tuffmail.co.uk>
Signed-off-by: Henrique de Moraes Holschuh <hmh@hmh.eng.br> [thinkpad]
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>

authored by

Johannes Berg and committed by
John W. Linville
19d337df 0f6399c4

+2586 -3323
+94 -535
Documentation/rfkill.txt
··· 1 - rfkill - RF switch subsystem support 2 - ==================================== 1 + rfkill - RF kill switch support 2 + =============================== 3 3 4 - 1 Introduction 5 - 2 Implementation details 6 - 3 Kernel driver guidelines 7 - 3.1 wireless device drivers 8 - 3.2 platform/switch drivers 9 - 3.3 input device drivers 10 - 4 Kernel API 11 - 5 Userspace support 4 + 1. Introduction 5 + 2. Implementation details 6 + 3. Kernel driver guidelines 7 + 4. Kernel API 8 + 5. Userspace support 12 9 13 10 14 - 1. Introduction: 11 + 1. Introduction 15 12 16 - The rfkill switch subsystem exists to add a generic interface to circuitry that 17 - can enable or disable the signal output of a wireless *transmitter* of any 18 - type. By far, the most common use is to disable radio-frequency transmitters. 13 + The rfkill subsystem provides a generic interface to disabling any radio 14 + transmitter in the system. When a transmitter is blocked, it shall not 15 + radiate any power. 19 16 20 - Note that disabling the signal output means that the the transmitter is to be 21 - made to not emit any energy when "blocked". rfkill is not about blocking data 22 - transmissions, it is about blocking energy emission. 17 + The subsystem also provides the ability to react on button presses and 18 + 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 20 + aircraft. 23 21 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. 28 22 29 - The buttons to enable and disable the wireless transmitters are important in 30 - situations where the user is for example using his laptop on a location where 31 - radio-frequency transmitters _must_ be disabled (e.g. airplanes). 32 23 33 - Because of this requirement, userspace support for the keys should not be made 34 - mandatory. Because userspace might want to perform some additional smarter 35 - tasks when the key is pressed, rfkill provides userspace the possibility to 36 - take over the task to handle the key events. 37 - 38 - =============================================================================== 39 - 2: Implementation details 24 + 2. Implementation details 40 25 41 26 The rfkill subsystem is composed of various components: the rfkill class, the 42 27 rfkill-input module (an input layer handler), and some specific input layer 43 28 events. 44 29 45 - The rfkill class provides kernel drivers with an interface that allows them to 46 - know when they should enable or disable a wireless network device transmitter. 47 - This is enabled by the CONFIG_RFKILL Kconfig option. 30 + The rfkill class is provided for kernel drivers to register their radio 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". 48 35 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". 54 - 55 - The rfkill-input module provides the kernel with the ability to implement a 56 - basic response when the user presses a key or button (or toggles a switch) 57 - related to rfkill functionality. It is an in-kernel implementation of default 58 - policy of reacting to rfkill-related input events and neither mandatory nor 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. 66 - 67 - The rfkill-input module also provides EPO (emergency power-off) functionality 68 - for all wireless transmitters. This function cannot be overridden, and it is 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: 86 - 87 - A hardware circuit that controls the state of a rfkill line, which a 88 - kernel driver can interact with *to modify* that state (i.e. it has 89 - either write-only or read/write access). 90 - 91 - rfkill line: 92 - 93 - An input channel (hardware or software) of a wireless device, which 94 - causes a wireless transmitter to stop emitting energy (BLOCK) when it 95 - is active. Point of view is extremely important here: rfkill lines are 96 - always seen from the PoV of a wireless device (and its driver). 97 - 98 - soft rfkill line/software rfkill line: 99 - 100 - A rfkill line the wireless device driver can directly change the state 101 - of. Related to rfkill_state RFKILL_STATE_SOFT_BLOCKED. 102 - 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. 116 - 117 - RFKILL_STATE_SOFT_BLOCKED indicates that a call to toggle_radio() can change 118 - that state. RFKILL_STATE_HARD_BLOCKED indicates that a call to toggle_radio() 119 - will not be able to change the state and will return with a suitable error if 120 - attempts are made to set the state to RFKILL_STATE_UNBLOCKED. 121 - 122 - RFKILL_STATE_HARD_BLOCKED is used by drivers to signal that the device is 123 - locked in the BLOCKED state by a hardwire rfkill line (typically an input pin 124 - that, when active, forces the transmitter to be disabled) which the driver 125 - CANNOT override. 126 - 127 - Full rfkill functionality requires two different subsystems to cooperate: the 128 - input layer and the rfkill class. The input layer issues *commands* to the 129 - entire system requesting that devices registered to the rfkill class change 130 - state. The way this interaction happens is not complex, but it is not obvious 131 - either: 132 - 133 - Kernel Input layer: 134 - 135 - * Generates KEY_WWAN, KEY_WLAN, KEY_BLUETOOTH, SW_RFKILL_ALL, and 136 - other such events when the user presses certain keys, buttons, or 137 - toggles certain physical switches. 138 - 139 - THE INPUT LAYER IS NEVER USED TO PROPAGATE STATUS, NOTIFICATIONS OR THE 140 - KIND OF STUFF AN ON-SCREEN-DISPLAY APPLICATION WOULD REPORT. It is 141 - used to issue *commands* for the system to change behaviour, and these 142 - commands may or may not be carried out by some kernel driver or 143 - userspace application. It follows that doing user feedback based only 144 - on input events is broken, as there is no guarantee that an input event 145 - will be acted upon. 146 - 147 - Most wireless communication device drivers implementing rfkill 148 - functionality MUST NOT generate these events, and have no reason to 149 - register themselves with the input layer. Doing otherwise is a common 150 - misconception. There is an API to propagate rfkill status change 151 - information, and it is NOT the input layer. 152 - 153 - rfkill class: 154 - 155 - * Calls a hook in a driver to effectively change the wireless 156 - transmitter state; 157 - * Keeps track of the wireless transmitter state (with help from 158 - the driver); 159 - * Generates userspace notifications (uevents) and a call to a 160 - notification chain (kernel) when there is a wireless transmitter 161 - state change; 162 - * Connects a wireless communications driver with the common rfkill 163 - control system, which, for example, allows actions such as 164 - "switch all bluetooth devices offline" to be carried out by 165 - userspace or by rfkill-input. 166 - 167 - THE RFKILL CLASS NEVER ISSUES INPUT EVENTS. THE RFKILL CLASS DOES 168 - NOT LISTEN TO INPUT EVENTS. NO DRIVER USING THE RFKILL CLASS SHALL 169 - EVER LISTEN TO, OR ACT ON RFKILL INPUT EVENTS. Doing otherwise is 170 - a layering violation. 171 - 172 - Most wireless data communication drivers in the kernel have just to 173 - implement the rfkill class API to work properly. Interfacing to the 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 - 185 - 186 - Userspace input handlers (uevents) or kernel input handlers (rfkill-input): 187 - 188 - * Implements the policy of what should happen when one of the input 189 - layer events related to rfkill operation is received. 190 - * Uses the sysfs interface (userspace) or private rfkill API calls 191 - to tell the devices registered with the rfkill class to change 192 - their state (i.e. translates the input layer event into real 193 - action). 194 - 195 - * rfkill-input implements EPO by handling EV_SW SW_RFKILL_ALL 0 196 - (power off all transmitters) in a special way: it ignores any 197 - overrides and local state cache and forces all transmitters to the 198 - RFKILL_STATE_SOFT_BLOCKED state (including those which are already 199 - supposed to be BLOCKED). 200 - * rfkill EPO will remain active until rfkill-input receives an 201 - EV_SW SW_RFKILL_ALL 1 event. While the EPO is active, transmitters 202 - are locked in the blocked state (rfkill will refuse to unblock them). 203 - * rfkill-input implements different policies that the user can 204 - select for handling EV_SW SW_RFKILL_ALL 1. It will unlock rfkill, 205 - and either do nothing (leave transmitters blocked, but now unlocked), 206 - restore the transmitters to their state before the EPO, or unblock 207 - them all. 208 - 209 - Userspace uevent handler or kernel platform-specific drivers hooked to the 210 - rfkill notifier chain: 211 - 212 - * Taps into the rfkill notifier chain or to KOBJ_CHANGE uevents, 213 - in order to know when a device that is registered with the rfkill 214 - class changes state; 215 - * Issues feedback notifications to the user; 216 - * In the rare platforms where this is required, synthesizes an input 217 - event to command all *OTHER* rfkill devices to also change their 218 - statues when a specific rfkill device changes state. 219 - 220 - 221 - =============================================================================== 222 - 3: Kernel driver guidelines 223 - 224 - Remember: point-of-view is everything for a driver that connects to the rfkill 225 - subsystem. All the details below must be measured/perceived from the point of 226 - view of the specific driver being modified. 227 - 228 - The first thing one needs to know is whether his driver should be talking to 229 - the rfkill class or to the input layer. In rare cases (platform drivers), it 230 - could happen that you need to do both, as platform drivers often handle a 231 - variety of devices in the same driver. 232 - 233 - Do not mistake input devices for rfkill controllers. The only type of "rfkill 234 - switch" device that is to be registered with the rfkill class are those 235 - directly controlling the circuits that cause a wireless transmitter to stop 236 - working (or the software equivalent of them), i.e. what we call a rfkill 237 - controller. Every other kind of "rfkill switch" is just an input device and 238 - MUST NOT be registered with the rfkill class. 239 - 240 - A driver should register a device with the rfkill class when ALL of the 241 - following conditions are met (they define a rfkill controller): 242 - 243 - 1. The device is/controls a data communications wireless transmitter; 244 - 245 - 2. The kernel can interact with the hardware/firmware to CHANGE the wireless 246 - transmitter state (block/unblock TX operation); 247 - 248 - 3. The transmitter can be made to not emit any energy when "blocked": 249 - rfkill is not about blocking data transmissions, it is about blocking 250 - energy emission; 251 - 252 - A driver should register a device with the input subsystem to issue 253 - rfkill-related events (KEY_WLAN, KEY_BLUETOOTH, KEY_WWAN, KEY_WIMAX, 254 - SW_RFKILL_ALL, etc) when ALL of the folowing conditions are met: 255 - 256 - 1. It is directly related to some physical device the user interacts with, to 257 - command the O.S./firmware/hardware to enable/disable a data communications 258 - wireless transmitter. 259 - 260 - Examples of the physical device are: buttons, keys and switches the user 261 - will press/touch/slide/switch to enable or disable the wireless 262 - communication device. 263 - 264 - 2. It is NOT slaved to another device, i.e. there is no other device that 265 - issues rfkill-related input events in preference to this one. 266 - 267 - Please refer to the corner cases and examples section for more details. 268 - 269 - When in doubt, do not issue input events. For drivers that should generate 270 - input events in some platforms, but not in others (e.g. b43), the best solution 271 - is to NEVER generate input events in the first place. That work should be 272 - deferred to a platform-specific kernel module (which will know when to generate 273 - events through the rfkill notifier chain) or to userspace. This avoids the 274 - usual maintenance problems with DMI whitelisting. 275 - 276 - 277 - Corner cases and examples: 278 - ==================================== 279 - 280 - 1. If the device is an input device that, because of hardware or firmware, 281 - causes wireless transmitters to be blocked regardless of the kernel's will, it 282 - is still just an input device, and NOT to be registered with the rfkill class. 283 - 284 - 2. If the wireless transmitter switch control is read-only, it is an input 285 - device and not to be registered with the rfkill class (and maybe not to be made 286 - an input layer event source either, see below). 287 - 288 - 3. If there is some other device driver *closer* to the actual hardware the 289 - user interacted with (the button/switch/key) to issue an input event, THAT is 290 - the device driver that should be issuing input events. 291 - 292 - E.g: 293 - [RFKILL slider switch] -- [GPIO hardware] -- [WLAN card rf-kill input] 294 - (platform driver) (wireless card driver) 295 - 296 - The user is closer to the RFKILL slide switch plaform driver, so the driver 297 - which must issue input events is the platform driver looking at the GPIO 298 - hardware, and NEVER the wireless card driver (which is just a slave). It is 299 - very likely that there are other leaves than just the WLAN card rf-kill input 300 - (e.g. a bluetooth card, etc)... 301 - 302 - On the other hand, some embedded devices do this: 303 - 304 - [RFKILL slider switch] -- [WLAN card rf-kill input] 305 - (wireless card driver) 306 - 307 - In this situation, the wireless card driver *could* register itself as an input 308 - device and issue rf-kill related input events... but in order to AVOID the need 309 - for DMI whitelisting, the wireless card driver does NOT do it. Userspace (HAL) 310 - or a platform driver (that exists only on these embedded devices) will do the 311 - dirty job of issuing the input events. 312 - 313 - 314 - COMMON MISTAKES in kernel drivers, related to rfkill: 315 - ==================================== 316 - 317 - 1. NEVER confuse input device keys and buttons with input device switches. 318 - 319 - 1a. Switches are always set or reset. They report the current state 320 - (on position or off position). 321 - 322 - 1b. Keys and buttons are either in the pressed or not-pressed state, and 323 - that's it. A "button" that latches down when you press it, and 324 - unlatches when you press it again is in fact a switch as far as input 325 - devices go. 326 - 327 - Add the SW_* events you need for switches, do NOT try to emulate a button using 328 - KEY_* events just because there is no such SW_* event yet. Do NOT try to use, 329 - for example, KEY_BLUETOOTH when you should be using SW_BLUETOOTH instead. 330 - 331 - 2. Input device switches (sources of EV_SW events) DO store their current state 332 - (so you *must* initialize it by issuing a gratuitous input layer event on 333 - driver start-up and also when resuming from sleep), and that state CAN be 334 - queried from userspace through IOCTLs. There is no sysfs interface for this, 335 - but that doesn't mean you should break things trying to hook it to the rfkill 336 - class to get a sysfs interface :-) 337 - 338 - 3. Do not issue *_RFKILL_ALL events by default, unless you are sure it is the 339 - correct event for your switch/button. These events are emergency power-off 340 - events when they are trying to turn the transmitters off. An example of an 341 - input device which SHOULD generate *_RFKILL_ALL events is the wireless-kill 342 - switch in a laptop which is NOT a hotkey, but a real sliding/rocker switch. 343 - An example of an input device which SHOULD NOT generate *_RFKILL_ALL events by 344 - default, is any sort of hot key that is type-specific (e.g. the one for WLAN). 345 - 346 - 347 - 3.1 Guidelines for wireless device drivers 348 - ------------------------------------------ 349 - 350 - (in this text, rfkill->foo means the foo field of struct rfkill). 351 - 352 - 1. Each independent transmitter in a wireless device (usually there is only one 353 - transmitter per device) should have a SINGLE rfkill class attached to it. 354 - 355 - 2. If the device does not have any sort of hardware assistance to allow the 356 - driver to rfkill the device, the driver should emulate it by taking all actions 357 - required to silence the transmitter. 358 - 359 - 3. If it is impossible to silence the transmitter (i.e. it still emits energy, 360 - even if it is just in brief pulses, when there is no data to transmit and there 361 - is no hardware support to turn it off) do NOT lie to the users. Do not attach 362 - it to a rfkill class. The rfkill subsystem does not deal with data 363 - transmission, it deals with energy emission. If the transmitter is emitting 364 - energy, it is not blocked in rfkill terms. 365 - 366 - 4. It doesn't matter if the device has multiple rfkill input lines affecting 367 - the same transmitter, their combined state is to be exported as a single state 368 - per transmitter (see rule 1). 369 - 370 - This rule exists because users of the rfkill subsystem expect to get (and set, 371 - when possible) the overall transmitter rfkill state, not of a particular rfkill 372 - line. 373 - 374 - 5. The wireless device driver MUST NOT leave the transmitter enabled during 375 - suspend and hibernation unless: 376 - 377 - 5.1. The transmitter has to be enabled for some sort of functionality 378 - like wake-on-wireless-packet or autonomous packed forwarding in a mesh 379 - network, and that functionality is enabled for this suspend/hibernation 380 - cycle. 381 - 382 - AND 383 - 384 - 5.2. The device was not on a user-requested BLOCKED state before 385 - the suspend (i.e. the driver must NOT unblock a device, not even 386 - to support wake-on-wireless-packet or remain in the mesh). 387 - 388 - In other words, there is absolutely no allowed scenario where a driver can 389 - automatically take action to unblock a rfkill controller (obviously, this deals 390 - with scenarios where soft-blocking or both soft and hard blocking is happening. 391 - Scenarios where hardware rfkill lines are the only ones blocking the 392 - transmitter are outside of this rule, since the wireless device driver does not 393 - control its input hardware rfkill lines in the first place). 394 - 395 - 6. During resume, rfkill will try to restore its previous state. 396 - 397 - 7. After a rfkill class is suspended, it will *not* call rfkill->toggle_radio 398 - until it is resumed. 399 - 400 - 401 - Example of a WLAN wireless driver connected to the rfkill subsystem: 402 - -------------------------------------------------------------------- 403 - 404 - A certain WLAN card has one input pin that causes it to block the transmitter 405 - and makes the status of that input pin available (only for reading!) to the 406 - kernel driver. This is a hard rfkill input line (it cannot be overridden by 407 - the kernel driver). 408 - 409 - The card also has one PCI register that, if manipulated by the driver, causes 410 - it to block the transmitter. This is a soft rfkill input line. 411 - 412 - It has also a thermal protection circuitry that shuts down its transmitter if 413 - the card overheats, and makes the status of that protection available (only for 414 - reading!) to the kernel driver. This is also a hard rfkill input line. 415 - 416 - If either one of these rfkill lines are active, the transmitter is blocked by 417 - the hardware and forced offline. 418 - 419 - The driver should allocate and attach to its struct device *ONE* instance of 420 - the rfkill class (there is only one transmitter). 421 - 422 - It can implement the get_state() hook, and return RFKILL_STATE_HARD_BLOCKED if 423 - either one of its two hard rfkill input lines are active. If the two hard 424 - rfkill lines are inactive, it must return RFKILL_STATE_SOFT_BLOCKED if its soft 425 - rfkill input line is active. Only if none of the rfkill input lines are 426 - active, will it return RFKILL_STATE_UNBLOCKED. 427 - 428 - Since the device has a hardware rfkill line, it IS subject to state changes 429 - external to rfkill. Therefore, the driver must make sure that it calls 430 - rfkill_force_state() to keep the status always up-to-date, and it must do a 431 - rfkill_force_state() on resume from sleep. 432 - 433 - Every time the driver gets a notification from the card that one of its rfkill 434 - lines changed state (polling might be needed on badly designed cards that don't 435 - generate interrupts for such events), it recomputes the rfkill state as per 436 - above, and calls rfkill_force_state() to update it. 437 - 438 - The driver should implement the toggle_radio() hook, that: 439 - 440 - 1. Returns an error if one of the hardware rfkill lines are active, and the 441 - caller asked for RFKILL_STATE_UNBLOCKED. 442 - 443 - 2. Activates the soft rfkill line if the caller asked for state 444 - RFKILL_STATE_SOFT_BLOCKED. It should do this even if one of the hard rfkill 445 - lines are active, effectively double-blocking the transmitter. 446 - 447 - 3. Deactivates the soft rfkill line if none of the hardware rfkill lines are 448 - active and the caller asked for RFKILL_STATE_UNBLOCKED. 449 - 450 - =============================================================================== 451 - 4: Kernel API 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 + 41 + 42 + The rfkill-input code implements a basic response to rfkill buttons -- it 43 + implements turning on/off all devices of a certain class (or all). 44 + 45 + 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 + ignore the method call since they can use the return value of the function 48 + rfkill_set_hw_state() to sync the software state instead of keeping track 49 + of calls to set_block(). 50 + 51 + 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 + 68 + 69 + 70 + 3. Kernel driver guidelines 71 + 72 + 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 + 77 + 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 79 + implement an rfkill class instead. This also applies if the platform provides 80 + a way to turn on/off the transmitter(s). 81 + 82 + During suspend/hibernation, transmitters should only be left enabled when 83 + wake-on wlan or similar functionality requires it and the device wasn't 84 + blocked before suspend/hibernate. Note that it may be necessary to update 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 + 89 + 90 + 4. Kernel API 452 91 453 92 To build a driver with rfkill subsystem support, the driver should depend on 454 - (or select) the Kconfig symbol RFKILL; it should _not_ depend on RKFILL_INPUT. 93 + (or select) the Kconfig symbol RFKILL. 455 94 456 95 The hardware the driver talks to may be write-only (where the current state 457 96 of the hardware is unknown), or read-write (where the hardware can be queried 458 97 about its current state). 459 98 460 - The rfkill class will call the get_state hook of a device every time it needs 461 - to know the *real* current state of the hardware. This can happen often, but 462 - it does not do any polling, so it is not enough on hardware that is subject 463 - to state changes outside of the rfkill subsystem. 99 + 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 101 + assign the poll_hw_block() callback (then the rfkill core will poll the 102 + device). Don't do this unless you cannot get the event in any other way. 464 103 465 - Therefore, calling rfkill_force_state() when a state change happens is 466 - mandatory when the device has a hardware rfkill line, or when something else 467 - like the firmware could cause its state to be changed without going through the 468 - rfkill class. 469 104 470 - Some hardware provides events when its status changes. In these cases, it is 471 - best for the driver to not provide a get_state hook, and instead register the 472 - rfkill class *already* with the correct status, and keep it updated using 473 - rfkill_force_state() when it gets an event from the hardware. 474 105 475 - rfkill_force_state() must be used on the device resume handlers to update the 476 - rfkill status, should there be any chance of the device status changing during 477 - the sleep. 106 + 5. Userspace support 478 107 479 - There is no provision for a statically-allocated rfkill struct. You must 480 - use rfkill_allocate() to allocate one. 481 - 482 - You should: 483 - - rfkill_allocate() 484 - - modify rfkill fields (flags, name) 485 - - modify state to the current hardware state (THIS IS THE ONLY TIME 486 - YOU CAN ACCESS state DIRECTLY) 487 - - rfkill_register() 488 - 489 - The only way to set a device to the RFKILL_STATE_HARD_BLOCKED state is through 490 - a suitable return of get_state() or through rfkill_force_state(). 491 - 492 - When a device is in the RFKILL_STATE_HARD_BLOCKED state, the only way to switch 493 - it to a different state is through a suitable return of get_state() or through 494 - rfkill_force_state(). 495 - 496 - If toggle_radio() is called to set a device to state RFKILL_STATE_SOFT_BLOCKED 497 - when that device is already at the RFKILL_STATE_HARD_BLOCKED state, it should 498 - not return an error. Instead, it should try to double-block the transmitter, 499 - so that its state will change from RFKILL_STATE_HARD_BLOCKED to 500 - RFKILL_STATE_SOFT_BLOCKED should the hardware blocking cease. 501 - 502 - Please refer to the source for more documentation. 503 - 504 - =============================================================================== 505 - 5: Userspace support 506 - 507 - rfkill devices issue uevents (with an action of "change"), with the following 508 - environment variables set: 509 - 510 - RFKILL_NAME 511 - RFKILL_STATE 512 - RFKILL_TYPE 513 - 514 - The ABI for these variables is defined by the sysfs attributes. It is best 515 - to take a quick look at the source to make sure of the possible values. 516 - 517 - It is expected that HAL will trap those, and bridge them to DBUS, etc. These 518 - events CAN and SHOULD be used to give feedback to the user about the rfkill 519 - status of the system. 520 - 521 - Input devices may issue events that are related to rfkill. These are the 522 - various KEY_* events and SW_* events supported by rfkill-input.c. 523 - 524 - Userspace may not change the state of an rfkill switch in response to an 525 - input event, it should refrain from changing states entirely. 526 - 527 - Userspace cannot assume it is the only source of control for rfkill switches. 528 - Their state can change due to firmware actions, direct user actions, and the 529 - rfkill-input EPO override for *_RFKILL_ALL. 530 - 531 - When rfkill-input is not active, userspace must initiate a rfkill status 532 - change by writing to the "state" attribute in order for anything to happen. 533 - 534 - Take particular care to implement EV_SW SW_RFKILL_ALL properly. When that 535 - switch is set to OFF, *every* rfkill device *MUST* be immediately put into the 536 - RFKILL_STATE_SOFT_BLOCKED state, no questions asked. 537 - 538 - The following sysfs entries will be created: 108 + The following sysfs entries exist for every rfkill device: 539 109 540 110 name: Name assigned by driver to this key (interface or driver name). 541 111 type: Name of the key type ("wlan", "bluetooth", etc). 542 112 state: Current state of the transmitter 543 113 0: RFKILL_STATE_SOFT_BLOCKED 544 - transmitter is forced off, but one can override it 545 - by a write to the state attribute; 114 + transmitter is turned off by software 546 115 1: RFKILL_STATE_UNBLOCKED 547 - transmiter is NOT forced off, and may operate if 548 - all other conditions for such operation are met 549 - (such as interface is up and configured, etc); 116 + transmiter is (potentially) active 550 117 2: RFKILL_STATE_HARD_BLOCKED 551 118 transmitter is forced off by something outside of 552 - the driver's control. One cannot set a device to 553 - this state through writes to the state attribute; 554 - claim: 1: Userspace handles events, 0: Kernel handles events 119 + the driver's control. 120 + claim: 0: Kernel handles events (currently always reads that value) 555 121 556 - Both the "state" and "claim" entries are also writable. For the "state" entry 557 - this means that when 1 or 0 is written, the device rfkill state (if not yet in 558 - the requested state), will be will be toggled accordingly. 122 + rfkill devices also issue uevents (with an action of "change"), with the 123 + following environment variables set: 559 124 560 - For the "claim" entry writing 1 to it means that the kernel no longer handles 561 - key events even though RFKILL_INPUT input was enabled. When "claim" has been 562 - set to 0, userspace should make sure that it listens for the input events or 563 - check the sysfs "state" entry regularly to correctly perform the required tasks 564 - when the rkfill key is pressed. 125 + RFKILL_NAME 126 + RFKILL_STATE 127 + RFKILL_TYPE 565 128 566 - A note about input devices and EV_SW events: 567 - 568 - In order to know the current state of an input device switch (like 569 - SW_RFKILL_ALL), you will need to use an IOCTL. That information is not 570 - available through sysfs in a generic way at this time, and it is not available 571 - through the rfkill class AT ALL. 129 + The contents of these variables corresponds to the "name", "state" and 130 + "type" sysfs files explained above.
+3 -3
MAINTAINERS
··· 4753 4753 F: fs/reiserfs/ 4754 4754 4755 4755 RFKILL 4756 - P: Ivo van Doorn 4757 - M: IvDoorn@gmail.com 4758 - L: netdev@vger.kernel.org 4756 + P: Johannes Berg 4757 + M: johannes@sipsolutions.net 4758 + L: linux-wireless@vger.kernel.org 4759 4759 S: Maintained 4760 4760 F Documentation/rfkill.txt 4761 4761 F: net/rfkill/
+15 -15
arch/arm/mach-pxa/tosa-bt.c
··· 35 35 gpio_set_value(data->gpio_reset, 0); 36 36 } 37 37 38 - static int tosa_bt_toggle_radio(void *data, enum rfkill_state state) 38 + static int tosa_bt_set_block(void *data, bool blocked) 39 39 { 40 - pr_info("BT_RADIO going: %s\n", 41 - state == RFKILL_STATE_UNBLOCKED ? "on" : "off"); 40 + pr_info("BT_RADIO going: %s\n", blocked ? "off" : "on"); 42 41 43 - if (state == RFKILL_STATE_UNBLOCKED) { 42 + if (!blocked) { 44 43 pr_info("TOSA_BT: going ON\n"); 45 44 tosa_bt_on(data); 46 45 } else { 47 46 pr_info("TOSA_BT: going OFF\n"); 48 47 tosa_bt_off(data); 49 48 } 49 + 50 50 return 0; 51 51 } 52 + 53 + static const struct rfkill_ops tosa_bt_rfkill_ops = { 54 + .set_block = tosa_bt_set_block, 55 + }; 52 56 53 57 static int tosa_bt_probe(struct platform_device *dev) 54 58 { ··· 74 70 if (rc) 75 71 goto err_pwr_dir; 76 72 77 - rfk = rfkill_allocate(&dev->dev, RFKILL_TYPE_BLUETOOTH); 73 + rfk = rfkill_alloc("tosa-bt", &dev->dev, RFKILL_TYPE_BLUETOOTH, 74 + &tosa_bt_rfkill_ops, data); 78 75 if (!rfk) { 79 76 rc = -ENOMEM; 80 77 goto err_rfk_alloc; 81 78 } 82 79 83 - rfk->name = "tosa-bt"; 84 - rfk->toggle_radio = tosa_bt_toggle_radio; 85 - rfk->data = data; 86 - #ifdef CONFIG_RFKILL_LEDS 87 - rfk->led_trigger.name = "tosa-bt"; 88 - #endif 80 + rfkill_set_led_trigger_name(rfk, "tosa-bt"); 89 81 90 82 rc = rfkill_register(rfk); 91 83 if (rc) ··· 92 92 return 0; 93 93 94 94 err_rfkill: 95 - if (rfk) 96 - rfkill_free(rfk); 97 - rfk = NULL; 95 + rfkill_destroy(rfk); 98 96 err_rfk_alloc: 99 97 tosa_bt_off(data); 100 98 err_pwr_dir: ··· 111 113 112 114 platform_set_drvdata(dev, NULL); 113 115 114 - if (rfk) 116 + if (rfk) { 115 117 rfkill_unregister(rfk); 118 + rfkill_destroy(rfk); 119 + } 116 120 rfk = NULL; 117 121 118 122 tosa_bt_off(data);
-1
arch/arm/mach-pxa/tosa.c
··· 31 31 #include <linux/input.h> 32 32 #include <linux/gpio.h> 33 33 #include <linux/pda_power.h> 34 - #include <linux/rfkill.h> 35 34 #include <linux/spi/spi.h> 36 35 37 36 #include <asm/setup.h>
+23 -21
drivers/net/usb/hso.c
··· 2481 2481 return 0; 2482 2482 } 2483 2483 2484 - static int hso_radio_toggle(void *data, enum rfkill_state state) 2484 + static int hso_rfkill_set_block(void *data, bool blocked) 2485 2485 { 2486 2486 struct hso_device *hso_dev = data; 2487 - int enabled = (state == RFKILL_STATE_UNBLOCKED); 2487 + int enabled = !blocked; 2488 2488 int rv; 2489 2489 2490 2490 mutex_lock(&hso_dev->mutex); ··· 2498 2498 return rv; 2499 2499 } 2500 2500 2501 + static const struct rfkill_ops hso_rfkill_ops = { 2502 + .set_block = hso_rfkill_set_block, 2503 + }; 2504 + 2501 2505 /* Creates and sets up everything for rfkill */ 2502 2506 static void hso_create_rfkill(struct hso_device *hso_dev, 2503 2507 struct usb_interface *interface) ··· 2510 2506 struct device *dev = &hso_net->net->dev; 2511 2507 char *rfkn; 2512 2508 2513 - hso_net->rfkill = rfkill_allocate(&interface_to_usbdev(interface)->dev, 2514 - RFKILL_TYPE_WWAN); 2515 - if (!hso_net->rfkill) { 2516 - dev_err(dev, "%s - Out of memory\n", __func__); 2517 - return; 2518 - } 2519 2509 rfkn = kzalloc(20, GFP_KERNEL); 2520 - if (!rfkn) { 2521 - rfkill_free(hso_net->rfkill); 2522 - hso_net->rfkill = NULL; 2510 + if (!rfkn) 2523 2511 dev_err(dev, "%s - Out of memory\n", __func__); 2524 - return; 2525 - } 2512 + 2526 2513 snprintf(rfkn, 20, "hso-%d", 2527 2514 interface->altsetting->desc.bInterfaceNumber); 2528 - hso_net->rfkill->name = rfkn; 2529 - hso_net->rfkill->state = RFKILL_STATE_UNBLOCKED; 2530 - hso_net->rfkill->data = hso_dev; 2531 - hso_net->rfkill->toggle_radio = hso_radio_toggle; 2532 - if (rfkill_register(hso_net->rfkill) < 0) { 2515 + 2516 + hso_net->rfkill = rfkill_alloc(rfkn, 2517 + &interface_to_usbdev(interface)->dev, 2518 + RFKILL_TYPE_WWAN, 2519 + &hso_rfkill_ops, hso_dev); 2520 + if (!hso_net->rfkill) { 2521 + dev_err(dev, "%s - Out of memory\n", __func__); 2533 2522 kfree(rfkn); 2534 - hso_net->rfkill->name = NULL; 2535 - rfkill_free(hso_net->rfkill); 2523 + return; 2524 + } 2525 + if (rfkill_register(hso_net->rfkill) < 0) { 2526 + rfkill_destroy(hso_net->rfkill); 2527 + kfree(rfkn); 2536 2528 hso_net->rfkill = NULL; 2537 2529 dev_err(dev, "%s - Failed to register rfkill\n", __func__); 2538 2530 return; ··· 3165 3165 hso_stop_net_device(network_table[i]); 3166 3166 cancel_work_sync(&network_table[i]->async_put_intf); 3167 3167 cancel_work_sync(&network_table[i]->async_get_intf); 3168 - if (rfk) 3168 + if (rfk) { 3169 3169 rfkill_unregister(rfk); 3170 + rfkill_destroy(rfk); 3171 + } 3170 3172 hso_free_net_device(network_table[i]); 3171 3173 } 3172 3174 }
+1 -6
drivers/net/wireless/ath/ath9k/ath9k.h
··· 460 460 bool registered; 461 461 }; 462 462 463 - /* Rfkill */ 464 - #define ATH_RFKILL_POLL_INTERVAL 2000 /* msecs */ 465 - 466 463 struct ath_rfkill { 467 464 struct rfkill *rfkill; 468 - struct delayed_work rfkill_poll; 465 + struct rfkill_ops ops; 469 466 char rfkill_name[32]; 470 467 }; 471 468 ··· 506 509 #define SC_OP_RXFLUSH BIT(7) 507 510 #define SC_OP_LED_ASSOCIATED BIT(8) 508 511 #define SC_OP_RFKILL_REGISTERED BIT(9) 509 - #define SC_OP_RFKILL_SW_BLOCKED BIT(10) 510 - #define SC_OP_RFKILL_HW_BLOCKED BIT(11) 511 512 #define SC_OP_WAIT_FOR_BEACON BIT(12) 512 513 #define SC_OP_LED_ON BIT(13) 513 514 #define SC_OP_SCANNING BIT(14)
+34 -91
drivers/net/wireless/ath/ath9k/main.c
··· 1192 1192 ah->rfkill_polarity; 1193 1193 } 1194 1194 1195 - /* h/w rfkill poll function */ 1196 - static void ath_rfkill_poll(struct work_struct *work) 1197 - { 1198 - struct ath_softc *sc = container_of(work, struct ath_softc, 1199 - rf_kill.rfkill_poll.work); 1200 - bool radio_on; 1201 - 1202 - if (sc->sc_flags & SC_OP_INVALID) 1203 - return; 1204 - 1205 - radio_on = !ath_is_rfkill_set(sc); 1206 - 1207 - /* 1208 - * enable/disable radio only when there is a 1209 - * state change in RF switch 1210 - */ 1211 - if (radio_on == !!(sc->sc_flags & SC_OP_RFKILL_HW_BLOCKED)) { 1212 - enum rfkill_state state; 1213 - 1214 - if (sc->sc_flags & SC_OP_RFKILL_SW_BLOCKED) { 1215 - state = radio_on ? RFKILL_STATE_SOFT_BLOCKED 1216 - : RFKILL_STATE_HARD_BLOCKED; 1217 - } else if (radio_on) { 1218 - ath_radio_enable(sc); 1219 - state = RFKILL_STATE_UNBLOCKED; 1220 - } else { 1221 - ath_radio_disable(sc); 1222 - state = RFKILL_STATE_HARD_BLOCKED; 1223 - } 1224 - 1225 - if (state == RFKILL_STATE_HARD_BLOCKED) 1226 - sc->sc_flags |= SC_OP_RFKILL_HW_BLOCKED; 1227 - else 1228 - sc->sc_flags &= ~SC_OP_RFKILL_HW_BLOCKED; 1229 - 1230 - rfkill_force_state(sc->rf_kill.rfkill, state); 1231 - } 1232 - 1233 - queue_delayed_work(sc->hw->workqueue, &sc->rf_kill.rfkill_poll, 1234 - msecs_to_jiffies(ATH_RFKILL_POLL_INTERVAL)); 1235 - } 1236 - 1237 - /* s/w rfkill handler */ 1238 - static int ath_sw_toggle_radio(void *data, enum rfkill_state state) 1195 + /* s/w rfkill handlers */ 1196 + static int ath_rfkill_set_block(void *data, bool blocked) 1239 1197 { 1240 1198 struct ath_softc *sc = data; 1241 1199 1242 - switch (state) { 1243 - case RFKILL_STATE_SOFT_BLOCKED: 1244 - if (!(sc->sc_flags & (SC_OP_RFKILL_HW_BLOCKED | 1245 - SC_OP_RFKILL_SW_BLOCKED))) 1246 - ath_radio_disable(sc); 1247 - sc->sc_flags |= SC_OP_RFKILL_SW_BLOCKED; 1248 - return 0; 1249 - case RFKILL_STATE_UNBLOCKED: 1250 - if ((sc->sc_flags & SC_OP_RFKILL_SW_BLOCKED)) { 1251 - sc->sc_flags &= ~SC_OP_RFKILL_SW_BLOCKED; 1252 - if (sc->sc_flags & SC_OP_RFKILL_HW_BLOCKED) { 1253 - DPRINTF(sc, ATH_DBG_FATAL, "Can't turn on the" 1254 - "radio as it is disabled by h/w\n"); 1255 - return -EPERM; 1256 - } 1257 - ath_radio_enable(sc); 1258 - } 1259 - return 0; 1260 - default: 1261 - return -EINVAL; 1262 - } 1200 + if (blocked) 1201 + ath_radio_disable(sc); 1202 + else 1203 + ath_radio_enable(sc); 1204 + 1205 + return 0; 1206 + } 1207 + 1208 + static void ath_rfkill_poll_state(struct rfkill *rfkill, void *data) 1209 + { 1210 + struct ath_softc *sc = data; 1211 + bool blocked = !!ath_is_rfkill_set(sc); 1212 + 1213 + if (rfkill_set_hw_state(rfkill, blocked)) 1214 + ath_radio_disable(sc); 1215 + else 1216 + ath_radio_enable(sc); 1263 1217 } 1264 1218 1265 1219 /* Init s/w rfkill */ 1266 1220 static int ath_init_sw_rfkill(struct ath_softc *sc) 1267 1221 { 1268 - sc->rf_kill.rfkill = rfkill_allocate(wiphy_dev(sc->hw->wiphy), 1269 - RFKILL_TYPE_WLAN); 1222 + sc->rf_kill.ops.set_block = ath_rfkill_set_block; 1223 + if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_RFSILENT) 1224 + sc->rf_kill.ops.poll = ath_rfkill_poll_state; 1225 + 1226 + snprintf(sc->rf_kill.rfkill_name, sizeof(sc->rf_kill.rfkill_name), 1227 + "ath9k-%s::rfkill", wiphy_name(sc->hw->wiphy)); 1228 + 1229 + sc->rf_kill.rfkill = rfkill_alloc(sc->rf_kill.rfkill_name, 1230 + wiphy_dev(sc->hw->wiphy), 1231 + RFKILL_TYPE_WLAN, 1232 + &sc->rf_kill.ops, sc); 1270 1233 if (!sc->rf_kill.rfkill) { 1271 1234 DPRINTF(sc, ATH_DBG_FATAL, "Failed to allocate rfkill\n"); 1272 1235 return -ENOMEM; 1273 1236 } 1274 - 1275 - snprintf(sc->rf_kill.rfkill_name, sizeof(sc->rf_kill.rfkill_name), 1276 - "ath9k-%s::rfkill", wiphy_name(sc->hw->wiphy)); 1277 - sc->rf_kill.rfkill->name = sc->rf_kill.rfkill_name; 1278 - sc->rf_kill.rfkill->data = sc; 1279 - sc->rf_kill.rfkill->toggle_radio = ath_sw_toggle_radio; 1280 - sc->rf_kill.rfkill->state = RFKILL_STATE_UNBLOCKED; 1281 1237 1282 1238 return 0; 1283 1239 } ··· 1241 1285 /* Deinitialize rfkill */ 1242 1286 static void ath_deinit_rfkill(struct ath_softc *sc) 1243 1287 { 1244 - if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_RFSILENT) 1245 - cancel_delayed_work_sync(&sc->rf_kill.rfkill_poll); 1246 - 1247 1288 if (sc->sc_flags & SC_OP_RFKILL_REGISTERED) { 1248 1289 rfkill_unregister(sc->rf_kill.rfkill); 1290 + rfkill_destroy(sc->rf_kill.rfkill); 1249 1291 sc->sc_flags &= ~SC_OP_RFKILL_REGISTERED; 1250 - sc->rf_kill.rfkill = NULL; 1251 1292 } 1252 1293 } 1253 1294 1254 1295 static int ath_start_rfkill_poll(struct ath_softc *sc) 1255 1296 { 1256 - if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_RFSILENT) 1257 - queue_delayed_work(sc->hw->workqueue, 1258 - &sc->rf_kill.rfkill_poll, 0); 1259 - 1260 1297 if (!(sc->sc_flags & SC_OP_RFKILL_REGISTERED)) { 1261 1298 if (rfkill_register(sc->rf_kill.rfkill)) { 1262 1299 DPRINTF(sc, ATH_DBG_FATAL, 1263 1300 "Unable to register rfkill\n"); 1264 - rfkill_free(sc->rf_kill.rfkill); 1301 + rfkill_destroy(sc->rf_kill.rfkill); 1265 1302 1266 1303 /* Deinitialize the device */ 1267 1304 ath_cleanup(sc); ··· 1627 1678 goto error_attach; 1628 1679 1629 1680 #if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE) 1630 - /* Initialze h/w Rfkill */ 1631 - if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_RFSILENT) 1632 - INIT_DELAYED_WORK(&sc->rf_kill.rfkill_poll, ath_rfkill_poll); 1633 - 1634 1681 /* Initialize s/w rfkill */ 1635 1682 error = ath_init_sw_rfkill(sc); 1636 1683 if (error) ··· 2159 2214 } else 2160 2215 sc->rx.rxlink = NULL; 2161 2216 2162 - #if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE) 2163 - if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_RFSILENT) 2164 - cancel_delayed_work_sync(&sc->rf_kill.rfkill_poll); 2165 - #endif 2217 + rfkill_pause_polling(sc->rf_kill.rfkill); 2218 + 2166 2219 /* disable HAL and put h/w to sleep */ 2167 2220 ath9k_hw_disable(sc->sc_ah); 2168 2221 ath9k_hw_configpcipowersave(sc->sc_ah, 1);
-15
drivers/net/wireless/ath/ath9k/pci.c
··· 227 227 228 228 ath9k_hw_set_gpio(sc->sc_ah, ATH_LED_PIN, 1); 229 229 230 - #if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE) 231 - if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_RFSILENT) 232 - cancel_delayed_work_sync(&sc->rf_kill.rfkill_poll); 233 - #endif 234 - 235 230 pci_save_state(pdev); 236 231 pci_disable_device(pdev); 237 232 pci_set_power_state(pdev, PCI_D3hot); ··· 250 255 ath9k_hw_cfg_output(sc->sc_ah, ATH_LED_PIN, 251 256 AR_GPIO_OUTPUT_MUX_AS_OUTPUT); 252 257 ath9k_hw_set_gpio(sc->sc_ah, ATH_LED_PIN, 1); 253 - 254 - #if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE) 255 - /* 256 - * check the h/w rfkill state on resume 257 - * and start the rfkill poll timer 258 - */ 259 - if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_RFSILENT) 260 - queue_delayed_work(sc->hw->workqueue, 261 - &sc->rf_kill.rfkill_poll, 0); 262 - #endif 263 258 264 259 return 0; 265 260 }
+1 -1
drivers/net/wireless/b43/Kconfig
··· 102 102 # if it's possible. 103 103 config B43_RFKILL 104 104 bool 105 - depends on B43 && (RFKILL = y || RFKILL = B43) && RFKILL_INPUT && (INPUT_POLLDEV = y || INPUT_POLLDEV = B43) 105 + depends on B43 && (RFKILL = y || RFKILL = B43) 106 106 default y 107 107 108 108 # This config option automatically enables b43 HW-RNG support,
+1 -1
drivers/net/wireless/b43/leds.c
··· 87 87 } 88 88 89 89 static int b43_register_led(struct b43_wldev *dev, struct b43_led *led, 90 - const char *name, char *default_trigger, 90 + const char *name, const char *default_trigger, 91 91 u8 led_index, bool activelow) 92 92 { 93 93 int err;
+2 -2
drivers/net/wireless/b43/main.c
··· 3470 3470 3471 3471 if (!!conf->radio_enabled != phy->radio_on) { 3472 3472 if (conf->radio_enabled) { 3473 - b43_software_rfkill(dev, RFKILL_STATE_UNBLOCKED); 3473 + b43_software_rfkill(dev, false); 3474 3474 b43info(dev->wl, "Radio turned on by software\n"); 3475 3475 if (!dev->radio_hw_enable) { 3476 3476 b43info(dev->wl, "The hardware RF-kill button " ··· 3478 3478 "Press the button to turn it on.\n"); 3479 3479 } 3480 3480 } else { 3481 - b43_software_rfkill(dev, RFKILL_STATE_SOFT_BLOCKED); 3481 + b43_software_rfkill(dev, true); 3482 3482 b43info(dev->wl, "Radio turned off by software\n"); 3483 3483 } 3484 3484 }
+2 -2
drivers/net/wireless/b43/phy_a.c
··· 480 480 } 481 481 482 482 static void b43_aphy_op_software_rfkill(struct b43_wldev *dev, 483 - enum rfkill_state state) 483 + bool blocked) 484 484 { 485 485 struct b43_phy *phy = &dev->phy; 486 486 487 - if (state == RFKILL_STATE_UNBLOCKED) { 487 + if (!blocked) { 488 488 if (phy->radio_on) 489 489 return; 490 490 b43_radio_write16(dev, 0x0004, 0x00C0);
+6 -11
drivers/net/wireless/b43/phy_common.c
··· 84 84 85 85 phy->channel = ops->get_default_chan(dev); 86 86 87 - ops->software_rfkill(dev, RFKILL_STATE_UNBLOCKED); 87 + ops->software_rfkill(dev, false); 88 88 err = ops->init(dev); 89 89 if (err) { 90 90 b43err(dev->wl, "PHY init failed\n"); ··· 104 104 if (ops->exit) 105 105 ops->exit(dev); 106 106 err_block_rf: 107 - ops->software_rfkill(dev, RFKILL_STATE_SOFT_BLOCKED); 107 + ops->software_rfkill(dev, true); 108 108 109 109 return err; 110 110 } ··· 113 113 { 114 114 const struct b43_phy_operations *ops = dev->phy.ops; 115 115 116 - ops->software_rfkill(dev, RFKILL_STATE_SOFT_BLOCKED); 116 + ops->software_rfkill(dev, true); 117 117 if (ops->exit) 118 118 ops->exit(dev); 119 119 } ··· 295 295 return err; 296 296 } 297 297 298 - void b43_software_rfkill(struct b43_wldev *dev, enum rfkill_state state) 298 + void b43_software_rfkill(struct b43_wldev *dev, bool blocked) 299 299 { 300 300 struct b43_phy *phy = &dev->phy; 301 301 302 - if (state == RFKILL_STATE_HARD_BLOCKED) { 303 - /* We cannot hardware-block the device */ 304 - state = RFKILL_STATE_SOFT_BLOCKED; 305 - } 306 - 307 302 b43_mac_suspend(dev); 308 - phy->ops->software_rfkill(dev, state); 309 - phy->radio_on = (state == RFKILL_STATE_UNBLOCKED); 303 + phy->ops->software_rfkill(dev, blocked); 304 + phy->radio_on = !blocked; 310 305 b43_mac_enable(dev); 311 306 } 312 307
+2 -2
drivers/net/wireless/b43/phy_common.h
··· 159 159 160 160 /* Radio */ 161 161 bool (*supports_hwpctl)(struct b43_wldev *dev); 162 - void (*software_rfkill)(struct b43_wldev *dev, enum rfkill_state state); 162 + void (*software_rfkill)(struct b43_wldev *dev, bool blocked); 163 163 void (*switch_analog)(struct b43_wldev *dev, bool on); 164 164 int (*switch_channel)(struct b43_wldev *dev, unsigned int new_channel); 165 165 unsigned int (*get_default_chan)(struct b43_wldev *dev); ··· 364 364 /** 365 365 * b43_software_rfkill - Turn the radio ON or OFF in software. 366 366 */ 367 - void b43_software_rfkill(struct b43_wldev *dev, enum rfkill_state state); 367 + void b43_software_rfkill(struct b43_wldev *dev, bool blocked); 368 368 369 369 /** 370 370 * b43_phy_txpower_check - Check TX power output.
+2 -2
drivers/net/wireless/b43/phy_g.c
··· 2592 2592 } 2593 2593 2594 2594 static void b43_gphy_op_software_rfkill(struct b43_wldev *dev, 2595 - enum rfkill_state state) 2595 + bool blocked) 2596 2596 { 2597 2597 struct b43_phy *phy = &dev->phy; 2598 2598 struct b43_phy_g *gphy = phy->g; ··· 2600 2600 2601 2601 might_sleep(); 2602 2602 2603 - if (state == RFKILL_STATE_UNBLOCKED) { 2603 + if (!blocked) { 2604 2604 /* Turn radio ON */ 2605 2605 if (phy->radio_on) 2606 2606 return;
+1 -1
drivers/net/wireless/b43/phy_lp.c
··· 488 488 } 489 489 490 490 static void b43_lpphy_op_software_rfkill(struct b43_wldev *dev, 491 - enum rfkill_state state) 491 + bool blocked) 492 492 { 493 493 //TODO 494 494 }
+1 -1
drivers/net/wireless/b43/phy_n.c
··· 579 579 } 580 580 581 581 static void b43_nphy_op_software_rfkill(struct b43_wldev *dev, 582 - enum rfkill_state state) 582 + bool blocked) 583 583 {//TODO 584 584 } 585 585
+34 -89
drivers/net/wireless/b43/rfkill.c
··· 45 45 } 46 46 47 47 /* The poll callback for the hardware button. */ 48 - static void b43_rfkill_poll(struct input_polled_dev *poll_dev) 48 + static void b43_rfkill_poll(struct rfkill *rfkill, void *data) 49 49 { 50 - struct b43_wldev *dev = poll_dev->private; 50 + struct b43_wldev *dev = data; 51 51 struct b43_wl *wl = dev->wl; 52 52 bool enabled; 53 - bool report_change = 0; 54 53 55 54 mutex_lock(&wl->mutex); 56 55 if (unlikely(b43_status(dev) < B43_STAT_INITIALIZED)) { ··· 59 60 enabled = b43_is_hw_radio_enabled(dev); 60 61 if (unlikely(enabled != dev->radio_hw_enable)) { 61 62 dev->radio_hw_enable = enabled; 62 - report_change = 1; 63 63 b43info(wl, "Radio hardware status changed to %s\n", 64 64 enabled ? "ENABLED" : "DISABLED"); 65 + enabled = !rfkill_set_hw_state(rfkill, !enabled); 66 + if (enabled != dev->phy.radio_on) 67 + b43_software_rfkill(dev, !enabled); 65 68 } 66 69 mutex_unlock(&wl->mutex); 67 - 68 - /* send the radio switch event to the system - note both a key press 69 - * and a release are required */ 70 - if (unlikely(report_change)) { 71 - input_report_key(poll_dev->input, KEY_WLAN, 1); 72 - input_report_key(poll_dev->input, KEY_WLAN, 0); 73 - } 74 70 } 75 71 76 72 /* Called when the RFKILL toggled in software. */ 77 - static int b43_rfkill_soft_toggle(void *data, enum rfkill_state state) 73 + static int b43_rfkill_soft_set(void *data, bool blocked) 78 74 { 79 75 struct b43_wldev *dev = data; 80 76 struct b43_wl *wl = dev->wl; 81 - int err = -EBUSY; 77 + int err = -EINVAL; 82 78 83 - if (!wl->rfkill.registered) 84 - return 0; 79 + if (WARN_ON(!wl->rfkill.registered)) 80 + return -EINVAL; 85 81 86 82 mutex_lock(&wl->mutex); 83 + 87 84 if (b43_status(dev) < B43_STAT_INITIALIZED) 88 85 goto out_unlock; 86 + 87 + if (!dev->radio_hw_enable) 88 + goto out_unlock; 89 + 90 + if (!blocked != dev->phy.radio_on) 91 + b43_software_rfkill(dev, blocked); 89 92 err = 0; 90 - switch (state) { 91 - case RFKILL_STATE_UNBLOCKED: 92 - if (!dev->radio_hw_enable) { 93 - /* No luck. We can't toggle the hardware RF-kill 94 - * button from software. */ 95 - err = -EBUSY; 96 - goto out_unlock; 97 - } 98 - if (!dev->phy.radio_on) 99 - b43_software_rfkill(dev, state); 100 - break; 101 - case RFKILL_STATE_SOFT_BLOCKED: 102 - if (dev->phy.radio_on) 103 - b43_software_rfkill(dev, state); 104 - break; 105 - default: 106 - b43warn(wl, "Received unexpected rfkill state %d.\n", state); 107 - break; 108 - } 109 93 out_unlock: 110 94 mutex_unlock(&wl->mutex); 111 - 112 95 return err; 113 96 } 114 97 115 - char *b43_rfkill_led_name(struct b43_wldev *dev) 98 + const char *b43_rfkill_led_name(struct b43_wldev *dev) 116 99 { 117 100 struct b43_rfkill *rfk = &(dev->wl->rfkill); 118 101 119 102 if (!rfk->registered) 120 103 return NULL; 121 - return rfkill_get_led_name(rfk->rfkill); 104 + return rfkill_get_led_trigger_name(rfk->rfkill); 122 105 } 106 + 107 + static const struct rfkill_ops b43_rfkill_ops = { 108 + .set_block = b43_rfkill_soft_set, 109 + .poll = b43_rfkill_poll, 110 + }; 123 111 124 112 void b43_rfkill_init(struct b43_wldev *dev) 125 113 { ··· 116 130 117 131 rfk->registered = 0; 118 132 119 - rfk->rfkill = rfkill_allocate(dev->dev->dev, RFKILL_TYPE_WLAN); 120 - if (!rfk->rfkill) 121 - goto out_error; 122 133 snprintf(rfk->name, sizeof(rfk->name), 123 134 "b43-%s", wiphy_name(wl->hw->wiphy)); 124 - rfk->rfkill->name = rfk->name; 125 - rfk->rfkill->state = RFKILL_STATE_UNBLOCKED; 126 - rfk->rfkill->data = dev; 127 - rfk->rfkill->toggle_radio = b43_rfkill_soft_toggle; 128 135 129 - rfk->poll_dev = input_allocate_polled_device(); 130 - if (!rfk->poll_dev) { 131 - rfkill_free(rfk->rfkill); 132 - goto err_freed_rfk; 133 - } 134 - 135 - rfk->poll_dev->private = dev; 136 - rfk->poll_dev->poll = b43_rfkill_poll; 137 - rfk->poll_dev->poll_interval = 1000; /* msecs */ 138 - 139 - rfk->poll_dev->input->name = rfk->name; 140 - rfk->poll_dev->input->id.bustype = BUS_HOST; 141 - rfk->poll_dev->input->id.vendor = dev->dev->bus->boardinfo.vendor; 142 - rfk->poll_dev->input->evbit[0] = BIT(EV_KEY); 143 - set_bit(KEY_WLAN, rfk->poll_dev->input->keybit); 136 + rfk->rfkill = rfkill_alloc(rfk->name, 137 + dev->dev->dev, 138 + RFKILL_TYPE_WLAN, 139 + &b43_rfkill_ops, dev); 140 + if (!rfk->rfkill) 141 + goto out_error; 144 142 145 143 err = rfkill_register(rfk->rfkill); 146 144 if (err) 147 - goto err_free_polldev; 148 - 149 - #ifdef CONFIG_RFKILL_INPUT_MODULE 150 - /* B43 RF-kill isn't useful without the rfkill-input subsystem. 151 - * Try to load the module. */ 152 - err = request_module("rfkill-input"); 153 - if (err) 154 - b43warn(wl, "Failed to load the rfkill-input module. " 155 - "The built-in radio LED will not work.\n"); 156 - #endif /* CONFIG_RFKILL_INPUT */ 157 - 158 - #if !defined(CONFIG_RFKILL_INPUT) && !defined(CONFIG_RFKILL_INPUT_MODULE) 159 - b43warn(wl, "The rfkill-input subsystem is not available. " 160 - "The built-in radio LED will not work.\n"); 161 - #endif 162 - 163 - err = input_register_polled_device(rfk->poll_dev); 164 - if (err) 165 - goto err_unreg_rfk; 145 + goto err_free; 166 146 167 147 rfk->registered = 1; 168 148 169 149 return; 170 - err_unreg_rfk: 171 - rfkill_unregister(rfk->rfkill); 172 - err_free_polldev: 173 - input_free_polled_device(rfk->poll_dev); 174 - rfk->poll_dev = NULL; 175 - err_freed_rfk: 176 - rfk->rfkill = NULL; 177 - out_error: 150 + err_free: 151 + rfkill_destroy(rfk->rfkill); 152 + out_error: 178 153 rfk->registered = 0; 179 154 b43warn(wl, "RF-kill button init failed\n"); 180 155 } ··· 148 201 return; 149 202 rfk->registered = 0; 150 203 151 - input_unregister_polled_device(rfk->poll_dev); 152 204 rfkill_unregister(rfk->rfkill); 153 - input_free_polled_device(rfk->poll_dev); 154 - rfk->poll_dev = NULL; 205 + rfkill_destroy(rfk->rfkill); 155 206 rfk->rfkill = NULL; 156 207 }
+1 -4
drivers/net/wireless/b43/rfkill.h
··· 7 7 #ifdef CONFIG_B43_RFKILL 8 8 9 9 #include <linux/rfkill.h> 10 - #include <linux/input-polldev.h> 11 10 12 11 13 12 struct b43_rfkill { 14 13 /* The RFKILL subsystem data structure */ 15 14 struct rfkill *rfkill; 16 - /* The poll device for the RFKILL input button */ 17 - struct input_polled_dev *poll_dev; 18 15 /* Did initialization succeed? Used for freeing. */ 19 16 bool registered; 20 17 /* The unique name of this rfkill switch */ ··· 23 26 void b43_rfkill_init(struct b43_wldev *dev); 24 27 void b43_rfkill_exit(struct b43_wldev *dev); 25 28 26 - char * b43_rfkill_led_name(struct b43_wldev *dev); 29 + const char *b43_rfkill_led_name(struct b43_wldev *dev); 27 30 28 31 29 32 #else /* CONFIG_B43_RFKILL */
+1 -1
drivers/net/wireless/b43legacy/Kconfig
··· 47 47 # if it's possible. 48 48 config B43LEGACY_RFKILL 49 49 bool 50 - depends on B43LEGACY && (RFKILL = y || RFKILL = B43LEGACY) && RFKILL_INPUT && (INPUT_POLLDEV = y || INPUT_POLLDEV = B43LEGACY) 50 + depends on B43LEGACY && (RFKILL = y || RFKILL = B43LEGACY) 51 51 default y 52 52 53 53 # This config option automatically enables b43 HW-RNG support,
+2 -1
drivers/net/wireless/b43legacy/leds.c
··· 86 86 87 87 static int b43legacy_register_led(struct b43legacy_wldev *dev, 88 88 struct b43legacy_led *led, 89 - const char *name, char *default_trigger, 89 + const char *name, 90 + const char *default_trigger, 90 91 u8 led_index, bool activelow) 91 92 { 92 93 int err;
+39 -84
drivers/net/wireless/b43legacy/rfkill.c
··· 45 45 } 46 46 47 47 /* The poll callback for the hardware button. */ 48 - static void b43legacy_rfkill_poll(struct input_polled_dev *poll_dev) 48 + static void b43legacy_rfkill_poll(struct rfkill *rfkill, void *data) 49 49 { 50 - struct b43legacy_wldev *dev = poll_dev->private; 50 + struct b43legacy_wldev *dev = data; 51 51 struct b43legacy_wl *wl = dev->wl; 52 52 bool enabled; 53 - bool report_change = 0; 54 53 55 54 mutex_lock(&wl->mutex); 56 55 if (unlikely(b43legacy_status(dev) < B43legacy_STAT_INITIALIZED)) { ··· 59 60 enabled = b43legacy_is_hw_radio_enabled(dev); 60 61 if (unlikely(enabled != dev->radio_hw_enable)) { 61 62 dev->radio_hw_enable = enabled; 62 - report_change = 1; 63 63 b43legacyinfo(wl, "Radio hardware status changed to %s\n", 64 64 enabled ? "ENABLED" : "DISABLED"); 65 + enabled = !rfkill_set_hw_state(rfkill, !enabled); 66 + if (enabled != dev->phy.radio_on) { 67 + if (enabled) 68 + b43legacy_radio_turn_on(dev); 69 + else 70 + b43legacy_radio_turn_off(dev, 0); 71 + } 65 72 } 66 73 mutex_unlock(&wl->mutex); 67 - 68 - /* send the radio switch event to the system - note both a key press 69 - * and a release are required */ 70 - if (unlikely(report_change)) { 71 - input_report_key(poll_dev->input, KEY_WLAN, 1); 72 - input_report_key(poll_dev->input, KEY_WLAN, 0); 73 - } 74 74 } 75 75 76 76 /* Called when the RFKILL toggled in software. 77 77 * This is called without locking. */ 78 - static int b43legacy_rfkill_soft_toggle(void *data, enum rfkill_state state) 78 + static int b43legacy_rfkill_soft_set(void *data, bool blocked) 79 79 { 80 80 struct b43legacy_wldev *dev = data; 81 81 struct b43legacy_wl *wl = dev->wl; 82 - int err = -EBUSY; 82 + int ret = -EINVAL; 83 83 84 84 if (!wl->rfkill.registered) 85 - return 0; 85 + return -EINVAL; 86 86 87 87 mutex_lock(&wl->mutex); 88 88 if (b43legacy_status(dev) < B43legacy_STAT_INITIALIZED) 89 89 goto out_unlock; 90 - err = 0; 91 - switch (state) { 92 - case RFKILL_STATE_UNBLOCKED: 93 - if (!dev->radio_hw_enable) { 94 - /* No luck. We can't toggle the hardware RF-kill 95 - * button from software. */ 96 - err = -EBUSY; 97 - goto out_unlock; 98 - } 99 - if (!dev->phy.radio_on) 90 + 91 + if (!dev->radio_hw_enable) 92 + goto out_unlock; 93 + 94 + if (!blocked != dev->phy.radio_on) { 95 + if (!blocked) 100 96 b43legacy_radio_turn_on(dev); 101 - break; 102 - case RFKILL_STATE_SOFT_BLOCKED: 103 - if (dev->phy.radio_on) 97 + else 104 98 b43legacy_radio_turn_off(dev, 0); 105 - break; 106 - default: 107 - b43legacywarn(wl, "Received unexpected rfkill state %d.\n", 108 - state); 109 - break; 110 99 } 100 + ret = 0; 111 101 112 102 out_unlock: 113 103 mutex_unlock(&wl->mutex); 114 - 115 - return err; 104 + return ret; 116 105 } 117 106 118 - char *b43legacy_rfkill_led_name(struct b43legacy_wldev *dev) 107 + const char *b43legacy_rfkill_led_name(struct b43legacy_wldev *dev) 119 108 { 120 109 struct b43legacy_rfkill *rfk = &(dev->wl->rfkill); 121 110 122 111 if (!rfk->registered) 123 112 return NULL; 124 - return rfkill_get_led_name(rfk->rfkill); 113 + return rfkill_get_led_trigger_name(rfk->rfkill); 125 114 } 115 + 116 + static const struct rfkill_ops b43legacy_rfkill_ops = { 117 + .set_block = b43legacy_rfkill_soft_set, 118 + .poll = b43legacy_rfkill_poll, 119 + }; 126 120 127 121 void b43legacy_rfkill_init(struct b43legacy_wldev *dev) 128 122 { ··· 125 133 126 134 rfk->registered = 0; 127 135 128 - rfk->rfkill = rfkill_allocate(dev->dev->dev, RFKILL_TYPE_WLAN); 129 - if (!rfk->rfkill) 130 - goto out_error; 131 136 snprintf(rfk->name, sizeof(rfk->name), 132 137 "b43legacy-%s", wiphy_name(wl->hw->wiphy)); 133 - rfk->rfkill->name = rfk->name; 134 - rfk->rfkill->state = RFKILL_STATE_UNBLOCKED; 135 - rfk->rfkill->data = dev; 136 - rfk->rfkill->toggle_radio = b43legacy_rfkill_soft_toggle; 137 - 138 - rfk->poll_dev = input_allocate_polled_device(); 139 - if (!rfk->poll_dev) { 140 - rfkill_free(rfk->rfkill); 141 - goto err_freed_rfk; 142 - } 143 - 144 - rfk->poll_dev->private = dev; 145 - rfk->poll_dev->poll = b43legacy_rfkill_poll; 146 - rfk->poll_dev->poll_interval = 1000; /* msecs */ 147 - 148 - rfk->poll_dev->input->name = rfk->name; 149 - rfk->poll_dev->input->id.bustype = BUS_HOST; 150 - rfk->poll_dev->input->id.vendor = dev->dev->bus->boardinfo.vendor; 151 - rfk->poll_dev->input->evbit[0] = BIT(EV_KEY); 152 - set_bit(KEY_WLAN, rfk->poll_dev->input->keybit); 138 + rfk->rfkill = rfkill_alloc(rfk->name, 139 + dev->dev->dev, 140 + RFKILL_TYPE_WLAN, 141 + &b43legacy_rfkill_ops, dev); 142 + if (!rfk->rfkill) 143 + goto out_error; 153 144 154 145 err = rfkill_register(rfk->rfkill); 155 146 if (err) 156 - goto err_free_polldev; 157 - 158 - #ifdef CONFIG_RFKILL_INPUT_MODULE 159 - /* B43legacy RF-kill isn't useful without the rfkill-input subsystem. 160 - * Try to load the module. */ 161 - err = request_module("rfkill-input"); 162 - if (err) 163 - b43legacywarn(wl, "Failed to load the rfkill-input module." 164 - "The built-in radio LED will not work.\n"); 165 - #endif /* CONFIG_RFKILL_INPUT */ 166 - 167 - err = input_register_polled_device(rfk->poll_dev); 168 - if (err) 169 - goto err_unreg_rfk; 147 + goto err_free; 170 148 171 149 rfk->registered = 1; 172 150 173 151 return; 174 - err_unreg_rfk: 175 - rfkill_unregister(rfk->rfkill); 176 - err_free_polldev: 177 - input_free_polled_device(rfk->poll_dev); 178 - rfk->poll_dev = NULL; 179 - err_freed_rfk: 180 - rfk->rfkill = NULL; 181 - out_error: 152 + err_free: 153 + rfkill_destroy(rfk->rfkill); 154 + out_error: 182 155 rfk->registered = 0; 183 156 b43legacywarn(wl, "RF-kill button init failed\n"); 184 157 } ··· 156 199 return; 157 200 rfk->registered = 0; 158 201 159 - input_unregister_polled_device(rfk->poll_dev); 160 202 rfkill_unregister(rfk->rfkill); 161 - input_free_polled_device(rfk->poll_dev); 162 - rfk->poll_dev = NULL; 203 + rfkill_destroy(rfk->rfkill); 163 204 rfk->rfkill = NULL; 164 205 } 165 206
+1 -5
drivers/net/wireless/b43legacy/rfkill.h
··· 6 6 #ifdef CONFIG_B43LEGACY_RFKILL 7 7 8 8 #include <linux/rfkill.h> 9 - #include <linux/workqueue.h> 10 - #include <linux/input-polldev.h> 11 9 12 10 13 11 14 12 struct b43legacy_rfkill { 15 13 /* The RFKILL subsystem data structure */ 16 14 struct rfkill *rfkill; 17 - /* The poll device for the RFKILL input button */ 18 - struct input_polled_dev *poll_dev; 19 15 /* Did initialization succeed? Used for freeing. */ 20 16 bool registered; 21 17 /* The unique name of this rfkill switch */ ··· 23 27 void b43legacy_rfkill_init(struct b43legacy_wldev *dev); 24 28 void b43legacy_rfkill_exit(struct b43legacy_wldev *dev); 25 29 26 - char *b43legacy_rfkill_led_name(struct b43legacy_wldev *dev); 30 + const char *b43legacy_rfkill_led_name(struct b43legacy_wldev *dev); 27 31 28 32 29 33 #else /* CONFIG_B43LEGACY_RFKILL */
+2 -3
drivers/net/wireless/iwlwifi/Kconfig
··· 5 5 select FW_LOADER 6 6 select MAC80211_LEDS if IWLWIFI_LEDS 7 7 select LEDS_CLASS if IWLWIFI_LEDS 8 - select RFKILL if IWLWIFI_RFKILL 9 8 10 9 config IWLWIFI_LEDS 11 10 bool "Enable LED support in iwlagn and iwl3945 drivers" 12 11 depends on IWLWIFI 13 12 14 13 config IWLWIFI_RFKILL 15 - bool "Enable RF kill support in iwlagn and iwl3945 drivers" 16 - depends on IWLWIFI 14 + def_bool y 15 + depends on IWLWIFI && RFKILL 17 16 18 17 config IWLWIFI_SPECTRUM_MEASUREMENT 19 18 bool "Enable Spectrum Measurement in iwlagn driver"
+28 -41
drivers/net/wireless/iwlwifi/iwl-rfkill.c
··· 36 36 #include "iwl-core.h" 37 37 38 38 /* software rf-kill from user */ 39 - static int iwl_rfkill_soft_rf_kill(void *data, enum rfkill_state state) 39 + static int iwl_rfkill_soft_rf_kill(void *data, bool blocked) 40 40 { 41 41 struct iwl_priv *priv = data; 42 - int err = 0; 43 42 44 43 if (!priv->rfkill) 45 - return 0; 44 + return -EINVAL; 46 45 47 46 if (test_bit(STATUS_EXIT_PENDING, &priv->status)) 48 47 return 0; 49 48 50 - IWL_DEBUG_RF_KILL(priv, "we received soft RFKILL set to state %d\n", state); 49 + IWL_DEBUG_RF_KILL(priv, "received soft RFKILL: block=%d\n", blocked); 50 + 51 51 mutex_lock(&priv->mutex); 52 52 53 - switch (state) { 54 - case RFKILL_STATE_UNBLOCKED: 55 - if (iwl_is_rfkill_hw(priv)) { 56 - err = -EBUSY; 57 - goto out_unlock; 58 - } 53 + if (iwl_is_rfkill_hw(priv)) 54 + goto out_unlock; 55 + 56 + if (!blocked) 59 57 iwl_radio_kill_sw_enable_radio(priv); 60 - break; 61 - case RFKILL_STATE_SOFT_BLOCKED: 58 + else 62 59 iwl_radio_kill_sw_disable_radio(priv); 63 - break; 64 - default: 65 - IWL_WARN(priv, "we received unexpected RFKILL state %d\n", 66 - state); 67 - break; 68 - } 60 + 69 61 out_unlock: 70 62 mutex_unlock(&priv->mutex); 71 - 72 - return err; 63 + return 0; 73 64 } 65 + 66 + static const struct rfkill_ops iwl_rfkill_ops = { 67 + .set_block = iwl_rfkill_soft_rf_kill, 68 + }; 74 69 75 70 int iwl_rfkill_init(struct iwl_priv *priv) 76 71 { ··· 75 80 BUG_ON(device == NULL); 76 81 77 82 IWL_DEBUG_RF_KILL(priv, "Initializing RFKILL.\n"); 78 - priv->rfkill = rfkill_allocate(device, RFKILL_TYPE_WLAN); 83 + priv->rfkill = rfkill_alloc(priv->cfg->name, 84 + device, 85 + RFKILL_TYPE_WLAN, 86 + &iwl_rfkill_ops, priv); 79 87 if (!priv->rfkill) { 80 88 IWL_ERR(priv, "Unable to allocate RFKILL device.\n"); 81 89 ret = -ENOMEM; 82 90 goto error; 83 91 } 84 - 85 - priv->rfkill->name = priv->cfg->name; 86 - priv->rfkill->data = priv; 87 - priv->rfkill->state = RFKILL_STATE_UNBLOCKED; 88 - priv->rfkill->toggle_radio = iwl_rfkill_soft_rf_kill; 89 - 90 - priv->rfkill->dev.class->suspend = NULL; 91 - priv->rfkill->dev.class->resume = NULL; 92 92 93 93 ret = rfkill_register(priv->rfkill); 94 94 if (ret) { ··· 92 102 } 93 103 94 104 IWL_DEBUG_RF_KILL(priv, "RFKILL initialization complete.\n"); 95 - return ret; 105 + return 0; 96 106 97 107 free_rfkill: 98 - if (priv->rfkill != NULL) 99 - rfkill_free(priv->rfkill); 108 + rfkill_destroy(priv->rfkill); 100 109 priv->rfkill = NULL; 101 110 102 111 error: ··· 107 118 void iwl_rfkill_unregister(struct iwl_priv *priv) 108 119 { 109 120 110 - if (priv->rfkill) 121 + if (priv->rfkill) { 111 122 rfkill_unregister(priv->rfkill); 123 + rfkill_destroy(priv->rfkill); 124 + } 112 125 113 126 priv->rfkill = NULL; 114 127 } ··· 122 131 if (!priv->rfkill) 123 132 return; 124 133 125 - if (iwl_is_rfkill_hw(priv)) { 126 - rfkill_force_state(priv->rfkill, RFKILL_STATE_HARD_BLOCKED); 127 - return; 128 - } 129 - 130 - if (!iwl_is_rfkill_sw(priv)) 131 - rfkill_force_state(priv->rfkill, RFKILL_STATE_UNBLOCKED); 134 + if (rfkill_set_hw_state(priv->rfkill, 135 + !!iwl_is_rfkill_hw(priv))) 136 + iwl_radio_kill_sw_disable_radio(priv); 132 137 else 133 - rfkill_force_state(priv->rfkill, RFKILL_STATE_SOFT_BLOCKED); 138 + iwl_radio_kill_sw_enable_radio(priv); 134 139 } 135 140 EXPORT_SYMBOL(iwl_rfkill_set_hw_state);
+17 -22
drivers/net/wireless/iwmc3200wifi/rfkill.c
··· 25 25 26 26 #include "iwm.h" 27 27 28 - static int iwm_rfkill_soft_toggle(void *data, enum rfkill_state state) 28 + static int iwm_rfkill_set_block(void *data, bool blocked) 29 29 { 30 30 struct iwm_priv *iwm = data; 31 31 32 - switch (state) { 33 - case RFKILL_STATE_UNBLOCKED: 32 + if (!blocked) { 34 33 if (test_bit(IWM_RADIO_RFKILL_HW, &iwm->radio)) 35 34 return -EBUSY; 36 35 37 36 if (test_and_clear_bit(IWM_RADIO_RFKILL_SW, &iwm->radio) && 38 37 (iwm_to_ndev(iwm)->flags & IFF_UP)) 39 - iwm_up(iwm); 40 - 41 - break; 42 - case RFKILL_STATE_SOFT_BLOCKED: 38 + return iwm_up(iwm); 39 + } else { 43 40 if (!test_and_set_bit(IWM_RADIO_RFKILL_SW, &iwm->radio)) 44 - iwm_down(iwm); 45 - 46 - break; 47 - default: 48 - break; 41 + return iwm_down(iwm); 49 42 } 50 43 51 44 return 0; 52 45 } 53 46 47 + static const struct rfkill_ops iwm_rfkill_ops = { 48 + .set_block = iwm_rfkill_set_block, 49 + }; 50 + 54 51 int iwm_rfkill_init(struct iwm_priv *iwm) 55 52 { 56 53 int ret; 57 54 58 - iwm->rfkill = rfkill_allocate(iwm_to_dev(iwm), RFKILL_TYPE_WLAN); 55 + iwm->rfkill = rfkill_alloc(KBUILD_MODNAME, 56 + iwm_to_dev(iwm), 57 + RFKILL_TYPE_WLAN, 58 + &iwm_rfkill_ops, iwm); 59 59 if (!iwm->rfkill) { 60 60 IWM_ERR(iwm, "Unable to allocate rfkill device\n"); 61 61 return -ENOMEM; 62 62 } 63 - 64 - iwm->rfkill->name = KBUILD_MODNAME; 65 - iwm->rfkill->data = iwm; 66 - iwm->rfkill->state = RFKILL_STATE_UNBLOCKED; 67 - iwm->rfkill->toggle_radio = iwm_rfkill_soft_toggle; 68 63 69 64 ret = rfkill_register(iwm->rfkill); 70 65 if (ret) { ··· 69 74 70 75 return 0; 71 76 fail: 72 - rfkill_free(iwm->rfkill); 77 + rfkill_destroy(iwm->rfkill); 73 78 return ret; 74 79 } 75 80 76 81 void iwm_rfkill_exit(struct iwm_priv *iwm) 77 82 { 78 - if (iwm->rfkill) 83 + if (iwm->rfkill) { 79 84 rfkill_unregister(iwm->rfkill); 80 - 81 - rfkill_free(iwm->rfkill); 85 + rfkill_destroy(iwm->rfkill); 86 + } 82 87 iwm->rfkill = NULL; 83 88 }
+6 -8
drivers/platform/x86/Kconfig
··· 21 21 depends on NEW_LEDS 22 22 depends on BACKLIGHT_CLASS_DEVICE 23 23 depends on SERIO_I8042 24 - depends on RFKILL 24 + depends on RFKILL || RFKILL = n 25 25 select ACPI_WMI 26 26 ---help--- 27 27 This is a driver for newer Acer (and Wistron) laptops. It adds ··· 60 60 depends on DCDBAS 61 61 depends on EXPERIMENTAL 62 62 depends on BACKLIGHT_CLASS_DEVICE 63 - depends on RFKILL 63 + depends on RFKILL || RFKILL = n 64 64 depends on POWER_SUPPLY 65 65 default n 66 66 ---help--- ··· 117 117 tristate "HP WMI extras" 118 118 depends on ACPI_WMI 119 119 depends on INPUT 120 - depends on RFKILL 120 + depends on RFKILL || RFKILL = n 121 121 help 122 122 Say Y here if you want to support WMI-based hotkeys on HP laptops and 123 123 to read data from WMI such as docking or ambient light sensor state. ··· 196 196 tristate "ThinkPad ACPI Laptop Extras" 197 197 depends on ACPI 198 198 depends on INPUT 199 + depends on RFKILL || RFKILL = n 199 200 select BACKLIGHT_LCD_SUPPORT 200 201 select BACKLIGHT_CLASS_DEVICE 201 202 select HWMON 202 203 select NVRAM 203 204 select NEW_LEDS 204 205 select LEDS_CLASS 205 - select NET 206 - select RFKILL 207 206 ---help--- 208 207 This is a driver for the IBM and Lenovo ThinkPad laptops. It adds 209 208 support for Fn-Fx key combinations, Bluetooth control, video ··· 337 338 depends on ACPI 338 339 depends on INPUT 339 340 depends on EXPERIMENTAL 341 + depends on RFKILL || RFKILL = n 340 342 select BACKLIGHT_CLASS_DEVICE 341 343 select HWMON 342 - select RFKILL 343 344 ---help--- 344 345 This driver supports the Fn-Fx keys on Eee PC laptops. 345 346 It also adds the ability to switch camera/wlan on/off. ··· 404 405 tristate "Toshiba Laptop Extras" 405 406 depends on ACPI 406 407 depends on INPUT 408 + depends on RFKILL || RFKILL = n 407 409 select INPUT_POLLDEV 408 - select NET 409 - select RFKILL 410 410 select BACKLIGHT_CLASS_DEVICE 411 411 ---help--- 412 412 This driver adds support for access to certain system settings
+22 -28
drivers/platform/x86/acer-wmi.c
··· 958 958 959 959 status = get_u32(&state, ACER_CAP_WIRELESS); 960 960 if (ACPI_SUCCESS(status)) 961 - rfkill_force_state(wireless_rfkill, state ? 962 - RFKILL_STATE_UNBLOCKED : RFKILL_STATE_SOFT_BLOCKED); 961 + rfkill_set_sw_state(wireless_rfkill, !!state); 963 962 964 963 if (has_cap(ACER_CAP_BLUETOOTH)) { 965 964 status = get_u32(&state, ACER_CAP_BLUETOOTH); 966 965 if (ACPI_SUCCESS(status)) 967 - rfkill_force_state(bluetooth_rfkill, state ? 968 - RFKILL_STATE_UNBLOCKED : 969 - RFKILL_STATE_SOFT_BLOCKED); 966 + rfkill_set_sw_state(bluetooth_rfkill, !!state); 970 967 } 971 968 972 969 schedule_delayed_work(&acer_rfkill_work, round_jiffies_relative(HZ)); 973 970 } 974 971 975 - static int acer_rfkill_set(void *data, enum rfkill_state state) 972 + static int acer_rfkill_set(void *data, bool blocked) 976 973 { 977 974 acpi_status status; 978 - u32 *cap = data; 979 - status = set_u32((u32) (state == RFKILL_STATE_UNBLOCKED), *cap); 975 + u32 cap = (unsigned long)data; 976 + status = set_u32(!!blocked, cap); 980 977 if (ACPI_FAILURE(status)) 981 978 return -ENODEV; 982 979 return 0; 983 980 } 984 981 985 - static struct rfkill * acer_rfkill_register(struct device *dev, 986 - enum rfkill_type type, char *name, u32 cap) 982 + static const struct rfkill_ops acer_rfkill_ops = { 983 + .set_block = acer_rfkill_set, 984 + }; 985 + 986 + static struct rfkill *acer_rfkill_register(struct device *dev, 987 + enum rfkill_type type, 988 + char *name, u32 cap) 987 989 { 988 990 int err; 989 991 u32 state; 990 - u32 *data; 991 992 struct rfkill *rfkill_dev; 992 993 993 - rfkill_dev = rfkill_allocate(dev, type); 994 + rfkill_dev = rfkill_alloc(name, dev, type, 995 + &acer_rfkill_ops, 996 + (void *)(unsigned long)cap); 994 997 if (!rfkill_dev) 995 998 return ERR_PTR(-ENOMEM); 996 - rfkill_dev->name = name; 997 999 get_u32(&state, cap); 998 - rfkill_dev->state = state ? RFKILL_STATE_UNBLOCKED : 999 - RFKILL_STATE_SOFT_BLOCKED; 1000 - data = kzalloc(sizeof(u32), GFP_KERNEL); 1001 - if (!data) { 1002 - rfkill_free(rfkill_dev); 1003 - return ERR_PTR(-ENOMEM); 1004 - } 1005 - *data = cap; 1006 - rfkill_dev->data = data; 1007 - rfkill_dev->toggle_radio = acer_rfkill_set; 1000 + rfkill_set_sw_state(rfkill_dev, !state); 1008 1001 1009 1002 err = rfkill_register(rfkill_dev); 1010 1003 if (err) { 1011 - kfree(rfkill_dev->data); 1012 - rfkill_free(rfkill_dev); 1004 + rfkill_destroy(rfkill_dev); 1013 1005 return ERR_PTR(err); 1014 1006 } 1015 1007 return rfkill_dev; ··· 1019 1027 RFKILL_TYPE_BLUETOOTH, "acer-bluetooth", 1020 1028 ACER_CAP_BLUETOOTH); 1021 1029 if (IS_ERR(bluetooth_rfkill)) { 1022 - kfree(wireless_rfkill->data); 1023 1030 rfkill_unregister(wireless_rfkill); 1031 + rfkill_destroy(wireless_rfkill); 1024 1032 return PTR_ERR(bluetooth_rfkill); 1025 1033 } 1026 1034 } ··· 1033 1041 static void acer_rfkill_exit(void) 1034 1042 { 1035 1043 cancel_delayed_work_sync(&acer_rfkill_work); 1036 - kfree(wireless_rfkill->data); 1044 + 1037 1045 rfkill_unregister(wireless_rfkill); 1046 + rfkill_destroy(wireless_rfkill); 1047 + 1038 1048 if (has_cap(ACER_CAP_BLUETOOTH)) { 1039 - kfree(bluetooth_rfkill->data); 1040 1049 rfkill_unregister(bluetooth_rfkill); 1050 + rfkill_destroy(bluetooth_rfkill); 1041 1051 } 1042 1052 return; 1043 1053 }
+34 -71
drivers/platform/x86/dell-laptop.c
··· 174 174 result[3]: NVRAM format version number 175 175 */ 176 176 177 - static int dell_rfkill_set(int radio, enum rfkill_state state) 177 + static int dell_rfkill_set(void *data, bool blocked) 178 178 { 179 179 struct calling_interface_buffer buffer; 180 - int disable = (state == RFKILL_STATE_UNBLOCKED) ? 0 : 1; 180 + int disable = blocked ? 0 : 1; 181 + unsigned long radio = (unsigned long)data; 181 182 182 183 memset(&buffer, 0, sizeof(struct calling_interface_buffer)); 183 184 buffer.input[0] = (1 | (radio<<8) | (disable << 16)); ··· 187 186 return 0; 188 187 } 189 188 190 - static int dell_wifi_set(void *data, enum rfkill_state state) 191 - { 192 - return dell_rfkill_set(1, state); 193 - } 194 - 195 - static int dell_bluetooth_set(void *data, enum rfkill_state state) 196 - { 197 - return dell_rfkill_set(2, state); 198 - } 199 - 200 - static int dell_wwan_set(void *data, enum rfkill_state state) 201 - { 202 - return dell_rfkill_set(3, state); 203 - } 204 - 205 - static int dell_rfkill_get(int bit, enum rfkill_state *state) 189 + static void dell_rfkill_query(struct rfkill *rfkill, void *data) 206 190 { 207 191 struct calling_interface_buffer buffer; 208 192 int status; 209 - int new_state = RFKILL_STATE_HARD_BLOCKED; 193 + int bit = (unsigned long)data + 16; 210 194 211 195 memset(&buffer, 0, sizeof(struct calling_interface_buffer)); 212 196 dell_send_request(&buffer, 17, 11); 213 197 status = buffer.output[1]; 214 198 215 - if (status & (1<<16)) 216 - new_state = RFKILL_STATE_SOFT_BLOCKED; 217 - 218 - if (status & (1<<bit)) 219 - *state = new_state; 220 - else 221 - *state = RFKILL_STATE_UNBLOCKED; 222 - 223 - return 0; 199 + if (status & BIT(bit)) 200 + rfkill_set_hw_state(rfkill, !!(status & BIT(16))); 224 201 } 225 202 226 - static int dell_wifi_get(void *data, enum rfkill_state *state) 227 - { 228 - return dell_rfkill_get(17, state); 229 - } 230 - 231 - static int dell_bluetooth_get(void *data, enum rfkill_state *state) 232 - { 233 - return dell_rfkill_get(18, state); 234 - } 235 - 236 - static int dell_wwan_get(void *data, enum rfkill_state *state) 237 - { 238 - return dell_rfkill_get(19, state); 239 - } 203 + static const struct rfkill_ops dell_rfkill_ops = { 204 + .set_block = dell_rfkill_set, 205 + .query = dell_rfkill_query, 206 + }; 240 207 241 208 static int dell_setup_rfkill(void) 242 209 { ··· 217 248 status = buffer.output[1]; 218 249 219 250 if ((status & (1<<2|1<<8)) == (1<<2|1<<8)) { 220 - wifi_rfkill = rfkill_allocate(NULL, RFKILL_TYPE_WLAN); 221 - if (!wifi_rfkill) 251 + wifi_rfkill = rfkill_alloc("dell-wifi", NULL, RFKILL_TYPE_WLAN, 252 + &dell_rfkill_ops, (void *) 1); 253 + if (!wifi_rfkill) { 254 + ret = -ENOMEM; 222 255 goto err_wifi; 223 - wifi_rfkill->name = "dell-wifi"; 224 - wifi_rfkill->toggle_radio = dell_wifi_set; 225 - wifi_rfkill->get_state = dell_wifi_get; 256 + } 226 257 ret = rfkill_register(wifi_rfkill); 227 258 if (ret) 228 259 goto err_wifi; 229 260 } 230 261 231 262 if ((status & (1<<3|1<<9)) == (1<<3|1<<9)) { 232 - bluetooth_rfkill = rfkill_allocate(NULL, RFKILL_TYPE_BLUETOOTH); 233 - if (!bluetooth_rfkill) 263 + bluetooth_rfkill = rfkill_alloc("dell-bluetooth", NULL, 264 + RFKILL_TYPE_BLUETOOTH, 265 + &dell_rfkill_ops, (void *) 2); 266 + if (!bluetooth_rfkill) { 267 + ret = -ENOMEM; 234 268 goto err_bluetooth; 235 - bluetooth_rfkill->name = "dell-bluetooth"; 236 - bluetooth_rfkill->toggle_radio = dell_bluetooth_set; 237 - bluetooth_rfkill->get_state = dell_bluetooth_get; 269 + } 238 270 ret = rfkill_register(bluetooth_rfkill); 239 271 if (ret) 240 272 goto err_bluetooth; 241 273 } 242 274 243 275 if ((status & (1<<4|1<<10)) == (1<<4|1<<10)) { 244 - wwan_rfkill = rfkill_allocate(NULL, RFKILL_TYPE_WWAN); 245 - if (!wwan_rfkill) 276 + wwan_rfkill = rfkill_alloc("dell-wwan", NULL, RFKILL_TYPE_WWAN, 277 + &dell_rfkill_ops, (void *) 3); 278 + if (!wwan_rfkill) { 279 + ret = -ENOMEM; 246 280 goto err_wwan; 247 - wwan_rfkill->name = "dell-wwan"; 248 - wwan_rfkill->toggle_radio = dell_wwan_set; 249 - wwan_rfkill->get_state = dell_wwan_get; 281 + } 250 282 ret = rfkill_register(wwan_rfkill); 251 283 if (ret) 252 284 goto err_wwan; ··· 255 285 256 286 return 0; 257 287 err_wwan: 258 - if (wwan_rfkill) 259 - rfkill_free(wwan_rfkill); 260 - if (bluetooth_rfkill) { 261 - rfkill_unregister(bluetooth_rfkill); 262 - bluetooth_rfkill = NULL; 263 - } 264 - err_bluetooth: 288 + rfkill_destroy(wwan_rfkill); 265 289 if (bluetooth_rfkill) 266 - rfkill_free(bluetooth_rfkill); 267 - if (wifi_rfkill) { 268 - rfkill_unregister(wifi_rfkill); 269 - wifi_rfkill = NULL; 270 - } 271 - err_wifi: 290 + rfkill_unregister(bluetooth_rfkill); 291 + err_bluetooth: 292 + rfkill_destroy(bluetooth_rfkill); 272 293 if (wifi_rfkill) 273 - rfkill_free(wifi_rfkill); 294 + rfkill_unregister(wifi_rfkill); 295 + err_wifi: 296 + rfkill_destroy(wifi_rfkill); 274 297 275 298 return ret; 276 299 }
+29 -70
drivers/platform/x86/eeepc-laptop.c
··· 299 299 * Rfkill helpers 300 300 */ 301 301 302 - static int eeepc_wlan_rfkill_set(void *data, enum rfkill_state state) 303 - { 304 - if (state == RFKILL_STATE_SOFT_BLOCKED) 305 - return set_acpi(CM_ASL_WLAN, 0); 306 - else 307 - return set_acpi(CM_ASL_WLAN, 1); 308 - } 309 - 310 - static int eeepc_wlan_rfkill_state(void *data, enum rfkill_state *state) 302 + static bool eeepc_wlan_rfkill_blocked(void) 311 303 { 312 304 if (get_acpi(CM_ASL_WLAN) == 1) 313 - *state = RFKILL_STATE_UNBLOCKED; 314 - else 315 - *state = RFKILL_STATE_SOFT_BLOCKED; 316 - return 0; 305 + return false; 306 + return true; 317 307 } 318 308 319 - static int eeepc_bluetooth_rfkill_set(void *data, enum rfkill_state state) 309 + static int eeepc_rfkill_set(void *data, bool blocked) 320 310 { 321 - if (state == RFKILL_STATE_SOFT_BLOCKED) 322 - return set_acpi(CM_ASL_BLUETOOTH, 0); 323 - else 324 - return set_acpi(CM_ASL_BLUETOOTH, 1); 311 + unsigned long asl = (unsigned long)data; 312 + return set_acpi(asl, !blocked); 325 313 } 326 314 327 - static int eeepc_bluetooth_rfkill_state(void *data, enum rfkill_state *state) 328 - { 329 - if (get_acpi(CM_ASL_BLUETOOTH) == 1) 330 - *state = RFKILL_STATE_UNBLOCKED; 331 - else 332 - *state = RFKILL_STATE_SOFT_BLOCKED; 333 - return 0; 334 - } 315 + static const struct rfkill_ops eeepc_rfkill_ops = { 316 + .set_block = eeepc_rfkill_set, 317 + }; 335 318 336 319 /* 337 320 * Sys helpers ··· 514 531 515 532 static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data) 516 533 { 517 - enum rfkill_state state; 518 534 struct pci_dev *dev; 519 535 struct pci_bus *bus = pci_find_bus(0, 1); 536 + bool blocked; 520 537 521 538 if (event != ACPI_NOTIFY_BUS_CHECK) 522 539 return; ··· 526 543 return; 527 544 } 528 545 529 - eeepc_wlan_rfkill_state(ehotk->eeepc_wlan_rfkill, &state); 530 - 531 - if (state == RFKILL_STATE_UNBLOCKED) { 546 + blocked = eeepc_wlan_rfkill_blocked(); 547 + if (!blocked) { 532 548 dev = pci_get_slot(bus, 0); 533 549 if (dev) { 534 550 /* Device already present */ ··· 548 566 } 549 567 } 550 568 551 - rfkill_force_state(ehotk->eeepc_wlan_rfkill, state); 569 + rfkill_set_sw_state(ehotk->eeepc_wlan_rfkill, blocked); 552 570 } 553 571 554 572 static void eeepc_hotk_notify(acpi_handle handle, u32 event, void *data) ··· 666 684 eeepc_register_rfkill_notifier("\\_SB.PCI0.P0P7"); 667 685 668 686 if (get_acpi(CM_ASL_WLAN) != -1) { 669 - ehotk->eeepc_wlan_rfkill = rfkill_allocate(&device->dev, 670 - RFKILL_TYPE_WLAN); 687 + ehotk->eeepc_wlan_rfkill = rfkill_alloc("eeepc-wlan", 688 + &device->dev, 689 + RFKILL_TYPE_WLAN, 690 + &eeepc_rfkill_ops, 691 + (void *)CM_ASL_WLAN); 671 692 672 693 if (!ehotk->eeepc_wlan_rfkill) 673 694 goto wlan_fail; 674 695 675 - ehotk->eeepc_wlan_rfkill->name = "eeepc-wlan"; 676 - ehotk->eeepc_wlan_rfkill->toggle_radio = eeepc_wlan_rfkill_set; 677 - ehotk->eeepc_wlan_rfkill->get_state = eeepc_wlan_rfkill_state; 678 - if (get_acpi(CM_ASL_WLAN) == 1) { 679 - ehotk->eeepc_wlan_rfkill->state = 680 - RFKILL_STATE_UNBLOCKED; 681 - rfkill_set_default(RFKILL_TYPE_WLAN, 682 - RFKILL_STATE_UNBLOCKED); 683 - } else { 684 - ehotk->eeepc_wlan_rfkill->state = 685 - RFKILL_STATE_SOFT_BLOCKED; 686 - rfkill_set_default(RFKILL_TYPE_WLAN, 687 - RFKILL_STATE_SOFT_BLOCKED); 688 - } 696 + rfkill_set_global_sw_state(RFKILL_TYPE_WLAN, 697 + get_acpi(CM_ASL_WLAN) != 1); 689 698 result = rfkill_register(ehotk->eeepc_wlan_rfkill); 690 699 if (result) 691 700 goto wlan_fail; ··· 684 711 685 712 if (get_acpi(CM_ASL_BLUETOOTH) != -1) { 686 713 ehotk->eeepc_bluetooth_rfkill = 687 - rfkill_allocate(&device->dev, RFKILL_TYPE_BLUETOOTH); 714 + rfkill_alloc("eeepc-bluetooth", 715 + &device->dev, 716 + RFKILL_TYPE_BLUETOOTH, 717 + &eeepc_rfkill_ops, 718 + (void *)CM_ASL_BLUETOOTH); 688 719 689 720 if (!ehotk->eeepc_bluetooth_rfkill) 690 721 goto bluetooth_fail; 691 722 692 - ehotk->eeepc_bluetooth_rfkill->name = "eeepc-bluetooth"; 693 - ehotk->eeepc_bluetooth_rfkill->toggle_radio = 694 - eeepc_bluetooth_rfkill_set; 695 - ehotk->eeepc_bluetooth_rfkill->get_state = 696 - eeepc_bluetooth_rfkill_state; 697 - if (get_acpi(CM_ASL_BLUETOOTH) == 1) { 698 - ehotk->eeepc_bluetooth_rfkill->state = 699 - RFKILL_STATE_UNBLOCKED; 700 - rfkill_set_default(RFKILL_TYPE_BLUETOOTH, 701 - RFKILL_STATE_UNBLOCKED); 702 - } else { 703 - ehotk->eeepc_bluetooth_rfkill->state = 704 - RFKILL_STATE_SOFT_BLOCKED; 705 - rfkill_set_default(RFKILL_TYPE_BLUETOOTH, 706 - RFKILL_STATE_SOFT_BLOCKED); 707 - } 708 - 723 + rfkill_set_global_sw_state(RFKILL_TYPE_BLUETOOTH, 724 + get_acpi(CM_ASL_BLUETOOTH) != 1); 709 725 result = rfkill_register(ehotk->eeepc_bluetooth_rfkill); 710 726 if (result) 711 727 goto bluetooth_fail; ··· 703 741 return 0; 704 742 705 743 bluetooth_fail: 706 - if (ehotk->eeepc_bluetooth_rfkill) 707 - rfkill_free(ehotk->eeepc_bluetooth_rfkill); 744 + rfkill_destroy(ehotk->eeepc_bluetooth_rfkill); 708 745 rfkill_unregister(ehotk->eeepc_wlan_rfkill); 709 - ehotk->eeepc_wlan_rfkill = NULL; 710 746 wlan_fail: 711 - if (ehotk->eeepc_wlan_rfkill) 712 - rfkill_free(ehotk->eeepc_wlan_rfkill); 747 + rfkill_destroy(ehotk->eeepc_wlan_rfkill); 713 748 eeepc_unregister_rfkill_notifier("\\_SB.PCI0.P0P6"); 714 749 eeepc_unregister_rfkill_notifier("\\_SB.PCI0.P0P7"); 715 750 ehotk_fail:
+53 -52
drivers/platform/x86/hp-wmi.c
··· 154 154 return hp_wmi_perform_query(HPWMI_DOCK_QUERY, 0, 0); 155 155 } 156 156 157 - static int hp_wmi_wifi_set(void *data, enum rfkill_state state) 157 + static int hp_wmi_set_block(void *data, bool blocked) 158 158 { 159 - if (state) 160 - return hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 1, 0x101); 161 - else 162 - return hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 1, 0x100); 159 + unsigned long b = (unsigned long) data; 160 + int query = BIT(b + 8) | ((!!blocked) << b); 161 + 162 + return hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 1, query); 163 163 } 164 164 165 - static int hp_wmi_bluetooth_set(void *data, enum rfkill_state state) 166 - { 167 - if (state) 168 - return hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 1, 0x202); 169 - else 170 - return hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 1, 0x200); 171 - } 165 + static const struct rfkill_ops hp_wmi_rfkill_ops = { 166 + .set_block = hp_wmi_set_block, 167 + }; 172 168 173 - static int hp_wmi_wwan_set(void *data, enum rfkill_state state) 174 - { 175 - if (state) 176 - return hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 1, 0x404); 177 - else 178 - return hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 1, 0x400); 179 - } 180 - 181 - static int hp_wmi_wifi_state(void) 169 + static bool hp_wmi_wifi_state(void) 182 170 { 183 171 int wireless = hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 0, 0); 184 172 185 173 if (wireless & 0x100) 186 - return RFKILL_STATE_UNBLOCKED; 174 + return false; 187 175 else 188 - return RFKILL_STATE_SOFT_BLOCKED; 176 + return true; 189 177 } 190 178 191 - static int hp_wmi_bluetooth_state(void) 179 + static bool hp_wmi_bluetooth_state(void) 192 180 { 193 181 int wireless = hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 0, 0); 194 182 195 183 if (wireless & 0x10000) 196 - return RFKILL_STATE_UNBLOCKED; 184 + return false; 197 185 else 198 - return RFKILL_STATE_SOFT_BLOCKED; 186 + return true; 199 187 } 200 188 201 - static int hp_wmi_wwan_state(void) 189 + static bool hp_wmi_wwan_state(void) 202 190 { 203 191 int wireless = hp_wmi_perform_query(HPWMI_WIRELESS_QUERY, 0, 0); 204 192 205 193 if (wireless & 0x1000000) 206 - return RFKILL_STATE_UNBLOCKED; 194 + return false; 207 195 else 208 - return RFKILL_STATE_SOFT_BLOCKED; 196 + return true; 209 197 } 210 198 211 199 static ssize_t show_display(struct device *dev, struct device_attribute *attr, ··· 335 347 } 336 348 } else if (eventcode == 0x5) { 337 349 if (wifi_rfkill) 338 - rfkill_force_state(wifi_rfkill, 339 - hp_wmi_wifi_state()); 350 + rfkill_set_sw_state(wifi_rfkill, 351 + hp_wmi_wifi_state()); 340 352 if (bluetooth_rfkill) 341 - rfkill_force_state(bluetooth_rfkill, 342 - hp_wmi_bluetooth_state()); 353 + rfkill_set_sw_state(bluetooth_rfkill, 354 + hp_wmi_bluetooth_state()); 343 355 if (wwan_rfkill) 344 - rfkill_force_state(wwan_rfkill, 345 - hp_wmi_wwan_state()); 356 + rfkill_set_sw_state(wwan_rfkill, 357 + hp_wmi_wwan_state()); 346 358 } else 347 359 printk(KERN_INFO "HP WMI: Unknown key pressed - %x\n", 348 360 eventcode); ··· 418 430 goto add_sysfs_error; 419 431 420 432 if (wireless & 0x1) { 421 - wifi_rfkill = rfkill_allocate(&device->dev, RFKILL_TYPE_WLAN); 422 - wifi_rfkill->name = "hp-wifi"; 423 - wifi_rfkill->state = hp_wmi_wifi_state(); 424 - wifi_rfkill->toggle_radio = hp_wmi_wifi_set; 433 + wifi_rfkill = rfkill_alloc("hp-wifi", &device->dev, 434 + RFKILL_TYPE_WLAN, 435 + &hp_wmi_rfkill_ops, 436 + (void *) 0); 437 + rfkill_set_sw_state(wifi_rfkill, hp_wmi_wifi_state()); 425 438 err = rfkill_register(wifi_rfkill); 426 439 if (err) 427 - goto add_sysfs_error; 440 + goto register_wifi_error; 428 441 } 429 442 430 443 if (wireless & 0x2) { 431 - bluetooth_rfkill = rfkill_allocate(&device->dev, 432 - RFKILL_TYPE_BLUETOOTH); 433 - bluetooth_rfkill->name = "hp-bluetooth"; 434 - bluetooth_rfkill->state = hp_wmi_bluetooth_state(); 435 - bluetooth_rfkill->toggle_radio = hp_wmi_bluetooth_set; 444 + bluetooth_rfkill = rfkill_alloc("hp-bluetooth", &device->dev, 445 + RFKILL_TYPE_BLUETOOTH, 446 + &hp_wmi_rfkill_ops, 447 + (void *) 1); 448 + rfkill_set_sw_state(bluetooth_rfkill, 449 + hp_wmi_bluetooth_state()); 436 450 err = rfkill_register(bluetooth_rfkill); 437 451 if (err) 438 452 goto register_bluetooth_error; 439 453 } 440 454 441 455 if (wireless & 0x4) { 442 - wwan_rfkill = rfkill_allocate(&device->dev, RFKILL_TYPE_WWAN); 443 - wwan_rfkill->name = "hp-wwan"; 444 - wwan_rfkill->state = hp_wmi_wwan_state(); 445 - wwan_rfkill->toggle_radio = hp_wmi_wwan_set; 456 + wwan_rfkill = rfkill_alloc("hp-wwan", &device->dev, 457 + RFKILL_TYPE_WWAN, 458 + &hp_wmi_rfkill_ops, 459 + (void *) 2); 460 + rfkill_set_sw_state(wwan_rfkill, hp_wmi_wwan_state()); 446 461 err = rfkill_register(wwan_rfkill); 447 462 if (err) 448 463 goto register_wwan_err; ··· 453 462 454 463 return 0; 455 464 register_wwan_err: 465 + rfkill_destroy(wwan_rfkill); 456 466 if (bluetooth_rfkill) 457 467 rfkill_unregister(bluetooth_rfkill); 458 468 register_bluetooth_error: 469 + rfkill_destroy(bluetooth_rfkill); 459 470 if (wifi_rfkill) 460 471 rfkill_unregister(wifi_rfkill); 472 + register_wifi_error: 473 + rfkill_destroy(wifi_rfkill); 461 474 add_sysfs_error: 462 475 cleanup_sysfs(device); 463 476 return err; ··· 471 476 { 472 477 cleanup_sysfs(device); 473 478 474 - if (wifi_rfkill) 479 + if (wifi_rfkill) { 475 480 rfkill_unregister(wifi_rfkill); 476 - if (bluetooth_rfkill) 481 + rfkill_destroy(wifi_rfkill); 482 + } 483 + if (bluetooth_rfkill) { 477 484 rfkill_unregister(bluetooth_rfkill); 478 - if (wwan_rfkill) 485 + rfkill_destroy(wifi_rfkill); 486 + } 487 + if (wwan_rfkill) { 479 488 rfkill_unregister(wwan_rfkill); 489 + rfkill_destroy(wwan_rfkill); 490 + } 480 491 481 492 return 0; 482 493 }
+72 -121
drivers/platform/x86/sony-laptop.c
··· 128 128 SONY_BLUETOOTH, 129 129 SONY_WWAN, 130 130 SONY_WIMAX, 131 - SONY_RFKILL_MAX, 131 + N_SONY_RFKILL, 132 132 }; 133 133 134 - static struct rfkill *sony_rfkill_devices[SONY_RFKILL_MAX]; 135 - static int sony_rfkill_address[SONY_RFKILL_MAX] = {0x300, 0x500, 0x700, 0x900}; 134 + static struct rfkill *sony_rfkill_devices[N_SONY_RFKILL]; 135 + static int sony_rfkill_address[N_SONY_RFKILL] = {0x300, 0x500, 0x700, 0x900}; 136 136 static void sony_nc_rfkill_update(void); 137 137 138 138 /*********** Input Devices ***********/ ··· 1051 1051 { 1052 1052 int i; 1053 1053 1054 - for (i = 0; i < SONY_RFKILL_MAX; i++) { 1055 - if (sony_rfkill_devices[i]) 1054 + for (i = 0; i < N_SONY_RFKILL; i++) { 1055 + if (sony_rfkill_devices[i]) { 1056 1056 rfkill_unregister(sony_rfkill_devices[i]); 1057 + rfkill_destroy(sony_rfkill_devices[i]); 1058 + } 1057 1059 } 1058 1060 } 1059 1061 1060 - static int sony_nc_rfkill_get(void *data, enum rfkill_state *state) 1061 - { 1062 - int result; 1063 - int argument = sony_rfkill_address[(long) data]; 1064 - 1065 - sony_call_snc_handle(0x124, 0x200, &result); 1066 - if (result & 0x1) { 1067 - sony_call_snc_handle(0x124, argument, &result); 1068 - if (result & 0xf) 1069 - *state = RFKILL_STATE_UNBLOCKED; 1070 - else 1071 - *state = RFKILL_STATE_SOFT_BLOCKED; 1072 - } else { 1073 - *state = RFKILL_STATE_HARD_BLOCKED; 1074 - } 1075 - 1076 - return 0; 1077 - } 1078 - 1079 - static int sony_nc_rfkill_set(void *data, enum rfkill_state state) 1062 + static int sony_nc_rfkill_set(void *data, bool blocked) 1080 1063 { 1081 1064 int result; 1082 1065 int argument = sony_rfkill_address[(long) data] + 0x100; 1083 1066 1084 - if (state == RFKILL_STATE_UNBLOCKED) 1067 + if (!blocked) 1085 1068 argument |= 0xff0000; 1086 1069 1087 1070 return sony_call_snc_handle(0x124, argument, &result); 1088 1071 } 1089 1072 1090 - static int sony_nc_setup_wifi_rfkill(struct acpi_device *device) 1073 + static const struct rfkill_ops sony_rfkill_ops = { 1074 + .set_block = sony_nc_rfkill_set, 1075 + }; 1076 + 1077 + static int sony_nc_setup_rfkill(struct acpi_device *device, 1078 + enum sony_nc_rfkill nc_type) 1091 1079 { 1092 1080 int err = 0; 1093 - struct rfkill *sony_wifi_rfkill; 1081 + struct rfkill *rfk; 1082 + enum rfkill_type type; 1083 + const char *name; 1094 1084 1095 - sony_wifi_rfkill = rfkill_allocate(&device->dev, RFKILL_TYPE_WLAN); 1096 - if (!sony_wifi_rfkill) 1097 - return -1; 1098 - sony_wifi_rfkill->name = "sony-wifi"; 1099 - sony_wifi_rfkill->toggle_radio = sony_nc_rfkill_set; 1100 - sony_wifi_rfkill->get_state = sony_nc_rfkill_get; 1101 - sony_wifi_rfkill->data = (void *)SONY_WIFI; 1102 - err = rfkill_register(sony_wifi_rfkill); 1103 - if (err) 1104 - rfkill_free(sony_wifi_rfkill); 1105 - else { 1106 - sony_rfkill_devices[SONY_WIFI] = sony_wifi_rfkill; 1107 - sony_nc_rfkill_set(sony_wifi_rfkill->data, 1108 - RFKILL_STATE_UNBLOCKED); 1085 + switch (nc_type) { 1086 + case SONY_WIFI: 1087 + type = RFKILL_TYPE_WLAN; 1088 + name = "sony-wifi"; 1089 + break; 1090 + case SONY_BLUETOOTH: 1091 + type = RFKILL_TYPE_BLUETOOTH; 1092 + name = "sony-bluetooth"; 1093 + break; 1094 + case SONY_WWAN: 1095 + type = RFKILL_TYPE_WWAN; 1096 + name = "sony-wwan"; 1097 + break; 1098 + case SONY_WIMAX: 1099 + type = RFKILL_TYPE_WIMAX; 1100 + name = "sony-wimax"; 1101 + break; 1102 + default: 1103 + return -EINVAL; 1109 1104 } 1110 - return err; 1111 - } 1112 1105 1113 - static int sony_nc_setup_bluetooth_rfkill(struct acpi_device *device) 1114 - { 1115 - int err = 0; 1116 - struct rfkill *sony_bluetooth_rfkill; 1106 + rfk = rfkill_alloc(name, &device->dev, type, 1107 + &sony_rfkill_ops, (void *)nc_type); 1108 + if (!rfk) 1109 + return -ENOMEM; 1117 1110 1118 - sony_bluetooth_rfkill = rfkill_allocate(&device->dev, 1119 - RFKILL_TYPE_BLUETOOTH); 1120 - if (!sony_bluetooth_rfkill) 1121 - return -1; 1122 - sony_bluetooth_rfkill->name = "sony-bluetooth"; 1123 - sony_bluetooth_rfkill->toggle_radio = sony_nc_rfkill_set; 1124 - sony_bluetooth_rfkill->get_state = sony_nc_rfkill_get; 1125 - sony_bluetooth_rfkill->data = (void *)SONY_BLUETOOTH; 1126 - err = rfkill_register(sony_bluetooth_rfkill); 1127 - if (err) 1128 - rfkill_free(sony_bluetooth_rfkill); 1129 - else { 1130 - sony_rfkill_devices[SONY_BLUETOOTH] = sony_bluetooth_rfkill; 1131 - sony_nc_rfkill_set(sony_bluetooth_rfkill->data, 1132 - RFKILL_STATE_UNBLOCKED); 1111 + err = rfkill_register(rfk); 1112 + if (err) { 1113 + rfkill_destroy(rfk); 1114 + return err; 1133 1115 } 1134 - return err; 1135 - } 1136 - 1137 - static int sony_nc_setup_wwan_rfkill(struct acpi_device *device) 1138 - { 1139 - int err = 0; 1140 - struct rfkill *sony_wwan_rfkill; 1141 - 1142 - sony_wwan_rfkill = rfkill_allocate(&device->dev, RFKILL_TYPE_WWAN); 1143 - if (!sony_wwan_rfkill) 1144 - return -1; 1145 - sony_wwan_rfkill->name = "sony-wwan"; 1146 - sony_wwan_rfkill->toggle_radio = sony_nc_rfkill_set; 1147 - sony_wwan_rfkill->get_state = sony_nc_rfkill_get; 1148 - sony_wwan_rfkill->data = (void *)SONY_WWAN; 1149 - err = rfkill_register(sony_wwan_rfkill); 1150 - if (err) 1151 - rfkill_free(sony_wwan_rfkill); 1152 - else { 1153 - sony_rfkill_devices[SONY_WWAN] = sony_wwan_rfkill; 1154 - sony_nc_rfkill_set(sony_wwan_rfkill->data, 1155 - RFKILL_STATE_UNBLOCKED); 1156 - } 1157 - return err; 1158 - } 1159 - 1160 - static int sony_nc_setup_wimax_rfkill(struct acpi_device *device) 1161 - { 1162 - int err = 0; 1163 - struct rfkill *sony_wimax_rfkill; 1164 - 1165 - sony_wimax_rfkill = rfkill_allocate(&device->dev, RFKILL_TYPE_WIMAX); 1166 - if (!sony_wimax_rfkill) 1167 - return -1; 1168 - sony_wimax_rfkill->name = "sony-wimax"; 1169 - sony_wimax_rfkill->toggle_radio = sony_nc_rfkill_set; 1170 - sony_wimax_rfkill->get_state = sony_nc_rfkill_get; 1171 - sony_wimax_rfkill->data = (void *)SONY_WIMAX; 1172 - err = rfkill_register(sony_wimax_rfkill); 1173 - if (err) 1174 - rfkill_free(sony_wimax_rfkill); 1175 - else { 1176 - sony_rfkill_devices[SONY_WIMAX] = sony_wimax_rfkill; 1177 - sony_nc_rfkill_set(sony_wimax_rfkill->data, 1178 - RFKILL_STATE_UNBLOCKED); 1179 - } 1116 + sony_rfkill_devices[nc_type] = rfk; 1117 + sony_nc_rfkill_set((void *)nc_type, false); 1180 1118 return err; 1181 1119 } 1182 1120 1183 1121 static void sony_nc_rfkill_update() 1184 1122 { 1185 - int i; 1186 - enum rfkill_state state; 1123 + enum sony_nc_rfkill i; 1124 + int result; 1125 + bool hwblock; 1187 1126 1188 - for (i = 0; i < SONY_RFKILL_MAX; i++) { 1189 - if (sony_rfkill_devices[i]) { 1190 - sony_rfkill_devices[i]-> 1191 - get_state(sony_rfkill_devices[i]->data, 1192 - &state); 1193 - rfkill_force_state(sony_rfkill_devices[i], state); 1127 + sony_call_snc_handle(0x124, 0x200, &result); 1128 + hwblock = !(result & 0x1); 1129 + 1130 + for (i = 0; i < N_SONY_RFKILL; i++) { 1131 + int argument = sony_rfkill_address[i]; 1132 + 1133 + if (!sony_rfkill_devices[i]) 1134 + continue; 1135 + 1136 + if (hwblock) { 1137 + if (rfkill_set_hw_state(sony_rfkill_devices[i], true)) 1138 + sony_nc_rfkill_set(sony_rfkill_devices[i], 1139 + true); 1140 + continue; 1194 1141 } 1142 + 1143 + sony_call_snc_handle(0x124, argument, &result); 1144 + rfkill_set_states(sony_rfkill_devices[i], 1145 + !(result & 0xf), false); 1195 1146 } 1196 1147 } 1197 1148 ··· 1161 1210 } 1162 1211 1163 1212 if (result & 0x1) 1164 - sony_nc_setup_wifi_rfkill(device); 1213 + sony_nc_setup_rfkill(device, SONY_WIFI); 1165 1214 if (result & 0x2) 1166 - sony_nc_setup_bluetooth_rfkill(device); 1215 + sony_nc_setup_rfkill(device, SONY_BLUETOOTH); 1167 1216 if (result & 0x1c) 1168 - sony_nc_setup_wwan_rfkill(device); 1217 + sony_nc_setup_rfkill(device, SONY_WWAN); 1169 1218 if (result & 0x20) 1170 - sony_nc_setup_wimax_rfkill(device); 1219 + sony_nc_setup_rfkill(device, SONY_WIMAX); 1171 1220 1172 1221 return 0; 1173 1222 }
+469 -438
drivers/platform/x86/thinkpad_acpi.c
··· 166 166 167 167 #define TPACPI_MAX_ACPI_ARGS 3 168 168 169 - /* rfkill switches */ 170 - enum { 171 - TPACPI_RFK_BLUETOOTH_SW_ID = 0, 172 - TPACPI_RFK_WWAN_SW_ID, 173 - TPACPI_RFK_UWB_SW_ID, 174 - }; 175 - 176 169 /* printk headers */ 177 170 #define TPACPI_LOG TPACPI_FILE ": " 178 171 #define TPACPI_EMERG KERN_EMERG TPACPI_LOG ··· 998 1005 return 0; 999 1006 } 1000 1007 1001 - static int __init tpacpi_new_rfkill(const unsigned int id, 1002 - struct rfkill **rfk, 1003 - const enum rfkill_type rfktype, 1004 - const char *name, 1005 - const bool set_default, 1006 - int (*toggle_radio)(void *, enum rfkill_state), 1007 - int (*get_state)(void *, enum rfkill_state *)) 1008 - { 1009 - int res; 1010 - enum rfkill_state initial_state = RFKILL_STATE_SOFT_BLOCKED; 1011 - 1012 - res = get_state(NULL, &initial_state); 1013 - if (res < 0) { 1014 - printk(TPACPI_ERR 1015 - "failed to read initial state for %s, error %d; " 1016 - "will turn radio off\n", name, res); 1017 - } else if (set_default) { 1018 - /* try to set the initial state as the default for the rfkill 1019 - * type, since we ask the firmware to preserve it across S5 in 1020 - * NVRAM */ 1021 - if (rfkill_set_default(rfktype, 1022 - (initial_state == RFKILL_STATE_UNBLOCKED) ? 1023 - RFKILL_STATE_UNBLOCKED : 1024 - RFKILL_STATE_SOFT_BLOCKED) == -EPERM) 1025 - vdbg_printk(TPACPI_DBG_RFKILL, 1026 - "Default state for %s cannot be changed\n", 1027 - name); 1028 - } 1029 - 1030 - *rfk = rfkill_allocate(&tpacpi_pdev->dev, rfktype); 1031 - if (!*rfk) { 1032 - printk(TPACPI_ERR 1033 - "failed to allocate memory for rfkill class\n"); 1034 - return -ENOMEM; 1035 - } 1036 - 1037 - (*rfk)->name = name; 1038 - (*rfk)->get_state = get_state; 1039 - (*rfk)->toggle_radio = toggle_radio; 1040 - (*rfk)->state = initial_state; 1041 - 1042 - res = rfkill_register(*rfk); 1043 - if (res < 0) { 1044 - printk(TPACPI_ERR 1045 - "failed to register %s rfkill switch: %d\n", 1046 - name, res); 1047 - rfkill_free(*rfk); 1048 - *rfk = NULL; 1049 - return res; 1050 - } 1051 - 1052 - return 0; 1053 - } 1054 - 1055 1008 static void printk_deprecated_attribute(const char * const what, 1056 1009 const char * const details) 1057 1010 { ··· 1007 1068 what, details); 1008 1069 } 1009 1070 1071 + /************************************************************************* 1072 + * rfkill and radio control support helpers 1073 + */ 1074 + 1075 + /* 1076 + * ThinkPad-ACPI firmware handling model: 1077 + * 1078 + * WLSW (master wireless switch) is event-driven, and is common to all 1079 + * firmware-controlled radios. It cannot be controlled, just monitored, 1080 + * as expected. It overrides all radio state in firmware 1081 + * 1082 + * The kernel, a masked-off hotkey, and WLSW can change the radio state 1083 + * (TODO: verify how WLSW interacts with the returned radio state). 1084 + * 1085 + * The only time there are shadow radio state changes, is when 1086 + * masked-off hotkeys are used. 1087 + */ 1088 + 1089 + /* 1090 + * Internal driver API for radio state: 1091 + * 1092 + * int: < 0 = error, otherwise enum tpacpi_rfkill_state 1093 + * bool: true means radio blocked (off) 1094 + */ 1095 + enum tpacpi_rfkill_state { 1096 + TPACPI_RFK_RADIO_OFF = 0, 1097 + TPACPI_RFK_RADIO_ON 1098 + }; 1099 + 1100 + /* rfkill switches */ 1101 + enum tpacpi_rfk_id { 1102 + TPACPI_RFK_BLUETOOTH_SW_ID = 0, 1103 + TPACPI_RFK_WWAN_SW_ID, 1104 + TPACPI_RFK_UWB_SW_ID, 1105 + TPACPI_RFK_SW_MAX 1106 + }; 1107 + 1108 + static const char *tpacpi_rfkill_names[] = { 1109 + [TPACPI_RFK_BLUETOOTH_SW_ID] = "bluetooth", 1110 + [TPACPI_RFK_WWAN_SW_ID] = "wwan", 1111 + [TPACPI_RFK_UWB_SW_ID] = "uwb", 1112 + [TPACPI_RFK_SW_MAX] = NULL 1113 + }; 1114 + 1115 + /* ThinkPad-ACPI rfkill subdriver */ 1116 + struct tpacpi_rfk { 1117 + struct rfkill *rfkill; 1118 + enum tpacpi_rfk_id id; 1119 + const struct tpacpi_rfk_ops *ops; 1120 + }; 1121 + 1122 + struct tpacpi_rfk_ops { 1123 + /* firmware interface */ 1124 + int (*get_status)(void); 1125 + int (*set_status)(const enum tpacpi_rfkill_state); 1126 + }; 1127 + 1128 + static struct tpacpi_rfk *tpacpi_rfkill_switches[TPACPI_RFK_SW_MAX]; 1129 + 1130 + /* Query FW and update rfkill sw state for a given rfkill switch */ 1131 + static int tpacpi_rfk_update_swstate(const struct tpacpi_rfk *tp_rfk) 1132 + { 1133 + int status; 1134 + 1135 + if (!tp_rfk) 1136 + return -ENODEV; 1137 + 1138 + status = (tp_rfk->ops->get_status)(); 1139 + if (status < 0) 1140 + return status; 1141 + 1142 + rfkill_set_sw_state(tp_rfk->rfkill, 1143 + (status == TPACPI_RFK_RADIO_OFF)); 1144 + 1145 + return status; 1146 + } 1147 + 1148 + /* Query FW and update rfkill sw state for all rfkill switches */ 1149 + static void tpacpi_rfk_update_swstate_all(void) 1150 + { 1151 + unsigned int i; 1152 + 1153 + for (i = 0; i < TPACPI_RFK_SW_MAX; i++) 1154 + tpacpi_rfk_update_swstate(tpacpi_rfkill_switches[i]); 1155 + } 1156 + 1157 + /* 1158 + * Sync the HW-blocking state of all rfkill switches, 1159 + * do notice it causes the rfkill core to schedule uevents 1160 + */ 1161 + static void tpacpi_rfk_update_hwblock_state(bool blocked) 1162 + { 1163 + unsigned int i; 1164 + struct tpacpi_rfk *tp_rfk; 1165 + 1166 + for (i = 0; i < TPACPI_RFK_SW_MAX; i++) { 1167 + tp_rfk = tpacpi_rfkill_switches[i]; 1168 + if (tp_rfk) { 1169 + if (rfkill_set_hw_state(tp_rfk->rfkill, 1170 + blocked)) { 1171 + /* ignore -- we track sw block */ 1172 + } 1173 + } 1174 + } 1175 + } 1176 + 1177 + /* Call to get the WLSW state from the firmware */ 1178 + static int hotkey_get_wlsw(void); 1179 + 1180 + /* Call to query WLSW state and update all rfkill switches */ 1181 + static bool tpacpi_rfk_check_hwblock_state(void) 1182 + { 1183 + int res = hotkey_get_wlsw(); 1184 + int hw_blocked; 1185 + 1186 + /* When unknown or unsupported, we have to assume it is unblocked */ 1187 + if (res < 0) 1188 + return false; 1189 + 1190 + hw_blocked = (res == TPACPI_RFK_RADIO_OFF); 1191 + tpacpi_rfk_update_hwblock_state(hw_blocked); 1192 + 1193 + return hw_blocked; 1194 + } 1195 + 1196 + static int tpacpi_rfk_hook_set_block(void *data, bool blocked) 1197 + { 1198 + struct tpacpi_rfk *tp_rfk = data; 1199 + int res; 1200 + 1201 + dbg_printk(TPACPI_DBG_RFKILL, 1202 + "request to change radio state to %s\n", 1203 + blocked ? "blocked" : "unblocked"); 1204 + 1205 + /* try to set radio state */ 1206 + res = (tp_rfk->ops->set_status)(blocked ? 1207 + TPACPI_RFK_RADIO_OFF : TPACPI_RFK_RADIO_ON); 1208 + 1209 + /* and update the rfkill core with whatever the FW really did */ 1210 + tpacpi_rfk_update_swstate(tp_rfk); 1211 + 1212 + return (res < 0) ? res : 0; 1213 + } 1214 + 1215 + static const struct rfkill_ops tpacpi_rfk_rfkill_ops = { 1216 + .set_block = tpacpi_rfk_hook_set_block, 1217 + }; 1218 + 1219 + static int __init tpacpi_new_rfkill(const enum tpacpi_rfk_id id, 1220 + const struct tpacpi_rfk_ops *tp_rfkops, 1221 + const enum rfkill_type rfktype, 1222 + const char *name, 1223 + const bool set_default) 1224 + { 1225 + struct tpacpi_rfk *atp_rfk; 1226 + int res; 1227 + bool initial_sw_state = false; 1228 + int initial_sw_status; 1229 + 1230 + BUG_ON(id >= TPACPI_RFK_SW_MAX || tpacpi_rfkill_switches[id]); 1231 + 1232 + initial_sw_status = (tp_rfkops->get_status)(); 1233 + if (initial_sw_status < 0) { 1234 + printk(TPACPI_ERR 1235 + "failed to read initial state for %s, error %d; " 1236 + "will turn radio off\n", name, initial_sw_status); 1237 + } else { 1238 + initial_sw_state = (initial_sw_status == TPACPI_RFK_RADIO_OFF); 1239 + if (set_default) { 1240 + /* try to set the initial state as the default for the 1241 + * rfkill type, since we ask the firmware to preserve 1242 + * it across S5 in NVRAM */ 1243 + rfkill_set_global_sw_state(rfktype, initial_sw_state); 1244 + } 1245 + } 1246 + 1247 + atp_rfk = kzalloc(sizeof(struct tpacpi_rfk), GFP_KERNEL); 1248 + if (atp_rfk) 1249 + atp_rfk->rfkill = rfkill_alloc(name, 1250 + &tpacpi_pdev->dev, 1251 + rfktype, 1252 + &tpacpi_rfk_rfkill_ops, 1253 + atp_rfk); 1254 + if (!atp_rfk || !atp_rfk->rfkill) { 1255 + printk(TPACPI_ERR 1256 + "failed to allocate memory for rfkill class\n"); 1257 + kfree(atp_rfk); 1258 + return -ENOMEM; 1259 + } 1260 + 1261 + atp_rfk->id = id; 1262 + atp_rfk->ops = tp_rfkops; 1263 + 1264 + rfkill_set_states(atp_rfk->rfkill, initial_sw_state, 1265 + tpacpi_rfk_check_hwblock_state()); 1266 + 1267 + res = rfkill_register(atp_rfk->rfkill); 1268 + if (res < 0) { 1269 + printk(TPACPI_ERR 1270 + "failed to register %s rfkill switch: %d\n", 1271 + name, res); 1272 + rfkill_destroy(atp_rfk->rfkill); 1273 + kfree(atp_rfk); 1274 + return res; 1275 + } 1276 + 1277 + tpacpi_rfkill_switches[id] = atp_rfk; 1278 + return 0; 1279 + } 1280 + 1281 + static void tpacpi_destroy_rfkill(const enum tpacpi_rfk_id id) 1282 + { 1283 + struct tpacpi_rfk *tp_rfk; 1284 + 1285 + BUG_ON(id >= TPACPI_RFK_SW_MAX); 1286 + 1287 + tp_rfk = tpacpi_rfkill_switches[id]; 1288 + if (tp_rfk) { 1289 + rfkill_unregister(tp_rfk->rfkill); 1290 + tpacpi_rfkill_switches[id] = NULL; 1291 + kfree(tp_rfk); 1292 + } 1293 + } 1294 + 1010 1295 static void printk_deprecated_rfkill_attribute(const char * const what) 1011 1296 { 1012 1297 printk_deprecated_attribute(what, 1013 1298 "Please switch to generic rfkill before year 2010"); 1299 + } 1300 + 1301 + /* sysfs <radio> enable ------------------------------------------------ */ 1302 + static ssize_t tpacpi_rfk_sysfs_enable_show(const enum tpacpi_rfk_id id, 1303 + struct device_attribute *attr, 1304 + char *buf) 1305 + { 1306 + int status; 1307 + 1308 + printk_deprecated_rfkill_attribute(attr->attr.name); 1309 + 1310 + /* This is in the ABI... */ 1311 + if (tpacpi_rfk_check_hwblock_state()) { 1312 + status = TPACPI_RFK_RADIO_OFF; 1313 + } else { 1314 + status = tpacpi_rfk_update_swstate(tpacpi_rfkill_switches[id]); 1315 + if (status < 0) 1316 + return status; 1317 + } 1318 + 1319 + return snprintf(buf, PAGE_SIZE, "%d\n", 1320 + (status == TPACPI_RFK_RADIO_ON) ? 1 : 0); 1321 + } 1322 + 1323 + static ssize_t tpacpi_rfk_sysfs_enable_store(const enum tpacpi_rfk_id id, 1324 + struct device_attribute *attr, 1325 + const char *buf, size_t count) 1326 + { 1327 + unsigned long t; 1328 + int res; 1329 + 1330 + printk_deprecated_rfkill_attribute(attr->attr.name); 1331 + 1332 + if (parse_strtoul(buf, 1, &t)) 1333 + return -EINVAL; 1334 + 1335 + tpacpi_disclose_usertask(attr->attr.name, "set to %ld\n", t); 1336 + 1337 + /* This is in the ABI... */ 1338 + if (tpacpi_rfk_check_hwblock_state() && !!t) 1339 + return -EPERM; 1340 + 1341 + res = tpacpi_rfkill_switches[id]->ops->set_status((!!t) ? 1342 + TPACPI_RFK_RADIO_ON : TPACPI_RFK_RADIO_OFF); 1343 + tpacpi_rfk_update_swstate(tpacpi_rfkill_switches[id]); 1344 + 1345 + return (res < 0) ? res : count; 1346 + } 1347 + 1348 + /* procfs -------------------------------------------------------------- */ 1349 + static int tpacpi_rfk_procfs_read(const enum tpacpi_rfk_id id, char *p) 1350 + { 1351 + int len = 0; 1352 + 1353 + if (id >= TPACPI_RFK_SW_MAX) 1354 + len += sprintf(p + len, "status:\t\tnot supported\n"); 1355 + else { 1356 + int status; 1357 + 1358 + /* This is in the ABI... */ 1359 + if (tpacpi_rfk_check_hwblock_state()) { 1360 + status = TPACPI_RFK_RADIO_OFF; 1361 + } else { 1362 + status = tpacpi_rfk_update_swstate( 1363 + tpacpi_rfkill_switches[id]); 1364 + if (status < 0) 1365 + return status; 1366 + } 1367 + 1368 + len += sprintf(p + len, "status:\t\t%s\n", 1369 + (status == TPACPI_RFK_RADIO_ON) ? 1370 + "enabled" : "disabled"); 1371 + len += sprintf(p + len, "commands:\tenable, disable\n"); 1372 + } 1373 + 1374 + return len; 1375 + } 1376 + 1377 + static int tpacpi_rfk_procfs_write(const enum tpacpi_rfk_id id, char *buf) 1378 + { 1379 + char *cmd; 1380 + int status = -1; 1381 + int res = 0; 1382 + 1383 + if (id >= TPACPI_RFK_SW_MAX) 1384 + return -ENODEV; 1385 + 1386 + while ((cmd = next_cmd(&buf))) { 1387 + if (strlencmp(cmd, "enable") == 0) 1388 + status = TPACPI_RFK_RADIO_ON; 1389 + else if (strlencmp(cmd, "disable") == 0) 1390 + status = TPACPI_RFK_RADIO_OFF; 1391 + else 1392 + return -EINVAL; 1393 + } 1394 + 1395 + if (status != -1) { 1396 + tpacpi_disclose_usertask("procfs", "attempt to %s %s\n", 1397 + (status == TPACPI_RFK_RADIO_ON) ? 1398 + "enable" : "disable", 1399 + tpacpi_rfkill_names[id]); 1400 + res = (tpacpi_rfkill_switches[id]->ops->set_status)(status); 1401 + tpacpi_rfk_update_swstate(tpacpi_rfkill_switches[id]); 1402 + } 1403 + 1404 + return res; 1014 1405 } 1015 1406 1016 1407 /************************************************************************* ··· 1396 1127 1397 1128 #ifdef CONFIG_THINKPAD_ACPI_DEBUGFACILITIES 1398 1129 1399 - static void tpacpi_send_radiosw_update(void); 1400 - 1401 1130 /* wlsw_emulstate ------------------------------------------------------ */ 1402 1131 static ssize_t tpacpi_driver_wlsw_emulstate_show(struct device_driver *drv, 1403 1132 char *buf) ··· 1411 1144 if (parse_strtoul(buf, 1, &t)) 1412 1145 return -EINVAL; 1413 1146 1414 - if (tpacpi_wlsw_emulstate != t) { 1147 + if (tpacpi_wlsw_emulstate != !!t) { 1415 1148 tpacpi_wlsw_emulstate = !!t; 1416 - tpacpi_send_radiosw_update(); 1417 - } else 1418 - tpacpi_wlsw_emulstate = !!t; 1149 + tpacpi_rfk_update_hwblock_state(!t); /* negative logic */ 1150 + } 1419 1151 1420 1152 return count; 1421 1153 } ··· 1729 1463 /* HKEY.MHKG() return bits */ 1730 1464 #define TP_HOTKEY_TABLET_MASK (1 << 3) 1731 1465 1732 - static int hotkey_get_wlsw(int *status) 1466 + static int hotkey_get_wlsw(void) 1733 1467 { 1468 + int status; 1469 + 1470 + if (!tp_features.hotkey_wlsw) 1471 + return -ENODEV; 1472 + 1734 1473 #ifdef CONFIG_THINKPAD_ACPI_DEBUGFACILITIES 1735 - if (dbg_wlswemul) { 1736 - *status = !!tpacpi_wlsw_emulstate; 1737 - return 0; 1738 - } 1474 + if (dbg_wlswemul) 1475 + return (tpacpi_wlsw_emulstate) ? 1476 + TPACPI_RFK_RADIO_ON : TPACPI_RFK_RADIO_OFF; 1739 1477 #endif 1740 - if (!acpi_evalf(hkey_handle, status, "WLSW", "d")) 1478 + 1479 + if (!acpi_evalf(hkey_handle, &status, "WLSW", "d")) 1741 1480 return -EIO; 1742 - return 0; 1481 + 1482 + return (status) ? TPACPI_RFK_RADIO_ON : TPACPI_RFK_RADIO_OFF; 1743 1483 } 1744 1484 1745 1485 static int hotkey_get_tablet_mode(int *status) ··· 2379 2107 struct device_attribute *attr, 2380 2108 char *buf) 2381 2109 { 2382 - int res, s; 2383 - res = hotkey_get_wlsw(&s); 2110 + int res; 2111 + res = hotkey_get_wlsw(); 2384 2112 if (res < 0) 2385 2113 return res; 2386 2114 2387 - return snprintf(buf, PAGE_SIZE, "%d\n", !!s); 2115 + /* Opportunistic update */ 2116 + tpacpi_rfk_update_hwblock_state((res == TPACPI_RFK_RADIO_OFF)); 2117 + 2118 + return snprintf(buf, PAGE_SIZE, "%d\n", 2119 + (res == TPACPI_RFK_RADIO_OFF) ? 0 : 1); 2388 2120 } 2389 2121 2390 2122 static struct device_attribute dev_attr_hotkey_radio_sw = ··· 2499 2223 &dev_attr_hotkey_wakeup_hotunplug_complete.attr, 2500 2224 }; 2501 2225 2502 - static void bluetooth_update_rfk(void); 2503 - static void wan_update_rfk(void); 2504 - static void uwb_update_rfk(void); 2226 + /* 2227 + * Sync both the hw and sw blocking state of all switches 2228 + */ 2505 2229 static void tpacpi_send_radiosw_update(void) 2506 2230 { 2507 2231 int wlsw; 2508 2232 2509 - /* Sync these BEFORE sending any rfkill events */ 2510 - if (tp_features.bluetooth) 2511 - bluetooth_update_rfk(); 2512 - if (tp_features.wan) 2513 - wan_update_rfk(); 2514 - if (tp_features.uwb) 2515 - uwb_update_rfk(); 2233 + /* 2234 + * We must sync all rfkill controllers *before* issuing any 2235 + * rfkill input events, or we will race the rfkill core input 2236 + * handler. 2237 + * 2238 + * tpacpi_inputdev_send_mutex works as a syncronization point 2239 + * for the above. 2240 + * 2241 + * We optimize to avoid numerous calls to hotkey_get_wlsw. 2242 + */ 2516 2243 2517 - if (tp_features.hotkey_wlsw && !hotkey_get_wlsw(&wlsw)) { 2244 + wlsw = hotkey_get_wlsw(); 2245 + 2246 + /* Sync hw blocking state first if it is hw-blocked */ 2247 + if (wlsw == TPACPI_RFK_RADIO_OFF) 2248 + tpacpi_rfk_update_hwblock_state(true); 2249 + 2250 + /* Sync sw blocking state */ 2251 + tpacpi_rfk_update_swstate_all(); 2252 + 2253 + /* Sync hw blocking state last if it is hw-unblocked */ 2254 + if (wlsw == TPACPI_RFK_RADIO_ON) 2255 + tpacpi_rfk_update_hwblock_state(false); 2256 + 2257 + /* Issue rfkill input event for WLSW switch */ 2258 + if (!(wlsw < 0)) { 2518 2259 mutex_lock(&tpacpi_inputdev_send_mutex); 2519 2260 2520 2261 input_report_switch(tpacpi_inputdev, 2521 - SW_RFKILL_ALL, !!wlsw); 2262 + SW_RFKILL_ALL, (wlsw > 0)); 2522 2263 input_sync(tpacpi_inputdev); 2523 2264 2524 2265 mutex_unlock(&tpacpi_inputdev_send_mutex); 2525 2266 } 2267 + 2268 + /* 2269 + * this can be unconditional, as we will poll state again 2270 + * if userspace uses the notify to read data 2271 + */ 2526 2272 hotkey_radio_sw_notify_change(); 2527 2273 } 2528 2274 ··· 3354 3056 3355 3057 #define TPACPI_RFK_BLUETOOTH_SW_NAME "tpacpi_bluetooth_sw" 3356 3058 3357 - static struct rfkill *tpacpi_bluetooth_rfkill; 3358 - 3359 3059 static void bluetooth_suspend(pm_message_t state) 3360 3060 { 3361 3061 /* Try to make sure radio will resume powered off */ ··· 3363 3067 "bluetooth power down on resume request failed\n"); 3364 3068 } 3365 3069 3366 - static int bluetooth_get_radiosw(void) 3070 + static int bluetooth_get_status(void) 3367 3071 { 3368 3072 int status; 3369 - 3370 - if (!tp_features.bluetooth) 3371 - return -ENODEV; 3372 - 3373 - /* WLSW overrides bluetooth in firmware/hardware, reflect that */ 3374 - if (tp_features.hotkey_wlsw && !hotkey_get_wlsw(&status) && !status) 3375 - return RFKILL_STATE_HARD_BLOCKED; 3376 3073 3377 3074 #ifdef CONFIG_THINKPAD_ACPI_DEBUGFACILITIES 3378 3075 if (dbg_bluetoothemul) 3379 3076 return (tpacpi_bluetooth_emulstate) ? 3380 - RFKILL_STATE_UNBLOCKED : RFKILL_STATE_SOFT_BLOCKED; 3077 + TPACPI_RFK_RADIO_ON : TPACPI_RFK_RADIO_OFF; 3381 3078 #endif 3382 3079 3383 3080 if (!acpi_evalf(hkey_handle, &status, "GBDC", "d")) 3384 3081 return -EIO; 3385 3082 3386 3083 return ((status & TP_ACPI_BLUETOOTH_RADIOSSW) != 0) ? 3387 - RFKILL_STATE_UNBLOCKED : RFKILL_STATE_SOFT_BLOCKED; 3084 + TPACPI_RFK_RADIO_ON : TPACPI_RFK_RADIO_OFF; 3388 3085 } 3389 3086 3390 - static void bluetooth_update_rfk(void) 3087 + static int bluetooth_set_status(enum tpacpi_rfkill_state state) 3391 3088 { 3392 3089 int status; 3393 3090 3394 - if (!tpacpi_bluetooth_rfkill) 3395 - return; 3396 - 3397 - status = bluetooth_get_radiosw(); 3398 - if (status < 0) 3399 - return; 3400 - rfkill_force_state(tpacpi_bluetooth_rfkill, status); 3401 - 3402 3091 vdbg_printk(TPACPI_DBG_RFKILL, 3403 - "forced rfkill state to %d\n", 3404 - status); 3405 - } 3406 - 3407 - static int bluetooth_set_radiosw(int radio_on, int update_rfk) 3408 - { 3409 - int status; 3410 - 3411 - if (!tp_features.bluetooth) 3412 - return -ENODEV; 3413 - 3414 - /* WLSW overrides bluetooth in firmware/hardware, but there is no 3415 - * reason to risk weird behaviour. */ 3416 - if (tp_features.hotkey_wlsw && !hotkey_get_wlsw(&status) && !status 3417 - && radio_on) 3418 - return -EPERM; 3419 - 3420 - vdbg_printk(TPACPI_DBG_RFKILL, 3421 - "will %s bluetooth\n", radio_on ? "enable" : "disable"); 3092 + "will attempt to %s bluetooth\n", 3093 + (state == TPACPI_RFK_RADIO_ON) ? "enable" : "disable"); 3422 3094 3423 3095 #ifdef CONFIG_THINKPAD_ACPI_DEBUGFACILITIES 3424 3096 if (dbg_bluetoothemul) { 3425 - tpacpi_bluetooth_emulstate = !!radio_on; 3426 - if (update_rfk) 3427 - bluetooth_update_rfk(); 3097 + tpacpi_bluetooth_emulstate = (state == TPACPI_RFK_RADIO_ON); 3428 3098 return 0; 3429 3099 } 3430 3100 #endif 3431 3101 3432 3102 /* We make sure to keep TP_ACPI_BLUETOOTH_RESUMECTRL off */ 3433 - if (radio_on) 3103 + if (state == TPACPI_RFK_RADIO_ON) 3434 3104 status = TP_ACPI_BLUETOOTH_RADIOSSW; 3435 3105 else 3436 3106 status = 0; 3107 + 3437 3108 if (!acpi_evalf(hkey_handle, NULL, "SBDC", "vd", status)) 3438 3109 return -EIO; 3439 - 3440 - if (update_rfk) 3441 - bluetooth_update_rfk(); 3442 3110 3443 3111 return 0; 3444 3112 } ··· 3412 3152 struct device_attribute *attr, 3413 3153 char *buf) 3414 3154 { 3415 - int status; 3416 - 3417 - printk_deprecated_rfkill_attribute("bluetooth_enable"); 3418 - 3419 - status = bluetooth_get_radiosw(); 3420 - if (status < 0) 3421 - return status; 3422 - 3423 - return snprintf(buf, PAGE_SIZE, "%d\n", 3424 - (status == RFKILL_STATE_UNBLOCKED) ? 1 : 0); 3155 + return tpacpi_rfk_sysfs_enable_show(TPACPI_RFK_BLUETOOTH_SW_ID, 3156 + attr, buf); 3425 3157 } 3426 3158 3427 3159 static ssize_t bluetooth_enable_store(struct device *dev, 3428 3160 struct device_attribute *attr, 3429 3161 const char *buf, size_t count) 3430 3162 { 3431 - unsigned long t; 3432 - int res; 3433 - 3434 - printk_deprecated_rfkill_attribute("bluetooth_enable"); 3435 - 3436 - if (parse_strtoul(buf, 1, &t)) 3437 - return -EINVAL; 3438 - 3439 - tpacpi_disclose_usertask("bluetooth_enable", "set to %ld\n", t); 3440 - 3441 - res = bluetooth_set_radiosw(t, 1); 3442 - 3443 - return (res) ? res : count; 3163 + return tpacpi_rfk_sysfs_enable_store(TPACPI_RFK_BLUETOOTH_SW_ID, 3164 + attr, buf, count); 3444 3165 } 3445 3166 3446 3167 static struct device_attribute dev_attr_bluetooth_enable = ··· 3439 3198 .attrs = bluetooth_attributes, 3440 3199 }; 3441 3200 3442 - static int tpacpi_bluetooth_rfk_get(void *data, enum rfkill_state *state) 3443 - { 3444 - int bts = bluetooth_get_radiosw(); 3445 - 3446 - if (bts < 0) 3447 - return bts; 3448 - 3449 - *state = bts; 3450 - return 0; 3451 - } 3452 - 3453 - static int tpacpi_bluetooth_rfk_set(void *data, enum rfkill_state state) 3454 - { 3455 - dbg_printk(TPACPI_DBG_RFKILL, 3456 - "request to change radio state to %d\n", state); 3457 - return bluetooth_set_radiosw((state == RFKILL_STATE_UNBLOCKED), 0); 3458 - } 3201 + static const struct tpacpi_rfk_ops bluetooth_tprfk_ops = { 3202 + .get_status = bluetooth_get_status, 3203 + .set_status = bluetooth_set_status, 3204 + }; 3459 3205 3460 3206 static void bluetooth_shutdown(void) 3461 3207 { ··· 3458 3230 3459 3231 static void bluetooth_exit(void) 3460 3232 { 3461 - bluetooth_shutdown(); 3462 - 3463 - if (tpacpi_bluetooth_rfkill) 3464 - rfkill_unregister(tpacpi_bluetooth_rfkill); 3465 - 3466 3233 sysfs_remove_group(&tpacpi_pdev->dev.kobj, 3467 3234 &bluetooth_attr_group); 3235 + 3236 + tpacpi_destroy_rfkill(TPACPI_RFK_BLUETOOTH_SW_ID); 3237 + 3238 + bluetooth_shutdown(); 3468 3239 } 3469 3240 3470 3241 static int __init bluetooth_init(struct ibm_init_struct *iibm) ··· 3504 3277 if (!tp_features.bluetooth) 3505 3278 return 1; 3506 3279 3507 - res = sysfs_create_group(&tpacpi_pdev->dev.kobj, 3508 - &bluetooth_attr_group); 3280 + res = tpacpi_new_rfkill(TPACPI_RFK_BLUETOOTH_SW_ID, 3281 + &bluetooth_tprfk_ops, 3282 + RFKILL_TYPE_BLUETOOTH, 3283 + TPACPI_RFK_BLUETOOTH_SW_NAME, 3284 + true); 3509 3285 if (res) 3510 3286 return res; 3511 3287 3512 - res = tpacpi_new_rfkill(TPACPI_RFK_BLUETOOTH_SW_ID, 3513 - &tpacpi_bluetooth_rfkill, 3514 - RFKILL_TYPE_BLUETOOTH, 3515 - TPACPI_RFK_BLUETOOTH_SW_NAME, 3516 - true, 3517 - tpacpi_bluetooth_rfk_set, 3518 - tpacpi_bluetooth_rfk_get); 3288 + res = sysfs_create_group(&tpacpi_pdev->dev.kobj, 3289 + &bluetooth_attr_group); 3519 3290 if (res) { 3520 - bluetooth_exit(); 3291 + tpacpi_destroy_rfkill(TPACPI_RFK_BLUETOOTH_SW_ID); 3521 3292 return res; 3522 3293 } 3523 3294 ··· 3525 3300 /* procfs -------------------------------------------------------------- */ 3526 3301 static int bluetooth_read(char *p) 3527 3302 { 3528 - int len = 0; 3529 - int status = bluetooth_get_radiosw(); 3530 - 3531 - if (!tp_features.bluetooth) 3532 - len += sprintf(p + len, "status:\t\tnot supported\n"); 3533 - else { 3534 - len += sprintf(p + len, "status:\t\t%s\n", 3535 - (status == RFKILL_STATE_UNBLOCKED) ? 3536 - "enabled" : "disabled"); 3537 - len += sprintf(p + len, "commands:\tenable, disable\n"); 3538 - } 3539 - 3540 - return len; 3303 + return tpacpi_rfk_procfs_read(TPACPI_RFK_BLUETOOTH_SW_ID, p); 3541 3304 } 3542 3305 3543 3306 static int bluetooth_write(char *buf) 3544 3307 { 3545 - char *cmd; 3546 - int state = -1; 3547 - 3548 - if (!tp_features.bluetooth) 3549 - return -ENODEV; 3550 - 3551 - while ((cmd = next_cmd(&buf))) { 3552 - if (strlencmp(cmd, "enable") == 0) { 3553 - state = 1; 3554 - } else if (strlencmp(cmd, "disable") == 0) { 3555 - state = 0; 3556 - } else 3557 - return -EINVAL; 3558 - } 3559 - 3560 - if (state != -1) { 3561 - tpacpi_disclose_usertask("procfs bluetooth", 3562 - "attempt to %s\n", 3563 - state ? "enable" : "disable"); 3564 - bluetooth_set_radiosw(state, 1); 3565 - } 3566 - 3567 - return 0; 3308 + return tpacpi_rfk_procfs_write(TPACPI_RFK_BLUETOOTH_SW_ID, buf); 3568 3309 } 3569 3310 3570 3311 static struct ibm_struct bluetooth_driver_data = { ··· 3556 3365 3557 3366 #define TPACPI_RFK_WWAN_SW_NAME "tpacpi_wwan_sw" 3558 3367 3559 - static struct rfkill *tpacpi_wan_rfkill; 3560 - 3561 3368 static void wan_suspend(pm_message_t state) 3562 3369 { 3563 3370 /* Try to make sure radio will resume powered off */ ··· 3565 3376 "WWAN power down on resume request failed\n"); 3566 3377 } 3567 3378 3568 - static int wan_get_radiosw(void) 3379 + static int wan_get_status(void) 3569 3380 { 3570 3381 int status; 3571 - 3572 - if (!tp_features.wan) 3573 - return -ENODEV; 3574 - 3575 - /* WLSW overrides WWAN in firmware/hardware, reflect that */ 3576 - if (tp_features.hotkey_wlsw && !hotkey_get_wlsw(&status) && !status) 3577 - return RFKILL_STATE_HARD_BLOCKED; 3578 3382 3579 3383 #ifdef CONFIG_THINKPAD_ACPI_DEBUGFACILITIES 3580 3384 if (dbg_wwanemul) 3581 3385 return (tpacpi_wwan_emulstate) ? 3582 - RFKILL_STATE_UNBLOCKED : RFKILL_STATE_SOFT_BLOCKED; 3386 + TPACPI_RFK_RADIO_ON : TPACPI_RFK_RADIO_OFF; 3583 3387 #endif 3584 3388 3585 3389 if (!acpi_evalf(hkey_handle, &status, "GWAN", "d")) 3586 3390 return -EIO; 3587 3391 3588 3392 return ((status & TP_ACPI_WANCARD_RADIOSSW) != 0) ? 3589 - RFKILL_STATE_UNBLOCKED : RFKILL_STATE_SOFT_BLOCKED; 3393 + TPACPI_RFK_RADIO_ON : TPACPI_RFK_RADIO_OFF; 3590 3394 } 3591 3395 3592 - static void wan_update_rfk(void) 3396 + static int wan_set_status(enum tpacpi_rfkill_state state) 3593 3397 { 3594 3398 int status; 3595 3399 3596 - if (!tpacpi_wan_rfkill) 3597 - return; 3598 - 3599 - status = wan_get_radiosw(); 3600 - if (status < 0) 3601 - return; 3602 - rfkill_force_state(tpacpi_wan_rfkill, status); 3603 - 3604 3400 vdbg_printk(TPACPI_DBG_RFKILL, 3605 - "forced rfkill state to %d\n", 3606 - status); 3607 - } 3608 - 3609 - static int wan_set_radiosw(int radio_on, int update_rfk) 3610 - { 3611 - int status; 3612 - 3613 - if (!tp_features.wan) 3614 - return -ENODEV; 3615 - 3616 - /* WLSW overrides bluetooth in firmware/hardware, but there is no 3617 - * reason to risk weird behaviour. */ 3618 - if (tp_features.hotkey_wlsw && !hotkey_get_wlsw(&status) && !status 3619 - && radio_on) 3620 - return -EPERM; 3621 - 3622 - vdbg_printk(TPACPI_DBG_RFKILL, 3623 - "will %s WWAN\n", radio_on ? "enable" : "disable"); 3401 + "will attempt to %s wwan\n", 3402 + (state == TPACPI_RFK_RADIO_ON) ? "enable" : "disable"); 3624 3403 3625 3404 #ifdef CONFIG_THINKPAD_ACPI_DEBUGFACILITIES 3626 3405 if (dbg_wwanemul) { 3627 - tpacpi_wwan_emulstate = !!radio_on; 3628 - if (update_rfk) 3629 - wan_update_rfk(); 3406 + tpacpi_wwan_emulstate = (state == TPACPI_RFK_RADIO_ON); 3630 3407 return 0; 3631 3408 } 3632 3409 #endif 3633 3410 3634 3411 /* We make sure to keep TP_ACPI_WANCARD_RESUMECTRL off */ 3635 - if (radio_on) 3412 + if (state == TPACPI_RFK_RADIO_ON) 3636 3413 status = TP_ACPI_WANCARD_RADIOSSW; 3637 3414 else 3638 3415 status = 0; 3416 + 3639 3417 if (!acpi_evalf(hkey_handle, NULL, "SWAN", "vd", status)) 3640 3418 return -EIO; 3641 - 3642 - if (update_rfk) 3643 - wan_update_rfk(); 3644 3419 3645 3420 return 0; 3646 3421 } ··· 3614 3461 struct device_attribute *attr, 3615 3462 char *buf) 3616 3463 { 3617 - int status; 3618 - 3619 - printk_deprecated_rfkill_attribute("wwan_enable"); 3620 - 3621 - status = wan_get_radiosw(); 3622 - if (status < 0) 3623 - return status; 3624 - 3625 - return snprintf(buf, PAGE_SIZE, "%d\n", 3626 - (status == RFKILL_STATE_UNBLOCKED) ? 1 : 0); 3464 + return tpacpi_rfk_sysfs_enable_show(TPACPI_RFK_WWAN_SW_ID, 3465 + attr, buf); 3627 3466 } 3628 3467 3629 3468 static ssize_t wan_enable_store(struct device *dev, 3630 3469 struct device_attribute *attr, 3631 3470 const char *buf, size_t count) 3632 3471 { 3633 - unsigned long t; 3634 - int res; 3635 - 3636 - printk_deprecated_rfkill_attribute("wwan_enable"); 3637 - 3638 - if (parse_strtoul(buf, 1, &t)) 3639 - return -EINVAL; 3640 - 3641 - tpacpi_disclose_usertask("wwan_enable", "set to %ld\n", t); 3642 - 3643 - res = wan_set_radiosw(t, 1); 3644 - 3645 - return (res) ? res : count; 3472 + return tpacpi_rfk_sysfs_enable_store(TPACPI_RFK_WWAN_SW_ID, 3473 + attr, buf, count); 3646 3474 } 3647 3475 3648 3476 static struct device_attribute dev_attr_wan_enable = ··· 3641 3507 .attrs = wan_attributes, 3642 3508 }; 3643 3509 3644 - static int tpacpi_wan_rfk_get(void *data, enum rfkill_state *state) 3645 - { 3646 - int wans = wan_get_radiosw(); 3647 - 3648 - if (wans < 0) 3649 - return wans; 3650 - 3651 - *state = wans; 3652 - return 0; 3653 - } 3654 - 3655 - static int tpacpi_wan_rfk_set(void *data, enum rfkill_state state) 3656 - { 3657 - dbg_printk(TPACPI_DBG_RFKILL, 3658 - "request to change radio state to %d\n", state); 3659 - return wan_set_radiosw((state == RFKILL_STATE_UNBLOCKED), 0); 3660 - } 3510 + static const struct tpacpi_rfk_ops wan_tprfk_ops = { 3511 + .get_status = wan_get_status, 3512 + .set_status = wan_set_status, 3513 + }; 3661 3514 3662 3515 static void wan_shutdown(void) 3663 3516 { ··· 3660 3539 3661 3540 static void wan_exit(void) 3662 3541 { 3663 - wan_shutdown(); 3664 - 3665 - if (tpacpi_wan_rfkill) 3666 - rfkill_unregister(tpacpi_wan_rfkill); 3667 - 3668 3542 sysfs_remove_group(&tpacpi_pdev->dev.kobj, 3669 3543 &wan_attr_group); 3544 + 3545 + tpacpi_destroy_rfkill(TPACPI_RFK_WWAN_SW_ID); 3546 + 3547 + wan_shutdown(); 3670 3548 } 3671 3549 3672 3550 static int __init wan_init(struct ibm_init_struct *iibm) ··· 3704 3584 if (!tp_features.wan) 3705 3585 return 1; 3706 3586 3707 - res = sysfs_create_group(&tpacpi_pdev->dev.kobj, 3708 - &wan_attr_group); 3587 + res = tpacpi_new_rfkill(TPACPI_RFK_WWAN_SW_ID, 3588 + &wan_tprfk_ops, 3589 + RFKILL_TYPE_WWAN, 3590 + TPACPI_RFK_WWAN_SW_NAME, 3591 + true); 3709 3592 if (res) 3710 3593 return res; 3711 3594 3712 - res = tpacpi_new_rfkill(TPACPI_RFK_WWAN_SW_ID, 3713 - &tpacpi_wan_rfkill, 3714 - RFKILL_TYPE_WWAN, 3715 - TPACPI_RFK_WWAN_SW_NAME, 3716 - true, 3717 - tpacpi_wan_rfk_set, 3718 - tpacpi_wan_rfk_get); 3595 + res = sysfs_create_group(&tpacpi_pdev->dev.kobj, 3596 + &wan_attr_group); 3597 + 3719 3598 if (res) { 3720 - wan_exit(); 3599 + tpacpi_destroy_rfkill(TPACPI_RFK_WWAN_SW_ID); 3721 3600 return res; 3722 3601 } 3723 3602 ··· 3726 3607 /* procfs -------------------------------------------------------------- */ 3727 3608 static int wan_read(char *p) 3728 3609 { 3729 - int len = 0; 3730 - int status = wan_get_radiosw(); 3731 - 3732 - tpacpi_disclose_usertask("procfs wan", "read"); 3733 - 3734 - if (!tp_features.wan) 3735 - len += sprintf(p + len, "status:\t\tnot supported\n"); 3736 - else { 3737 - len += sprintf(p + len, "status:\t\t%s\n", 3738 - (status == RFKILL_STATE_UNBLOCKED) ? 3739 - "enabled" : "disabled"); 3740 - len += sprintf(p + len, "commands:\tenable, disable\n"); 3741 - } 3742 - 3743 - return len; 3610 + return tpacpi_rfk_procfs_read(TPACPI_RFK_WWAN_SW_ID, p); 3744 3611 } 3745 3612 3746 3613 static int wan_write(char *buf) 3747 3614 { 3748 - char *cmd; 3749 - int state = -1; 3750 - 3751 - if (!tp_features.wan) 3752 - return -ENODEV; 3753 - 3754 - while ((cmd = next_cmd(&buf))) { 3755 - if (strlencmp(cmd, "enable") == 0) { 3756 - state = 1; 3757 - } else if (strlencmp(cmd, "disable") == 0) { 3758 - state = 0; 3759 - } else 3760 - return -EINVAL; 3761 - } 3762 - 3763 - if (state != -1) { 3764 - tpacpi_disclose_usertask("procfs wan", 3765 - "attempt to %s\n", 3766 - state ? "enable" : "disable"); 3767 - wan_set_radiosw(state, 1); 3768 - } 3769 - 3770 - return 0; 3615 + return tpacpi_rfk_procfs_write(TPACPI_RFK_WWAN_SW_ID, buf); 3771 3616 } 3772 3617 3773 3618 static struct ibm_struct wan_driver_data = { ··· 3755 3672 3756 3673 #define TPACPI_RFK_UWB_SW_NAME "tpacpi_uwb_sw" 3757 3674 3758 - static struct rfkill *tpacpi_uwb_rfkill; 3759 - 3760 - static int uwb_get_radiosw(void) 3675 + static int uwb_get_status(void) 3761 3676 { 3762 3677 int status; 3763 - 3764 - if (!tp_features.uwb) 3765 - return -ENODEV; 3766 - 3767 - /* WLSW overrides UWB in firmware/hardware, reflect that */ 3768 - if (tp_features.hotkey_wlsw && !hotkey_get_wlsw(&status) && !status) 3769 - return RFKILL_STATE_HARD_BLOCKED; 3770 3678 3771 3679 #ifdef CONFIG_THINKPAD_ACPI_DEBUGFACILITIES 3772 3680 if (dbg_uwbemul) 3773 3681 return (tpacpi_uwb_emulstate) ? 3774 - RFKILL_STATE_UNBLOCKED : RFKILL_STATE_SOFT_BLOCKED; 3682 + TPACPI_RFK_RADIO_ON : TPACPI_RFK_RADIO_OFF; 3775 3683 #endif 3776 3684 3777 3685 if (!acpi_evalf(hkey_handle, &status, "GUWB", "d")) 3778 3686 return -EIO; 3779 3687 3780 3688 return ((status & TP_ACPI_UWB_RADIOSSW) != 0) ? 3781 - RFKILL_STATE_UNBLOCKED : RFKILL_STATE_SOFT_BLOCKED; 3689 + TPACPI_RFK_RADIO_ON : TPACPI_RFK_RADIO_OFF; 3782 3690 } 3783 3691 3784 - static void uwb_update_rfk(void) 3692 + static int uwb_set_status(enum tpacpi_rfkill_state state) 3785 3693 { 3786 3694 int status; 3787 3695 3788 - if (!tpacpi_uwb_rfkill) 3789 - return; 3790 - 3791 - status = uwb_get_radiosw(); 3792 - if (status < 0) 3793 - return; 3794 - rfkill_force_state(tpacpi_uwb_rfkill, status); 3795 - 3796 3696 vdbg_printk(TPACPI_DBG_RFKILL, 3797 - "forced rfkill state to %d\n", 3798 - status); 3799 - } 3800 - 3801 - static int uwb_set_radiosw(int radio_on, int update_rfk) 3802 - { 3803 - int status; 3804 - 3805 - if (!tp_features.uwb) 3806 - return -ENODEV; 3807 - 3808 - /* WLSW overrides UWB in firmware/hardware, but there is no 3809 - * reason to risk weird behaviour. */ 3810 - if (tp_features.hotkey_wlsw && !hotkey_get_wlsw(&status) && !status 3811 - && radio_on) 3812 - return -EPERM; 3813 - 3814 - vdbg_printk(TPACPI_DBG_RFKILL, 3815 - "will %s UWB\n", radio_on ? "enable" : "disable"); 3697 + "will attempt to %s UWB\n", 3698 + (state == TPACPI_RFK_RADIO_ON) ? "enable" : "disable"); 3816 3699 3817 3700 #ifdef CONFIG_THINKPAD_ACPI_DEBUGFACILITIES 3818 3701 if (dbg_uwbemul) { 3819 - tpacpi_uwb_emulstate = !!radio_on; 3820 - if (update_rfk) 3821 - uwb_update_rfk(); 3702 + tpacpi_uwb_emulstate = (state == TPACPI_RFK_RADIO_ON); 3822 3703 return 0; 3823 3704 } 3824 3705 #endif 3825 3706 3826 - status = (radio_on) ? TP_ACPI_UWB_RADIOSSW : 0; 3707 + if (state == TPACPI_RFK_RADIO_ON) 3708 + status = TP_ACPI_UWB_RADIOSSW; 3709 + else 3710 + status = 0; 3711 + 3827 3712 if (!acpi_evalf(hkey_handle, NULL, "SUWB", "vd", status)) 3828 3713 return -EIO; 3829 - 3830 - if (update_rfk) 3831 - uwb_update_rfk(); 3832 3714 3833 3715 return 0; 3834 3716 } 3835 3717 3836 3718 /* --------------------------------------------------------------------- */ 3837 3719 3838 - static int tpacpi_uwb_rfk_get(void *data, enum rfkill_state *state) 3839 - { 3840 - int uwbs = uwb_get_radiosw(); 3841 - 3842 - if (uwbs < 0) 3843 - return uwbs; 3844 - 3845 - *state = uwbs; 3846 - return 0; 3847 - } 3848 - 3849 - static int tpacpi_uwb_rfk_set(void *data, enum rfkill_state state) 3850 - { 3851 - dbg_printk(TPACPI_DBG_RFKILL, 3852 - "request to change radio state to %d\n", state); 3853 - return uwb_set_radiosw((state == RFKILL_STATE_UNBLOCKED), 0); 3854 - } 3720 + static const struct tpacpi_rfk_ops uwb_tprfk_ops = { 3721 + .get_status = uwb_get_status, 3722 + .set_status = uwb_set_status, 3723 + }; 3855 3724 3856 3725 static void uwb_exit(void) 3857 3726 { 3858 - if (tpacpi_uwb_rfkill) 3859 - rfkill_unregister(tpacpi_uwb_rfkill); 3727 + tpacpi_destroy_rfkill(TPACPI_RFK_UWB_SW_ID); 3860 3728 } 3861 3729 3862 3730 static int __init uwb_init(struct ibm_init_struct *iibm) ··· 3847 3813 return 1; 3848 3814 3849 3815 res = tpacpi_new_rfkill(TPACPI_RFK_UWB_SW_ID, 3850 - &tpacpi_uwb_rfkill, 3816 + &uwb_tprfk_ops, 3851 3817 RFKILL_TYPE_UWB, 3852 3818 TPACPI_RFK_UWB_SW_NAME, 3853 - false, 3854 - tpacpi_uwb_rfk_set, 3855 - tpacpi_uwb_rfk_get); 3856 - 3819 + false); 3857 3820 return res; 3858 3821 } 3859 3822
+47 -116
drivers/platform/x86/toshiba_acpi.c
··· 45 45 #include <linux/backlight.h> 46 46 #include <linux/platform_device.h> 47 47 #include <linux/rfkill.h> 48 - #include <linux/input-polldev.h> 49 48 50 49 #include <asm/uaccess.h> 51 50 ··· 249 250 250 251 struct toshiba_acpi_dev { 251 252 struct platform_device *p_dev; 252 - struct rfkill *rfk_dev; 253 - struct input_polled_dev *poll_dev; 253 + struct rfkill *bt_rfk; 254 254 255 255 const char *bt_name; 256 - const char *rfk_name; 257 - 258 - bool last_rfk_state; 259 256 260 257 struct mutex mutex; 261 258 }; 262 259 263 260 static struct toshiba_acpi_dev toshiba_acpi = { 264 261 .bt_name = "Toshiba Bluetooth", 265 - .rfk_name = "Toshiba RFKill Switch", 266 - .last_rfk_state = false, 267 262 }; 268 263 269 264 /* Bluetooth rfkill handlers */ ··· 276 283 return hci_result; 277 284 } 278 285 279 - static u32 hci_get_bt_on(bool *on) 280 - { 281 - u32 hci_result; 282 - u32 value, value2; 283 - 284 - value = 0; 285 - value2 = 0x0001; 286 - hci_read2(HCI_WIRELESS, &value, &value2, &hci_result); 287 - if (hci_result == HCI_SUCCESS) 288 - *on = (value & HCI_WIRELESS_BT_POWER) && 289 - (value & HCI_WIRELESS_BT_ATTACH); 290 - 291 - return hci_result; 292 - } 293 - 294 286 static u32 hci_get_radio_state(bool *radio_state) 295 287 { 296 288 u32 hci_result; ··· 289 311 return hci_result; 290 312 } 291 313 292 - static int bt_rfkill_toggle_radio(void *data, enum rfkill_state state) 314 + static int bt_rfkill_set_block(void *data, bool blocked) 293 315 { 316 + struct toshiba_acpi_dev *dev = data; 294 317 u32 result1, result2; 295 318 u32 value; 319 + int err; 296 320 bool radio_state; 297 - struct toshiba_acpi_dev *dev = data; 298 321 299 - value = (state == RFKILL_STATE_UNBLOCKED); 300 - 301 - if (hci_get_radio_state(&radio_state) != HCI_SUCCESS) 302 - return -EFAULT; 303 - 304 - switch (state) { 305 - case RFKILL_STATE_UNBLOCKED: 306 - if (!radio_state) 307 - return -EPERM; 308 - break; 309 - case RFKILL_STATE_SOFT_BLOCKED: 310 - break; 311 - default: 312 - return -EINVAL; 313 - } 322 + value = (blocked == false); 314 323 315 324 mutex_lock(&dev->mutex); 325 + if (hci_get_radio_state(&radio_state) != HCI_SUCCESS) { 326 + err = -EBUSY; 327 + goto out; 328 + } 329 + 330 + if (!radio_state) { 331 + err = 0; 332 + goto out; 333 + } 334 + 316 335 hci_write2(HCI_WIRELESS, value, HCI_WIRELESS_BT_POWER, &result1); 317 336 hci_write2(HCI_WIRELESS, value, HCI_WIRELESS_BT_ATTACH, &result2); 318 - mutex_unlock(&dev->mutex); 319 337 320 338 if (result1 != HCI_SUCCESS || result2 != HCI_SUCCESS) 321 - return -EFAULT; 322 - 323 - return 0; 339 + err = -EBUSY; 340 + else 341 + err = 0; 342 + out: 343 + mutex_unlock(&dev->mutex); 344 + return err; 324 345 } 325 346 326 - static void bt_poll_rfkill(struct input_polled_dev *poll_dev) 347 + static void bt_rfkill_poll(struct rfkill *rfkill, void *data) 327 348 { 328 - bool state_changed; 329 349 bool new_rfk_state; 330 350 bool value; 331 351 u32 hci_result; 332 - struct toshiba_acpi_dev *dev = poll_dev->private; 352 + struct toshiba_acpi_dev *dev = data; 353 + 354 + mutex_lock(&dev->mutex); 333 355 334 356 hci_result = hci_get_radio_state(&value); 335 - if (hci_result != HCI_SUCCESS) 336 - return; /* Can't do anything useful */ 357 + if (hci_result != HCI_SUCCESS) { 358 + /* Can't do anything useful */ 359 + mutex_unlock(&dev->mutex); 360 + } 337 361 338 362 new_rfk_state = value; 339 363 340 - mutex_lock(&dev->mutex); 341 - state_changed = new_rfk_state != dev->last_rfk_state; 342 - dev->last_rfk_state = new_rfk_state; 343 364 mutex_unlock(&dev->mutex); 344 365 345 - if (unlikely(state_changed)) { 346 - rfkill_force_state(dev->rfk_dev, 347 - new_rfk_state ? 348 - RFKILL_STATE_SOFT_BLOCKED : 349 - RFKILL_STATE_HARD_BLOCKED); 350 - input_report_switch(poll_dev->input, SW_RFKILL_ALL, 351 - new_rfk_state); 352 - input_sync(poll_dev->input); 353 - } 366 + if (rfkill_set_hw_state(rfkill, !new_rfk_state)) 367 + bt_rfkill_set_block(data, true); 354 368 } 369 + 370 + static const struct rfkill_ops toshiba_rfk_ops = { 371 + .set_block = bt_rfkill_set_block, 372 + .poll = bt_rfkill_poll, 373 + }; 355 374 356 375 static struct proc_dir_entry *toshiba_proc_dir /*= 0*/ ; 357 376 static struct backlight_device *toshiba_backlight_device; ··· 677 702 678 703 static void toshiba_acpi_exit(void) 679 704 { 680 - if (toshiba_acpi.poll_dev) { 681 - input_unregister_polled_device(toshiba_acpi.poll_dev); 682 - input_free_polled_device(toshiba_acpi.poll_dev); 705 + if (toshiba_acpi.bt_rfk) { 706 + rfkill_unregister(toshiba_acpi.bt_rfk); 707 + rfkill_destroy(toshiba_acpi.bt_rfk); 683 708 } 684 - 685 - if (toshiba_acpi.rfk_dev) 686 - rfkill_unregister(toshiba_acpi.rfk_dev); 687 709 688 710 if (toshiba_backlight_device) 689 711 backlight_device_unregister(toshiba_backlight_device); ··· 700 728 acpi_status status = AE_OK; 701 729 u32 hci_result; 702 730 bool bt_present; 703 - bool bt_on; 704 - bool radio_on; 705 731 int ret = 0; 706 732 707 733 if (acpi_disabled) ··· 763 793 764 794 /* Register rfkill switch for Bluetooth */ 765 795 if (hci_get_bt_present(&bt_present) == HCI_SUCCESS && bt_present) { 766 - toshiba_acpi.rfk_dev = rfkill_allocate(&toshiba_acpi.p_dev->dev, 767 - RFKILL_TYPE_BLUETOOTH); 768 - if (!toshiba_acpi.rfk_dev) { 796 + toshiba_acpi.bt_rfk = rfkill_alloc(toshiba_acpi.bt_name, 797 + &toshiba_acpi.p_dev->dev, 798 + RFKILL_TYPE_BLUETOOTH, 799 + &toshiba_rfk_ops, 800 + &toshiba_acpi); 801 + if (!toshiba_acpi.bt_rfk) { 769 802 printk(MY_ERR "unable to allocate rfkill device\n"); 770 803 toshiba_acpi_exit(); 771 804 return -ENOMEM; 772 805 } 773 806 774 - toshiba_acpi.rfk_dev->name = toshiba_acpi.bt_name; 775 - toshiba_acpi.rfk_dev->toggle_radio = bt_rfkill_toggle_radio; 776 - toshiba_acpi.rfk_dev->data = &toshiba_acpi; 777 - 778 - if (hci_get_bt_on(&bt_on) == HCI_SUCCESS && bt_on) { 779 - toshiba_acpi.rfk_dev->state = RFKILL_STATE_UNBLOCKED; 780 - } else if (hci_get_radio_state(&radio_on) == HCI_SUCCESS && 781 - radio_on) { 782 - toshiba_acpi.rfk_dev->state = RFKILL_STATE_SOFT_BLOCKED; 783 - } else { 784 - toshiba_acpi.rfk_dev->state = RFKILL_STATE_HARD_BLOCKED; 785 - } 786 - 787 - ret = rfkill_register(toshiba_acpi.rfk_dev); 807 + ret = rfkill_register(toshiba_acpi.bt_rfk); 788 808 if (ret) { 789 809 printk(MY_ERR "unable to register rfkill device\n"); 790 - toshiba_acpi_exit(); 791 - return -ENOMEM; 792 - } 793 - 794 - /* Register input device for kill switch */ 795 - toshiba_acpi.poll_dev = input_allocate_polled_device(); 796 - if (!toshiba_acpi.poll_dev) { 797 - printk(MY_ERR 798 - "unable to allocate kill-switch input device\n"); 799 - toshiba_acpi_exit(); 800 - return -ENOMEM; 801 - } 802 - toshiba_acpi.poll_dev->private = &toshiba_acpi; 803 - toshiba_acpi.poll_dev->poll = bt_poll_rfkill; 804 - toshiba_acpi.poll_dev->poll_interval = 1000; /* msecs */ 805 - 806 - toshiba_acpi.poll_dev->input->name = toshiba_acpi.rfk_name; 807 - toshiba_acpi.poll_dev->input->id.bustype = BUS_HOST; 808 - /* Toshiba USB ID */ 809 - toshiba_acpi.poll_dev->input->id.vendor = 0x0930; 810 - set_bit(EV_SW, toshiba_acpi.poll_dev->input->evbit); 811 - set_bit(SW_RFKILL_ALL, toshiba_acpi.poll_dev->input->swbit); 812 - input_report_switch(toshiba_acpi.poll_dev->input, 813 - SW_RFKILL_ALL, TRUE); 814 - input_sync(toshiba_acpi.poll_dev->input); 815 - 816 - ret = input_register_polled_device(toshiba_acpi.poll_dev); 817 - if (ret) { 818 - printk(MY_ERR 819 - "unable to register kill-switch input device\n"); 810 + rfkill_destroy(toshiba_acpi.bt_rfk); 820 811 toshiba_acpi_exit(); 821 812 return ret; 822 813 }
+1
include/linux/Kbuild
··· 311 311 unifdef-y += qnx4_fs.h 312 312 unifdef-y += quota.h 313 313 unifdef-y += random.h 314 + unifdef-y += rfkill.h 314 315 unifdef-y += irqnr.h 315 316 unifdef-y += reboot.h 316 317 unifdef-y += reiserfs_fs.h
+256 -79
include/linux/rfkill.h
··· 4 4 /* 5 5 * Copyright (C) 2006 - 2007 Ivo van Doorn 6 6 * Copyright (C) 2007 Dmitry Torokhov 7 + * Copyright 2009 Johannes Berg <johannes@sipsolutions.net> 7 8 * 8 9 * This program is free software; you can redistribute it and/or modify 9 10 * it under the terms of the GNU General Public License as published by ··· 22 21 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 23 22 */ 24 23 24 + 25 + /* define userspace visible states */ 26 + #define RFKILL_STATE_SOFT_BLOCKED 0 27 + #define RFKILL_STATE_UNBLOCKED 1 28 + #define RFKILL_STATE_HARD_BLOCKED 2 29 + 30 + /* and that's all userspace gets */ 31 + #ifdef __KERNEL__ 32 + /* don't allow anyone to use these in the kernel */ 33 + enum rfkill_user_states { 34 + RFKILL_USER_STATE_SOFT_BLOCKED = RFKILL_STATE_SOFT_BLOCKED, 35 + RFKILL_USER_STATE_UNBLOCKED = RFKILL_STATE_UNBLOCKED, 36 + RFKILL_USER_STATE_HARD_BLOCKED = RFKILL_STATE_HARD_BLOCKED, 37 + }; 38 + #undef RFKILL_STATE_SOFT_BLOCKED 39 + #undef RFKILL_STATE_UNBLOCKED 40 + #undef RFKILL_STATE_HARD_BLOCKED 41 + 25 42 #include <linux/types.h> 26 43 #include <linux/kernel.h> 27 44 #include <linux/list.h> ··· 49 30 50 31 /** 51 32 * enum rfkill_type - type of rfkill switch. 52 - * RFKILL_TYPE_WLAN: switch is on a 802.11 wireless network device. 53 - * RFKILL_TYPE_BLUETOOTH: switch is on a bluetooth device. 54 - * RFKILL_TYPE_UWB: switch is on a ultra wideband device. 55 - * RFKILL_TYPE_WIMAX: switch is on a WiMAX device. 56 - * RFKILL_TYPE_WWAN: switch is on a wireless WAN device. 33 + * 34 + * @RFKILL_TYPE_WLAN: switch is on a 802.11 wireless network device. 35 + * @RFKILL_TYPE_BLUETOOTH: switch is on a bluetooth device. 36 + * @RFKILL_TYPE_UWB: switch is on a ultra wideband device. 37 + * @RFKILL_TYPE_WIMAX: switch is on a WiMAX device. 38 + * @RFKILL_TYPE_WWAN: switch is on a wireless WAN device. 39 + * @NUM_RFKILL_TYPES: number of defined rfkill types 57 40 */ 58 41 enum rfkill_type { 59 - RFKILL_TYPE_WLAN , 42 + RFKILL_TYPE_WLAN, 60 43 RFKILL_TYPE_BLUETOOTH, 61 44 RFKILL_TYPE_UWB, 62 45 RFKILL_TYPE_WIMAX, 63 46 RFKILL_TYPE_WWAN, 64 - RFKILL_TYPE_MAX, 47 + NUM_RFKILL_TYPES, 65 48 }; 66 49 67 - enum rfkill_state { 68 - RFKILL_STATE_SOFT_BLOCKED = 0, /* Radio output blocked */ 69 - RFKILL_STATE_UNBLOCKED = 1, /* Radio output allowed */ 70 - RFKILL_STATE_HARD_BLOCKED = 2, /* Output blocked, non-overrideable */ 71 - RFKILL_STATE_MAX, /* marker for last valid state */ 72 - }; 50 + /* this is opaque */ 51 + struct rfkill; 73 52 74 53 /** 75 - * struct rfkill - rfkill control structure. 76 - * @name: Name of the switch. 77 - * @type: Radio type which the button controls, the value stored 78 - * here should be a value from enum rfkill_type. 79 - * @state: State of the switch, "UNBLOCKED" means radio can operate. 80 - * @mutex: Guards switch state transitions. It serializes callbacks 81 - * and also protects the state. 82 - * @data: Pointer to the RF button drivers private data which will be 83 - * passed along when toggling radio state. 84 - * @toggle_radio(): Mandatory handler to control state of the radio. 85 - * only RFKILL_STATE_SOFT_BLOCKED and RFKILL_STATE_UNBLOCKED are 86 - * valid parameters. 87 - * @get_state(): handler to read current radio state from hardware, 88 - * may be called from atomic context, should return 0 on success. 89 - * Either this handler OR judicious use of rfkill_force_state() is 90 - * MANDATORY for any driver capable of RFKILL_STATE_HARD_BLOCKED. 91 - * @led_trigger: A LED trigger for this button's LED. 92 - * @dev: Device structure integrating the switch into device tree. 93 - * @node: Used to place switch into list of all switches known to the 94 - * the system. 54 + * struct rfkill_ops - rfkill driver methods 95 55 * 96 - * This structure represents a RF switch located on a network device. 56 + * @poll: poll the rfkill block state(s) -- only assign this method 57 + * when you need polling. When called, simply call one of the 58 + * rfkill_set{,_hw,_sw}_state family of functions. If the hw 59 + * is getting unblocked you need to take into account the return 60 + * value of those functions to make sure the software block is 61 + * properly used. 62 + * @query: query the rfkill block state(s) and call exactly one of the 63 + * rfkill_set{,_hw,_sw}_state family of functions. Assign this 64 + * method if input events can cause hardware state changes to make 65 + * the rfkill core query your driver before setting a requested 66 + * block. 67 + * @set_block: turn the transmitter on (blocked == false) or off 68 + * (blocked == true) -- this is called only while the transmitter 69 + * is not hard-blocked, but note that the core's view of whether 70 + * the transmitter is hard-blocked might differ from your driver's 71 + * view due to race conditions, so it is possible that it is still 72 + * called at the same time as you are calling rfkill_set_hw_state(). 73 + * This callback must be assigned. 97 74 */ 98 - struct rfkill { 99 - const char *name; 100 - enum rfkill_type type; 101 - 102 - /* the mutex serializes callbacks and also protects 103 - * the state */ 104 - struct mutex mutex; 105 - enum rfkill_state state; 106 - void *data; 107 - int (*toggle_radio)(void *data, enum rfkill_state state); 108 - int (*get_state)(void *data, enum rfkill_state *state); 109 - 110 - #ifdef CONFIG_RFKILL_LEDS 111 - struct led_trigger led_trigger; 112 - #endif 113 - 114 - struct device dev; 115 - struct list_head node; 116 - enum rfkill_state state_for_resume; 75 + struct rfkill_ops { 76 + void (*poll)(struct rfkill *rfkill, void *data); 77 + void (*query)(struct rfkill *rfkill, void *data); 78 + int (*set_block)(void *data, bool blocked); 117 79 }; 118 - #define to_rfkill(d) container_of(d, struct rfkill, dev) 119 80 120 - struct rfkill * __must_check rfkill_allocate(struct device *parent, 121 - enum rfkill_type type); 122 - void rfkill_free(struct rfkill *rfkill); 81 + #if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE) 82 + /** 83 + * rfkill_alloc - allocate rfkill structure 84 + * @name: name of the struct -- the string is not copied internally 85 + * @parent: device that has rf switch on it 86 + * @type: type of the switch (RFKILL_TYPE_*) 87 + * @ops: rfkill methods 88 + * @ops_data: data passed to each method 89 + * 90 + * This function should be called by the transmitter driver to allocate an 91 + * rfkill structure. Returns %NULL on failure. 92 + */ 93 + struct rfkill * __must_check rfkill_alloc(const char *name, 94 + struct device *parent, 95 + const enum rfkill_type type, 96 + const struct rfkill_ops *ops, 97 + void *ops_data); 98 + 99 + /** 100 + * rfkill_register - Register a rfkill structure. 101 + * @rfkill: rfkill structure to be registered 102 + * 103 + * This function should be called by the transmitter driver to register 104 + * the rfkill structure needs to be registered. Before calling this function 105 + * the driver needs to be ready to service method calls from rfkill. 106 + */ 123 107 int __must_check rfkill_register(struct rfkill *rfkill); 108 + 109 + /** 110 + * rfkill_pause_polling(struct rfkill *rfkill) 111 + * 112 + * Pause polling -- say transmitter is off for other reasons. 113 + * NOTE: not necessary for suspend/resume -- in that case the 114 + * core stops polling anyway 115 + */ 116 + void rfkill_pause_polling(struct rfkill *rfkill); 117 + 118 + /** 119 + * rfkill_resume_polling(struct rfkill *rfkill) 120 + * 121 + * Pause polling -- say transmitter is off for other reasons. 122 + * NOTE: not necessary for suspend/resume -- in that case the 123 + * core stops polling anyway 124 + */ 125 + void rfkill_resume_polling(struct rfkill *rfkill); 126 + 127 + 128 + /** 129 + * rfkill_unregister - Unregister a rfkill structure. 130 + * @rfkill: rfkill structure to be unregistered 131 + * 132 + * This function should be called by the network driver during device 133 + * teardown to destroy rfkill structure. Until it returns, the driver 134 + * needs to be able to service method calls. 135 + */ 124 136 void rfkill_unregister(struct rfkill *rfkill); 125 137 126 - int rfkill_force_state(struct rfkill *rfkill, enum rfkill_state state); 127 - int rfkill_set_default(enum rfkill_type type, enum rfkill_state state); 128 - 129 138 /** 130 - * rfkill_state_complement - return complementar state 131 - * @state: state to return the complement of 139 + * rfkill_destroy - free rfkill structure 140 + * @rfkill: rfkill structure to be destroyed 132 141 * 133 - * Returns RFKILL_STATE_SOFT_BLOCKED if @state is RFKILL_STATE_UNBLOCKED, 134 - * returns RFKILL_STATE_UNBLOCKED otherwise. 142 + * Destroys the rfkill structure. 135 143 */ 136 - static inline enum rfkill_state rfkill_state_complement(enum rfkill_state state) 137 - { 138 - return (state == RFKILL_STATE_UNBLOCKED) ? 139 - RFKILL_STATE_SOFT_BLOCKED : RFKILL_STATE_UNBLOCKED; 140 - } 144 + void rfkill_destroy(struct rfkill *rfkill); 141 145 142 146 /** 143 - * rfkill_get_led_name - Get the LED trigger name for the button's LED. 144 - * This function might return a NULL pointer if registering of the 145 - * LED trigger failed. 146 - * Use this as "default_trigger" for the LED. 147 + * rfkill_set_hw_state - Set the internal rfkill hardware block state 148 + * @rfkill: pointer to the rfkill class to modify. 149 + * @state: the current hardware block state to set 150 + * 151 + * rfkill drivers that get events when the hard-blocked state changes 152 + * use this function to notify the rfkill core (and through that also 153 + * userspace) of the current state -- they should also use this after 154 + * resume if the state could have changed. 155 + * 156 + * You need not (but may) call this function if poll_state is assigned. 157 + * 158 + * This function can be called in any context, even from within rfkill 159 + * callbacks. 160 + * 161 + * The function returns the combined block state (true if transmitter 162 + * should be blocked) so that drivers need not keep track of the soft 163 + * block state -- which they might not be able to. 147 164 */ 148 - static inline char *rfkill_get_led_name(struct rfkill *rfkill) 165 + bool __must_check rfkill_set_hw_state(struct rfkill *rfkill, bool blocked); 166 + 167 + /** 168 + * rfkill_set_sw_state - Set the internal rfkill software block state 169 + * @rfkill: pointer to the rfkill class to modify. 170 + * @state: the current software block state to set 171 + * 172 + * rfkill drivers that get events when the soft-blocked state changes 173 + * (yes, some platforms directly act on input but allow changing again) 174 + * use this function to notify the rfkill core (and through that also 175 + * userspace) of the current state -- they should also use this after 176 + * resume if the state could have changed. 177 + * 178 + * This function can be called in any context, even from within rfkill 179 + * callbacks. 180 + * 181 + * The function returns the combined block state (true if transmitter 182 + * should be blocked). 183 + */ 184 + bool rfkill_set_sw_state(struct rfkill *rfkill, bool blocked); 185 + 186 + /** 187 + * rfkill_set_states - Set the internal rfkill block states 188 + * @rfkill: pointer to the rfkill class to modify. 189 + * @sw: the current software block state to set 190 + * @hw: the current hardware block state to set 191 + * 192 + * This function can be called in any context, even from within rfkill 193 + * callbacks. 194 + */ 195 + void rfkill_set_states(struct rfkill *rfkill, bool sw, bool hw); 196 + 197 + /** 198 + * rfkill_set_global_sw_state - set global sw block default 199 + * @type: rfkill type to set default for 200 + * @blocked: default to set 201 + * 202 + * This function sets the global default -- use at boot if your platform has 203 + * an rfkill switch. If not early enough this call may be ignored. 204 + * 205 + * XXX: instead of ignoring -- how about just updating all currently 206 + * registered drivers? 207 + */ 208 + void rfkill_set_global_sw_state(const enum rfkill_type type, bool blocked); 209 + #else /* !RFKILL */ 210 + static inline struct rfkill * __must_check 211 + rfkill_alloc(const char *name, 212 + struct device *parent, 213 + const enum rfkill_type type, 214 + const struct rfkill_ops *ops, 215 + void *ops_data) 149 216 { 150 - #ifdef CONFIG_RFKILL_LEDS 151 - return (char *)(rfkill->led_trigger.name); 152 - #else 153 - return NULL; 154 - #endif 217 + return ERR_PTR(-ENODEV); 155 218 } 219 + 220 + static inline int __must_check rfkill_register(struct rfkill *rfkill) 221 + { 222 + if (rfkill == ERR_PTR(-ENODEV)) 223 + return 0; 224 + return -EINVAL; 225 + } 226 + 227 + static inline void rfkill_pause_polling(struct rfkill *rfkill) 228 + { 229 + } 230 + 231 + static inline void rfkill_resume_polling(struct rfkill *rfkill) 232 + { 233 + } 234 + 235 + static inline void rfkill_unregister(struct rfkill *rfkill) 236 + { 237 + } 238 + 239 + static inline void rfkill_destroy(struct rfkill *rfkill) 240 + { 241 + } 242 + 243 + static inline bool rfkill_set_hw_state(struct rfkill *rfkill, bool blocked) 244 + { 245 + return blocked; 246 + } 247 + 248 + static inline bool rfkill_set_sw_state(struct rfkill *rfkill, bool blocked) 249 + { 250 + return blocked; 251 + } 252 + 253 + static inline void rfkill_set_states(struct rfkill *rfkill, bool sw, bool hw) 254 + { 255 + } 256 + 257 + static inline void rfkill_set_global_sw_state(const enum rfkill_type type, 258 + bool blocked) 259 + { 260 + } 261 + #endif /* RFKILL || RFKILL_MODULE */ 262 + 263 + 264 + #ifdef CONFIG_RFKILL_LEDS 265 + /** 266 + * rfkill_get_led_trigger_name - Get the LED trigger name for the button's LED. 267 + * This function might return a NULL pointer if registering of the 268 + * LED trigger failed. Use this as "default_trigger" for the LED. 269 + */ 270 + const char *rfkill_get_led_trigger_name(struct rfkill *rfkill); 271 + 272 + /** 273 + * rfkill_set_led_trigger_name -- set the LED trigger name 274 + * @rfkill: rfkill struct 275 + * @name: LED trigger name 276 + * 277 + * This function sets the LED trigger name of the radio LED 278 + * trigger that rfkill creates. It is optional, but if called 279 + * must be called before rfkill_register() to be effective. 280 + */ 281 + void rfkill_set_led_trigger_name(struct rfkill *rfkill, const char *name); 282 + #else 283 + static inline const char *rfkill_get_led_trigger_name(struct rfkill *rfkill) 284 + { 285 + return NULL; 286 + } 287 + 288 + static inline void 289 + rfkill_set_led_trigger_name(struct rfkill *rfkill, const char *name) 290 + { 291 + } 292 + #endif 293 + 294 + #endif /* __KERNEL__ */ 156 295 157 296 #endif /* RFKILL_H */
+2 -6
include/net/wimax.h
··· 253 253 struct net_device; 254 254 struct genl_info; 255 255 struct wimax_dev; 256 - struct input_dev; 257 256 258 257 /** 259 258 * struct wimax_dev - Generic WiMAX device ··· 292 293 * See wimax_reset()'s documentation. 293 294 * 294 295 * @name: [fill] A way to identify this device. We need to register a 295 - * name with many subsystems (input for RFKILL, workqueue 296 - * creation, etc). We can't use the network device name as that 296 + * name with many subsystems (rfkill, workqueue creation, etc). 297 + * We can't use the network device name as that 297 298 * might change and in some instances we don't know it yet (until 298 299 * we don't call register_netdev()). So we generate an unique one 299 300 * using the driver name and device bus id, place it here and use ··· 314 315 * @state: [private] Current state of the WiMAX device. 315 316 * 316 317 * @rfkill: [private] integration into the RF-Kill infrastructure. 317 - * 318 - * @rfkill_input: [private] virtual input device to process the 319 - * hardware RF Kill switches. 320 318 * 321 319 * @rf_sw: [private] State of the software radio switch (OFF/ON) 322 320 *
+7 -14
net/rfkill/Kconfig
··· 10 10 To compile this driver as a module, choose M here: the 11 11 module will be called rfkill. 12 12 13 - config RFKILL_INPUT 14 - tristate "Input layer to RF switch connector" 15 - depends on RFKILL && INPUT 16 - help 17 - Say Y here if you want kernel automatically toggle state 18 - of RF switches on and off when user presses appropriate 19 - button or a key on the keyboard. Without this module you 20 - need a some kind of userspace application to control 21 - state of the switches. 22 - 23 - To compile this driver as a module, choose M here: the 24 - module will be called rfkill-input. 25 - 26 13 # LED trigger support 27 14 config RFKILL_LEDS 28 15 bool 29 - depends on RFKILL && LEDS_TRIGGERS 16 + depends on RFKILL 17 + depends on LEDS_TRIGGERS = y || RFKILL = LEDS_TRIGGERS 30 18 default y 31 19 20 + config RFKILL_INPUT 21 + bool 22 + depends on RFKILL 23 + depends on INPUT = y || RFKILL = INPUT 24 + default y
+3 -2
net/rfkill/Makefile
··· 2 2 # Makefile for the RF switch subsystem. 3 3 # 4 4 5 - obj-$(CONFIG_RFKILL) += rfkill.o 6 - obj-$(CONFIG_RFKILL_INPUT) += rfkill-input.o 5 + rfkill-y += core.o 6 + rfkill-$(CONFIG_RFKILL_INPUT) += input.o 7 + obj-$(CONFIG_RFKILL) += rfkill.o
+896
net/rfkill/core.c
··· 1 + /* 2 + * Copyright (C) 2006 - 2007 Ivo van Doorn 3 + * Copyright (C) 2007 Dmitry Torokhov 4 + * Copyright 2009 Johannes Berg <johannes@sipsolutions.net> 5 + * 6 + * This program is free software; you can redistribute it and/or modify 7 + * it under the terms of the GNU General Public License as published by 8 + * the Free Software Foundation; either version 2 of the License, or 9 + * (at your option) any later version. 10 + * 11 + * This program is distributed in the hope that it will be useful, 12 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 + * GNU General Public License for more details. 15 + * 16 + * You should have received a copy of the GNU General Public License 17 + * along with this program; if not, write to the 18 + * Free Software Foundation, Inc., 19 + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 20 + */ 21 + 22 + #include <linux/kernel.h> 23 + #include <linux/module.h> 24 + #include <linux/init.h> 25 + #include <linux/workqueue.h> 26 + #include <linux/capability.h> 27 + #include <linux/list.h> 28 + #include <linux/mutex.h> 29 + #include <linux/rfkill.h> 30 + #include <linux/spinlock.h> 31 + 32 + #include "rfkill.h" 33 + 34 + #define POLL_INTERVAL (5 * HZ) 35 + 36 + #define RFKILL_BLOCK_HW BIT(0) 37 + #define RFKILL_BLOCK_SW BIT(1) 38 + #define RFKILL_BLOCK_SW_PREV BIT(2) 39 + #define RFKILL_BLOCK_ANY (RFKILL_BLOCK_HW |\ 40 + RFKILL_BLOCK_SW |\ 41 + RFKILL_BLOCK_SW_PREV) 42 + #define RFKILL_BLOCK_SW_SETCALL BIT(31) 43 + 44 + struct rfkill { 45 + spinlock_t lock; 46 + 47 + const char *name; 48 + enum rfkill_type type; 49 + 50 + unsigned long state; 51 + 52 + bool registered; 53 + bool suspended; 54 + 55 + const struct rfkill_ops *ops; 56 + void *data; 57 + 58 + #ifdef CONFIG_RFKILL_LEDS 59 + struct led_trigger led_trigger; 60 + const char *ledtrigname; 61 + #endif 62 + 63 + struct device dev; 64 + struct list_head node; 65 + 66 + struct delayed_work poll_work; 67 + struct work_struct uevent_work; 68 + struct work_struct sync_work; 69 + }; 70 + #define to_rfkill(d) container_of(d, struct rfkill, dev) 71 + 72 + 73 + 74 + MODULE_AUTHOR("Ivo van Doorn <IvDoorn@gmail.com>"); 75 + MODULE_AUTHOR("Johannes Berg <johannes@sipsolutions.net>"); 76 + MODULE_DESCRIPTION("RF switch support"); 77 + MODULE_LICENSE("GPL"); 78 + 79 + 80 + /* 81 + * The locking here should be made much smarter, we currently have 82 + * a bit of a stupid situation because drivers might want to register 83 + * the rfkill struct under their own lock, and take this lock during 84 + * rfkill method calls -- which will cause an AB-BA deadlock situation. 85 + * 86 + * To fix that, we need to rework this code here to be mostly lock-free 87 + * and only use the mutex for list manipulations, not to protect the 88 + * various other global variables. Then we can avoid holding the mutex 89 + * around driver operations, and all is happy. 90 + */ 91 + static LIST_HEAD(rfkill_list); /* list of registered rf switches */ 92 + static DEFINE_MUTEX(rfkill_global_mutex); 93 + 94 + static unsigned int rfkill_default_state = 1; 95 + module_param_named(default_state, rfkill_default_state, uint, 0444); 96 + MODULE_PARM_DESC(default_state, 97 + "Default initial state for all radio types, 0 = radio off"); 98 + 99 + static struct { 100 + bool cur, def; 101 + } rfkill_global_states[NUM_RFKILL_TYPES]; 102 + 103 + static unsigned long rfkill_states_default_locked; 104 + 105 + static bool rfkill_epo_lock_active; 106 + 107 + 108 + #ifdef CONFIG_RFKILL_LEDS 109 + static void rfkill_led_trigger_event(struct rfkill *rfkill) 110 + { 111 + struct led_trigger *trigger; 112 + 113 + if (!rfkill->registered) 114 + return; 115 + 116 + trigger = &rfkill->led_trigger; 117 + 118 + if (rfkill->state & RFKILL_BLOCK_ANY) 119 + led_trigger_event(trigger, LED_OFF); 120 + else 121 + led_trigger_event(trigger, LED_FULL); 122 + } 123 + 124 + static void rfkill_led_trigger_activate(struct led_classdev *led) 125 + { 126 + struct rfkill *rfkill; 127 + 128 + rfkill = container_of(led->trigger, struct rfkill, led_trigger); 129 + 130 + rfkill_led_trigger_event(rfkill); 131 + } 132 + 133 + const char *rfkill_get_led_trigger_name(struct rfkill *rfkill) 134 + { 135 + return rfkill->led_trigger.name; 136 + } 137 + EXPORT_SYMBOL(rfkill_get_led_trigger_name); 138 + 139 + void rfkill_set_led_trigger_name(struct rfkill *rfkill, const char *name) 140 + { 141 + BUG_ON(!rfkill); 142 + 143 + rfkill->ledtrigname = name; 144 + } 145 + EXPORT_SYMBOL(rfkill_set_led_trigger_name); 146 + 147 + static int rfkill_led_trigger_register(struct rfkill *rfkill) 148 + { 149 + rfkill->led_trigger.name = rfkill->ledtrigname 150 + ? : dev_name(&rfkill->dev); 151 + rfkill->led_trigger.activate = rfkill_led_trigger_activate; 152 + return led_trigger_register(&rfkill->led_trigger); 153 + } 154 + 155 + static void rfkill_led_trigger_unregister(struct rfkill *rfkill) 156 + { 157 + led_trigger_unregister(&rfkill->led_trigger); 158 + } 159 + #else 160 + static void rfkill_led_trigger_event(struct rfkill *rfkill) 161 + { 162 + } 163 + 164 + static inline int rfkill_led_trigger_register(struct rfkill *rfkill) 165 + { 166 + return 0; 167 + } 168 + 169 + static inline void rfkill_led_trigger_unregister(struct rfkill *rfkill) 170 + { 171 + } 172 + #endif /* CONFIG_RFKILL_LEDS */ 173 + 174 + static void rfkill_uevent(struct rfkill *rfkill) 175 + { 176 + if (!rfkill->registered || rfkill->suspended) 177 + return; 178 + 179 + kobject_uevent(&rfkill->dev.kobj, KOBJ_CHANGE); 180 + } 181 + 182 + static bool __rfkill_set_hw_state(struct rfkill *rfkill, 183 + bool blocked, bool *change) 184 + { 185 + unsigned long flags; 186 + bool prev, any; 187 + 188 + BUG_ON(!rfkill); 189 + 190 + spin_lock_irqsave(&rfkill->lock, flags); 191 + prev = !!(rfkill->state & RFKILL_BLOCK_HW); 192 + if (blocked) 193 + rfkill->state |= RFKILL_BLOCK_HW; 194 + else 195 + rfkill->state &= ~RFKILL_BLOCK_HW; 196 + *change = prev != blocked; 197 + any = rfkill->state & RFKILL_BLOCK_ANY; 198 + spin_unlock_irqrestore(&rfkill->lock, flags); 199 + 200 + rfkill_led_trigger_event(rfkill); 201 + 202 + return any; 203 + } 204 + 205 + /** 206 + * rfkill_set_block - wrapper for set_block method 207 + * 208 + * @rfkill: the rfkill struct to use 209 + * @blocked: the new software state 210 + * 211 + * Calls the set_block method (when applicable) and handles notifications 212 + * etc. as well. 213 + */ 214 + static void rfkill_set_block(struct rfkill *rfkill, bool blocked) 215 + { 216 + unsigned long flags; 217 + int err; 218 + 219 + /* 220 + * Some platforms (...!) generate input events which affect the 221 + * _hard_ kill state -- whenever something tries to change the 222 + * current software state query the hardware state too. 223 + */ 224 + if (rfkill->ops->query) 225 + rfkill->ops->query(rfkill, rfkill->data); 226 + 227 + spin_lock_irqsave(&rfkill->lock, flags); 228 + if (rfkill->state & RFKILL_BLOCK_SW) 229 + rfkill->state |= RFKILL_BLOCK_SW_PREV; 230 + else 231 + rfkill->state &= ~RFKILL_BLOCK_SW_PREV; 232 + 233 + if (blocked) 234 + rfkill->state |= RFKILL_BLOCK_SW; 235 + else 236 + rfkill->state &= ~RFKILL_BLOCK_SW; 237 + 238 + rfkill->state |= RFKILL_BLOCK_SW_SETCALL; 239 + spin_unlock_irqrestore(&rfkill->lock, flags); 240 + 241 + if (unlikely(rfkill->dev.power.power_state.event & PM_EVENT_SLEEP)) 242 + return; 243 + 244 + err = rfkill->ops->set_block(rfkill->data, blocked); 245 + 246 + spin_lock_irqsave(&rfkill->lock, flags); 247 + if (err) { 248 + /* 249 + * Failed -- reset status to _prev, this may be different 250 + * from what set set _PREV to earlier in this function 251 + * if rfkill_set_sw_state was invoked. 252 + */ 253 + if (rfkill->state & RFKILL_BLOCK_SW_PREV) 254 + rfkill->state |= RFKILL_BLOCK_SW; 255 + else 256 + rfkill->state &= ~RFKILL_BLOCK_SW; 257 + } 258 + rfkill->state &= ~RFKILL_BLOCK_SW_SETCALL; 259 + rfkill->state &= ~RFKILL_BLOCK_SW_PREV; 260 + spin_unlock_irqrestore(&rfkill->lock, flags); 261 + 262 + rfkill_led_trigger_event(rfkill); 263 + rfkill_uevent(rfkill); 264 + } 265 + 266 + /** 267 + * __rfkill_switch_all - Toggle state of all switches of given type 268 + * @type: type of interfaces to be affected 269 + * @state: the new state 270 + * 271 + * This function sets the state of all switches of given type, 272 + * unless a specific switch is claimed by userspace (in which case, 273 + * that switch is left alone) or suspended. 274 + * 275 + * Caller must have acquired rfkill_global_mutex. 276 + */ 277 + static void __rfkill_switch_all(const enum rfkill_type type, bool blocked) 278 + { 279 + struct rfkill *rfkill; 280 + 281 + rfkill_global_states[type].cur = blocked; 282 + list_for_each_entry(rfkill, &rfkill_list, node) { 283 + if (rfkill->type != type) 284 + continue; 285 + 286 + rfkill_set_block(rfkill, blocked); 287 + } 288 + } 289 + 290 + /** 291 + * rfkill_switch_all - Toggle state of all switches of given type 292 + * @type: type of interfaces to be affected 293 + * @state: the new state 294 + * 295 + * Acquires rfkill_global_mutex and calls __rfkill_switch_all(@type, @state). 296 + * Please refer to __rfkill_switch_all() for details. 297 + * 298 + * Does nothing if the EPO lock is active. 299 + */ 300 + void rfkill_switch_all(enum rfkill_type type, bool blocked) 301 + { 302 + mutex_lock(&rfkill_global_mutex); 303 + 304 + if (!rfkill_epo_lock_active) 305 + __rfkill_switch_all(type, blocked); 306 + 307 + mutex_unlock(&rfkill_global_mutex); 308 + } 309 + 310 + /** 311 + * rfkill_epo - emergency power off all transmitters 312 + * 313 + * This kicks all non-suspended rfkill devices to RFKILL_STATE_SOFT_BLOCKED, 314 + * ignoring everything in its path but rfkill_global_mutex and rfkill->mutex. 315 + * 316 + * The global state before the EPO is saved and can be restored later 317 + * using rfkill_restore_states(). 318 + */ 319 + void rfkill_epo(void) 320 + { 321 + struct rfkill *rfkill; 322 + int i; 323 + 324 + mutex_lock(&rfkill_global_mutex); 325 + 326 + rfkill_epo_lock_active = true; 327 + list_for_each_entry(rfkill, &rfkill_list, node) 328 + rfkill_set_block(rfkill, true); 329 + 330 + for (i = 0; i < NUM_RFKILL_TYPES; i++) { 331 + rfkill_global_states[i].def = rfkill_global_states[i].cur; 332 + rfkill_global_states[i].cur = true; 333 + } 334 + mutex_unlock(&rfkill_global_mutex); 335 + } 336 + 337 + /** 338 + * rfkill_restore_states - restore global states 339 + * 340 + * Restore (and sync switches to) the global state from the 341 + * states in rfkill_default_states. This can undo the effects of 342 + * a call to rfkill_epo(). 343 + */ 344 + void rfkill_restore_states(void) 345 + { 346 + int i; 347 + 348 + mutex_lock(&rfkill_global_mutex); 349 + 350 + rfkill_epo_lock_active = false; 351 + for (i = 0; i < NUM_RFKILL_TYPES; i++) 352 + __rfkill_switch_all(i, rfkill_global_states[i].def); 353 + mutex_unlock(&rfkill_global_mutex); 354 + } 355 + 356 + /** 357 + * rfkill_remove_epo_lock - unlock state changes 358 + * 359 + * Used by rfkill-input manually unlock state changes, when 360 + * the EPO switch is deactivated. 361 + */ 362 + void rfkill_remove_epo_lock(void) 363 + { 364 + mutex_lock(&rfkill_global_mutex); 365 + rfkill_epo_lock_active = false; 366 + mutex_unlock(&rfkill_global_mutex); 367 + } 368 + 369 + /** 370 + * rfkill_is_epo_lock_active - returns true EPO is active 371 + * 372 + * Returns 0 (false) if there is NOT an active EPO contidion, 373 + * and 1 (true) if there is an active EPO contition, which 374 + * locks all radios in one of the BLOCKED states. 375 + * 376 + * Can be called in atomic context. 377 + */ 378 + bool rfkill_is_epo_lock_active(void) 379 + { 380 + return rfkill_epo_lock_active; 381 + } 382 + 383 + /** 384 + * rfkill_get_global_sw_state - returns global state for a type 385 + * @type: the type to get the global state of 386 + * 387 + * Returns the current global state for a given wireless 388 + * device type. 389 + */ 390 + bool rfkill_get_global_sw_state(const enum rfkill_type type) 391 + { 392 + return rfkill_global_states[type].cur; 393 + } 394 + 395 + void rfkill_set_global_sw_state(const enum rfkill_type type, bool blocked) 396 + { 397 + mutex_lock(&rfkill_global_mutex); 398 + 399 + /* don't allow unblock when epo */ 400 + if (rfkill_epo_lock_active && !blocked) 401 + goto out; 402 + 403 + /* too late */ 404 + if (rfkill_states_default_locked & BIT(type)) 405 + goto out; 406 + 407 + rfkill_states_default_locked |= BIT(type); 408 + 409 + rfkill_global_states[type].cur = blocked; 410 + rfkill_global_states[type].def = blocked; 411 + out: 412 + mutex_unlock(&rfkill_global_mutex); 413 + } 414 + EXPORT_SYMBOL(rfkill_set_global_sw_state); 415 + 416 + 417 + bool rfkill_set_hw_state(struct rfkill *rfkill, bool blocked) 418 + { 419 + bool ret, change; 420 + 421 + ret = __rfkill_set_hw_state(rfkill, blocked, &change); 422 + 423 + if (!rfkill->registered) 424 + return ret; 425 + 426 + if (change) 427 + schedule_work(&rfkill->uevent_work); 428 + 429 + return ret; 430 + } 431 + EXPORT_SYMBOL(rfkill_set_hw_state); 432 + 433 + static void __rfkill_set_sw_state(struct rfkill *rfkill, bool blocked) 434 + { 435 + u32 bit = RFKILL_BLOCK_SW; 436 + 437 + /* if in a ops->set_block right now, use other bit */ 438 + if (rfkill->state & RFKILL_BLOCK_SW_SETCALL) 439 + bit = RFKILL_BLOCK_SW_PREV; 440 + 441 + if (blocked) 442 + rfkill->state |= bit; 443 + else 444 + rfkill->state &= ~bit; 445 + } 446 + 447 + bool rfkill_set_sw_state(struct rfkill *rfkill, bool blocked) 448 + { 449 + unsigned long flags; 450 + bool prev, hwblock; 451 + 452 + BUG_ON(!rfkill); 453 + 454 + spin_lock_irqsave(&rfkill->lock, flags); 455 + prev = !!(rfkill->state & RFKILL_BLOCK_SW); 456 + __rfkill_set_sw_state(rfkill, blocked); 457 + hwblock = !!(rfkill->state & RFKILL_BLOCK_HW); 458 + blocked = blocked || hwblock; 459 + spin_unlock_irqrestore(&rfkill->lock, flags); 460 + 461 + if (!rfkill->registered) 462 + return blocked; 463 + 464 + if (prev != blocked && !hwblock) 465 + schedule_work(&rfkill->uevent_work); 466 + 467 + rfkill_led_trigger_event(rfkill); 468 + 469 + return blocked; 470 + } 471 + EXPORT_SYMBOL(rfkill_set_sw_state); 472 + 473 + void rfkill_set_states(struct rfkill *rfkill, bool sw, bool hw) 474 + { 475 + unsigned long flags; 476 + bool swprev, hwprev; 477 + 478 + BUG_ON(!rfkill); 479 + 480 + spin_lock_irqsave(&rfkill->lock, flags); 481 + 482 + /* 483 + * No need to care about prev/setblock ... this is for uevent only 484 + * and that will get triggered by rfkill_set_block anyway. 485 + */ 486 + swprev = !!(rfkill->state & RFKILL_BLOCK_SW); 487 + hwprev = !!(rfkill->state & RFKILL_BLOCK_HW); 488 + __rfkill_set_sw_state(rfkill, sw); 489 + 490 + spin_unlock_irqrestore(&rfkill->lock, flags); 491 + 492 + if (!rfkill->registered) 493 + return; 494 + 495 + if (swprev != sw || hwprev != hw) 496 + schedule_work(&rfkill->uevent_work); 497 + 498 + rfkill_led_trigger_event(rfkill); 499 + } 500 + EXPORT_SYMBOL(rfkill_set_states); 501 + 502 + static ssize_t rfkill_name_show(struct device *dev, 503 + struct device_attribute *attr, 504 + char *buf) 505 + { 506 + struct rfkill *rfkill = to_rfkill(dev); 507 + 508 + return sprintf(buf, "%s\n", rfkill->name); 509 + } 510 + 511 + static const char *rfkill_get_type_str(enum rfkill_type type) 512 + { 513 + switch (type) { 514 + case RFKILL_TYPE_WLAN: 515 + return "wlan"; 516 + case RFKILL_TYPE_BLUETOOTH: 517 + return "bluetooth"; 518 + case RFKILL_TYPE_UWB: 519 + return "ultrawideband"; 520 + case RFKILL_TYPE_WIMAX: 521 + return "wimax"; 522 + case RFKILL_TYPE_WWAN: 523 + return "wwan"; 524 + default: 525 + BUG(); 526 + } 527 + 528 + BUILD_BUG_ON(NUM_RFKILL_TYPES != RFKILL_TYPE_WWAN + 1); 529 + } 530 + 531 + static ssize_t rfkill_type_show(struct device *dev, 532 + struct device_attribute *attr, 533 + char *buf) 534 + { 535 + struct rfkill *rfkill = to_rfkill(dev); 536 + 537 + return sprintf(buf, "%s\n", rfkill_get_type_str(rfkill->type)); 538 + } 539 + 540 + static u8 user_state_from_blocked(unsigned long state) 541 + { 542 + if (state & RFKILL_BLOCK_HW) 543 + return RFKILL_USER_STATE_HARD_BLOCKED; 544 + if (state & RFKILL_BLOCK_SW) 545 + return RFKILL_USER_STATE_SOFT_BLOCKED; 546 + 547 + return RFKILL_USER_STATE_UNBLOCKED; 548 + } 549 + 550 + static ssize_t rfkill_state_show(struct device *dev, 551 + struct device_attribute *attr, 552 + char *buf) 553 + { 554 + struct rfkill *rfkill = to_rfkill(dev); 555 + unsigned long flags; 556 + u32 state; 557 + 558 + spin_lock_irqsave(&rfkill->lock, flags); 559 + state = rfkill->state; 560 + spin_unlock_irqrestore(&rfkill->lock, flags); 561 + 562 + return sprintf(buf, "%d\n", user_state_from_blocked(state)); 563 + } 564 + 565 + static ssize_t rfkill_state_store(struct device *dev, 566 + struct device_attribute *attr, 567 + const char *buf, size_t count) 568 + { 569 + /* 570 + * The intention was that userspace can only take control over 571 + * a given device when/if rfkill-input doesn't control it due 572 + * to user_claim. Since user_claim is currently unsupported, 573 + * we never support changing the state from userspace -- this 574 + * can be implemented again later. 575 + */ 576 + 577 + return -EPERM; 578 + } 579 + 580 + static ssize_t rfkill_claim_show(struct device *dev, 581 + struct device_attribute *attr, 582 + char *buf) 583 + { 584 + return sprintf(buf, "%d\n", 0); 585 + } 586 + 587 + static ssize_t rfkill_claim_store(struct device *dev, 588 + struct device_attribute *attr, 589 + const char *buf, size_t count) 590 + { 591 + return -EOPNOTSUPP; 592 + } 593 + 594 + static struct device_attribute rfkill_dev_attrs[] = { 595 + __ATTR(name, S_IRUGO, rfkill_name_show, NULL), 596 + __ATTR(type, S_IRUGO, rfkill_type_show, NULL), 597 + __ATTR(state, S_IRUGO|S_IWUSR, rfkill_state_show, rfkill_state_store), 598 + __ATTR(claim, S_IRUGO|S_IWUSR, rfkill_claim_show, rfkill_claim_store), 599 + __ATTR_NULL 600 + }; 601 + 602 + static void rfkill_release(struct device *dev) 603 + { 604 + struct rfkill *rfkill = to_rfkill(dev); 605 + 606 + kfree(rfkill); 607 + } 608 + 609 + static int rfkill_dev_uevent(struct device *dev, struct kobj_uevent_env *env) 610 + { 611 + struct rfkill *rfkill = to_rfkill(dev); 612 + unsigned long flags; 613 + u32 state; 614 + int error; 615 + 616 + error = add_uevent_var(env, "RFKILL_NAME=%s", rfkill->name); 617 + if (error) 618 + return error; 619 + error = add_uevent_var(env, "RFKILL_TYPE=%s", 620 + rfkill_get_type_str(rfkill->type)); 621 + if (error) 622 + return error; 623 + spin_lock_irqsave(&rfkill->lock, flags); 624 + state = rfkill->state; 625 + spin_unlock_irqrestore(&rfkill->lock, flags); 626 + error = add_uevent_var(env, "RFKILL_STATE=%d", 627 + user_state_from_blocked(state)); 628 + return error; 629 + } 630 + 631 + void rfkill_pause_polling(struct rfkill *rfkill) 632 + { 633 + BUG_ON(!rfkill); 634 + 635 + if (!rfkill->ops->poll) 636 + return; 637 + 638 + cancel_delayed_work_sync(&rfkill->poll_work); 639 + } 640 + EXPORT_SYMBOL(rfkill_pause_polling); 641 + 642 + void rfkill_resume_polling(struct rfkill *rfkill) 643 + { 644 + BUG_ON(!rfkill); 645 + 646 + if (!rfkill->ops->poll) 647 + return; 648 + 649 + schedule_work(&rfkill->poll_work.work); 650 + } 651 + EXPORT_SYMBOL(rfkill_resume_polling); 652 + 653 + static int rfkill_suspend(struct device *dev, pm_message_t state) 654 + { 655 + struct rfkill *rfkill = to_rfkill(dev); 656 + 657 + rfkill_pause_polling(rfkill); 658 + 659 + rfkill->suspended = true; 660 + 661 + return 0; 662 + } 663 + 664 + static int rfkill_resume(struct device *dev) 665 + { 666 + struct rfkill *rfkill = to_rfkill(dev); 667 + bool cur; 668 + 669 + mutex_lock(&rfkill_global_mutex); 670 + cur = rfkill_global_states[rfkill->type].cur; 671 + rfkill_set_block(rfkill, cur); 672 + mutex_unlock(&rfkill_global_mutex); 673 + 674 + rfkill->suspended = false; 675 + 676 + schedule_work(&rfkill->uevent_work); 677 + 678 + rfkill_resume_polling(rfkill); 679 + 680 + return 0; 681 + } 682 + 683 + static struct class rfkill_class = { 684 + .name = "rfkill", 685 + .dev_release = rfkill_release, 686 + .dev_attrs = rfkill_dev_attrs, 687 + .dev_uevent = rfkill_dev_uevent, 688 + .suspend = rfkill_suspend, 689 + .resume = rfkill_resume, 690 + }; 691 + 692 + 693 + struct rfkill * __must_check rfkill_alloc(const char *name, 694 + struct device *parent, 695 + const enum rfkill_type type, 696 + const struct rfkill_ops *ops, 697 + void *ops_data) 698 + { 699 + struct rfkill *rfkill; 700 + struct device *dev; 701 + 702 + if (WARN_ON(!ops)) 703 + return NULL; 704 + 705 + if (WARN_ON(!ops->set_block)) 706 + return NULL; 707 + 708 + if (WARN_ON(!name)) 709 + return NULL; 710 + 711 + if (WARN_ON(type >= NUM_RFKILL_TYPES)) 712 + return NULL; 713 + 714 + rfkill = kzalloc(sizeof(*rfkill), GFP_KERNEL); 715 + if (!rfkill) 716 + return NULL; 717 + 718 + spin_lock_init(&rfkill->lock); 719 + INIT_LIST_HEAD(&rfkill->node); 720 + rfkill->type = type; 721 + rfkill->name = name; 722 + rfkill->ops = ops; 723 + rfkill->data = ops_data; 724 + 725 + dev = &rfkill->dev; 726 + dev->class = &rfkill_class; 727 + dev->parent = parent; 728 + device_initialize(dev); 729 + 730 + return rfkill; 731 + } 732 + EXPORT_SYMBOL(rfkill_alloc); 733 + 734 + static void rfkill_poll(struct work_struct *work) 735 + { 736 + struct rfkill *rfkill; 737 + 738 + rfkill = container_of(work, struct rfkill, poll_work.work); 739 + 740 + /* 741 + * Poll hardware state -- driver will use one of the 742 + * rfkill_set{,_hw,_sw}_state functions and use its 743 + * return value to update the current status. 744 + */ 745 + rfkill->ops->poll(rfkill, rfkill->data); 746 + 747 + schedule_delayed_work(&rfkill->poll_work, 748 + round_jiffies_relative(POLL_INTERVAL)); 749 + } 750 + 751 + static void rfkill_uevent_work(struct work_struct *work) 752 + { 753 + struct rfkill *rfkill; 754 + 755 + rfkill = container_of(work, struct rfkill, uevent_work); 756 + 757 + rfkill_uevent(rfkill); 758 + } 759 + 760 + static void rfkill_sync_work(struct work_struct *work) 761 + { 762 + struct rfkill *rfkill; 763 + bool cur; 764 + 765 + rfkill = container_of(work, struct rfkill, sync_work); 766 + 767 + mutex_lock(&rfkill_global_mutex); 768 + cur = rfkill_global_states[rfkill->type].cur; 769 + rfkill_set_block(rfkill, cur); 770 + mutex_unlock(&rfkill_global_mutex); 771 + } 772 + 773 + int __must_check rfkill_register(struct rfkill *rfkill) 774 + { 775 + static unsigned long rfkill_no; 776 + struct device *dev = &rfkill->dev; 777 + int error; 778 + 779 + BUG_ON(!rfkill); 780 + 781 + mutex_lock(&rfkill_global_mutex); 782 + 783 + if (rfkill->registered) { 784 + error = -EALREADY; 785 + goto unlock; 786 + } 787 + 788 + dev_set_name(dev, "rfkill%lu", rfkill_no); 789 + rfkill_no++; 790 + 791 + if (!(rfkill_states_default_locked & BIT(rfkill->type))) { 792 + /* first of its kind */ 793 + BUILD_BUG_ON(NUM_RFKILL_TYPES > 794 + sizeof(rfkill_states_default_locked) * 8); 795 + rfkill_states_default_locked |= BIT(rfkill->type); 796 + rfkill_global_states[rfkill->type].cur = 797 + rfkill_global_states[rfkill->type].def; 798 + } 799 + 800 + list_add_tail(&rfkill->node, &rfkill_list); 801 + 802 + error = device_add(dev); 803 + if (error) 804 + goto remove; 805 + 806 + error = rfkill_led_trigger_register(rfkill); 807 + if (error) 808 + goto devdel; 809 + 810 + rfkill->registered = true; 811 + 812 + if (rfkill->ops->poll) { 813 + INIT_DELAYED_WORK(&rfkill->poll_work, rfkill_poll); 814 + schedule_delayed_work(&rfkill->poll_work, 815 + round_jiffies_relative(POLL_INTERVAL)); 816 + } 817 + 818 + INIT_WORK(&rfkill->uevent_work, rfkill_uevent_work); 819 + 820 + INIT_WORK(&rfkill->sync_work, rfkill_sync_work); 821 + schedule_work(&rfkill->sync_work); 822 + 823 + mutex_unlock(&rfkill_global_mutex); 824 + return 0; 825 + 826 + devdel: 827 + device_del(&rfkill->dev); 828 + remove: 829 + list_del_init(&rfkill->node); 830 + unlock: 831 + mutex_unlock(&rfkill_global_mutex); 832 + return error; 833 + } 834 + EXPORT_SYMBOL(rfkill_register); 835 + 836 + void rfkill_unregister(struct rfkill *rfkill) 837 + { 838 + BUG_ON(!rfkill); 839 + 840 + if (rfkill->ops->poll) 841 + cancel_delayed_work_sync(&rfkill->poll_work); 842 + 843 + cancel_work_sync(&rfkill->uevent_work); 844 + cancel_work_sync(&rfkill->sync_work); 845 + 846 + rfkill->registered = false; 847 + 848 + device_del(&rfkill->dev); 849 + 850 + mutex_lock(&rfkill_global_mutex); 851 + list_del_init(&rfkill->node); 852 + mutex_unlock(&rfkill_global_mutex); 853 + 854 + rfkill_led_trigger_unregister(rfkill); 855 + } 856 + EXPORT_SYMBOL(rfkill_unregister); 857 + 858 + void rfkill_destroy(struct rfkill *rfkill) 859 + { 860 + if (rfkill) 861 + put_device(&rfkill->dev); 862 + } 863 + EXPORT_SYMBOL(rfkill_destroy); 864 + 865 + 866 + static int __init rfkill_init(void) 867 + { 868 + int error; 869 + int i; 870 + 871 + for (i = 0; i < NUM_RFKILL_TYPES; i++) 872 + rfkill_global_states[i].def = !rfkill_default_state; 873 + 874 + error = class_register(&rfkill_class); 875 + if (error) 876 + goto out; 877 + 878 + #ifdef CONFIG_RFKILL_INPUT 879 + error = rfkill_handler_init(); 880 + if (error) 881 + class_unregister(&rfkill_class); 882 + #endif 883 + 884 + out: 885 + return error; 886 + } 887 + subsys_initcall(rfkill_init); 888 + 889 + static void __exit rfkill_exit(void) 890 + { 891 + #ifdef CONFIG_RFKILL_INPUT 892 + rfkill_handler_exit(); 893 + #endif 894 + class_unregister(&rfkill_class); 895 + } 896 + module_exit(rfkill_exit);
+342
net/rfkill/input.c
··· 1 + /* 2 + * Input layer to RF Kill interface connector 3 + * 4 + * Copyright (c) 2007 Dmitry Torokhov 5 + * Copyright 2009 Johannes Berg <johannes@sipsolutions.net> 6 + * 7 + * This program is free software; you can redistribute it and/or modify it 8 + * under the terms of the GNU General Public License version 2 as published 9 + * by the Free Software Foundation. 10 + * 11 + * If you ever run into a situation in which you have a SW_ type rfkill 12 + * input device, then you can revive code that was removed in the patch 13 + * "rfkill-input: remove unused code". 14 + */ 15 + 16 + #include <linux/input.h> 17 + #include <linux/slab.h> 18 + #include <linux/workqueue.h> 19 + #include <linux/init.h> 20 + #include <linux/rfkill.h> 21 + #include <linux/sched.h> 22 + 23 + #include "rfkill.h" 24 + 25 + enum rfkill_input_master_mode { 26 + RFKILL_INPUT_MASTER_UNLOCK = 0, 27 + RFKILL_INPUT_MASTER_RESTORE = 1, 28 + RFKILL_INPUT_MASTER_UNBLOCKALL = 2, 29 + NUM_RFKILL_INPUT_MASTER_MODES 30 + }; 31 + 32 + /* Delay (in ms) between consecutive switch ops */ 33 + #define RFKILL_OPS_DELAY 200 34 + 35 + static enum rfkill_input_master_mode rfkill_master_switch_mode = 36 + RFKILL_INPUT_MASTER_UNBLOCKALL; 37 + module_param_named(master_switch_mode, rfkill_master_switch_mode, uint, 0); 38 + MODULE_PARM_DESC(master_switch_mode, 39 + "SW_RFKILL_ALL ON should: 0=do nothing (only unlock); 1=restore; 2=unblock all"); 40 + 41 + static spinlock_t rfkill_op_lock; 42 + static bool rfkill_op_pending; 43 + static unsigned long rfkill_sw_pending[BITS_TO_LONGS(NUM_RFKILL_TYPES)]; 44 + static unsigned long rfkill_sw_state[BITS_TO_LONGS(NUM_RFKILL_TYPES)]; 45 + 46 + enum rfkill_sched_op { 47 + RFKILL_GLOBAL_OP_EPO = 0, 48 + RFKILL_GLOBAL_OP_RESTORE, 49 + RFKILL_GLOBAL_OP_UNLOCK, 50 + RFKILL_GLOBAL_OP_UNBLOCK, 51 + }; 52 + 53 + static enum rfkill_sched_op rfkill_master_switch_op; 54 + static enum rfkill_sched_op rfkill_op; 55 + 56 + static void __rfkill_handle_global_op(enum rfkill_sched_op op) 57 + { 58 + unsigned int i; 59 + 60 + switch (op) { 61 + case RFKILL_GLOBAL_OP_EPO: 62 + rfkill_epo(); 63 + break; 64 + case RFKILL_GLOBAL_OP_RESTORE: 65 + rfkill_restore_states(); 66 + break; 67 + case RFKILL_GLOBAL_OP_UNLOCK: 68 + rfkill_remove_epo_lock(); 69 + break; 70 + case RFKILL_GLOBAL_OP_UNBLOCK: 71 + rfkill_remove_epo_lock(); 72 + for (i = 0; i < NUM_RFKILL_TYPES; i++) 73 + rfkill_switch_all(i, false); 74 + break; 75 + default: 76 + /* memory corruption or bug, fail safely */ 77 + rfkill_epo(); 78 + WARN(1, "Unknown requested operation %d! " 79 + "rfkill Emergency Power Off activated\n", 80 + op); 81 + } 82 + } 83 + 84 + static void __rfkill_handle_normal_op(const enum rfkill_type type, 85 + const bool complement) 86 + { 87 + bool blocked; 88 + 89 + blocked = rfkill_get_global_sw_state(type); 90 + if (complement) 91 + blocked = !blocked; 92 + 93 + rfkill_switch_all(type, blocked); 94 + } 95 + 96 + static void rfkill_op_handler(struct work_struct *work) 97 + { 98 + unsigned int i; 99 + bool c; 100 + 101 + spin_lock_irq(&rfkill_op_lock); 102 + do { 103 + if (rfkill_op_pending) { 104 + enum rfkill_sched_op op = rfkill_op; 105 + rfkill_op_pending = false; 106 + memset(rfkill_sw_pending, 0, 107 + sizeof(rfkill_sw_pending)); 108 + spin_unlock_irq(&rfkill_op_lock); 109 + 110 + __rfkill_handle_global_op(op); 111 + 112 + spin_lock_irq(&rfkill_op_lock); 113 + 114 + /* 115 + * handle global ops first -- during unlocked period 116 + * we might have gotten a new global op. 117 + */ 118 + if (rfkill_op_pending) 119 + continue; 120 + } 121 + 122 + if (rfkill_is_epo_lock_active()) 123 + continue; 124 + 125 + for (i = 0; i < NUM_RFKILL_TYPES; i++) { 126 + if (__test_and_clear_bit(i, rfkill_sw_pending)) { 127 + c = __test_and_clear_bit(i, rfkill_sw_state); 128 + spin_unlock_irq(&rfkill_op_lock); 129 + 130 + __rfkill_handle_normal_op(i, c); 131 + 132 + spin_lock_irq(&rfkill_op_lock); 133 + } 134 + } 135 + } while (rfkill_op_pending); 136 + spin_unlock_irq(&rfkill_op_lock); 137 + } 138 + 139 + static DECLARE_DELAYED_WORK(rfkill_op_work, rfkill_op_handler); 140 + static unsigned long rfkill_last_scheduled; 141 + 142 + static unsigned long rfkill_ratelimit(const unsigned long last) 143 + { 144 + const unsigned long delay = msecs_to_jiffies(RFKILL_OPS_DELAY); 145 + return (time_after(jiffies, last + delay)) ? 0 : delay; 146 + } 147 + 148 + static void rfkill_schedule_ratelimited(void) 149 + { 150 + if (delayed_work_pending(&rfkill_op_work)) 151 + return; 152 + schedule_delayed_work(&rfkill_op_work, 153 + rfkill_ratelimit(rfkill_last_scheduled)); 154 + rfkill_last_scheduled = jiffies; 155 + } 156 + 157 + static void rfkill_schedule_global_op(enum rfkill_sched_op op) 158 + { 159 + unsigned long flags; 160 + 161 + spin_lock_irqsave(&rfkill_op_lock, flags); 162 + rfkill_op = op; 163 + rfkill_op_pending = true; 164 + if (op == RFKILL_GLOBAL_OP_EPO && !rfkill_is_epo_lock_active()) { 165 + /* bypass the limiter for EPO */ 166 + cancel_delayed_work(&rfkill_op_work); 167 + schedule_delayed_work(&rfkill_op_work, 0); 168 + rfkill_last_scheduled = jiffies; 169 + } else 170 + rfkill_schedule_ratelimited(); 171 + spin_unlock_irqrestore(&rfkill_op_lock, flags); 172 + } 173 + 174 + static void rfkill_schedule_toggle(enum rfkill_type type) 175 + { 176 + unsigned long flags; 177 + 178 + if (rfkill_is_epo_lock_active()) 179 + return; 180 + 181 + spin_lock_irqsave(&rfkill_op_lock, flags); 182 + if (!rfkill_op_pending) { 183 + __set_bit(type, rfkill_sw_pending); 184 + __change_bit(type, rfkill_sw_state); 185 + rfkill_schedule_ratelimited(); 186 + } 187 + spin_unlock_irqrestore(&rfkill_op_lock, flags); 188 + } 189 + 190 + static void rfkill_schedule_evsw_rfkillall(int state) 191 + { 192 + if (state) 193 + rfkill_schedule_global_op(rfkill_master_switch_op); 194 + else 195 + rfkill_schedule_global_op(RFKILL_GLOBAL_OP_EPO); 196 + } 197 + 198 + static void rfkill_event(struct input_handle *handle, unsigned int type, 199 + unsigned int code, int data) 200 + { 201 + if (type == EV_KEY && data == 1) { 202 + switch (code) { 203 + case KEY_WLAN: 204 + rfkill_schedule_toggle(RFKILL_TYPE_WLAN); 205 + break; 206 + case KEY_BLUETOOTH: 207 + rfkill_schedule_toggle(RFKILL_TYPE_BLUETOOTH); 208 + break; 209 + case KEY_UWB: 210 + rfkill_schedule_toggle(RFKILL_TYPE_UWB); 211 + break; 212 + case KEY_WIMAX: 213 + rfkill_schedule_toggle(RFKILL_TYPE_WIMAX); 214 + break; 215 + } 216 + } else if (type == EV_SW && code == SW_RFKILL_ALL) 217 + rfkill_schedule_evsw_rfkillall(data); 218 + } 219 + 220 + static int rfkill_connect(struct input_handler *handler, struct input_dev *dev, 221 + const struct input_device_id *id) 222 + { 223 + struct input_handle *handle; 224 + int error; 225 + 226 + handle = kzalloc(sizeof(struct input_handle), GFP_KERNEL); 227 + if (!handle) 228 + return -ENOMEM; 229 + 230 + handle->dev = dev; 231 + handle->handler = handler; 232 + handle->name = "rfkill"; 233 + 234 + /* causes rfkill_start() to be called */ 235 + error = input_register_handle(handle); 236 + if (error) 237 + goto err_free_handle; 238 + 239 + error = input_open_device(handle); 240 + if (error) 241 + goto err_unregister_handle; 242 + 243 + return 0; 244 + 245 + err_unregister_handle: 246 + input_unregister_handle(handle); 247 + err_free_handle: 248 + kfree(handle); 249 + return error; 250 + } 251 + 252 + static void rfkill_start(struct input_handle *handle) 253 + { 254 + /* 255 + * Take event_lock to guard against configuration changes, we 256 + * should be able to deal with concurrency with rfkill_event() 257 + * just fine (which event_lock will also avoid). 258 + */ 259 + spin_lock_irq(&handle->dev->event_lock); 260 + 261 + if (test_bit(EV_SW, handle->dev->evbit) && 262 + test_bit(SW_RFKILL_ALL, handle->dev->swbit)) 263 + rfkill_schedule_evsw_rfkillall(test_bit(SW_RFKILL_ALL, 264 + handle->dev->sw)); 265 + 266 + spin_unlock_irq(&handle->dev->event_lock); 267 + } 268 + 269 + static void rfkill_disconnect(struct input_handle *handle) 270 + { 271 + input_close_device(handle); 272 + input_unregister_handle(handle); 273 + kfree(handle); 274 + } 275 + 276 + static const struct input_device_id rfkill_ids[] = { 277 + { 278 + .flags = INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_KEYBIT, 279 + .evbit = { BIT_MASK(EV_KEY) }, 280 + .keybit = { [BIT_WORD(KEY_WLAN)] = BIT_MASK(KEY_WLAN) }, 281 + }, 282 + { 283 + .flags = INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_KEYBIT, 284 + .evbit = { BIT_MASK(EV_KEY) }, 285 + .keybit = { [BIT_WORD(KEY_BLUETOOTH)] = BIT_MASK(KEY_BLUETOOTH) }, 286 + }, 287 + { 288 + .flags = INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_KEYBIT, 289 + .evbit = { BIT_MASK(EV_KEY) }, 290 + .keybit = { [BIT_WORD(KEY_UWB)] = BIT_MASK(KEY_UWB) }, 291 + }, 292 + { 293 + .flags = INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_KEYBIT, 294 + .evbit = { BIT_MASK(EV_KEY) }, 295 + .keybit = { [BIT_WORD(KEY_WIMAX)] = BIT_MASK(KEY_WIMAX) }, 296 + }, 297 + { 298 + .flags = INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_SWBIT, 299 + .evbit = { BIT(EV_SW) }, 300 + .swbit = { [BIT_WORD(SW_RFKILL_ALL)] = BIT_MASK(SW_RFKILL_ALL) }, 301 + }, 302 + { } 303 + }; 304 + 305 + static struct input_handler rfkill_handler = { 306 + .name = "rfkill", 307 + .event = rfkill_event, 308 + .connect = rfkill_connect, 309 + .start = rfkill_start, 310 + .disconnect = rfkill_disconnect, 311 + .id_table = rfkill_ids, 312 + }; 313 + 314 + int __init rfkill_handler_init(void) 315 + { 316 + switch (rfkill_master_switch_mode) { 317 + case RFKILL_INPUT_MASTER_UNBLOCKALL: 318 + rfkill_master_switch_op = RFKILL_GLOBAL_OP_UNBLOCK; 319 + break; 320 + case RFKILL_INPUT_MASTER_RESTORE: 321 + rfkill_master_switch_op = RFKILL_GLOBAL_OP_RESTORE; 322 + break; 323 + case RFKILL_INPUT_MASTER_UNLOCK: 324 + rfkill_master_switch_op = RFKILL_GLOBAL_OP_UNLOCK; 325 + break; 326 + default: 327 + return -EINVAL; 328 + } 329 + 330 + spin_lock_init(&rfkill_op_lock); 331 + 332 + /* Avoid delay at first schedule */ 333 + rfkill_last_scheduled = 334 + jiffies - msecs_to_jiffies(RFKILL_OPS_DELAY) - 1; 335 + return input_register_handler(&rfkill_handler); 336 + } 337 + 338 + void __exit rfkill_handler_exit(void) 339 + { 340 + input_unregister_handler(&rfkill_handler); 341 + cancel_delayed_work_sync(&rfkill_op_work); 342 + }
-390
net/rfkill/rfkill-input.c
··· 1 - /* 2 - * Input layer to RF Kill interface connector 3 - * 4 - * Copyright (c) 2007 Dmitry Torokhov 5 - */ 6 - 7 - /* 8 - * This program is free software; you can redistribute it and/or modify it 9 - * under the terms of the GNU General Public License version 2 as published 10 - * by the Free Software Foundation. 11 - */ 12 - 13 - #include <linux/module.h> 14 - #include <linux/input.h> 15 - #include <linux/slab.h> 16 - #include <linux/workqueue.h> 17 - #include <linux/init.h> 18 - #include <linux/rfkill.h> 19 - #include <linux/sched.h> 20 - 21 - #include "rfkill-input.h" 22 - 23 - MODULE_AUTHOR("Dmitry Torokhov <dtor@mail.ru>"); 24 - MODULE_DESCRIPTION("Input layer to RF switch connector"); 25 - MODULE_LICENSE("GPL"); 26 - 27 - enum rfkill_input_master_mode { 28 - RFKILL_INPUT_MASTER_DONOTHING = 0, 29 - RFKILL_INPUT_MASTER_RESTORE = 1, 30 - RFKILL_INPUT_MASTER_UNBLOCKALL = 2, 31 - RFKILL_INPUT_MASTER_MAX, /* marker */ 32 - }; 33 - 34 - /* Delay (in ms) between consecutive switch ops */ 35 - #define RFKILL_OPS_DELAY 200 36 - 37 - static enum rfkill_input_master_mode rfkill_master_switch_mode = 38 - RFKILL_INPUT_MASTER_UNBLOCKALL; 39 - module_param_named(master_switch_mode, rfkill_master_switch_mode, uint, 0); 40 - MODULE_PARM_DESC(master_switch_mode, 41 - "SW_RFKILL_ALL ON should: 0=do nothing; 1=restore; 2=unblock all"); 42 - 43 - enum rfkill_global_sched_op { 44 - RFKILL_GLOBAL_OP_EPO = 0, 45 - RFKILL_GLOBAL_OP_RESTORE, 46 - RFKILL_GLOBAL_OP_UNLOCK, 47 - RFKILL_GLOBAL_OP_UNBLOCK, 48 - }; 49 - 50 - struct rfkill_task { 51 - struct delayed_work dwork; 52 - 53 - /* ensures that task is serialized */ 54 - struct mutex mutex; 55 - 56 - /* protects everything below */ 57 - spinlock_t lock; 58 - 59 - /* pending regular switch operations (1=pending) */ 60 - unsigned long sw_pending[BITS_TO_LONGS(RFKILL_TYPE_MAX)]; 61 - 62 - /* should the state be complemented (1=yes) */ 63 - unsigned long sw_togglestate[BITS_TO_LONGS(RFKILL_TYPE_MAX)]; 64 - 65 - bool global_op_pending; 66 - enum rfkill_global_sched_op op; 67 - 68 - /* last time it was scheduled */ 69 - unsigned long last_scheduled; 70 - }; 71 - 72 - static void __rfkill_handle_global_op(enum rfkill_global_sched_op op) 73 - { 74 - unsigned int i; 75 - 76 - switch (op) { 77 - case RFKILL_GLOBAL_OP_EPO: 78 - rfkill_epo(); 79 - break; 80 - case RFKILL_GLOBAL_OP_RESTORE: 81 - rfkill_restore_states(); 82 - break; 83 - case RFKILL_GLOBAL_OP_UNLOCK: 84 - rfkill_remove_epo_lock(); 85 - break; 86 - case RFKILL_GLOBAL_OP_UNBLOCK: 87 - rfkill_remove_epo_lock(); 88 - for (i = 0; i < RFKILL_TYPE_MAX; i++) 89 - rfkill_switch_all(i, RFKILL_STATE_UNBLOCKED); 90 - break; 91 - default: 92 - /* memory corruption or bug, fail safely */ 93 - rfkill_epo(); 94 - WARN(1, "Unknown requested operation %d! " 95 - "rfkill Emergency Power Off activated\n", 96 - op); 97 - } 98 - } 99 - 100 - static void __rfkill_handle_normal_op(const enum rfkill_type type, 101 - const bool c) 102 - { 103 - enum rfkill_state state; 104 - 105 - state = rfkill_get_global_state(type); 106 - if (c) 107 - state = rfkill_state_complement(state); 108 - 109 - rfkill_switch_all(type, state); 110 - } 111 - 112 - static void rfkill_task_handler(struct work_struct *work) 113 - { 114 - struct rfkill_task *task = container_of(work, 115 - struct rfkill_task, dwork.work); 116 - bool doit = true; 117 - 118 - mutex_lock(&task->mutex); 119 - 120 - spin_lock_irq(&task->lock); 121 - while (doit) { 122 - if (task->global_op_pending) { 123 - enum rfkill_global_sched_op op = task->op; 124 - task->global_op_pending = false; 125 - memset(task->sw_pending, 0, sizeof(task->sw_pending)); 126 - spin_unlock_irq(&task->lock); 127 - 128 - __rfkill_handle_global_op(op); 129 - 130 - /* make sure we do at least one pass with 131 - * !task->global_op_pending */ 132 - spin_lock_irq(&task->lock); 133 - continue; 134 - } else if (!rfkill_is_epo_lock_active()) { 135 - unsigned int i = 0; 136 - 137 - while (!task->global_op_pending && 138 - i < RFKILL_TYPE_MAX) { 139 - if (test_and_clear_bit(i, task->sw_pending)) { 140 - bool c; 141 - c = test_and_clear_bit(i, 142 - task->sw_togglestate); 143 - spin_unlock_irq(&task->lock); 144 - 145 - __rfkill_handle_normal_op(i, c); 146 - 147 - spin_lock_irq(&task->lock); 148 - } 149 - i++; 150 - } 151 - } 152 - doit = task->global_op_pending; 153 - } 154 - spin_unlock_irq(&task->lock); 155 - 156 - mutex_unlock(&task->mutex); 157 - } 158 - 159 - static struct rfkill_task rfkill_task = { 160 - .dwork = __DELAYED_WORK_INITIALIZER(rfkill_task.dwork, 161 - rfkill_task_handler), 162 - .mutex = __MUTEX_INITIALIZER(rfkill_task.mutex), 163 - .lock = __SPIN_LOCK_UNLOCKED(rfkill_task.lock), 164 - }; 165 - 166 - static unsigned long rfkill_ratelimit(const unsigned long last) 167 - { 168 - const unsigned long delay = msecs_to_jiffies(RFKILL_OPS_DELAY); 169 - return (time_after(jiffies, last + delay)) ? 0 : delay; 170 - } 171 - 172 - static void rfkill_schedule_ratelimited(void) 173 - { 174 - if (!delayed_work_pending(&rfkill_task.dwork)) { 175 - schedule_delayed_work(&rfkill_task.dwork, 176 - rfkill_ratelimit(rfkill_task.last_scheduled)); 177 - rfkill_task.last_scheduled = jiffies; 178 - } 179 - } 180 - 181 - static void rfkill_schedule_global_op(enum rfkill_global_sched_op op) 182 - { 183 - unsigned long flags; 184 - 185 - spin_lock_irqsave(&rfkill_task.lock, flags); 186 - rfkill_task.op = op; 187 - rfkill_task.global_op_pending = true; 188 - if (op == RFKILL_GLOBAL_OP_EPO && !rfkill_is_epo_lock_active()) { 189 - /* bypass the limiter for EPO */ 190 - cancel_delayed_work(&rfkill_task.dwork); 191 - schedule_delayed_work(&rfkill_task.dwork, 0); 192 - rfkill_task.last_scheduled = jiffies; 193 - } else 194 - rfkill_schedule_ratelimited(); 195 - spin_unlock_irqrestore(&rfkill_task.lock, flags); 196 - } 197 - 198 - static void rfkill_schedule_toggle(enum rfkill_type type) 199 - { 200 - unsigned long flags; 201 - 202 - if (rfkill_is_epo_lock_active()) 203 - return; 204 - 205 - spin_lock_irqsave(&rfkill_task.lock, flags); 206 - if (!rfkill_task.global_op_pending) { 207 - set_bit(type, rfkill_task.sw_pending); 208 - change_bit(type, rfkill_task.sw_togglestate); 209 - rfkill_schedule_ratelimited(); 210 - } 211 - spin_unlock_irqrestore(&rfkill_task.lock, flags); 212 - } 213 - 214 - static void rfkill_schedule_evsw_rfkillall(int state) 215 - { 216 - if (state) { 217 - switch (rfkill_master_switch_mode) { 218 - case RFKILL_INPUT_MASTER_UNBLOCKALL: 219 - rfkill_schedule_global_op(RFKILL_GLOBAL_OP_UNBLOCK); 220 - break; 221 - case RFKILL_INPUT_MASTER_RESTORE: 222 - rfkill_schedule_global_op(RFKILL_GLOBAL_OP_RESTORE); 223 - break; 224 - case RFKILL_INPUT_MASTER_DONOTHING: 225 - rfkill_schedule_global_op(RFKILL_GLOBAL_OP_UNLOCK); 226 - break; 227 - default: 228 - /* memory corruption or driver bug! fail safely */ 229 - rfkill_schedule_global_op(RFKILL_GLOBAL_OP_EPO); 230 - WARN(1, "Unknown rfkill_master_switch_mode (%d), " 231 - "driver bug or memory corruption detected!\n", 232 - rfkill_master_switch_mode); 233 - break; 234 - } 235 - } else 236 - rfkill_schedule_global_op(RFKILL_GLOBAL_OP_EPO); 237 - } 238 - 239 - static void rfkill_event(struct input_handle *handle, unsigned int type, 240 - unsigned int code, int data) 241 - { 242 - if (type == EV_KEY && data == 1) { 243 - enum rfkill_type t; 244 - 245 - switch (code) { 246 - case KEY_WLAN: 247 - t = RFKILL_TYPE_WLAN; 248 - break; 249 - case KEY_BLUETOOTH: 250 - t = RFKILL_TYPE_BLUETOOTH; 251 - break; 252 - case KEY_UWB: 253 - t = RFKILL_TYPE_UWB; 254 - break; 255 - case KEY_WIMAX: 256 - t = RFKILL_TYPE_WIMAX; 257 - break; 258 - default: 259 - return; 260 - } 261 - rfkill_schedule_toggle(t); 262 - return; 263 - } else if (type == EV_SW) { 264 - switch (code) { 265 - case SW_RFKILL_ALL: 266 - rfkill_schedule_evsw_rfkillall(data); 267 - return; 268 - default: 269 - return; 270 - } 271 - } 272 - } 273 - 274 - static int rfkill_connect(struct input_handler *handler, struct input_dev *dev, 275 - const struct input_device_id *id) 276 - { 277 - struct input_handle *handle; 278 - int error; 279 - 280 - handle = kzalloc(sizeof(struct input_handle), GFP_KERNEL); 281 - if (!handle) 282 - return -ENOMEM; 283 - 284 - handle->dev = dev; 285 - handle->handler = handler; 286 - handle->name = "rfkill"; 287 - 288 - /* causes rfkill_start() to be called */ 289 - error = input_register_handle(handle); 290 - if (error) 291 - goto err_free_handle; 292 - 293 - error = input_open_device(handle); 294 - if (error) 295 - goto err_unregister_handle; 296 - 297 - return 0; 298 - 299 - err_unregister_handle: 300 - input_unregister_handle(handle); 301 - err_free_handle: 302 - kfree(handle); 303 - return error; 304 - } 305 - 306 - static void rfkill_start(struct input_handle *handle) 307 - { 308 - /* Take event_lock to guard against configuration changes, we 309 - * should be able to deal with concurrency with rfkill_event() 310 - * just fine (which event_lock will also avoid). */ 311 - spin_lock_irq(&handle->dev->event_lock); 312 - 313 - if (test_bit(EV_SW, handle->dev->evbit)) { 314 - if (test_bit(SW_RFKILL_ALL, handle->dev->swbit)) 315 - rfkill_schedule_evsw_rfkillall(test_bit(SW_RFKILL_ALL, 316 - handle->dev->sw)); 317 - /* add resync for further EV_SW events here */ 318 - } 319 - 320 - spin_unlock_irq(&handle->dev->event_lock); 321 - } 322 - 323 - static void rfkill_disconnect(struct input_handle *handle) 324 - { 325 - input_close_device(handle); 326 - input_unregister_handle(handle); 327 - kfree(handle); 328 - } 329 - 330 - static const struct input_device_id rfkill_ids[] = { 331 - { 332 - .flags = INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_KEYBIT, 333 - .evbit = { BIT_MASK(EV_KEY) }, 334 - .keybit = { [BIT_WORD(KEY_WLAN)] = BIT_MASK(KEY_WLAN) }, 335 - }, 336 - { 337 - .flags = INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_KEYBIT, 338 - .evbit = { BIT_MASK(EV_KEY) }, 339 - .keybit = { [BIT_WORD(KEY_BLUETOOTH)] = BIT_MASK(KEY_BLUETOOTH) }, 340 - }, 341 - { 342 - .flags = INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_KEYBIT, 343 - .evbit = { BIT_MASK(EV_KEY) }, 344 - .keybit = { [BIT_WORD(KEY_UWB)] = BIT_MASK(KEY_UWB) }, 345 - }, 346 - { 347 - .flags = INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_KEYBIT, 348 - .evbit = { BIT_MASK(EV_KEY) }, 349 - .keybit = { [BIT_WORD(KEY_WIMAX)] = BIT_MASK(KEY_WIMAX) }, 350 - }, 351 - { 352 - .flags = INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_SWBIT, 353 - .evbit = { BIT(EV_SW) }, 354 - .swbit = { [BIT_WORD(SW_RFKILL_ALL)] = BIT_MASK(SW_RFKILL_ALL) }, 355 - }, 356 - { } 357 - }; 358 - 359 - static struct input_handler rfkill_handler = { 360 - .event = rfkill_event, 361 - .connect = rfkill_connect, 362 - .disconnect = rfkill_disconnect, 363 - .start = rfkill_start, 364 - .name = "rfkill", 365 - .id_table = rfkill_ids, 366 - }; 367 - 368 - static int __init rfkill_handler_init(void) 369 - { 370 - if (rfkill_master_switch_mode >= RFKILL_INPUT_MASTER_MAX) 371 - return -EINVAL; 372 - 373 - /* 374 - * The penalty to not doing this is a possible RFKILL_OPS_DELAY delay 375 - * at the first use. Acceptable, but if we can avoid it, why not? 376 - */ 377 - rfkill_task.last_scheduled = 378 - jiffies - msecs_to_jiffies(RFKILL_OPS_DELAY) - 1; 379 - return input_register_handler(&rfkill_handler); 380 - } 381 - 382 - static void __exit rfkill_handler_exit(void) 383 - { 384 - input_unregister_handler(&rfkill_handler); 385 - cancel_delayed_work_sync(&rfkill_task.dwork); 386 - rfkill_remove_epo_lock(); 387 - } 388 - 389 - module_init(rfkill_handler_init); 390 - module_exit(rfkill_handler_exit);
+8 -2
net/rfkill/rfkill-input.h net/rfkill/rfkill.h
··· 1 1 /* 2 2 * Copyright (C) 2007 Ivo van Doorn 3 + * Copyright 2009 Johannes Berg <johannes@sipsolutions.net> 3 4 */ 4 5 5 6 /* ··· 12 11 #ifndef __RFKILL_INPUT_H 13 12 #define __RFKILL_INPUT_H 14 13 15 - void rfkill_switch_all(enum rfkill_type type, enum rfkill_state state); 14 + /* core code */ 15 + void rfkill_switch_all(const enum rfkill_type type, bool blocked); 16 16 void rfkill_epo(void); 17 17 void rfkill_restore_states(void); 18 18 void rfkill_remove_epo_lock(void); 19 19 bool rfkill_is_epo_lock_active(void); 20 - enum rfkill_state rfkill_get_global_state(const enum rfkill_type type); 20 + bool rfkill_get_global_sw_state(const enum rfkill_type type); 21 + 22 + /* input handler */ 23 + int rfkill_handler_init(void); 24 + void rfkill_handler_exit(void); 21 25 22 26 #endif /* __RFKILL_INPUT_H */
-855
net/rfkill/rfkill.c
··· 1 - /* 2 - * Copyright (C) 2006 - 2007 Ivo van Doorn 3 - * Copyright (C) 2007 Dmitry Torokhov 4 - * 5 - * This program is free software; you can redistribute it and/or modify 6 - * it under the terms of the GNU General Public License as published by 7 - * the Free Software Foundation; either version 2 of the License, or 8 - * (at your option) any later version. 9 - * 10 - * This program is distributed in the hope that it will be useful, 11 - * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 - * GNU General Public License for more details. 14 - * 15 - * You should have received a copy of the GNU General Public License 16 - * along with this program; if not, write to the 17 - * Free Software Foundation, Inc., 18 - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 19 - */ 20 - 21 - #include <linux/kernel.h> 22 - #include <linux/module.h> 23 - #include <linux/init.h> 24 - #include <linux/workqueue.h> 25 - #include <linux/capability.h> 26 - #include <linux/list.h> 27 - #include <linux/mutex.h> 28 - #include <linux/rfkill.h> 29 - 30 - /* Get declaration of rfkill_switch_all() to shut up sparse. */ 31 - #include "rfkill-input.h" 32 - 33 - 34 - MODULE_AUTHOR("Ivo van Doorn <IvDoorn@gmail.com>"); 35 - MODULE_VERSION("1.0"); 36 - MODULE_DESCRIPTION("RF switch support"); 37 - MODULE_LICENSE("GPL"); 38 - 39 - static LIST_HEAD(rfkill_list); /* list of registered rf switches */ 40 - static DEFINE_MUTEX(rfkill_global_mutex); 41 - 42 - static unsigned int rfkill_default_state = RFKILL_STATE_UNBLOCKED; 43 - module_param_named(default_state, rfkill_default_state, uint, 0444); 44 - MODULE_PARM_DESC(default_state, 45 - "Default initial state for all radio types, 0 = radio off"); 46 - 47 - struct rfkill_gsw_state { 48 - enum rfkill_state current_state; 49 - enum rfkill_state default_state; 50 - }; 51 - 52 - static struct rfkill_gsw_state rfkill_global_states[RFKILL_TYPE_MAX]; 53 - static unsigned long rfkill_states_lockdflt[BITS_TO_LONGS(RFKILL_TYPE_MAX)]; 54 - static bool rfkill_epo_lock_active; 55 - 56 - 57 - #ifdef CONFIG_RFKILL_LEDS 58 - static void rfkill_led_trigger(struct rfkill *rfkill, 59 - enum rfkill_state state) 60 - { 61 - struct led_trigger *led = &rfkill->led_trigger; 62 - 63 - if (!led->name) 64 - return; 65 - if (state != RFKILL_STATE_UNBLOCKED) 66 - led_trigger_event(led, LED_OFF); 67 - else 68 - led_trigger_event(led, LED_FULL); 69 - } 70 - 71 - static void rfkill_led_trigger_activate(struct led_classdev *led) 72 - { 73 - struct rfkill *rfkill = container_of(led->trigger, 74 - struct rfkill, led_trigger); 75 - 76 - rfkill_led_trigger(rfkill, rfkill->state); 77 - } 78 - #else 79 - static inline void rfkill_led_trigger(struct rfkill *rfkill, 80 - enum rfkill_state state) 81 - { 82 - } 83 - #endif /* CONFIG_RFKILL_LEDS */ 84 - 85 - static void rfkill_uevent(struct rfkill *rfkill) 86 - { 87 - kobject_uevent(&rfkill->dev.kobj, KOBJ_CHANGE); 88 - } 89 - 90 - static void update_rfkill_state(struct rfkill *rfkill) 91 - { 92 - enum rfkill_state newstate, oldstate; 93 - 94 - if (rfkill->get_state) { 95 - mutex_lock(&rfkill->mutex); 96 - if (!rfkill->get_state(rfkill->data, &newstate)) { 97 - oldstate = rfkill->state; 98 - rfkill->state = newstate; 99 - if (oldstate != newstate) 100 - rfkill_uevent(rfkill); 101 - } 102 - mutex_unlock(&rfkill->mutex); 103 - } 104 - rfkill_led_trigger(rfkill, rfkill->state); 105 - } 106 - 107 - /** 108 - * rfkill_toggle_radio - wrapper for toggle_radio hook 109 - * @rfkill: the rfkill struct to use 110 - * @force: calls toggle_radio even if cache says it is not needed, 111 - * and also makes sure notifications of the state will be 112 - * sent even if it didn't change 113 - * @state: the new state to call toggle_radio() with 114 - * 115 - * Calls rfkill->toggle_radio, enforcing the API for toggle_radio 116 - * calls and handling all the red tape such as issuing notifications 117 - * if the call is successful. 118 - * 119 - * Suspended devices are not touched at all, and -EAGAIN is returned. 120 - * 121 - * Note that the @force parameter cannot override a (possibly cached) 122 - * state of RFKILL_STATE_HARD_BLOCKED. Any device making use of 123 - * RFKILL_STATE_HARD_BLOCKED implements either get_state() or 124 - * rfkill_force_state(), so the cache either is bypassed or valid. 125 - * 126 - * Note that we do call toggle_radio for RFKILL_STATE_SOFT_BLOCKED 127 - * even if the radio is in RFKILL_STATE_HARD_BLOCKED state, so as to 128 - * give the driver a hint that it should double-BLOCK the transmitter. 129 - * 130 - * Caller must have acquired rfkill->mutex. 131 - */ 132 - static int rfkill_toggle_radio(struct rfkill *rfkill, 133 - enum rfkill_state state, 134 - int force) 135 - { 136 - int retval = 0; 137 - enum rfkill_state oldstate, newstate; 138 - 139 - if (unlikely(rfkill->dev.power.power_state.event & PM_EVENT_SLEEP)) 140 - return -EBUSY; 141 - 142 - oldstate = rfkill->state; 143 - 144 - if (rfkill->get_state && !force && 145 - !rfkill->get_state(rfkill->data, &newstate)) { 146 - rfkill->state = newstate; 147 - } 148 - 149 - switch (state) { 150 - case RFKILL_STATE_HARD_BLOCKED: 151 - /* typically happens when refreshing hardware state, 152 - * such as on resume */ 153 - state = RFKILL_STATE_SOFT_BLOCKED; 154 - break; 155 - case RFKILL_STATE_UNBLOCKED: 156 - /* force can't override this, only rfkill_force_state() can */ 157 - if (rfkill->state == RFKILL_STATE_HARD_BLOCKED) 158 - return -EPERM; 159 - break; 160 - case RFKILL_STATE_SOFT_BLOCKED: 161 - /* nothing to do, we want to give drivers the hint to double 162 - * BLOCK even a transmitter that is already in state 163 - * RFKILL_STATE_HARD_BLOCKED */ 164 - break; 165 - default: 166 - WARN(1, KERN_WARNING 167 - "rfkill: illegal state %d passed as parameter " 168 - "to rfkill_toggle_radio\n", state); 169 - return -EINVAL; 170 - } 171 - 172 - if (force || state != rfkill->state) { 173 - retval = rfkill->toggle_radio(rfkill->data, state); 174 - /* never allow a HARD->SOFT downgrade! */ 175 - if (!retval && rfkill->state != RFKILL_STATE_HARD_BLOCKED) 176 - rfkill->state = state; 177 - } 178 - 179 - if (force || rfkill->state != oldstate) 180 - rfkill_uevent(rfkill); 181 - 182 - rfkill_led_trigger(rfkill, rfkill->state); 183 - return retval; 184 - } 185 - 186 - /** 187 - * __rfkill_switch_all - Toggle state of all switches of given type 188 - * @type: type of interfaces to be affected 189 - * @state: the new state 190 - * 191 - * This function toggles the state of all switches of given type, 192 - * unless a specific switch is claimed by userspace (in which case, 193 - * that switch is left alone) or suspended. 194 - * 195 - * Caller must have acquired rfkill_global_mutex. 196 - */ 197 - static void __rfkill_switch_all(const enum rfkill_type type, 198 - const enum rfkill_state state) 199 - { 200 - struct rfkill *rfkill; 201 - 202 - if (WARN((state >= RFKILL_STATE_MAX || type >= RFKILL_TYPE_MAX), 203 - KERN_WARNING 204 - "rfkill: illegal state %d or type %d " 205 - "passed as parameter to __rfkill_switch_all\n", 206 - state, type)) 207 - return; 208 - 209 - rfkill_global_states[type].current_state = state; 210 - list_for_each_entry(rfkill, &rfkill_list, node) { 211 - if (rfkill->type == type) { 212 - mutex_lock(&rfkill->mutex); 213 - rfkill_toggle_radio(rfkill, state, 0); 214 - mutex_unlock(&rfkill->mutex); 215 - rfkill_led_trigger(rfkill, rfkill->state); 216 - } 217 - } 218 - } 219 - 220 - /** 221 - * rfkill_switch_all - Toggle state of all switches of given type 222 - * @type: type of interfaces to be affected 223 - * @state: the new state 224 - * 225 - * Acquires rfkill_global_mutex and calls __rfkill_switch_all(@type, @state). 226 - * Please refer to __rfkill_switch_all() for details. 227 - * 228 - * Does nothing if the EPO lock is active. 229 - */ 230 - void rfkill_switch_all(enum rfkill_type type, enum rfkill_state state) 231 - { 232 - mutex_lock(&rfkill_global_mutex); 233 - if (!rfkill_epo_lock_active) 234 - __rfkill_switch_all(type, state); 235 - mutex_unlock(&rfkill_global_mutex); 236 - } 237 - EXPORT_SYMBOL(rfkill_switch_all); 238 - 239 - /** 240 - * rfkill_epo - emergency power off all transmitters 241 - * 242 - * This kicks all non-suspended rfkill devices to RFKILL_STATE_SOFT_BLOCKED, 243 - * ignoring everything in its path but rfkill_global_mutex and rfkill->mutex. 244 - * 245 - * The global state before the EPO is saved and can be restored later 246 - * using rfkill_restore_states(). 247 - */ 248 - void rfkill_epo(void) 249 - { 250 - struct rfkill *rfkill; 251 - int i; 252 - 253 - mutex_lock(&rfkill_global_mutex); 254 - 255 - rfkill_epo_lock_active = true; 256 - list_for_each_entry(rfkill, &rfkill_list, node) { 257 - mutex_lock(&rfkill->mutex); 258 - rfkill_toggle_radio(rfkill, RFKILL_STATE_SOFT_BLOCKED, 1); 259 - mutex_unlock(&rfkill->mutex); 260 - } 261 - for (i = 0; i < RFKILL_TYPE_MAX; i++) { 262 - rfkill_global_states[i].default_state = 263 - rfkill_global_states[i].current_state; 264 - rfkill_global_states[i].current_state = 265 - RFKILL_STATE_SOFT_BLOCKED; 266 - } 267 - mutex_unlock(&rfkill_global_mutex); 268 - rfkill_led_trigger(rfkill, rfkill->state); 269 - } 270 - EXPORT_SYMBOL_GPL(rfkill_epo); 271 - 272 - /** 273 - * rfkill_restore_states - restore global states 274 - * 275 - * Restore (and sync switches to) the global state from the 276 - * states in rfkill_default_states. This can undo the effects of 277 - * a call to rfkill_epo(). 278 - */ 279 - void rfkill_restore_states(void) 280 - { 281 - int i; 282 - 283 - mutex_lock(&rfkill_global_mutex); 284 - 285 - rfkill_epo_lock_active = false; 286 - for (i = 0; i < RFKILL_TYPE_MAX; i++) 287 - __rfkill_switch_all(i, rfkill_global_states[i].default_state); 288 - mutex_unlock(&rfkill_global_mutex); 289 - } 290 - EXPORT_SYMBOL_GPL(rfkill_restore_states); 291 - 292 - /** 293 - * rfkill_remove_epo_lock - unlock state changes 294 - * 295 - * Used by rfkill-input manually unlock state changes, when 296 - * the EPO switch is deactivated. 297 - */ 298 - void rfkill_remove_epo_lock(void) 299 - { 300 - mutex_lock(&rfkill_global_mutex); 301 - rfkill_epo_lock_active = false; 302 - mutex_unlock(&rfkill_global_mutex); 303 - } 304 - EXPORT_SYMBOL_GPL(rfkill_remove_epo_lock); 305 - 306 - /** 307 - * rfkill_is_epo_lock_active - returns true EPO is active 308 - * 309 - * Returns 0 (false) if there is NOT an active EPO contidion, 310 - * and 1 (true) if there is an active EPO contition, which 311 - * locks all radios in one of the BLOCKED states. 312 - * 313 - * Can be called in atomic context. 314 - */ 315 - bool rfkill_is_epo_lock_active(void) 316 - { 317 - return rfkill_epo_lock_active; 318 - } 319 - EXPORT_SYMBOL_GPL(rfkill_is_epo_lock_active); 320 - 321 - /** 322 - * rfkill_get_global_state - returns global state for a type 323 - * @type: the type to get the global state of 324 - * 325 - * Returns the current global state for a given wireless 326 - * device type. 327 - */ 328 - enum rfkill_state rfkill_get_global_state(const enum rfkill_type type) 329 - { 330 - return rfkill_global_states[type].current_state; 331 - } 332 - EXPORT_SYMBOL_GPL(rfkill_get_global_state); 333 - 334 - /** 335 - * rfkill_force_state - Force the internal rfkill radio state 336 - * @rfkill: pointer to the rfkill class to modify. 337 - * @state: the current radio state the class should be forced to. 338 - * 339 - * This function updates the internal state of the radio cached 340 - * by the rfkill class. It should be used when the driver gets 341 - * a notification by the firmware/hardware of the current *real* 342 - * state of the radio rfkill switch. 343 - * 344 - * Devices which are subject to external changes on their rfkill 345 - * state (such as those caused by a hardware rfkill line) MUST 346 - * have their driver arrange to call rfkill_force_state() as soon 347 - * as possible after such a change. 348 - * 349 - * This function may not be called from an atomic context. 350 - */ 351 - int rfkill_force_state(struct rfkill *rfkill, enum rfkill_state state) 352 - { 353 - enum rfkill_state oldstate; 354 - 355 - BUG_ON(!rfkill); 356 - if (WARN((state >= RFKILL_STATE_MAX), 357 - KERN_WARNING 358 - "rfkill: illegal state %d passed as parameter " 359 - "to rfkill_force_state\n", state)) 360 - return -EINVAL; 361 - 362 - mutex_lock(&rfkill->mutex); 363 - 364 - oldstate = rfkill->state; 365 - rfkill->state = state; 366 - 367 - if (state != oldstate) 368 - rfkill_uevent(rfkill); 369 - 370 - mutex_unlock(&rfkill->mutex); 371 - rfkill_led_trigger(rfkill, rfkill->state); 372 - 373 - return 0; 374 - } 375 - EXPORT_SYMBOL(rfkill_force_state); 376 - 377 - static ssize_t rfkill_name_show(struct device *dev, 378 - struct device_attribute *attr, 379 - char *buf) 380 - { 381 - struct rfkill *rfkill = to_rfkill(dev); 382 - 383 - return sprintf(buf, "%s\n", rfkill->name); 384 - } 385 - 386 - static const char *rfkill_get_type_str(enum rfkill_type type) 387 - { 388 - switch (type) { 389 - case RFKILL_TYPE_WLAN: 390 - return "wlan"; 391 - case RFKILL_TYPE_BLUETOOTH: 392 - return "bluetooth"; 393 - case RFKILL_TYPE_UWB: 394 - return "ultrawideband"; 395 - case RFKILL_TYPE_WIMAX: 396 - return "wimax"; 397 - case RFKILL_TYPE_WWAN: 398 - return "wwan"; 399 - default: 400 - BUG(); 401 - } 402 - } 403 - 404 - static ssize_t rfkill_type_show(struct device *dev, 405 - struct device_attribute *attr, 406 - char *buf) 407 - { 408 - struct rfkill *rfkill = to_rfkill(dev); 409 - 410 - return sprintf(buf, "%s\n", rfkill_get_type_str(rfkill->type)); 411 - } 412 - 413 - static ssize_t rfkill_state_show(struct device *dev, 414 - struct device_attribute *attr, 415 - char *buf) 416 - { 417 - struct rfkill *rfkill = to_rfkill(dev); 418 - 419 - update_rfkill_state(rfkill); 420 - return sprintf(buf, "%d\n", rfkill->state); 421 - } 422 - 423 - static ssize_t rfkill_state_store(struct device *dev, 424 - struct device_attribute *attr, 425 - const char *buf, size_t count) 426 - { 427 - struct rfkill *rfkill = to_rfkill(dev); 428 - unsigned long state; 429 - int error; 430 - 431 - if (!capable(CAP_NET_ADMIN)) 432 - return -EPERM; 433 - 434 - error = strict_strtoul(buf, 0, &state); 435 - if (error) 436 - return error; 437 - 438 - /* RFKILL_STATE_HARD_BLOCKED is illegal here... */ 439 - if (state != RFKILL_STATE_UNBLOCKED && 440 - state != RFKILL_STATE_SOFT_BLOCKED) 441 - return -EINVAL; 442 - 443 - error = mutex_lock_killable(&rfkill->mutex); 444 - if (error) 445 - return error; 446 - 447 - if (!rfkill_epo_lock_active) 448 - error = rfkill_toggle_radio(rfkill, state, 0); 449 - else 450 - error = -EPERM; 451 - 452 - mutex_unlock(&rfkill->mutex); 453 - 454 - return error ? error : count; 455 - } 456 - 457 - static ssize_t rfkill_claim_show(struct device *dev, 458 - struct device_attribute *attr, 459 - char *buf) 460 - { 461 - return sprintf(buf, "%d\n", 0); 462 - } 463 - 464 - static ssize_t rfkill_claim_store(struct device *dev, 465 - struct device_attribute *attr, 466 - const char *buf, size_t count) 467 - { 468 - return -EOPNOTSUPP; 469 - } 470 - 471 - static struct device_attribute rfkill_dev_attrs[] = { 472 - __ATTR(name, S_IRUGO, rfkill_name_show, NULL), 473 - __ATTR(type, S_IRUGO, rfkill_type_show, NULL), 474 - __ATTR(state, S_IRUGO|S_IWUSR, rfkill_state_show, rfkill_state_store), 475 - __ATTR(claim, S_IRUGO|S_IWUSR, rfkill_claim_show, rfkill_claim_store), 476 - __ATTR_NULL 477 - }; 478 - 479 - static void rfkill_release(struct device *dev) 480 - { 481 - struct rfkill *rfkill = to_rfkill(dev); 482 - 483 - kfree(rfkill); 484 - module_put(THIS_MODULE); 485 - } 486 - 487 - #ifdef CONFIG_PM 488 - static int rfkill_suspend(struct device *dev, pm_message_t state) 489 - { 490 - struct rfkill *rfkill = to_rfkill(dev); 491 - 492 - /* mark class device as suspended */ 493 - if (dev->power.power_state.event != state.event) 494 - dev->power.power_state = state; 495 - 496 - /* store state for the resume handler */ 497 - rfkill->state_for_resume = rfkill->state; 498 - 499 - return 0; 500 - } 501 - 502 - static int rfkill_resume(struct device *dev) 503 - { 504 - struct rfkill *rfkill = to_rfkill(dev); 505 - enum rfkill_state newstate; 506 - 507 - if (dev->power.power_state.event != PM_EVENT_ON) { 508 - mutex_lock(&rfkill->mutex); 509 - 510 - dev->power.power_state.event = PM_EVENT_ON; 511 - 512 - /* 513 - * rfkill->state could have been modified before we got 514 - * called, and won't be updated by rfkill_toggle_radio() 515 - * in force mode. Sync it FIRST. 516 - */ 517 - if (rfkill->get_state && 518 - !rfkill->get_state(rfkill->data, &newstate)) 519 - rfkill->state = newstate; 520 - 521 - /* 522 - * If we are under EPO, kick transmitter offline, 523 - * otherwise restore to pre-suspend state. 524 - * 525 - * Issue a notification in any case 526 - */ 527 - rfkill_toggle_radio(rfkill, 528 - rfkill_epo_lock_active ? 529 - RFKILL_STATE_SOFT_BLOCKED : 530 - rfkill->state_for_resume, 531 - 1); 532 - 533 - mutex_unlock(&rfkill->mutex); 534 - rfkill_led_trigger(rfkill, rfkill->state); 535 - } 536 - 537 - return 0; 538 - } 539 - #else 540 - #define rfkill_suspend NULL 541 - #define rfkill_resume NULL 542 - #endif 543 - 544 - static int rfkill_dev_uevent(struct device *dev, struct kobj_uevent_env *env) 545 - { 546 - struct rfkill *rfkill = to_rfkill(dev); 547 - int error; 548 - 549 - error = add_uevent_var(env, "RFKILL_NAME=%s", rfkill->name); 550 - if (error) 551 - return error; 552 - error = add_uevent_var(env, "RFKILL_TYPE=%s", 553 - rfkill_get_type_str(rfkill->type)); 554 - if (error) 555 - return error; 556 - error = add_uevent_var(env, "RFKILL_STATE=%d", rfkill->state); 557 - return error; 558 - } 559 - 560 - static struct class rfkill_class = { 561 - .name = "rfkill", 562 - .dev_release = rfkill_release, 563 - .dev_attrs = rfkill_dev_attrs, 564 - .suspend = rfkill_suspend, 565 - .resume = rfkill_resume, 566 - .dev_uevent = rfkill_dev_uevent, 567 - }; 568 - 569 - static int rfkill_check_duplicity(const struct rfkill *rfkill) 570 - { 571 - struct rfkill *p; 572 - unsigned long seen[BITS_TO_LONGS(RFKILL_TYPE_MAX)]; 573 - 574 - memset(seen, 0, sizeof(seen)); 575 - 576 - list_for_each_entry(p, &rfkill_list, node) { 577 - if (WARN((p == rfkill), KERN_WARNING 578 - "rfkill: illegal attempt to register " 579 - "an already registered rfkill struct\n")) 580 - return -EEXIST; 581 - set_bit(p->type, seen); 582 - } 583 - 584 - /* 0: first switch of its kind */ 585 - return (test_bit(rfkill->type, seen)) ? 1 : 0; 586 - } 587 - 588 - static int rfkill_add_switch(struct rfkill *rfkill) 589 - { 590 - int error; 591 - 592 - mutex_lock(&rfkill_global_mutex); 593 - 594 - error = rfkill_check_duplicity(rfkill); 595 - if (error < 0) 596 - goto unlock_out; 597 - 598 - if (!error) { 599 - /* lock default after first use */ 600 - set_bit(rfkill->type, rfkill_states_lockdflt); 601 - rfkill_global_states[rfkill->type].current_state = 602 - rfkill_global_states[rfkill->type].default_state; 603 - } 604 - 605 - rfkill_toggle_radio(rfkill, 606 - rfkill_global_states[rfkill->type].current_state, 607 - 0); 608 - 609 - list_add_tail(&rfkill->node, &rfkill_list); 610 - 611 - error = 0; 612 - unlock_out: 613 - mutex_unlock(&rfkill_global_mutex); 614 - 615 - return error; 616 - } 617 - 618 - static void rfkill_remove_switch(struct rfkill *rfkill) 619 - { 620 - mutex_lock(&rfkill_global_mutex); 621 - list_del_init(&rfkill->node); 622 - mutex_unlock(&rfkill_global_mutex); 623 - 624 - mutex_lock(&rfkill->mutex); 625 - rfkill_toggle_radio(rfkill, RFKILL_STATE_SOFT_BLOCKED, 1); 626 - mutex_unlock(&rfkill->mutex); 627 - } 628 - 629 - /** 630 - * rfkill_allocate - allocate memory for rfkill structure. 631 - * @parent: device that has rf switch on it 632 - * @type: type of the switch (RFKILL_TYPE_*) 633 - * 634 - * This function should be called by the network driver when it needs 635 - * rfkill structure. Once the structure is allocated the driver should 636 - * finish its initialization by setting the name, private data, enable_radio 637 - * and disable_radio methods and then register it with rfkill_register(). 638 - * 639 - * NOTE: If registration fails the structure shoudl be freed by calling 640 - * rfkill_free() otherwise rfkill_unregister() should be used. 641 - */ 642 - struct rfkill * __must_check rfkill_allocate(struct device *parent, 643 - enum rfkill_type type) 644 - { 645 - struct rfkill *rfkill; 646 - struct device *dev; 647 - 648 - if (WARN((type >= RFKILL_TYPE_MAX), 649 - KERN_WARNING 650 - "rfkill: illegal type %d passed as parameter " 651 - "to rfkill_allocate\n", type)) 652 - return NULL; 653 - 654 - rfkill = kzalloc(sizeof(struct rfkill), GFP_KERNEL); 655 - if (!rfkill) 656 - return NULL; 657 - 658 - mutex_init(&rfkill->mutex); 659 - INIT_LIST_HEAD(&rfkill->node); 660 - rfkill->type = type; 661 - 662 - dev = &rfkill->dev; 663 - dev->class = &rfkill_class; 664 - dev->parent = parent; 665 - device_initialize(dev); 666 - 667 - __module_get(THIS_MODULE); 668 - 669 - return rfkill; 670 - } 671 - EXPORT_SYMBOL(rfkill_allocate); 672 - 673 - /** 674 - * rfkill_free - Mark rfkill structure for deletion 675 - * @rfkill: rfkill structure to be destroyed 676 - * 677 - * Decrements reference count of the rfkill structure so it is destroyed. 678 - * Note that rfkill_free() should _not_ be called after rfkill_unregister(). 679 - */ 680 - void rfkill_free(struct rfkill *rfkill) 681 - { 682 - if (rfkill) 683 - put_device(&rfkill->dev); 684 - } 685 - EXPORT_SYMBOL(rfkill_free); 686 - 687 - static void rfkill_led_trigger_register(struct rfkill *rfkill) 688 - { 689 - #ifdef CONFIG_RFKILL_LEDS 690 - int error; 691 - 692 - if (!rfkill->led_trigger.name) 693 - rfkill->led_trigger.name = dev_name(&rfkill->dev); 694 - if (!rfkill->led_trigger.activate) 695 - rfkill->led_trigger.activate = rfkill_led_trigger_activate; 696 - error = led_trigger_register(&rfkill->led_trigger); 697 - if (error) 698 - rfkill->led_trigger.name = NULL; 699 - #endif /* CONFIG_RFKILL_LEDS */ 700 - } 701 - 702 - static void rfkill_led_trigger_unregister(struct rfkill *rfkill) 703 - { 704 - #ifdef CONFIG_RFKILL_LEDS 705 - if (rfkill->led_trigger.name) { 706 - led_trigger_unregister(&rfkill->led_trigger); 707 - rfkill->led_trigger.name = NULL; 708 - } 709 - #endif 710 - } 711 - 712 - /** 713 - * rfkill_register - Register a rfkill structure. 714 - * @rfkill: rfkill structure to be registered 715 - * 716 - * This function should be called by the network driver when the rfkill 717 - * structure needs to be registered. Immediately from registration the 718 - * switch driver should be able to service calls to toggle_radio. 719 - */ 720 - int __must_check rfkill_register(struct rfkill *rfkill) 721 - { 722 - static atomic_t rfkill_no = ATOMIC_INIT(0); 723 - struct device *dev = &rfkill->dev; 724 - int error; 725 - 726 - if (WARN((!rfkill || !rfkill->toggle_radio || 727 - rfkill->type >= RFKILL_TYPE_MAX || 728 - rfkill->state >= RFKILL_STATE_MAX), 729 - KERN_WARNING 730 - "rfkill: attempt to register a " 731 - "badly initialized rfkill struct\n")) 732 - return -EINVAL; 733 - 734 - dev_set_name(dev, "rfkill%ld", (long)atomic_inc_return(&rfkill_no) - 1); 735 - 736 - rfkill_led_trigger_register(rfkill); 737 - 738 - error = rfkill_add_switch(rfkill); 739 - if (error) { 740 - rfkill_led_trigger_unregister(rfkill); 741 - return error; 742 - } 743 - 744 - error = device_add(dev); 745 - if (error) { 746 - rfkill_remove_switch(rfkill); 747 - rfkill_led_trigger_unregister(rfkill); 748 - return error; 749 - } 750 - 751 - return 0; 752 - } 753 - EXPORT_SYMBOL(rfkill_register); 754 - 755 - /** 756 - * rfkill_unregister - Unregister a rfkill structure. 757 - * @rfkill: rfkill structure to be unregistered 758 - * 759 - * This function should be called by the network driver during device 760 - * teardown to destroy rfkill structure. Note that rfkill_free() should 761 - * _not_ be called after rfkill_unregister(). 762 - */ 763 - void rfkill_unregister(struct rfkill *rfkill) 764 - { 765 - BUG_ON(!rfkill); 766 - device_del(&rfkill->dev); 767 - rfkill_remove_switch(rfkill); 768 - rfkill_led_trigger_unregister(rfkill); 769 - put_device(&rfkill->dev); 770 - } 771 - EXPORT_SYMBOL(rfkill_unregister); 772 - 773 - /** 774 - * rfkill_set_default - set initial value for a switch type 775 - * @type - the type of switch to set the default state of 776 - * @state - the new default state for that group of switches 777 - * 778 - * Sets the initial state rfkill should use for a given type. 779 - * The following initial states are allowed: RFKILL_STATE_SOFT_BLOCKED 780 - * and RFKILL_STATE_UNBLOCKED. 781 - * 782 - * This function is meant to be used by platform drivers for platforms 783 - * that can save switch state across power down/reboot. 784 - * 785 - * The default state for each switch type can be changed exactly once. 786 - * After a switch of that type is registered, the default state cannot 787 - * be changed anymore. This guards against multiple drivers it the 788 - * same platform trying to set the initial switch default state, which 789 - * is not allowed. 790 - * 791 - * Returns -EPERM if the state has already been set once or is in use, 792 - * so drivers likely want to either ignore or at most printk(KERN_NOTICE) 793 - * if this function returns -EPERM. 794 - * 795 - * Returns 0 if the new default state was set, or an error if it 796 - * could not be set. 797 - */ 798 - int rfkill_set_default(enum rfkill_type type, enum rfkill_state state) 799 - { 800 - int error; 801 - 802 - if (WARN((type >= RFKILL_TYPE_MAX || 803 - (state != RFKILL_STATE_SOFT_BLOCKED && 804 - state != RFKILL_STATE_UNBLOCKED)), 805 - KERN_WARNING 806 - "rfkill: illegal state %d or type %d passed as " 807 - "parameter to rfkill_set_default\n", state, type)) 808 - return -EINVAL; 809 - 810 - mutex_lock(&rfkill_global_mutex); 811 - 812 - if (!test_and_set_bit(type, rfkill_states_lockdflt)) { 813 - rfkill_global_states[type].default_state = state; 814 - rfkill_global_states[type].current_state = state; 815 - error = 0; 816 - } else 817 - error = -EPERM; 818 - 819 - mutex_unlock(&rfkill_global_mutex); 820 - return error; 821 - } 822 - EXPORT_SYMBOL_GPL(rfkill_set_default); 823 - 824 - /* 825 - * Rfkill module initialization/deinitialization. 826 - */ 827 - static int __init rfkill_init(void) 828 - { 829 - int error; 830 - int i; 831 - 832 - /* RFKILL_STATE_HARD_BLOCKED is illegal here... */ 833 - if (rfkill_default_state != RFKILL_STATE_SOFT_BLOCKED && 834 - rfkill_default_state != RFKILL_STATE_UNBLOCKED) 835 - return -EINVAL; 836 - 837 - for (i = 0; i < RFKILL_TYPE_MAX; i++) 838 - rfkill_global_states[i].default_state = rfkill_default_state; 839 - 840 - error = class_register(&rfkill_class); 841 - if (error) { 842 - printk(KERN_ERR "rfkill: unable to register rfkill class\n"); 843 - return error; 844 - } 845 - 846 - return 0; 847 - } 848 - 849 - static void __exit rfkill_exit(void) 850 - { 851 - class_unregister(&rfkill_class); 852 - } 853 - 854 - subsys_initcall(rfkill_init); 855 - module_exit(rfkill_exit);
-14
net/wimax/Kconfig
··· 1 1 # 2 2 # WiMAX LAN device configuration 3 3 # 4 - # Note the ugly 'depends on' on WIMAX: that disallows RFKILL to be a 5 - # module if WIMAX is to be linked in. The WiMAX code is done in such a 6 - # way that it doesn't require and explicit dependency on RFKILL in 7 - # case an embedded system wants to rip it out. 8 - # 9 - # As well, enablement of the RFKILL code means we need the INPUT layer 10 - # support to inject events coming from hw rfkill switches. That 11 - # dependency could be killed if input.h provided appropriate means to 12 - # work when input is disabled. 13 - 14 - comment "WiMAX Wireless Broadband support requires CONFIG_INPUT enabled" 15 - depends on INPUT = n && RFKILL != n 16 4 17 5 menuconfig WIMAX 18 6 tristate "WiMAX Wireless Broadband support" 19 - depends on (y && RFKILL != m) || m 20 - depends on (INPUT && RFKILL != n) || RFKILL = n 21 7 help 22 8 23 9 Select to configure support for devices that provide
+26 -97
net/wimax/op-rfkill.c
··· 29 29 * A non-polled generic rfkill device is embedded into the WiMAX 30 30 * subsystem's representation of a device. 31 31 * 32 - * FIXME: Need polled support? use a timer or add the implementation 33 - * to the stack. 32 + * FIXME: Need polled support? Let drivers provide a poll routine 33 + * and hand it to rfkill ops then? 34 34 * 35 35 * All device drivers have to do is after wimax_dev_init(), call 36 36 * wimax_report_rfkill_hw() and wimax_report_rfkill_sw() to update ··· 43 43 * wimax_rfkill() Kernel calling wimax_rfkill() 44 44 * __wimax_rf_toggle_radio() 45 45 * 46 - * wimax_rfkill_toggle_radio() RF-Kill subsytem calling 46 + * wimax_rfkill_set_radio_block() RF-Kill subsytem calling 47 47 * __wimax_rf_toggle_radio() 48 48 * 49 49 * __wimax_rf_toggle_radio() ··· 65 65 #include <linux/wimax.h> 66 66 #include <linux/security.h> 67 67 #include <linux/rfkill.h> 68 - #include <linux/input.h> 69 68 #include "wimax-internal.h" 70 69 71 70 #define D_SUBMODULE op_rfkill 72 71 #include "debug-levels.h" 73 - 74 - #if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE) 75 - 76 72 77 73 /** 78 74 * wimax_report_rfkill_hw - Reports changes in the hardware RF switch ··· 95 99 int result; 96 100 struct device *dev = wimax_dev_to_dev(wimax_dev); 97 101 enum wimax_st wimax_state; 98 - enum rfkill_state rfkill_state; 99 102 100 103 d_fnstart(3, dev, "(wimax_dev %p state %u)\n", wimax_dev, state); 101 104 BUG_ON(state == WIMAX_RF_QUERY); ··· 107 112 108 113 if (state != wimax_dev->rf_hw) { 109 114 wimax_dev->rf_hw = state; 110 - rfkill_state = state == WIMAX_RF_ON ? 111 - RFKILL_STATE_UNBLOCKED : RFKILL_STATE_SOFT_BLOCKED; 112 115 if (wimax_dev->rf_hw == WIMAX_RF_ON 113 116 && wimax_dev->rf_sw == WIMAX_RF_ON) 114 117 wimax_state = WIMAX_ST_READY; 115 118 else 116 119 wimax_state = WIMAX_ST_RADIO_OFF; 120 + 121 + rfkill_set_hw_state(wimax_dev->rfkill, state == WIMAX_RF_OFF); 122 + 117 123 __wimax_state_change(wimax_dev, wimax_state); 118 - input_report_key(wimax_dev->rfkill_input, KEY_WIMAX, 119 - rfkill_state); 120 124 } 121 125 error_not_ready: 122 126 mutex_unlock(&wimax_dev->mutex); ··· 168 174 else 169 175 wimax_state = WIMAX_ST_RADIO_OFF; 170 176 __wimax_state_change(wimax_dev, wimax_state); 177 + rfkill_set_sw_state(wimax_dev->rfkill, state == WIMAX_RF_OFF); 171 178 } 172 179 error_not_ready: 173 180 mutex_unlock(&wimax_dev->mutex); ··· 244 249 * 245 250 * NOTE: This call will block until the operation is completed. 246 251 */ 247 - static 248 - int wimax_rfkill_toggle_radio(void *data, enum rfkill_state state) 252 + static int wimax_rfkill_set_radio_block(void *data, bool blocked) 249 253 { 250 254 int result; 251 255 struct wimax_dev *wimax_dev = data; 252 256 struct device *dev = wimax_dev_to_dev(wimax_dev); 253 257 enum wimax_rf_state rf_state; 254 258 255 - d_fnstart(3, dev, "(wimax_dev %p state %u)\n", wimax_dev, state); 256 - switch (state) { 257 - case RFKILL_STATE_SOFT_BLOCKED: 259 + d_fnstart(3, dev, "(wimax_dev %p blocked %u)\n", wimax_dev, blocked); 260 + rf_state = WIMAX_RF_ON; 261 + if (blocked) 258 262 rf_state = WIMAX_RF_OFF; 259 - break; 260 - case RFKILL_STATE_UNBLOCKED: 261 - rf_state = WIMAX_RF_ON; 262 - break; 263 - default: 264 - BUG(); 265 - } 266 263 mutex_lock(&wimax_dev->mutex); 267 264 if (wimax_dev->state <= __WIMAX_ST_QUIESCING) 268 - result = 0; /* just pretend it didn't happen */ 265 + result = 0; 269 266 else 270 267 result = __wimax_rf_toggle_radio(wimax_dev, rf_state); 271 268 mutex_unlock(&wimax_dev->mutex); 272 - d_fnend(3, dev, "(wimax_dev %p state %u) = %d\n", 273 - wimax_dev, state, result); 269 + d_fnend(3, dev, "(wimax_dev %p blocked %u) = %d\n", 270 + wimax_dev, blocked, result); 274 271 return result; 275 272 } 276 273 274 + static const struct rfkill_ops wimax_rfkill_ops = { 275 + .set_block = wimax_rfkill_set_radio_block, 276 + }; 277 277 278 278 /** 279 279 * wimax_rfkill - Set the software RF switch state for a WiMAX device ··· 312 322 result = __wimax_rf_toggle_radio(wimax_dev, state); 313 323 if (result < 0) 314 324 goto error; 325 + rfkill_set_sw_state(wimax_dev->rfkill, state == WIMAX_RF_OFF); 315 326 break; 316 327 case WIMAX_RF_QUERY: 317 328 break; ··· 340 349 { 341 350 int result; 342 351 struct rfkill *rfkill; 343 - struct input_dev *input_dev; 344 352 struct device *dev = wimax_dev_to_dev(wimax_dev); 345 353 346 354 d_fnstart(3, dev, "(wimax_dev %p)\n", wimax_dev); 347 355 /* Initialize RF Kill */ 348 356 result = -ENOMEM; 349 - rfkill = rfkill_allocate(dev, RFKILL_TYPE_WIMAX); 357 + rfkill = rfkill_alloc(wimax_dev->name, dev, RFKILL_TYPE_WIMAX, 358 + &wimax_rfkill_ops, wimax_dev); 350 359 if (rfkill == NULL) 351 360 goto error_rfkill_allocate; 361 + 362 + d_printf(1, dev, "rfkill %p\n", rfkill); 363 + 352 364 wimax_dev->rfkill = rfkill; 353 365 354 - rfkill->name = wimax_dev->name; 355 - rfkill->state = RFKILL_STATE_UNBLOCKED; 356 - rfkill->data = wimax_dev; 357 - rfkill->toggle_radio = wimax_rfkill_toggle_radio; 358 - 359 - /* Initialize the input device for the hw key */ 360 - input_dev = input_allocate_device(); 361 - if (input_dev == NULL) 362 - goto error_input_allocate; 363 - wimax_dev->rfkill_input = input_dev; 364 - d_printf(1, dev, "rfkill %p input %p\n", rfkill, input_dev); 365 - 366 - input_dev->name = wimax_dev->name; 367 - /* FIXME: get a real device bus ID and stuff? do we care? */ 368 - input_dev->id.bustype = BUS_HOST; 369 - input_dev->id.vendor = 0xffff; 370 - input_dev->evbit[0] = BIT(EV_KEY); 371 - set_bit(KEY_WIMAX, input_dev->keybit); 372 - 373 - /* Register both */ 374 - result = input_register_device(wimax_dev->rfkill_input); 375 - if (result < 0) 376 - goto error_input_register; 377 366 result = rfkill_register(wimax_dev->rfkill); 378 367 if (result < 0) 379 368 goto error_rfkill_register; ··· 365 394 d_fnend(3, dev, "(wimax_dev %p) = 0\n", wimax_dev); 366 395 return 0; 367 396 368 - /* if rfkill_register() suceeds, can't use rfkill_free() any 369 - * more, only rfkill_unregister() [it owns the refcount]; with 370 - * the input device we have the same issue--hence the if. */ 371 397 error_rfkill_register: 372 - input_unregister_device(wimax_dev->rfkill_input); 373 - wimax_dev->rfkill_input = NULL; 374 - error_input_register: 375 - if (wimax_dev->rfkill_input) 376 - input_free_device(wimax_dev->rfkill_input); 377 - error_input_allocate: 378 - rfkill_free(wimax_dev->rfkill); 398 + rfkill_destroy(wimax_dev->rfkill); 379 399 error_rfkill_allocate: 380 400 d_fnend(3, dev, "(wimax_dev %p) = %d\n", wimax_dev, result); 381 401 return result; ··· 385 423 { 386 424 struct device *dev = wimax_dev_to_dev(wimax_dev); 387 425 d_fnstart(3, dev, "(wimax_dev %p)\n", wimax_dev); 388 - rfkill_unregister(wimax_dev->rfkill); /* frees */ 389 - input_unregister_device(wimax_dev->rfkill_input); 426 + rfkill_unregister(wimax_dev->rfkill); 427 + rfkill_destroy(wimax_dev->rfkill); 390 428 d_fnend(3, dev, "(wimax_dev %p)\n", wimax_dev); 391 429 } 392 - 393 - 394 - #else /* #ifdef CONFIG_RFKILL */ 395 - 396 - void wimax_report_rfkill_hw(struct wimax_dev *wimax_dev, 397 - enum wimax_rf_state state) 398 - { 399 - } 400 - EXPORT_SYMBOL_GPL(wimax_report_rfkill_hw); 401 - 402 - void wimax_report_rfkill_sw(struct wimax_dev *wimax_dev, 403 - enum wimax_rf_state state) 404 - { 405 - } 406 - EXPORT_SYMBOL_GPL(wimax_report_rfkill_sw); 407 - 408 - int wimax_rfkill(struct wimax_dev *wimax_dev, 409 - enum wimax_rf_state state) 410 - { 411 - return WIMAX_RF_ON << 1 | WIMAX_RF_ON; 412 - } 413 - EXPORT_SYMBOL_GPL(wimax_rfkill); 414 - 415 - int wimax_rfkill_add(struct wimax_dev *wimax_dev) 416 - { 417 - return 0; 418 - } 419 - 420 - void wimax_rfkill_rm(struct wimax_dev *wimax_dev) 421 - { 422 - } 423 - 424 - #endif /* #ifdef CONFIG_RFKILL */ 425 430 426 431 427 432 /*