aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenrique de Moraes Holschuh <hmh@hmh.eng.br>2008-07-21 20:18:17 -0400
committerJohn W. Linville <linville@tuxdriver.com>2008-07-29 16:36:32 -0400
commit2fd9b2212e25e6411b6f309707f4e2683d164250 (patch)
treeb886e6d11d3478f86ac7e270ef1dfc7fe02e7128
parent734b5aa911dc65f4563048f069dfc631c9aa7de7 (diff)
rfkill: document rfkill_force_state as required (v2)
While the rfkill class does work with just get_state(), it doesn't work well on devices that are subject to external events that cause rfkill state changes. Document that rfkill_force_state() is required in those cases. Signed-off-by: Henrique de Moraes Holschuh <hmh@hmh.eng.br> Acked-by: Ivo van Doorn <IvDoorn@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--Documentation/rfkill.txt20
-rw-r--r--net/rfkill/rfkill.c7
2 files changed, 22 insertions, 5 deletions
diff --git a/Documentation/rfkill.txt b/Documentation/rfkill.txt
index 0843ed0163a5..28b6ec87c642 100644
--- a/Documentation/rfkill.txt
+++ b/Documentation/rfkill.txt
@@ -390,9 +390,10 @@ rfkill lines are inactive, it must return RFKILL_STATE_SOFT_BLOCKED if its soft
390rfkill input line is active. Only if none of the rfkill input lines are 390rfkill input line is active. Only if none of the rfkill input lines are
391active, will it return RFKILL_STATE_UNBLOCKED. 391active, will it return RFKILL_STATE_UNBLOCKED.
392 392
393If it doesn't implement the get_state() hook, it must make sure that its calls 393Since the device has a hardware rfkill line, it IS subject to state changes
394to rfkill_force_state() are enough to keep the status always up-to-date, and it 394external to rfkill. Therefore, the driver must make sure that it calls
395must do a rfkill_force_state() on resume from sleep. 395rfkill_force_state() to keep the status always up-to-date, and it must do a
396rfkill_force_state() on resume from sleep.
396 397
397Every time the driver gets a notification from the card that one of its rfkill 398Every time the driver gets a notification from the card that one of its rfkill
398lines changed state (polling might be needed on badly designed cards that don't 399lines changed state (polling might be needed on badly designed cards that don't
@@ -422,13 +423,24 @@ of the hardware is unknown), or read-write (where the hardware can be queried
422about its current state). 423about its current state).
423 424
424The rfkill class will call the get_state hook of a device every time it needs 425The rfkill class will call the get_state hook of a device every time it needs
425to know the *real* current state of the hardware. This can happen often. 426to know the *real* current state of the hardware. This can happen often, but
427it does not do any polling, so it is not enough on hardware that is subject
428to state changes outside of the rfkill subsystem.
429
430Therefore, calling rfkill_force_state() when a state change happens is
431mandatory when the device has a hardware rfkill line, or when something else
432like the firmware could cause its state to be changed without going through the
433rfkill class.
426 434
427Some hardware provides events when its status changes. In these cases, it is 435Some hardware provides events when its status changes. In these cases, it is
428best for the driver to not provide a get_state hook, and instead register the 436best for the driver to not provide a get_state hook, and instead register the
429rfkill class *already* with the correct status, and keep it updated using 437rfkill class *already* with the correct status, and keep it updated using
430rfkill_force_state() when it gets an event from the hardware. 438rfkill_force_state() when it gets an event from the hardware.
431 439
440rfkill_force_state() must be used on the device resume handlers to update the
441rfkill status, should there be any chance of the device status changing during
442the sleep.
443
432There is no provision for a statically-allocated rfkill struct. You must 444There is no provision for a statically-allocated rfkill struct. You must
433use rfkill_allocate() to allocate one. 445use rfkill_allocate() to allocate one.
434 446
diff --git a/net/rfkill/rfkill.c b/net/rfkill/rfkill.c
index 7a560b785097..022fe50ab0e0 100644
--- a/net/rfkill/rfkill.c
+++ b/net/rfkill/rfkill.c
@@ -252,7 +252,12 @@ EXPORT_SYMBOL_GPL(rfkill_epo);
252 * a notification by the firmware/hardware of the current *real* 252 * a notification by the firmware/hardware of the current *real*
253 * state of the radio rfkill switch. 253 * state of the radio rfkill switch.
254 * 254 *
255 * It may not be called from an atomic context. 255 * Devices which are subject to external changes on their rfkill
256 * state (such as those caused by a hardware rfkill line) MUST
257 * have their driver arrange to call rfkill_force_state() as soon
258 * as possible after such a change.
259 *
260 * This function may not be called from an atomic context.
256 */ 261 */
257int rfkill_force_state(struct rfkill *rfkill, enum rfkill_state state) 262int rfkill_force_state(struct rfkill *rfkill, enum rfkill_state state)
258{ 263{