From: "Guy, Wey-Yi" <wey-yi.w.guy@intel.com>
To: Stanislaw Gruszka <sgruszka@redhat.com>
Cc: "linux-wireless@vger.kernel.org" <linux-wireless@vger.kernel.org>,
"Chatre, Reinette" <reinette.chatre@intel.com>,
Johannes Berg <johannes@sipsolutions.net>,
"John W. Linville" <linville@tuxdriver.com>
Subject: Re: [PATCH 2/2] iwlwifi: manage QoS by mac stack
Date: Fri, 26 Mar 2010 10:48:45 -0700 [thread overview]
Message-ID: <1269625725.3023.0.camel@wwguy-ubuntu> (raw)
In-Reply-To: <1269621992-5034-2-git-send-email-sgruszka@redhat.com>
Hi Stanislaw,
On Fri, 2010-03-26 at 09:46 -0700, Stanislaw Gruszka wrote:
> 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 | 141 +++------------------------
> 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 818367b..a912586 100644
> --- a/drivers/net/wireless/iwlwifi/iwl-agn.c
> +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
> @@ -2506,7 +2506,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__);
> @@ -2591,10 +2590,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 */
> @@ -2771,7 +2766,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;
> @@ -2823,10 +2817,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);
> @@ -3386,11 +3376,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 112149e..1043b28 100644
> --- a/drivers/net/wireless/iwlwifi/iwl-core.c
> +++ b/drivers/net/wireless/iwlwifi/iwl-core.c
> @@ -321,17 +321,13 @@ EXPORT_SYMBOL(iwl_hw_nic_init);
> /*
> * QoS support
> */
> -void iwl_activate_qos(struct iwl_priv *priv, u8 force)
> +void iwl_activate_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;
> @@ -339,119 +335,16 @@ 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 */
> static void iwlcore_init_ht_hw_capab(const struct iwl_priv *priv,
> @@ -2302,12 +2195,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);
>
> @@ -2583,11 +2470,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);
> @@ -2829,6 +2713,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_activate_qos(priv);
> + spin_unlock_irqrestore(&priv->lock, flags);
> + }
> +
> if (!iwl_is_ready(priv)) {
> IWL_DEBUG_MAC80211(priv, "leave - not ready\n");
> goto out;
> @@ -2863,8 +2756,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 4ef7739..da7c449 100644
> --- a/drivers/net/wireless/iwlwifi/iwl-core.h
> +++ b/drivers/net/wireless/iwlwifi/iwl-core.h
> @@ -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 6054c5f..5da9d57 100644
> --- a/drivers/net/wireless/iwlwifi/iwl-dev.h
> +++ b/drivers/net/wireless/iwlwifi/iwl-dev.h
> @@ -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 54daa38..21e855a 100644
> --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
> +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
> @@ -3150,8 +3150,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;
> }
> @@ -3859,11 +3857,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;
>
it is much simple now, thanks
Wey
next prev parent reply other threads:[~2010-03-26 16:52 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-03-26 16:46 [PATCH 1/2] mac80211: explicitly disable/enable QoS Stanislaw Gruszka
2010-03-26 16:46 ` [PATCH 2/2] iwlwifi: manage QoS by mac stack Stanislaw Gruszka
2010-03-26 17:28 ` Johannes Berg
2010-03-26 17:48 ` Guy, Wey-Yi [this message]
2010-03-26 17:26 ` [PATCH 1/2] mac80211: explicitly disable/enable QoS Johannes Berg
2010-03-29 7:17 ` Stanislaw Gruszka
2010-03-29 8:27 ` Johannes Berg
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1269625725.3023.0.camel@wwguy-ubuntu \
--to=wey-yi.w.guy@intel.com \
--cc=johannes@sipsolutions.net \
--cc=linux-wireless@vger.kernel.org \
--cc=linville@tuxdriver.com \
--cc=reinette.chatre@intel.com \
--cc=sgruszka@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox