diff options
| author | Mark Brown <[email protected]> | 2015-10-12 18:09:27 +0100 | 
|---|---|---|
| committer | Mark Brown <[email protected]> | 2015-10-12 18:09:27 +0100 | 
| commit | 79828b4fa835f73cdaf4bffa48696abdcbea9d02 (patch) | |
| tree | 5e0fa7156acb75ba603022bc807df8f2fedb97a8 /drivers/net/wireless/ath/wil6210/pm.c | |
| parent | 721b51fcf91898299d96f4b72cb9434cda29dce6 (diff) | |
| parent | 8c1a9d6323abf0fb1e5dad96cf3f1c783505ea5a (diff) | |
Merge remote-tracking branch 'asoc/fix/rt5645' into asoc-fix-rt5645
Diffstat (limited to 'drivers/net/wireless/ath/wil6210/pm.c')
| -rw-r--r-- | drivers/net/wireless/ath/wil6210/pm.c | 98 | 
1 files changed, 98 insertions, 0 deletions
diff --git a/drivers/net/wireless/ath/wil6210/pm.c b/drivers/net/wireless/ath/wil6210/pm.c new file mode 100644 index 000000000000..0b7ecbcac19c --- /dev/null +++ b/drivers/net/wireless/ath/wil6210/pm.c @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2014 Qualcomm Atheros, Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "wil6210.h" + +int wil_can_suspend(struct wil6210_priv *wil, bool is_runtime) +{ +	int rc = 0; +	struct wireless_dev *wdev = wil->wdev; + +	wil_dbg_pm(wil, "%s(%s)\n", __func__, +		   is_runtime ? "runtime" : "system"); + +	switch (wdev->iftype) { +	case NL80211_IFTYPE_MONITOR: +	case NL80211_IFTYPE_STATION: +	case NL80211_IFTYPE_P2P_CLIENT: +		break; +	/* AP-like interface - can't suspend */ +	default: +		wil_dbg_pm(wil, "AP-like interface\n"); +		rc = -EBUSY; +		break; +	} + +	wil_dbg_pm(wil, "%s(%s) => %s (%d)\n", __func__, +		   is_runtime ? "runtime" : "system", rc ? "No" : "Yes", rc); + +	return rc; +} + +int wil_suspend(struct wil6210_priv *wil, bool is_runtime) +{ +	int rc = 0; +	struct net_device *ndev = wil_to_ndev(wil); + +	wil_dbg_pm(wil, "%s(%s)\n", __func__, +		   is_runtime ? "runtime" : "system"); + +	/* if netif up, hardware is alive, shut it down */ +	if (ndev->flags & IFF_UP) { +		rc = wil_down(wil); +		if (rc) { +			wil_err(wil, "wil_down : %d\n", rc); +			goto out; +		} +	} + +	if (wil->platform_ops.suspend) +		rc = wil->platform_ops.suspend(wil->platform_handle); + +out: +	wil_dbg_pm(wil, "%s(%s) => %d\n", __func__, +		   is_runtime ? "runtime" : "system", rc); +	return rc; +} + +int wil_resume(struct wil6210_priv *wil, bool is_runtime) +{ +	int rc = 0; +	struct net_device *ndev = wil_to_ndev(wil); + +	wil_dbg_pm(wil, "%s(%s)\n", __func__, +		   is_runtime ? "runtime" : "system"); + +	if (wil->platform_ops.resume) { +		rc = wil->platform_ops.resume(wil->platform_handle); +		if (rc) { +			wil_err(wil, "platform_ops.resume : %d\n", rc); +			goto out; +		} +	} + +	/* if netif up, bring hardware up +	 * During open(), IFF_UP set after actual device method +	 * invocation. This prevent recursive call to wil_up() +	 */ +	if (ndev->flags & IFF_UP) +		rc = wil_up(wil); + +out: +	wil_dbg_pm(wil, "%s(%s) => %d\n", __func__, +		   is_runtime ? "runtime" : "system", rc); +	return rc; +}  |