rfkill: don't impose global states on resume (just restore the previous states)
authorAlan Jenkins <alan-jenkins@tuffmail.co.uk>
Mon, 8 Jun 2009 12:12:23 +0000 (13:12 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 10 Jun 2009 17:28:37 +0000 (13:28 -0400)
Once rfkill-input is disabled, the "global" states will only be used as
default initial states.

Since the states will always be the same after resume, we shouldn't
generate events on resume.

Signed-off-by: Alan Jenkins <alan-jenkins@tuffmail.co.uk>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
include/linux/rfkill.h
net/rfkill/core.c

index c1dca0b8138b6d33230d907b9f9cb1896c9fb03f..16e39c7a67fcf24533b0e12a60ed3b04433e6ee7 100644 (file)
@@ -212,7 +212,7 @@ void rfkill_destroy(struct rfkill *rfkill);
  *
  * rfkill drivers that get events when the hard-blocked state changes
  * use this function to notify the rfkill core (and through that also
- * userspace) of the current state -- they should also use this after
+ * userspace) of the current state.  They should also use this after
  * resume if the state could have changed.
  *
  * You need not (but may) call this function if poll_state is assigned.
@@ -234,8 +234,9 @@ bool __must_check rfkill_set_hw_state(struct rfkill *rfkill, bool blocked);
  * rfkill drivers that get events when the soft-blocked state changes
  * (yes, some platforms directly act on input but allow changing again)
  * use this function to notify the rfkill core (and through that also
- * userspace) of the current state -- they should also use this after
- * resume if the state could have changed.
+ * userspace) of the current state.  It is not necessary to notify on
+ * resume; since hibernation can always change the soft-blocked state,
+ * the rfkill core will unconditionally restore the previous state.
  *
  * This function can be called in any context, even from within rfkill
  * callbacks.
index fa430bd03f1458efe7b66fbb563687ecd4849399..4e68ab439d5dadad189c90999370ca6d4969478b 100644 (file)
@@ -728,15 +728,11 @@ static int rfkill_resume(struct device *dev)
        struct rfkill *rfkill = to_rfkill(dev);
        bool cur;
 
-       mutex_lock(&rfkill_global_mutex);
-       cur = rfkill_global_states[rfkill->type].cur;
+       cur = !!(rfkill->state & RFKILL_BLOCK_SW);
        rfkill_set_block(rfkill, cur);
-       mutex_unlock(&rfkill_global_mutex);
 
        rfkill->suspended = false;
 
-       schedule_work(&rfkill->uevent_work);
-
        rfkill_resume_polling(rfkill);
 
        return 0;