| From: Stanislaw Gruszka <sgruszka@redhat.com> |
| To: kernel@lists.fedoraproject.org, "John W. Linville" <linville@redhat.com> |
| Subject: [PATCH 2/4 2.6.34.y] iwlwifi: manage QoS by mac stack |
| Date: Fri, 11 Jun 2010 17:05:12 +0200 |
| |
| commit e61146e36b40fd9d346118c40285913236c329f3 upstream. |
| |
| 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> |
| |
| drivers/net/wireless/iwlwifi/iwl-agn.c | 15 --- |
| drivers/net/wireless/iwlwifi/iwl-core.c | 142 +++------------------------ |
| 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(+), 171 deletions(-) |
| |
| diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c |
| index bdff565..21c3ef0 100644 |
| |
| |
| @@ -2515,7 +2515,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__); |
| @@ -2600,10 +2599,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 */ |
| @@ -2780,7 +2775,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; |
| @@ -2832,10 +2826,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); |
| - iwl_reset_qos(priv); |
| - spin_lock_irqsave(&priv->lock, flags); |
| - iwl_activate_qos(priv, 1); |
| - spin_unlock_irqrestore(&priv->lock, flags); |
| iwl_add_bcast_station(priv); |
| } |
| iwl_send_beacon_cmd(priv); |
| @@ -3396,11 +3386,6 @@ static 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 |
| diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c |
| index 049b652..2dd8aaa 100644 |
| |
| |
| @@ -325,17 +325,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; |
| @@ -343,118 +339,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 */ |
| @@ -2306,12 +2198,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); |
| |
| @@ -2587,11 +2473,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); |
| @@ -2833,6 +2716,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); |
| + } |
| + |
| if (!iwl_is_ready(priv)) { |
| IWL_DEBUG_MAC80211(priv, "leave - not ready\n"); |
| goto out; |
| @@ -2867,8 +2759,6 @@ void iwl_mac_reset_tsf(struct ieee80211_hw *hw) |
| memset(&priv->current_ht_config, 0, sizeof(struct iwl_ht_config)); |
| 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 36940a9..70af968 100644 |
| |
| |
| @@ -304,8 +304,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 ef1720a..cc12e89 100644 |
| |
| |
| @@ -519,30 +519,9 @@ struct iwl_ht_config { |
| 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 b74a56c..c054527 100644 |
| |
| |
| @@ -3152,8 +3152,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; |
| } |
| @@ -3861,11 +3859,6 @@ static int iwl3945_init_drv(struct iwl_priv *priv) |
| priv->iw_mode = NL80211_IFTYPE_STATION; |
| priv->missed_beacon_threshold = IWL_MISSED_BEACON_THRESHOLD_DEF; |
| |
| - 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.6.2.5 |
| |
| _______________________________________________ |
| kernel mailing list |
| kernel@lists.fedoraproject.org |
| https://admin.fedoraproject.org/mailman/listinfo/kernel |
| |