All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bruno Randolf <br1@einfach.org>
To: greearb@candelatech.com
Cc: linux-wireless@vger.kernel.org
Subject: Re: [PATCH v2] ath5k:  Adjust opmode when interfaces are removed.
Date: Tue, 12 Oct 2010 10:44:39 +0900	[thread overview]
Message-ID: <201010121044.39093.br1@einfach.org> (raw)
In-Reply-To: <1286564475-10105-1-git-send-email-greearb@candelatech.com>

On Sat October 9 2010 04:01:15 greearb@candelatech.com wrote:
> From: Ben Greear <greearb@candelatech.com>
> 
> Otherwise, if there is an AP and a STATION, and AP
> is removed, the NIC will not revert back to STATION mode.
> 
> Reported-by: Eliad Peller <eliad@wizery.com>
> Signed-off-by: Ben Greear <greearb@candelatech.com>
> ---
> v1 -> v2:  Make setting opmode un-conditional, rename
>     method to:  ath5k_update_bssid_mask_and_opmode
> 
> :100644 100644 dad7265... c9732a6...
> :M	drivers/net/wireless/ath/ath5k/base.c
> 
>  drivers/net/wireless/ath/ath5k/base.c |   66
> ++++++++++++++++++++------------- 1 files changed, 40 insertions(+), 26
> deletions(-)
> 
> diff --git a/drivers/net/wireless/ath/ath5k/base.c
> b/drivers/net/wireless/ath/ath5k/base.c index dad7265..c9732a6 100644
> --- a/drivers/net/wireless/ath/ath5k/base.c
> +++ b/drivers/net/wireless/ath/ath5k/base.c
> @@ -62,6 +62,7 @@
>  #include "reg.h"
>  #include "debug.h"
>  #include "ani.h"
> +#include "../debug.h"
> 
>  static int modparam_nohwcrypt;
>  module_param_named(nohwcrypt, modparam_nohwcrypt, bool, S_IRUGO);
> @@ -517,12 +518,14 @@ struct ath_vif_iter_data {
>  	bool		need_set_hw_addr;
>  	bool		found_active;
>  	bool		any_assoc;
> +	enum nl80211_iftype opmode;
>  };
> 
>  static void ath_vif_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
>  {
>  	struct ath_vif_iter_data *iter_data = data;
>  	int i;
> +	struct ath5k_vif *avf = (void *)vif->drv_priv;
> 
>  	if (iter_data->hw_macaddr)
>  		for (i = 0; i < ETH_ALEN; i++)
> @@ -539,13 +542,34 @@ static void ath_vif_iter(void *data, u8 *mac, struct
> ieee80211_vif *vif) iter_data->need_set_hw_addr = false;
> 
>  	if (!iter_data->any_assoc) {
> -		struct ath5k_vif *avf = (void *)vif->drv_priv;
>  		if (avf->assoc)
>  			iter_data->any_assoc = true;
>  	}
> +
> +	/* Calculate combined mode - when APs are active, operate in AP mode.
> +	 * Otherwise use the mode of the new interface. This can currently
> +	 * only deal with combinations of APs and STAs. Only one ad-hoc
> +	 * interfaces is allowed above.

the comment reference to "above" does not make sense here any more.

> +	 */
> +	if (avf->opmode == NL80211_IFTYPE_AP)
> +		iter_data->opmode = NL80211_IFTYPE_AP;
> +	else
> +		if (iter_data->opmode == NL80211_IFTYPE_UNSPECIFIED)
> +			iter_data->opmode = avf->opmode;
>  }
> 
> -void ath5k_update_bssid_mask(struct ath5k_softc *sc, struct ieee80211_vif
> *vif) +static void ath_do_set_opmode(struct ath5k_softc *sc)
> +{
> +	struct ath5k_hw *ah = sc->ah;
> +	ath5k_hw_set_opmode(ah, sc->opmode);
> +	ATH5K_DBG(sc, ATH5K_DEBUG_MODE, "mode setup opmode %d (%s)\n",
> +		  sc->opmode,
> +		  ath_opmode_to_string(sc->opmode) ?
> +		  ath_opmode_to_string(sc->opmode) : "UKNOWN");
> +}

what's the point of this function? just to add the debug print? 

