iwlwifi: Disable QoS when connected to a non-QoS-capable AP (Closes: #578262)
svn path=/dists/sid/linux-2.6/; revision=15758
This commit is contained in:
parent
58976ad6bc
commit
89f42b2e98
|
@ -9,6 +9,8 @@ linux-2.6 (2.6.32-14) UNRELEASED; urgency=low
|
||||||
* macvlan: allow multiple driver backends
|
* macvlan: allow multiple driver backends
|
||||||
* Add macvtap driver (Closes: #568755)
|
* Add macvtap driver (Closes: #568755)
|
||||||
* [ia64] Enable SGI SN support and mspec driver (Closes: #582224)
|
* [ia64] Enable SGI SN support and mspec driver (Closes: #582224)
|
||||||
|
* iwlwifi: Disable QoS when connected to a non-QoS-capable AP
|
||||||
|
(Closes: #578262)
|
||||||
|
|
||||||
-- Ben Hutchings <ben@decadent.org.uk> Tue, 18 May 2010 02:13:44 +0100
|
-- Ben Hutchings <ben@decadent.org.uk> Tue, 18 May 2010 02:13:44 +0100
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,355 @@
|
||||||
|
From 07a6e68c8be45f9b5ea6689c8b247fa15a4fc0d4 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||||
|
Date: Mon, 29 Mar 2010 12:18:35 +0200
|
||||||
|
Subject: [PATCH 2/2] iwlwifi: manage QoS by mac stack
|
||||||
|
|
||||||
|
We activate/deactivate QoS and setup default queue parameters in iwlwifi
|
||||||
|
driver. Mac stack do the same, so we do not need repeat that work here.
|
||||||
|
Stack also will tell when disable QoS, this will fix driver when working
|
||||||
|
with older APs, that do not have QoS implemented.
|
||||||
|
|
||||||
|
Patch make "force = true" in iwl_active_qos() assuming we always want
|
||||||
|
to do with QoS what mac stack wish.
|
||||||
|
|
||||||
|
Patch also remove unused qos_cap bits, do not initialize qos_active = 0,
|
||||||
|
as we have it initialized to zero by kzalloc.
|
||||||
|
|
||||||
|
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||||
|
Signed-off-by: John W. Linville <linville@tuxdriver.com>
|
||||||
|
[bwh: Adjust context for 2.6.32]
|
||||||
|
---
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-agn.c | 9 --
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-core.c | 147 +++------------------------
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-core.h | 3 +-
|
||||||
|
drivers/net/wireless/iwlwifi/iwl-dev.h | 21 ----
|
||||||
|
drivers/net/wireless/iwlwifi/iwl3945-base.c | 7 --
|
||||||
|
5 files changed, 17 insertions(+), 170 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||||
|
index 921dc4a..b05f198 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
|
||||||
|
@@ -2172,7 +2172,6 @@ void iwl_post_associate(struct iwl_priv *priv)
|
||||||
|
{
|
||||||
|
struct ieee80211_conf *conf = NULL;
|
||||||
|
int ret = 0;
|
||||||
|
- unsigned long flags;
|
||||||
|
|
||||||
|
if (priv->iw_mode == NL80211_IFTYPE_AP) {
|
||||||
|
IWL_ERR(priv, "%s Should not be called in AP mode\n", __func__);
|
||||||
|
@@ -2257,10 +2256,6 @@ void iwl_post_associate(struct iwl_priv *priv)
|
||||||
|
if (priv->iw_mode == NL80211_IFTYPE_ADHOC)
|
||||||
|
priv->assoc_station_added = 1;
|
||||||
|
|
||||||
|
- spin_lock_irqsave(&priv->lock, flags);
|
||||||
|
- iwl_activate_qos(priv, 0);
|
||||||
|
- spin_unlock_irqrestore(&priv->lock, flags);
|
||||||
|
-
|
||||||
|
/* the chain noise calibration will enabled PM upon completion
|
||||||
|
* If chain noise has already been run, then we need to enable
|
||||||
|
* power management here */
|
||||||
|
@@ -2384,7 +2379,6 @@ static int iwl_mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
|
||||||
|
void iwl_config_ap(struct iwl_priv *priv)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
- unsigned long flags;
|
||||||
|
|
||||||
|
if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
||||||
|
return;
|
||||||
|
@@ -2432,9 +2426,6 @@ void iwl_config_ap(struct iwl_priv *priv)
|
||||||
|
/* restore RXON assoc */
|
||||||
|
priv->staging_rxon.filter_flags |= RXON_FILTER_ASSOC_MSK;
|
||||||
|
iwlcore_commit_rxon(priv);
|
||||||
|
- spin_lock_irqsave(&priv->lock, flags);
|
||||||
|
- iwl_activate_qos(priv, 1);
|
||||||
|
- spin_unlock_irqrestore(&priv->lock, flags);
|
||||||
|
iwl_rxon_add_station(priv, iwl_bcast_addr, 0);
|
||||||
|
}
|
||||||
|
iwl_send_beacon_cmd(priv);
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c
|
||||||
|
index 4a4f7e4..a58e67b 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-core.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-core.c
|
||||||
|
@@ -266,17 +266,13 @@ EXPORT_SYMBOL(iwl_hw_nic_init);
|
||||||
|
/*
|
||||||
|
* QoS support
|
||||||
|
*/
|
||||||
|
-void iwl_activate_qos(struct iwl_priv *priv, u8 force)
|
||||||
|
+static void iwl_update_qos(struct iwl_priv *priv)
|
||||||
|
{
|
||||||
|
if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
||||||
|
return;
|
||||||
|
|
||||||
|
priv->qos_data.def_qos_parm.qos_flags = 0;
|
||||||
|
|
||||||
|
- if (priv->qos_data.qos_cap.q_AP.queue_request &&
|
||||||
|
- !priv->qos_data.qos_cap.q_AP.txop_request)
|
||||||
|
- priv->qos_data.def_qos_parm.qos_flags |=
|
||||||
|
- QOS_PARAM_FLG_TXOP_TYPE_MSK;
|
||||||
|
if (priv->qos_data.qos_active)
|
||||||
|
priv->qos_data.def_qos_parm.qos_flags |=
|
||||||
|
QOS_PARAM_FLG_UPDATE_EDCA_MSK;
|
||||||
|
@@ -284,118 +280,14 @@ void iwl_activate_qos(struct iwl_priv *priv, u8 force)
|
||||||
|
if (priv->current_ht_config.is_ht)
|
||||||
|
priv->qos_data.def_qos_parm.qos_flags |= QOS_PARAM_FLG_TGN_MSK;
|
||||||
|
|
||||||
|
- if (force || iwl_is_associated(priv)) {
|
||||||
|
- IWL_DEBUG_QOS(priv, "send QoS cmd with Qos active=%d FLAGS=0x%X\n",
|
||||||
|
- priv->qos_data.qos_active,
|
||||||
|
- priv->qos_data.def_qos_parm.qos_flags);
|
||||||
|
+ IWL_DEBUG_QOS(priv, "send QoS cmd with Qos active=%d FLAGS=0x%X\n",
|
||||||
|
+ priv->qos_data.qos_active,
|
||||||
|
+ priv->qos_data.def_qos_parm.qos_flags);
|
||||||
|
|
||||||
|
- iwl_send_cmd_pdu_async(priv, REPLY_QOS_PARAM,
|
||||||
|
- sizeof(struct iwl_qosparam_cmd),
|
||||||
|
- &priv->qos_data.def_qos_parm, NULL);
|
||||||
|
- }
|
||||||
|
+ iwl_send_cmd_pdu_async(priv, REPLY_QOS_PARAM,
|
||||||
|
+ sizeof(struct iwl_qosparam_cmd),
|
||||||
|
+ &priv->qos_data.def_qos_parm, NULL);
|
||||||
|
}
|
||||||
|
-EXPORT_SYMBOL(iwl_activate_qos);
|
||||||
|
-
|
||||||
|
-/*
|
||||||
|
- * AC CWmin CW max AIFSN TXOP Limit TXOP Limit
|
||||||
|
- * (802.11b) (802.11a/g)
|
||||||
|
- * AC_BK 15 1023 7 0 0
|
||||||
|
- * AC_BE 15 1023 3 0 0
|
||||||
|
- * AC_VI 7 15 2 6.016ms 3.008ms
|
||||||
|
- * AC_VO 3 7 2 3.264ms 1.504ms
|
||||||
|
- */
|
||||||
|
-void iwl_reset_qos(struct iwl_priv *priv)
|
||||||
|
-{
|
||||||
|
- u16 cw_min = 15;
|
||||||
|
- u16 cw_max = 1023;
|
||||||
|
- u8 aifs = 2;
|
||||||
|
- bool is_legacy = false;
|
||||||
|
- unsigned long flags;
|
||||||
|
- int i;
|
||||||
|
-
|
||||||
|
- spin_lock_irqsave(&priv->lock, flags);
|
||||||
|
- /* QoS always active in AP and ADHOC mode
|
||||||
|
- * In STA mode wait for association
|
||||||
|
- */
|
||||||
|
- if (priv->iw_mode == NL80211_IFTYPE_ADHOC ||
|
||||||
|
- priv->iw_mode == NL80211_IFTYPE_AP)
|
||||||
|
- priv->qos_data.qos_active = 1;
|
||||||
|
- else
|
||||||
|
- priv->qos_data.qos_active = 0;
|
||||||
|
-
|
||||||
|
- /* check for legacy mode */
|
||||||
|
- if ((priv->iw_mode == NL80211_IFTYPE_ADHOC &&
|
||||||
|
- (priv->active_rate & IWL_OFDM_RATES_MASK) == 0) ||
|
||||||
|
- (priv->iw_mode == NL80211_IFTYPE_STATION &&
|
||||||
|
- (priv->staging_rxon.flags & RXON_FLG_SHORT_SLOT_MSK) == 0)) {
|
||||||
|
- cw_min = 31;
|
||||||
|
- is_legacy = 1;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if (priv->qos_data.qos_active)
|
||||||
|
- aifs = 3;
|
||||||
|
-
|
||||||
|
- /* AC_BE */
|
||||||
|
- priv->qos_data.def_qos_parm.ac[0].cw_min = cpu_to_le16(cw_min);
|
||||||
|
- priv->qos_data.def_qos_parm.ac[0].cw_max = cpu_to_le16(cw_max);
|
||||||
|
- priv->qos_data.def_qos_parm.ac[0].aifsn = aifs;
|
||||||
|
- priv->qos_data.def_qos_parm.ac[0].edca_txop = 0;
|
||||||
|
- priv->qos_data.def_qos_parm.ac[0].reserved1 = 0;
|
||||||
|
-
|
||||||
|
- if (priv->qos_data.qos_active) {
|
||||||
|
- /* AC_BK */
|
||||||
|
- i = 1;
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].cw_min = cpu_to_le16(cw_min);
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].cw_max = cpu_to_le16(cw_max);
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].aifsn = 7;
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].edca_txop = 0;
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].reserved1 = 0;
|
||||||
|
-
|
||||||
|
- /* AC_VI */
|
||||||
|
- i = 2;
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].cw_min =
|
||||||
|
- cpu_to_le16((cw_min + 1) / 2 - 1);
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].cw_max =
|
||||||
|
- cpu_to_le16(cw_min);
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].aifsn = 2;
|
||||||
|
- if (is_legacy)
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].edca_txop =
|
||||||
|
- cpu_to_le16(6016);
|
||||||
|
- else
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].edca_txop =
|
||||||
|
- cpu_to_le16(3008);
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].reserved1 = 0;
|
||||||
|
-
|
||||||
|
- /* AC_VO */
|
||||||
|
- i = 3;
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].cw_min =
|
||||||
|
- cpu_to_le16((cw_min + 1) / 4 - 1);
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].cw_max =
|
||||||
|
- cpu_to_le16((cw_min + 1) / 2 - 1);
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].aifsn = 2;
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].reserved1 = 0;
|
||||||
|
- if (is_legacy)
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].edca_txop =
|
||||||
|
- cpu_to_le16(3264);
|
||||||
|
- else
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].edca_txop =
|
||||||
|
- cpu_to_le16(1504);
|
||||||
|
- } else {
|
||||||
|
- for (i = 1; i < 4; i++) {
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].cw_min =
|
||||||
|
- cpu_to_le16(cw_min);
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].cw_max =
|
||||||
|
- cpu_to_le16(cw_max);
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].aifsn = aifs;
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].edca_txop = 0;
|
||||||
|
- priv->qos_data.def_qos_parm.ac[i].reserved1 = 0;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- IWL_DEBUG_QOS(priv, "set QoS to default \n");
|
||||||
|
-
|
||||||
|
- spin_unlock_irqrestore(&priv->lock, flags);
|
||||||
|
-}
|
||||||
|
-EXPORT_SYMBOL(iwl_reset_qos);
|
||||||
|
|
||||||
|
#define MAX_BIT_RATE_40_MHZ 150 /* Mbps */
|
||||||
|
#define MAX_BIT_RATE_20_MHZ 72 /* Mbps */
|
||||||
|
@@ -1503,11 +1395,6 @@ int iwl_init_drv(struct iwl_priv *priv)
|
||||||
|
|
||||||
|
iwl_init_scan_params(priv);
|
||||||
|
|
||||||
|
- iwl_reset_qos(priv);
|
||||||
|
-
|
||||||
|
- priv->qos_data.qos_active = 0;
|
||||||
|
- priv->qos_data.qos_cap.val = 0;
|
||||||
|
-
|
||||||
|
priv->rates_mask = IWL_RATES_MASK;
|
||||||
|
/* Set the tx_power_user_lmt to the lowest power level
|
||||||
|
* this value will get overwritten by channel max power avg
|
||||||
|
@@ -2213,12 +2100,6 @@ int iwl_mac_conf_tx(struct ieee80211_hw *hw, u16 queue,
|
||||||
|
cpu_to_le16((params->txop * 32));
|
||||||
|
|
||||||
|
priv->qos_data.def_qos_parm.ac[q].reserved1 = 0;
|
||||||
|
- priv->qos_data.qos_active = 1;
|
||||||
|
-
|
||||||
|
- if (priv->iw_mode == NL80211_IFTYPE_AP)
|
||||||
|
- iwl_activate_qos(priv, 1);
|
||||||
|
- else if (priv->assoc_id && iwl_is_associated(priv))
|
||||||
|
- iwl_activate_qos(priv, 0);
|
||||||
|
|
||||||
|
spin_unlock_irqrestore(&priv->lock, flags);
|
||||||
|
|
||||||
|
@@ -2452,11 +2333,8 @@ int iwl_mac_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb)
|
||||||
|
IWL_DEBUG_MAC80211(priv, "leave\n");
|
||||||
|
spin_unlock_irqrestore(&priv->lock, flags);
|
||||||
|
|
||||||
|
- iwl_reset_qos(priv);
|
||||||
|
-
|
||||||
|
priv->cfg->ops->lib->post_associate(priv);
|
||||||
|
|
||||||
|
-
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(iwl_mac_beacon_update);
|
||||||
|
@@ -2670,6 +2548,15 @@ int iwl_mac_config(struct ieee80211_hw *hw, u32 changed)
|
||||||
|
iwl_set_tx_power(priv, conf->power_level, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (changed & IEEE80211_CONF_CHANGE_QOS) {
|
||||||
|
+ bool qos_active = !!(conf->flags & IEEE80211_CONF_QOS);
|
||||||
|
+
|
||||||
|
+ spin_lock_irqsave(&priv->lock, flags);
|
||||||
|
+ priv->qos_data.qos_active = qos_active;
|
||||||
|
+ iwl_update_qos(priv);
|
||||||
|
+ spin_unlock_irqrestore(&priv->lock, flags);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* call to ensure that 4965 rx_chain is set properly in monitor mode */
|
||||||
|
if (priv->cfg->ops->hcmd->set_rxon_chain)
|
||||||
|
priv->cfg->ops->hcmd->set_rxon_chain(priv);
|
||||||
|
@@ -2744,8 +2631,6 @@ void iwl_mac_reset_tsf(struct ieee80211_hw *hw)
|
||||||
|
memset(&priv->current_ht_config, 0, sizeof(struct iwl_ht_info));
|
||||||
|
spin_unlock_irqrestore(&priv->lock, flags);
|
||||||
|
|
||||||
|
- iwl_reset_qos(priv);
|
||||||
|
-
|
||||||
|
spin_lock_irqsave(&priv->lock, flags);
|
||||||
|
priv->assoc_id = 0;
|
||||||
|
priv->assoc_capability = 0;
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||||
|
index 40ec0c1..d5000c7 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-core.h
|
||||||
|
@@ -266,8 +266,7 @@ struct iwl_cfg {
|
||||||
|
struct ieee80211_hw *iwl_alloc_all(struct iwl_cfg *cfg,
|
||||||
|
struct ieee80211_ops *hw_ops);
|
||||||
|
void iwl_hw_detect(struct iwl_priv *priv);
|
||||||
|
-void iwl_reset_qos(struct iwl_priv *priv);
|
||||||
|
-void iwl_activate_qos(struct iwl_priv *priv, u8 force);
|
||||||
|
+void iwl_activate_qos(struct iwl_priv *priv);
|
||||||
|
int iwl_mac_conf_tx(struct ieee80211_hw *hw, u16 queue,
|
||||||
|
const struct ieee80211_tx_queue_params *params);
|
||||||
|
void iwl_set_rxon_hwcrypto(struct iwl_priv *priv, int hw_decrypt);
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h
|
||||||
|
index cea2ee2..24faad7 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl-dev.h
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl-dev.h
|
||||||
|
@@ -514,30 +514,9 @@ struct iwl_ht_info {
|
||||||
|
u8 non_GF_STA_present;
|
||||||
|
};
|
||||||
|
|
||||||
|
-union iwl_qos_capabity {
|
||||||
|
- struct {
|
||||||
|
- u8 edca_count:4; /* bit 0-3 */
|
||||||
|
- u8 q_ack:1; /* bit 4 */
|
||||||
|
- u8 queue_request:1; /* bit 5 */
|
||||||
|
- u8 txop_request:1; /* bit 6 */
|
||||||
|
- u8 reserved:1; /* bit 7 */
|
||||||
|
- } q_AP;
|
||||||
|
- struct {
|
||||||
|
- u8 acvo_APSD:1; /* bit 0 */
|
||||||
|
- u8 acvi_APSD:1; /* bit 1 */
|
||||||
|
- u8 ac_bk_APSD:1; /* bit 2 */
|
||||||
|
- u8 ac_be_APSD:1; /* bit 3 */
|
||||||
|
- u8 q_ack:1; /* bit 4 */
|
||||||
|
- u8 max_len:2; /* bit 5-6 */
|
||||||
|
- u8 more_data_ack:1; /* bit 7 */
|
||||||
|
- } q_STA;
|
||||||
|
- u8 val;
|
||||||
|
-};
|
||||||
|
-
|
||||||
|
/* QoS structures */
|
||||||
|
struct iwl_qos_info {
|
||||||
|
int qos_active;
|
||||||
|
- union iwl_qos_capabity qos_cap;
|
||||||
|
struct iwl_qosparam_cmd def_qos_parm;
|
||||||
|
};
|
||||||
|
|
||||||
|
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c
|
||||||
|
index 619590d..95447ca 100644
|
||||||
|
--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
|
||||||
|
+++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
|
||||||
|
@@ -3091,8 +3091,6 @@ void iwl3945_post_associate(struct iwl_priv *priv)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
- iwl_activate_qos(priv, 0);
|
||||||
|
-
|
||||||
|
/* we have just associated, don't start scan too early */
|
||||||
|
priv->next_scan_jiffies = jiffies + IWL_DELAY_NEXT_SCAN;
|
||||||
|
}
|
||||||
|
@@ -3805,11 +3803,6 @@ static int iwl3945_init_drv(struct iwl_priv *priv)
|
||||||
|
|
||||||
|
priv->iw_mode = NL80211_IFTYPE_STATION;
|
||||||
|
|
||||||
|
- iwl_reset_qos(priv);
|
||||||
|
-
|
||||||
|
- priv->qos_data.qos_active = 0;
|
||||||
|
- priv->qos_data.qos_cap.val = 0;
|
||||||
|
-
|
||||||
|
priv->rates_mask = IWL_RATES_MASK;
|
||||||
|
priv->tx_power_user_lmt = IWL_DEFAULT_TX_POWER;
|
||||||
|
|
||||||
|
--
|
||||||
|
1.7.1
|
||||||
|
|
|
@ -0,0 +1,97 @@
|
||||||
|
From 38c1a8432ffd1796a5fff4070d5c83c3d0ce7c57 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||||
|
Date: Mon, 29 Mar 2010 12:18:34 +0200
|
||||||
|
Subject: [PATCH 1/2] mac80211: explicitly disable/enable QoS
|
||||||
|
|
||||||
|
Add interface to disable/enable QoS (aka WMM or WME). Currently drivers
|
||||||
|
enable it explicitly when ->conf_tx method is called, and newer disable.
|
||||||
|
Disabling is needed for some APs, which do not support QoS, such
|
||||||
|
we should send QoS frames to them.
|
||||||
|
|
||||||
|
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||||
|
Signed-off-by: John W. Linville <linville@tuxdriver.com>
|
||||||
|
[bwh: Adjust context for 2.6.32]
|
||||||
|
---
|
||||||
|
include/net/mac80211.h | 5 +++++
|
||||||
|
net/mac80211/mlme.c | 9 ++++++++-
|
||||||
|
net/mac80211/util.c | 5 +++++
|
||||||
|
3 files changed, 18 insertions(+), 1 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
|
||||||
|
index c39ed07..de904fc 100644
|
||||||
|
--- a/include/net/mac80211.h
|
||||||
|
+++ b/include/net/mac80211.h
|
||||||
|
@@ -572,11 +572,15 @@ struct ieee80211_rx_status {
|
||||||
|
* may turn the device off as much as possible. Typically, this flag will
|
||||||
|
* be set when an interface is set UP but not associated or scanning, but
|
||||||
|
* it can also be unset in that case when monitor interfaces are active.
|
||||||
|
+ * @IEEE80211_CONF_QOS: Enable 802.11e QoS also know as WMM (Wireless
|
||||||
|
+ * Multimedia). On some drivers (iwlwifi is one of know) we have
|
||||||
|
+ * to enable/disable QoS explicitly.
|
||||||
|
*/
|
||||||
|
enum ieee80211_conf_flags {
|
||||||
|
IEEE80211_CONF_RADIOTAP = (1<<0),
|
||||||
|
IEEE80211_CONF_PS = (1<<1),
|
||||||
|
IEEE80211_CONF_IDLE = (1<<2),
|
||||||
|
+ IEEE80211_CONF_QOS = (1<<3),
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@@ -599,6 +603,7 @@ enum ieee80211_conf_changed {
|
||||||
|
IEEE80211_CONF_CHANGE_CHANNEL = BIT(6),
|
||||||
|
IEEE80211_CONF_CHANGE_RETRY_LIMITS = BIT(7),
|
||||||
|
IEEE80211_CONF_CHANGE_IDLE = BIT(8),
|
||||||
|
+ IEEE80211_CONF_CHANGE_QOS = BIT(9),
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
|
||||||
|
index 4a15df1..d3950b7 100644
|
||||||
|
--- a/net/mac80211/mlme.c
|
||||||
|
+++ b/net/mac80211/mlme.c
|
||||||
|
@@ -786,6 +786,9 @@ static void ieee80211_sta_wmm_params(struct ieee80211_local *local,
|
||||||
|
int count;
|
||||||
|
u8 *pos;
|
||||||
|
|
||||||
|
+ if (!local->ops->conf_tx)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
if (!(ifmgd->flags & IEEE80211_STA_WMM_ENABLED))
|
||||||
|
return;
|
||||||
|
|
||||||
|
@@ -844,11 +847,15 @@ static void ieee80211_sta_wmm_params(struct ieee80211_local *local,
|
||||||
|
wiphy_name(local->hw.wiphy), queue, aci, acm,
|
||||||
|
params.aifs, params.cw_min, params.cw_max, params.txop);
|
||||||
|
#endif
|
||||||
|
- if (drv_conf_tx(local, queue, ¶ms) && local->ops->conf_tx)
|
||||||
|
+ if (drv_conf_tx(local, queue, ¶ms))
|
||||||
|
printk(KERN_DEBUG "%s: failed to set TX queue "
|
||||||
|
"parameters for queue %d\n",
|
||||||
|
wiphy_name(local->hw.wiphy), queue);
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ /* enable WMM or activate new settings */
|
||||||
|
+ local->hw.conf.flags |= IEEE80211_CONF_QOS;
|
||||||
|
+ drv_config(local, IEEE80211_CONF_CHANGE_QOS);
|
||||||
|
}
|
||||||
|
|
||||||
|
static u32 ieee80211_handle_bss_capability(struct ieee80211_sub_if_data *sdata,
|
||||||
|
diff --git a/net/mac80211/util.c b/net/mac80211/util.c
|
||||||
|
index 31b1085..21f11cc 100644
|
||||||
|
--- a/net/mac80211/util.c
|
||||||
|
+++ b/net/mac80211/util.c
|
||||||
|
@@ -791,6 +791,11 @@ void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata)
|
||||||
|
|
||||||
|
drv_conf_tx(local, queue, &qparam);
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ /* after reinitialize QoS TX queues setting to default,
|
||||||
|
+ * disable QoS at all */
|
||||||
|
+ local->hw.conf.flags &= ~IEEE80211_CONF_QOS;
|
||||||
|
+ drv_config(local, IEEE80211_CONF_CHANGE_QOS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ieee80211_sta_def_wmm_params(struct ieee80211_sub_if_data *sdata,
|
||||||
|
--
|
||||||
|
1.7.1
|
||||||
|
|
|
@ -6,3 +6,5 @@
|
||||||
+ bugfix/all/macvtap-fix-reference-counting.patch
|
+ bugfix/all/macvtap-fix-reference-counting.patch
|
||||||
+ bugfix/all/macvtap-rework-object-lifetime-rules.patch
|
+ bugfix/all/macvtap-rework-object-lifetime-rules.patch
|
||||||
+ features/all/macvtap-add-GSO-csum-offload-support.patch
|
+ features/all/macvtap-add-GSO-csum-offload-support.patch
|
||||||
|
+ bugfix/all/mac80211-explicitly-disable-enable-QoS.patch
|
||||||
|
+ bugfix/all/iwlwifi-manage-QoS-by-mac-stack.patch
|
||||||
|
|
Loading…
Reference in New Issue