Re: pull request: wireless-2.6 2010-05-25

From: Sedat Dilek
Date: Tue May 25 2010 - 15:24:23 EST


"[1/2] iwlwifi: fix internal scan race" [1] is in this pull request.
Isn't "[2/2] iwlagn: work around rate scaling reset delay" [2] missing?
IIRC, both fixes were sent as a double-patch.

- Sedat -

[1] https://patchwork.kernel.org/patch/99439/
[2] https://patchwork.kernel.org/patch/99438/

On Tue, May 25, 2010 at 7:04 PM, John W. Linville
<linville@xxxxxxxxxxxxx> wrote:
> Dave,
>
> Here are a number of fixes intended for 2.6.35. ÂIncluded are some
> warning fixes from Randy, some smatch-identified fixes from Dan, some
> fixes for using ath9k and IBSS mode, the removal of a PCI ID that was
> optimistically added to ath9k, and a smattering of other driver fixes.
> This also includes a revert of "ath9k: Group Key fix for VAPs" which
> was reported to cause regressions due to a mac80211 change inside it
> that snuck past us... :-(
>
> Anyway, these are mostly small(ish) and obvious. ÂPlease let me know
> if there are problems!
>
> Thanks,
>
> John
>
> ---
>
> The following changes since commit acfbe96a3035639619a6533e04d88ed4ef9ccb61:
> ÂRandy Dunlap (1):
> Â Â Â Âsock.h: fix kernel-doc warning
>
> are available in the git repository at:
>
> Âgit://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6.git master
>
> Bruno Randolf (1):
> Â Â Âath5k: consistently use rx_bufsize for RX DMA
>
> Dan Carpenter (3):
> Â Â Âath9k_htc: dereferencing before check in hif_usb_tx_cb()
> Â Â Âath9k_htc: rare leak in ath9k_hif_usb_alloc_tx_urbs()
> Â Â Âiwlwifi: testing the wrong variable in iwl_add_bssid_station()
>
> Felix Fietkau (3):
> Â Â Âcfg80211: fix crash in cfg80211_set_freq()
> Â Â Âath9k: change beacon allocation to prefer the first beacon slot
> Â Â Âath9k: remove VEOL support for ad-hoc
>
> Gertjan van Wingerde (2):
> Â Â Ârt2x00: Fix failed SLEEP->AWAKE and AWAKE->SLEEP transitions.
> Â Â Ârt2x00: Fix rt2800usb TX descriptor writing.
>
> Helmut Schaa (1):
> Â Â Ârt2x00: don't use to_pci_dev in rt2x00pci_uninitialize
>
> Johannes Berg (1):
> Â Â Âcfg80211: add missing braces
>
> John W. Linville (1):
> Â Â ÂRevert "ath9k: Group Key fix for VAPs"
>
> Jussi Kivilinna (1):
> Â Â Ârndis_wlan: replace wireless_send_event with cfg80211_disconnected
>
> Juuso Oikarinen (1):
> Â Â Âwl1271: Fix RX data path frame lengths
>
> Luis R. Rodriguez (1):
> Â Â Âath9k: remove AR9003 from PCI IDs for now
>
> Randy Dunlap (2):
> Â Â Âwireless: fix mac80211.h kernel-doc warnings
> Â Â Âwireless: fix sta_info.h kernel-doc warnings
>
> Reinette Chatre (1):
> Â Â Âiwlwifi: fix internal scan race
>
> Sujith (1):
> Â Â Âcfg80211: Fix signal_type comparison
>
> Tejun Heo (1):
> Â Â Âwireless: update gfp/slab.h includes
>
> Vasanthakumar Thiagarajan (1):
> Â Â Âath9k: Fix rx of mcast/bcast frames in PS mode with auto sleep
>
> Âdrivers/net/wireless/ath/ath5k/base.c   Â|  Â7 ++-
> Âdrivers/net/wireless/ath/ath9k/beacon.c  Â|  75 +++++-----------------------
> Âdrivers/net/wireless/ath/ath9k/hif_usb.c  |  10 +++-
> Âdrivers/net/wireless/ath/ath9k/htc.h    |  Â1 +
> Âdrivers/net/wireless/ath/ath9k/main.c   Â|  28 +---------
> Âdrivers/net/wireless/ath/ath9k/pci.c    |  Â1 -
> Âdrivers/net/wireless/ath/ath9k/recv.c   Â|  17 +++++--
> Âdrivers/net/wireless/iwlwifi/iwl-agn-ict.c | Â Â1 +
> Âdrivers/net/wireless/iwlwifi/iwl-scan.c  Â|  21 +++++++-
> Âdrivers/net/wireless/iwlwifi/iwl-sta.c   |  Â2 +-
> Âdrivers/net/wireless/rndis_wlan.c     Â|  16 ++++--
> Âdrivers/net/wireless/rt2x00/rt2400pci.c  Â|  Â9 ++--
> Âdrivers/net/wireless/rt2x00/rt2500pci.c  Â|  Â9 ++--
> Âdrivers/net/wireless/rt2x00/rt2800usb.c  Â|  Â2 +-
> Âdrivers/net/wireless/rt2x00/rt2x00pci.c  Â|  Â2 +-
> Âdrivers/net/wireless/rt2x00/rt61pci.c   Â|  Â7 ++-
> Âdrivers/net/wireless/rt2x00/rt73usb.c   Â|  Â7 ++-
> Âdrivers/net/wireless/wl12xx/wl1271_rx.c  Â|  Â2 +
> Âinclude/net/mac80211.h           |  Â4 +-
> Ânet/mac80211/key.c             |  Â1 -
> Ânet/mac80211/sta_info.h          Â|  Â2 +-
> Ânet/wireless/chan.c            Â|  Â2 +-
> Ânet/wireless/nl80211.c           |  Â6 ++-
> Ânet/wireless/scan.c            Â|  Â4 +-
> Â24 files changed, 104 insertions(+), 132 deletions(-)
>
> diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c
> index 5f04cf3..cc6d41d 100644
> --- a/drivers/net/wireless/ath/ath5k/base.c
> +++ b/drivers/net/wireless/ath/ath5k/base.c
> @@ -1214,6 +1214,7 @@ ath5k_rxbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf)
> Â Â Â Âstruct ath5k_hw *ah = sc->ah;
> Â Â Â Âstruct sk_buff *skb = bf->skb;
> Â Â Â Âstruct ath5k_desc *ds;
> + Â Â Â int ret;
>
> Â Â Â Âif (!skb) {
> Â Â Â Â Â Â Â Âskb = ath5k_rx_skb_alloc(sc, &bf->skbaddr);
> @@ -1240,9 +1241,9 @@ ath5k_rxbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf)
> Â Â Â Âds = bf->desc;
> Â Â Â Âds->ds_link = bf->daddr; Â Â Â Â/* link to self */
> Â Â Â Âds->ds_data = bf->skbaddr;
> - Â Â Â ah->ah_setup_rx_desc(ah, ds,
> - Â Â Â Â Â Â Â skb_tailroom(skb), Â Â Â/* buffer size */
> - Â Â Â Â Â Â Â 0);
> + Â Â Â ret = ah->ah_setup_rx_desc(ah, ds, ah->common.rx_bufsize, 0);
> + Â Â Â if (ret)
> + Â Â Â Â Â Â Â return ret;
>
> Â Â Â Âif (sc->rxlink != NULL)
> Â Â Â Â Â Â Â Â*sc->rxlink = bf->daddr;
> diff --git a/drivers/net/wireless/ath/ath9k/beacon.c b/drivers/net/wireless/ath/ath9k/beacon.c
> index c8a4558..f43d85a 100644
> --- a/drivers/net/wireless/ath/ath9k/beacon.c
> +++ b/drivers/net/wireless/ath/ath9k/beacon.c
> @@ -76,22 +76,13 @@ static void ath_beacon_setup(struct ath_softc *sc, struct ath_vif *avp,
> Â Â Â Âds = bf->bf_desc;
> Â Â Â Âflags = ATH9K_TXDESC_NOACK;
>
> - Â Â Â if (((sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC) ||
> - Â Â Â Â Â Â(sc->sc_ah->opmode == NL80211_IFTYPE_MESH_POINT)) &&
> - Â Â Â Â Â (ah->caps.hw_caps & ATH9K_HW_CAP_VEOL)) {
> - Â Â Â Â Â Â Â ds->ds_link = bf->bf_daddr; /* self-linked */
> - Â Â Â Â Â Â Â flags |= ATH9K_TXDESC_VEOL;
> - Â Â Â Â Â Â Â /* Let hardware handle antenna switching. */
> - Â Â Â Â Â Â Â antenna = 0;
> - Â Â Â } else {
> - Â Â Â Â Â Â Â ds->ds_link = 0;
> - Â Â Â Â Â Â Â /*
> - Â Â Â Â Â Â Â Â* Switch antenna every beacon.
> - Â Â Â Â Â Â Â Â* Should only switch every beacon period, not for every SWBA
> - Â Â Â Â Â Â Â Â* XXX assumes two antennae
> - Â Â Â Â Â Â Â Â*/
> - Â Â Â Â Â Â Â antenna = ((sc->beacon.ast_be_xmit / sc->nbcnvifs) & 1 ? 2 : 1);
> - Â Â Â }
> + Â Â Â ds->ds_link = 0;
> + Â Â Â /*
> + Â Â Â Â* Switch antenna every beacon.
> + Â Â Â Â* Should only switch every beacon period, not for every SWBA
> + Â Â Â Â* XXX assumes two antennae
> + Â Â Â Â*/
> + Â Â Â antenna = ((sc->beacon.ast_be_xmit / sc->nbcnvifs) & 1 ? 2 : 1);
>
> Â Â Â Âsband = &sc->sbands[common->hw->conf.channel->band];
> Â Â Â Ârate = sband->bitrates[rateidx].hw_value;
> @@ -215,36 +206,6 @@ static struct ath_buf *ath_beacon_generate(struct ieee80211_hw *hw,
> Â Â Â Âreturn bf;
> Â}
>
> -/*
> - * Startup beacon transmission for adhoc mode when they are sent entirely
> - * by the hardware using the self-linked descriptor + veol trick.
> -*/
> -static void ath_beacon_start_adhoc(struct ath_softc *sc,
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Âstruct ieee80211_vif *vif)
> -{
> - Â Â Â struct ath_hw *ah = sc->sc_ah;
> - Â Â Â struct ath_common *common = ath9k_hw_common(ah);
> - Â Â Â struct ath_buf *bf;
> - Â Â Â struct ath_vif *avp;
> - Â Â Â struct sk_buff *skb;
> -
> - Â Â Â avp = (void *)vif->drv_priv;
> -
> - Â Â Â if (avp->av_bcbuf == NULL)
> - Â Â Â Â Â Â Â return;
> -
> - Â Â Â bf = avp->av_bcbuf;
> - Â Â Â skb = bf->bf_mpdu;
> -
> - Â Â Â ath_beacon_setup(sc, avp, bf, 0);
> -
> - Â Â Â /* NB: caller is known to have already stopped tx dma */
> - Â Â Â ath9k_hw_puttxbuf(ah, sc->beacon.beaconq, bf->bf_daddr);
> - Â Â Â ath9k_hw_txstart(ah, sc->beacon.beaconq);
> - Â Â Â ath_print(common, ATH_DBG_BEACON, "TXDP%u = %llx (%p)\n",
> - Â Â Â Â Â Â Â Â sc->beacon.beaconq, ito64(bf->bf_daddr), bf->bf_desc);
> -}
> -
> Âint ath_beacon_alloc(struct ath_wiphy *aphy, struct ieee80211_vif *vif)
> Â{
> Â Â Â Âstruct ath_softc *sc = aphy->sc;
> @@ -265,7 +226,8 @@ int ath_beacon_alloc(struct ath_wiphy *aphy, struct ieee80211_vif *vif)
> Â Â Â Â Â Â Â Âlist_del(&avp->av_bcbuf->list);
>
> Â Â Â Â Â Â Â Âif (sc->sc_ah->opmode == NL80211_IFTYPE_AP ||
> - Â Â Â Â Â Â Â Â Â !(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_VEOL)) {
> + Â Â Â Â Â Â Â Â Â sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC ||
> + Â Â Â Â Â Â Â Â Â sc->sc_ah->opmode == NL80211_IFTYPE_MESH_POINT) {
> Â Â Â Â Â Â Â Â Â Â Â Âint slot;
> Â Â Â Â Â Â Â Â Â Â Â Â/*
> Â Â Â Â Â Â Â Â Â Â Â Â * Assign the vif to a beacon xmit slot. As
> @@ -274,17 +236,11 @@ int ath_beacon_alloc(struct ath_wiphy *aphy, struct ieee80211_vif *vif)
> Â Â Â Â Â Â Â Â Â Â Â Âavp->av_bslot = 0;
> Â Â Â Â Â Â Â Â Â Â Â Âfor (slot = 0; slot < ATH_BCBUF; slot++)
> Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Âif (sc->beacon.bslot[slot] == NULL) {
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â /*
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â* XXX hack, space out slots to better
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â* deal with misses
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â*/
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â if (slot+1 < ATH_BCBUF &&
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â sc->beacon.bslot[slot+1] == NULL) {
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â avp->av_bslot = slot+1;
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â break;
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â }
> Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Âavp->av_bslot = slot;
> +
> Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â/* NB: keep looking for a double slot */
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â if (slot == 0 || !sc->beacon.bslot[slot-1])
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â break;
> Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â}
> Â Â Â Â Â Â Â Â Â Â Â ÂBUG_ON(sc->beacon.bslot[avp->av_bslot] != NULL);
> Â Â Â Â Â Â Â Â Â Â Â Âsc->beacon.bslot[avp->av_bslot] = vif;
> @@ -721,8 +677,7 @@ static void ath_beacon_config_adhoc(struct ath_softc *sc,
> Â Â Â Â * self-linked tx descriptor and let the hardware deal with things.
> Â Â Â Â */
> Â Â Â Âintval |= ATH9K_BEACON_ENA;
> - Â Â Â if (!(ah->caps.hw_caps & ATH9K_HW_CAP_VEOL))
> - Â Â Â Â Â Â Â ah->imask |= ATH9K_INT_SWBA;
> + Â Â Â ah->imask |= ATH9K_INT_SWBA;
>
> Â Â Â Âath_beaconq_config(sc);
>
> @@ -732,10 +687,6 @@ static void ath_beacon_config_adhoc(struct ath_softc *sc,
> Â Â Â Âath9k_beacon_init(sc, nexttbtt, intval);
> Â Â Â Âsc->beacon.bmisscnt = 0;
> Â Â Â Âath9k_hw_set_interrupts(ah, ah->imask);
> -
> - Â Â Â /* FIXME: Handle properly when vif is NULL */
> - Â Â Â if (vif && ah->caps.hw_caps & ATH9K_HW_CAP_VEOL)
> - Â Â Â Â Â Â Â ath_beacon_start_adhoc(sc, vif);
> Â}
>
> Âvoid ath_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif)
> diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c
> index 46dc41a..77b3591 100644
> --- a/drivers/net/wireless/ath/ath9k/hif_usb.c
> +++ b/drivers/net/wireless/ath/ath9k/hif_usb.c
> @@ -107,12 +107,14 @@ static inline void ath9k_skb_queue_purge(struct hif_device_usb *hif_dev,
> Âstatic void hif_usb_tx_cb(struct urb *urb)
> Â{
> Â Â Â Âstruct tx_buf *tx_buf = (struct tx_buf *) urb->context;
> - Â Â Â struct hif_device_usb *hif_dev = tx_buf->hif_dev;
> + Â Â Â struct hif_device_usb *hif_dev;
> Â Â Â Âstruct sk_buff *skb;
>
> - Â Â Â if (!hif_dev || !tx_buf)
> + Â Â Â if (!tx_buf || !tx_buf->hif_dev)
> Â Â Â Â Â Â Â Âreturn;
>
> + Â Â Â hif_dev = tx_buf->hif_dev;
> +
> Â Â Â Âswitch (urb->status) {
> Â Â Â Âcase 0:
> Â Â Â Â Â Â Â Âbreak;
> @@ -607,6 +609,10 @@ static int ath9k_hif_usb_alloc_tx_urbs(struct hif_device_usb *hif_dev)
>
> Â Â Â Âreturn 0;
> Âerr:
> + Â Â Â if (tx_buf) {
> + Â Â Â Â Â Â Â kfree(tx_buf->buf);
> + Â Â Â Â Â Â Â kfree(tx_buf);
> + Â Â Â }
> Â Â Â Âath9k_hif_usb_dealloc_tx_urbs(hif_dev);
> Â Â Â Âreturn -ENOMEM;
> Â}
> diff --git a/drivers/net/wireless/ath/ath9k/htc.h b/drivers/net/wireless/ath/ath9k/htc.h
> index ad556aa..c251603 100644
> --- a/drivers/net/wireless/ath/ath9k/htc.h
> +++ b/drivers/net/wireless/ath/ath9k/htc.h
> @@ -23,6 +23,7 @@
> Â#include <linux/skbuff.h>
> Â#include <linux/netdevice.h>
> Â#include <linux/leds.h>
> +#include <linux/slab.h>
> Â#include <net/mac80211.h>
>
> Â#include "common.h"
> diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
> index 893b552..abfa049 100644
> --- a/drivers/net/wireless/ath/ath9k/main.c
> +++ b/drivers/net/wireless/ath/ath9k/main.c
> @@ -752,7 +752,6 @@ static int ath_key_config(struct ath_common *common,
> Â Â Â Âstruct ath_hw *ah = common->ah;
> Â Â Â Âstruct ath9k_keyval hk;
> Â Â Â Âconst u8 *mac = NULL;
> - Â Â Â u8 gmac[ETH_ALEN];
> Â Â Â Âint ret = 0;
> Â Â Â Âint idx;
>
> @@ -776,30 +775,9 @@ static int ath_key_config(struct ath_common *common,
> Â Â Â Âmemcpy(hk.kv_val, key->key, key->keylen);
>
> Â Â Â Âif (!(key->flags & IEEE80211_KEY_FLAG_PAIRWISE)) {
> -
> - Â Â Â Â Â Â Â if (key->ap_addr) {
> - Â Â Â Â Â Â Â Â Â Â Â /*
> - Â Â Â Â Â Â Â Â Â Â Â Â* Group keys on hardware that supports multicast frame
> - Â Â Â Â Â Â Â Â Â Â Â Â* key search use a mac that is the sender's address with
> - Â Â Â Â Â Â Â Â Â Â Â Â* the high bit set instead of the app-specified address.
> - Â Â Â Â Â Â Â Â Â Â Â Â*/
> - Â Â Â Â Â Â Â Â Â Â Â memcpy(gmac, key->ap_addr, ETH_ALEN);
> - Â Â Â Â Â Â Â Â Â Â Â gmac[0] |= 0x80;
> - Â Â Â Â Â Â Â Â Â Â Â mac = gmac;
> -
> - Â Â Â Â Â Â Â Â Â Â Â if (key->alg == ALG_TKIP)
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â idx = ath_reserve_key_cache_slot_tkip(common);
> - Â Â Â Â Â Â Â Â Â Â Â else
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â idx = ath_reserve_key_cache_slot(common);
> - Â Â Â Â Â Â Â Â Â Â Â if (idx < 0)
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â mac = NULL; /* no free key cache entries */
> - Â Â Â Â Â Â Â }
> -
> - Â Â Â Â Â Â Â if (!mac) {
> - Â Â Â Â Â Â Â Â Â Â Â /* For now, use the default keys for broadcast keys. This may
> - Â Â Â Â Â Â Â Â Â Â Â Â* need to change with virtual interfaces. */
> - Â Â Â Â Â Â Â Â Â Â Â idx = key->keyidx;
> - Â Â Â Â Â Â Â }
> + Â Â Â Â Â Â Â /* For now, use the default keys for broadcast keys. This may
> + Â Â Â Â Â Â Â Â* need to change with virtual interfaces. */
> + Â Â Â Â Â Â Â idx = key->keyidx;
> Â Â Â Â} else if (key->keyidx) {
> Â Â Â Â Â Â Â Âif (WARN_ON(!sta))
> Â Â Â Â Â Â Â Â Â Â Â Âreturn -EOPNOTSUPP;
> diff --git a/drivers/net/wireless/ath/ath9k/pci.c b/drivers/net/wireless/ath/ath9k/pci.c
> index 257b10b..1ec836c 100644
> --- a/drivers/net/wireless/ath/ath9k/pci.c
> +++ b/drivers/net/wireless/ath/ath9k/pci.c
> @@ -28,7 +28,6 @@ static DEFINE_PCI_DEVICE_TABLE(ath_pci_id_table) = {
> Â Â Â Â{ PCI_VDEVICE(ATHEROS, 0x002C) }, /* PCI-E 802.11n bonded out */
> Â Â Â Â{ PCI_VDEVICE(ATHEROS, 0x002D) }, /* PCI Â */
> Â Â Â Â{ PCI_VDEVICE(ATHEROS, 0x002E) }, /* PCI-E */
> - Â Â Â { PCI_VDEVICE(ATHEROS, 0x0030) }, /* PCI-E ÂAR9300 */
> Â Â Â Â{ 0 }
> Â};
>
> diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c
> index ba13913..ca6065b 100644
> --- a/drivers/net/wireless/ath/ath9k/recv.c
> +++ b/drivers/net/wireless/ath/ath9k/recv.c
> @@ -19,6 +19,12 @@
>
> Â#define SKB_CB_ATHBUF(__skb) Â (*((struct ath_buf **)__skb->cb))
>
> +static inline bool ath9k_check_auto_sleep(struct ath_softc *sc)
> +{
> + Â Â Â return sc->ps_enabled &&
> + Â Â Â Â Â Â Â(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP);
> +}
> +
> Âstatic struct ieee80211_hw * ath_get_virt_hw(struct ath_softc *sc,
> Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â struct ieee80211_hdr *hdr)
> Â{
> @@ -616,8 +622,8 @@ static void ath_rx_ps(struct ath_softc *sc, struct sk_buff *skb)
> Â Â Â Âhdr = (struct ieee80211_hdr *)skb->data;
>
> Â Â Â Â/* Process Beacon and CAB receive in PS state */
> - Â Â Â if ((sc->ps_flags & PS_WAIT_FOR_BEACON) &&
> - Â Â Â Â Â ieee80211_is_beacon(hdr->frame_control))
> + Â Â Â if (((sc->ps_flags & PS_WAIT_FOR_BEACON) || ath9k_check_auto_sleep(sc))
> + Â Â Â Â Â && ieee80211_is_beacon(hdr->frame_control))
> Â Â Â Â Â Â Â Âath_rx_ps_beacon(sc, skb);
> Â Â Â Âelse if ((sc->ps_flags & PS_WAIT_FOR_CAB) &&
> Â Â Â Â Â Â Â Â (ieee80211_is_data(hdr->frame_control) ||
> @@ -932,9 +938,10 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp)
> Â Â Â Â Â Â Â Â Â Â Â Âsc->rx.rxotherant = 0;
> Â Â Â Â Â Â Â Â}
>
> - Â Â Â Â Â Â Â if (unlikely(sc->ps_flags & (PS_WAIT_FOR_BEACON |
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â ÂPS_WAIT_FOR_CAB |
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â ÂPS_WAIT_FOR_PSPOLL_DATA)))
> + Â Â Â Â Â Â Â if (unlikely(ath9k_check_auto_sleep(sc) ||
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â(sc->ps_flags & (PS_WAIT_FOR_BEACON |
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â PS_WAIT_FOR_CAB |
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â PS_WAIT_FOR_PSPOLL_DATA))))
> Â Â Â Â Â Â Â Â Â Â Â Âath_rx_ps(sc, skb);
>
> Â Â Â Â Â Â Â Âath_rx_send_to_mac80211(hw, sc, skb, rxs);
> diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-ict.c b/drivers/net/wireless/iwlwifi/iwl-agn-ict.c
> index a273e37..c92b2c0 100644
> --- a/drivers/net/wireless/iwlwifi/iwl-agn-ict.c
> +++ b/drivers/net/wireless/iwlwifi/iwl-agn-ict.c
> @@ -30,6 +30,7 @@
> Â#include <linux/module.h>
> Â#include <linux/etherdevice.h>
> Â#include <linux/sched.h>
> +#include <linux/gfp.h>
> Â#include <net/mac80211.h>
>
> Â#include "iwl-dev.h"
> diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c
> index 107e173..5d3f51f 100644
> --- a/drivers/net/wireless/iwlwifi/iwl-scan.c
> +++ b/drivers/net/wireless/iwlwifi/iwl-scan.c
> @@ -376,6 +376,11 @@ void iwl_bg_start_internal_scan(struct work_struct *work)
>
> Â Â Â Âmutex_lock(&priv->mutex);
>
> + Â Â Â if (priv->is_internal_short_scan == true) {
> + Â Â Â Â Â Â Â IWL_DEBUG_SCAN(priv, "Internal scan already in progress\n");
> + Â Â Â Â Â Â Â goto unlock;
> + Â Â Â }
> +
> Â Â Â Âif (!iwl_is_ready_rf(priv)) {
> Â Â Â Â Â Â Â ÂIWL_DEBUG_SCAN(priv, "not ready or exit pending\n");
> Â Â Â Â Â Â Â Âgoto unlock;
> @@ -497,17 +502,27 @@ void iwl_bg_scan_completed(struct work_struct *work)
> Â{
> Â Â Â Âstruct iwl_priv *priv =
> Â Â Â Â Â Âcontainer_of(work, struct iwl_priv, scan_completed);
> + Â Â Â bool internal = false;
>
> Â Â Â ÂIWL_DEBUG_SCAN(priv, "SCAN complete scan\n");
>
> Â Â Â Âcancel_delayed_work(&priv->scan_check);
>
> - Â Â Â if (!priv->is_internal_short_scan)
> - Â Â Â Â Â Â Â ieee80211_scan_completed(priv->hw, false);
> - Â Â Â else {
> + Â Â Â mutex_lock(&priv->mutex);
> + Â Â Â if (priv->is_internal_short_scan) {
> Â Â Â Â Â Â Â Âpriv->is_internal_short_scan = false;
> Â Â Â Â Â Â Â ÂIWL_DEBUG_SCAN(priv, "internal short scan completed\n");
> + Â Â Â Â Â Â Â internal = true;
> Â Â Â Â}
> + Â Â Â mutex_unlock(&priv->mutex);
> +
> + Â Â Â /*
> + Â Â Â Â* Do not hold mutex here since this will cause mac80211 to call
> + Â Â Â Â* into driver again into functions that will attempt to take
> + Â Â Â Â* mutex.
> + Â Â Â Â*/
> + Â Â Â if (!internal)
> + Â Â Â Â Â Â Â ieee80211_scan_completed(priv->hw, false);
>
> Â Â Â Âif (test_bit(STATUS_EXIT_PENDING, &priv->status))
> Â Â Â Â Â Â Â Âreturn;
> diff --git a/drivers/net/wireless/iwlwifi/iwl-sta.c b/drivers/net/wireless/iwlwifi/iwl-sta.c
> index 85ed235..83a2636 100644
> --- a/drivers/net/wireless/iwlwifi/iwl-sta.c
> +++ b/drivers/net/wireless/iwlwifi/iwl-sta.c
> @@ -431,7 +431,7 @@ int iwl_add_bssid_station(struct iwl_priv *priv, const u8 *addr, bool init_rs,
> Â Â Â Âstruct iwl_link_quality_cmd *link_cmd;
> Â Â Â Âunsigned long flags;
>
> - Â Â Â if (*sta_id_r)
> + Â Â Â if (sta_id_r)
> Â Â Â Â Â Â Â Â*sta_id_r = IWL_INVALID_STATION;
>
> Â Â Â Âret = iwl_add_station_common(priv, addr, 0, NULL, &sta_id);
> diff --git a/drivers/net/wireless/rndis_wlan.c b/drivers/net/wireless/rndis_wlan.c
> index 2d28908..4bd61ee 100644
> --- a/drivers/net/wireless/rndis_wlan.c
> +++ b/drivers/net/wireless/rndis_wlan.c
> @@ -2572,14 +2572,18 @@ static void rndis_wlan_do_link_up_work(struct usbnet *usbdev)
>
> Âstatic void rndis_wlan_do_link_down_work(struct usbnet *usbdev)
> Â{
> - Â Â Â union iwreq_data evt;
> + Â Â Â struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev);
>
> - Â Â Â netif_carrier_off(usbdev->net);
> + Â Â Â if (priv->connected) {
> + Â Â Â Â Â Â Â priv->connected = false;
> + Â Â Â Â Â Â Â memset(priv->bssid, 0, ETH_ALEN);
> +
> + Â Â Â Â Â Â Â deauthenticate(usbdev);
>
> - Â Â Â evt.data.flags = 0;
> - Â Â Â evt.data.length = 0;
> - Â Â Â memset(evt.ap_addr.sa_data, 0, ETH_ALEN);
> - Â Â Â wireless_send_event(usbdev->net, SIOCGIWAP, &evt, NULL);
> + Â Â Â Â Â Â Â cfg80211_disconnected(usbdev->net, 0, NULL, 0, GFP_KERNEL);
> + Â Â Â }
> +
> + Â Â Â netif_carrier_off(usbdev->net);
> Â}
>
> Âstatic void rndis_wlan_worker(struct work_struct *work)
> diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c
> index 4ba7b03..ad2c98a 100644
> --- a/drivers/net/wireless/rt2x00/rt2400pci.c
> +++ b/drivers/net/wireless/rt2x00/rt2400pci.c
> @@ -926,7 +926,7 @@ static void rt2400pci_disable_radio(struct rt2x00_dev *rt2x00dev)
> Âstatic int rt2400pci_set_state(struct rt2x00_dev *rt2x00dev,
> Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â enum dev_state state)
> Â{
> - Â Â Â u32 reg;
> + Â Â Â u32 reg, reg2;
> Â Â Â Âunsigned int i;
> Â Â Â Âchar put_to_sleep;
> Â Â Â Âchar bbp_state;
> @@ -947,11 +947,12 @@ static int rt2400pci_set_state(struct rt2x00_dev *rt2x00dev,
> Â Â Â Â * device has entered the correct state.
> Â Â Â Â */
> Â Â Â Âfor (i = 0; i < REGISTER_BUSY_COUNT; i++) {
> - Â Â Â Â Â Â Â rt2x00pci_register_read(rt2x00dev, PWRCSR1, &reg);
> - Â Â Â Â Â Â Â bbp_state = rt2x00_get_field32(reg, PWRCSR1_BBP_CURR_STATE);
> - Â Â Â Â Â Â Â rf_state = rt2x00_get_field32(reg, PWRCSR1_RF_CURR_STATE);
> + Â Â Â Â Â Â Â rt2x00pci_register_read(rt2x00dev, PWRCSR1, &reg2);
> + Â Â Â Â Â Â Â bbp_state = rt2x00_get_field32(reg2, PWRCSR1_BBP_CURR_STATE);
> + Â Â Â Â Â Â Â rf_state = rt2x00_get_field32(reg2, PWRCSR1_RF_CURR_STATE);
> Â Â Â Â Â Â Â Âif (bbp_state == state && rf_state == state)
> Â Â Â Â Â Â Â Â Â Â Â Âreturn 0;
> + Â Â Â Â Â Â Â rt2x00pci_register_write(rt2x00dev, PWRCSR1, reg);
> Â Â Â Â Â Â Â Âmsleep(10);
> Â Â Â Â}
>
> diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c
> index 89d132d..41da3d2 100644
> --- a/drivers/net/wireless/rt2x00/rt2500pci.c
> +++ b/drivers/net/wireless/rt2x00/rt2500pci.c
> @@ -1084,7 +1084,7 @@ static void rt2500pci_disable_radio(struct rt2x00_dev *rt2x00dev)
> Âstatic int rt2500pci_set_state(struct rt2x00_dev *rt2x00dev,
> Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â enum dev_state state)
> Â{
> - Â Â Â u32 reg;
> + Â Â Â u32 reg, reg2;
> Â Â Â Âunsigned int i;
> Â Â Â Âchar put_to_sleep;
> Â Â Â Âchar bbp_state;
> @@ -1105,11 +1105,12 @@ static int rt2500pci_set_state(struct rt2x00_dev *rt2x00dev,
> Â Â Â Â * device has entered the correct state.
> Â Â Â Â */
> Â Â Â Âfor (i = 0; i < REGISTER_BUSY_COUNT; i++) {
> - Â Â Â Â Â Â Â rt2x00pci_register_read(rt2x00dev, PWRCSR1, &reg);
> - Â Â Â Â Â Â Â bbp_state = rt2x00_get_field32(reg, PWRCSR1_BBP_CURR_STATE);
> - Â Â Â Â Â Â Â rf_state = rt2x00_get_field32(reg, PWRCSR1_RF_CURR_STATE);
> + Â Â Â Â Â Â Â rt2x00pci_register_read(rt2x00dev, PWRCSR1, &reg2);
> + Â Â Â Â Â Â Â bbp_state = rt2x00_get_field32(reg2, PWRCSR1_BBP_CURR_STATE);
> + Â Â Â Â Â Â Â rf_state = rt2x00_get_field32(reg2, PWRCSR1_RF_CURR_STATE);
> Â Â Â Â Â Â Â Âif (bbp_state == state && rf_state == state)
> Â Â Â Â Â Â Â Â Â Â Â Âreturn 0;
> + Â Â Â Â Â Â Â rt2x00pci_register_write(rt2x00dev, PWRCSR1, reg);
> Â Â Â Â Â Â Â Âmsleep(10);
> Â Â Â Â}
>
> diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c
> index 0f8b84b..6991613 100644
> --- a/drivers/net/wireless/rt2x00/rt2800usb.c
> +++ b/drivers/net/wireless/rt2x00/rt2800usb.c
> @@ -413,7 +413,7 @@ static void rt2800usb_write_tx_desc(struct rt2x00_dev *rt2x00dev,
> Â Â Â Â */
> Â Â Â Ârt2x00_desc_read(txi, 0, &word);
> Â Â Â Ârt2x00_set_field32(&word, TXINFO_W0_USB_DMA_TX_PKT_LEN,
> - Â Â Â Â Â Â Â Â Â Â Â Â Âskb->len + TXWI_DESC_SIZE);
> + Â Â Â Â Â Â Â Â Â Â Â Â Âskb->len - TXINFO_DESC_SIZE);
> Â Â Â Ârt2x00_set_field32(&word, TXINFO_W0_WIV,
> Â Â Â Â Â Â Â Â Â Â Â Â Â !test_bit(ENTRY_TXD_ENCRYPT_IV, &txdesc->flags));
> Â Â Â Ârt2x00_set_field32(&word, TXINFO_W0_QSEL, 2);
> diff --git a/drivers/net/wireless/rt2x00/rt2x00pci.c b/drivers/net/wireless/rt2x00/rt2x00pci.c
> index a016f7c..f71eee6 100644
> --- a/drivers/net/wireless/rt2x00/rt2x00pci.c
> +++ b/drivers/net/wireless/rt2x00/rt2x00pci.c
> @@ -206,7 +206,7 @@ void rt2x00pci_uninitialize(struct rt2x00_dev *rt2x00dev)
> Â Â Â Â/*
> Â Â Â Â * Free irq line.
> Â Â Â Â */
> - Â Â Â free_irq(to_pci_dev(rt2x00dev->dev)->irq, rt2x00dev);
> + Â Â Â free_irq(rt2x00dev->irq, rt2x00dev);
>
> Â Â Â Â/*
> Â Â Â Â * Free DMA
> diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c
> index 2e3076f..6a74baf 100644
> --- a/drivers/net/wireless/rt2x00/rt61pci.c
> +++ b/drivers/net/wireless/rt2x00/rt61pci.c
> @@ -1689,7 +1689,7 @@ static void rt61pci_disable_radio(struct rt2x00_dev *rt2x00dev)
>
> Âstatic int rt61pci_set_state(struct rt2x00_dev *rt2x00dev, enum dev_state state)
> Â{
> - Â Â Â u32 reg;
> + Â Â Â u32 reg, reg2;
> Â Â Â Âunsigned int i;
> Â Â Â Âchar put_to_sleep;
>
> @@ -1706,10 +1706,11 @@ static int rt61pci_set_state(struct rt2x00_dev *rt2x00dev, enum dev_state state)
> Â Â Â Â * device has entered the correct state.
> Â Â Â Â */
> Â Â Â Âfor (i = 0; i < REGISTER_BUSY_COUNT; i++) {
> - Â Â Â Â Â Â Â rt2x00pci_register_read(rt2x00dev, MAC_CSR12, &reg);
> - Â Â Â Â Â Â Â state = rt2x00_get_field32(reg, MAC_CSR12_BBP_CURRENT_STATE);
> + Â Â Â Â Â Â Â rt2x00pci_register_read(rt2x00dev, MAC_CSR12, &reg2);
> + Â Â Â Â Â Â Â state = rt2x00_get_field32(reg2, MAC_CSR12_BBP_CURRENT_STATE);
> Â Â Â Â Â Â Â Âif (state == !put_to_sleep)
> Â Â Â Â Â Â Â Â Â Â Â Âreturn 0;
> + Â Â Â Â Â Â Â rt2x00pci_register_write(rt2x00dev, MAC_CSR12, reg);
> Â Â Â Â Â Â Â Âmsleep(10);
> Â Â Â Â}
>
> diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c
> index e35bd19..6e0d82e 100644
> --- a/drivers/net/wireless/rt2x00/rt73usb.c
> +++ b/drivers/net/wireless/rt2x00/rt73usb.c
> @@ -1366,7 +1366,7 @@ static void rt73usb_disable_radio(struct rt2x00_dev *rt2x00dev)
>
> Âstatic int rt73usb_set_state(struct rt2x00_dev *rt2x00dev, enum dev_state state)
> Â{
> - Â Â Â u32 reg;
> + Â Â Â u32 reg, reg2;
> Â Â Â Âunsigned int i;
> Â Â Â Âchar put_to_sleep;
>
> @@ -1383,10 +1383,11 @@ static int rt73usb_set_state(struct rt2x00_dev *rt2x00dev, enum dev_state state)
> Â Â Â Â * device has entered the correct state.
> Â Â Â Â */
> Â Â Â Âfor (i = 0; i < REGISTER_BUSY_COUNT; i++) {
> - Â Â Â Â Â Â Â rt2x00usb_register_read(rt2x00dev, MAC_CSR12, &reg);
> - Â Â Â Â Â Â Â state = rt2x00_get_field32(reg, MAC_CSR12_BBP_CURRENT_STATE);
> + Â Â Â Â Â Â Â rt2x00usb_register_read(rt2x00dev, MAC_CSR12, &reg2);
> + Â Â Â Â Â Â Â state = rt2x00_get_field32(reg2, MAC_CSR12_BBP_CURRENT_STATE);
> Â Â Â Â Â Â Â Âif (state == !put_to_sleep)
> Â Â Â Â Â Â Â Â Â Â Â Âreturn 0;
> + Â Â Â Â Â Â Â rt2x00usb_register_write(rt2x00dev, MAC_CSR12, reg);
> Â Â Â Â Â Â Â Âmsleep(10);
> Â Â Â Â}
>
> diff --git a/drivers/net/wireless/wl12xx/wl1271_rx.c b/drivers/net/wireless/wl12xx/wl1271_rx.c
> index 57f4bfd..b98fb64 100644
> --- a/drivers/net/wireless/wl12xx/wl1271_rx.c
> +++ b/drivers/net/wireless/wl12xx/wl1271_rx.c
> @@ -113,6 +113,8 @@ static void wl1271_rx_handle_data(struct wl1271 *wl, u32 length)
> Â Â Â Âwl1271_debug(DEBUG_RX, "rx skb 0x%p: %d B %s", skb, skb->len,
> Â Â Â Â Â Â Â Â Â Â beacon ? "beacon" : "");
>
> + Â Â Â skb_trim(skb, skb->len - desc->pad_len);
> +
> Â Â Â Âmemcpy(IEEE80211_SKB_RXCB(skb), &rx_status, sizeof(rx_status));
> Â Â Â Âieee80211_rx_ni(wl->hw, skb);
> Â}
> diff --git a/include/net/mac80211.h b/include/net/mac80211.h
> index 5be900d..de22cbf 100644
> --- a/include/net/mac80211.h
> +++ b/include/net/mac80211.h
> @@ -815,6 +815,7 @@ enum ieee80211_key_flags {
> Â* Â Â encrypted in hardware.
> Â* @alg: The key algorithm.
> Â* @flags: key flags, see &enum ieee80211_key_flags.
> + * @ap_addr: AP's MAC address
> Â* @keyidx: the key index (0-3)
> Â* @keylen: key material length
> Â* @key: key material. For ALG_TKIP the key is encoded as a 256-bit (32 byte)
> @@ -831,7 +832,6 @@ struct ieee80211_key_conf {
> Â Â Â Âu8 iv_len;
> Â Â Â Âu8 hw_key_idx;
> Â Â Â Âu8 flags;
> - Â Â Â u8 *ap_addr;
> Â Â Â Âs8 keyidx;
> Â Â Â Âu8 keylen;
> Â Â Â Âu8 key[0];
> @@ -1638,6 +1638,8 @@ enum ieee80211_ampdu_mlme_action {
> Â* Â Â Returns a negative error code on failure.
> Â* Â Â The callback must be atomic.
> Â*
> + * @get_survey: Return per-channel survey information
> + *
> Â* @rfkill_poll: Poll rfkill hardware state. If you need this, you also
> Â* Â Â need to set wiphy->rfkill_poll to %true before registration,
> Â* Â Â and need to call wiphy_rfkill_set_hw_state() in the callback.
> diff --git a/net/mac80211/key.c b/net/mac80211/key.c
> index 8d4b417..e8f6e3b 100644
> --- a/net/mac80211/key.c
> +++ b/net/mac80211/key.c
> @@ -140,7 +140,6 @@ static void ieee80211_key_enable_hw_accel(struct ieee80211_key *key)
> Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â struct ieee80211_sub_if_data,
> Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â u.ap);
>
> - Â Â Â key->conf.ap_addr = sdata->dev->dev_addr;
> Â Â Â Âret = drv_set_key(key->local, SET_KEY, sdata, sta, &key->conf);
>
> Â Â Â Âif (!ret) {
> diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h
> index 48a5e80..df9d455 100644
> --- a/net/mac80211/sta_info.h
> +++ b/net/mac80211/sta_info.h
> @@ -145,7 +145,7 @@ enum plink_state {
> Â/**
> Â* struct sta_ampdu_mlme - STA aggregation information.
> Â*
> - * @tid_state_rx: TID's state in Rx session state machine.
> + * @tid_active_rx: TID's state in Rx session state machine.
> Â* @tid_rx: aggregation info for Rx per TID
> Â* @tid_state_tx: TID's state in Tx session state machine.
> Â* @tid_tx: aggregation info for Tx per TID
> diff --git a/net/wireless/chan.c b/net/wireless/chan.c
> index d92d088..b01a6f6 100644
> --- a/net/wireless/chan.c
> +++ b/net/wireless/chan.c
> @@ -50,7 +50,7 @@ int cfg80211_set_freq(struct cfg80211_registered_device *rdev,
> Â Â Â Âstruct ieee80211_channel *chan;
> Â Â Â Âint result;
>
> - Â Â Â if (wdev->iftype == NL80211_IFTYPE_MONITOR)
> + Â Â Â if (wdev && wdev->iftype == NL80211_IFTYPE_MONITOR)
> Â Â Â Â Â Â Â Âwdev = NULL;
>
> Â Â Â Âif (wdev) {
> diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
> index aaa1aad..db71150 100644
> --- a/net/wireless/nl80211.c
> +++ b/net/wireless/nl80211.c
> @@ -4443,9 +4443,10 @@ static int nl80211_remain_on_channel(struct sk_buff *skb,
> Â Â Â Â Â Â Â Âif (channel_type != NL80211_CHAN_NO_HT &&
> Â Â Â Â Â Â Â Â Â Âchannel_type != NL80211_CHAN_HT20 &&
> Â Â Â Â Â Â Â Â Â Âchannel_type != NL80211_CHAN_HT40PLUS &&
> - Â Â Â Â Â Â Â Â Â channel_type != NL80211_CHAN_HT40MINUS)
> + Â Â Â Â Â Â Â Â Â channel_type != NL80211_CHAN_HT40MINUS) {
> Â Â Â Â Â Â Â Â Â Â Â Âerr = -EINVAL;
> Â Â Â Â Â Â Â Â Â Â Â Âgoto out;
> + Â Â Â Â Â Â Â }
> Â Â Â Â}
>
> Â Â Â Âfreq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]);
> @@ -4717,9 +4718,10 @@ static int nl80211_action(struct sk_buff *skb, struct genl_info *info)
> Â Â Â Â Â Â Â Âif (channel_type != NL80211_CHAN_NO_HT &&
> Â Â Â Â Â Â Â Â Â Âchannel_type != NL80211_CHAN_HT20 &&
> Â Â Â Â Â Â Â Â Â Âchannel_type != NL80211_CHAN_HT40PLUS &&
> - Â Â Â Â Â Â Â Â Â channel_type != NL80211_CHAN_HT40MINUS)
> + Â Â Â Â Â Â Â Â Â channel_type != NL80211_CHAN_HT40MINUS) {
> Â Â Â Â Â Â Â Â Â Â Â Âerr = -EINVAL;
> Â Â Â Â Â Â Â Â Â Â Â Âgoto out;
> + Â Â Â Â Â Â Â }
> Â Â Â Â}
>
> Â Â Â Âfreq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]);
> diff --git a/net/wireless/scan.c b/net/wireless/scan.c
> index a026c6d..58401d2 100644
> --- a/net/wireless/scan.c
> +++ b/net/wireless/scan.c
> @@ -515,7 +515,7 @@ cfg80211_inform_bss(struct wiphy *wiphy,
>
> Â Â Â Âprivsz = wiphy->bss_priv_size;
>
> - Â Â Â if (WARN_ON(wiphy->signal_type == NL80211_BSS_SIGNAL_UNSPEC &&
> + Â Â Â if (WARN_ON(wiphy->signal_type == CFG80211_SIGNAL_TYPE_UNSPEC &&
> Â Â Â Â Â Â Â Â Â Â Â Â(signal < 0 || signal > 100)))
> Â Â Â Â Â Â Â Âreturn NULL;
>
> @@ -571,7 +571,7 @@ cfg80211_inform_bss_frame(struct wiphy *wiphy,
> Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Âu.probe_resp.variable);
> Â Â Â Âsize_t privsz = wiphy->bss_priv_size;
>
> - Â Â Â if (WARN_ON(wiphy->signal_type == NL80211_BSS_SIGNAL_UNSPEC &&
> + Â Â Â if (WARN_ON(wiphy->signal_type == CFG80211_SIGNAL_TYPE_UNSPEC &&
> Â Â Â Â Â Â Â Â Â Â(signal < 0 || signal > 100)))
> Â Â Â Â Â Â Â Âreturn NULL;
>
> --
> John W. Linville        ÂSomeday the world will need a hero, and you
> linville@xxxxxxxxxxxxx         Âmight be all we have. ÂBe ready.
> --
> 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
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/