> +void ath5k_update_bssid_mask_and_opmode(struct ath5k_softc *sc,
> +					struct ieee80211_vif *vif)
>  {
>  	struct ath_common *common = ath5k_hw_common(sc->ah);
>  	struct ath_vif_iter_data iter_data;
> @@ -558,6 +582,7 @@ void ath5k_update_bssid_mask(struct ath5k_softc *sc,
> struct ieee80211_vif *vif) memset(&iter_data.mask, 0xff, ETH_ALEN);
>  	iter_data.found_active = false;
>  	iter_data.need_set_hw_addr = true;
> +	iter_data.opmode = NL80211_IFTYPE_UNSPECIFIED;
> 
>  	if (vif)
>  		ath_vif_iter(&iter_data, vif->addr, vif);
> @@ -567,10 +592,18 @@ void ath5k_update_bssid_mask(struct ath5k_softc *sc,
> struct ieee80211_vif *vif) &iter_data);
>  	memcpy(sc->bssidmask, iter_data.mask, ETH_ALEN);
> 
> +	sc->opmode = iter_data.opmode;
> +	if (sc->opmode == NL80211_IFTYPE_UNSPECIFIED)
> +		/* Nothing active, default to station mode */
> +		sc->opmode = NL80211_IFTYPE_STATION;
> +
> +	ath_do_set_opmode(sc);
>  	if (iter_data.need_set_hw_addr && iter_data.found_active)
>  		ath5k_hw_set_lladdr(sc->ah, iter_data.active_mac);
> 
> -	ath5k_hw_set_bssid_mask(sc->ah, sc->bssidmask);
> +	if (ath5k_hw_hasbssidmask(sc->ah))
> +		ath5k_hw_set_bssid_mask(sc->ah, sc->bssidmask);
>  }
> 
>  static void
> @@ -582,15 +615,9 @@ ath5k_mode_setup(struct ath5k_softc *sc, struct
> ieee80211_vif *vif) /* configure rx filter */
>  	rfilt = sc->filter_flags;
>  	ath5k_hw_set_rx_filter(ah, rfilt);
> -
> -	if (ath5k_hw_hasbssidmask(ah))
> -		ath5k_update_bssid_mask(sc, vif);
> -
> -	/* configure operational mode */
> -	ath5k_hw_set_opmode(ah, sc->opmode);
> -
> -	ATH5K_DBG(sc, ATH5K_DEBUG_MODE, "mode setup opmode %d\n", sc->opmode);
>  	ATH5K_DBG(sc, ATH5K_DEBUG_MODE, "RX filter 0x%x\n", rfilt);
> +
> +	ath5k_update_bssid_mask_and_opmode(sc, vif);
>  }
> 
>  static inline int
> @@ -2688,7 +2715,7 @@ ath5k_attach(struct pci_dev *pdev, struct
> ieee80211_hw *hw) SET_IEEE80211_PERM_ADDR(hw, mac);
>  	memcpy(&sc->lladdr, mac, ETH_ALEN);
>  	/* All MAC address bits matter for ACKs */
> -	ath5k_update_bssid_mask(sc, NULL);
> +	ath5k_update_bssid_mask_and_opmode(sc, NULL);
> 
>  	regulatory->current_rd = ah->ah_capabilities.cap_eeprom.ee_regdomain;
>  	ret = ath_regd_init(regulatory, hw->wiphy, ath5k_reg_notifier);
> @@ -2786,7 +2813,6 @@ static int ath5k_add_interface(struct ieee80211_hw
> *hw, {
>  	struct ath5k_softc *sc = hw->priv;
>  	int ret;
> -	struct ath5k_hw *ah = sc->ah;
>  	struct ath5k_vif *avf = (void *)vif->drv_priv;
> 
>  	mutex_lock(&sc->lock);
> @@ -2850,18 +2876,6 @@ static int ath5k_add_interface(struct ieee80211_hw
> *hw, sc->num_adhoc_vifs++;
>  	}
> 
> -	/* Set combined mode - when APs are configured, operate in AP mode.
> -	 * Otherwise use the mode of the new interface. This can currently
> -	 * only deal with combinations of APs and STAs. Only one ad-hoc
> -	 * interfaces is allowed above.
> -	 */
> -	if (sc->num_ap_vifs)
> -		sc->opmode = NL80211_IFTYPE_AP;
> -	else
> -		sc->opmode = vif->type;
> -
> -	ath5k_hw_set_opmode(ah, sc->opmode);
> -

i think it makes sense to set the opmode here. and also do the same in 
ath5k_remove_interface. that way we figure out the opmode when interfaces are 
added/removed.

>  	/* Any MAC address is fine, all others are included through the
>  	 * filter.
>  	 */
> @@ -2905,7 +2919,7 @@ ath5k_remove_interface(struct ieee80211_hw *hw,
>  	else if (avf->opmode == NL80211_IFTYPE_ADHOC)
>  		sc->num_adhoc_vifs--;
> 
> -	ath5k_update_bssid_mask(sc, NULL);
> +	ath5k_update_bssid_mask_and_opmode(sc, NULL);
>  	mutex_unlock(&sc->lock);
>  }


  reply	other threads:[~2010-10-12  1:44 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-10-08 19:01 [PATCH v2] ath5k: Adjust opmode when interfaces are removed greearb
2010-10-12  1:44 ` Bruno Randolf [this message]
2010-10-12  2:10   ` Ben Greear
2010-10-12  2:48     ` Bruno Randolf
2010-11-10 19:44       ` Ben Greear

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=201010121044.39093.br1@einfach.org \
    --to=br1@einfach.org \
    --cc=greearb@candelatech.com \
    --cc=linux-wireless@vger.kernel.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.