iwlagn: properly wait for PAN disable
authorJohannes Berg <johannes.berg@intel.com>
Wed, 5 Jan 2011 00:22:01 +0000 (16:22 -0800)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 21 Jan 2011 20:32:21 +0000 (15:32 -0500)
Previously I hacked this with an msleep(300)
which was fine since we never had longer PAN
time slots, but now that we will have them I
need to fix that. Use the new notification
wait support to properly wait for the WIPAN
deactivation complete signal from the ucode.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/iwlwifi/iwl-agn-rxon.c
drivers/net/wireless/iwlwifi/iwl-commands.h
drivers/net/wireless/iwlwifi/iwl-hcmd.c

index 6d140bd5329187ed7a2d8a9b713933c00e835e80..99e96508b1dcde18885c71190b27e7b33d7f018f 100644 (file)
@@ -52,10 +52,14 @@ static int iwlagn_disable_pan(struct iwl_priv *priv,
                              struct iwl_rxon_context *ctx,
                              struct iwl_rxon_cmd *send)
 {
+       struct iwl_notification_wait disable_wait;
        __le32 old_filter = send->filter_flags;
        u8 old_dev_type = send->dev_type;
        int ret;
 
+       iwlagn_init_notification_wait(priv, &disable_wait, NULL,
+                                     REPLY_WIPAN_DEACTIVATION_COMPLETE);
+
        send->filter_flags &= ~RXON_FILTER_ASSOC_MSK;
        send->dev_type = RXON_DEV_TYPE_P2P;
        ret = iwl_send_cmd_pdu(priv, ctx->rxon_cmd, sizeof(*send), send);
@@ -63,11 +67,16 @@ static int iwlagn_disable_pan(struct iwl_priv *priv,
        send->filter_flags = old_filter;
        send->dev_type = old_dev_type;
 
-       if (ret)
+       if (ret) {
                IWL_ERR(priv, "Error disabling PAN (%d)\n", ret);
+               iwlagn_remove_notification(priv, &disable_wait);
+       } else {
+               signed long wait_res;
 
-       /* FIXME: WAIT FOR PAN DISABLE */
-       msleep(300);
+               wait_res = iwlagn_wait_notification(priv, &disable_wait, HZ);
+               if (wait_res == 0)
+                       IWL_ERR(priv, "Timed out waiting for PAN disable\n");
+       }
 
        return ret;
 }
index f893d4a6aa876a69b2869c3fbb0edaa642b7dfed..abe2479215f0a02c0239399d095a1e9acdfc13e0 100644 (file)
@@ -189,6 +189,7 @@ enum {
        REPLY_WIPAN_WEPKEY = 0xb8,      /* use REPLY_WEPKEY structure */
        REPLY_WIPAN_P2P_CHANNEL_SWITCH = 0xb9,
        REPLY_WIPAN_NOA_NOTIFICATION = 0xbc,
+       REPLY_WIPAN_DEACTIVATION_COMPLETE = 0xbd,
 
        REPLY_MAX = 0xff
 };
index c373b53babeaee1cd1c4e7781151e683e305f2ba..e4b953d7b7bf726b22250b0ace87801b04d39dfb 100644 (file)
@@ -108,6 +108,7 @@ const char *get_cmd_string(u8 cmd)
                IWL_CMD(REPLY_WIPAN_WEPKEY);
                IWL_CMD(REPLY_WIPAN_P2P_CHANNEL_SWITCH);
                IWL_CMD(REPLY_WIPAN_NOA_NOTIFICATION);
+               IWL_CMD(REPLY_WIPAN_DEACTIVATION_COMPLETE);
        default:
                return "UNKNOWN";