Search Linux Wireless

Re: [PATCH 2/2] iwlwifi: manage QoS by mac stack

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxx>
> ---
>  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

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux