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

Commit bc92afd9 authored by Johannes Berg's avatar Johannes Berg Committed by John W. Linville
Browse files

cfg80211: implement iwpower



Just on/off and timeout, and with a hacky cfg80211 method
until we figure out what we want, though this is probably
sufficient as we want to use pm_qos for wifi everywhere.

Signed-off-by: default avatarJohannes Berg <johannes@sipsolutions.net>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent f2129354
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -522,6 +522,27 @@ static int iwm_cfg80211_get_txpower(struct wiphy *wiphy, int *dbm)
	return 0;
}

static int iwm_cfg80211_set_power_mgmt(struct wiphy *wiphy,
				       struct net_device *dev,
				       bool enabled, int timeout)
{
	struct iwm_priv *iwm = wiphy_to_iwm(wiphy);
	u32 power_index;

	if (enabled)
		power_index = IWM_POWER_INDEX_DEFAULT;
	else
		power_index = IWM_POWER_INDEX_MIN;

	if (power_index == iwm->conf.power_index)
		return 0;

	iwm->conf.power_index = power_index;

	return iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX,
				       CFG_POWER_INDEX, iwm->conf.power_index);
}

static struct cfg80211_ops iwm_cfg80211_ops = {
	.change_virtual_intf = iwm_cfg80211_change_iface,
	.add_key = iwm_cfg80211_add_key,
@@ -534,6 +555,7 @@ static struct cfg80211_ops iwm_cfg80211_ops = {
	.leave_ibss = iwm_cfg80211_leave_ibss,
	.set_tx_power = iwm_cfg80211_set_txpower,
	.get_tx_power = iwm_cfg80211_get_txpower,
	.set_power_mgmt = iwm_cfg80211_set_power_mgmt,
};

struct wireless_dev *iwm_wdev_alloc(int sizeof_bus, struct device *dev)
+2 −45
Original line number Diff line number Diff line
@@ -238,49 +238,6 @@ static int iwm_set_wpa_version(struct iwm_priv *iwm, u8 wpa_version)
	return 0;
}

static int iwm_wext_siwpower(struct net_device *dev,
			     struct iw_request_info *info,
			     struct iw_param *wrq, char *extra)
{
	struct iwm_priv *iwm = ndev_to_iwm(dev);
	u32 power_index;

	if (wrq->disabled) {
		power_index = IWM_POWER_INDEX_MIN;
		goto set;
	} else
		power_index = IWM_POWER_INDEX_DEFAULT;

	switch (wrq->flags & IW_POWER_MODE) {
	case IW_POWER_ON:
	case IW_POWER_MODE:
	case IW_POWER_ALL_R:
		break;
	default:
		return -EINVAL;
	}

 set:
	if (power_index == iwm->conf.power_index)
		return 0;

	iwm->conf.power_index = power_index;

	return iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX,
				       CFG_POWER_INDEX, iwm->conf.power_index);
}

static int iwm_wext_giwpower(struct net_device *dev,
			     struct iw_request_info *info,
			     union iwreq_data *wrqu, char *extra)
{
	struct iwm_priv *iwm = ndev_to_iwm(dev);

	wrqu->power.disabled = (iwm->conf.power_index == IWM_POWER_INDEX_MIN);

	return 0;
}

static int iwm_set_key_mgt(struct iwm_priv *iwm, u8 key_mgt)
{
	u8 *auth_type = &iwm->umac_profile->sec.auth_type;
@@ -458,8 +415,8 @@ static const iw_handler iwm_handlers[] =
	(iw_handler) NULL,				/* SIOCGIWRETRY */
	(iw_handler) cfg80211_wext_siwencode,		/* SIOCSIWENCODE */
	(iw_handler) cfg80211_wext_giwencode,		/* SIOCGIWENCODE */
	(iw_handler) iwm_wext_siwpower,			/* SIOCSIWPOWER */
	(iw_handler) iwm_wext_giwpower,			/* SIOCGIWPOWER */
	(iw_handler) cfg80211_wext_siwpower,		/* SIOCSIWPOWER */
	(iw_handler) cfg80211_wext_giwpower,		/* SIOCGIWPOWER */
	(iw_handler) NULL,				/* -- hole -- */
	(iw_handler) NULL,				/* -- hole -- */
	(iw_handler) NULL,                              /* SIOCSIWGENIE */
+13 −0
Original line number Diff line number Diff line
@@ -1023,6 +1023,10 @@ struct cfg80211_ops {
#ifdef CONFIG_NL80211_TESTMODE
	int	(*testmode_cmd)(struct wiphy *wiphy, void *data, int len);
#endif

	/* some temporary stuff to finish wext */
	int	(*set_power_mgmt)(struct wiphy *wiphy, struct net_device *dev,
				  bool enabled, int timeout);
};

/*
@@ -1262,6 +1266,8 @@ struct wireless_dev {
		u8 bssid[ETH_ALEN];
		u8 ssid[IEEE80211_MAX_SSID_LEN];
		s8 default_key, default_mgmt_key;
		bool ps;
		int ps_timeout;
	} wext;
#endif
};
@@ -1606,6 +1612,13 @@ int cfg80211_wext_giwtxpower(struct net_device *dev,
			     struct iw_request_info *info,
			     union iwreq_data *data, char *keybuf);

int cfg80211_wext_siwpower(struct net_device *dev,
			   struct iw_request_info *info,
			   struct iw_param *wrq, char *extra);
int cfg80211_wext_giwpower(struct net_device *dev,
			   struct iw_request_info *info,
			   struct iw_param *wrq, char *extra);

/*
 * callbacks for asynchronous cfg80211 methods, notification
 * functions and BSS handling helpers
+0 −16
Original line number Diff line number Diff line
@@ -14,22 +14,6 @@ config MAC80211
comment "CFG80211 needs to be enabled for MAC80211"
	depends on CFG80211=n

config MAC80211_DEFAULT_PS
	bool "enable powersave by default"
	depends on MAC80211
	default y
	help
	  This option enables powersave mode by default.

	  If this causes your applications to misbehave you should fix your
	  applications instead -- they need to register their network
	  latency requirement, see Documentation/power/pm_qos_interface.txt.

config MAC80211_DEFAULT_PS_VALUE
	int
	default 1 if MAC80211_DEFAULT_PS
	default 0

menu "Rate control algorithm selection"
	depends on MAC80211 != n

+26 −0
Original line number Diff line number Diff line
@@ -1388,6 +1388,31 @@ int ieee80211_testmode_cmd(struct wiphy *wiphy, void *data, int len)
}
#endif

static int ieee80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev,
				    bool enabled, int timeout)
{
	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
	struct ieee80211_conf *conf = &local->hw.conf;

	if (!(local->hw.flags & IEEE80211_HW_SUPPORTS_PS))
		return -EOPNOTSUPP;

	if (enabled == sdata->u.mgd.powersave &&
	    timeout == conf->dynamic_ps_timeout)
		return 0;

	sdata->u.mgd.powersave = enabled;
	conf->dynamic_ps_timeout = timeout;

	if (local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_PS)
		ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);

	ieee80211_recalc_ps(local, -1);

	return 0;
}

struct cfg80211_ops mac80211_config_ops = {
	.add_virtual_intf = ieee80211_add_iface,
	.del_virtual_intf = ieee80211_del_iface,
@@ -1431,4 +1456,5 @@ struct cfg80211_ops mac80211_config_ops = {
	.get_tx_power = ieee80211_get_tx_power,
	.rfkill_poll = ieee80211_rfkill_poll,
	CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd)
	.set_power_mgmt = ieee80211_set_power_mgmt,
};
Loading