]> git.karo-electronics.de Git - linux-beck.git/commitdiff
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wirel...
authorJohn W. Linville <linville@tuxdriver.com>
Mon, 29 Aug 2011 18:52:20 +0000 (14:52 -0400)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 29 Aug 2011 18:52:20 +0000 (14:52 -0400)
1  2 
MAINTAINERS
drivers/net/wireless/ath/ath9k/ar9003_phy.h
drivers/net/wireless/b43/dma.c
drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
net/mac80211/cfg.c
net/mac80211/mesh_pathtbl.c
net/mac80211/sta_info.c

diff --combined MAINTAINERS
index 194095ac07ec3e6f78cfc8f94261e88f675a99c7,c66c093978d7fbf25bee751cfb39f9110dbb002a..579713ef7cfb4e750944c584a599fc3874bf0b42
@@@ -117,20 -117,20 +117,20 @@@ Maintainers List (try to look for most 
  M:    Philip Blundell <philb@gnu.org>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    drivers/net/3c505*
 +F:    drivers/net/ethernet/i825xx/3c505*
  
  3C59X NETWORK DRIVER
  M:    Steffen Klassert <klassert@mathematik.tu-chemnitz.de>
  L:    netdev@vger.kernel.org
  S:    Maintained
  F:    Documentation/networking/vortex.txt
 -F:    drivers/net/3c59x.c
 +F:    drivers/net/ethernet/3com/3c59x.c
  
  3CR990 NETWORK DRIVER
  M:    David Dillow <dave@thedillows.org>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    drivers/net/typhoon*
 +F:    drivers/net/ethernet/3com/typhoon*
  
  3WARE SAS/SATA-RAID SCSI DRIVERS (3W-XXXX, 3W-9XXX, 3W-SAS)
  M:    Adam Radford <linuxraid@lsi.com>
@@@ -156,7 -156,7 +156,7 @@@ M: Realtek linux nic maintainers <nic_s
  M:    Francois Romieu <romieu@fr.zoreil.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    drivers/net/r8169.c
 +F:    drivers/net/ethernet/realtek/r8169.c
  
  8250/16?50 (AND CLONE UARTS) SERIAL DRIVER
  M:    Greg Kroah-Hartman <gregkh@suse.de>
@@@ -170,7 -170,8 +170,7 @@@ F: include/linux/serial_8250.
  8390 NETWORK DRIVERS [WD80x3/SMC-ELITE, SMC-ULTRA, NE2000, 3C503, etc.]
  L:    netdev@vger.kernel.org
  S:    Orphan / Obsolete
 -F:    drivers/net/*8390*
 -F:    drivers/net/ax88796.c
 +F:    drivers/net/ethernet/8390/
  
  9P FILE SYSTEM
  M:    Eric Van Hensbergen <ericvh@gmail.com>
@@@ -213,7 -214,7 +213,7 @@@ ACENIC DRIVE
  M:    Jes Sorensen <jes@trained-monkey.org>
  L:    linux-acenic@sunsite.dk
  S:    Maintained
 -F:    drivers/net/acenic*
 +F:    drivers/net/ethernet/alteon/acenic*
  
  ACER ASPIRE ONE TEMPERATURE AND FAN DRIVER
  M:    Peter Feuerer <peter@piie.net>
@@@ -745,7 -746,7 +745,7 @@@ L: linux-arm-kernel@lists.infradead.or
  W:    http://www.arm.linux.org.uk/
  S:    Maintained
  F:    arch/arm/mach-ebsa110/
 -F:    drivers/net/arm/am79c961a.*
 +F:    drivers/net/ethernet/amd/am79c961a.*
  
  ARM/EZX SMARTPHONES (A780, A910, A1200, E680, ROKR E2 and ROKR E6)
  M:    Daniel Ribeiro <drwyrm@gmail.com>
@@@ -1014,8 -1015,7 +1014,8 @@@ F:      arch/arm/include/asm/hardware/ioc.
  F:    arch/arm/include/asm/hardware/iomd.h
  F:    arch/arm/include/asm/hardware/memc.h
  F:    arch/arm/mach-rpc/
 -F:    drivers/net/arm/ether*
 +F:    drivers/net/ethernet/i825xx/ether1*
 +F:    drivers/net/ethernet/seeq/ether3*
  F:    drivers/scsi/arm/
  
  ARM/SHARK MACHINE SUPPORT
@@@ -1127,7 -1127,7 +1127,7 @@@ F:      arch/arm/mach-nuc93x
  F:    drivers/input/keyboard/w90p910_keypad.c
  F:    drivers/input/touchscreen/w90p910_ts.c
  F:    drivers/watchdog/nuc900_wdt.c
 -F:    drivers/net/arm/w90p910_ether.c
 +F:    drivers/net/ethernet/nuvoton/w90p910_ether.c
  F:    drivers/mtd/nand/nuc900_nand.c
  F:    drivers/rtc/rtc-nuc900.c
  F:    drivers/spi/spi_nuc900.c
@@@ -1230,7 -1230,7 +1230,7 @@@ F:      Documentation/aoe
  F:    drivers/block/aoe/
  
  ATHEROS ATH GENERIC UTILITIES
- M:    "Luis R. Rodriguez" <lrodriguez@atheros.com>
+ M:    "Luis R. Rodriguez" <mcgrof@qca.qualcomm.com>
  L:    linux-wireless@vger.kernel.org
  S:    Supported
  F:    drivers/net/wireless/ath/*
  ATHEROS ATH5K WIRELESS DRIVER
  M:    Jiri Slaby <jirislaby@gmail.com>
  M:    Nick Kossifidis <mickflemm@gmail.com>
- M:    "Luis R. Rodriguez" <lrodriguez@atheros.com>
+ M:    "Luis R. Rodriguez" <mcgrof@qca.qualcomm.com>
  M:    Bob Copeland <me@bobcopeland.com>
  L:    linux-wireless@vger.kernel.org
  L:    ath5k-devel@lists.ath5k.org
@@@ -1247,10 -1247,10 +1247,10 @@@ S:   Maintaine
  F:    drivers/net/wireless/ath/ath5k/
  
  ATHEROS ATH9K WIRELESS DRIVER
- M:    "Luis R. Rodriguez" <lrodriguez@atheros.com>
- M:    Jouni Malinen <jmalinen@atheros.com>
- M:    Vasanthakumar Thiagarajan <vasanth@atheros.com>
- M:    Senthil Balasubramanian <senthilkumar@atheros.com>
+ M:    "Luis R. Rodriguez" <mcgrof@qca.qualcomm.com>
+ M:    Jouni Malinen <jouni@qca.qualcomm.com>
+ M:    Vasanthakumar Thiagarajan <vthiagar@qca.qualcomm.com>
+ M:    Senthil Balasubramanian <senthilb@qca.qualcomm.com>
  L:    linux-wireless@vger.kernel.org
  L:    ath9k-devel@lists.ath9k.org
  W:    http://wireless.kernel.org/en/users/Drivers/ath9k
@@@ -1278,12 -1278,12 +1278,12 @@@ F:   drivers/input/misc/ati_remote2.
  ATLX ETHERNET DRIVERS
  M:    Jay Cliburn <jcliburn@gmail.com>
  M:    Chris Snook <chris.snook@gmail.com>
- M:    Jie Yang <jie.yang@atheros.com>
+ M:    Jie Yang <yangjie@qca.qualcomm.com>
  L:    netdev@vger.kernel.org
  W:    http://sourceforge.net/projects/atl1
  W:    http://atl1.sourceforge.net
  S:    Maintained
 -F:    drivers/net/atlx/
 +F:    drivers/net/ethernet/atheros/
  
  ATM
  M:    Chas Williams <chas@cmf.nrl.navy.mil>
@@@ -1323,7 -1323,7 +1323,7 @@@ F:      include/video/atmel_lcdc.
  ATMEL MACB ETHERNET DRIVER
  M:    Nicolas Ferre <nicolas.ferre@atmel.com>
  S:    Supported
 -F:    drivers/net/macb.*
 +F:    drivers/net/ethernet/cadence/
  
  ATMEL SPI DRIVER
  M:    Nicolas Ferre <nicolas.ferre@atmel.com>
@@@ -1446,7 -1446,7 +1446,7 @@@ BLACKFIN EMAC DRIVE
  L:    uclinux-dist-devel@blackfin.uclinux.org
  W:    http://blackfin.uclinux.org
  S:    Supported
 -F:    drivers/net/bfin_mac.*
 +F:    drivers/net/ethernet/adi/
  
  BLACKFIN RTC DRIVER
  M:    Mike Frysinger <vapier.adi@gmail.com>
@@@ -1527,27 -1527,27 +1527,27 @@@ BROADCOM B44 10/100 ETHERNET DRIVE
  M:    Gary Zambrano <zambrano@broadcom.com>
  L:    netdev@vger.kernel.org
  S:    Supported
 -F:    drivers/net/b44.*
 +F:    drivers/net/ethernet/broadcom/b44.*
  
  BROADCOM BNX2 GIGABIT ETHERNET DRIVER
  M:    Michael Chan <mchan@broadcom.com>
  L:    netdev@vger.kernel.org
  S:    Supported
 -F:    drivers/net/bnx2.*
 -F:    drivers/net/bnx2_*
 +F:    drivers/net/ethernet/broadcom/bnx2.*
 +F:    drivers/net/ethernet/broadcom/bnx2_*
  
  BROADCOM BNX2X 10 GIGABIT ETHERNET DRIVER
  M:    Eilon Greenstein <eilong@broadcom.com>
  L:    netdev@vger.kernel.org
  S:    Supported
 -F:    drivers/net/bnx2x/
 +F:    drivers/net/ethernet/broadcom/bnx2x/
  
  BROADCOM TG3 GIGABIT ETHERNET DRIVER
  M:    Matt Carlson <mcarlson@broadcom.com>
  M:    Michael Chan <mchan@broadcom.com>
  L:    netdev@vger.kernel.org
  S:    Supported
 -F:    drivers/net/tg3.*
 +F:    drivers/net/ethernet/broadcom/tg3.*
  
  BROADCOM BRCM80211 IEEE802.11n WIRELESS DRIVER
  M:    Brett Rudley <brudley@broadcom.com>
@@@ -1577,7 -1577,7 +1577,7 @@@ M:      Rasesh Mody <rmody@brocade.com
  M:    Debashis Dutt <ddutt@brocade.com>
  L:    netdev@vger.kernel.org
  S:    Supported
 -F:    drivers/net/bna/
 +F:    drivers/net/ethernet/brocade/bna/
  
  BSG (block layer generic sg v4 driver)
  M:    FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
@@@ -1762,13 -1762,13 +1762,13 @@@ M:   Vasanthy Kolluri <vkolluri@cisco.com
  M:    Roopa Prabhu <roprabhu@cisco.com>
  M:    David Wang <dwang2@cisco.com>
  S:    Supported
 -F:    drivers/net/enic/
 +F:    drivers/net/ethernet/cisco/enic/
  
  CIRRUS LOGIC EP93XX ETHERNET DRIVER
  M:    Hartley Sweeten <hsweeten@visionengravers.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    drivers/net/arm/ep93xx_eth.c
 +F:    drivers/net/ethernet/cirrus/ep93xx_eth.c
  
  CIRRUS LOGIC EP93XX OHCI USB HOST DRIVER
  M:    Lennert Buytenhek <kernel@wantstofly.org>
@@@ -1908,7 -1908,7 +1908,7 @@@ CPMAC ETHERNET DRIVE
  M:    Florian Fainelli <florian@openwrt.org>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    drivers/net/cpmac.c
 +F:    drivers/net/ethernet/ti/cpmac.c
  
  CPU FREQUENCY DRIVERS
  M:    Dave Jones <davej@redhat.com>
@@@ -1925,12 -1925,6 +1925,12 @@@ S:    Maintaine
  F:    arch/x86/kernel/cpuid.c
  F:    arch/x86/kernel/msr.c
  
 +CPU POWER MONITORING SUBSYSTEM
 +M:    Dominik Brodowski <linux@dominikbrodowski.net>
 +M:    Thomas Renninger <trenn@suse.de>
 +S:    Maintained
 +F:    tools/power/cpupower
 +
  CPUSETS
  M:    Paul Menage <menage@google.com>
  W:    http://www.bullopensource.org/cpuset/
@@@ -1995,7 -1989,7 +1995,7 @@@ M:      Divy Le Ray <divy@chelsio.com
  L:    netdev@vger.kernel.org
  W:    http://www.chelsio.com
  S:    Supported
 -F:    drivers/net/cxgb3/
 +F:    drivers/net/ethernet/chelsio/cxgb3/
  
  CXGB3 IWARP RNIC DRIVER (IW_CXGB3)
  M:    Steve Wise <swise@chelsio.com>
@@@ -2009,7 -2003,7 +2009,7 @@@ M:      Dimitris Michailidis <dm@chelsio.com
  L:    netdev@vger.kernel.org
  W:    http://www.chelsio.com
  S:    Supported
 -F:    drivers/net/cxgb4/
 +F:    drivers/net/ethernet/chelsio/cxgb4/
  
  CXGB4 IWARP RNIC DRIVER (IW_CXGB4)
  M:    Steve Wise <swise@chelsio.com>
@@@ -2023,14 -2017,14 +2023,14 @@@ M:   Casey Leedom <leedom@chelsio.com
  L:    netdev@vger.kernel.org
  W:    http://www.chelsio.com
  S:    Supported
 -F:    drivers/net/cxgb4vf/
 +F:    drivers/net/ethernet/chelsio/cxgb4vf/
  
  STMMAC ETHERNET DRIVER
  M:    Giuseppe Cavallaro <peppe.cavallaro@st.com>
  L:    netdev@vger.kernel.org
  W:    http://www.stlinux.com
  S:    Supported
 -F:    drivers/net/stmmac/
 +F:    drivers/net/ethernet/stmicro/stmmac/
  
  CYBERPRO FB DRIVER
  M:    Russell King <linux@arm.linux.org.uk>
@@@ -2074,7 -2068,7 +2074,7 @@@ DAVICOM FAST ETHERNET (DMFE) NETWORK DR
  L:    netdev@vger.kernel.org
  S:    Orphan
  F:    Documentation/networking/dmfe.txt
 -F:    drivers/net/tulip/dmfe.c
 +F:    drivers/net/ethernet/tulip/dmfe.c
  
  DC390/AM53C974 SCSI driver
  M:    Kurt Garloff <garloff@suse.de>
@@@ -2113,7 -2107,7 +2113,7 @@@ F:      net/decnet
  DEFXX FDDI NETWORK DRIVER
  M:    "Maciej W. Rozycki" <macro@linux-mips.org>
  S:    Maintained
 -F:    drivers/net/defxx.*
 +F:    drivers/net/fddi/defxx.*
  
  DELL LAPTOP DRIVER
  M:    Matthew Garrett <mjg59@srcf.ucam.org>
@@@ -2466,7 -2460,7 +2466,7 @@@ EHEA (IBM pSeries eHEA 10Gb ethernet ad
  M:    Breno Leitao <leitao@linux.vnet.ibm.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    drivers/net/ehea/
 +F:    drivers/net/ethernet/ibm/ehea/
  
  EMBEDDED LINUX
  M:    Paul Gortmaker <paul.gortmaker@windriver.com>
@@@ -2511,7 -2505,7 +2511,7 @@@ ETHEREXPRESS-16 NETWORK DRIVE
  M:    Philip Blundell <philb@gnu.org>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    drivers/net/eexpress.*
 +F:    drivers/net/ethernet/i825xx/eexpress.*
  
  ETHERNET BRIDGE
  M:    Stephen Hemminger <shemminger@linux-foundation.org>
@@@ -2525,7 -2519,7 +2525,7 @@@ F:      net/bridge
  ETHERTEAM 16I DRIVER
  M:    Mika Kuoppala <miku@iki.fi>
  S:    Maintained
 -F:    drivers/net/eth16i.c
 +F:    drivers/net/ethernet/fujitsu/eth16i.c
  
  EXT2 FILE SYSTEM
  M:    Jan Kara <jack@suse.cz>
@@@ -2643,8 -2637,9 +2643,8 @@@ S:      Maintaine
  F:    arch/x86/math-emu/
  
  FRAME RELAY DLCI/FRAD (Sangoma drivers too)
 -M:    Mike McLagan <mike.mclagan@linux.org>
  L:    netdev@vger.kernel.org
 -S:    Maintained
 +S:    Orphan
  F:    drivers/net/wan/dlci.c
  F:    drivers/net/wan/sdla.c
  
@@@ -2689,7 -2684,7 +2689,7 @@@ M:      Vitaly Bordug <vbordug@ru.mvista.com
  L:    linuxppc-dev@lists.ozlabs.org
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    drivers/net/fs_enet/
 +F:    drivers/net/ethernet/freescale/fs_enet/
  F:    include/linux/fs_enet_pd.h
  
  FREESCALE QUICC ENGINE LIBRARY
@@@ -2711,7 -2706,7 +2711,7 @@@ M:      Li Yang <leoli@freescale.com
  L:    netdev@vger.kernel.org
  L:    linuxppc-dev@lists.ozlabs.org
  S:    Maintained
 -F:    drivers/net/ucc_geth*
 +F:    drivers/net/ethernet/freescale/ucc_geth*
  
  FREESCALE QUICC ENGINE UCC UART DRIVER
  M:    Timur Tabi <timur@freescale.com>
@@@ -3049,7 -3044,6 +3049,7 @@@ S:      Maintaine
  F:    include/linux/hippidevice.h
  F:    include/linux/if_hippi.h
  F:    net/802/hippi.c
 +F:    drivers/net/hippi/
  
  HOST AP DRIVER
  M:    Jouni Malinen <j@w1.fi>
@@@ -3067,7 -3061,7 +3067,7 @@@ F:      drivers/platform/x86/tc1100-wmi.
  HP100:        Driver for HP 10/100 Mbit/s Voice Grade Network Adapter Series
  M:    Jaroslav Kysela <perex@perex.cz>
  S:    Maintained
 -F:    drivers/net/hp100.*
 +F:    drivers/net/ethernet/hp/hp100.*
  
  HPET: High Precision Event Timers driver
  M:    Clemens Ladisch <clemens@ladisch.de>
@@@ -3165,7 -3159,7 +3165,7 @@@ IBM Power Virtual Ethernet Device Drive
  M:    Santiago Leon <santil@linux.vnet.ibm.com>
  L:    netdev@vger.kernel.org
  S:    Supported
 -F:    drivers/net/ibmveth.*
 +F:    drivers/net/ethernet/ibm/ibmveth.*
  
  IBM ServeRAID RAID DRIVER
  P:    Jack Hammer
@@@ -3321,7 -3315,7 +3321,7 @@@ F:      arch/arm/mach-ixp4xx/include/mach/qm
  F:    arch/arm/mach-ixp4xx/include/mach/npe.h
  F:    arch/arm/mach-ixp4xx/ixp4xx_qmgr.c
  F:    arch/arm/mach-ixp4xx/ixp4xx_npe.c
 -F:    drivers/net/arm/ixp4xx_eth.c
 +F:    drivers/net/ethernet/xscale/ixp4xx_eth.c
  F:    drivers/net/wan/ixp4xx_hss.c
  
  INTEL IXP4XX RANDOM NUMBER GENERATOR SUPPORT
@@@ -3333,7 -3327,7 +3333,7 @@@ INTEL IXP2000 ETHERNET DRIVE
  M:    Lennert Buytenhek <kernel@wantstofly.org>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    drivers/net/ixp2000/
 +F:    drivers/net/ethernet/xscale/ixp2000/
  
  INTEL ETHERNET DRIVERS (e100/e1000/e1000e/igb/igbvf/ixgb/ixgbe/ixgbevf)
  M:    Jeff Kirsher <jeffrey.t.kirsher@intel.com>
@@@ -3342,13 -3336,13 +3342,13 @@@ M:   Bruce Allan <bruce.w.allan@intel.com
  M:    Carolyn Wyborny <carolyn.wyborny@intel.com>
  M:    Don Skidmore <donald.c.skidmore@intel.com>
  M:    Greg Rose <gregory.v.rose@intel.com>
 -M:    PJ Waskiewicz <peter.p.waskiewicz.jr@intel.com>
 +M:    Peter P Waskiewicz Jr <peter.p.waskiewicz.jr@intel.com>
  M:    Alex Duyck <alexander.h.duyck@intel.com>
  M:    John Ronciak <john.ronciak@intel.com>
  L:    e1000-devel@lists.sourceforge.net
  W:    http://e1000.sourceforge.net/
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-2.6.git
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-next-2.6.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-next.git
  S:    Supported
  F:    Documentation/networking/e100.txt
  F:    Documentation/networking/e1000.txt
@@@ -3358,13 -3352,14 +3358,13 @@@ F:   Documentation/networking/igbvf.tx
  F:    Documentation/networking/ixgb.txt
  F:    Documentation/networking/ixgbe.txt
  F:    Documentation/networking/ixgbevf.txt
 -F:    drivers/net/e100.c
 -F:    drivers/net/e1000/
 -F:    drivers/net/e1000e/
 -F:    drivers/net/igb/
 -F:    drivers/net/igbvf/
 -F:    drivers/net/ixgb/
 -F:    drivers/net/ixgbe/
 -F:    drivers/net/ixgbevf/
 +F:    drivers/net/ethernet/intel/
 +
 +INTEL MRST PMU DRIVER
 +M:    Len Brown <len.brown@intel.com>
 +L:    linux-pm@lists.linux-foundation.org
 +S:    Supported
 +F:    arch/x86/platform/mrst/pmu.*
  
  INTEL PRO/WIRELESS 2100 NETWORK CONNECTION SUPPORT
  L:    linux-wireless@vger.kernel.org
@@@ -3426,7 -3421,7 +3426,7 @@@ IOC3 ETHERNET DRIVE
  M:    Ralf Baechle <ralf@linux-mips.org>
  L:    linux-mips@linux-mips.org
  S:    Maintained
 -F:    drivers/net/ioc3-eth.c
 +F:    drivers/net/ethernet/sgi/ioc3-eth.c
  
  IOC3 SERIAL DRIVER
  M:    Pat Gefre <pfg@sgi.com>
@@@ -3444,7 -3439,7 +3444,7 @@@ M:      Francois Romieu <romieu@fr.zoreil.co
  M:    Sorbica Shieh <sorbica@icplus.com.tw>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    drivers/net/ipg.*
 +F:    drivers/net/ethernet/icplus/ipg.*
  
  IPATH DRIVER
  M:    Mike Marciniszyn <infinipath@qlogic.com>
@@@ -3592,7 -3587,7 +3592,7 @@@ JME NETWORK DRIVE
  M:    Guo-Fu Tseng <cooldavid@cooldavid.org>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    drivers/net/jme.*
 +F:    drivers/net/ethernet/jme.*
  
  JOURNALLING FLASH FILE SYSTEM V2 (JFFS2)
  M:    David Woodhouse <dwmw2@infradead.org>
@@@ -3899,9 -3894,9 +3899,9 @@@ F:      arch/powerpc/platforms/powermac
  F:    drivers/macintosh/
  
  LINUX FOR POWERPC EMBEDDED MPC5XXX
 -M:    Grant Likely <grant.likely@secretlab.ca>
 +M:    Anatolij Gustschin <agust@denx.de>
  L:    linuxppc-dev@lists.ozlabs.org
 -T:    git git://git.secretlab.ca/git/linux-2.6.git
 +T:    git git://git.denx.de/linux-2.6-agust.git
  S:    Maintained
  F:    arch/powerpc/platforms/512x/
  F:    arch/powerpc/platforms/52xx/
@@@ -4123,7 -4118,7 +4123,7 @@@ MARVELL MV643XX ETHERNET DRIVE
  M:    Lennert Buytenhek <buytenh@wantstofly.org>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    drivers/net/mv643xx_eth.*
 +F:    drivers/net/ethernet/marvell/mv643xx_eth.*
  F:    include/linux/mv643xx.h
  
  MARVELL MWIFIEX WIRELESS DRIVER
@@@ -4155,13 -4150,6 +4155,13 @@@ S:    Orpha
  F:    drivers/video/matrox/matroxfb_*
  F:    include/linux/matroxfb.h
  
 +MAX1668 TEMPERATURE SENSOR DRIVER
 +M:    "David George" <david.george@ska.ac.za>
 +L:    lm-sensors@lm-sensors.org
 +S:    Maintained
 +F:    Documentation/hwmon/max1668
 +F:    drivers/hwmon/max1668.c
 +
  MAX6650 HARDWARE MONITOR AND FAN CONTROLLER DRIVER
  M:    "Hans J. Koch" <hjk@hansjkoch.de>
  L:    lm-sensors@lm-sensors.org
@@@ -4337,12 -4325,12 +4337,12 @@@ M:   Andrew Gallatin <gallatin@myri.com
  L:    netdev@vger.kernel.org
  W:    http://www.myri.com/scs/download-Myri10GE.html
  S:    Supported
 -F:    drivers/net/myri10ge/
 +F:    drivers/net/ethernet/myricom/myri10ge/
  
  NATSEMI ETHERNET DRIVER (DP8381x)
  M:    Tim Hockin <thockin@hockin.org>
  S:    Maintained
 -F:    drivers/net/natsemi.c
 +F:    drivers/net/ethernet/natsemi/natsemi.c
  
  NATIVE INSTRUMENTS USB SOUND INTERFACE DRIVER
  M:    Daniel Mack <zonque@gmail.com>
@@@ -4382,8 -4370,9 +4382,8 @@@ W:      http://trac.neterion.com/cgi-bin/tra
  W:    http://trac.neterion.com/cgi-bin/trac.cgi/wiki/X3100Linux?Anonymous
  S:    Supported
  F:    Documentation/networking/s2io.txt
 -F:    drivers/net/s2io*
  F:    Documentation/networking/vxge.txt
 -F:    drivers/net/vxge/
 +F:    drivers/net/ethernet/neterion/
  
  NETFILTER/IPTABLES/IPCHAINS
  P:    Rusty Russell
@@@ -4407,10 -4396,10 +4407,10 @@@ F:   net/*/netfilter
  F:    net/netfilter/
  
  NETLABEL
 -M:    Paul Moore <paul.moore@hp.com>
 +M:    Paul Moore <paul@paul-moore.com>
  W:    http://netlabel.sf.net
  L:    netdev@vger.kernel.org
 -S:    Supported
 +S:    Maintained
  F:    Documentation/netlabel/
  F:    include/net/netlabel.h
  F:    net/netlabel/
@@@ -4455,6 -4444,7 +4455,6 @@@ F:      include/linux/netdevice.
  NETWORKING [IPv4/IPv6]
  M:    "David S. Miller" <davem@davemloft.net>
  M:    Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
 -M:    "Pekka Savola (ipv6)" <pekkas@netcore.fi>
  M:    James Morris <jmorris@namei.org>
  M:    Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>
  M:    Patrick McHardy <kaber@trash.net>
@@@ -4467,7 -4457,7 +4467,7 @@@ F:      include/net/ip
  F:    arch/x86/net/*
  
  NETWORKING [LABELED] (NetLabel, CIPSO, Labeled IPsec, SECMARK)
 -M:    Paul Moore <paul.moore@hp.com>
 +M:    Paul Moore <paul@paul-moore.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
  
@@@ -4496,13 -4486,23 +4496,24 @@@ F:   include/linux/if_
  F:    include/linux/*device.h
  
  NETXEN (1/10) GbE SUPPORT
 -M:    Amit Kumar Salecha <amit.salecha@qlogic.com>
 +M:    Sony Chacko <sony.chacko@qlogic.com>
 +M:    Rajesh Borundia <rajesh.borundia@qlogic.com>
  L:    netdev@vger.kernel.org
  W:    http://www.qlogic.com
  S:    Supported
 -F:    drivers/net/netxen/
 +F:    drivers/net/ethernet/qlogic/netxen/
  
+ NFC SUBSYSTEM
+ M:    Lauro Ramos Venancio <lauro.venancio@openbossa.org>
+ M:    Aloisio Almeida Jr <aloisio.almeida@openbossa.org>
+ M:    Samuel Ortiz <sameo@linux.intel.com>
+ L:    linux-wireless@vger.kernel.org
+ S:    Maintained
+ F:    net/nfc/
+ F:    include/linux/nfc.h
+ F:    include/net/nfc.h
+ F:    drivers/nfc/
  NFS, SUNRPC, AND LOCKD CLIENTS
  M:    Trond Myklebust <Trond.Myklebust@netapp.com>
  L:    linux-nfs@vger.kernel.org
@@@ -4522,7 -4522,7 +4533,7 @@@ M:      Jan-Pascal van Best <janpascal@vanbe
  M:    Andreas Mohr <andi@lisas.de>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    drivers/net/ni5010.*
 +F:    drivers/net/ethernet/racal/ni5010.*
  
  NILFS2 FILESYSTEM
  M:    KONISHI Ryusuke <konishi.ryusuke@lab.ntt.co.jp>
@@@ -4720,7 -4720,6 +4731,7 @@@ S:      Maintaine
  F:    drivers/of
  F:    include/linux/of*.h
  K:    of_get_property
 +K:    of_match_table
  
  OPENRISC ARCHITECTURE
  M:    Jonas Bonn <jonas@southpole.se>
@@@ -4788,7 -4787,7 +4799,7 @@@ PA SEMI ETHERNET DRIVE
  M:    Olof Johansson <olof@lixom.net>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    drivers/net/pasemi_mac.*
 +F:    drivers/net/ethernet/pasemi/*
  
  PA SEMI SMBUS DRIVER
  M:    Olof Johansson <olof@lixom.net>
@@@ -4935,7 -4934,7 +4946,7 @@@ PCNET32 NETWORK DRIVE
  M:    Don Fry <pcnet32@frontier.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    drivers/net/pcnet32.c
 +F:    drivers/net/ethernet/amd/pcnet32.c
  
  PCRYPT PARALLEL CRYPTO ENGINE
  M:    Steffen Klassert <steffen.klassert@secunet.com>
@@@ -5011,17 -5010,6 +5022,17 @@@ F:    drivers/i2c/busses/i2c-puv3.
  F:    drivers/video/fb-puv3.c
  F:    drivers/rtc/rtc-puv3.c
  
 +PMBUS HARDWARE MONITORING DRIVERS
 +M:    Guenter Roeck <guenter.roeck@ericsson.com>
 +L:    lm-sensors@lm-sensors.org
 +W:    http://www.lm-sensors.org/
 +W:    http://www.roeck-us.net/linux/drivers/
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git
 +S:    Maintained
 +F:    Documentation/hwmon/pmbus
 +F:    drivers/hwmon/pmbus/
 +F:    include/linux/i2c/pmbus.h
 +
  PMC SIERRA MaxRAID DRIVER
  M:    Anil Ravindranath <anil_ravindranath@pmc-sierra.com>
  L:    linux-scsi@vger.kernel.org
@@@ -5067,7 -5055,7 +5078,7 @@@ PPP PROTOCOL DRIVERS AND COMPRESSOR
  M:    Paul Mackerras <paulus@samba.org>
  L:    linux-ppp@vger.kernel.org
  S:    Maintained
 -F:    drivers/net/ppp_*
 +F:    drivers/net/ppp/ppp_*
  
  PPP OVER ATM (RFC 2364)
  M:    Mitchell Blank Jr <mitch@sfgoth.com>
@@@ -5078,8 -5066,8 +5089,8 @@@ F:      include/linux/atmppp.
  PPP OVER ETHERNET
  M:    Michal Ostrowski <mostrows@earthlink.net>
  S:    Maintained
 -F:    drivers/net/pppoe.c
 -F:    drivers/net/pppox.c
 +F:    drivers/net/ppp/pppoe.c
 +F:    drivers/net/ppp/pppox.c
  
  PPP OVER L2TP
  M:    James Chapman <jchapman@katalix.com>
@@@ -5100,7 -5088,7 +5111,7 @@@ PPTP DRIVE
  M:    Dmitry Kozlov <xeb@mail.ru>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    drivers/net/pptp.c
 +F:    drivers/net/ppp/pptp.c
  W:    http://sourceforge.net/projects/accel-pptp
  
  PREEMPTIBLE KERNEL
@@@ -5129,7 -5117,7 +5140,7 @@@ M:      Geoff Levand <geoff@infradead.org
  L:    netdev@vger.kernel.org
  L:    cbe-oss-dev@lists.ozlabs.org
  S:    Maintained
 -F:    drivers/net/ps3_gelic_net.*
 +F:    drivers/net/ethernet/toshiba/ps3_gelic_net.*
  
  PS3 PLATFORM SUPPORT
  M:    Geoff Levand <geoff@infradead.org>
@@@ -5247,24 -5235,23 +5258,24 @@@ M:   linux-driver@qlogic.co
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    Documentation/networking/LICENSE.qla3xxx
 -F:    drivers/net/qla3xxx.*
 +F:    drivers/net/ethernet/qlogic/qla3xxx.*
  
  QLOGIC QLCNIC (1/10)Gb ETHERNET DRIVER
 -M:    Amit Kumar Salecha <amit.salecha@qlogic.com>
  M:    Anirban Chakraborty <anirban.chakraborty@qlogic.com>
 +M:    Sony Chacko <sony.chacko@qlogic.com>
  M:    linux-driver@qlogic.com
  L:    netdev@vger.kernel.org
  S:    Supported
 -F:    drivers/net/qlcnic/
 +F:    drivers/net/ethernet/qlogic/qlcnic/
  
  QLOGIC QLGE 10Gb ETHERNET DRIVER
 +M:    Anirban Chakraborty <anirban.chakraborty@qlogic.com>
  M:    Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
  M:    Ron Mercer <ron.mercer@qlogic.com>
  M:    linux-driver@qlogic.com
  L:    netdev@vger.kernel.org
  S:    Supported
 -F:    drivers/net/qlge/
 +F:    drivers/net/ethernet/qlogic/qlge/
  
  QNX4 FILESYSTEM
  M:    Anders Larsen <al@alarsen.net>
@@@ -5346,7 -5333,7 +5357,7 @@@ RDC R6040 FAST ETHERNET DRIVE
  M:    Florian Fainelli <florian@openwrt.org>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    drivers/net/r6040.c
 +F:    drivers/net/ethernet/rdc/r6040.c
  
  RDS - RELIABLE DATAGRAM SOCKETS
  M:    Andy Grover <andy.grover@oracle.com>
@@@ -5749,7 -5736,7 +5760,7 @@@ M:      Ajit Khaparde <ajit.khaparde@emulex.
  L:    netdev@vger.kernel.org
  W:    http://www.emulex.com
  S:    Supported
 -F:    drivers/net/benet/
 +F:    drivers/net/ethernet/emulex/benet/
  
  SFC NETWORK DRIVER
  M:    Solarflare linux maintainers <linux-net-drivers@solarflare.com>
@@@ -5757,7 -5744,7 +5768,7 @@@ M:      Steve Hodgson <shodgson@solarflare.c
  M:    Ben Hutchings <bhutchings@solarflare.com>
  L:    netdev@vger.kernel.org
  S:    Supported
 -F:    drivers/net/sfc/
 +F:    drivers/net/ethernet/sfc/
  
  SGI GRU DRIVER
  M:    Jack Steiner <steiner@sgi.com>
@@@ -5823,14 -5810,14 +5834,14 @@@ SIS 190 ETHERNET DRIVE
  M:    Francois Romieu <romieu@fr.zoreil.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    drivers/net/sis190.c
 +F:    drivers/net/ethernet/sis/sis190.c
  
  SIS 900/7016 FAST ETHERNET DRIVER
  M:    Daniele Venzano <venza@brownhat.org>
  W:    http://www.brownhat.org/sis900.html
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    drivers/net/sis900.*
 +F:    drivers/net/ethernet/sis/sis900.*
  
  SIS 96X I2C/SMBUS DRIVER
  M:    "Mark M. Hoffman" <mhoffman@lightlink.com>
@@@ -5857,7 -5844,8 +5868,7 @@@ SKGE, SKY2 10/100/1000 GIGABIT ETHERNE
  M:    Stephen Hemminger <shemminger@linux-foundation.org>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    drivers/net/skge.*
 -F:    drivers/net/sky2.*
 +F:    drivers/net/ethernet/marvell/sk*
  
  SLAB ALLOCATOR
  M:    Christoph Lameter <cl@linux-foundation.org>
@@@ -5871,7 -5859,7 +5882,7 @@@ F:      mm/sl?b.
  SMC91x ETHERNET DRIVER
  M:    Nicolas Pitre <nico@fluxnic.net>
  S:    Odd Fixes
 -F:    drivers/net/smc91x.*
 +F:    drivers/net/ethernet/smsc/smc91x.*
  
  SMM665 HARDWARE MONITOR DRIVER
  M:    Guenter Roeck <linux@roeck-us.net>
@@@ -5906,13 -5894,13 +5917,13 @@@ M:   Steve Glendinning <steve.glendinning
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    include/linux/smsc911x.h
 -F:    drivers/net/smsc911x.*
 +F:    drivers/net/ethernet/smsc/smsc911x.*
  
  SMSC9420 PCI ETHERNET DRIVER
  M:    Steve Glendinning <steve.glendinning@smsc.com>
  L:    netdev@vger.kernel.org
  S:    Supported
 -F:    drivers/net/smsc9420.*
 +F:    drivers/net/ethernet/smsc/smsc9420.*
  
  SN-IA64 (Itanium) SUB-PLATFORM
  M:    Jes Sorensen <jes@sgi.com>
@@@ -5946,7 -5934,7 +5957,7 @@@ SONIC NETWORK DRIVE
  M:    Thomas Bogendoerfer <tsbogend@alpha.franken.de>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    drivers/net/sonic.*
 +F:    drivers/net/ethernet/natsemi/sonic.*
  
  SONICS SILICON BACKPLANE DRIVER (SSB)
  M:    Michael Buesch <m@bues.ch>
@@@ -6087,7 -6075,7 +6098,7 @@@ M:      Jens Osterkamp <jens@de.ibm.com
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    Documentation/networking/spider_net.txt
 -F:    drivers/net/spider_net*
 +F:    drivers/net/ethernet/toshiba/spider_net*
  
  SPU FILE SYSTEM
  M:    Jeremy Kerr <jk@ozlabs.org>
@@@ -6265,7 -6253,7 +6276,7 @@@ F:      drivers/staging/xgifb
  STARFIRE/DURALAN NETWORK DRIVER
  M:    Ion Badulescu <ionut@badula.org>
  S:    Odd Fixes
 -F:    drivers/net/starfire*
 +F:    drivers/net/ethernet/adaptec/starfire*
  
  SUN3/3X
  M:    Sam Creasey <sammy@sammy.net>
@@@ -6274,7 -6262,6 +6285,7 @@@ S:      Maintaine
  F:    arch/m68k/kernel/*sun3*
  F:    arch/m68k/sun3*/
  F:    arch/m68k/include/asm/sun3*
 +F:    drivers/net/ethernet/i825xx/sun3*
  
  SUPERH
  M:    Paul Mundt <lethal@linux-sh.org>
@@@ -6318,7 -6305,6 +6329,7 @@@ F:      include/linux/sysv_fs.
  TARGET SUBSYSTEM
  M:    Nicholas A. Bellinger <nab@linux-iscsi.org>
  L:    linux-scsi@vger.kernel.org
 +L:    target-devel@vger.kernel.org
  L:    http://groups.google.com/group/linux-iscsi-target-dev
  W:    http://www.linux-iscsi.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/nab/lio-core-2.6.git master
@@@ -6363,7 -6349,7 +6374,7 @@@ M:      Alexander Indenbaum <baum@tehutinetw
  M:    Andy Gospodarek <andy@greyhouse.net>
  L:    netdev@vger.kernel.org
  S:    Supported
 -F:    drivers/net/tehuti*
 +F:    drivers/net/ethernet/tehuti/*
  
  Telecom Clock Driver for MCPL0010
  M:    Mark Gross <mark.gross@intel.com>
@@@ -6414,7 -6400,7 +6425,7 @@@ W:      http://www.tilera.com/scm
  S:    Supported
  F:    arch/tile/
  F:    drivers/tty/hvc/hvc_tile.c
 -F:    drivers/net/tile/
 +F:    drivers/net/ethernet/tile/
  F:    drivers/edac/tile_edac.c
  
  TLAN NETWORK DRIVER
@@@ -6423,7 -6409,7 +6434,7 @@@ L:      tlan-devel@lists.sourceforge.net (su
  W:    http://sourceforge.net/projects/tlan/
  S:    Maintained
  F:    Documentation/networking/tlan.txt
 -F:    drivers/net/tlan.*
 +F:    drivers/net/ethernet/ti/tlan.*
  
  TOMOYO SECURITY MODULE
  M:    Kentaro Takeda <takedakn@nttdata.co.jp>
@@@ -6517,7 -6503,7 +6528,7 @@@ TULIP NETWORK DRIVER
  M:    Grant Grundler <grundler@parisc-linux.org>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    drivers/net/tulip/
 +F:    drivers/net/ethernet/tulip/
  
  TUN/TAP driver
  M:    Maxim Krasnyansky <maxk@qualcomm.com>
@@@ -6563,7 -6549,7 +6574,7 @@@ W:      http://uclinux-h8.sourceforge.jp
  S:    Supported
  F:    arch/h8300/
  F:    drivers/ide/ide-h8300.c
 -F:    drivers/net/ne-h8300.c
 +F:    drivers/net/ethernet/8390/ne-h8300.c
  
  UDF FILESYSTEM
  M:    Jan Kara <jack@suse.cz>
@@@ -6991,7 -6977,7 +7002,7 @@@ F:      include/linux/vhost.
  VIA RHINE NETWORK DRIVER
  M:    Roger Luethi <rl@hellgate.ch>
  S:    Maintained
 -F:    drivers/net/via-rhine.c
 +F:    drivers/net/ethernet/via/via-rhine.c
  
  VIAPRO SMBUS DRIVER
  M:    Jean Delvare <khali@linux-fr.org>
@@@ -7019,7 -7005,7 +7030,7 @@@ VIA VELOCITY NETWORK DRIVE
  M:    Francois Romieu <romieu@fr.zoreil.com>
  L:    netdev@vger.kernel.org
  S:    Maintained
 -F:    drivers/net/via-velocity.*
 +F:    drivers/net/ethernet/via/via-velocity.*
  
  VLAN (802.1Q)
  M:    Patrick McHardy <kaber@trash.net>
@@@ -7352,7 -7338,7 +7363,7 @@@ THE RES
  M:    Linus Torvalds <torvalds@linux-foundation.org>
  L:    linux-kernel@vger.kernel.org
  Q:    http://patchwork.kernel.org/project/LKML/list/
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
  S:    Buried alive in reporters
  F:    *
  F:    */
index 5c590429f120c307688952206e997aef6832d066,3aca9fa2d27b6468af67a70d98045b623973d31f..80397de11e0d2c182e121ec0e01b486eb62d0a07
  #define AR_PHY_TPC_11_B1         (AR_SM1_BASE + 0x220)
  #define AR_PHY_PDADC_TAB_1       (AR_SM1_BASE + 0x240)
  #define AR_PHY_TX_IQCAL_STATUS_B1   (AR_SM1_BASE + 0x48c)
 -#define AR_PHY_TX_IQCAL_CORR_COEFF_B1(_i)    (AR_SM_BASE + 0x450 + ((_i) << 2))
 +#define AR_PHY_TX_IQCAL_CORR_COEFF_B1(_i)    (AR_SM1_BASE + 0x450 + ((_i) << 2))
  
  /*
   * Channel 2 Register Map
  #define AR_PHY_CL_TAB_CL_GAIN_MOD             0x1f
  #define AR_PHY_CL_TAB_CL_GAIN_MOD_S           0
  
- void ar9003_hw_set_chain_masks(struct ath_hw *ah, u8 rx, u8 tx);
  #endif  /* AR9003_PHY_H */
index 481e534534eb3a437a732509c80bba6db73ff2e1,e76b40ddbc48027e1326cf98c563eacda13dbd17..c5d890e74a1e426e80bc8379afa3b49a4617cb8c
   * into separate slots. */
  #define TX_SLOTS_PER_FRAME    2
  
+ static u32 b43_dma_address(struct b43_dma *dma, dma_addr_t dmaaddr,
+                          enum b43_addrtype addrtype)
+ {
+       u32 uninitialized_var(addr);
+       switch (addrtype) {
+       case B43_DMA_ADDR_LOW:
+               addr = lower_32_bits(dmaaddr);
+               if (dma->translation_in_low) {
+                       addr &= ~SSB_DMA_TRANSLATION_MASK;
+                       addr |= dma->translation;
+               }
+               break;
+       case B43_DMA_ADDR_HIGH:
+               addr = upper_32_bits(dmaaddr);
+               if (!dma->translation_in_low) {
+                       addr &= ~SSB_DMA_TRANSLATION_MASK;
+                       addr |= dma->translation;
+               }
+               break;
+       case B43_DMA_ADDR_EXT:
+               if (dma->translation_in_low)
+                       addr = lower_32_bits(dmaaddr);
+               else
+                       addr = upper_32_bits(dmaaddr);
+               addr &= SSB_DMA_TRANSLATION_MASK;
+               addr >>= SSB_DMA_TRANSLATION_SHIFT;
+               break;
+       }
+       return addr;
+ }
  
  /* 32bit DMA ops. */
  static
@@@ -77,10 -109,9 +109,9 @@@ static void op32_fill_descriptor(struc
        slot = (int)(&(desc->dma32) - descbase);
        B43_WARN_ON(!(slot >= 0 && slot < ring->nr_slots));
  
-       addr = (u32) (dmaaddr & ~SSB_DMA_TRANSLATION_MASK);
-       addrext = (u32) (dmaaddr & SSB_DMA_TRANSLATION_MASK)
-           >> SSB_DMA_TRANSLATION_SHIFT;
-       addr |= ring->dev->dma.translation;
+       addr = b43_dma_address(&ring->dev->dma, dmaaddr, B43_DMA_ADDR_LOW);
+       addrext = b43_dma_address(&ring->dev->dma, dmaaddr, B43_DMA_ADDR_EXT);
        ctl = bufsize & B43_DMA32_DCTL_BYTECNT;
        if (slot == ring->nr_slots - 1)
                ctl |= B43_DMA32_DCTL_DTABLEEND;
@@@ -170,11 -201,10 +201,10 @@@ static void op64_fill_descriptor(struc
        slot = (int)(&(desc->dma64) - descbase);
        B43_WARN_ON(!(slot >= 0 && slot < ring->nr_slots));
  
-       addrlo = (u32) (dmaaddr & 0xFFFFFFFF);
-       addrhi = (((u64) dmaaddr >> 32) & ~SSB_DMA_TRANSLATION_MASK);
-       addrext = (((u64) dmaaddr >> 32) & SSB_DMA_TRANSLATION_MASK)
-           >> SSB_DMA_TRANSLATION_SHIFT;
-       addrhi |= ring->dev->dma.translation;
+       addrlo = b43_dma_address(&ring->dev->dma, dmaaddr, B43_DMA_ADDR_LOW);
+       addrhi = b43_dma_address(&ring->dev->dma, dmaaddr, B43_DMA_ADDR_HIGH);
+       addrext = b43_dma_address(&ring->dev->dma, dmaaddr, B43_DMA_ADDR_EXT);
        if (slot == ring->nr_slots - 1)
                ctl0 |= B43_DMA64_DCTL0_DTABLEEND;
        if (start)
@@@ -658,41 -688,37 +688,37 @@@ static int dmacontroller_setup(struct b
        int err = 0;
        u32 value;
        u32 addrext;
-       u32 trans = ring->dev->dma.translation;
        bool parity = ring->dev->dma.parity;
+       u32 addrlo;
+       u32 addrhi;
  
        if (ring->tx) {
                if (ring->type == B43_DMA_64BIT) {
                        u64 ringbase = (u64) (ring->dmabase);
+                       addrext = b43_dma_address(&ring->dev->dma, ringbase, B43_DMA_ADDR_EXT);
+                       addrlo = b43_dma_address(&ring->dev->dma, ringbase, B43_DMA_ADDR_LOW);
+                       addrhi = b43_dma_address(&ring->dev->dma, ringbase, B43_DMA_ADDR_HIGH);
  
-                       addrext = ((ringbase >> 32) & SSB_DMA_TRANSLATION_MASK)
-                           >> SSB_DMA_TRANSLATION_SHIFT;
                        value = B43_DMA64_TXENABLE;
                        value |= (addrext << B43_DMA64_TXADDREXT_SHIFT)
                            & B43_DMA64_TXADDREXT_MASK;
                        if (!parity)
                                value |= B43_DMA64_TXPARITYDISABLE;
                        b43_dma_write(ring, B43_DMA64_TXCTL, value);
-                       b43_dma_write(ring, B43_DMA64_TXRINGLO,
-                                     (ringbase & 0xFFFFFFFF));
-                       b43_dma_write(ring, B43_DMA64_TXRINGHI,
-                                     ((ringbase >> 32) &
-                                      ~SSB_DMA_TRANSLATION_MASK)
-                                     | trans);
+                       b43_dma_write(ring, B43_DMA64_TXRINGLO, addrlo);
+                       b43_dma_write(ring, B43_DMA64_TXRINGHI, addrhi);
                } else {
                        u32 ringbase = (u32) (ring->dmabase);
+                       addrext = b43_dma_address(&ring->dev->dma, ringbase, B43_DMA_ADDR_EXT);
+                       addrlo = b43_dma_address(&ring->dev->dma, ringbase, B43_DMA_ADDR_LOW);
  
-                       addrext = (ringbase & SSB_DMA_TRANSLATION_MASK)
-                           >> SSB_DMA_TRANSLATION_SHIFT;
                        value = B43_DMA32_TXENABLE;
                        value |= (addrext << B43_DMA32_TXADDREXT_SHIFT)
                            & B43_DMA32_TXADDREXT_MASK;
                        if (!parity)
                                value |= B43_DMA32_TXPARITYDISABLE;
                        b43_dma_write(ring, B43_DMA32_TXCTL, value);
-                       b43_dma_write(ring, B43_DMA32_TXRING,
-                                     (ringbase & ~SSB_DMA_TRANSLATION_MASK)
-                                     | trans);
+                       b43_dma_write(ring, B43_DMA32_TXRING, addrlo);
                }
        } else {
                err = alloc_initial_descbuffers(ring);
                        goto out;
                if (ring->type == B43_DMA_64BIT) {
                        u64 ringbase = (u64) (ring->dmabase);
+                       addrext = b43_dma_address(&ring->dev->dma, ringbase, B43_DMA_ADDR_EXT);
+                       addrlo = b43_dma_address(&ring->dev->dma, ringbase, B43_DMA_ADDR_LOW);
+                       addrhi = b43_dma_address(&ring->dev->dma, ringbase, B43_DMA_ADDR_HIGH);
  
-                       addrext = ((ringbase >> 32) & SSB_DMA_TRANSLATION_MASK)
-                           >> SSB_DMA_TRANSLATION_SHIFT;
                        value = (ring->frameoffset << B43_DMA64_RXFROFF_SHIFT);
                        value |= B43_DMA64_RXENABLE;
                        value |= (addrext << B43_DMA64_RXADDREXT_SHIFT)
                        if (!parity)
                                value |= B43_DMA64_RXPARITYDISABLE;
                        b43_dma_write(ring, B43_DMA64_RXCTL, value);
-                       b43_dma_write(ring, B43_DMA64_RXRINGLO,
-                                     (ringbase & 0xFFFFFFFF));
-                       b43_dma_write(ring, B43_DMA64_RXRINGHI,
-                                     ((ringbase >> 32) &
-                                      ~SSB_DMA_TRANSLATION_MASK)
-                                     | trans);
+                       b43_dma_write(ring, B43_DMA64_RXRINGLO, addrlo);
+                       b43_dma_write(ring, B43_DMA64_RXRINGHI, addrhi);
                        b43_dma_write(ring, B43_DMA64_RXINDEX, ring->nr_slots *
                                      sizeof(struct b43_dmadesc64));
                } else {
                        u32 ringbase = (u32) (ring->dmabase);
+                       addrext = b43_dma_address(&ring->dev->dma, ringbase, B43_DMA_ADDR_EXT);
+                       addrlo = b43_dma_address(&ring->dev->dma, ringbase, B43_DMA_ADDR_LOW);
  
-                       addrext = (ringbase & SSB_DMA_TRANSLATION_MASK)
-                           >> SSB_DMA_TRANSLATION_SHIFT;
                        value = (ring->frameoffset << B43_DMA32_RXFROFF_SHIFT);
                        value |= B43_DMA32_RXENABLE;
                        value |= (addrext << B43_DMA32_RXADDREXT_SHIFT)
                        if (!parity)
                                value |= B43_DMA32_RXPARITYDISABLE;
                        b43_dma_write(ring, B43_DMA32_RXCTL, value);
-                       b43_dma_write(ring, B43_DMA32_RXRING,
-                                     (ringbase & ~SSB_DMA_TRANSLATION_MASK)
-                                     | trans);
+                       b43_dma_write(ring, B43_DMA32_RXRING, addrlo);
                        b43_dma_write(ring, B43_DMA32_RXINDEX, ring->nr_slots *
                                      sizeof(struct b43_dmadesc32));
                }
@@@ -795,23 -816,9 +816,23 @@@ static u64 supported_dma_mask(struct b4
        u32 tmp;
        u16 mmio_base;
  
 -      tmp = b43_read32(dev, SSB_TMSHIGH);
 -      if (tmp & SSB_TMSHIGH_DMA64)
 -              return DMA_BIT_MASK(64);
 +      switch (dev->dev->bus_type) {
 +#ifdef CONFIG_B43_BCMA
 +      case B43_BUS_BCMA:
 +              tmp = bcma_aread32(dev->dev->bdev, BCMA_IOST);
 +              if (tmp & BCMA_IOST_DMA64)
 +                      return DMA_BIT_MASK(64);
 +              break;
 +#endif
 +#ifdef CONFIG_B43_SSB
 +      case B43_BUS_SSB:
 +              tmp = ssb_read32(dev->dev->sdev, SSB_TMSHIGH);
 +              if (tmp & SSB_TMSHIGH_DMA64)
 +                      return DMA_BIT_MASK(64);
 +              break;
 +#endif
 +      }
 +
        mmio_base = b43_dmacontroller_base(0, 0);
        b43_write32(dev, mmio_base + B43_DMA32_TXCTL, B43_DMA32_TXADDREXT_MASK);
        tmp = b43_read32(dev, mmio_base + B43_DMA32_TXCTL);
@@@ -872,8 -879,17 +893,17 @@@ struct b43_dmaring *b43_setup_dmaring(s
                ring->current_slot = -1;
        } else {
                if (ring->index == 0) {
-                       ring->rx_buffersize = B43_DMA0_RX_BUFFERSIZE;
-                       ring->frameoffset = B43_DMA0_RX_FRAMEOFFSET;
+                       switch (dev->fw.hdr_format) {
+                       case B43_FW_HDR_598:
+                               ring->rx_buffersize = B43_DMA0_RX_FW598_BUFSIZE;
+                               ring->frameoffset = B43_DMA0_RX_FW598_FO;
+                               break;
+                       case B43_FW_HDR_410:
+                       case B43_FW_HDR_351:
+                               ring->rx_buffersize = B43_DMA0_RX_FW351_BUFSIZE;
+                               ring->frameoffset = B43_DMA0_RX_FW351_FO;
+                               break;
+                       }
                } else
                        B43_WARN_ON(1);
        }
@@@ -1066,6 -1082,25 +1096,25 @@@ static int b43_dma_set_mask(struct b43_
        return 0;
  }
  
+ /* Some hardware with 64-bit DMA seems to be bugged and looks for translation
+  * bit in low address word instead of high one.
+  */
+ static bool b43_dma_translation_in_low_word(struct b43_wldev *dev,
+                                           enum b43_dmatype type)
+ {
+       if (type != B43_DMA_64BIT)
+               return 1;
+ #ifdef CONFIG_B43_SSB
+       if (dev->dev->bus_type == B43_BUS_SSB &&
+           dev->dev->sdev->bus->bustype == SSB_BUSTYPE_PCI &&
+           !(dev->dev->sdev->bus->host_pci->is_pcie &&
+             ssb_read32(dev->dev->sdev, SSB_TMSHIGH) & SSB_TMSHIGH_DMA64))
+                       return 1;
+ #endif
+       return 0;
+ }
  int b43_dma_init(struct b43_wldev *dev)
  {
        struct b43_dma *dma = &dev->dma;
                break;
  #endif
        }
+       dma->translation_in_low = b43_dma_translation_in_low_word(dev, type);
  
        dma->parity = true;
  #ifdef CONFIG_B43_BCMA
index ef63c0df006ad313de8781656b2bca4a15942ee7,195666a0c854007c34744b24ae92da047337fdff..424b8a0323e21c602b117b3a12b24fc217e55503
@@@ -241,20 -241,20 +241,20 @@@ static struct rtl_hal_cfg rtl92cu_hal_c
        .maps[RTL_IMR_ROK] = IMR_ROK,
        .maps[RTL_IBSS_INT_MASKS] = (IMR_BCNINT | IMR_TBDOK | IMR_TBDER),
  
-       .maps[RTL_RC_CCK_RATE1M] = DESC92C_RATE1M,
-       .maps[RTL_RC_CCK_RATE2M] = DESC92C_RATE2M,
-       .maps[RTL_RC_CCK_RATE5_5M] = DESC92C_RATE5_5M,
-       .maps[RTL_RC_CCK_RATE11M] = DESC92C_RATE11M,
-       .maps[RTL_RC_OFDM_RATE6M] = DESC92C_RATE6M,
-       .maps[RTL_RC_OFDM_RATE9M] = DESC92C_RATE9M,
-       .maps[RTL_RC_OFDM_RATE12M] = DESC92C_RATE12M,
-       .maps[RTL_RC_OFDM_RATE18M] = DESC92C_RATE18M,
-       .maps[RTL_RC_OFDM_RATE24M] = DESC92C_RATE24M,
-       .maps[RTL_RC_OFDM_RATE36M] = DESC92C_RATE36M,
-       .maps[RTL_RC_OFDM_RATE48M] = DESC92C_RATE48M,
-       .maps[RTL_RC_OFDM_RATE54M] = DESC92C_RATE54M,
-       .maps[RTL_RC_HT_RATEMCS7] = DESC92C_RATEMCS7,
-       .maps[RTL_RC_HT_RATEMCS15] = DESC92C_RATEMCS15,
+       .maps[RTL_RC_CCK_RATE1M] = DESC92_RATE1M,
+       .maps[RTL_RC_CCK_RATE2M] = DESC92_RATE2M,
+       .maps[RTL_RC_CCK_RATE5_5M] = DESC92_RATE5_5M,
+       .maps[RTL_RC_CCK_RATE11M] = DESC92_RATE11M,
+       .maps[RTL_RC_OFDM_RATE6M] = DESC92_RATE6M,
+       .maps[RTL_RC_OFDM_RATE9M] = DESC92_RATE9M,
+       .maps[RTL_RC_OFDM_RATE12M] = DESC92_RATE12M,
+       .maps[RTL_RC_OFDM_RATE18M] = DESC92_RATE18M,
+       .maps[RTL_RC_OFDM_RATE24M] = DESC92_RATE24M,
+       .maps[RTL_RC_OFDM_RATE36M] = DESC92_RATE36M,
+       .maps[RTL_RC_OFDM_RATE48M] = DESC92_RATE48M,
+       .maps[RTL_RC_OFDM_RATE54M] = DESC92_RATE54M,
+       .maps[RTL_RC_HT_RATEMCS7] = DESC92_RATEMCS7,
+       .maps[RTL_RC_HT_RATEMCS15] = DESC92_RATEMCS15,
  };
  
  #define USB_VENDER_ID_REALTEK         0x0bda
@@@ -281,8 -281,6 +281,8 @@@ static struct usb_device_id rtl8192c_us
        {RTL_USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817d, rtl92cu_hal_cfg)},
        /* 8188CE-VAU USB minCard (b/g mode only) */
        {RTL_USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817e, rtl92cu_hal_cfg)},
 +      /* 8188RU in Alfa AWUS036NHR */
 +      {RTL_USB_DEVICE(USB_VENDER_ID_REALTEK, 0x817f, rtl92cu_hal_cfg)},
        /* 8188 Combo for BC4 */
        {RTL_USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8754, rtl92cu_hal_cfg)},
  
        {RTL_USB_DEVICE(0x0eb0, 0x9071, rtl92cu_hal_cfg)}, /*NO Brand - Etop*/
        /* HP - Lite-On ,8188CUS Slim Combo */
        {RTL_USB_DEVICE(0x103c, 0x1629, rtl92cu_hal_cfg)},
 +      {RTL_USB_DEVICE(0x13d3, 0x3357, rtl92cu_hal_cfg)}, /* AzureWave */
        {RTL_USB_DEVICE(0x2001, 0x3308, rtl92cu_hal_cfg)}, /*D-Link - Alpha*/
        {RTL_USB_DEVICE(0x2019, 0xab2a, rtl92cu_hal_cfg)}, /*Planex - Abocom*/
        {RTL_USB_DEVICE(0x2019, 0xed17, rtl92cu_hal_cfg)}, /*PCI - Edimax*/
        {RTL_USB_DEVICE(0x20f4, 0x648b, rtl92cu_hal_cfg)}, /*TRENDnet - Cameo*/
        {RTL_USB_DEVICE(0x7392, 0x7811, rtl92cu_hal_cfg)}, /*Edimax - Edimax*/
 -      {RTL_USB_DEVICE(0x3358, 0x13d3, rtl92cu_hal_cfg)}, /*Azwave 8188CE-VAU*/
 +      {RTL_USB_DEVICE(0x13d3, 0x3358, rtl92cu_hal_cfg)}, /*Azwave 8188CE-VAU*/
        /* Russian customer -Azwave (8188CE-VAU  b/g mode only) */
 -      {RTL_USB_DEVICE(0x3359, 0x13d3, rtl92cu_hal_cfg)},
 +      {RTL_USB_DEVICE(0x13d3, 0x3359, rtl92cu_hal_cfg)},
 +      {RTL_USB_DEVICE(0x4855, 0x0090, rtl92cu_hal_cfg)}, /* Feixun */
 +      {RTL_USB_DEVICE(0x4855, 0x0091, rtl92cu_hal_cfg)}, /* NetweeN-Feixun */
 +      {RTL_USB_DEVICE(0x9846, 0x9041, rtl92cu_hal_cfg)}, /* Netgear Cameo */
  
        /****** 8192CU ********/
        {RTL_USB_DEVICE(0x0586, 0x341f, rtl92cu_hal_cfg)}, /*Zyxel -Abocom*/
        {RTL_USB_DEVICE(0x07aa, 0x0056, rtl92cu_hal_cfg)}, /*ATKK-Gemtek*/
        {RTL_USB_DEVICE(0x07b8, 0x8178, rtl92cu_hal_cfg)}, /*Funai -Abocom*/
 -      {RTL_USB_DEVICE(0x07b8, 0x8178, rtl92cu_hal_cfg)}, /*Abocom -Abocom*/
        {RTL_USB_DEVICE(0x2001, 0x3307, rtl92cu_hal_cfg)}, /*D-Link-Cameo*/
        {RTL_USB_DEVICE(0x2001, 0x3309, rtl92cu_hal_cfg)}, /*D-Link-Alpha*/
        {RTL_USB_DEVICE(0x2001, 0x330a, rtl92cu_hal_cfg)}, /*D-Link-Alpha*/
diff --combined net/mac80211/cfg.c
index a589addf6ce1db3a3b2880f496f1318888e2ff56,0baaaecf4558858e531a2643c1bf7401abb0b8b8..4baa03b1c251b0691d45d4622b28d595d08dd076
@@@ -62,7 -62,7 +62,7 @@@ static int ieee80211_change_iface(struc
  
        if (type == NL80211_IFTYPE_AP_VLAN &&
            params && params->use_4addr == 0)
 -              rcu_assign_pointer(sdata->u.vlan.sta, NULL);
 +              RCU_INIT_POINTER(sdata->u.vlan.sta, NULL);
        else if (type == NL80211_IFTYPE_STATION &&
                 params && params->use_4addr >= 0)
                sdata->u.mgd.use_4addr = params->use_4addr;
@@@ -542,7 -542,7 +542,7 @@@ static int ieee80211_config_beacon(stru
  
        sdata->vif.bss_conf.dtim_period = new->dtim_period;
  
 -      rcu_assign_pointer(sdata->u.ap.beacon, new);
 +      RCU_INIT_POINTER(sdata->u.ap.beacon, new);
  
        synchronize_rcu();
  
@@@ -594,7 -594,7 +594,7 @@@ static int ieee80211_del_beacon(struct 
        if (!old)
                return -ENOENT;
  
 -      rcu_assign_pointer(sdata->u.ap.beacon, NULL);
 +      RCU_INIT_POINTER(sdata->u.ap.beacon, NULL);
        synchronize_rcu();
        kfree(old);
  
@@@ -697,6 -697,9 +697,9 @@@ static void sta_apply_parameters(struc
        }
        spin_unlock_irqrestore(&sta->flaglock, flags);
  
+       sta->sta.uapsd_queues = params->uapsd_queues;
+       sta->sta.max_sp = params->max_sp;
        /*
         * cfg80211 validates this (1-2007) and allows setting the AID
         * only when creating a new station entry
@@@ -857,7 -860,7 +860,7 @@@ static int ieee80211_change_station(str
                                return -EBUSY;
                        }
  
 -                      rcu_assign_pointer(vlansdata->u.vlan.sta, sta);
 +                      RCU_INIT_POINTER(vlansdata->u.vlan.sta, sta);
                }
  
                sta->sdata = vlansdata;
@@@ -1137,6 -1140,22 +1140,22 @@@ static int ieee80211_update_mesh_config
                conf->dot11MeshHWMPRootMode = nconf->dot11MeshHWMPRootMode;
                ieee80211_mesh_root_setup(ifmsh);
        }
+       if (_chg_mesh_attr(NL80211_MESHCONF_GATE_ANNOUNCEMENTS, mask)) {
+               /* our current gate announcement implementation rides on root
+                * announcements, so require this ifmsh to also be a root node
+                * */
+               if (nconf->dot11MeshGateAnnouncementProtocol &&
+                   !conf->dot11MeshHWMPRootMode) {
+                       conf->dot11MeshHWMPRootMode = 1;
+                       ieee80211_mesh_root_setup(ifmsh);
+               }
+               conf->dot11MeshGateAnnouncementProtocol =
+                       nconf->dot11MeshGateAnnouncementProtocol;
+       }
+       if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_RANN_INTERVAL, mask)) {
+               conf->dot11MeshHWMPRannInterval =
+                       nconf->dot11MeshHWMPRannInterval;
+       }
        return 0;
  }
  
index dc7ae8d31aaf2d0ae3ed0b466115a4a5d7568537,3c2bcb2de844c4314ec712744921dac89c01d526..7fde32159fdcd1bc077bb9a071575b3920626a9c
  #include "ieee80211_i.h"
  #include "mesh.h"
  
+ #ifdef CONFIG_MAC80211_VERBOSE_MPATH_DEBUG
+ #define mpath_dbg(fmt, args...)       printk(KERN_DEBUG fmt, ##args)
+ #else
+ #define mpath_dbg(fmt, args...)       do { (void)(0); } while (0)
+ #endif
  /* There will be initially 2^INIT_PATHS_SIZE_ORDER buckets */
  #define INIT_PATHS_SIZE_ORDER 2
  
@@@ -60,6 -66,8 +66,8 @@@ static inline struct mesh_table *resize
                lockdep_is_held(&pathtbl_resize_lock));
  }
  
