Jesse Keating 3494df0
From: Stanislaw Gruszka <sgruszka@redhat.com>
Jesse Keating 3494df0
To: kernel@lists.fedoraproject.org, "John W. Linville" <linville@redhat.com>
Jesse Keating 3494df0
Subject: [PATCH 1/4 2.6.34.y] mac80211: explicitly disable/enable QoS
Jesse Keating 3494df0
Date: Fri, 11 Jun 2010 17:05:11 +0200
Jesse Keating 3494df0
Jesse Keating 3494df0
commit e1b3ec1a2a336c328c336cfa5485a5f0484cc90d upstream.
Jesse Keating 3494df0
Jesse Keating 3494df0
Add interface to disable/enable QoS (aka WMM or WME). Currently drivers
Jesse Keating 3494df0
enable it explicitly when ->conf_tx method is called, and newer disable.
Jesse Keating 3494df0
Disabling is needed for some APs, which do not support QoS, such
Jesse Keating 3494df0
we should send QoS frames to them.
Jesse Keating 3494df0
Jesse Keating 3494df0
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
Jesse Keating 3494df0
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Jesse Keating 3494df0
---
Jesse Keating 3494df0
 include/net/mac80211.h |    5 +++++
Jesse Keating 3494df0
 net/mac80211/mlme.c    |    9 ++++++++-
Jesse Keating 3494df0
 net/mac80211/util.c    |    5 +++++
Jesse Keating 3494df0
 3 files changed, 18 insertions(+), 1 deletions(-)
Jesse Keating 3494df0
Jesse Keating 3494df0
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
Jesse Keating 3494df0
index 45d7d44..ea607d6 100644
Jesse Keating 3494df0
--- a/include/net/mac80211.h
Jesse Keating 3494df0
+++ b/include/net/mac80211.h
Jesse Keating 3494df0
@@ -580,11 +580,15 @@ struct ieee80211_rx_status {
Jesse Keating 3494df0
  *	may turn the device off as much as possible. Typically, this flag will
Jesse Keating 3494df0
  *	be set when an interface is set UP but not associated or scanning, but
Jesse Keating 3494df0
  *	it can also be unset in that case when monitor interfaces are active.
Jesse Keating 3494df0
+ * @IEEE80211_CONF_QOS: Enable 802.11e QoS also know as WMM (Wireless
Jesse Keating 3494df0
+ *      Multimedia). On some drivers (iwlwifi is one of know) we have
Jesse Keating 3494df0
+ *      to enable/disable QoS explicitly.
Jesse Keating 3494df0
  */
Jesse Keating 3494df0
 enum ieee80211_conf_flags {
Jesse Keating 3494df0
 	IEEE80211_CONF_MONITOR		= (1<<0),
Jesse Keating 3494df0
 	IEEE80211_CONF_PS		= (1<<1),
Jesse Keating 3494df0
 	IEEE80211_CONF_IDLE		= (1<<2),
Jesse Keating 3494df0
+	IEEE80211_CONF_QOS		= (1<<3),
Jesse Keating 3494df0
 };
Jesse Keating 3494df0
 
Jesse Keating 3494df0
 
Jesse Keating 3494df0
@@ -609,6 +613,7 @@ enum ieee80211_conf_changed {
Jesse Keating 3494df0
 	IEEE80211_CONF_CHANGE_CHANNEL		= BIT(6),
Jesse Keating 3494df0
 	IEEE80211_CONF_CHANGE_RETRY_LIMITS	= BIT(7),
Jesse Keating 3494df0
 	IEEE80211_CONF_CHANGE_IDLE		= BIT(8),
Jesse Keating 3494df0
+	IEEE80211_CONF_CHANGE_QOS		= BIT(9),
Jesse Keating 3494df0
 };
Jesse Keating 3494df0
 
Jesse Keating 3494df0
 /**
Jesse Keating 3494df0
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
Jesse Keating 3494df0
index 875c8de..1b80e2b 100644
Jesse Keating 3494df0
--- a/net/mac80211/mlme.c
Jesse Keating 3494df0
+++ b/net/mac80211/mlme.c
Jesse Keating 3494df0
@@ -592,6 +592,9 @@ static void ieee80211_sta_wmm_params(struct ieee80211_local *local,
Jesse Keating 3494df0
 	int count;
Jesse Keating 3494df0
 	u8 *pos, uapsd_queues = 0;
Jesse Keating 3494df0
 
Jesse Keating 3494df0
+	if (!local->ops->conf_tx)
Jesse Keating 3494df0
+		return;
Jesse Keating 3494df0
+
Jesse Keating 3494df0
 	if (local->hw.queues < 4)
Jesse Keating 3494df0
 		return;
Jesse Keating 3494df0
 
Jesse Keating 3494df0
@@ -666,11 +669,15 @@ static void ieee80211_sta_wmm_params(struct ieee80211_local *local,
Jesse Keating 3494df0
 		       params.aifs, params.cw_min, params.cw_max, params.txop,
Jesse Keating 3494df0
 		       params.uapsd);
Jesse Keating 3494df0
 #endif
Jesse Keating 3494df0
-		if (drv_conf_tx(local, queue, &params) && local->ops->conf_tx)
Jesse Keating 3494df0
+		if (drv_conf_tx(local, queue, &params))
Jesse Keating 3494df0
 			printk(KERN_DEBUG "%s: failed to set TX queue "
Jesse Keating 3494df0
 			       "parameters for queue %d\n",
Jesse Keating 3494df0
 			       wiphy_name(local->hw.wiphy), queue);
Jesse Keating 3494df0
 	}
Jesse Keating 3494df0
+
Jesse Keating 3494df0
+	/* enable WMM or activate new settings */
Jesse Keating 3494df0
+	local->hw.conf.flags |=	IEEE80211_CONF_QOS;
Jesse Keating 3494df0
+	drv_config(local, IEEE80211_CONF_CHANGE_QOS);
Jesse Keating 3494df0
 }
Jesse Keating 3494df0
 
Jesse Keating 3494df0
 static u32 ieee80211_handle_bss_capability(struct ieee80211_sub_if_data *sdata,
Jesse Keating 3494df0
diff --git a/net/mac80211/util.c b/net/mac80211/util.c
Jesse Keating 3494df0
index 53af570..582f43a 100644
Jesse Keating 3494df0
--- a/net/mac80211/util.c
Jesse Keating 3494df0
+++ b/net/mac80211/util.c
Jesse Keating 3494df0
@@ -796,6 +796,11 @@ void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata)
Jesse Keating 3494df0
 
Jesse Keating 3494df0
 		drv_conf_tx(local, queue, &qparam);
Jesse Keating 3494df0
 	}
Jesse Keating 3494df0
+
Jesse Keating 3494df0
+	/* after reinitialize QoS TX queues setting to default,
Jesse Keating 3494df0
+	 * disable QoS at all */
Jesse Keating 3494df0
+	local->hw.conf.flags &=	~IEEE80211_CONF_QOS;
Jesse Keating 3494df0
+	drv_config(local, IEEE80211_CONF_CHANGE_QOS);
Jesse Keating 3494df0
 }
Jesse Keating 3494df0
 
Jesse Keating 3494df0
 void ieee80211_sta_def_wmm_params(struct ieee80211_sub_if_data *sdata,
Jesse Keating 3494df0
-- 
Jesse Keating 3494df0
1.6.2.5
Jesse Keating 3494df0
Jesse Keating 3494df0
_______________________________________________
Jesse Keating 3494df0
kernel mailing list
Jesse Keating 3494df0
kernel@lists.fedoraproject.org
Jesse Keating 3494df0
https://admin.fedoraproject.org/mailman/listinfo/kernel
Jesse Keating 3494df0