int iwm_send_wifi_if_cmd(struct iwm_priv *iwm, void *payload, u16 payload_size,
                         bool resp)
 {
+       struct iwm_umac_wifi_if *hdr = (struct iwm_umac_wifi_if *)payload;
        struct iwm_udma_wifi_cmd udma_cmd = UDMA_UMAC_INIT;
        struct iwm_umac_cmd umac_cmd;
+       int ret;
+       u8 oid = hdr->oid;
 
        umac_cmd.id = UMAC_CMD_OPCODE_WIFI_IF_WRAPPER;
        umac_cmd.resp = resp;
 
-       return iwm_hal_send_umac_cmd(iwm, &udma_cmd, &umac_cmd,
-                                    payload, payload_size);
+       ret = iwm_hal_send_umac_cmd(iwm, &udma_cmd, &umac_cmd,
+                                   payload, payload_size);
+
+       if (resp) {
+               ret = wait_event_interruptible_timeout(iwm->wifi_ntfy_queue,
+                                  test_and_clear_bit(oid, &iwm->wifi_ntfy[0]),
+                                  3 * HZ);
+
+               if (!ret)
+                       ret = -EBUSY;
+       }
+
+       return ret;
 }
 
 static struct coex_event iwm_sta_xor_prio_tbl[COEX_EVENTS_NUM] =
                return ret;
        }
 
-       /* Wait for the profile to be active */
-       ret = wait_event_interruptible_timeout(iwm->mlme_queue,
-                                              iwm->umac_profile_active == 1,
-                                              3 * HZ);
-       if (!ret)
-               return -EBUSY;
-
-
        for (i = 0; i < IWM_NUM_KEYS; i++)
                if (iwm->keys[i].in_use) {
                        int default_key = 0;
 
 int iwm_invalidate_mlme_profile(struct iwm_priv *iwm)
 {
-       int ret;
        struct iwm_umac_invalidate_profile invalid;
+       int ret;
 
        invalid.hdr.oid = UMAC_WIFI_IF_CMD_INVALIDATE_PROFILE;
        invalid.hdr.buf_size =
                return ret;
 
        ret = wait_event_interruptible_timeout(iwm->mlme_queue,
-                                (iwm->umac_profile_active == 0),
-                                              2 * HZ);
+                               (iwm->umac_profile_active == 0), 2 * HZ);
        if (!ret)
                return -EBUSY;
 
 
        INIT_LIST_HEAD(&iwm->pending_notif);
        init_waitqueue_head(&iwm->notif_queue);
        init_waitqueue_head(&iwm->nonwifi_queue);
+       init_waitqueue_head(&iwm->wifi_ntfy_queue);
        init_waitqueue_head(&iwm->mlme_queue);
        memcpy(&iwm->conf, &def_iwm_conf, sizeof(struct iwm_conf));
        spin_lock_init(&iwm->tx_credit.lock);
 
                        (struct iwm_umac_wifi_if *)cmd->buf.payload;
 
        IWM_DBG_NTF(iwm, DBG, "WIFI_IF_WRAPPER cmd is delivered to UMAC: "
-                   "oid is %d\n", hdr->oid);
+                   "oid is 0x%x\n", hdr->oid);
+
+       if (hdr->oid <= WIFI_IF_NTFY_MAX) {
+               set_bit(hdr->oid, &iwm->wifi_ntfy[0]);
+               wake_up_interruptible(&iwm->wifi_ntfy_queue);
+       } else
+               return -EINVAL;
 
        switch (hdr->oid) {
        case UMAC_WIFI_IF_CMD_SET_PROFILE:
                iwm->umac_profile_active = 1;
-               wake_up_interruptible(&iwm->mlme_queue);
                break;
        default:
                break;