+ static int mesh_gate_add(struct mesh_table *tbl, struct mesh_path *mpath);
  /*
   * CAREFUL -- "tbl" must not be an expression,
   * in particular not an rcu_dereference(), since
@@@ -103,6 -111,7 +111,7 @@@ static struct mesh_table *mesh_table_al
                        sizeof(newtbl->hash_rnd));
        for (i = 0; i <= newtbl->hash_mask; i++)
                spin_lock_init(&newtbl->hashwlock[i]);
+       spin_lock_init(&newtbl->gates_lock);
  
        return newtbl;
  }
@@@ -118,6 -127,7 +127,7 @@@ static void mesh_table_free(struct mesh
  {
        struct hlist_head *mesh_hash;
        struct hlist_node *p, *q;
+       struct mpath_node *gate;
        int i;
  
        mesh_hash = tbl->hash_buckets;
                }
                spin_unlock_bh(&tbl->hashwlock[i]);
        }
+       if (free_leafs) {
+               spin_lock_bh(&tbl->gates_lock);
+               hlist_for_each_entry_safe(gate, p, q,
+                                        tbl->known_gates, list) {
+                       hlist_del(&gate->list);
+                       kfree(gate);
+               }
+               kfree(tbl->known_gates);
+               spin_unlock_bh(&tbl->gates_lock);
+       }
        __mesh_table_free(tbl);
  }
  
@@@ -146,6 -167,7 +167,7 @@@ static int mesh_table_grow(struct mesh_
        newtbl->free_node = oldtbl->free_node;
        newtbl->mean_chain_len = oldtbl->mean_chain_len;
        newtbl->copy_node = oldtbl->copy_node;
+       newtbl->known_gates = oldtbl->known_gates;
        atomic_set(&newtbl->entries, atomic_read(&oldtbl->entries));
  
        oldhash = oldtbl->hash_buckets;
@@@ -205,6 -227,111 +227,111 @@@ void mesh_path_assign_nexthop(struct me
        spin_unlock_irqrestore(&mpath->frame_queue.lock, flags);
  }
  
+ static void prepare_for_gate(struct sk_buff *skb, char *dst_addr,
+                            struct mesh_path *gate_mpath)
+ {
+       struct ieee80211_hdr *hdr;
+       struct ieee80211s_hdr *mshdr;
+       int mesh_hdrlen, hdrlen;
+       char *next_hop;
+       hdr = (struct ieee80211_hdr *) skb->data;
+       hdrlen = ieee80211_hdrlen(hdr->frame_control);
+       mshdr = (struct ieee80211s_hdr *) (skb->data + hdrlen);
+       if (!(mshdr->flags & MESH_FLAGS_AE)) {
+               /* size of the fixed part of the mesh header */
+               mesh_hdrlen = 6;
+               /* make room for the two extended addresses */
+               skb_push(skb, 2 * ETH_ALEN);
+               memmove(skb->data, hdr, hdrlen + mesh_hdrlen);
+               hdr = (struct ieee80211_hdr *) skb->data;
+               /* we preserve the previous mesh header and only add
+                * the new addreses */
+               mshdr = (struct ieee80211s_hdr *) (skb->data + hdrlen);
+               mshdr->flags = MESH_FLAGS_AE_A5_A6;
+               memcpy(mshdr->eaddr1, hdr->addr3, ETH_ALEN);
+               memcpy(mshdr->eaddr2, hdr->addr4, ETH_ALEN);
+       }
+       /* update next hop */
+       hdr = (struct ieee80211_hdr *) skb->data;
+       rcu_read_lock();
+       next_hop = rcu_dereference(gate_mpath->next_hop)->sta.addr;
+       memcpy(hdr->addr1, next_hop, ETH_ALEN);
+       rcu_read_unlock();
+       memcpy(hdr->addr3, dst_addr, ETH_ALEN);
+ }
+ /**
+  *
+  * mesh_path_move_to_queue - Move or copy frames from one mpath queue to another
+  *
+  * This function is used to transfer or copy frames from an unresolved mpath to
+  * a gate mpath.  The function also adds the Address Extension field and
+  * updates the next hop.
+  *
+  * If a frame already has an Address Extension field, only the next hop and
+  * destination addresses are updated.
+  *
+  * The gate mpath must be an active mpath with a valid mpath->next_hop.
+  *
+  * @mpath: An active mpath the frames will be sent to (i.e. the gate)
+  * @from_mpath: The failed mpath
+  * @copy: When true, copy all the frames to the new mpath queue.  When false,
+  * move them.
+  */
+ static void mesh_path_move_to_queue(struct mesh_path *gate_mpath,
+                                   struct mesh_path *from_mpath,
+                                   bool copy)
+ {
+       struct sk_buff *skb, *cp_skb = NULL;
+       struct sk_buff_head gateq, failq;
+       unsigned long flags;
+       int num_skbs;
+       BUG_ON(gate_mpath == from_mpath);
+       BUG_ON(!gate_mpath->next_hop);
+       __skb_queue_head_init(&gateq);
+       __skb_queue_head_init(&failq);
+       spin_lock_irqsave(&from_mpath->frame_queue.lock, flags);
+       skb_queue_splice_init(&from_mpath->frame_queue, &failq);
+       spin_unlock_irqrestore(&from_mpath->frame_queue.lock, flags);
+       num_skbs = skb_queue_len(&failq);
+       while (num_skbs--) {
+               skb = __skb_dequeue(&failq);
+               if (copy)
+                       cp_skb = skb_copy(skb, GFP_ATOMIC);
+               prepare_for_gate(skb, gate_mpath->dst, gate_mpath);
+               __skb_queue_tail(&gateq, skb);
+               if (copy && cp_skb)
+                       __skb_queue_tail(&failq, cp_skb);
+       }
+       spin_lock_irqsave(&gate_mpath->frame_queue.lock, flags);
+       skb_queue_splice(&gateq, &gate_mpath->frame_queue);
+       mpath_dbg("Mpath queue for gate %pM has %d frames\n",
+                       gate_mpath->dst,
+                       skb_queue_len(&gate_mpath->frame_queue));
+       spin_unlock_irqrestore(&gate_mpath->frame_queue.lock, flags);
+       if (!copy)
+               return;
+       spin_lock_irqsave(&from_mpath->frame_queue.lock, flags);
+       skb_queue_splice(&failq, &from_mpath->frame_queue);
+       spin_unlock_irqrestore(&from_mpath->frame_queue.lock, flags);
+ }
  
  /**
   * mesh_path_lookup - look up a path in the mesh path table
@@@ -304,6 -431,109 +431,109 @@@ struct mesh_path *mesh_path_lookup_by_i
        return NULL;
  }
  
+ static void mesh_gate_node_reclaim(struct rcu_head *rp)
+ {
+       struct mpath_node *node = container_of(rp, struct mpath_node, rcu);
+       kfree(node);
+ }
+ /**
+  * mesh_gate_add - mark mpath as path to a mesh gate and add to known_gates
+  * @mesh_tbl: table which contains known_gates list
+  * @mpath: mpath to known mesh gate
+  *
+  * Returns: 0 on success
+  *
+  */
+ static int mesh_gate_add(struct mesh_table *tbl, struct mesh_path *mpath)
+ {
+       struct mpath_node *gate, *new_gate;
+       struct hlist_node *n;
+       int err;
+       rcu_read_lock();
+       tbl = rcu_dereference(tbl);
+       hlist_for_each_entry_rcu(gate, n, tbl->known_gates, list)
+               if (gate->mpath == mpath) {
+                       err = -EEXIST;
+                       goto err_rcu;
+               }
+       new_gate = kzalloc(sizeof(struct mpath_node), GFP_ATOMIC);
+       if (!new_gate) {
+               err = -ENOMEM;
+               goto err_rcu;
+       }
+       mpath->is_gate = true;
+       mpath->sdata->u.mesh.num_gates++;
+       new_gate->mpath = mpath;
+       spin_lock_bh(&tbl->gates_lock);
+       hlist_add_head_rcu(&new_gate->list, tbl->known_gates);
+       spin_unlock_bh(&tbl->gates_lock);
+       rcu_read_unlock();
+       mpath_dbg("Mesh path (%s): Recorded new gate: %pM. %d known gates\n",
+                 mpath->sdata->name, mpath->dst,
+                 mpath->sdata->u.mesh.num_gates);
+       return 0;
+ err_rcu:
+       rcu_read_unlock();
+       return err;
+ }
+ /**
+  * mesh_gate_del - remove a mesh gate from the list of known gates
+  * @tbl: table which holds our list of known gates
+  * @mpath: gate mpath
+  *
+  * Returns: 0 on success
+  *
+  * Locking: must be called inside rcu_read_lock() section
+  */
+ static int mesh_gate_del(struct mesh_table *tbl, struct mesh_path *mpath)
+ {
+       struct mpath_node *gate;
+       struct hlist_node *p, *q;
+       tbl = rcu_dereference(tbl);
+       hlist_for_each_entry_safe(gate, p, q, tbl->known_gates, list)
+               if (gate->mpath == mpath) {
+                       spin_lock_bh(&tbl->gates_lock);
+                       hlist_del_rcu(&gate->list);
+                       call_rcu(&gate->rcu, mesh_gate_node_reclaim);
+                       spin_unlock_bh(&tbl->gates_lock);
+                       mpath->sdata->u.mesh.num_gates--;
+                       mpath->is_gate = false;
+                       mpath_dbg("Mesh path (%s): Deleted gate: %pM. "
+                                 "%d known gates\n", mpath->sdata->name,
+                                 mpath->dst, mpath->sdata->u.mesh.num_gates);
+                       break;
+               }
+       return 0;
+ }
+ /**
+  *
+  * mesh_path_add_gate - add the given mpath to a mesh gate to our path table
+  * @mpath: gate path to add to table
+  */
+ int mesh_path_add_gate(struct mesh_path *mpath)
+ {
+       return mesh_gate_add(mesh_paths, mpath);
+ }
+ /**
+  * mesh_gate_num - number of gates known to this interface
+  * @sdata: subif data
+  */
+ int mesh_gate_num(struct ieee80211_sub_if_data *sdata)
+ {
+       return sdata->u.mesh.num_gates;
+ }
  /**
   * mesh_path_add - allocate and add a new path to the mesh path table
   * @addr: destination address of the path (ETH_ALEN length)
@@@ -481,6 -711,7 +711,7 @@@ int mpp_path_add(u8 *dst, u8 *mpp, stru
        new_mpath->flags = 0;
        skb_queue_head_init(&new_mpath->frame_queue);
        new_node->mpath = new_mpath;
+       init_timer(&new_mpath->timer);
        new_mpath->exp_time = jiffies;
        spin_lock_init(&new_mpath->state_lock);
  
@@@ -539,6 -770,7 +770,7 @@@ void mesh_plink_broken(struct sta_info 
        struct hlist_node *p;
        struct ieee80211_sub_if_data *sdata = sta->sdata;
        int i;
+       __le16 reason = cpu_to_le16(WLAN_REASON_MESH_PATH_DEST_UNREACHABLE);
  
        rcu_read_lock();
        tbl = rcu_dereference(mesh_paths);
                        spin_unlock_bh(&mpath->state_lock);
                        mesh_path_error_tx(sdata->u.mesh.mshcfg.element_ttl,
                                        mpath->dst, cpu_to_le32(mpath->sn),
-                                       cpu_to_le16(PERR_RCODE_DEST_UNREACH),
-                                       bcast, sdata);
+                                       reason, bcast, sdata);
                } else
                spin_unlock_bh(&mpath->state_lock);
        }
@@@ -647,12 -878,14 +878,14 @@@ int mesh_path_del(u8 *addr, struct ieee
                mpath = node->mpath;
                if (mpath->sdata == sdata &&
                    memcmp(addr, mpath->dst, ETH_ALEN) == 0) {
-                       spin_lock(&mpath->state_lock);
+                       spin_lock_bh(&mpath->state_lock);
+                       if (mpath->is_gate)
+                               mesh_gate_del(tbl, mpath);
                        mpath->flags |= MESH_PATH_RESOLVING;
                        hlist_del_rcu(&node->list);
                        call_rcu(&node->rcu, mesh_path_node_reclaim);
                        atomic_dec(&tbl->entries);
-                       spin_unlock(&mpath->state_lock);
+                       spin_unlock_bh(&mpath->state_lock);
                        goto enddel;
                }
        }
@@@ -680,6 -913,58 +913,58 @@@ void mesh_path_tx_pending(struct mesh_p
                                &mpath->frame_queue);
  }
  
+ /**
+  * mesh_path_send_to_gates - sends pending frames to all known mesh gates
+  *
+  * @mpath: mesh path whose queue will be emptied
+  *
+  * If there is only one gate, the frames are transferred from the failed mpath
+  * queue to that gate's queue.  If there are more than one gates, the frames
+  * are copied from each gate to the next.  After frames are copied, the
+  * mpath queues are emptied onto the transmission queue.
+  */
+ int mesh_path_send_to_gates(struct mesh_path *mpath)
+ {
+       struct ieee80211_sub_if_data *sdata = mpath->sdata;
+       struct hlist_node *n;
+       struct mesh_table *tbl;
+       struct mesh_path *from_mpath = mpath;
+       struct mpath_node *gate = NULL;
+       bool copy = false;
+       struct hlist_head *known_gates;
+       rcu_read_lock();
+       tbl = rcu_dereference(mesh_paths);
+       known_gates = tbl->known_gates;
+       rcu_read_unlock();
+       if (!known_gates)
+               return -EHOSTUNREACH;
+       hlist_for_each_entry_rcu(gate, n, known_gates, list) {
+               if (gate->mpath->sdata != sdata)
+                       continue;
+               if (gate->mpath->flags & MESH_PATH_ACTIVE) {
+                       mpath_dbg("Forwarding to %pM\n", gate->mpath->dst);
+                       mesh_path_move_to_queue(gate->mpath, from_mpath, copy);
+                       from_mpath = gate->mpath;
+                       copy = true;
+               } else {
+                       mpath_dbg("Not forwarding %p\n", gate->mpath);
+                       mpath_dbg("flags %x\n", gate->mpath->flags);
+               }
+       }
+       hlist_for_each_entry_rcu(gate, n, known_gates, list)
+               if (gate->mpath->sdata == sdata) {
+                       mpath_dbg("Sending to %pM\n", gate->mpath->dst);
+                       mesh_path_tx_pending(gate->mpath);
+               }
+       return (from_mpath == mpath) ? -EHOSTUNREACH : 0;
+ }
  /**
   * mesh_path_discard_frame - discard a frame whose path could not be resolved
   *
@@@ -699,6 -984,7 +984,7 @@@ void mesh_path_discard_frame(struct sk_
        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
        struct mesh_path *mpath;
        u32 sn = 0;
+       __le16 reason = cpu_to_le16(WLAN_REASON_MESH_PATH_NOFORWARD);
  
        if (memcmp(hdr->addr4, sdata->vif.addr, ETH_ALEN) != 0) {
                u8 *ra, *da;
                if (mpath)
                        sn = ++mpath->sn;
                mesh_path_error_tx(sdata->u.mesh.mshcfg.element_ttl, skb->data,
-                                  cpu_to_le32(sn),
-                                  cpu_to_le16(PERR_RCODE_NO_ROUTE), ra, sdata);
+                                  cpu_to_le32(sn), reason, ra, sdata);
        }
  
        kfree_skb(skb);
@@@ -728,8 -1013,7 +1013,7 @@@ void mesh_path_flush_pending(struct mes
  {
        struct sk_buff *skb;
  
-       while ((skb = skb_dequeue(&mpath->frame_queue)) &&
-                       (mpath->flags & MESH_PATH_ACTIVE))
+       while ((skb = skb_dequeue(&mpath->frame_queue)) != NULL)
                mesh_path_discard_frame(skb, mpath->sdata);
  }
  
@@@ -797,6 -1081,9 +1081,9 @@@ int mesh_pathtbl_init(void
        tbl_path->free_node = &mesh_path_node_free;
        tbl_path->copy_node = &mesh_path_node_copy;
        tbl_path->mean_chain_len = MEAN_CHAIN_LEN;
+       tbl_path->known_gates = kzalloc(sizeof(struct hlist_head), GFP_ATOMIC);
+       INIT_HLIST_HEAD(tbl_path->known_gates);
  
        tbl_mpp = mesh_table_alloc(INIT_PATHS_SIZE_ORDER);
        if (!tbl_mpp) {
        tbl_mpp->free_node = &mesh_path_node_free;
        tbl_mpp->copy_node = &mesh_path_node_copy;
        tbl_mpp->mean_chain_len = MEAN_CHAIN_LEN;
+       tbl_mpp->known_gates = kzalloc(sizeof(struct hlist_head), GFP_ATOMIC);
+       INIT_HLIST_HEAD(tbl_mpp->known_gates);
  
        /* Need no locking since this is during init */
        RCU_INIT_POINTER(mesh_paths, tbl_path);
