rfkill: rewrite
[deliverable/linux.git] / drivers / net / wireless / iwmc3200wifi / rfkill.c
index 4ca8b495f82d8ae85c0f6f8ac8441e7c79a3c2d3..8ee2c3c09a020a4eb5013087c95e8ab13e7f477e 100644 (file)
 
 #include "iwm.h"
 
-static int iwm_rfkill_soft_toggle(void *data, enum rfkill_state state)
+static int iwm_rfkill_set_block(void *data, bool blocked)
 {
        struct iwm_priv *iwm = data;
 
-       switch (state) {
-       case RFKILL_STATE_UNBLOCKED:
+       if (!blocked) {
                if (test_bit(IWM_RADIO_RFKILL_HW, &iwm->radio))
                        return -EBUSY;
 
                if (test_and_clear_bit(IWM_RADIO_RFKILL_SW, &iwm->radio) &&
                    (iwm_to_ndev(iwm)->flags & IFF_UP))
-                       iwm_up(iwm);
-
-               break;
-       case RFKILL_STATE_SOFT_BLOCKED:
+                       return iwm_up(iwm);
+       } else {
                if (!test_and_set_bit(IWM_RADIO_RFKILL_SW, &iwm->radio))
-                       iwm_down(iwm);
-
-               break;
-       default:
-               break;
+                       return iwm_down(iwm);
        }
 
        return 0;
 }
 
+static const struct rfkill_ops iwm_rfkill_ops = {
+       .set_block = iwm_rfkill_set_block,
+};
+
 int iwm_rfkill_init(struct iwm_priv *iwm)
 {
        int ret;
 
-       iwm->rfkill = rfkill_allocate(iwm_to_dev(iwm), RFKILL_TYPE_WLAN);
+       iwm->rfkill = rfkill_alloc(KBUILD_MODNAME,
+                                  iwm_to_dev(iwm),
+                                  RFKILL_TYPE_WLAN,
+                                  &iwm_rfkill_ops, iwm);
        if (!iwm->rfkill) {
                IWM_ERR(iwm, "Unable to allocate rfkill device\n");
                return -ENOMEM;
        }
 
-       iwm->rfkill->name = KBUILD_MODNAME;
-       iwm->rfkill->data = iwm;
-       iwm->rfkill->state = RFKILL_STATE_UNBLOCKED;
-       iwm->rfkill->toggle_radio = iwm_rfkill_soft_toggle;
-
        ret = rfkill_register(iwm->rfkill);
        if (ret) {
                IWM_ERR(iwm, "Failed to register rfkill device\n");
@@ -74,15 +69,15 @@ int iwm_rfkill_init(struct iwm_priv *iwm)
 
        return 0;
  fail:
-       rfkill_free(iwm->rfkill);
+       rfkill_destroy(iwm->rfkill);
        return ret;
 }
 
 void iwm_rfkill_exit(struct iwm_priv *iwm)
 {
-       if (iwm->rfkill)
+       if (iwm->rfkill) {
                rfkill_unregister(iwm->rfkill);
-
-       rfkill_free(iwm->rfkill);
+               rfkill_destroy(iwm->rfkill);
+       }
        iwm->rfkill = NULL;
 }
This page took 0.028941 seconds and 5 git commands to generate.