Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f0605025 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "wil6210: fix stop p2p device handling"

parents ff72550c 0fab98e4
Loading
Loading
Loading
Loading
+9 −12
Original line number Diff line number Diff line
@@ -1408,19 +1408,16 @@ static void wil_cfg80211_stop_p2p_device(struct wiphy *wiphy,
					 struct wireless_dev *wdev)
{
	struct wil6210_priv *wil = wiphy_to_wil(wiphy);
	u8 started;
	struct wil_p2p_info *p2p = &wil->p2p;

	if (!p2p->p2p_dev_started)
		return;

	wil_dbg_misc(wil, "%s: entered\n", __func__);
	mutex_lock(&wil->mutex);
	started = wil_p2p_stop_discovery(wil);
	if (started && wil->scan_request) {
		cfg80211_scan_done(wil->scan_request, 1);
		wil->scan_request = NULL;
		wil->radio_wdev = wil->wdev;
	}
	wil_p2p_stop_radio_operations(wil);
	p2p->p2p_dev_started = 0;
	mutex_unlock(&wil->mutex);

	wil->p2p.p2p_dev_started = 0;
}

static struct cfg80211_ops wil_cfg80211_ops = {
@@ -1539,11 +1536,11 @@ void wil_p2p_wdev_free(struct wil6210_priv *wil)

	mutex_lock(&wil->p2p_wdev_mutex);
	p2p_wdev = wil->p2p_wdev;
	if (p2p_wdev) {
	wil->p2p_wdev = NULL;
	wil->radio_wdev = wil_to_wdev(wil);
	mutex_unlock(&wil->p2p_wdev_mutex);
	if (p2p_wdev) {
		cfg80211_unregister_wdev(p2p_wdev);
		kfree(p2p_wdev);
	}
	mutex_unlock(&wil->p2p_wdev_mutex);
}
+1 −1
Original line number Diff line number Diff line
@@ -1046,7 +1046,7 @@ int __wil_down(struct wil6210_priv *wil)
	}
	wil_enable_irq(wil);

	(void)wil_p2p_stop_discovery(wil);
	wil_p2p_stop_radio_operations(wil);

	if (wil->scan_request) {
		wil_dbg_misc(wil, "Abort scan_request 0x%p\n",
+43 −0
Original line number Diff line number Diff line
@@ -259,3 +259,46 @@ void wil_p2p_search_expired(struct work_struct *work)
		mutex_unlock(&wil->p2p_wdev_mutex);
	}
}

void wil_p2p_stop_radio_operations(struct wil6210_priv *wil)
{
	struct wil_p2p_info *p2p = &wil->p2p;

	lockdep_assert_held(&wil->mutex);

	mutex_lock(&wil->p2p_wdev_mutex);

	if (wil->radio_wdev != wil->p2p_wdev)
		goto out;

	if (!p2p->discovery_started) {
		/* Regular scan on the p2p device */
		if (wil->scan_request &&
		    wil->scan_request->wdev == wil->p2p_wdev) {
			cfg80211_scan_done(wil->scan_request, 1);
			wil->scan_request = NULL;
		}
		goto out;
	}

	/* Search or listen on p2p device */
	mutex_unlock(&wil->p2p_wdev_mutex);
	wil_p2p_stop_discovery(wil);
	mutex_lock(&wil->p2p_wdev_mutex);

	if (wil->scan_request) {
		/* search */
		cfg80211_scan_done(wil->scan_request, 1);
		wil->scan_request = NULL;
	} else {
		/* listen */
		cfg80211_remain_on_channel_expired(wil->radio_wdev,
						   p2p->cookie,
						   &p2p->listen_chan,
						   GFP_KERNEL);
	}

out:
	wil->radio_wdev = wil->wdev;
	mutex_unlock(&wil->p2p_wdev_mutex);
}
+4 −1
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#include <linux/interrupt.h>
#include <linux/suspend.h>
#include "wil6210.h"
#include <linux/rtnetlink.h>

static bool use_msi = true;
module_param(use_msi, bool, S_IRUGO);
@@ -293,6 +294,9 @@ static void wil_pcie_remove(struct pci_dev *pdev)
#endif /* CONFIG_PM */

	wil6210_debugfs_remove(wil);
	rtnl_lock();
	wil_p2p_wdev_free(wil);
	rtnl_unlock();
	wil_if_remove(wil);
	wil_if_pcie_disable(wil);
	pci_iounmap(pdev, csr);
@@ -300,7 +304,6 @@ static void wil_pcie_remove(struct pci_dev *pdev)
	pci_disable_device(pdev);
	if (wil->platform_ops.uninit)
		wil->platform_ops.uninit(wil->platform_handle);
	wil_p2p_wdev_free(wil);
	wil_if_free(wil);
}

+1 −0
Original line number Diff line number Diff line
@@ -837,6 +837,7 @@ u8 wil_p2p_stop_discovery(struct wil6210_priv *wil);
int wil_p2p_cancel_listen(struct wil6210_priv *wil, u64 cookie);
void wil_p2p_listen_expired(struct work_struct *work);
void wil_p2p_search_expired(struct work_struct *work);
void wil_p2p_stop_radio_operations(struct wil6210_priv *wil);

/* WMI for P2P */
int wmi_p2p_cfg(struct wil6210_priv *wil, int channel, int bi);