@@@ -843,6 -1132,6 +1132,6 @@@ void mesh_path_expire(struct ieee80211_
  void mesh_pathtbl_unregister(void)
  {
        /* no need for locking during exit path */
 -      mesh_table_free(rcu_dereference_raw(mesh_paths), true);
 -      mesh_table_free(rcu_dereference_raw(mpp_paths), true);
 +      mesh_table_free(rcu_dereference_protected(mesh_paths, 1), true);
 +      mesh_table_free(rcu_dereference_protected(mpp_paths, 1), true);
  }
diff --combined net/mac80211/sta_info.c
index 0bdbf3b8f28b466648f2c5c38b2204f0fc042580,17caba27040b49e9668dcaf869c18165b229fe75..6bc17fb80ee90403e2a91829be237db472971c8a
@@@ -72,7 -72,7 +72,7 @@@ static int sta_info_hash_del(struct iee
        if (!s)
                return -ENOENT;
        if (s == sta) {
 -              rcu_assign_pointer(local->sta_hash[STA_HASH(sta->sta.addr)],
 +              RCU_INIT_POINTER(local->sta_hash[STA_HASH(sta->sta.addr)],
                                   s->hnext);
                return 0;
        }
@@@ -82,7 -82,7 +82,7 @@@
                s = rcu_dereference_protected(s->hnext,
                                        lockdep_is_held(&local->sta_lock));
        if (rcu_access_pointer(s->hnext)) {
 -              rcu_assign_pointer(s->hnext, sta->hnext);
 +              RCU_INIT_POINTER(s->hnext, sta->hnext);
                return 0;
        }
  
@@@ -96,6 -96,27 +96,27 @@@ struct sta_info *sta_info_get(struct ie
        struct ieee80211_local *local = sdata->local;
        struct sta_info *sta;
  
+       sta = rcu_dereference_check(local->sta_hash[STA_HASH(addr)],
+                                   lockdep_is_held(&local->sta_lock) ||
+                                   lockdep_is_held(&local->sta_mtx));
+       while (sta) {
+               if (sta->sdata == sdata && !sta->dummy &&
+                   memcmp(sta->sta.addr, addr, ETH_ALEN) == 0)
+                       break;
+               sta = rcu_dereference_check(sta->hnext,
+                                           lockdep_is_held(&local->sta_lock) ||
+                                           lockdep_is_held(&local->sta_mtx));
+       }
+       return sta;
+ }
+ /* get a station info entry even if it is a dummy station*/
+ struct sta_info *sta_info_get_rx(struct ieee80211_sub_if_data *sdata,
+                             const u8 *addr)
+ {
+       struct ieee80211_local *local = sdata->local;
+       struct sta_info *sta;
        sta = rcu_dereference_check(local->sta_hash[STA_HASH(addr)],
                                    lockdep_is_held(&local->sta_lock) ||
                                    lockdep_is_held(&local->sta_mtx));
@@@ -120,6 -141,32 +141,32 @@@ struct sta_info *sta_info_get_bss(struc
        struct ieee80211_local *local = sdata->local;
        struct sta_info *sta;
  
+       sta = rcu_dereference_check(local->sta_hash[STA_HASH(addr)],
+                                   lockdep_is_held(&local->sta_lock) ||
+                                   lockdep_is_held(&local->sta_mtx));
+       while (sta) {
+               if ((sta->sdata == sdata ||
+                    (sta->sdata->bss && sta->sdata->bss == sdata->bss)) &&
+                   !sta->dummy &&
+                   memcmp(sta->sta.addr, addr, ETH_ALEN) == 0)
+                       break;
+               sta = rcu_dereference_check(sta->hnext,
+                                           lockdep_is_held(&local->sta_lock) ||
+                                           lockdep_is_held(&local->sta_mtx));
+       }
+       return sta;
+ }
+ /*
+  * Get sta info either from the specified interface
+  * or from one of its vlans (including dummy stations)
+  */
+ struct sta_info *sta_info_get_bss_rx(struct ieee80211_sub_if_data *sdata,
+                                 const u8 *addr)
+ {
+       struct ieee80211_local *local = sdata->local;
+       struct sta_info *sta;
        sta = rcu_dereference_check(local->sta_hash[STA_HASH(addr)],
                                    lockdep_is_held(&local->sta_lock) ||
                                    lockdep_is_held(&local->sta_mtx));
@@@ -184,7 -231,7 +231,7 @@@ static void sta_info_hash_add(struct ie
                              struct sta_info *sta)
  {
        sta->hnext = local->sta_hash[STA_HASH(sta->sta.addr)];
 -      rcu_assign_pointer(local->sta_hash[STA_HASH(sta->sta.addr)], sta);
 +      RCU_INIT_POINTER(local->sta_hash[STA_HASH(sta->sta.addr)], sta);
  }
  
  static void sta_unblock(struct work_struct *wk)
@@@ -280,7 -327,8 +327,8 @@@ struct sta_info *sta_info_alloc(struct 
        return sta;
  }
  
- static int sta_info_finish_insert(struct sta_info *sta, bool async)
+ static int sta_info_finish_insert(struct sta_info *sta,
+                               bool async, bool dummy_reinsert)
  {
        struct ieee80211_local *local = sta->local;
        struct ieee80211_sub_if_data *sdata = sta->sdata;
  
        lockdep_assert_held(&local->sta_mtx);
  
-       /* notify driver */
-       if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
-               sdata = container_of(sdata->bss,
-                                    struct ieee80211_sub_if_data,
-                                    u.ap);
-       err = drv_sta_add(local, sdata, &sta->sta);
-       if (err) {
-               if (!async)
-                       return err;
-               printk(KERN_DEBUG "%s: failed to add IBSS STA %pM to driver (%d)"
-                                 " - keeping it anyway.\n",
-                      sdata->name, sta->sta.addr, err);
-       } else {
-               sta->uploaded = true;
+       if (!sta->dummy || dummy_reinsert) {
+               /* notify driver */
+               if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
+                       sdata = container_of(sdata->bss,
+                                            struct ieee80211_sub_if_data,
+                                            u.ap);
+               err = drv_sta_add(local, sdata, &sta->sta);
+               if (err) {
+                       if (!async)
+                               return err;
+                       printk(KERN_DEBUG "%s: failed to add IBSS STA %pM to "
+                                         "driver (%d) - keeping it anyway.\n",
+                              sdata->name, sta->sta.addr, err);
+               } else {
+                       sta->uploaded = true;
  #ifdef CONFIG_MAC80211_VERBOSE_DEBUG
-               if (async)
-                       wiphy_debug(local->hw.wiphy,
-                                   "Finished adding IBSS STA %pM\n",
-                                   sta->sta.addr);
+                       if (async)
+                               wiphy_debug(local->hw.wiphy,
+                                           "Finished adding IBSS STA %pM\n",
+                                           sta->sta.addr);
  #endif
+               }
+               sdata = sta->sdata;
        }
  
-       sdata = sta->sdata;
+       if (!dummy_reinsert) {
+               if (!async) {
+                       local->num_sta++;
+                       local->sta_generation++;
+                       smp_mb();
  
-       if (!async) {
-               local->num_sta++;
-               local->sta_generation++;
-               smp_mb();
+                       /* make the station visible */
+                       spin_lock_irqsave(&local->sta_lock, flags);
+                       sta_info_hash_add(local, sta);
+                       spin_unlock_irqrestore(&local->sta_lock, flags);
+               }
  
-               /* make the station visible */
-               spin_lock_irqsave(&local->sta_lock, flags);
-               sta_info_hash_add(local, sta);
-               spin_unlock_irqrestore(&local->sta_lock, flags);
+               list_add(&sta->list, &local->sta_list);
+       } else {
+               sta->dummy = false;
        }
  
-       list_add(&sta->list, &local->sta_list);
-       ieee80211_sta_debugfs_add(sta);
-       rate_control_add_sta_debugfs(sta);
-       memset(&sinfo, 0, sizeof(sinfo));
-       sinfo.filled = 0;
-       sinfo.generation = local->sta_generation;
-       cfg80211_new_sta(sdata->dev, sta->sta.addr, &sinfo, GFP_KERNEL);
+       if (!sta->dummy) {
+               ieee80211_sta_debugfs_add(sta);
+               rate_control_add_sta_debugfs(sta);
  
+               memset(&sinfo, 0, sizeof(sinfo));
+               sinfo.filled = 0;
+               sinfo.generation = local->sta_generation;
+               cfg80211_new_sta(sdata->dev, sta->sta.addr, &sinfo, GFP_KERNEL);
+       }
  
        return 0;
  }
@@@ -351,7 -406,7 +406,7 @@@ static void sta_info_finish_pending(str
                list_del(&sta->list);
                spin_unlock_irqrestore(&local->sta_lock, flags);
  
-               sta_info_finish_insert(sta, true);
+               sta_info_finish_insert(sta, true, false);
  
                spin_lock_irqsave(&local->sta_lock, flags);
        }
@@@ -368,106 -423,117 +423,117 @@@ static void sta_info_finish_work(struc
        mutex_unlock(&local->sta_mtx);
  }
  
int sta_info_insert_rcu(struct sta_info *sta) __acquires(RCU)
static int sta_info_insert_check(struct sta_info *sta)
  {
-       struct ieee80211_local *local = sta->local;
        struct ieee80211_sub_if_data *sdata = sta->sdata;
-       unsigned long flags;
-       int err = 0;
  
        /*
         * Can't be a WARN_ON because it can be triggered through a race:
         * something inserts a STA (on one CPU) without holding the RTNL
         * and another CPU turns off the net device.
         */
-       if (unlikely(!ieee80211_sdata_running(sdata))) {
-               err = -ENETDOWN;
-               rcu_read_lock();
-               goto out_free;
-       }
+       if (unlikely(!ieee80211_sdata_running(sdata)))
+               return -ENETDOWN;
  
        if (WARN_ON(compare_ether_addr(sta->sta.addr, sdata->vif.addr) == 0 ||
-                   is_multicast_ether_addr(sta->sta.addr))) {
-               err = -EINVAL;
+                   is_multicast_ether_addr(sta->sta.addr)))
+               return -EINVAL;
+       return 0;
+ }
+ static int sta_info_insert_ibss(struct sta_info *sta) __acquires(RCU)
+ {
+       struct ieee80211_local *local = sta->local;
+       struct ieee80211_sub_if_data *sdata = sta->sdata;
+       unsigned long flags;
+       spin_lock_irqsave(&local->sta_lock, flags);
+       /* check if STA exists already */
+       if (sta_info_get_bss_rx(sdata, sta->sta.addr)) {
+               spin_unlock_irqrestore(&local->sta_lock, flags);
                rcu_read_lock();
-               goto out_free;
+               return -EEXIST;
        }
  
-       /*
-        * In ad-hoc mode, we sometimes need to insert stations
-        * from tasklet context from the RX path. To avoid races,
-        * always do so in that case -- see the comment below.
-        */
-       if (sdata->vif.type == NL80211_IFTYPE_ADHOC) {
-               spin_lock_irqsave(&local->sta_lock, flags);
-               /* check if STA exists already */
-               if (sta_info_get_bss(sdata, sta->sta.addr)) {
-                       spin_unlock_irqrestore(&local->sta_lock, flags);
-                       rcu_read_lock();
-                       err = -EEXIST;
-                       goto out_free;
-               }
-               local->num_sta++;
-               local->sta_generation++;
-               smp_mb();
-               sta_info_hash_add(local, sta);
+       local->num_sta++;
+       local->sta_generation++;
+       smp_mb();
+       sta_info_hash_add(local, sta);
  
-               list_add_tail(&sta->list, &local->sta_pending_list);
+       list_add_tail(&sta->list, &local->sta_pending_list);
  
-               rcu_read_lock();
-               spin_unlock_irqrestore(&local->sta_lock, flags);
+       rcu_read_lock();
+       spin_unlock_irqrestore(&local->sta_lock, flags);
  
  #ifdef CONFIG_MAC80211_VERBOSE_DEBUG
-               wiphy_debug(local->hw.wiphy, "Added IBSS STA %pM\n",
-                           sta->sta.addr);
+       wiphy_debug(local->hw.wiphy, "Added IBSS STA %pM\n",
+                       sta->sta.addr);
  #endif /* CONFIG_MAC80211_VERBOSE_DEBUG */
  
-               ieee80211_queue_work(&local->hw, &local->sta_finish_work);
+       ieee80211_queue_work(&local->hw, &local->sta_finish_work);
  
-               return 0;
-       }
+       return 0;
+ }
+ /*
+  * should be called with sta_mtx locked
+  * this function replaces the mutex lock
+  * with a RCU lock
+  */
+ static int sta_info_insert_non_ibss(struct sta_info *sta) __acquires(RCU)
+ {
+       struct ieee80211_local *local = sta->local;
+       struct ieee80211_sub_if_data *sdata = sta->sdata;
+       unsigned long flags;
+       struct sta_info *exist_sta;
+       bool dummy_reinsert = false;
+       int err = 0;
+       lockdep_assert_held(&local->sta_mtx);
  
        /*
         * On first glance, this will look racy, because the code
-        * below this point, which inserts a station with sleeping,
+        * in this function, which inserts a station with sleeping,
         * unlocks the sta_lock between checking existence in the
         * hash table and inserting into it.
         *
         * However, it is not racy against itself because it keeps
-        * the mutex locked. It still seems to race against the
-        * above code that atomically inserts the station... That,
-        * however, is not true because the above code can only
-        * be invoked for IBSS interfaces, and the below code will
-        * not be -- and the two do not race against each other as
-        * the hash table also keys off the interface.
+        * the mutex locked.
         */
  
-       might_sleep();
-       mutex_lock(&local->sta_mtx);
        spin_lock_irqsave(&local->sta_lock, flags);
-       /* check if STA exists already */
-       if (sta_info_get_bss(sdata, sta->sta.addr)) {
-               spin_unlock_irqrestore(&local->sta_lock, flags);
-               mutex_unlock(&local->sta_mtx);
-               rcu_read_lock();
-               err = -EEXIST;
-               goto out_free;
+       /*
+        * check if STA exists already.
+        * only accept a scenario of a second call to sta_info_insert_non_ibss
+        * with a dummy station entry that was inserted earlier
+        * in that case - assume that the dummy station flag should
+        * be removed.
+        */
+       exist_sta = sta_info_get_bss_rx(sdata, sta->sta.addr);
+       if (exist_sta) {
+               if (exist_sta == sta && sta->dummy) {
+                       dummy_reinsert = true;
+               } else {
+                       spin_unlock_irqrestore(&local->sta_lock, flags);
+                       mutex_unlock(&local->sta_mtx);
+                       rcu_read_lock();
+                       return -EEXIST;
+               }
        }
  
        spin_unlock_irqrestore(&local->sta_lock, flags);
  
-       err = sta_info_finish_insert(sta, false);
+       err = sta_info_finish_insert(sta, false, dummy_reinsert);
        if (err) {
                mutex_unlock(&local->sta_mtx);
                rcu_read_lock();
-               goto out_free;
+               return err;
        }
  
  #ifdef CONFIG_MAC80211_VERBOSE_DEBUG
-       wiphy_debug(local->hw.wiphy, "Inserted STA %pM\n", sta->sta.addr);
+       wiphy_debug(local->hw.wiphy, "Inserted %sSTA %pM\n",
+                       sta->dummy ? "dummy " : "", sta->sta.addr);
  #endif /* CONFIG_MAC80211_VERBOSE_DEBUG */
  
        /* move reference to rcu-protected */
        if (ieee80211_vif_is_mesh(&sdata->vif))
                mesh_accept_plinks_update(sdata);
  
+       return 0;
+ }
+ int sta_info_insert_rcu(struct sta_info *sta) __acquires(RCU)
+ {
+       struct ieee80211_local *local = sta->local;
+       struct ieee80211_sub_if_data *sdata = sta->sdata;
+       int err = 0;
+       err = sta_info_insert_check(sta);
+       if (err) {
+               rcu_read_lock();
+               goto out_free;
+       }
+       /*
+        * In ad-hoc mode, we sometimes need to insert stations
+        * from tasklet context from the RX path. To avoid races,
+        * always do so in that case -- see the comment below.
+        */
+       if (sdata->vif.type == NL80211_IFTYPE_ADHOC) {
+               err = sta_info_insert_ibss(sta);
+               if (err)
+                       goto out_free;
+               return 0;
+       }
+       /*
+        * It might seem that the function called below is in race against
+        * the function call above that atomically inserts the station... That,
+        * however, is not true because the above code can only
+        * be invoked for IBSS interfaces, and the below code will
+        * not be -- and the two do not race against each other as
+        * the hash table also keys off the interface.
+        */
+       might_sleep();
+       mutex_lock(&local->sta_mtx);
+       err = sta_info_insert_non_ibss(sta);
+       if (err)
+               goto out_free;
        return 0;
   out_free:
        BUG_ON(!err);
@@@ -493,6 -604,25 +604,25 @@@ int sta_info_insert(struct sta_info *st
        return err;
  }
  
+ /* Caller must hold sta->local->sta_mtx */
+ int sta_info_reinsert(struct sta_info *sta)
+ {
+       struct ieee80211_local *local = sta->local;
+       int err = 0;
+       err = sta_info_insert_check(sta);
+       if (err) {
+               mutex_unlock(&local->sta_mtx);
+               return err;
+       }
+       might_sleep();
+       err = sta_info_insert_non_ibss(sta);
+       rcu_read_unlock();
+       return err;
+ }
  static inline void __bss_tim_set(struct ieee80211_if_ap *bss, u16 aid)
  {
        /*
@@@ -673,7 -803,7 +803,7 @@@ static int __must_check __sta_info_dest
        local->sta_generation++;
  
        if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
 -              rcu_assign_pointer(sdata->u.vlan.sta, NULL);
 +              RCU_INIT_POINTER(sdata->u.vlan.sta, NULL);
  
        if (sta->uploaded) {
                if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
@@@ -733,7 -863,7 +863,7 @@@ int sta_info_destroy_addr(struct ieee80
        int ret;
  
        mutex_lock(&sdata->local->sta_mtx);
-       sta = sta_info_get(sdata, addr);
+       sta = sta_info_get_rx(sdata, addr);
        ret = __sta_info_destroy(sta);
        mutex_unlock(&sdata->local->sta_mtx);
  
@@@ -747,7 -877,7 +877,7 @@@ int sta_info_destroy_addr_bss(struct ie
        int ret;
  
        mutex_lock(&sdata->local->sta_mtx);
-       sta = sta_info_get_bss(sdata, addr);
+       sta = sta_info_get_bss_rx(sdata, addr);
        ret = __sta_info_destroy(sta);
        mutex_unlock(&sdata->local->sta_mtx);