return rc;
        }
 
-       wil_p2p_stop_discovery(wil);
+       (void)wil_p2p_stop_discovery(wil);
 
        wil_dbg_misc(wil, "Start scan_request 0x%p\n", request);
        wil_dbg_misc(wil, "SSID count: %d", request->n_ssids);
                                        u8 key_index, bool unicast,
                                        bool multicast)
 {
+       struct wil6210_priv *wil = wiphy_to_wil(wiphy);
+
+       wil_dbg_misc(wil, "%s: entered\n", __func__);
        return 0;
 }
 
 
        wil_dbg_misc(wil, "%s()\n", __func__);
 
-       wil_p2p_cancel_listen(wil, cookie);
-
-       return 0;
+       return wil_p2p_cancel_listen(wil, cookie);
 }
 
 /**
 
        return rc;
 }
 
-void wil_p2p_stop_discovery(struct wil6210_priv *wil)
+u8 wil_p2p_stop_discovery(struct wil6210_priv *wil)
 {
        struct wil_p2p_info *p2p = &wil->p2p;
+       u8 started = p2p->discovery_started;
 
        if (p2p->discovery_started) {
                del_timer_sync(&p2p->discovery_timer);
                p2p->discovery_started = 0;
                wmi_stop_discovery(wil);
        }
+
+       return started;
 }
 
-void wil_p2p_cancel_listen(struct wil6210_priv *wil, u64 cookie)
+int wil_p2p_cancel_listen(struct wil6210_priv *wil, u64 cookie)
 {
        struct wil_p2p_info *p2p = &wil->p2p;
+       u8 started;
+
+       mutex_lock(&wil->mutex);
 
-       if (cookie != p2p->cookie)
+       if (cookie != p2p->cookie) {
                wil_info(wil, "%s: Cookie mismatch: 0x%016llx vs. 0x%016llx\n",
                         __func__, p2p->cookie, cookie);
+               mutex_unlock(&wil->mutex);
+               return -ENOENT;
+       }
+
+       started = wil_p2p_stop_discovery(wil);
+
+       mutex_unlock(&wil->mutex);
 
-       wil_p2p_stop_discovery(wil);
+       if (!started) {
+               wil_err(wil, "%s: listen not started\n", __func__);
+               return -ENOENT;
+       }
 
        mutex_lock(&wil->p2p_wdev_mutex);
        cfg80211_remain_on_channel_expired(wil->radio_wdev,
                                           GFP_KERNEL);
        wil->radio_wdev = wil->wdev;
        mutex_unlock(&wil->p2p_wdev_mutex);
+       return 0;
 }
 
 void wil_p2p_listen_expired(struct work_struct *work)
                        struct wil_p2p_info, discovery_expired_work);
        struct wil6210_priv *wil = container_of(p2p,
                        struct wil6210_priv, p2p);
+       u8 started;
 
        wil_dbg_misc(wil, "%s()\n", __func__);
 
-       wil_p2p_stop_discovery(wil);
+       mutex_lock(&wil->mutex);
+       started = wil_p2p_stop_discovery(wil);
+       mutex_unlock(&wil->mutex);
 
-       mutex_lock(&wil->p2p_wdev_mutex);
-       cfg80211_remain_on_channel_expired(wil->radio_wdev,
-                                          p2p->cookie,
-                                          &p2p->listen_chan,
-                                          GFP_KERNEL);
-       wil->radio_wdev = wil->wdev;
-       mutex_unlock(&wil->p2p_wdev_mutex);
+       if (started) {
+               mutex_lock(&wil->p2p_wdev_mutex);
+               cfg80211_remain_on_channel_expired(wil->radio_wdev,
+                                                  p2p->cookie,
+                                                  &p2p->listen_chan,
+                                                  GFP_KERNEL);
+               wil->radio_wdev = wil->wdev;
+               mutex_unlock(&wil->p2p_wdev_mutex);
+       }
 
 }
 
                        struct wil_p2p_info, discovery_expired_work);
        struct wil6210_priv *wil = container_of(p2p,
                        struct wil6210_priv, p2p);
+       u8 started;
 
        wil_dbg_misc(wil, "%s()\n", __func__);
 
-       wil_p2p_stop_discovery(wil);
+       mutex_lock(&wil->mutex);
+       started = wil_p2p_stop_discovery(wil);
+       mutex_unlock(&wil->mutex);
 
-       mutex_lock(&wil->p2p_wdev_mutex);
-       cfg80211_scan_done(wil->scan_request, 0);
-       wil->scan_request = NULL;
-       wil->radio_wdev = wil->wdev;
-       mutex_unlock(&wil->p2p_wdev_mutex);
+       if (started) {
+               mutex_lock(&wil->p2p_wdev_mutex);
+               cfg80211_scan_done(wil->scan_request, 0);
+               wil->scan_request = NULL;
+               wil->radio_wdev = wil->wdev;
+               mutex_unlock(&wil->p2p_wdev_mutex);
+       }
 }