/* The P2P Device interface event must not be ignored contrary to what
         * firmware tells us. Older firmware uses p2p noif, with sta role.
-        * This should be accepted.
+        * This should be accepted when p2pdev_setup is ongoing. TDLS setup will
+        * use the same ifevent and should be ignored.
         */
        is_p2pdev = ((ifevent->flags & BRCMF_E_IF_FLAG_NOIF) &&
                     (ifevent->role == BRCMF_E_IF_ROLE_P2P_CLIENT ||
-                     ifevent->role == BRCMF_E_IF_ROLE_STA));
+                     ((ifevent->role == BRCMF_E_IF_ROLE_STA) &&
+                      (drvr->fweh.p2pdev_setup_ongoing))));
        if (!is_p2pdev && (ifevent->flags & BRCMF_E_IF_FLAG_NOIF)) {
                brcmf_dbg(EVENT, "event can be ignored\n");
                return;
        }
 }
 
+/**
+ * brcmf_fweh_p2pdev_setup() - P2P device setup ongoing (or not).
+ *
+ * @ifp: ifp on which setup is taking place or finished.
+ * @ongoing: p2p device setup in progress (or not).
+ */
+void brcmf_fweh_p2pdev_setup(struct brcmf_if *ifp, bool ongoing)
+{
+       ifp->drvr->fweh.p2pdev_setup_ongoing = ongoing;
+}
+
 /**
  * brcmf_fweh_attach() - initialize firmware event handling.
  *
 
 /**
  * struct brcmf_fweh_info - firmware event handling information.
  *
+ * @p2pdev_setup_ongoing: P2P device creation in progress.
  * @event_work: event worker.
  * @evt_q_lock: lock for event queue protection.
  * @event_q: event queue.
  * @evt_handler: registered event handlers.
  */
 struct brcmf_fweh_info {
+       bool p2pdev_setup_ongoing;
        struct work_struct event_work;
        spinlock_t evt_q_lock;
        struct list_head event_q;
 int brcmf_fweh_activate_events(struct brcmf_if *ifp);
 void brcmf_fweh_process_event(struct brcmf_pub *drvr,
                              struct brcmf_event *event_packet);
+void brcmf_fweh_p2pdev_setup(struct brcmf_if *ifp, bool ongoing);
 
 static inline void brcmf_fweh_process_skb(struct brcmf_pub *drvr,
                                          struct sk_buff *skb)
 
        brcmf_p2p_set_firmware(pri_ifp, p2p->dev_addr);
 
        brcmf_cfg80211_arm_vif_event(p2p->cfg, p2p_vif);
+       brcmf_fweh_p2pdev_setup(pri_ifp, true);
 
        /* Initialize P2P Discovery in the firmware */
        err = brcmf_fil_iovar_int_set(pri_ifp, "p2p_disc", 1);
        if (err < 0) {
                brcmf_err("set p2p_disc error\n");
+               brcmf_fweh_p2pdev_setup(pri_ifp, false);
                brcmf_cfg80211_arm_vif_event(p2p->cfg, NULL);
                goto fail;
        }
        err = brcmf_cfg80211_wait_vif_event_timeout(p2p->cfg, BRCMF_E_IF_ADD,
                                                    msecs_to_jiffies(1500));
        brcmf_cfg80211_arm_vif_event(p2p->cfg, NULL);
+       brcmf_fweh_p2pdev_setup(pri_ifp, false);
        if (!err) {
                brcmf_err("timeout occurred\n");
                err = -EIO;
                memcpy(p2p_ifp->mac_addr, p2p->dev_addr, ETH_ALEN);
                brcmf_p2p_set_firmware(pri_ifp, p2p->dev_addr);
 
+               brcmf_fweh_p2pdev_setup(pri_ifp, true);
+
                /* Initialize P2P Discovery in the firmware */
                err = brcmf_fil_iovar_int_set(pri_ifp, "p2p_disc", 1);
                if (err < 0) {
                INIT_WORK(&p2p->afx_hdl.afx_work, brcmf_p2p_afx_handler);
                init_completion(&p2p->afx_hdl.act_frm_scan);
                init_completion(&p2p->wait_next_af);
-       }
 exit:
+               brcmf_fweh_p2pdev_setup(pri_ifp, false);
+       }
        return err;
 }