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

Commit 0fab98e4 authored by Maya Erez's avatar Maya Erez Committed by Gerrit - the friendly Code Review server
Browse files

wil6210: fix stop p2p device handling



fix stop p2p device handling to identify between search
and listen and update the upper layers with the appropriate
notification.
The stop of p2p radio operations also needs to be performed
in __wil_down.

Signed-off-by: default avatarMaya Erez <qca_merez@qca.qualcomm.com>
Signed-off-by: default avatarKalle Valo <kvalo@qca.qualcomm.com>
Git-commit: d35c2b6f8ffa75d430fd0fbbc5062f738c44f6e4
Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git


CRs-Fixed: 1063261
Change-Id: I79f8522ae84dd209cb98c3bbc52cfaeb199dd342
Signed-off-by: default avatarMaya Erez <merez@codeaurora.org>
parent f53515cb
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);