Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 23 Oct 2010 18:47:02 +0000 (11:47 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 23 Oct 2010 18:47:02 +0000 (11:47 -0700)
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6: (1699 commits)
  bnx2/bnx2x: Unsupported Ethtool operations should return -EINVAL.
  vlan: Calling vlan_hwaccel_do_receive() is always valid.
  tproxy: use the interface primary IP address as a default value for --on-ip
  tproxy: added IPv6 support to the socket match
  cxgb3: function namespace cleanup
  tproxy: added IPv6 support to the TPROXY target
  tproxy: added IPv6 socket lookup function to nf_tproxy_core
  be2net: Changes to use only priority codes allowed by f/w
  tproxy: allow non-local binds of IPv6 sockets if IP_TRANSPARENT is enabled
  tproxy: added tproxy sockopt interface in the IPV6 layer
  tproxy: added udp6_lib_lookup function
  tproxy: added const specifiers to udp lookup functions
  tproxy: split off ipv6 defragmentation to a separate module
  l2tp: small cleanup
  nf_nat: restrict ICMP translation for embedded header
  can: mcp251x: fix generation of error frames
  can: mcp251x: fix endless loop in interrupt handler if CANINTF_MERRF is set
  can-raw: add msg_flags to distinguish local traffic
  9p: client code cleanup
  rds: make local functions/variables static
  ...

Fix up conflicts in net/core/dev.c, drivers/net/pcmcia/smc91c92_cs.c and
drivers/net/wireless/ath/ath9k/debug.c as per David

57 files changed:
1  2 
Documentation/feature-removal-schedule.txt
MAINTAINERS
arch/arm/mach-omap2/board-omap3pandora.c
drivers/bluetooth/hci_ldisc.c
drivers/net/3c527.c
drivers/net/Kconfig
drivers/net/bfin_mac.c
drivers/net/cxgb4/cxgb4_main.c
drivers/net/irda/sir_dev.c
drivers/net/pcmcia/3c574_cs.c
drivers/net/pcmcia/3c589_cs.c
drivers/net/pcmcia/axnet_cs.c
drivers/net/pcmcia/com20020_cs.c
drivers/net/pcmcia/fmvj18x_cs.c
drivers/net/pcmcia/ibmtr_cs.c
drivers/net/pcmcia/nmclan_cs.c
drivers/net/pcmcia/pcnet_cs.c
drivers/net/pcmcia/smc91c92_cs.c
drivers/net/pcmcia/xirc2ps_cs.c
drivers/net/ppp_generic.c
drivers/net/usb/hso.c
drivers/net/wireless/airo.c
drivers/net/wireless/ath/ath5k/debug.c
drivers/net/wireless/ath/ath9k/debug.c
drivers/net/wireless/ath/ath9k/htc_drv_main.c
drivers/net/wireless/iwlwifi/iwl-3945-rs.c
drivers/net/wireless/iwlwifi/iwl-agn-rs.c
drivers/net/wireless/iwlwifi/iwl-debugfs.c
drivers/net/wireless/libertas/if_cs.c
drivers/net/wireless/ray_cs.c
drivers/net/wireless/rt2x00/rt2x00debug.c
drivers/net/wireless/wl1251/debugfs.c
drivers/net/wireless/wl3501_cs.c
drivers/s390/scsi/zfcp_qdio.c
drivers/scsi/bnx2i/bnx2i.h
drivers/scsi/bnx2i/bnx2i_hwi.c
drivers/vhost/net.c
drivers/vhost/vhost.c
drivers/vhost/vhost.h
include/linux/netfilter/nfnetlink_conntrack.h
include/linux/pci_ids.h
net/bluetooth/rfcomm/tty.c
net/core/datagram.c
net/core/dev.c
net/core/skbuff.c
net/core/sock.c
net/ipv4/netfilter/nf_nat_core.c
net/mac80211/debugfs.c
net/mac80211/debugfs_key.c
net/mac80211/debugfs_netdev.c
net/mac80211/debugfs_sta.c
net/mac80211/rate.c
net/mac80211/rc80211_pid_debugfs.c
net/netfilter/core.c
net/netfilter/nf_conntrack_netlink.c
net/sctp/probe.c
net/socket.c

@@@ -386,6 -386,34 +386,6 @@@ Who:      Tejun Heo <tj@kernel.org
  
  ----------------------------
  
 -What: Support for VMware's guest paravirtuliazation technique [VMI] will be
 -      dropped.
 -When: 2.6.37 or earlier.
 -Why:  With the recent innovations in CPU hardware acceleration technologies
 -      from Intel and AMD, VMware ran a few experiments to compare these
 -      techniques to guest paravirtualization technique on VMware's platform.
 -      These hardware assisted virtualization techniques have outperformed the
 -      performance benefits provided by VMI in most of the workloads. VMware
 -      expects that these hardware features will be ubiquitous in a couple of
 -      years, as a result, VMware has started a phased retirement of this
 -      feature from the hypervisor. We will be removing this feature from the
 -      Kernel too. Right now we are targeting 2.6.37 but can retire earlier if
 -      technical reasons (read opportunity to remove major chunk of pvops)
 -      arise.
 -
 -      Please note that VMI has always been an optimization and non-VMI kernels
 -      still work fine on VMware's platform.
 -      Latest versions of VMware's product which support VMI are,
 -      Workstation 7.0 and VSphere 4.0 on ESX side, future maintainence
 -      releases for these products will continue supporting VMI.
 -
 -      For more details about VMI retirement take a look at this,
 -      http://blogs.vmware.com/guestosguide/2009/09/vmi-retirement.html
 -
 -Who:  Alok N Kataria <akataria@vmware.com>
 -
 -----------------------------
 -
  What: Support for lcd_switch and display_get in asus-laptop driver
  When: March 2010
  Why:  These two features use non-standard interfaces. There are the
@@@ -536,3 -564,12 +536,12 @@@ Who:     FUJITA Tomonori <fujita.tomonori@l
  
  ----------------------------
  
+ What: iwlwifi disable_hw_scan module parameters
+ When: 2.6.40
+ Why:  Hareware scan is the prefer method for iwlwifi devices for
+       scanning operation. Remove software scan support for all the
+       iwlwifi devices.
+ Who:  Wey-Yi Guy <wey-yi.w.guy@intel.com>
+ ----------------------------
diff --combined MAINTAINERS
@@@ -157,11 -157,9 +157,11 @@@ S:       Maintaine
  F:    drivers/net/r8169.c
  
  8250/16?50 (AND CLONE UARTS) SERIAL DRIVER
 +M:    Greg Kroah-Hartman <gregkh@suse.de>
  L:    linux-serial@vger.kernel.org
  W:    http://serial.sourceforge.net
 -S:    Orphan
 +S:    Maintained
 +T:    quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
  F:    drivers/serial/8250*
  F:    include/linux/serial_8250.h
  
@@@ -992,23 -990,11 +992,23 @@@ S:      Supporte
  F:    arch/arm/mach-shmobile/
  F:    drivers/sh/
  
 +ARM/TELECHIPS ARM ARCHITECTURE
 +M:    "Hans J. Koch" <hjk@linutronix.de>
 +L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +S:    Maintained
 +F:    arch/arm/plat-tcc/
 +F:    arch/arm/mach-tcc8k/
 +
  ARM/TECHNOLOGIC SYSTEMS TS7250 MACHINE SUPPORT
  M:    Lennert Buytenhek <kernel@wantstofly.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  
 +ARM/TETON BGA MACHINE SUPPORT
 +M:    Mark F. Brown <mark.brown314@gmail.com>
 +L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +S:    Maintained
 +
  ARM/THECUS N2100 MACHINE SUPPORT
  M:    Lennert Buytenhek <kernel@wantstofly.org>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -1151,6 -1137,13 +1151,13 @@@ W:    http://wireless.kernel.org/en/users/
  S:    Maintained
  F:    drivers/net/wireless/ath/ar9170/
  
+ CARL9170 LINUX COMMUNITY WIRELESS DRIVER
+ M:    Christian Lamparter <chunkeey@googlemail.com>
+ L:    linux-wireless@vger.kernel.org
+ W:    http://wireless.kernel.org/en/users/Drivers/carl9170
+ S:    Maintained
+ F:    drivers/net/wireless/ath/carl9170/
  ATK0110 HWMON DRIVER
  M:    Luca Tettamanti <kronos.it@gmail.com>
  L:    lm-sensors@lm-sensors.org
@@@ -1375,16 -1368,19 +1382,19 @@@ F:   drivers/mtd/devices/block2mtd.
  
  BLUETOOTH DRIVERS
  M:    Marcel Holtmann <marcel@holtmann.org>
+ M:    Gustavo F. Padovan <padovan@profusion.mobi>
  L:    linux-bluetooth@vger.kernel.org
  W:    http://www.bluez.org/
+ T:    git git://git.kernel.org/pub/scm/linux/kernel/git/padovan/bluetooth-2.6.git
  S:    Maintained
  F:    drivers/bluetooth/
  
  BLUETOOTH SUBSYSTEM
  M:    Marcel Holtmann <marcel@holtmann.org>
+ M:    Gustavo F. Padovan <padovan@profusion.mobi>
  L:    linux-bluetooth@vger.kernel.org
  W:    http://www.bluez.org/
- T:    git git://git.kernel.org/pub/scm/linux/kernel/git/holtmann/bluetooth-2.6.git
+ T:    git git://git.kernel.org/pub/scm/linux/kernel/git/padovan/bluetooth-2.6.git
  S:    Maintained
  F:    net/bluetooth/
  F:    include/net/bluetooth/
@@@ -1429,6 -1425,13 +1439,13 @@@ L:    linux-scsi@vger.kernel.or
  S:    Supported
  F:    drivers/scsi/bfa/
  
+ BROCADE BNA 10 GIGABIT ETHERNET DRIVER
+ M:    Rasesh Mody <rmody@brocade.com>
+ M:    Debashis Dutt <ddutt@brocade.com>
+ L:    netdev@vger.kernel.org
+ S:    Supported
+ F:    drivers/net/bna/
  BSG (block layer generic sg v4 driver)
  M:    FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
  L:    linux-scsi@vger.kernel.org
@@@ -1541,8 -1544,6 +1558,8 @@@ T:      git git://git.kernel.org/pub/scm/lin
  S:    Supported
  F:    Documentation/filesystems/ceph.txt
  F:    fs/ceph
 +F:    net/ceph
 +F:    include/linux/ceph
  
  CERTIFIED WIRELESS USB (WUSB) SUBSYSTEM:
  M:    David Vrabel <david.vrabel@csr.com>
@@@ -1586,9 -1587,9 +1603,9 @@@ S:      Supporte
  F:    scripts/checkpatch.pl
  
  CISCO VIC ETHERNET NIC DRIVER
- M:    Scott Feldman <scofeldm@cisco.com>
  M:    Vasanthy Kolluri <vkolluri@cisco.com>
  M:    Roopa Prabhu <roprabhu@cisco.com>
+ M:    David Wang <dwang2@cisco.com>
  S:    Supported
  F:    drivers/net/enic/
  
@@@ -2066,16 -2067,14 +2083,16 @@@ F:   drivers/block/drbd
  F:    lib/lru_cache.c
  F:    Documentation/blockdev/drbd/
  
 -DRIVER CORE, KOBJECTS, AND SYSFS
 +DRIVER CORE, KOBJECTS, DEBUGFS AND SYSFS
  M:    Greg Kroah-Hartman <gregkh@suse.de>
  T:    quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
  S:    Supported
  F:    Documentation/kobject.txt
  F:    drivers/base/
  F:    fs/sysfs/
 +F:    fs/debugfs/
  F:    include/linux/kobj*
 +F:    include/linux/debugfs.h
  F:    lib/kobj*
  
  DRM DRIVERS
@@@ -2922,6 -2921,12 +2939,12 @@@ M:    Brian King <brking@us.ibm.com
  S:    Supported
  F:    drivers/scsi/ipr.*
  
+ IBM Power Virtual Ethernet Device Driver
+ M:    Santiago Leon <santil@linux.vnet.ibm.com>
+ L:    netdev@vger.kernel.org
+ S:    Supported
+ F:    drivers/net/ibmveth.*
  IBM ServeRAID RAID DRIVER
  P:    Jack Hammer
  M:    Dave Jeffery <ipslinux@adaptec.com>
@@@ -3257,12 -3262,6 +3280,12 @@@ F:    drivers/net/irda
  F:    include/net/irda/
  F:    net/irda/
  
 +IRQ SUBSYSTEM
 +M:    Thomas Gleixner <tglx@linutronix.de>
 +S:    Maintained
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git irq/core
 +F:    kernel/irq/
 +
  ISAPNP
  M:    Jaroslav Kysela <perex@perex.cz>
  S:    Maintained
@@@ -3355,12 -3354,6 +3378,12 @@@ F:    fs/jbd*
  F:    include/linux/ext*jbd*.h
  F:    include/linux/jbd*.h
  
 +JSM Neo PCI based serial card
 +M:    Breno Leitao <leitao@linux.vnet.ibm.com>
 +L:    linux-serial@vger.kernel.org
 +S:    Maintained
 +F:    drivers/serial/jsm/
 +
  K8TEMP HARDWARE MONITORING DRIVER
  M:    Rudolf Marek <r.marek@assembler.cz>
  L:    lm-sensors@lm-sensors.org
@@@ -4392,13 -4385,12 +4415,12 @@@ F:   Documentation/filesystems/dlmfs.tx
  F:    fs/ocfs2/
  
  ORINOCO DRIVER
- M:    Pavel Roskin <proski@gnu.org>
- M:    David Gibson <hermes@gibson.dropbear.id.au>
  L:    linux-wireless@vger.kernel.org
  L:    orinoco-users@lists.sourceforge.net
  L:    orinoco-devel@lists.sourceforge.net
+ W:    http://linuxwireless.org/en/users/Drivers/orinoco
  W:    http://www.nongnu.org/orinoco/
- S:    Maintained
+ S:    Orphan
  F:    drivers/net/wireless/orinoco/
  
  OSD LIBRARY and FILESYSTEM
@@@ -4586,6 -4578,14 +4608,14 @@@ L:    linux-abi-devel@lists.sourceforge.ne
  S:    Maintained
  F:    include/linux/personality.h
  
+ PHONET PROTOCOL
+ M:    Remi Denis-Courmont <remi.denis-courmont@nokia.com>
+ S:    Supported
+ F:    Documentation/networking/phonet.txt
+ F:    include/linux/phonet.h
+ F:    include/net/phonet/
+ F:    net/phonet/
  PHRAM MTD DRIVER
  M:    Joern Engel <joern@lazybastard.org>
  L:    linux-mtd@lists.infradead.org
@@@ -4835,15 -4835,6 +4865,15 @@@ F:    fs/qnx4
  F:    include/linux/qnx4_fs.h
  F:    include/linux/qnxtypes.h
  
 +RADOS BLOCK DEVICE (RBD)
 +F:    include/linux/qnxtypes.h
 +M:    Yehuda Sadeh <yehuda@hq.newdream.net>
 +M:    Sage Weil <sage@newdream.net>
 +M:    ceph-devel@vger.kernel.org
 +S:    Supported
 +F:    drivers/block/rbd.c
 +F:    drivers/block/rbd_types.h
 +
  RADEON FRAMEBUFFER DISPLAY DRIVER
  M:    Benjamin Herrenschmidt <benh@kernel.crashing.org>
  L:    linux-fbdev@vger.kernel.org
@@@ -5973,14 -5964,6 +6003,14 @@@ S:    Maintaine
  F:    Documentation/usb/acm.txt
  F:    drivers/usb/class/cdc-acm.*
  
 +USB ATTACHED SCSI
 +M:    Matthew Wilcox <willy@linux.intel.com>
 +M:    Sarah Sharp <sarah.a.sharp@linux.intel.com>
 +L:    linux-usb@vger.kernel.org
 +L:    linux-scsi@vger.kernel.org
 +S:    Supported
 +F:    drivers/usb/storage/uas.c
 +
  USB BLOCK DRIVER (UB ub)
  M:    Pete Zaitcev <zaitcev@redhat.com>
  L:    linux-usb@vger.kernel.org
@@@ -6489,21 -6472,21 +6519,21 @@@ S:   Maintaine
  F:    drivers/input/misc/wistron_btns.c
  
  WL1251 WIRELESS DRIVER
- M:    Kalle Valo <kalle.valo@iki.fi>
+ M:    Kalle Valo <kvalo@adurom.com>
  L:    linux-wireless@vger.kernel.org
  W:    http://wireless.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git
  S:    Maintained
- F:    drivers/net/wireless/wl12xx/*
- X:    drivers/net/wireless/wl12xx/wl1271*
+ F:    drivers/net/wireless/wl1251/*
  
  WL1271 WIRELESS DRIVER
  M:    Luciano Coelho <luciano.coelho@nokia.com>
  L:    linux-wireless@vger.kernel.org
  W:    http://wireless.kernel.org
- T:    git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git
+ T:    git git://git.kernel.org/pub/scm/linux/kernel/git/luca/wl12xx.git
  S:    Maintained
  F:    drivers/net/wireless/wl12xx/wl1271*
+ F:    include/linux/wl12xx.h
  
  WL3501 WIRELESS PCMCIA CARD DRIVER
  M:    Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
@@@ -6650,6 -6633,20 +6680,20 @@@ M:    "Maciej W. Rozycki" <macro@linux-mip
  S:    Maintained
  F:    drivers/serial/zs.*
  
+ GRE DEMULTIPLEXER DRIVER
+ M:    Dmitry Kozlov <xeb@mail.ru>
+ L:    netdev@vger.kernel.org
+ S:    Maintained
+ F:    net/ipv4/gre.c
+ F:    include/net/gre.h
+ PPTP DRIVER
+ M:    Dmitry Kozlov <xeb@mail.ru>
+ L:    netdev@vger.kernel.org
+ S:    Maintained
+ F:    drivers/net/pptp.c
+ W:    http://sourceforge.net/projects/accel-pptp
  THE REST
  M:    Linus Torvalds <torvalds@linux-foundation.org>
  L:    linux-kernel@vger.kernel.org
@@@ -25,7 -25,7 +25,7 @@@
  #include <linux/spi/ads7846.h>
  #include <linux/regulator/machine.h>
  #include <linux/i2c/twl.h>
- #include <linux/spi/wl12xx.h>
+ #include <linux/wl12xx.h>
  #include <linux/mtd/partitions.h>
  #include <linux/mtd/nand.h>
  #include <linux/leds.h>
@@@ -717,6 -717,8 +717,6 @@@ static void __init omap3pandora_init(vo
  }
  
  MACHINE_START(OMAP3_PANDORA, "Pandora Handheld Console")
 -      .phys_io        = 0x48000000,
 -      .io_pg_offst    = ((0xfa000000) >> 18) & 0xfffc,
        .boot_params    = 0x80000100,
        .map_io         = omap3_map_io,
        .reserve        = omap_reserve,
@@@ -101,7 -101,7 +101,7 @@@ static inline void hci_uart_tx_complete
                break;
  
        case HCI_SCODATA_PKT:
-               hdev->stat.cmd_tx++;
+               hdev->stat.sco_tx++;
                break;
        }
  }
@@@ -256,16 -256,9 +256,16 @@@ static int hci_uart_tty_open(struct tty
  
        BT_DBG("tty %p", tty);
  
 +      /* FIXME: This btw is bogus, nothing requires the old ldisc to clear
 +         the pointer */
        if (hu)
                return -EEXIST;
  
 +      /* Error if the tty has no write op instead of leaving an exploitable
 +         hole */
 +      if (tty->ops->write == NULL)
 +              return -EOPNOTSUPP;
 +
        if (!(hu = kzalloc(sizeof(struct hci_uart), GFP_KERNEL))) {
                BT_ERR("Can't allocate control structure");
                return -ENFILE;
diff --combined drivers/net/3c527.c
@@@ -443,7 -443,7 +443,7 @@@ static int __init mc32_probe1(struct ne
         *      Grab the IRQ
         */
  
-       err = request_irq(dev->irq, mc32_interrupt, IRQF_SHARED | IRQF_SAMPLE_RANDOM, DRV_NAME, dev);
+       err = request_irq(dev->irq, mc32_interrupt, IRQF_SHARED, DRV_NAME, dev);
        if (err) {
                release_region(dev->base_addr, MC32_IO_EXTENT);
                pr_err("%s: unable to get IRQ %d.\n", DRV_NAME, dev->irq);
        lp->tx_len              = lp->exec_box->data[9];   /* Transmit list count */
        lp->rx_len              = lp->exec_box->data[11];  /* Receive list count */
  
 -      init_MUTEX_LOCKED(&lp->cmd_mutex);
 +      sema_init(&lp->cmd_mutex, 0);
        init_completion(&lp->execution_cmd);
        init_completion(&lp->xceiver_cmd);
  
diff --combined drivers/net/Kconfig
@@@ -2,9 -2,6 +2,9 @@@
  # Network device configuration
  #
  
 +config HAVE_NET_MACB
 +      bool
 +
  menuconfig NETDEVICES
        default y if UML
        depends on NET
@@@ -180,6 -177,13 +180,13 @@@ config NET_SB100
  
  source "drivers/net/arcnet/Kconfig"
  
+ config MII
+       tristate "Generic Media Independent Interface device support"
+       help
+         Most ethernet controllers have MII transceiver either as an external
+         or internal device.  It is safe to say Y or M here even if your
+         ethernet card lacks MII.
  source "drivers/net/phy/Kconfig"
  
  #
@@@ -215,16 -219,9 +222,9 @@@ menuconfig NET_ETHERNE
  
  if NET_ETHERNET
  
- config MII
-       tristate "Generic Media Independent Interface device support"
-       help
-         Most ethernet controllers have MII transceiver either as an external
-         or internal device.  It is safe to say Y or M here even if your
-         ethernet card lack MII.
  config MACB
        tristate "Atmel MACB support"
 -      depends on AVR32 || ARCH_AT91SAM9260 || ARCH_AT91SAM9263 || ARCH_AT91SAM9G20 || ARCH_AT91SAM9G45 || ARCH_AT91CAP9
 +      depends on HAVE_NET_MACB
        select PHYLIB
        help
          The Atmel MACB ethernet interface is found on many AT32 and AT91
@@@ -2518,6 -2515,18 +2518,18 @@@ config S6GMA
  
  source "drivers/net/stmmac/Kconfig"
  
+ config PCH_GBE
+       tristate "PCH Gigabit Ethernet"
+       depends on PCI
+       ---help---
+         This is a gigabit ethernet driver for Topcliff PCH.
+         Topcliff PCH is the platform controller hub that is used in Intel's
+         general embedded platform.
+         Topcliff PCH has Gigabit Ethernet interface.
+         Using this interface, it is able to access system devices connected
+         to Gigabit Ethernet.
+         This driver enables Gigabit Ethernet function.
  endif # NETDEV_1000
  
  #
@@@ -2872,6 -2881,20 +2884,20 @@@ config QLG
          To compile this driver as a module, choose M here: the module
          will be called qlge.
  
+ config BNA
+         tristate "Brocade 1010/1020 10Gb Ethernet Driver support"
+         depends on PCI
+         ---help---
+           This driver supports Brocade 1010/1020 10Gb CEE capable Ethernet
+           cards.
+           To compile this driver as a module, choose M here: the module
+           will be called bna.
+           For general information and support, go to the Brocade support
+           website at:
+           <http://support.brocade.com>
  source "drivers/net/sfc/Kconfig"
  
  source "drivers/net/benet/Kconfig"
@@@ -3205,6 -3228,17 +3231,17 @@@ config PPPO
          which contains instruction on how to use this driver (under 
          the heading "Kernel mode PPPoE").
  
+ config PPTP
+       tristate "PPP over IPv4 (PPTP) (EXPERIMENTAL)"
+       depends on EXPERIMENTAL && PPP && NET_IPGRE_DEMUX
+       help
+         Support for PPP over IPv4.(Point-to-Point Tunneling Protocol)
+         This driver requires pppd plugin to work in client mode or
+         modified pptpd (poptop) to work in server mode.
+         See http://accel-pptp.sourceforge.net/ for information how to
+         utilize this module.
  config PPPOATM
        tristate "PPP over ATM"
        depends on ATM && PPP
diff --combined drivers/net/bfin_mac.c
@@@ -38,7 -38,6 +38,7 @@@
  #include <asm/blackfin.h>
  #include <asm/cacheflush.h>
  #include <asm/portmux.h>
 +#include <mach/pll.h>
  
  #include "bfin_mac.h"
  
@@@ -804,15 -803,14 +804,14 @@@ static void bfin_dump_hwtamp(char *s, k
  static void bfin_tx_hwtstamp(struct net_device *netdev, struct sk_buff *skb)
  {
        struct bfin_mac_local *lp = netdev_priv(netdev);
-       union skb_shared_tx *shtx = skb_tx(skb);
  
-       if (shtx->hardware) {
+       if (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) {
                int timeout_cnt = MAX_TIMEOUT_CNT;
  
                /* When doing time stamping, keep the connection to the socket
                 * a while longer
                 */
-               shtx->in_progress = 1;
+               skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
  
                /*
                 * The timestamping is done at the EMAC module's MII/RMII interface
@@@ -992,7 -990,6 +991,6 @@@ static int bfin_mac_hard_start_xmit(str
        struct bfin_mac_local *lp = netdev_priv(dev);
        u16 *data;
        u32 data_align = (unsigned long)(skb->data) & 0x3;
-       union skb_shared_tx *shtx = skb_tx(skb);
  
        current_tx_ptr->skb = skb;
  
                 * of this field are the length of the packet payload in bytes and the higher
                 * 4 bits are the timestamping enable field.
                 */
-               if (shtx->hardware)
+               if (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)
                        *data |= 0x1000;
  
                current_tx_ptr->desc_a.start_addr = (u32)data;
        } else {
                *((u16 *)(current_tx_ptr->packet)) = (u16)(skb->len);
                /* enable timestamping for the sent packet */
-               if (shtx->hardware)
+               if (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)
                        *((u16 *)(current_tx_ptr->packet)) |= 0x1000;
                memcpy((u8 *)(current_tx_ptr->packet + 2), skb->data,
                        skb->len);
@@@ -175,16 -175,26 +175,26 @@@ enum 
  
  static DEFINE_PCI_DEVICE_TABLE(cxgb4_pci_tbl) = {
        CH_DEVICE(0xa000, 0),  /* PE10K */
-       CH_DEVICE(0x4001, 0),
-       CH_DEVICE(0x4002, 0),
-       CH_DEVICE(0x4003, 0),
-       CH_DEVICE(0x4004, 0),
-       CH_DEVICE(0x4005, 0),
-       CH_DEVICE(0x4006, 0),
-       CH_DEVICE(0x4007, 0),
-       CH_DEVICE(0x4008, 0),
-       CH_DEVICE(0x4009, 0),
-       CH_DEVICE(0x400a, 0),
+       CH_DEVICE(0x4001, -1),
+       CH_DEVICE(0x4002, -1),
+       CH_DEVICE(0x4003, -1),
+       CH_DEVICE(0x4004, -1),
+       CH_DEVICE(0x4005, -1),
+       CH_DEVICE(0x4006, -1),
+       CH_DEVICE(0x4007, -1),
+       CH_DEVICE(0x4008, -1),
+       CH_DEVICE(0x4009, -1),
+       CH_DEVICE(0x400a, -1),
+       CH_DEVICE(0x4401, 4),
+       CH_DEVICE(0x4402, 4),
+       CH_DEVICE(0x4403, 4),
+       CH_DEVICE(0x4404, 4),
+       CH_DEVICE(0x4405, 4),
+       CH_DEVICE(0x4406, 4),
+       CH_DEVICE(0x4407, 4),
+       CH_DEVICE(0x4408, 4),
+       CH_DEVICE(0x4409, 4),
+       CH_DEVICE(0x440a, 4),
        { 0, }
  };
  
@@@ -423,10 -433,11 +433,11 @@@ static int fwevtq_handler(struct sge_rs
        if (likely(opcode == CPL_SGE_EGR_UPDATE)) {
                const struct cpl_sge_egr_update *p = (void *)rsp;
                unsigned int qid = EGR_QID(ntohl(p->opcode_qid));
-               struct sge_txq *txq = q->adap->sge.egr_map[qid];
+               struct sge_txq *txq;
  
+               txq = q->adap->sge.egr_map[qid - q->adap->sge.egr_start];
                txq->restarts++;
-               if ((u8 *)txq < (u8 *)q->adap->sge.ethrxq) {
+               if ((u8 *)txq < (u8 *)q->adap->sge.ofldtxq) {
                        struct sge_eth_txq *eq;
  
                        eq = container_of(txq, struct sge_eth_txq, q);
@@@ -657,6 -668,15 +668,15 @@@ static int setup_rss(struct adapter *ad
        return 0;
  }
  
+ /*
+  * Return the channel of the ingress queue with the given qid.
+  */
+ static unsigned int rxq_to_chan(const struct sge *p, unsigned int qid)
+ {
+       qid -= p->ingr_start;
+       return netdev2pinfo(p->ingr_map[qid]->netdev)->tx_chan;
+ }
  /*
   * Wait until all NAPI handlers are descheduled.
   */
@@@ -860,7 -880,7 +880,7 @@@ void *t4_alloc_mem(size_t size
  /*
   * Free memory allocated through alloc_mem().
   */
- void t4_free_mem(void *addr)
static void t4_free_mem(void *addr)
  {
        if (is_vmalloc_addr(addr))
                vfree(addr);
@@@ -1671,27 -1691,41 +1691,41 @@@ static int get_coalesce(struct net_devi
        return 0;
  }
  
- /*
-  * Translate a physical EEPROM address to virtual.  The first 1K is accessed
-  * through virtual addresses starting at 31K, the rest is accessed through
-  * virtual addresses starting at 0.  This mapping is correct only for PF0.
+ /**
+  *    eeprom_ptov - translate a physical EEPROM address to virtual
+  *    @phys_addr: the physical EEPROM address
+  *    @fn: the PCI function number
+  *    @sz: size of function-specific area
+  *
+  *    Translate a physical EEPROM address to virtual.  The first 1K is
+  *    accessed through virtual addresses starting at 31K, the rest is
+  *    accessed through virtual addresses starting at 0.
+  *
+  *    The mapping is as follows:
+  *    [0..1K) -> [31K..32K)
+  *    [1K..1K+A) -> [31K-A..31K)
+  *    [1K+A..ES) -> [0..ES-A-1K)
+  *
+  *    where A = @fn * @sz, and ES = EEPROM size.
   */
- static int eeprom_ptov(unsigned int phys_addr)
+ static int eeprom_ptov(unsigned int phys_addr, unsigned int fn, unsigned int sz)
  {
+       fn *= sz;
        if (phys_addr < 1024)
                return phys_addr + (31 << 10);
+       if (phys_addr < 1024 + fn)
+               return 31744 - fn + phys_addr - 1024;
        if (phys_addr < EEPROMSIZE)
-               return phys_addr - 1024;
+               return phys_addr - 1024 - fn;
        return -EINVAL;
  }
  
  /*
   * The next two routines implement eeprom read/write from physical addresses.
-  * The physical->virtual translation is correct only for PF0.
   */
  static int eeprom_rd_phys(struct adapter *adap, unsigned int phys_addr, u32 *v)
  {
-       int vaddr = eeprom_ptov(phys_addr);
+       int vaddr = eeprom_ptov(phys_addr, adap->fn, EEPROMPFSIZE);
  
        if (vaddr >= 0)
                vaddr = pci_read_vpd(adap->pdev, vaddr, sizeof(u32), v);
  
  static int eeprom_wr_phys(struct adapter *adap, unsigned int phys_addr, u32 v)
  {
-       int vaddr = eeprom_ptov(phys_addr);
+       int vaddr = eeprom_ptov(phys_addr, adap->fn, EEPROMPFSIZE);
  
        if (vaddr >= 0)
                vaddr = pci_write_vpd(adap->pdev, vaddr, sizeof(u32), &v);
@@@ -1743,6 -1777,14 +1777,14 @@@ static int set_eeprom(struct net_devic
        aligned_offset = eeprom->offset & ~3;
        aligned_len = (eeprom->len + (eeprom->offset & 3) + 3) & ~3;
  
+       if (adapter->fn > 0) {
+               u32 start = 1024 + adapter->fn * EEPROMPFSIZE;
+               if (aligned_offset < start ||
+                   aligned_offset + aligned_len > start + EEPROMPFSIZE)
+                       return -EPERM;
+       }
        if (aligned_offset != eeprom->offset || aligned_len != eeprom->len) {
                /*
                 * RMW possibly needed for first or last words.
@@@ -2026,7 -2068,6 +2068,7 @@@ static const struct file_operations mem
        .owner   = THIS_MODULE,
        .open    = mem_open,
        .read    = mem_read,
 +      .llseek  = default_llseek,
  };
  
  static void __devinit add_debugfs_mem(struct adapter *adap, const char *name,
@@@ -2165,8 -2206,8 +2207,8 @@@ static void mk_tid_release(struct sk_bu
   * Queue a TID release request and if necessary schedule a work queue to
   * process it.
   */
- void cxgb4_queue_tid_release(struct tid_info *t, unsigned int chan,
-                            unsigned int tid)
static void cxgb4_queue_tid_release(struct tid_info *t, unsigned int chan,
+                                   unsigned int tid)
  {
        void **p = &t->tid_tab[tid];
        struct adapter *adap = container_of(t, struct adapter, tids);
        }
        spin_unlock_bh(&adap->tid_release_lock);
  }
- EXPORT_SYMBOL(cxgb4_queue_tid_release);
  
  /*
   * Process the list of pending TID release requests.
@@@ -2305,7 -2345,7 +2346,7 @@@ int cxgb4_create_server(const struct ne
        req->peer_port = htons(0);
        req->local_ip = sip;
        req->peer_ip = htonl(0);
-       chan = netdev2pinfo(adap->sge.ingr_map[queue]->netdev)->tx_chan;
+       chan = rxq_to_chan(&adap->sge, queue);
        req->opt0 = cpu_to_be64(TX_CHAN(chan));
        req->opt1 = cpu_to_be64(CONN_POLICY_ASK |
                                SYN_RSS_ENABLE | SYN_RSS_QUEUE(queue));
  }
  EXPORT_SYMBOL(cxgb4_create_server);
  
- /**
-  *    cxgb4_create_server6 - create an IPv6 server
-  *    @dev: the device
-  *    @stid: the server TID
-  *    @sip: local IPv6 address to bind server to
-  *    @sport: the server's TCP port
-  *    @queue: queue to direct messages from this server to
-  *
-  *    Create an IPv6 server for the given port and address.
-  *    Returns <0 on error and one of the %NET_XMIT_* values on success.
-  */
- int cxgb4_create_server6(const struct net_device *dev, unsigned int stid,
-                        const struct in6_addr *sip, __be16 sport,
-                        unsigned int queue)
- {
-       unsigned int chan;
-       struct sk_buff *skb;
-       struct adapter *adap;
-       struct cpl_pass_open_req6 *req;
-       skb = alloc_skb(sizeof(*req), GFP_KERNEL);
-       if (!skb)
-               return -ENOMEM;
-       adap = netdev2adap(dev);
-       req = (struct cpl_pass_open_req6 *)__skb_put(skb, sizeof(*req));
-       INIT_TP_WR(req, 0);
-       OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_PASS_OPEN_REQ6, stid));
-       req->local_port = sport;
-       req->peer_port = htons(0);
-       req->local_ip_hi = *(__be64 *)(sip->s6_addr);
-       req->local_ip_lo = *(__be64 *)(sip->s6_addr + 8);
-       req->peer_ip_hi = cpu_to_be64(0);
-       req->peer_ip_lo = cpu_to_be64(0);
-       chan = netdev2pinfo(adap->sge.ingr_map[queue]->netdev)->tx_chan;
-       req->opt0 = cpu_to_be64(TX_CHAN(chan));
-       req->opt1 = cpu_to_be64(CONN_POLICY_ASK |
-                               SYN_RSS_ENABLE | SYN_RSS_QUEUE(queue));
-       return t4_mgmt_tx(adap, skb);
- }
- EXPORT_SYMBOL(cxgb4_create_server6);
  /**
   *    cxgb4_best_mtu - find the entry in the MTU table closest to an MTU
   *    @mtus: the HW MTU table
@@@ -2414,25 -2412,6 +2413,6 @@@ unsigned int cxgb4_port_idx(const struc
  }
  EXPORT_SYMBOL(cxgb4_port_idx);
  
- /**
-  *    cxgb4_netdev_by_hwid - return the net device of a HW port
-  *    @pdev: identifies the adapter
-  *    @id: the HW port id
-  *
-  *    Return the net device associated with the interface with the given HW
-  *    id.
-  */
- struct net_device *cxgb4_netdev_by_hwid(struct pci_dev *pdev, unsigned int id)
- {
-       const struct adapter *adap = pci_get_drvdata(pdev);
-       if (!adap || id >= NCHAN)
-               return NULL;
-       id = adap->chan_map[id];
-       return id < MAX_NPORTS ? adap->port[id] : NULL;
- }
- EXPORT_SYMBOL(cxgb4_netdev_by_hwid);
  void cxgb4_get_tcp_stats(struct pci_dev *pdev, struct tp_tcp_stats *v4,
                         struct tp_tcp_stats *v6)
  {
@@@ -2722,7 -2701,10 +2702,10 @@@ static int cxgb_open(struct net_device 
                        return err;
        }
  
-       dev->real_num_tx_queues = pi->nqsets;
+       netif_set_real_num_tx_queues(dev, pi->nqsets);
+       err = netif_set_real_num_rx_queues(dev, pi->nqsets);
+       if (err)
+               return err;
        err = link_start(dev);
        if (!err)
                netif_tx_start_all_queues(dev);
@@@ -3062,12 -3044,16 +3045,16 @@@ static int adap_init0(struct adapter *a
        params[2] = FW_PARAM_PFVF(L2T_END);
        params[3] = FW_PARAM_PFVF(FILTER_START);
        params[4] = FW_PARAM_PFVF(FILTER_END);
-       ret = t4_query_params(adap, adap->fn, adap->fn, 0, 5, params, val);
+       params[5] = FW_PARAM_PFVF(IQFLINT_START);
+       params[6] = FW_PARAM_PFVF(EQ_START);
+       ret = t4_query_params(adap, adap->fn, adap->fn, 0, 7, params, val);
        if (ret < 0)
                goto bye;
        port_vec = val[0];
        adap->tids.ftid_base = val[3];
        adap->tids.nftids = val[4] - val[3] + 1;
+       adap->sge.ingr_start = val[5];
+       adap->sge.egr_start = val[6];
  
        if (c.ofldcaps) {
                /* query offload-related parameters */
@@@ -3815,7 -3801,7 +3802,7 @@@ static void __devexit remove_one(struc
                pci_disable_device(pdev);
                pci_release_regions(pdev);
                pci_set_drvdata(pdev, NULL);
-       } else if (PCI_FUNC(pdev->devfn) > 0)
+       } else
                pci_release_regions(pdev);
  }
  
@@@ -336,7 -336,7 +336,7 @@@ static int sirdev_is_receiving(struct s
        if (!atomic_read(&dev->enable_rx))
                return 0;
  
-       return (dev->rx_buff.state != OUTSIDE_FRAME);
+       return dev->rx_buff.state != OUTSIDE_FRAME;
  }
  
  int sirdev_set_dongle(struct sir_dev *dev, IRDA_DONGLE type)
@@@ -909,7 -909,7 +909,7 @@@ struct sir_dev * sirdev_get_instance(co
        dev->tx_skb = NULL;
  
        spin_lock_init(&dev->tx_lock);
 -      init_MUTEX(&dev->fsm.sem);
 +      sema_init(&dev->fsm.sem, 1);
  
        dev->drv = drv;
        dev->netdev = ndev;
@@@ -69,6 -69,8 +69,8 @@@ earlier 3Com products
  
  */
  
+ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  #include <linux/module.h>
  #include <linux/kernel.h>
  #include <linux/init.h>
  #include <linux/skbuff.h>
  #include <linux/if_arp.h>
  #include <linux/ioport.h>
- #include <linux/ethtool.h>
  #include <linux/bitops.h>
  #include <linux/mii.h>
  
 -#include <pcmcia/cs.h>
  #include <pcmcia/cistpl.h>
  #include <pcmcia/cisreg.h>
  #include <pcmcia/ciscode.h>
@@@ -237,7 -239,6 +238,6 @@@ static int el3_rx(struct net_device *de
  static int el3_close(struct net_device *dev);
  static void el3_tx_timeout(struct net_device *dev);
  static int el3_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
- static const struct ethtool_ops netdev_ethtool_ops;
  static void set_rx_mode(struct net_device *dev);
  static void set_multicast_list(struct net_device *dev);
  
@@@ -279,15 -280,24 +279,14 @@@ static int tc574_probe(struct pcmcia_de
        spin_lock_init(&lp->window_lock);
        link->resource[0]->end = 32;
        link->resource[0]->flags |= IO_DATA_PATH_WIDTH_16;
 -      link->conf.Attributes = CONF_ENABLE_IRQ;
 -      link->conf.IntType = INT_MEMORY_AND_IO;
 -      link->conf.ConfigIndex = 1;
 +      link->config_flags |= CONF_ENABLE_IRQ;
 +      link->config_index = 1;
  
        dev->netdev_ops = &el3_netdev_ops;
-       SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
        dev->watchdog_timeo = TX_TIMEOUT;
  
        return tc574_config(link);
 -} /* tc574_attach */
 -
 -/*
 -
 -      This deletes a driver "instance".  The device is de-registered
 -      with Card Services.  If it has been released, all local data
 -      structures are freed.  Otherwise, the structures will be freed
 -      when the device is released.
 -
 -*/
 +}
  
  static void tc574_detach(struct pcmcia_device *link)
  {
        free_netdev(dev);
  } /* tc574_detach */
  
 -/*
 -      tc574_config() is scheduled to run after a CARD_INSERTION event
 -      is received, to configure the PCMCIA socket, and to make the
 -      ethernet device available to the system.
 -*/
 -
  static const char *ram_split[] = {"5:3", "3:1", "1:1", "3:5"};
  
  static int tc574_config(struct pcmcia_device *link)
        if (ret)
                goto failed;
  
 -      ret = pcmcia_request_configuration(link, &link->conf);
 +      ret = pcmcia_enable_device(link);
        if (ret)
                goto failed;
  
                for (i = 0; i < 3; i++)
                        phys_addr[i] = htons(read_eeprom(ioaddr, i + 10));
                if (phys_addr[0] == htons(0x6060)) {
-                       printk(KERN_NOTICE "3c574_cs: IO port conflict at 0x%03lx"
-                                  "-0x%03lx\n", dev->base_addr, dev->base_addr+15);
+                       pr_notice("IO port conflict at 0x%03lx-0x%03lx\n",
+                                 dev->base_addr, dev->base_addr+15);
                        goto failed;
                }
        }
                outw(2<<11, ioaddr + RunnerRdCtrl);
                mcr = inb(ioaddr + 2);
                outw(0<<11, ioaddr + RunnerRdCtrl);
-               printk(KERN_INFO "  ASIC rev %d,", mcr>>3);
+               pr_info("  ASIC rev %d,", mcr>>3);
                EL3WINDOW(3);
                config = inl(ioaddr + Wn3_Config);
                lp->default_media = (config & Xcvr) >> Xcvr_shift;
                        }
                }
                if (phy > 32) {
-                       printk(KERN_NOTICE "  No MII transceivers found!\n");
+                       pr_notice("  No MII transceivers found!\n");
                        goto failed;
                }
                i = mdio_read(ioaddr, lp->phys, 16) | 0x40;
        SET_NETDEV_DEV(dev, &link->dev);
  
        if (register_netdev(dev) != 0) {
-               printk(KERN_NOTICE "3c574_cs: register_netdev() failed\n");
+               pr_notice("register_netdev() failed\n");
                goto failed;
        }
  
-       printk(KERN_INFO "%s: %s at io %#3lx, irq %d, "
-              "hw_addr %pM.\n",
-              dev->name, cardname, dev->base_addr, dev->irq,
-              dev->dev_addr);
-       printk(" %dK FIFO split %s Rx:Tx, %sMII interface.\n",
-                  8 << config & Ram_size,
-                  ram_split[(config & Ram_split) >> Ram_split_shift],
-                  config & Autoselect ? "autoselect " : "");
+       netdev_info(dev, "%s at io %#3lx, irq %d, hw_addr %pM\n",
+                   cardname, dev->base_addr, dev->irq, dev->dev_addr);
+       netdev_info(dev, " %dK FIFO split %s Rx:Tx, %sMII interface.\n",
+                   8 << config & Ram_size,
+                   ram_split[(config & Ram_split) >> Ram_split_shift],
+                   config & Autoselect ? "autoselect " : "");
  
        return 0;
  
@@@ -448,6 -462,12 +445,6 @@@ failed
  
  } /* tc574_config */
  
 -/*
 -      After a card is removed, tc574_release() will unregister the net
 -      device, and release the PCMCIA configuration.  If the device is
 -      still open, this will be postponed until it is closed.
 -*/
 -
  static void tc574_release(struct pcmcia_device *link)
  {
        pcmcia_disable_device(link);
@@@ -479,14 -499,14 +476,14 @@@ static void dump_status(struct net_devi
  {
        unsigned int ioaddr = dev->base_addr;
        EL3WINDOW(1);
-       printk(KERN_INFO "  irq status %04x, rx status %04x, tx status "
-                  "%02x, tx free %04x\n", inw(ioaddr+EL3_STATUS),
-                  inw(ioaddr+RxStatus), inb(ioaddr+TxStatus),
-                  inw(ioaddr+TxFree));
+       netdev_info(dev, "  irq status %04x, rx status %04x, tx status %02x, tx free %04x\n",
+                   inw(ioaddr+EL3_STATUS),
+                   inw(ioaddr+RxStatus), inb(ioaddr+TxStatus),
+                   inw(ioaddr+TxFree));
        EL3WINDOW(4);
-       printk(KERN_INFO "  diagnostics: fifo %04x net %04x ethernet %04x"
-                  " media %04x\n", inw(ioaddr+0x04), inw(ioaddr+0x06),
-                  inw(ioaddr+0x08), inw(ioaddr+0x0a));
+       netdev_info(dev, "  diagnostics: fifo %04x net %04x ethernet %04x media %04x\n",
+                   inw(ioaddr+0x04), inw(ioaddr+0x06),
+                   inw(ioaddr+0x08), inw(ioaddr+0x0a));
        EL3WINDOW(1);
  }
  
@@@ -500,7 -520,7 +497,7 @@@ static void tc574_wait_for_completion(s
        while (--i > 0)
                if (!(inw(dev->base_addr + EL3_STATUS) & 0x1000)) break;
        if (i == 0)
-               printk(KERN_NOTICE "%s: command 0x%04x did not complete!\n", dev->name, cmd);
+               netdev_notice(dev, "command 0x%04x did not complete!\n", cmd);
  }
  
  /* Read a word from the EEPROM using the regular EEPROM access register.
@@@ -687,7 -707,7 +684,7 @@@ static int el3_open(struct net_device *
        netif_start_queue(dev);
        
        tc574_reset(dev);
-       lp->media.function = &media_check;
+       lp->media.function = media_check;
        lp->media.data = (unsigned long) dev;
        lp->media.expires = jiffies + HZ;
        add_timer(&lp->media);
@@@ -702,7 -722,7 +699,7 @@@ static void el3_tx_timeout(struct net_d
  {
        unsigned int ioaddr = dev->base_addr;
        
-       printk(KERN_NOTICE "%s: Transmit timed out!\n", dev->name);
+       netdev_notice(dev, "Transmit timed out!\n");
        dump_status(dev);
        dev->stats.tx_errors++;
        dev->trans_start = jiffies; /* prevent tx timeout */
@@@ -825,8 -845,8 +822,8 @@@ static irqreturn_t el3_interrupt(int ir
                                EL3WINDOW(4);
                                fifo_diag = inw(ioaddr + Wn4_FIFODiag);
                                EL3WINDOW(1);
-                               printk(KERN_NOTICE "%s: adapter failure, FIFO diagnostic"
-                                          " register %04x.\n", dev->name, fifo_diag);
+                               netdev_notice(dev, "adapter failure, FIFO diagnostic register %04x\n",
+                                             fifo_diag);
                                if (fifo_diag & 0x0400) {
                                        /* Tx overrun */
                                        tc574_wait_for_completion(dev, TxReset);
@@@ -880,7 -900,7 +877,7 @@@ static void media_check(unsigned long a
           this, we can limp along even if the interrupt is blocked */
        if ((inw(ioaddr + EL3_STATUS) & IntLatch) && (inb(ioaddr + Timer) == 0xff)) {
                if (!lp->fast_poll)
-                       printk(KERN_INFO "%s: interrupt(s) dropped!\n", dev->name);
+                       netdev_info(dev, "interrupt(s) dropped!\n");
  
                local_irq_save(flags);
                el3_interrupt(dev->irq, dev);
        
        if (media != lp->media_status) {
                if ((media ^ lp->media_status) & 0x0004)
-                       printk(KERN_INFO "%s: %s link beat\n", dev->name,
-                                  (lp->media_status & 0x0004) ? "lost" : "found");
+                       netdev_info(dev, "%s link beat\n",
+                                   (lp->media_status & 0x0004) ? "lost" : "found");
                if ((media ^ lp->media_status) & 0x0020) {
                        lp->partner = 0;
                        if (lp->media_status & 0x0020) {
-                               printk(KERN_INFO "%s: autonegotiation restarted\n",
-                                          dev->name);
+                               netdev_info(dev, "autonegotiation restarted\n");
                        } else if (partner) {
                                partner &= lp->advertising;
                                lp->partner = partner;
-                               printk(KERN_INFO "%s: autonegotiation complete: "
-                                          "%sbaseT-%cD selected\n", dev->name,
-                                          ((partner & 0x0180) ? "100" : "10"),
-                                          ((partner & 0x0140) ? 'F' : 'H'));
+                               netdev_info(dev, "autonegotiation complete: "
+                                           "%dbaseT-%cD selected\n",
+                                           (partner & 0x0180) ? 100 : 10,
+                                           (partner & 0x0140) ? 'F' : 'H');
                        } else {
-                               printk(KERN_INFO "%s: link partner did not autonegotiate\n",
-                                          dev->name);
+                               netdev_info(dev, "link partner did not autonegotiate\n");
                        }
  
                        EL3WINDOW(3);
  
                }
                if (media & 0x0010)
-                       printk(KERN_INFO "%s: remote fault detected\n",
-                                  dev->name);
+                       netdev_info(dev, "remote fault detected\n");
                if (media & 0x0002)
-                       printk(KERN_INFO "%s: jabber detected\n", dev->name);
+                       netdev_info(dev, "jabber detected\n");
                lp->media_status = media;
        }
        spin_unlock_irqrestore(&lp->window_lock, flags);
@@@ -1042,16 -1059,6 +1036,6 @@@ static int el3_rx(struct net_device *de
        return worklimit;
  }
  
- static void netdev_get_drvinfo(struct net_device *dev,
-                              struct ethtool_drvinfo *info)
- {
-       strcpy(info->driver, "3c574_cs");
- }
- static const struct ethtool_ops netdev_ethtool_ops = {
-       .get_drvinfo            = netdev_get_drvinfo,
- };
  /* Provide ioctl() calls to examine the MII xcvr state. */
  static int el3_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
  {
@@@ -1175,7 -1182,9 +1159,7 @@@ MODULE_DEVICE_TABLE(pcmcia, tc574_ids)
  
  static struct pcmcia_driver tc574_driver = {
        .owner          = THIS_MODULE,
 -      .drv            = {
 -              .name   = "3c574_cs",
 -      },
 +      .name           = "3c574_cs",
        .probe          = tc574_probe,
        .remove         = tc574_detach,
        .id_table       = tc574_ids,
@@@ -19,6 -19,8 +19,8 @@@
  
  ======================================================================*/
  
+ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  #define DRV_NAME      "3c589_cs"
  #define DRV_VERSION   "1.162-ac"
  
@@@ -41,6 -43,7 +43,6 @@@
  #include <linux/bitops.h>
  #include <linux/jiffies.h>
  
 -#include <pcmcia/cs.h>
  #include <pcmcia/cistpl.h>
  #include <pcmcia/cisreg.h>
  #include <pcmcia/ciscode.h>
@@@ -175,6 -178,14 +177,6 @@@ static const struct ethtool_ops netdev_
  
  static void tc589_detach(struct pcmcia_device *p_dev);
  
 -/*======================================================================
 -
 -    tc589_attach() creates an "instance" of the driver, allocating
 -    local data structures for one device.  The device is registered
 -    with Card Services.
 -
 -======================================================================*/
 -
  static const struct net_device_ops el3_netdev_ops = {
        .ndo_open               = el3_open,
        .ndo_stop               = el3_close,
@@@ -207,8 -218,9 +209,8 @@@ static int tc589_probe(struct pcmcia_de
      link->resource[0]->end = 16;
      link->resource[0]->flags |= IO_DATA_PATH_WIDTH_16;
  
 -    link->conf.Attributes = CONF_ENABLE_IRQ;
 -    link->conf.IntType = INT_MEMORY_AND_IO;
 -    link->conf.ConfigIndex = 1;
 +    link->config_flags |= CONF_ENABLE_IRQ;
 +    link->config_index = 1;
  
      dev->netdev_ops = &el3_netdev_ops;
      dev->watchdog_timeo = TX_TIMEOUT;
      SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
  
      return tc589_config(link);
 -} /* tc589_attach */
 -
 -/*======================================================================
 -
 -    This deletes a driver "instance".  The device is de-registered
 -    with Card Services.  If it has been released, all local data
 -    structures are freed.  Otherwise, the structures will be freed
 -    when the device is released.
 -
 -======================================================================*/
 +}
  
  static void tc589_detach(struct pcmcia_device *link)
  {
      free_netdev(dev);
  } /* tc589_detach */
  
 -/*======================================================================
 -
 -    tc589_config() is scheduled to run after a CARD_INSERTION event
 -    is received, to configure the PCMCIA socket, and to make the
 -    ethernet device available to the system.
 -
 -======================================================================*/
 -
  static int tc589_config(struct pcmcia_device *link)
  {
      struct net_device *dev = link->priv;
      __be16 *phys_addr;
      int ret, i, j, multi = 0, fifo;
      unsigned int ioaddr;
-     char *ram_split[] = {"5:3", "3:1", "1:1", "3:5"};
+     static const char * const ram_split[] = {"5:3", "3:1", "1:1", "3:5"};
      u8 *buf;
      size_t len;
  
      phys_addr = (__be16 *)dev->dev_addr;
      /* Is this a 3c562? */
      if (link->manf_id != MANFID_3COM)
-           printk(KERN_INFO "3c589_cs: hmmm, is this really a "
-                  "3Com card??\n");
+           dev_info(&link->dev, "hmmm, is this really a 3Com card??\n");
      multi = (link->card_id == PRODID_3COM_3C562);
  
      link->io_lines = 16;
      if (ret)
            goto failed;
  
 -    ret = pcmcia_request_configuration(link, &link->conf);
 +    ret = pcmcia_enable_device(link);
      if (ret)
            goto failed;
  
        for (i = 0; i < 3; i++)
            phys_addr[i] = htons(read_eeprom(ioaddr, i));
        if (phys_addr[0] == htons(0x6060)) {
-           printk(KERN_ERR "3c589_cs: IO port conflict at 0x%03lx"
-                  "-0x%03lx\n", dev->base_addr, dev->base_addr+15);
+           dev_err(&link->dev, "IO port conflict at 0x%03lx-0x%03lx\n",
+                   dev->base_addr, dev->base_addr+15);
            goto failed;
        }
      }
      if ((if_port >= 0) && (if_port <= 3))
        dev->if_port = if_port;
      else
-       printk(KERN_ERR "3c589_cs: invalid if_port requested\n");
+       dev_err(&link->dev, "invalid if_port requested\n");
  
      SET_NETDEV_DEV(dev, &link->dev);
  
      if (register_netdev(dev) != 0) {
-       printk(KERN_ERR "3c589_cs: register_netdev() failed\n");
+           dev_err(&link->dev, "register_netdev() failed\n");
        goto failed;
      }
  
@@@ -325,6 -353,14 +326,6 @@@ failed
      return -ENODEV;
  } /* tc589_config */
  
 -/*======================================================================
 -
 -    After a card is removed, tc589_release() will unregister the net
 -    device, and release the PCMCIA configuration.  If the device is
 -    still open, this will be postponed until it is closed.
 -
 -======================================================================*/
 -
  static void tc589_release(struct pcmcia_device *link)
  {
        pcmcia_disable_device(link);
@@@ -502,7 -538,7 +503,7 @@@ static int el3_open(struct net_device *
  
      tc589_reset(dev);
      init_timer(&lp->media);
-     lp->media.function = &media_check;
+     lp->media.function = media_check;
      lp->media.data = (unsigned long) dev;
      lp->media.expires = jiffies + HZ;
      add_timer(&lp->media);
@@@ -920,7 -956,9 +921,7 @@@ MODULE_DEVICE_TABLE(pcmcia, tc589_ids)
  
  static struct pcmcia_driver tc589_driver = {
        .owner          = THIS_MODULE,
 -      .drv            = {
 -              .name   = "3c589_cs",
 -      },
 +      .name           = "3c589_cs",
        .probe          = tc589_probe,
        .remove         = tc589_detach,
        .id_table       = tc589_ids,
@@@ -24,6 -24,8 +24,8 @@@
  
  ======================================================================*/
  
+ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  #include <linux/kernel.h>
  #include <linux/module.h>
  #include <linux/init.h>
  #include <linux/timer.h>
  #include <linux/delay.h>
  #include <linux/spinlock.h>
- #include <linux/ethtool.h>
  #include <linux/netdevice.h>
  #include <linux/etherdevice.h>
  #include <linux/crc32.h>
  #include <linux/mii.h>
  #include "../8390.h"
  
 -#include <pcmcia/cs.h>
  #include <pcmcia/cistpl.h>
  #include <pcmcia/ciscode.h>
  #include <pcmcia/ds.h>
@@@ -85,7 -87,6 +86,6 @@@ static netdev_tx_t axnet_start_xmit(str
  static struct net_device_stats *get_stats(struct net_device *dev);
  static void set_multicast_list(struct net_device *dev);
  static void axnet_tx_timeout(struct net_device *dev);
- static const struct ethtool_ops netdev_ethtool_ops;
  static irqreturn_t ei_irq_wrapper(int irq, void *dev_id);
  static void ei_watchdog(u_long arg);
  static void axnet_reset_8390(struct net_device *dev);
@@@ -139,6 -140,14 +139,6 @@@ static const struct net_device_ops axne
        .ndo_validate_addr      = eth_validate_addr,
  };
  
 -/*======================================================================
 -
 -    axnet_attach() creates an "instance" of the driver, allocating
 -    local data structures for one device.  The device is registered
 -    with Card Services.
 -
 -======================================================================*/
 -
  static int axnet_probe(struct pcmcia_device *link)
  {
      axnet_dev_t *info;
      info = PRIV(dev);
      info->p_dev = link;
      link->priv = dev;
 -    link->conf.Attributes = CONF_ENABLE_IRQ;
 -    link->conf.IntType = INT_MEMORY_AND_IO;
 +    link->config_flags |= CONF_ENABLE_IRQ;
  
      dev->netdev_ops = &axnet_netdev_ops;
  
-     SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
      dev->watchdog_timeo = TX_TIMEOUT;
  
      return axnet_config(link);
  } /* axnet_attach */
  
 -/*======================================================================
 -
 -    This deletes a driver "instance".  The device is de-registered
 -    with Card Services.  If it has been released, all local data
 -    structures are freed.  Otherwise, the structures will be freed
 -    when the device is released.
 -
 -======================================================================*/
 -
  static void axnet_detach(struct pcmcia_device *link)
  {
      struct net_device *dev = link->priv;
@@@ -212,7 -230,7 +211,7 @@@ static int get_prom(struct pcmcia_devic
      };
  
      /* Not much of a test, but the alternatives are messy */
 -    if (link->conf.ConfigBase != 0x03c0)
 +    if (link->config_base != 0x03c0)
        return 0;
  
      axnet_reset_8390(dev);
      return 1;
  } /* get_prom */
  
 -/*======================================================================
 -
 -    axnet_config() is scheduled to run after a CARD_INSERTION event
 -    is received, to configure the PCMCIA socket, and to make the
 -    ethernet device available to the system.
 -
 -======================================================================*/
 -
  static int try_io_port(struct pcmcia_device *link)
  {
      int j, ret;
      }
  }
  
 -static int axnet_configcheck(struct pcmcia_device *p_dev,
 -                           cistpl_cftable_entry_t *cfg,
 -                           cistpl_cftable_entry_t *dflt,
 -                           unsigned int vcc,
 -                           void *priv_data)
 +static int axnet_configcheck(struct pcmcia_device *p_dev, void *priv_data)
  {
 -      int i;
 -      cistpl_io_t *io = &cfg->io;
 +      if (p_dev->config_index == 0)
 +              return -EINVAL;
  
 -      if (cfg->index == 0 || cfg->io.nwin == 0)
 +      p_dev->config_index = 0x05;
 +      if (p_dev->resource[0]->end + p_dev->resource[1]->end < 32)
                return -ENODEV;
  
 -      p_dev->conf.ConfigIndex = 0x05;
 -      /* For multifunction cards, by convention, we configure the
 -         network function with window 0, and serial with window 1 */
 -      if (io->nwin > 1) {
 -              i = (io->win[1].len > io->win[0].len);
 -              p_dev->resource[1]->start = io->win[1-i].base;
 -              p_dev->resource[1]->end = io->win[1-i].len;
 -      } else {
 -              i = p_dev->resource[1]->end = 0;
 -      }
 -      p_dev->resource[0]->start = io->win[i].base;
 -      p_dev->resource[0]->end = io->win[i].len;
 -      p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
 -      if (p_dev->resource[0]->end + p_dev->resource[1]->end >= 32)
 -              return try_io_port(p_dev);
 -
 -      return -ENODEV;
 +      return try_io_port(p_dev);
  }
  
  static int axnet_config(struct pcmcia_device *link)
      dev_dbg(&link->dev, "axnet_config(0x%p)\n", link);
  
      /* don't trust the CIS on this; Linksys got it wrong */
 -    link->conf.Present = 0x63;
 +    link->config_regs = 0x63;
 +    link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
      ret = pcmcia_loop_config(link, axnet_configcheck, NULL);
      if (ret != 0)
        goto failed;
  
      if (!link->irq)
            goto failed;
 +
 +    if (resource_size(link->resource[1]) == 8)
 +      link->config_flags |= CONF_ENABLE_SPKR;
      
 -    if (resource_size(link->resource[1]) == 8) {
 -      link->conf.Attributes |= CONF_ENABLE_SPKR;
 -      link->conf.Status = CCSR_AUDIO_ENA;
 -    }
 -    
 -    ret = pcmcia_request_configuration(link, &link->conf);
 +    ret = pcmcia_enable_device(link);
      if (ret)
            goto failed;
  
      dev->base_addr = link->resource[0]->start;
  
      if (!get_prom(link)) {
-       printk(KERN_NOTICE "axnet_cs: this is not an AX88190 card!\n");
-       printk(KERN_NOTICE "axnet_cs: use pcnet_cs instead.\n");
+       pr_notice("this is not an AX88190 card!\n");
+       pr_notice("use pcnet_cs instead.\n");
        goto failed;
      }
  
      ei_status.tx_start_page = AXNET_START_PG;
      ei_status.rx_start_page = AXNET_START_PG + TX_PAGES;
      ei_status.stop_page = AXNET_STOP_PG;
-     ei_status.reset_8390 = &axnet_reset_8390;
-     ei_status.get_8390_hdr = &get_8390_hdr;
-     ei_status.block_input = &block_input;
-     ei_status.block_output = &block_output;
+     ei_status.reset_8390 = axnet_reset_8390;
+     ei_status.get_8390_hdr = get_8390_hdr;
+     ei_status.block_input = block_input;
+     ei_status.block_output = block_output;
  
      if (inb(dev->base_addr + AXNET_TEST) != 0)
        info->flags |= IS_AX88790;
      SET_NETDEV_DEV(dev, &link->dev);
  
      if (register_netdev(dev) != 0) {
-       printk(KERN_NOTICE "axnet_cs: register_netdev() failed\n");
+       pr_notice("register_netdev() failed\n");
        goto failed;
      }
  
-     printk(KERN_INFO "%s: Asix AX88%d90: io %#3lx, irq %d, "
-          "hw_addr %pM\n",
-          dev->name, ((info->flags & IS_AX88790) ? 7 : 1),
-          dev->base_addr, dev->irq,
-          dev->dev_addr);
+     netdev_info(dev, "Asix AX88%d90: io %#3lx, irq %d, hw_addr %pM\n",
+               ((info->flags & IS_AX88790) ? 7 : 1),
+               dev->base_addr, dev->irq, dev->dev_addr);
      if (info->phy_id != -1) {
-       dev_dbg(&link->dev, "  MII transceiver at index %d, status %x.\n", info->phy_id, j);
+       netdev_dbg(dev, "  MII transceiver at index %d, status %x\n",
+                  info->phy_id, j);
      } else {
-       printk(KERN_NOTICE "  No MII transceivers found!\n");
+       netdev_notice(dev, "  No MII transceivers found!\n");
      }
      return 0;
  
@@@ -367,6 -412,14 +365,6 @@@ failed
      return -ENODEV;
  } /* axnet_config */
  
 -/*======================================================================
 -
 -    After a card is removed, axnet_release() will unregister the net
 -    device, and release the PCMCIA configuration.  If the device is
 -    still open, this will be postponed until it is closed.
 -
 -======================================================================*/
 -
  static void axnet_release(struct pcmcia_device *link)
  {
        pcmcia_disable_device(link);
@@@ -477,7 -530,7 +475,7 @@@ static int axnet_open(struct net_devic
  
      info->link_status = 0x00;
      init_timer(&info->watchdog);
-     info->watchdog.function = &ei_watchdog;
+     info->watchdog.function = ei_watchdog;
      info->watchdog.data = (u_long)dev;
      info->watchdog.expires = jiffies + HZ;
      add_timer(&info->watchdog);
@@@ -530,8 -583,7 +528,7 @@@ static void axnet_reset_8390(struct net
      outb_p(ENISR_RESET, nic_base + EN0_ISR); /* Ack intr. */
      
      if (i == 100)
-       printk(KERN_ERR "%s: axnet_reset_8390() did not complete.\n",
-              dev->name);
+       netdev_err(dev, "axnet_reset_8390() did not complete\n");
      
  } /* axnet_reset_8390 */
  
@@@ -558,7 -610,7 +555,7 @@@ static void ei_watchdog(u_long arg
         this, we can limp along even if the interrupt is blocked */
      if (info->stale++ && (inb_p(nic_base + EN0_ISR) & ENISR_ALL)) {
        if (!info->fast_poll)
-           printk(KERN_INFO "%s: interrupt(s) dropped!\n", dev->name);
+           netdev_info(dev, "interrupt(s) dropped!\n");
        ei_irq_wrapper(dev->irq, dev);
        info->fast_poll = HZ;
      }
        goto reschedule;
      link = mdio_read(mii_addr, info->phy_id, 1);
      if (!link || (link == 0xffff)) {
-       printk(KERN_INFO "%s: MII is missing!\n", dev->name);
+       netdev_info(dev, "MII is missing!\n");
        info->phy_id = -1;
        goto reschedule;
      }
      link &= 0x0004;
      if (link != info->link_status) {
        u_short p = mdio_read(mii_addr, info->phy_id, 5);
-       printk(KERN_INFO "%s: %s link beat\n", dev->name,
-              (link) ? "found" : "lost");
+       netdev_info(dev, "%s link beat\n", link ? "found" : "lost");
        if (link) {
            info->duplex_flag = (p & 0x0140) ? 0x80 : 0x00;
            if (p)
-               printk(KERN_INFO "%s: autonegotiation complete: "
-                      "%sbaseT-%cD selected\n", dev->name,
-                      ((p & 0x0180) ? "100" : "10"),
-                      ((p & 0x0140) ? 'F' : 'H'));
+               netdev_info(dev, "autonegotiation complete: %dbaseT-%cD selected\n",
+                           (p & 0x0180) ? 100 : 10, (p & 0x0140) ? 'F' : 'H');
            else
-               printk(KERN_INFO "%s: link partner did not autonegotiate\n",
-                      dev->name);
+               netdev_info(dev, "link partner did not autonegotiate\n");
            AX88190_init(dev, 1);
        }
        info->link_status = link;
@@@ -603,16 -651,6 +596,6 @@@ reschedule
      add_timer(&info->watchdog);
  }
  
- static void netdev_get_drvinfo(struct net_device *dev,
-                              struct ethtool_drvinfo *info)
- {
-       strcpy(info->driver, "axnet_cs");
- }
- static const struct ethtool_ops netdev_ethtool_ops = {
-       .get_drvinfo            = netdev_get_drvinfo,
- };
  /*====================================================================*/
  
  static int axnet_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
@@@ -728,7 -766,9 +711,7 @@@ MODULE_DEVICE_TABLE(pcmcia, axnet_ids)
  
  static struct pcmcia_driver axnet_cs_driver = {
        .owner          = THIS_MODULE,
 -      .drv            = {
 -              .name   = "axnet_cs",
 -      },
 +      .name           = "axnet_cs",
        .probe          = axnet_probe,
        .remove         = axnet_detach,
        .id_table       = axnet_ids,
@@@ -798,9 -838,6 +781,6 @@@ module_exit(exit_axnet_cs)
  
    */
  
- static const char version_8390[] = KERN_INFO \
-     "8390.c:v1.10cvs 9/23/94 Donald Becker (becker@scyld.com)\n";
  #include <linux/bitops.h>
  #include <asm/irq.h>
  #include <linux/fcntl.h>
@@@ -947,9 -984,11 +927,11 @@@ static void axnet_tx_timeout(struct net
        isr = inb(e8390_base+EN0_ISR);
        spin_unlock_irqrestore(&ei_local->page_lock, flags);
  
-       printk(KERN_DEBUG "%s: Tx timed out, %s TSR=%#2x, ISR=%#2x, t=%d.\n",
-               dev->name, (txsr & ENTSR_ABT) ? "excess collisions." :
-               (isr) ? "lost interrupt?" : "cable problem?", txsr, isr, tickssofar);
+       netdev_printk(KERN_DEBUG, dev,
+                     "Tx timed out, %s TSR=%#2x, ISR=%#2x, t=%d.\n",
+                     (txsr & ENTSR_ABT) ? "excess collisions." :
+                     (isr) ? "lost interrupt?" : "cable problem?",
+                     txsr, isr, tickssofar);
  
        if (!isr && !dev->stats.tx_packets) 
        {
@@@ -1019,22 -1058,28 +1001,28 @@@ static netdev_tx_t axnet_start_xmit(str
                output_page = ei_local->tx_start_page;
                ei_local->tx1 = send_length;
                if (ei_debug  &&  ei_local->tx2 > 0)
-                       printk(KERN_DEBUG "%s: idle transmitter tx2=%d, lasttx=%d, txing=%d.\n",
-                               dev->name, ei_local->tx2, ei_local->lasttx, ei_local->txing);
+                       netdev_printk(KERN_DEBUG, dev,
+                                     "idle transmitter tx2=%d, lasttx=%d, txing=%d\n",
+                                     ei_local->tx2, ei_local->lasttx,
+                                     ei_local->txing);
        }
        else if (ei_local->tx2 == 0) 
        {
                output_page = ei_local->tx_start_page + TX_PAGES/2;
                ei_local->tx2 = send_length;
                if (ei_debug  &&  ei_local->tx1 > 0)
-                       printk(KERN_DEBUG "%s: idle transmitter, tx1=%d, lasttx=%d, txing=%d.\n",
-                               dev->name, ei_local->tx1, ei_local->lasttx, ei_local->txing);
+                       netdev_printk(KERN_DEBUG, dev,
+                                     "idle transmitter, tx1=%d, lasttx=%d, txing=%d\n",
+                                     ei_local->tx1, ei_local->lasttx,
+                                     ei_local->txing);
        }
        else
        {       /* We should never get here. */
                if (ei_debug)
-                       printk(KERN_DEBUG "%s: No Tx buffers free! tx1=%d tx2=%d last=%d\n",
-                               dev->name, ei_local->tx1, ei_local->tx2, ei_local->lasttx);
+                       netdev_printk(KERN_DEBUG, dev,
+                                     "No Tx buffers free! tx1=%d tx2=%d last=%d\n",
+                                     ei_local->tx1, ei_local->tx2,
+                                     ei_local->lasttx);
                ei_local->irqlock = 0;
                netif_stop_queue(dev);
                outb_p(ENISR_ALL, e8390_base + EN0_IMR);
@@@ -1122,23 -1167,26 +1110,26 @@@ static irqreturn_t ax_interrupt(int irq
         
        spin_lock_irqsave(&ei_local->page_lock, flags);
  
-       if (ei_local->irqlock) 
-       {
+       if (ei_local->irqlock) {
  #if 1 /* This might just be an interrupt for a PCI device sharing this line */
+               const char *msg;
                /* The "irqlock" check is only for testing. */
-               printk(ei_local->irqlock
-                          ? "%s: Interrupted while interrupts are masked! isr=%#2x imr=%#2x.\n"
-                          : "%s: Reentering the interrupt handler! isr=%#2x imr=%#2x.\n",
-                          dev->name, inb_p(e8390_base + EN0_ISR),
-                          inb_p(e8390_base + EN0_IMR));
+               if (ei_local->irqlock)
+                       msg = "Interrupted while interrupts are masked!";
+               else
+                       msg = "Reentering the interrupt handler!";
+               netdev_info(dev, "%s, isr=%#2x imr=%#2x\n",
+                           msg,
+                           inb_p(e8390_base + EN0_ISR),
+                           inb_p(e8390_base + EN0_IMR));
  #endif
                spin_unlock_irqrestore(&ei_local->page_lock, flags);
                return IRQ_NONE;
        }
      
        if (ei_debug > 3)
-               printk(KERN_DEBUG "%s: interrupt(isr=%#2.2x).\n", dev->name,
-                          inb_p(e8390_base + EN0_ISR));
+               netdev_printk(KERN_DEBUG, dev, "interrupt(isr=%#2.2x)\n",
+                             inb_p(e8390_base + EN0_ISR));
  
        outb_p(0x00, e8390_base + EN0_ISR);
        ei_local->irqlock = 1;
        {
                if (!netif_running(dev) || (interrupts == 0xff)) {
                        if (ei_debug > 1)
-                               printk(KERN_WARNING "%s: interrupt from stopped card\n", dev->name);
+                               netdev_warn(dev,
+                                           "interrupt from stopped card\n");
                        outb_p(interrupts, e8390_base + EN0_ISR);
                        interrupts = 0;
                        break;
                {
                        /* 0xFF is valid for a card removal */
                        if(interrupts!=0xFF)
-                               printk(KERN_WARNING "%s: Too much work at interrupt, status %#2.2x\n",
-                                  dev->name, interrupts);
+                               netdev_warn(dev, "Too much work at interrupt, status %#2.2x\n",
+                                           interrupts);
                        outb_p(ENISR_ALL, e8390_base + EN0_ISR); /* Ack. most intrs. */
                } else {
-                       printk(KERN_WARNING "%s: unknown interrupt %#2x\n", dev->name, interrupts);
+                       netdev_warn(dev, "unknown interrupt %#2x\n",
+                                   interrupts);
                        outb_p(0xff, e8390_base + EN0_ISR); /* Ack. all intrs. */
                }
        }
@@@ -1230,18 -1280,19 +1223,19 @@@ static void ei_tx_err(struct net_devic
        unsigned char tx_was_aborted = txsr & (ENTSR_ABT+ENTSR_FU);
  
  #ifdef VERBOSE_ERROR_DUMP
-       printk(KERN_DEBUG "%s: transmitter error (%#2x): ", dev->name, txsr);
+       netdev_printk(KERN_DEBUG, dev,
+                     "transmitter error (%#2x):", txsr);
        if (txsr & ENTSR_ABT)
-               printk("excess-collisions ");
+               pr_cont(" excess-collisions");
        if (txsr & ENTSR_ND)
-               printk("non-deferral ");
+               pr_cont(" non-deferral");
        if (txsr & ENTSR_CRS)
-               printk("lost-carrier ");
+               pr_cont(" lost-carrier");
        if (txsr & ENTSR_FU)
-               printk("FIFO-underrun ");
+               pr_cont(" FIFO-underrun");
        if (txsr & ENTSR_CDH)
-               printk("lost-heartbeat ");
-       printk("\n");
+               pr_cont(" lost-heartbeat");
+       pr_cont("\n");
  #endif
  
        if (tx_was_aborted)
@@@ -1278,8 -1329,9 +1272,9 @@@ static void ei_tx_intr(struct net_devic
        if (ei_local->tx1 < 0) 
        {
                if (ei_local->lasttx != 1 && ei_local->lasttx != -1)
-                       printk(KERN_ERR "%s: bogus last_tx_buffer %d, tx1=%d.\n",
-                               ei_local->name, ei_local->lasttx, ei_local->tx1);
+                       netdev_err(dev, "%s: bogus last_tx_buffer %d, tx1=%d\n",
+                                  ei_local->name, ei_local->lasttx,
+                                  ei_local->tx1);
                ei_local->tx1 = 0;
                if (ei_local->tx2 > 0) 
                {
        else if (ei_local->tx2 < 0) 
        {
                if (ei_local->lasttx != 2  &&  ei_local->lasttx != -2)
-                       printk("%s: bogus last_tx_buffer %d, tx2=%d.\n",
-                               ei_local->name, ei_local->lasttx, ei_local->tx2);
+                       netdev_info(dev, "%s: bogus last_tx_buffer %d, tx2=%d\n",
+                                   ei_local->name, ei_local->lasttx,
+                                   ei_local->tx2);
                ei_local->tx2 = 0;
                if (ei_local->tx1 > 0) 
                {
                else
                        ei_local->lasttx = 10, ei_local->txing = 0;
        }
- //    else printk(KERN_WARNING "%s: unexpected TX-done interrupt, lasttx=%d.\n",
- //                    dev->name, ei_local->lasttx);
+ //    else
+ //            netdev_warn(dev, "unexpected TX-done interrupt, lasttx=%d\n",
+ //                        ei_local->lasttx);
  
        /* Minimize Tx latency: update the statistics after we restart TXing. */
        if (status & ENTSR_COL)
@@@ -1372,8 -1426,8 +1369,8 @@@ static void ei_receive(struct net_devic
                   is that some clones crash in roughly the same way.
                 */
                if (ei_debug > 0  &&  this_frame != ei_local->current_page && (this_frame!=0x0 || rxing_page!=0xFF))
-                       printk(KERN_ERR "%s: mismatched read page pointers %2x vs %2x.\n",
-                                  dev->name, this_frame, ei_local->current_page);
+                   netdev_err(dev, "mismatched read page pointers %2x vs %2x\n",
+                              this_frame, ei_local->current_page);
                
                if (this_frame == rxing_page)   /* Read all the frames? */
                        break;                          /* Done for now */
                if (pkt_len < 60  ||  pkt_len > 1518) 
                {
                        if (ei_debug)
-                               printk(KERN_DEBUG "%s: bogus packet size: %d, status=%#2x nxpg=%#2x.\n",
-                                          dev->name, rx_frame.count, rx_frame.status,
-                                          rx_frame.next);
+                               netdev_printk(KERN_DEBUG, dev,
+                                             "bogus packet size: %d, status=%#2x nxpg=%#2x\n",
+                                             rx_frame.count, rx_frame.status,
+                                             rx_frame.next);
                        dev->stats.rx_errors++;
                        dev->stats.rx_length_errors++;
                }
                        if (skb == NULL) 
                        {
                                if (ei_debug > 1)
-                                       printk(KERN_DEBUG "%s: Couldn't allocate a sk_buff of size %d.\n",
-                                                  dev->name, pkt_len);
+                                       netdev_printk(KERN_DEBUG, dev,
+                                                     "Couldn't allocate a sk_buff of size %d\n",
+                                                     pkt_len);
                                dev->stats.rx_dropped++;
                                break;
                        }
                else 
                {
                        if (ei_debug)
-                               printk(KERN_DEBUG "%s: bogus packet: status=%#2x nxpg=%#2x size=%d\n",
-                                          dev->name, rx_frame.status, rx_frame.next,
-                                          rx_frame.count);
+                               netdev_printk(KERN_DEBUG, dev,
+                                             "bogus packet: status=%#2x nxpg=%#2x size=%d\n",
+                                             rx_frame.status, rx_frame.next,
+                                             rx_frame.count);
                        dev->stats.rx_errors++;
                        /* NB: The NIC counts CRC, frame and missed errors. */
                        if (pkt_stat & ENRSR_FO)
                
                /* This _should_ never happen: it's here for avoiding bad clones. */
                if (next_frame >= ei_local->stop_page) {
-                       printk("%s: next frame inconsistency, %#2x\n", dev->name,
-                                  next_frame);
+                       netdev_info(dev, "next frame inconsistency, %#2x\n",
+                                   next_frame);
                        next_frame = ei_local->rx_start_page;
                }
                ei_local->current_page = next_frame;
@@@ -1472,7 -1529,7 +1472,7 @@@ static void ei_rx_overrun(struct net_de
        outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, e8390_base+E8390_CMD);
      
        if (ei_debug > 1)
-               printk(KERN_DEBUG "%s: Receiver overrun.\n", dev->name);
+               netdev_printk(KERN_DEBUG, dev, "Receiver overrun\n");
        dev->stats.rx_over_errors++;
      
        /* 
@@@ -1669,7 -1726,7 +1669,7 @@@ static void AX88190_init(struct net_dev
        {
                outb_p(dev->dev_addr[i], e8390_base + EN1_PHYS_SHIFT(i));
                if(inb_p(e8390_base + EN1_PHYS_SHIFT(i))!=dev->dev_addr[i])
-                       printk(KERN_ERR "Hw. address read/write mismap %d\n",i);
+                       netdev_err(dev, "Hw. address read/write mismap %d\n", i);
        }
  
        outb_p(ei_local->rx_start_page, e8390_base + EN1_CURPAG);
@@@ -1706,8 -1763,7 +1706,7 @@@ static void NS8390_trigger_send(struct 
      
        if (inb_p(e8390_base) & E8390_TRANS) 
        {
-               printk(KERN_WARNING "%s: trigger_send() called with the transmitter busy.\n",
-                       dev->name);
+               netdev_warn(dev, "trigger_send() called with the transmitter busy\n");
                return;
        }
        outb_p(length & 0xff, e8390_base + EN0_TCNTLO);
@@@ -43,6 -43,7 +43,6 @@@
  #include <linux/arcdevice.h>
  #include <linux/com20020.h>
  
 -#include <pcmcia/cs.h>
  #include <pcmcia/cistpl.h>
  #include <pcmcia/ds.h>
  
  
  #define VERSION "arcnet: COM20020 PCMCIA support loaded.\n"
  
- #ifdef DEBUG
  
  static void regdump(struct net_device *dev)
  {
+ #ifdef DEBUG
      int ioaddr = dev->base_addr;
      int count;
      
-     printk("com20020 register dump:\n");
+     netdev_dbg(dev, "register dump:\n");
      for (count = ioaddr; count < ioaddr + 16; count++)
      {
        if (!(count % 16))
-           printk("\n%04X: ", count);
-       printk("%02X ", inb(count));
+           pr_cont("%04X:", count);
+       pr_cont(" %02X", inb(count));
      }
-     printk("\n");
+     pr_cont("\n");
      
-     printk("buffer0 dump:\n");
+     netdev_dbg(dev, "buffer0 dump:\n");
        /* set up the address register */
          count = 0;
        outb((count >> 8) | RDDATAflag | AUTOINCflag, _ADDR_HI);
      for (count = 0; count < 256+32; count++)
      {
        if (!(count % 16))
-           printk("\n%04X: ", count);
+           pr_cont("%04X:", count);
        
        /* copy the data */
-       printk("%02X ", inb(_MEMDATA));
+       pr_cont(" %02X", inb(_MEMDATA));
      }
-     printk("\n");
+     pr_cont("\n");
+ #endif
  }
  
- #else
- static inline void regdump(struct net_device *dev) { }
- #endif
  
  
  /*====================================================================*/
@@@ -122,6 -119,14 +118,6 @@@ typedef struct com20020_dev_t 
      struct net_device       *dev;
  } com20020_dev_t;
  
 -/*======================================================================
 -
 -    com20020_attach() creates an "instance" of the driver, allocating
 -    local data structures for one device.  The device is registered
 -    with Card Services.
 -
 -======================================================================*/
 -
  static int com20020_probe(struct pcmcia_device *p_dev)
  {
      com20020_dev_t *info;
  
      p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
      p_dev->resource[0]->end = 16;
 -    p_dev->conf.Attributes = CONF_ENABLE_IRQ;
 -    p_dev->conf.IntType = INT_MEMORY_AND_IO;
 +    p_dev->config_flags |= CONF_ENABLE_IRQ;
  
      info->dev = dev;
      p_dev->priv = info;
@@@ -164,6 -170,15 +160,6 @@@ fail_alloc_info
      return -ENOMEM;
  } /* com20020_attach */
  
 -/*======================================================================
 -
 -    This deletes a driver "instance".  The device is de-registered
 -    with Card Services.  If it has been released, all local data
 -    structures are freed.  Otherwise, the structures will be freed
 -    when the device is released.
 -
 -======================================================================*/
 -
  static void com20020_detach(struct pcmcia_device *link)
  {
      struct com20020_dev_t *info = link->priv;
  
  } /* com20020_detach */
  
 -/*======================================================================
 -
 -    com20020_config() is scheduled to run after a CARD_INSERTION event
 -    is received, to configure the PCMCIA socket, and to make the
 -    device available to the system.
 -
 -======================================================================*/
 -
  static int com20020_config(struct pcmcia_device *link)
  {
      struct arcnet_local *lp;
  
      dev->irq = link->irq;
  
 -    ret = pcmcia_request_configuration(link, &link->conf);
 +    ret = pcmcia_enable_device(link);
      if (ret)
            goto failed;
  
      i = com20020_found(dev, 0);       /* calls register_netdev */
      
      if (i != 0) {
-       dev_printk(KERN_NOTICE, &link->dev,
-               "com20020_cs: com20020_found() failed\n");
+       dev_notice(&link->dev,
+                  "com20020_found() failed\n");
        goto failed;
      }
  
-     dev_dbg(&link->dev,KERN_INFO "%s: port %#3lx, irq %d\n",
-            dev->name, dev->base_addr, dev->irq);
+     netdev_dbg(dev, "port %#3lx, irq %d\n",
+              dev->base_addr, dev->irq);
      return 0;
  
  failed:
      return -ENODEV;
  } /* com20020_config */
  
 -/*======================================================================
 -
 -    After a card is removed, com20020_release() will unregister the net
 -    device, and release the PCMCIA configuration.  If the device is
 -    still open, this will be postponed until it is closed.
 -
 -======================================================================*/
 -
  static void com20020_release(struct pcmcia_device *link)
  {
        dev_dbg(&link->dev, "com20020_release\n");
@@@ -331,7 -362,9 +327,7 @@@ MODULE_DEVICE_TABLE(pcmcia, com20020_id
  
  static struct pcmcia_driver com20020_cs_driver = {
        .owner          = THIS_MODULE,
 -      .drv            = {
 -              .name   = "com20020_cs",
 -      },
 +      .name           = "com20020_cs",
        .probe          = com20020_probe,
        .remove         = com20020_detach,
        .id_table       = com20020_ids,
@@@ -28,6 -28,8 +28,8 @@@
     
  ======================================================================*/
  
+ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  #define DRV_NAME      "fmvj18x_cs"
  #define DRV_VERSION   "2.9"
  
@@@ -49,6 -51,7 +51,6 @@@
  #include <linux/ioport.h>
  #include <linux/crc32.h>
  
 -#include <pcmcia/cs.h>
  #include <pcmcia/cistpl.h>
  #include <pcmcia/ciscode.h>
  #include <pcmcia/ds.h>
@@@ -251,7 -254,8 +253,7 @@@ static int fmvj18x_probe(struct pcmcia_
      link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
  
      /* General socket configuration */
 -    link->conf.Attributes = CONF_ENABLE_IRQ;
 -    link->conf.IntType = INT_MEMORY_AND_IO;
 +    link->config_flags |= CONF_ENABLE_IRQ;
  
      dev->netdev_ops = &fjn_netdev_ops;
      dev->watchdog_timeo = TX_TIMEOUT;
@@@ -289,7 -293,7 +291,7 @@@ static int mfc_try_io_port(struct pcmci
        link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
        if (link->resource[1]->start == 0) {
            link->resource[1]->end = 0;
-           printk(KERN_NOTICE "fmvj18x_cs: out of resource for serial\n");
+           pr_notice("out of resource for serial\n");
        }
        ret = pcmcia_request_io(link);
        if (ret == 0)
@@@ -311,7 -315,7 +313,7 @@@ static int ungermann_try_io_port(struc
        ret = pcmcia_request_io(link);
        if (ret == 0) {
            /* calculate ConfigIndex value */
 -          link->conf.ConfigIndex = 
 +          link->config_index =
                ((link->resource[0]->start & 0x0f0) >> 3) | 0x22;
            return ret;
        }
      return ret;       /* RequestIO failed */
  }
  
 -static int fmvj18x_ioprobe(struct pcmcia_device *p_dev,
 -                         cistpl_cftable_entry_t *cfg,
 -                         cistpl_cftable_entry_t *dflt,
 -                         unsigned int vcc,
 -                         void *priv_data)
 +static int fmvj18x_ioprobe(struct pcmcia_device *p_dev, void *priv_data)
  {
        return 0; /* strange, but that's what the code did already before... */
  }
@@@ -356,28 -364,28 +358,28 @@@ static int fmvj18x_config(struct pcmcia
                link->card_id == PRODID_TDK_NP9610 ||
                link->card_id == PRODID_TDK_MN3200) {
                /* MultiFunction Card */
 -              link->conf.ConfigBase = 0x800;
 -              link->conf.ConfigIndex = 0x47;
 +              link->config_base = 0x800;
 +              link->config_index = 0x47;
                link->resource[1]->end = 8;
            }
            break;
        case MANFID_NEC:
            cardtype = NEC; /* MultiFunction Card */
 -          link->conf.ConfigBase = 0x800;
 -          link->conf.ConfigIndex = 0x47;
 +          link->config_base = 0x800;
 +          link->config_index = 0x47;
            link->resource[1]->end = 8;
            break;
        case MANFID_KME:
            cardtype = KME; /* MultiFunction Card */
 -          link->conf.ConfigBase = 0x800;
 -          link->conf.ConfigIndex = 0x47;
 +          link->config_base = 0x800;
 +          link->config_index = 0x47;
            link->resource[1]->end = 8;
            break;
        case MANFID_CONTEC:
            cardtype = CONTEC;
            break;
        case MANFID_FUJITSU:
 -          if (link->conf.ConfigBase == 0x0fe0)
 +          if (link->config_base == 0x0fe0)
                cardtype = MBH10302;
            else if (link->card_id == PRODID_FUJITSU_MBH10302) 
                  /* RATOC REX-5588/9822/4886's PRODID are 0004(=MBH10302),
        case MANFID_FUJITSU:
            if (link->card_id == PRODID_FUJITSU_MBH10304) {
                cardtype = XXX10304;    /* MBH10304 with buggy CIS */
 -              link->conf.ConfigIndex = 0x20;
 +              link->config_index = 0x20;
            } else {
                cardtype = MBH10302;    /* NextCom NC5310, etc. */
 -              link->conf.ConfigIndex = 1;
 +              link->config_index = 1;
            }
            break;
        case MANFID_UNGERMANN:
            break;
        default:
            cardtype = MBH10302;
 -          link->conf.ConfigIndex = 1;
 +          link->config_index = 1;
        }
      }
  
      ret = pcmcia_request_irq(link, fjn_interrupt);
      if (ret)
            goto failed;
 -    ret = pcmcia_request_configuration(link, &link->conf);
 +    ret = pcmcia_enable_device(link);
      if (ret)
            goto failed;
  
      case XXX10304:
        /* Read MACID from Buggy CIS */
        if (fmvj18x_get_hwinfo(link, buggybuf) == -1) {
-           printk(KERN_NOTICE "fmvj18x_cs: unable to read hardware net address.\n");
+           pr_notice("unable to read hardware net address\n");
            goto failed;
        }
        for (i = 0 ; i < 6; i++) {
      SET_NETDEV_DEV(dev, &link->dev);
  
      if (register_netdev(dev) != 0) {
-       printk(KERN_NOTICE "fmvj18x_cs: register_netdev() failed\n");
+       pr_notice("register_netdev() failed\n");
        goto failed;
      }
  
      /* print current configuration */
-     printk(KERN_INFO "%s: %s, sram %s, port %#3lx, irq %d, "
-          "hw_addr %pM\n",
-          dev->name, card_name, sram_config == 0 ? "4K TX*2" : "8K TX*2", 
-          dev->base_addr, dev->irq, dev->dev_addr);
+     netdev_info(dev, "%s, sram %s, port %#3lx, irq %d, hw_addr %pM\n",
+               card_name, sram_config == 0 ? "4K TX*2" : "8K TX*2",
+               dev->base_addr, dev->irq, dev->dev_addr);
  
      return 0;
      
@@@ -538,18 -545,20 +539,18 @@@ failed
  
  static int fmvj18x_get_hwinfo(struct pcmcia_device *link, u_char *node_id)
  {
 -    win_req_t req;
      u_char __iomem *base;
      int i, j;
  
      /* Allocate a small memory window */
 -    req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
 -    req.Base = 0; req.Size = 0;
 -    req.AccessSpeed = 0;
 -    i = pcmcia_request_window(link, &req, &link->win);
 +    link->resource[2]->flags |= WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
 +    link->resource[2]->start = 0; link->resource[2]->end = 0;
 +    i = pcmcia_request_window(link, link->resource[2], 0);
      if (i != 0)
        return -1;
  
 -    base = ioremap(req.Base, req.Size);
 -    pcmcia_map_mem_page(link, link->win, 0);
 +    base = ioremap(link->resource[2]->start, resource_size(link->resource[2]));
 +    pcmcia_map_mem_page(link, link->resource[2], 0);
  
      /*
       *  MBH10304 CISTPL_FUNCE_LAN_NODE_ID format
      }
  
      iounmap(base);
 -    j = pcmcia_release_window(link, link->win);
 +    j = pcmcia_release_window(link, link->resource[2]);
      return (i != 0x200) ? 0 : -1;
  
  } /* fmvj18x_get_hwinfo */
  
  static int fmvj18x_setup_mfc(struct pcmcia_device *link)
  {
 -    win_req_t req;
      int i;
      struct net_device *dev = link->priv;
      unsigned int ioaddr;
      local_info_t *lp = netdev_priv(dev);
  
      /* Allocate a small memory window */
 -    req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
 -    req.Base = 0; req.Size = 0;
 -    req.AccessSpeed = 0;
 -    i = pcmcia_request_window(link, &req, &link->win);
 +    link->resource[3]->flags = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
 +    link->resource[3]->start = link->resource[3]->end = 0;
 +    i = pcmcia_request_window(link, link->resource[3], 0);
      if (i != 0)
        return -1;
  
 -    lp->base = ioremap(req.Base, req.Size);
 +    lp->base = ioremap(link->resource[3]->start,
 +                     resource_size(link->resource[3]));
      if (lp->base == NULL) {
-       printk(KERN_NOTICE "fmvj18x_cs: ioremap failed\n");
+       netdev_notice(dev, "ioremap failed\n");
        return -1;
      }
  
 -    i = pcmcia_map_mem_page(link, link->win, 0);
 +    i = pcmcia_map_mem_page(link, link->resource[3], 0);
      if (i != 0) {
        iounmap(lp->base);
        lp->base = NULL;
@@@ -629,6 -639,7 +630,6 @@@ static void fmvj18x_release(struct pcmc
      struct net_device *dev = link->priv;
      local_info_t *lp = netdev_priv(dev);
      u_char __iomem *tmp;
 -    int j;
  
      dev_dbg(&link->dev, "fmvj18x_release\n");
  
        tmp = lp->base;
        lp->base = NULL;    /* set NULL before iounmap */
        iounmap(tmp);
 -      j = pcmcia_release_window(link, link->win);
      }
  
      pcmcia_disable_device(link);
@@@ -697,7 -709,9 +698,7 @@@ MODULE_DEVICE_TABLE(pcmcia, fmvj18x_ids
  
  static struct pcmcia_driver fmvj18x_cs_driver = {
        .owner          = THIS_MODULE,
 -      .drv            = {
 -              .name   = "fmvj18x_cs",
 -      },
 +      .name           = "fmvj18x_cs",
        .probe          = fmvj18x_probe,
        .remove         = fmvj18x_detach,
        .id_table       = fmvj18x_ids,
@@@ -787,17 -801,16 +788,16 @@@ static void fjn_tx_timeout(struct net_d
      struct local_info_t *lp = netdev_priv(dev);
      unsigned int ioaddr = dev->base_addr;
  
-     printk(KERN_NOTICE "%s: transmit timed out with status %04x, %s?\n",
-          dev->name, htons(inw(ioaddr + TX_STATUS)),
-          inb(ioaddr + TX_STATUS) & F_TMT_RDY
-          ? "IRQ conflict" : "network cable problem");
-     printk(KERN_NOTICE "%s: timeout registers: %04x %04x %04x "
-          "%04x %04x %04x %04x %04x.\n",
-          dev->name, htons(inw(ioaddr + 0)),
-          htons(inw(ioaddr + 2)), htons(inw(ioaddr + 4)),
-          htons(inw(ioaddr + 6)), htons(inw(ioaddr + 8)),
-          htons(inw(ioaddr +10)), htons(inw(ioaddr +12)),
-          htons(inw(ioaddr +14)));
+     netdev_notice(dev, "transmit timed out with status %04x, %s?\n",
+                 htons(inw(ioaddr + TX_STATUS)),
+                 inb(ioaddr + TX_STATUS) & F_TMT_RDY
+                 ? "IRQ conflict" : "network cable problem");
+     netdev_notice(dev, "timeout registers: %04x %04x %04x "
+                 "%04x %04x %04x %04x %04x.\n",
+                 htons(inw(ioaddr + 0)), htons(inw(ioaddr + 2)),
+                 htons(inw(ioaddr + 4)), htons(inw(ioaddr + 6)),
+                 htons(inw(ioaddr + 8)), htons(inw(ioaddr + 10)),
+                 htons(inw(ioaddr + 12)), htons(inw(ioaddr + 14)));
      dev->stats.tx_errors++;
      /* ToDo: We should try to restart the adaptor... */
      local_irq_disable();
@@@ -832,13 -845,13 +832,13 @@@ static netdev_tx_t fjn_start_xmit(struc
        unsigned char *buf = skb->data;
  
        if (length > ETH_FRAME_LEN) {
-           printk(KERN_NOTICE "%s: Attempting to send a large packet"
-                  " (%d bytes).\n", dev->name, length);
+           netdev_notice(dev, "Attempting to send a large packet (%d bytes)\n",
+                         length);
            return NETDEV_TX_BUSY;
        }
  
-       pr_debug("%s: Transmitting a packet of length %lu.\n",
-             dev->name, (unsigned long)skb->len);
+       netdev_dbg(dev, "Transmitting a packet of length %lu\n",
+                  (unsigned long)skb->len);
        dev->stats.tx_bytes += skb->len;
  
        /* Disable both interrupts. */
@@@ -891,7 -904,7 +891,7 @@@ static void fjn_reset(struct net_devic
      unsigned int ioaddr = dev->base_addr;
      int i;
  
-     pr_debug("fjn_reset(%s) called.\n",dev->name);
+     netdev_dbg(dev, "fjn_reset() called\n");
  
      /* Reset controller */
      if( sram_config == 0 ) 
@@@ -975,8 -988,8 +975,8 @@@ static void fjn_rx(struct net_device *d
      while ((inb(ioaddr + RX_MODE) & F_BUF_EMP) == 0) {
        u_short status = inw(ioaddr + DATAPORT);
  
-       pr_debug("%s: Rxing packet mode %02x status %04x.\n",
-             dev->name, inb(ioaddr + RX_MODE), status);
+       netdev_dbg(dev, "Rxing packet mode %02x status %04x.\n",
+                  inb(ioaddr + RX_MODE), status);
  #ifndef final_version
        if (status == 0) {
            outb(F_SKP_PKT, ioaddr + RX_SKIP);
            struct sk_buff *skb;
  
            if (pkt_len > 1550) {
-               printk(KERN_NOTICE "%s: The FMV-18x claimed a very "
-                      "large packet, size %d.\n", dev->name, pkt_len);
+               netdev_notice(dev, "The FMV-18x claimed a very large packet, size %d\n",
+                             pkt_len);
                outb(F_SKP_PKT, ioaddr + RX_SKIP);
                dev->stats.rx_errors++;
                break;
            }
            skb = dev_alloc_skb(pkt_len+2);
            if (skb == NULL) {
-               printk(KERN_NOTICE "%s: Memory squeeze, dropping "
-                      "packet (len %d).\n", dev->name, pkt_len);
+               netdev_notice(dev, "Memory squeeze, dropping packet (len %d)\n",
+                             pkt_len);
                outb(F_SKP_PKT, ioaddr + RX_SKIP);
                dev->stats.rx_dropped++;
                break;
@@@ -45,6 -45,8 +45,8 @@@
  
  ======================================================================*/
  
+ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  #include <linux/kernel.h>
  #include <linux/init.h>
  #include <linux/ptrace.h>
  #include <linux/string.h>
  #include <linux/timer.h>
  #include <linux/module.h>
- #include <linux/ethtool.h>
  #include <linux/netdevice.h>
  #include <linux/trdevice.h>
  #include <linux/ibmtr.h>
  
 -#include <pcmcia/cs.h>
  #include <pcmcia/cistpl.h>
  #include <pcmcia/ds.h>
  
@@@ -101,26 -103,25 +102,16 @@@ static void ibmtr_detach(struct pcmcia_
  
  typedef struct ibmtr_dev_t {
        struct pcmcia_device    *p_dev;
 -    struct net_device *dev;
 -    window_handle_t     sram_win_handle;
 -    struct tok_info   *ti;
 +      struct net_device       *dev;
 +      struct tok_info         *ti;
  } ibmtr_dev_t;
  
- static void netdev_get_drvinfo(struct net_device *dev,
-                              struct ethtool_drvinfo *info)
- {
-       strcpy(info->driver, "ibmtr_cs");
- }
- static const struct ethtool_ops netdev_ethtool_ops = {
-       .get_drvinfo            = netdev_get_drvinfo,
- };
  static irqreturn_t ibmtr_interrupt(int irq, void *dev_id) {
        ibmtr_dev_t *info = dev_id;
        struct net_device *dev = info->dev;
        return tok_interrupt(irq, dev);
  };
  
 -/*======================================================================
 -
 -    ibmtr_attach() creates an "instance" of the driver, allocating
 -    local data structures for one device.  The device is registered
 -    with Card Services.
 -
 -======================================================================*/
 -
  static int __devinit ibmtr_attach(struct pcmcia_device *link)
  {
      ibmtr_dev_t *info;
  
      link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
      link->resource[0]->end = 4;
 -    link->conf.Attributes = CONF_ENABLE_IRQ;
 -    link->conf.IntType = INT_MEMORY_AND_IO;
 -    link->conf.Present = PRESENT_OPTION;
 +    link->config_flags |= CONF_ENABLE_IRQ;
 +    link->config_regs = PRESENT_OPTION;
  
      info->dev = dev;
  
-     SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
      return ibmtr_config(link);
  } /* ibmtr_attach */
  
 -/*======================================================================
 -
 -    This deletes a driver "instance".  The device is de-registered
 -    with Card Services.  If it has been released, all local data
 -    structures are freed.  Otherwise, the structures will be freed
 -    when the device is released.
 -
 -======================================================================*/
 -
  static void ibmtr_detach(struct pcmcia_device *link)
  {
      struct ibmtr_dev_t *info = link->priv;
      kfree(info);
  } /* ibmtr_detach */
  
 -/*======================================================================
 -
 -    ibmtr_config() is scheduled to run after a CARD_INSERTION event
 -    is received, to configure the PCMCIA socket, and to make the
 -    token-ring device available to the system.
 -
 -======================================================================*/
 -
  static int __devinit ibmtr_config(struct pcmcia_device *link)
  {
      ibmtr_dev_t *info = link->priv;
      struct net_device *dev = info->dev;
      struct tok_info *ti = netdev_priv(dev);
 -    win_req_t req;
      int i, ret;
  
      dev_dbg(&link->dev, "ibmtr_config\n");
  
 -    link->conf.ConfigIndex = 0x61;
      link->io_lines = 16;
 +    link->config_index = 0x61;
  
      /* Determine if this is PRIMARY or ALTERNATE. */
  
      ti->global_int_enable=GLOBAL_INT_ENABLE+((dev->irq==9) ? 2 : dev->irq);
  
      /* Allocate the MMIO memory window */
 -    req.Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM|WIN_ENABLE;
 -    req.Attributes |= WIN_USE_WAIT;
 -    req.Base = 0; 
 -    req.Size = 0x2000;
 -    req.AccessSpeed = 250;
 -    ret = pcmcia_request_window(link, &req, &link->win);
 +    link->resource[2]->flags |= WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM|WIN_ENABLE;
 +    link->resource[2]->flags |= WIN_USE_WAIT;
 +    link->resource[2]->start = 0;
 +    link->resource[2]->end = 0x2000;
 +    ret = pcmcia_request_window(link, link->resource[2], 250);
      if (ret)
            goto failed;
  
 -    ret = pcmcia_map_mem_page(link, link->win, mmiobase);
 +    ret = pcmcia_map_mem_page(link, link->resource[2], mmiobase);
      if (ret)
            goto failed;
 -    ti->mmio = ioremap(req.Base, req.Size);
 +    ti->mmio = ioremap(link->resource[2]->start,
 +                  resource_size(link->resource[2]));
  
      /* Allocate the SRAM memory window */
 -    req.Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM|WIN_ENABLE;
 -    req.Attributes |= WIN_USE_WAIT;
 -    req.Base = 0;
 -    req.Size = sramsize * 1024;
 -    req.AccessSpeed = 250;
 -    ret = pcmcia_request_window(link, &req, &info->sram_win_handle);
 +    link->resource[3]->flags = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM|WIN_ENABLE;
 +    link->resource[3]->flags |= WIN_USE_WAIT;
 +    link->resource[3]->start = 0;
 +    link->resource[3]->end = sramsize * 1024;
 +    ret = pcmcia_request_window(link, link->resource[3], 250);
      if (ret)
            goto failed;
  
 -    ret = pcmcia_map_mem_page(link, info->sram_win_handle, srambase);
 +    ret = pcmcia_map_mem_page(link, link->resource[3], srambase);
      if (ret)
            goto failed;
  
      ti->sram_base = srambase >> 12;
 -    ti->sram_virt = ioremap(req.Base, req.Size);
 -    ti->sram_phys = req.Base;
 +    ti->sram_virt = ioremap(link->resource[3]->start,
 +                  resource_size(link->resource[3]));
 +    ti->sram_phys = link->resource[3]->start;
  
 -    ret = pcmcia_request_configuration(link, &link->conf);
 +    ret = pcmcia_enable_device(link);
      if (ret)
            goto failed;
  
  
      i = ibmtr_probe_card(dev);
      if (i != 0) {
-       printk(KERN_NOTICE "ibmtr_cs: register_netdev() failed\n");
+       pr_notice("register_netdev() failed\n");
        goto failed;
      }
  
-     printk(KERN_INFO
-          "%s: port %#3lx, irq %d,  mmio %#5lx, sram %#5lx, hwaddr=%pM\n",
-            dev->name, dev->base_addr, dev->irq,
-          (u_long)ti->mmio, (u_long)(ti->sram_base << 12),
-          dev->dev_addr);
+     netdev_info(dev, "port %#3lx, irq %d, mmio %#5lx, sram %#5lx, hwaddr=%pM\n",
+               dev->base_addr, dev->irq,
+               (u_long)ti->mmio, (u_long)(ti->sram_base << 12),
+               dev->dev_addr);
      return 0;
  
  failed:
      return -ENODEV;
  } /* ibmtr_config */
  
 -/*======================================================================
 -
 -    After a card is removed, ibmtr_release() will unregister the net
 -    device, and release the PCMCIA configuration.  If the device is
 -    still open, this will be postponed until it is closed.
 -
 -======================================================================*/
 -
  static void ibmtr_release(struct pcmcia_device *link)
  {
        ibmtr_dev_t *info = link->priv;
  
        dev_dbg(&link->dev, "ibmtr_release\n");
  
 -      if (link->win) {
 +      if (link->resource[2]->end) {
                struct tok_info *ti = netdev_priv(dev);
                iounmap(ti->mmio);
        }
@@@ -361,7 -386,9 +349,7 @@@ MODULE_DEVICE_TABLE(pcmcia, ibmtr_ids)
  
  static struct pcmcia_driver ibmtr_cs_driver = {
        .owner          = THIS_MODULE,
 -      .drv            = {
 -              .name   = "ibmtr_cs",
 -      },
 +      .name           = "ibmtr_cs",
        .probe          = ibmtr_attach,
        .remove         = ibmtr_detach,
        .id_table       = ibmtr_ids,
@@@ -111,6 -111,8 +111,8 @@@ Log: nmclan_cs.c,
  
  ---------------------------------------------------------------------------- */
  
+ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  #define DRV_NAME      "nmclan_cs"
  #define DRV_VERSION   "0.16"
  
@@@ -146,6 -148,7 +148,6 @@@ Include File
  #include <linux/ioport.h>
  #include <linux/bitops.h>
  
 -#include <pcmcia/cs.h>
  #include <pcmcia/cisreg.h>
  #include <pcmcia/cistpl.h>
  #include <pcmcia/ds.h>
@@@ -434,6 -437,13 +436,6 @@@ static const struct net_device_ops mace
        .ndo_validate_addr      = eth_validate_addr,
  };
  
 -/* ----------------------------------------------------------------------------
 -nmclan_attach
 -      Creates an "instance" of the driver, allocating local data
 -      structures for one device.  The device is registered with Card
 -      Services.
 ----------------------------------------------------------------------------- */
 -
  static int nmclan_probe(struct pcmcia_device *link)
  {
      mace_private *lp;
      spin_lock_init(&lp->bank_lock);
      link->resource[0]->end = 32;
      link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
 -    link->conf.Attributes = CONF_ENABLE_IRQ;
 -    link->conf.IntType = INT_MEMORY_AND_IO;
 -    link->conf.ConfigIndex = 1;
 -    link->conf.Present = PRESENT_OPTION;
 +    link->config_flags |= CONF_ENABLE_IRQ;
 +    link->config_index = 1;
 +    link->config_regs = PRESENT_OPTION;
  
      lp->tx_free_frames=AM2150_MAX_TX_FRAMES;
  
      return nmclan_config(link);
  } /* nmclan_attach */
  
 -/* ----------------------------------------------------------------------------
 -nmclan_detach
 -      This deletes a driver "instance".  The device is de-registered
 -      with Card Services.  If it has been released, all local data
 -      structures are freed.  Otherwise, the structures will be freed
 -      when the device is released.
 ----------------------------------------------------------------------------- */
 -
  static void nmclan_detach(struct pcmcia_device *link)
  {
      struct net_device *dev = link->priv;
@@@ -502,7 -521,7 +504,7 @@@ static int mace_read(mace_private *lp, 
        spin_unlock_irqrestore(&lp->bank_lock, flags);
        break;
    }
-   return (data & 0xFF);
+   return data & 0xFF;
  } /* mace_read */
  
  /* ----------------------------------------------------------------------------
@@@ -546,7 -565,7 +548,7 @@@ static int mace_init(mace_private *lp, 
      /* Wait for reset bit to be cleared automatically after <= 200ns */;
      if(++ct > 500)
      {
-       printk(KERN_ERR "mace: reset failed, card removed ?\n");
+       pr_err("reset failed, card removed?\n");
        return -1;
      }
      udelay(1);
    {
        if(++ ct > 500)
        {
-               printk(KERN_ERR "mace: ADDRCHG timeout, card removed ?\n");
+               pr_err("ADDRCHG timeout, card removed?\n");
                return -1;
        }
    }
    return 0;
  } /* mace_init */
  
 -/* ----------------------------------------------------------------------------
 -nmclan_config
 -      This routine is scheduled to run after a CARD_INSERTION event
 -      is received, to configure the PCMCIA socket, and to make the
 -      ethernet device available to the system.
 ----------------------------------------------------------------------------- */
 -
  static int nmclan_config(struct pcmcia_device *link)
  {
    struct net_device *dev = link->priv;
    ret = pcmcia_request_exclusive_irq(link, mace_interrupt);
    if (ret)
          goto failed;
 -  ret = pcmcia_request_configuration(link, &link->conf);
 +  ret = pcmcia_enable_device(link);
    if (ret)
          goto failed;
  
        dev_dbg(&link->dev, "nmclan_cs configured: mace id=%x %x\n",
            sig[0], sig[1]);
      } else {
-       printk(KERN_NOTICE "nmclan_cs: mace id not found: %x %x should"
-            " be 0x40 0x?9\n", sig[0], sig[1]);
+       pr_notice("mace id not found: %x %x should be 0x40 0x?9\n",
+               sig[0], sig[1]);
        return -ENODEV;
      }
    }
    if (if_port <= 2)
      dev->if_port = if_port;
    else
-     printk(KERN_NOTICE "nmclan_cs: invalid if_port requested\n");
+     pr_notice("invalid if_port requested\n");
  
    SET_NETDEV_DEV(dev, &link->dev);
  
    i = register_netdev(dev);
    if (i != 0) {
-     printk(KERN_NOTICE "nmclan_cs: register_netdev() failed\n");
+     pr_notice("register_netdev() failed\n");
      goto failed;
    }
  
-   printk(KERN_INFO "%s: nmclan: port %#3lx, irq %d, %s port,"
-        " hw_addr %pM\n",
-        dev->name, dev->base_addr, dev->irq, if_names[dev->if_port],
-        dev->dev_addr);
+   netdev_info(dev, "nmclan: port %#3lx, irq %d, %s port, hw_addr %pM\n",
+             dev->base_addr, dev->irq, if_names[dev->if_port], dev->dev_addr);
    return 0;
  
  failed:
        return -ENODEV;
  } /* nmclan_config */
  
 -/* ----------------------------------------------------------------------------
 -nmclan_release
 -      After a card is removed, nmclan_release() will unregister the
 -      net device, and release the PCMCIA configuration.  If the device
 -      is still open, this will be postponed until it is closed.
 ----------------------------------------------------------------------------- */
  static void nmclan_release(struct pcmcia_device *link)
  {
        dev_dbg(&link->dev, "nmclan_release\n");
@@@ -768,8 -798,7 +768,7 @@@ static int mace_config(struct net_devic
    if ((map->port != (u_char)(-1)) && (map->port != dev->if_port)) {
      if (map->port <= 2) {
        dev->if_port = map->port;
-       printk(KERN_INFO "%s: switched to %s port\n", dev->name,
-            if_names[dev->if_port]);
+       netdev_info(dev, "switched to %s port\n", if_names[dev->if_port]);
      } else
        return -EINVAL;
    }
@@@ -848,12 -877,12 +847,12 @@@ static void mace_tx_timeout(struct net_
    mace_private *lp = netdev_priv(dev);
    struct pcmcia_device *link = lp->p_dev;
  
-   printk(KERN_NOTICE "%s: transmit timed out -- ", dev->name);
+   netdev_notice(dev, "transmit timed out -- ");
  #if RESET_ON_TIMEOUT
-   printk("resetting card\n");
+   pr_cont("resetting card\n");
    pcmcia_reset_card(link->socket);
  #else /* #if RESET_ON_TIMEOUT */
-   printk("NOT resetting card\n");
+   pr_cont("NOT resetting card\n");
  #endif /* #if RESET_ON_TIMEOUT */
    dev->trans_start = jiffies; /* prevent tx timeout */
    netif_wake_queue(dev);
@@@ -935,22 -964,21 +934,21 @@@ static irqreturn_t mace_interrupt(int i
    ioaddr = dev->base_addr;
  
    if (lp->tx_irq_disabled) {
-     printk(
-       (lp->tx_irq_disabled?
-        KERN_NOTICE "%s: Interrupt with tx_irq_disabled "
-        "[isr=%02X, imr=%02X]\n": 
-        KERN_NOTICE "%s: Re-entering the interrupt handler "
-        "[isr=%02X, imr=%02X]\n"),
-       dev->name,
-       inb(ioaddr + AM2150_MACE_BASE + MACE_IR),
-       inb(ioaddr + AM2150_MACE_BASE + MACE_IMR)
-     );
+     const char *msg;
+     if (lp->tx_irq_disabled)
+       msg = "Interrupt with tx_irq_disabled";
+     else
+       msg = "Re-entering the interrupt handler";
+     netdev_notice(dev, "%s [isr=%02X, imr=%02X]\n",
+                 msg,
+                 inb(ioaddr + AM2150_MACE_BASE + MACE_IR),
+                 inb(ioaddr + AM2150_MACE_BASE + MACE_IMR));
      /* WARNING: MACE_IR has been read! */
      return IRQ_NONE;
    }
  
    if (!netif_device_present(dev)) {
-     pr_debug("%s: interrupt from dead card\n", dev->name);
+     netdev_dbg(dev, "interrupt from dead card\n");
      return IRQ_NONE;
    }
  
@@@ -1348,8 -1376,8 +1346,8 @@@ static void BuildLAF(int *ladrf, int *a
      printk(KERN_DEBUG "    adr =%pM\n", adr);
    printk(KERN_DEBUG "    hashcode = %d(decimal), ladrf[0:63] =", hashcode);
    for (i = 0; i < 8; i++)
-     printk(KERN_CONT " %02X", ladrf[i]);
-   printk(KERN_CONT "\n");
+     pr_cont(" %02X", ladrf[i]);
+   pr_cont("\n");
  #endif
  } /* BuildLAF */
  
@@@ -1505,7 -1533,9 +1503,7 @@@ MODULE_DEVICE_TABLE(pcmcia, nmclan_ids)
  
  static struct pcmcia_driver nmclan_cs_driver = {
        .owner          = THIS_MODULE,
 -      .drv            = {
 -              .name   = "nmclan_cs",
 -      },
 +      .name           = "nmclan_cs",
        .probe          = nmclan_probe,
        .remove         = nmclan_detach,
        .id_table       = nmclan_ids,
@@@ -28,6 -28,8 +28,8 @@@
  
  ======================================================================*/
  
+ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  #include <linux/kernel.h>
  #include <linux/module.h>
  #include <linux/init.h>
  #include <linux/string.h>
  #include <linux/timer.h>
  #include <linux/delay.h>
- #include <linux/ethtool.h>
  #include <linux/netdevice.h>
  #include <linux/log2.h>
  #include <linux/etherdevice.h>
  #include <linux/mii.h>
  #include "../8390.h"
  
 -#include <pcmcia/cs.h>
  #include <pcmcia/cistpl.h>
  #include <pcmcia/ciscode.h>
  #include <pcmcia/ds.h>
@@@ -99,7 -101,6 +100,6 @@@ static void pcnet_release(struct pcmcia
  static int pcnet_open(struct net_device *dev);
  static int pcnet_close(struct net_device *dev);
  static int ei_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
- static const struct ethtool_ops netdev_ethtool_ops;
  static irqreturn_t ei_irq_wrapper(int irq, void *dev_id);
  static void ei_watchdog(u_long arg);
  static void pcnet_reset_8390(struct net_device *dev);
@@@ -237,6 -238,14 +237,6 @@@ static const struct net_device_ops pcne
  #endif
  };
  
 -/*======================================================================
 -
 -    pcnet_attach() creates an "instance" of the driver, allocating
 -    local data structures for one device.  The device is registered
 -    with Card Services.
 -
 -======================================================================*/
 -
  static int pcnet_probe(struct pcmcia_device *link)
  {
      pcnet_dev_t *info;
      info->p_dev = link;
      link->priv = dev;
  
 -    link->conf.Attributes = CONF_ENABLE_IRQ;
 -    link->conf.IntType = INT_MEMORY_AND_IO;
 +    link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
  
      dev->netdev_ops = &pcnet_netdev_ops;
  
      return pcnet_config(link);
  } /* pcnet_attach */
  
 -/*======================================================================
 -
 -    This deletes a driver "instance".  The device is de-registered
 -    with Card Services.  If it has been released, all local data
 -    structures are freed.  Otherwise, the structures will be freed
 -    when the device is released.
 -
 -======================================================================*/
 -
  static void pcnet_detach(struct pcmcia_device *link)
  {
        struct net_device *dev = link->priv;
  static hw_info_t *get_hwinfo(struct pcmcia_device *link)
  {
      struct net_device *dev = link->priv;
 -    win_req_t req;
      u_char __iomem *base, *virt;
      int i, j;
  
      /* Allocate a small memory window */
 -    req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
 -    req.Base = 0; req.Size = 0;
 -    req.AccessSpeed = 0;
 -    i = pcmcia_request_window(link, &req, &link->win);
 +    link->resource[2]->flags |= WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
 +    link->resource[2]->start = 0; link->resource[2]->end = 0;
 +    i = pcmcia_request_window(link, link->resource[2], 0);
      if (i != 0)
        return NULL;
  
 -    virt = ioremap(req.Base, req.Size);
 +    virt = ioremap(link->resource[2]->start,
 +          resource_size(link->resource[2]));
      for (i = 0; i < NR_INFO; i++) {
 -      pcmcia_map_mem_page(link, link->win, hw_info[i].offset & ~(req.Size-1));
 -      base = &virt[hw_info[i].offset & (req.Size-1)];
 +      pcmcia_map_mem_page(link, link->resource[2],
 +              hw_info[i].offset & ~(resource_size(link->resource[2])-1));
 +      base = &virt[hw_info[i].offset & (resource_size(link->resource[2])-1)];
        if ((readb(base+0) == hw_info[i].a0) &&
            (readb(base+2) == hw_info[i].a1) &&
            (readb(base+4) == hw_info[i].a2)) {
      }
  
      iounmap(virt);
 -    j = pcmcia_release_window(link, link->win);
 +    j = pcmcia_release_window(link, link->resource[2]);
      return (i < NR_INFO) ? hw_info+i : NULL;
  } /* get_hwinfo */
  
@@@ -402,7 -421,7 +402,7 @@@ static hw_info_t *get_ax88190(struct pc
      int i, j;
  
      /* Not much of a test, but the alternatives are messy */
 -    if (link->conf.ConfigBase != 0x03c0)
 +    if (link->config_base != 0x03c0)
        return NULL;
  
      outb_p(0x01, ioaddr + EN0_DCFG);  /* Set word-wide access. */
        dev->dev_addr[i] = j & 0xff;
        dev->dev_addr[i+1] = j >> 8;
      }
-     printk(KERN_NOTICE "pcnet_cs: this is an AX88190 card!\n");
-     printk(KERN_NOTICE "pcnet_cs: use axnet_cs instead.\n");
      return NULL;
  }
  
@@@ -444,6 -461,14 +442,6 @@@ static hw_info_t *get_hwired(struct pcm
      return &default_info;
  } /* get_hwired */
  
 -/*======================================================================
 -
 -    pcnet_config() is scheduled to run after a CARD_INSERTION event
 -    is received, to configure the PCMCIA socket, and to make the
 -    ethernet device available to the system.
 -
 -======================================================================*/
 -
  static int try_io_port(struct pcmcia_device *link)
  {
      int j, ret;
      }
  }
  
 -static int pcnet_confcheck(struct pcmcia_device *p_dev,
 -                         cistpl_cftable_entry_t *cfg,
 -                         cistpl_cftable_entry_t *dflt,
 -                         unsigned int vcc,
 -                         void *priv_data)
 +static int pcnet_confcheck(struct pcmcia_device *p_dev, void *priv_data)
  {
        int *priv = priv_data;
        int try = (*priv & 0x1);
 -      int i;
 -      cistpl_io_t *io = &cfg->io;
  
 -      if (cfg->index == 0 || cfg->io.nwin == 0)
 -              return -EINVAL;
 +      *priv &= (p_dev->resource[2]->end >= 0x4000) ? 0x10 : ~0x10;
  
 -      /* For multifunction cards, by convention, we configure the
 -         network function with window 0, and serial with window 1 */
 -      if (io->nwin > 1) {
 -              i = (io->win[1].len > io->win[0].len);
 -              p_dev->resource[1]->start = io->win[1-i].base;
 -              p_dev->resource[1]->end = io->win[1-i].len;
 -      } else {
 -              i = p_dev->resource[1]->end = 0;
 -      }
 +      if (p_dev->config_index == 0)
 +              return -EINVAL;
  
 -      *priv &= ((cfg->mem.nwin == 1) &&
 -                (cfg->mem.win[0].len >= 0x4000)) ? 0x10 : ~0x10;
 +      if (p_dev->resource[0]->end + p_dev->resource[1]->end < 32)
 +              return -EINVAL;
  
 -      p_dev->resource[0]->start = io->win[i].base;
 -      p_dev->resource[0]->end = io->win[i].len;
 -      if (!try)
 -              p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
 -      else
 +      if (try)
                p_dev->io_lines = 16;
 -      if (p_dev->resource[0]->end + p_dev->resource[1]->end >= 32)
 -              return try_io_port(p_dev);
 -
 -      return -EINVAL;
 +      return try_io_port(p_dev);
  }
  
  static hw_info_t *pcnet_try_config(struct pcmcia_device *link,
        if (!link->irq)
                return NULL;
  
 -      if (resource_size(link->resource[1]) == 8) {
 -              link->conf.Attributes |= CONF_ENABLE_SPKR;
 -              link->conf.Status = CCSR_AUDIO_ENA;
 -      }
 +      if (resource_size(link->resource[1]) == 8)
 +              link->config_flags |= CONF_ENABLE_SPKR;
 +
        if ((link->manf_id == MANFID_IBM) &&
            (link->card_id == PRODID_IBM_HOME_AND_AWAY))
 -              link->conf.ConfigIndex |= 0x10;
 +              link->config_index |= 0x10;
  
 -      ret = pcmcia_request_configuration(link, &link->conf);
 +      ret = pcmcia_enable_device(link);
        if (ret)
                return NULL;
  
        } else
                dev->if_port = 0;
  
 -      if ((link->conf.ConfigBase == 0x03c0) &&
 +      if ((link->config_base == 0x03c0) &&
            (link->manf_id == 0x149) && (link->card_id == 0xc1ab)) {
                dev_info(&link->dev,
                        "this is an AX88190 card - use axnet_cs instead.\n");
@@@ -604,9 -651,7 +602,7 @@@ static int pcnet_config(struct pcmcia_d
  
      ei_status.name = "NE2000";
      ei_status.word16 = 1;
-     ei_status.reset_8390 = &pcnet_reset_8390;
-     SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
+     ei_status.reset_8390 = pcnet_reset_8390;
  
      if (info->flags & (IS_DL10019|IS_DL10022))
        mii_phy_probe(dev);
      SET_NETDEV_DEV(dev, &link->dev);
  
      if (register_netdev(dev) != 0) {
-       printk(KERN_NOTICE "pcnet_cs: register_netdev() failed\n");
+       pr_notice("register_netdev() failed\n");
        goto failed;
      }
  
      if (info->flags & (IS_DL10019|IS_DL10022)) {
        u_char id = inb(dev->base_addr + 0x1a);
-       printk(KERN_INFO "%s: NE2000 (DL100%d rev %02x): ",
-              dev->name, ((info->flags & IS_DL10022) ? 22 : 19), id);
+       netdev_info(dev, "NE2000 (DL100%d rev %02x): ",
+              (info->flags & IS_DL10022) ? 22 : 19, id);
        if (info->pna_phy)
-           printk("PNA, ");
+           pr_cont("PNA, ");
      } else {
-       printk(KERN_INFO "%s: NE2000 Compatible: ", dev->name);
+       netdev_info(dev, "NE2000 Compatible: ");
      }
-     printk("io %#3lx, irq %d,", dev->base_addr, dev->irq);
+     pr_cont("io %#3lx, irq %d,", dev->base_addr, dev->irq);
      if (info->flags & USE_SHMEM)
-       printk (" mem %#5lx,", dev->mem_start);
+       pr_cont(" mem %#5lx,", dev->mem_start);
      if (info->flags & HAS_MISC_REG)
-       printk(" %s xcvr,", if_names[dev->if_port]);
-     printk(" hw_addr %pM\n", dev->dev_addr);
+       pr_cont(" %s xcvr,", if_names[dev->if_port]);
+     pr_cont(" hw_addr %pM\n", dev->dev_addr);
      return 0;
  
  failed:
      return -ENODEV;
  } /* pcnet_config */
  
 -/*======================================================================
 -
 -    After a card is removed, pcnet_release() will unregister the net
 -    device, and release the PCMCIA configuration.  If the device is
 -    still open, this will be postponed until it is closed.
 -
 -======================================================================*/
 -
  static void pcnet_release(struct pcmcia_device *link)
  {
        pcnet_dev_t *info = PRIV(link->priv);
        pcmcia_disable_device(link);
  }
  
 -/*======================================================================
 -
 -    The card status event handler.  Mostly, this schedules other
 -    stuff to run after an event is received.  A CARD_REMOVAL event
 -    also sets some flags to discourage the net drivers from trying
 -    to talk to the card any more.
 -
 -======================================================================*/
 -
  static int pcnet_suspend(struct pcmcia_device *link)
  {
        struct net_device *dev = link->priv;
@@@ -889,7 -951,7 +885,7 @@@ static void mii_phy_probe(struct net_de
        phyid = tmp << 16;
        phyid |= mdio_read(mii_addr, i, MII_PHYID_REG2);
        phyid &= MII_PHYID_REV_MASK;
-       pr_debug("%s: MII at %d is 0x%08x\n", dev->name, i, phyid);
+       netdev_dbg(dev, "MII at %d is 0x%08x\n", i, phyid);
        if (phyid == AM79C9XX_HOME_PHY) {
            info->pna_phy = i;
        } else if (phyid != AM79C9XX_ETH_PHY) {
@@@ -922,7 -984,7 +918,7 @@@ static int pcnet_open(struct net_devic
      info->phy_id = info->eth_phy;
      info->link_status = 0x00;
      init_timer(&info->watchdog);
-     info->watchdog.function = &ei_watchdog;
+     info->watchdog.function = ei_watchdog;
      info->watchdog.data = (u_long)dev;
      info->watchdog.expires = jiffies + HZ;
      add_timer(&info->watchdog);
@@@ -975,8 -1037,8 +971,8 @@@ static void pcnet_reset_8390(struct net
      outb_p(ENISR_RESET, nic_base + EN0_ISR); /* Ack intr. */
  
      if (i == 100)
-       printk(KERN_ERR "%s: pcnet_reset_8390() did not complete.\n",
-              dev->name);
+       netdev_err(dev, "pcnet_reset_8390() did not complete.\n");
      set_misc_reg(dev);
  
  } /* pcnet_reset_8390 */
@@@ -992,8 -1054,7 +988,7 @@@ static int set_config(struct net_devic
        else if ((map->port < 1) || (map->port > 2))
            return -EINVAL;
        dev->if_port = map->port;
-       printk(KERN_INFO "%s: switched to %s port\n",
-              dev->name, if_names[dev->if_port]);
+       netdev_info(dev, "switched to %s port\n", if_names[dev->if_port]);
        NS8390_init(dev, 1);
      }
      return 0;
@@@ -1028,7 -1089,7 +1023,7 @@@ static void ei_watchdog(u_long arg
         this, we can limp along even if the interrupt is blocked */
      if (info->stale++ && (inb_p(nic_base + EN0_ISR) & ENISR_ALL)) {
        if (!info->fast_poll)
-           printk(KERN_INFO "%s: interrupt(s) dropped!\n", dev->name);
+           netdev_info(dev, "interrupt(s) dropped!\n");
        ei_irq_wrapper(dev->irq, dev);
        info->fast_poll = HZ;
      }
        if (info->eth_phy) {
            info->phy_id = info->eth_phy = 0;
        } else {
-           printk(KERN_INFO "%s: MII is missing!\n", dev->name);
+           netdev_info(dev, "MII is missing!\n");
            info->flags &= ~HAS_MII;
        }
        goto reschedule;
      link &= 0x0004;
      if (link != info->link_status) {
        u_short p = mdio_read(mii_addr, info->phy_id, 5);
-       printk(KERN_INFO "%s: %s link beat\n", dev->name,
-              (link) ? "found" : "lost");
+       netdev_info(dev, "%s link beat\n", link ? "found" : "lost");
        if (link && (info->flags & IS_DL10022)) {
            /* Disable collision detection on full duplex links */
            outb((p & 0x0140) ? 4 : 0, nic_base + DLINK_DIAG);
        if (link) {
            if (info->phy_id == info->eth_phy) {
                if (p)
-                   printk(KERN_INFO "%s: autonegotiation complete: "
-                          "%sbaseT-%cD selected\n", dev->name,
+                   netdev_info(dev, "autonegotiation complete: "
+                          "%sbaseT-%cD selected\n",
                           ((p & 0x0180) ? "100" : "10"),
                           ((p & 0x0140) ? 'F' : 'H'));
                else
-                   printk(KERN_INFO "%s: link partner did not "
-                          "autonegotiate\n", dev->name);
+                   netdev_info(dev, "link partner did not autonegotiate\n");
            }
            NS8390_init(dev, 1);
        }
            /* isolate this MII and try flipping to the other one */
            mdio_write(mii_addr, info->phy_id, 0, 0x0400);
            info->phy_id ^= info->pna_phy ^ info->eth_phy;
-           printk(KERN_INFO "%s: switched to %s transceiver\n", dev->name,
+           netdev_info(dev, "switched to %s transceiver\n",
                   (info->phy_id == info->eth_phy) ? "ethernet" : "PNA");
            mdio_write(mii_addr, info->phy_id, 0,
                       (info->phy_id == info->eth_phy) ? 0x1000 : 0);
@@@ -1104,18 -1163,6 +1097,6 @@@ reschedule
  
  /*====================================================================*/
  
- static void netdev_get_drvinfo(struct net_device *dev,
-                              struct ethtool_drvinfo *info)
- {
-       strcpy(info->driver, "pcnet_cs");
- }
- static const struct ethtool_ops netdev_ethtool_ops = {
-       .get_drvinfo            = netdev_get_drvinfo,
- };
- /*====================================================================*/
  
  static int ei_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
  {
@@@ -1148,9 -1195,9 +1129,9 @@@ static void dma_get_8390_hdr(struct net
      unsigned int nic_base = dev->base_addr;
  
      if (ei_status.dmaing) {
-       printk(KERN_NOTICE "%s: DMAing conflict in dma_block_input."
+       netdev_notice(dev, "DMAing conflict in dma_block_input."
               "[DMAstat:%1x][irqlock:%1x]\n",
-              dev->name, ei_status.dmaing, ei_status.irqlock);
+              ei_status.dmaing, ei_status.irqlock);
        return;
      }
  
@@@ -1181,11 -1228,11 +1162,11 @@@ static void dma_block_input(struct net_
      char *buf = skb->data;
  
      if ((ei_debug > 4) && (count != 4))
-       pr_debug("%s: [bi=%d]\n", dev->name, count+4);
+       netdev_dbg(dev, "[bi=%d]\n", count+4);
      if (ei_status.dmaing) {
-       printk(KERN_NOTICE "%s: DMAing conflict in dma_block_input."
+       netdev_notice(dev, "DMAing conflict in dma_block_input."
               "[DMAstat:%1x][irqlock:%1x]\n",
-              dev->name, ei_status.dmaing, ei_status.irqlock);
+              ei_status.dmaing, ei_status.irqlock);
        return;
      }
      ei_status.dmaing |= 0x01;
                break;
        } while (--tries > 0);
        if (tries <= 0)
-           printk(KERN_NOTICE "%s: RX transfer address mismatch,"
+           netdev_notice(dev, "RX transfer address mismatch,"
                   "%#4.4x (expected) vs. %#4.4x (actual).\n",
-                  dev->name, ring_offset + xfer_count, addr);
+                  ring_offset + xfer_count, addr);
      }
  #endif
      outb_p(ENISR_RDC, nic_base + EN0_ISR);    /* Ack intr. */
@@@ -1238,7 -1285,7 +1219,7 @@@ static void dma_block_output(struct net
  
  #ifdef PCMCIA_DEBUG
      if (ei_debug > 4)
-       printk(KERN_DEBUG "%s: [bo=%d]\n", dev->name, count);
+       netdev_dbg(dev, "[bo=%d]\n", count);
  #endif
  
      /* Round the count up for word writes.  Do we need to do this?
      if (count & 0x01)
        count++;
      if (ei_status.dmaing) {
-       printk(KERN_NOTICE "%s: DMAing conflict in dma_block_output."
+       netdev_notice(dev, "DMAing conflict in dma_block_output."
               "[DMAstat:%1x][irqlock:%1x]\n",
-              dev->name, ei_status.dmaing, ei_status.irqlock);
+              ei_status.dmaing, ei_status.irqlock);
        return;
      }
      ei_status.dmaing |= 0x01;
                break;
        } while (--tries > 0);
        if (tries <= 0) {
-           printk(KERN_NOTICE "%s: Tx packet transfer address mismatch,"
+           netdev_notice(dev, "Tx packet transfer address mismatch,"
                   "%#4.4x (expected) vs. %#4.4x (actual).\n",
-                  dev->name, (start_page << 8) + count, addr);
+                  (start_page << 8) + count, addr);
            if (retries++ == 0)
                goto retry;
        }
  
      while ((inb_p(nic_base + EN0_ISR) & ENISR_RDC) == 0)
        if (time_after(jiffies, dma_start + PCNET_RDC_TIMEOUT)) {
-           printk(KERN_NOTICE "%s: timeout waiting for Tx RDC.\n",
-                  dev->name);
+           netdev_notice(dev, "timeout waiting for Tx RDC.\n");
            pcnet_reset_8390(dev);
            NS8390_init(dev, 1);
            break;
@@@ -1322,9 -1368,9 +1302,9 @@@ static int setup_dma_config(struct pcmc
      ei_status.stop_page = stop_pg;
  
      /* set up block i/o functions */
-     ei_status.get_8390_hdr = &dma_get_8390_hdr;
-     ei_status.block_input = &dma_block_input;
-     ei_status.block_output = &dma_block_output;
+     ei_status.get_8390_hdr = dma_get_8390_hdr;
+     ei_status.block_input = dma_block_input;
+     ei_status.block_output = dma_block_output;
  
      return 0;
  }
@@@ -1420,6 -1466,7 +1400,6 @@@ static int setup_shmem_window(struct pc
  {
      struct net_device *dev = link->priv;
      pcnet_dev_t *info = PRIV(dev);
 -    win_req_t req;
      int i, window_size, offset, ret;
  
      window_size = (stop_pg - start_pg) << 8;
      window_size = roundup_pow_of_two(window_size);
  
      /* Allocate a memory window */
 -    req.Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM|WIN_ENABLE;
 -    req.Attributes |= WIN_USE_WAIT;
 -    req.Base = 0; req.Size = window_size;
 -    req.AccessSpeed = mem_speed;
 -    ret = pcmcia_request_window(link, &req, &link->win);
 +    link->resource[3]->flags |= WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM|WIN_ENABLE;
 +    link->resource[3]->flags |= WIN_USE_WAIT;
 +    link->resource[3]->start = 0; link->resource[3]->end = window_size;
 +    ret = pcmcia_request_window(link, link->resource[3], mem_speed);
      if (ret)
            goto failed;
  
      offset = (start_pg << 8) + cm_offset;
      offset -= offset % window_size;
 -    ret = pcmcia_map_mem_page(link, link->win, offset);
 +    ret = pcmcia_map_mem_page(link, link->resource[3], offset);
      if (ret)
            goto failed;
  
      /* Try scribbling on the buffer */
 -    info->base = ioremap(req.Base, window_size);
 +    info->base = ioremap(link->resource[3]->start,
 +                      resource_size(link->resource[3]));
      for (i = 0; i < (TX_PAGES<<8); i += 2)
        __raw_writew((i>>1), info->base+offset+i);
      udelay(100);
      pcnet_reset_8390(dev);
      if (i != (TX_PAGES<<8)) {
        iounmap(info->base);
 -      pcmcia_release_window(link, link->win);
 -      info->base = NULL; link->win = 0;
 +      pcmcia_release_window(link, link->resource[3]);
 +      info->base = NULL;
        goto failed;
      }
  
      ei_status.mem = info->base + offset;
 -    ei_status.priv = req.Size;
 +    ei_status.priv = resource_size(link->resource[3]);
      dev->mem_start = (u_long)ei_status.mem;
 -    dev->mem_end = dev->mem_start + req.Size;
 +    dev->mem_end = dev->mem_start + resource_size(link->resource[3]);
  
      ei_status.tx_start_page = start_pg;
      ei_status.rx_start_page = start_pg + TX_PAGES;
 -    ei_status.stop_page = start_pg + ((req.Size - offset) >> 8);
 +    ei_status.stop_page = start_pg + (
 +          (resource_size(link->resource[3]) - offset) >> 8);
  
      /* set up block i/o functions */
-     ei_status.get_8390_hdr = &shmem_get_8390_hdr;
-     ei_status.block_input = &shmem_block_input;
-     ei_status.block_output = &shmem_block_output;
+     ei_status.get_8390_hdr = shmem_get_8390_hdr;
+     ei_status.block_input = shmem_block_input;
+     ei_status.block_output = shmem_block_output;
  
      info->flags |= USE_SHMEM;
      return 0;
@@@ -1706,7 -1752,9 +1686,7 @@@ MODULE_FIRMWARE("cis/PE-200.cis")
  MODULE_FIRMWARE("cis/tamarack.cis");
  
  static struct pcmcia_driver pcnet_driver = {
 -      .drv            = {
 -              .name   = "pcnet_cs",
 -      },
 +      .name           = "pcnet_cs",
        .probe          = pcnet_probe,
        .remove         = pcnet_detach,
        .owner          = THIS_MODULE,
@@@ -25,6 -25,8 +25,8 @@@
  
  ======================================================================*/
  
+ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  #include <linux/module.h>
  #include <linux/kernel.h>
  #include <linux/init.h>
@@@ -44,6 -46,7 +46,6 @@@
  #include <linux/jiffies.h>
  #include <linux/firmware.h>
  
 -#include <pcmcia/cs.h>
  #include <pcmcia/cistpl.h>
  #include <pcmcia/cisreg.h>
  #include <pcmcia/ciscode.h>
@@@ -293,12 -296,20 +295,12 @@@ static const struct net_device_ops smc_
        .ndo_tx_timeout         = smc_tx_timeout,
        .ndo_set_config         = s9k_config,
        .ndo_set_multicast_list = set_rx_mode,
-       .ndo_do_ioctl           = &smc_ioctl,
+       .ndo_do_ioctl           = smc_ioctl,
        .ndo_change_mtu         = eth_change_mtu,
        .ndo_set_mac_address    = eth_mac_addr,
        .ndo_validate_addr      = eth_validate_addr,
  };
  
 -/*======================================================================
 -
 -  smc91c92_attach() creates an "instance" of the driver, allocating
 -  local data structures for one device.  The device is registered
 -  with Card Services.
 -
 -======================================================================*/
 -
  static int smc91c92_probe(struct pcmcia_device *link)
  {
      struct smc_private *smc;
      link->priv = dev;
  
      spin_lock_init(&smc->lock);
 -    link->resource[0]->end = 16;
 -    link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
 -    link->conf.Attributes = CONF_ENABLE_IRQ;
 -    link->conf.IntType = INT_MEMORY_AND_IO;
  
      /* The SMC91c92-specific entries in the device structure. */
      dev->netdev_ops = &smc_netdev_ops;
      return smc91c92_config(link);
  } /* smc91c92_attach */
  
 -/*======================================================================
 -
 -    This deletes a driver "instance".  The device is de-registered
 -    with Card Services.  If it has been released, all local data
 -    structures are freed.  Otherwise, the structures will be freed
 -    when the device is released.
 -
 -======================================================================*/
 -
  static void smc91c92_detach(struct pcmcia_device *link)
  {
      struct net_device *dev = link->priv;
@@@ -390,28 -414,26 +392,28 @@@ static int mhz_3288_power(struct pcmcia
      mdelay(200);
  
      /* Now read and write the COR... */
 -    tmp = readb(smc->base + link->conf.ConfigBase + CISREG_COR);
 +    tmp = readb(smc->base + link->config_base + CISREG_COR);
      udelay(5);
 -    writeb(tmp, smc->base + link->conf.ConfigBase + CISREG_COR);
 +    writeb(tmp, smc->base + link->config_base + CISREG_COR);
  
      return 0;
  }
  
 -static int mhz_mfc_config_check(struct pcmcia_device *p_dev,
 -                              cistpl_cftable_entry_t *cf,
 -                              cistpl_cftable_entry_t *dflt,
 -                              unsigned int vcc,
 -                              void *priv_data)
 +static int mhz_mfc_config_check(struct pcmcia_device *p_dev, void *priv_data)
  {
        int k;
 -      p_dev->resource[1]->start = cf->io.win[0].base;
 +      p_dev->io_lines = 16;
 +      p_dev->resource[1]->start = p_dev->resource[0]->start;
 +      p_dev->resource[1]->end = 8;
 +      p_dev->resource[1]->flags &= ~IO_DATA_PATH_WIDTH;
 +      p_dev->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
 +      p_dev->resource[0]->end = 16;
 +      p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
 +      p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
        for (k = 0; k < 0x400; k += 0x10) {
                if (k & 0x80)
                        continue;
                p_dev->resource[0]->start = k ^ 0x300;
 -              p_dev->io_lines = 16;
                if (!pcmcia_request_io(p_dev))
                        return 0;
        }
@@@ -422,11 -444,14 +424,11 @@@ static int mhz_mfc_config(struct pcmcia
  {
      struct net_device *dev = link->priv;
      struct smc_private *smc = netdev_priv(dev);
 -    win_req_t req;
      unsigned int offset;
      int i;
  
 -    link->conf.Attributes |= CONF_ENABLE_SPKR;
 -    link->conf.Status = CCSR_AUDIO_ENA;
 -    link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
 -    link->resource[1]->end = 8;
 +    link->config_flags |= CONF_ENABLE_SPKR | CONF_ENABLE_IRQ |
 +          CONF_AUTO_SET_IO;
  
      /* The Megahertz combo cards have modem-like CIS entries, so
         we have to explicitly try a bunch of port combinations. */
      dev->base_addr = link->resource[0]->start;
  
      /* Allocate a memory window, for accessing the ISR */
 -    req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
 -    req.Base = req.Size = 0;
 -    req.AccessSpeed = 0;
 -    i = pcmcia_request_window(link, &req, &link->win);
 +    link->resource[2]->flags = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
 +    link->resource[2]->start = link->resource[2]->end = 0;
 +    i = pcmcia_request_window(link, link->resource[2], 0);
      if (i != 0)
            return -ENODEV;
  
 -    smc->base = ioremap(req.Base, req.Size);
 -    offset = (smc->manfid == MANFID_MOTOROLA) ? link->conf.ConfigBase : 0;
 -    i = pcmcia_map_mem_page(link, link->win, offset);
 +    smc->base = ioremap(link->resource[2]->start,
 +                  resource_size(link->resource[2]));
 +    offset = (smc->manfid == MANFID_MOTOROLA) ? link->config_base : 0;
 +    i = pcmcia_map_mem_page(link, link->resource[2], offset);
      if ((i == 0) &&
        (smc->manfid == MANFID_MEGAHERTZ) &&
        (smc->cardid == PRODID_MEGAHERTZ_EM3288))
@@@ -568,12 -593,14 +570,12 @@@ static int mot_setup(struct pcmcia_devi
  
  /*====================================================================*/
  
 -static int smc_configcheck(struct pcmcia_device *p_dev,
 -                         cistpl_cftable_entry_t *cf,
 -                         cistpl_cftable_entry_t *dflt,
 -                         unsigned int vcc,
 -                         void *priv_data)
 +static int smc_configcheck(struct pcmcia_device *p_dev, void *priv_data)
  {
 -      p_dev->resource[0]->start = cf->io.win[0].base;
 -      p_dev->io_lines = cf->io.flags & CISTPL_IO_LINES_MASK;
 +      p_dev->resource[0]->end = 16;
 +      p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
 +      p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
 +
        return pcmcia_request_io(p_dev);
  }
  
@@@ -582,8 -609,7 +584,8 @@@ static int smc_config(struct pcmcia_dev
      struct net_device *dev = link->priv;
      int i;
  
 -    link->resource[0]->end = 16;
 +    link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
 +
      i = pcmcia_loop_config(link, smc_configcheck, NULL);
      if (!i)
            dev->base_addr = link->resource[0]->start;
@@@ -616,14 -642,15 +618,14 @@@ static int osi_config(struct pcmcia_dev
      static const unsigned int com[4] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8 };
      int i, j;
  
 -    link->conf.Attributes |= CONF_ENABLE_SPKR;
 -    link->conf.Status = CCSR_AUDIO_ENA;
 +    link->config_flags |= CONF_ENABLE_SPKR | CONF_ENABLE_IRQ;
      link->resource[0]->end = 64;
      link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
      link->resource[1]->end = 8;
  
      /* Enable Hard Decode, LAN, Modem */
 -    link->conf.ConfigIndex = 0x23;
      link->io_lines = 16;
 +    link->config_index = 0x23;
  
      for (i = j = 0; j < 4; j++) {
        link->resource[1]->start = com[j];
      }
      if (i != 0) {
        /* Fallback: turn off hard decode */
 -      link->conf.ConfigIndex = 0x03;
 +      link->config_index = 0x03;
        link->resource[1]->end = 0;
        i = pcmcia_request_io(link);
      }
@@@ -788,20 -815,31 +790,20 @@@ static int check_sig(struct pcmcia_devi
        ((s >> 8) != (s & 0xff))) {
        SMC_SELECT_BANK(3);
        s = inw(ioaddr + REVISION);
-       return (s & 0xff);
+       return s & 0xff;
      }
  
      if (width) {
-           printk(KERN_INFO "smc91c92_cs: using 8-bit IO window.\n");
 -          modconf_t mod = {
 -                  .Attributes = CONF_IO_CHANGE_WIDTH,
 -          };
+           pr_info("using 8-bit IO window\n");
  
            smc91c92_suspend(link);
 -          pcmcia_modify_configuration(link, &mod);
 +          pcmcia_fixup_iowidth(link);
            smc91c92_resume(link);
            return check_sig(link);
      }
      return -ENODEV;
  }
  
 -/*======================================================================
 -
 -    smc91c92_config() is scheduled to run after a CARD_INSERTION event
 -    is received, to configure the PCMCIA socket, and to make the
 -    ethernet device available to the system.
 -
 -======================================================================*/
 -
  static int smc91c92_config(struct pcmcia_device *link)
  {
      struct net_device *dev = link->priv;
      i = pcmcia_request_irq(link, smc_interrupt);
      if (i)
            goto config_failed;
 -    i = pcmcia_request_configuration(link, &link->conf);
 +    i = pcmcia_enable_device(link);
      if (i)
            goto config_failed;
  
      if ((if_port >= 0) && (if_port <= 2))
        dev->if_port = if_port;
      else
-       printk(KERN_NOTICE "smc91c92_cs: invalid if_port requested\n");
+       dev_notice(&link->dev, "invalid if_port requested\n");
  
      switch (smc->manfid) {
      case MANFID_OSITECH:
      }
  
      if (i != 0) {
-       printk(KERN_NOTICE "smc91c92_cs: Unable to find hardware address.\n");
+       dev_notice(&link->dev, "Unable to find hardware address.\n");
        goto config_failed;
      }
  
      SET_NETDEV_DEV(dev, &link->dev);
  
      if (register_netdev(dev) != 0) {
-       printk(KERN_ERR "smc91c92_cs: register_netdev() failed\n");
+       dev_err(&link->dev, "register_netdev() failed\n");
        goto config_undo;
      }
  
-     printk(KERN_INFO "%s: smc91c%s rev %d: io %#3lx, irq %d, "
-          "hw_addr %pM\n",
-          dev->name, name, (rev & 0x0f), dev->base_addr, dev->irq,
-          dev->dev_addr);
+     netdev_info(dev, "smc91c%s rev %d: io %#3lx, irq %d, hw_addr %pM\n",
+               name, (rev & 0x0f), dev->base_addr, dev->irq, dev->dev_addr);
  
      if (rev > 0) {
        if (mir & 0x3ff)
-           printk(KERN_INFO "  %lu byte", mir);
+           netdev_info(dev, "  %lu byte", mir);
        else
-           printk(KERN_INFO "  %lu kb", mir>>10);
-       printk(" buffer, %s xcvr\n", (smc->cfg & CFG_MII_SELECT) ?
-              "MII" : if_names[dev->if_port]);
+           netdev_info(dev, "  %lu kb", mir>>10);
+       pr_cont(" buffer, %s xcvr\n",
+               (smc->cfg & CFG_MII_SELECT) ? "MII" : if_names[dev->if_port]);
      }
  
      if (smc->cfg & CFG_MII_SELECT) {
        if (smc->mii_if.phy_id != -1) {
-           dev_dbg(&link->dev, "  MII transceiver at index %d, status %x.\n",
-                 smc->mii_if.phy_id, j);
+           netdev_dbg(dev, "  MII transceiver at index %d, status %x\n",
+                      smc->mii_if.phy_id, j);
        } else {
-           printk(KERN_NOTICE "  No MII transceivers found!\n");
+           netdev_notice(dev, "  No MII transceivers found!\n");
        }
      }
      return 0;
@@@ -952,10 -988,18 +952,10 @@@ config_failed
      return -ENODEV;
  } /* smc91c92_config */
  
 -/*======================================================================
 -
 -    After a card is removed, smc91c92_release() will unregister the net
 -    device, and release the PCMCIA configuration.  If the device is
 -    still open, this will be postponed until it is closed.
 -
 -======================================================================*/
 -
  static void smc91c92_release(struct pcmcia_device *link)
  {
        dev_dbg(&link->dev, "smc91c92_release\n");
 -      if (link->win) {
 +      if (link->resource[2]->end) {
                struct net_device *dev = link->priv;
                struct smc_private *smc = netdev_priv(dev);
                iounmap(smc->base);
@@@ -1037,10 -1081,10 +1037,10 @@@ static void smc_dump(struct net_device 
      save = inw(ioaddr + BANK_SELECT);
      for (w = 0; w < 4; w++) {
        SMC_SELECT_BANK(w);
-       printk(KERN_DEBUG "bank %d: ", w);
+       netdev_printk(KERN_DEBUG, dev, "bank %d: ", w);
        for (i = 0; i < 14; i += 2)
-           printk(" %04x", inw(ioaddr + i));
-       printk("\n");
+           pr_cont(" %04x", inw(ioaddr + i));
+       pr_cont("\n");
      }
      outw(save, ioaddr + BANK_SELECT);
  }
@@@ -1062,7 -1106,7 +1062,7 @@@ static int smc_open(struct net_device *
        return -ENODEV;
      /* Physical device present signature. */
      if (check_sig(link) < 0) {
-       printk("smc91c92_cs: Yikes!  Bad chip signature!\n");
+       netdev_info(dev, "Yikes!  Bad chip signature!\n");
        return -ENODEV;
      }
      link->open++;
  
      smc_reset(dev);
      init_timer(&smc->media);
-     smc->media.function = &media_check;
+     smc->media.function = media_check;
      smc->media.data = (u_long) dev;
      smc->media.expires = jiffies + HZ;
      add_timer(&smc->media);
@@@ -1128,7 -1172,7 +1128,7 @@@ static void smc_hardware_send_packet(st
      u_char packet_no;
  
      if (!skb) {
-       printk(KERN_ERR "%s: In XMIT with no packet to send.\n", dev->name);
+       netdev_err(dev, "In XMIT with no packet to send\n");
        return;
      }
  
      packet_no = inw(ioaddr + PNR_ARR) >> 8;
      if (packet_no & 0x80) {
        /* If not, there is a hardware problem!  Likely an ejected card. */
-       printk(KERN_WARNING "%s: 91c92 hardware Tx buffer allocation"
-              " failed, status %#2.2x.\n", dev->name, packet_no);
+       netdev_warn(dev, "hardware Tx buffer allocation failed, status %#2.2x\n",
+                   packet_no);
        dev_kfree_skb_irq(skb);
        smc->saved_skb = NULL;
        netif_start_queue(dev);
        u_char *buf = skb->data;
        u_int length = skb->len; /* The chip will pad to ethernet min. */
  
-       pr_debug("%s: Trying to xmit packet of length %d.\n",
-             dev->name, length);
+       netdev_dbg(dev, "Trying to xmit packet of length %d\n", length);
        
        /* send the packet length: +6 for status word, length, and ctl */
        outw(0, ioaddr + DATA_1);
@@@ -1189,9 -1232,8 +1188,8 @@@ static void smc_tx_timeout(struct net_d
      struct smc_private *smc = netdev_priv(dev);
      unsigned int ioaddr = dev->base_addr;
  
-     printk(KERN_NOTICE "%s: SMC91c92 transmit timed out, "
-          "Tx_status %2.2x status %4.4x.\n",
-          dev->name, inw(ioaddr)&0xff, inw(ioaddr + 2));
+     netdev_notice(dev, "transmit timed out, Tx_status %2.2x status %4.4x.\n",
+                 inw(ioaddr)&0xff, inw(ioaddr + 2));
      dev->stats.tx_errors++;
      smc_reset(dev);
      dev->trans_start = jiffies; /* prevent tx timeout */
@@@ -1210,14 -1252,14 +1208,14 @@@ static netdev_tx_t smc_start_xmit(struc
  
      netif_stop_queue(dev);
  
-     pr_debug("%s: smc_start_xmit(length = %d) called,"
-         " status %4.4x.\n", dev->name, skb->len, inw(ioaddr + 2));
+     netdev_dbg(dev, "smc_start_xmit(length = %d) called, status %04x\n",
+              skb->len, inw(ioaddr + 2));
  
      if (smc->saved_skb) {
        /* THIS SHOULD NEVER HAPPEN. */
        dev->stats.tx_aborted_errors++;
-       printk(KERN_DEBUG "%s: Internal error -- sent packet while busy.\n",
-              dev->name);
+       netdev_printk(KERN_DEBUG, dev,
+                     "Internal error -- sent packet while busy\n");
        return NETDEV_TX_BUSY;
      }
      smc->saved_skb = skb;
      num_pages = skb->len >> 8;
  
      if (num_pages > 7) {
-       printk(KERN_ERR "%s: Far too big packet error.\n", dev->name);
+       netdev_err(dev, "Far too big packet error: %d pages\n", num_pages);
        dev_kfree_skb (skb);
        smc->saved_skb = NULL;
        dev->stats.tx_dropped++;
@@@ -1295,8 -1337,7 +1293,7 @@@ static void smc_tx_err(struct net_devic
      }
  
      if (tx_status & TS_SUCCESS) {
-       printk(KERN_NOTICE "%s: Successful packet caused error "
-              "interrupt?\n", dev->name);
+       netdev_notice(dev, "Successful packet caused error interrupt?\n");
      }
      /* re-enable transmit */
      SMC_SELECT_BANK(0);
@@@ -1486,8 -1527,7 +1483,7 @@@ static void smc_rx(struct net_device *d
      /* Assertion: we are in Window 2. */
  
      if (inw(ioaddr + FIFO_PORTS) & FP_RXEMPTY) {
-       printk(KERN_ERR "%s: smc_rx() with nothing on Rx FIFO.\n",
-              dev->name);
+       netdev_err(dev, "smc_rx() with nothing on Rx FIFO\n");
        return;
      }
  
@@@ -1602,8 -1642,7 +1598,7 @@@ static int s9k_config(struct net_devic
        else if (map->port > 2)
            return -EINVAL;
        dev->if_port = map->port;
-       printk(KERN_INFO "%s: switched to %s port\n",
-              dev->name, if_names[dev->if_port]);
+       netdev_info(dev, "switched to %s port\n", if_names[dev->if_port]);
        smc_reset(dev);
      }
      return 0;
@@@ -1754,7 -1793,7 +1749,7 @@@ static void media_check(u_long arg
         this, we can limp along even if the interrupt is blocked */
      if (smc->watchdog++ && ((i>>8) & i)) {
        if (!smc->fast_poll)
-           printk(KERN_INFO "%s: interrupt(s) dropped!\n", dev->name);
+           netdev_info(dev, "interrupt(s) dropped!\n");
        local_irq_save(flags);
        smc_interrupt(dev->irq, dev);
        local_irq_restore(flags);
        SMC_SELECT_BANK(3);
        link = mdio_read(dev, smc->mii_if.phy_id, 1);
        if (!link || (link == 0xffff)) {
-           printk(KERN_INFO "%s: MII is missing!\n", dev->name);
+           netdev_info(dev, "MII is missing!\n");
            smc->mii_if.phy_id = -1;
            goto reschedule;
        }
        link &= 0x0004;
        if (link != smc->link_status) {
            u_short p = mdio_read(dev, smc->mii_if.phy_id, 5);
-           printk(KERN_INFO "%s: %s link beat\n", dev->name,
-               (link) ? "found" : "lost");
+           netdev_info(dev, "%s link beat\n", link ? "found" : "lost");
            smc->duplex = (((p & 0x0100) || ((p & 0x1c0) == 0x40))
                           ? TCR_FDUPLX : 0);
            if (link) {
-               printk(KERN_INFO "%s: autonegotiation complete: "
-                      "%sbaseT-%cD selected\n", dev->name,
-                      ((p & 0x0180) ? "100" : "10"),
-                      (smc->duplex ? 'F' : 'H'));
+               netdev_info(dev, "autonegotiation complete: "
+                           "%dbaseT-%cD selected\n",
+                           (p & 0x0180) ? 100 : 10, smc->duplex ? 'F' : 'H');
            }
            SMC_SELECT_BANK(0);
            outw(inw(ioaddr + TCR) | smc->duplex, ioaddr + TCR);
      if (media != smc->media_status) {
        if ((media & smc->media_status & 1) &&
            ((smc->media_status ^ media) & EPH_LINK_OK))
-           printk(KERN_INFO "%s: %s link beat\n", dev->name,
-                  (smc->media_status & EPH_LINK_OK ? "lost" : "found"));
+           netdev_info(dev, "%s link beat\n",
+                       smc->media_status & EPH_LINK_OK ? "lost" : "found");
        else if ((media & smc->media_status & 2) &&
                 ((smc->media_status ^ media) & EPH_16COL))
-           printk(KERN_INFO "%s: coax cable %s\n", dev->name,
-                  (media & EPH_16COL ? "problem" : "ok"));
+           netdev_info(dev, "coax cable %s\n",
+                       media & EPH_16COL ? "problem" : "ok");
        if (dev->if_port == 0) {
            if (media & 1) {
                if (media & EPH_LINK_OK)
-                   printk(KERN_INFO "%s: flipped to 10baseT\n",
-                          dev->name);
+                   netdev_info(dev, "flipped to 10baseT\n");
                else
                    smc_set_xcvr(dev, 2);
            } else {
                if (media & EPH_16COL)
                    smc_set_xcvr(dev, 1);
                else
-                   printk(KERN_INFO "%s: flipped to 10base2\n",
-                          dev->name);
+                   netdev_info(dev, "flipped to 10base2\n");
            }
        }
        smc->media_status = media;
@@@ -2057,7 -2092,9 +2048,7 @@@ MODULE_DEVICE_TABLE(pcmcia, smc91c92_id
  
  static struct pcmcia_driver smc91c92_cs_driver = {
        .owner          = THIS_MODULE,
 -      .drv            = {
 -              .name   = "smc91c92_cs",
 -      },
 +      .name           = "smc91c92_cs",
        .probe          = smc91c92_probe,
        .remove         = smc91c92_detach,
        .id_table       = smc91c92_ids,
@@@ -63,6 -63,8 +63,8 @@@
   * OF THE POSSIBILITY OF SUCH DAMAGE.
   */
  
+ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  #include <linux/module.h>
  #include <linux/kernel.h>
  #include <linux/init.h>
@@@ -82,6 -84,7 +84,6 @@@
  #include <linux/bitops.h>
  #include <linux/mii.h>
  
 -#include <pcmcia/cs.h>
  #include <pcmcia/cistpl.h>
  #include <pcmcia/cisreg.h>
  #include <pcmcia/ciscode.h>
@@@ -209,13 -212,6 +211,6 @@@ enum xirc_cmd {       /* Commands *
  
  static const char *if_names[] = { "Auto", "10BaseT", "10Base2", "AUI", "100BaseT" };
  
- #define KDBG_XIRC KERN_DEBUG   "xirc2ps_cs: "
- #define KERR_XIRC KERN_ERR     "xirc2ps_cs: "
- #define KWRN_XIRC KERN_WARNING "xirc2ps_cs: "
- #define KNOT_XIRC KERN_NOTICE  "xirc2ps_cs: "
- #define KINF_XIRC KERN_INFO    "xirc2ps_cs: "
  /* card types */
  #define XIR_UNKNOWN  0        /* unknown: not supported */
  #define XIR_CE             1  /* (prodid 1) different hardware: not supported */
@@@ -266,11 -262,33 +261,11 @@@ static unsigned mii_rd(unsigned int ioa
  static void mii_wr(unsigned int ioaddr, u_char phyaddr, u_char phyreg,
                   unsigned data, int len);
  
 -/*
 - * The event() function is this driver's Card Services event handler.
 - * It will be called by Card Services when an appropriate card status
 - * event is received.  The config() and release() entry points are
 - * used to configure or release a socket, in response to card insertion
 - * and ejection events.  They are invoked from the event handler.
 - */
 -
  static int has_ce2_string(struct pcmcia_device * link);
  static int xirc2ps_config(struct pcmcia_device * link);
  static void xirc2ps_release(struct pcmcia_device * link);
 -
 -/****************
 - * The attach() and detach() entry points are used to create and destroy
 - * "instances" of the driver, where each instance represents everything
 - * needed to manage one actual PCMCIA card.
 - */
 -
  static void xirc2ps_detach(struct pcmcia_device *p_dev);
  
 -/****************
 - * You'll also need to prototype all the functions that will actually
 - * be used to talk to your device.  See 'pcmem_cs' for a good example
 - * of a fully self-sufficient driver; the other drivers rely more or
 - * less on other parts of the kernel.
 - */
 -
  static irqreturn_t xirc2ps_interrupt(int irq, void *dev_id);
  
  typedef struct local_info_t {
@@@ -327,26 -345,26 +322,26 @@@ PrintRegisters(struct net_device *dev
      if (pc_debug > 1) {
        int i, page;
  
-       printk(KDBG_XIRC "Register  common: ");
+       printk(KERN_DEBUG pr_fmt("Register  common: "));
        for (i = 0; i < 8; i++)
-           printk(" %2.2x", GetByte(i));
-       printk("\n");
+           pr_cont(" %2.2x", GetByte(i));
+       pr_cont("\n");
        for (page = 0; page <= 8; page++) {
-           printk(KDBG_XIRC "Register page %2x: ", page);
+           printk(KERN_DEBUG pr_fmt("Register page %2x: "), page);
            SelectPage(page);
            for (i = 8; i < 16; i++)
-               printk(" %2.2x", GetByte(i));
-           printk("\n");
+               pr_cont(" %2.2x", GetByte(i));
+           pr_cont("\n");
        }
        for (page=0x40 ; page <= 0x5f; page++) {
                if (page == 0x43 || (page >= 0x46 && page <= 0x4f) ||
                    (page >= 0x51 && page <=0x5e))
                        continue;
-           printk(KDBG_XIRC "Register page %2x: ", page);
+           printk(KERN_DEBUG pr_fmt("Register page %2x: "), page);
            SelectPage(page);
            for (i = 8; i < 16; i++)
-               printk(" %2.2x", GetByte(i));
-           printk("\n");
+               pr_cont(" %2.2x", GetByte(i));
+           pr_cont("\n");
        }
      }
  }
@@@ -478,6 -496,16 +473,6 @@@ static const struct net_device_ops netd
        .ndo_validate_addr      = eth_validate_addr,
  };
  
 -/****************
 - * xirc2ps_attach() creates an "instance" of the driver, allocating
 - * local data structures for one device.  The device is registered
 - * with Card Services.
 - *
 - * The dev_link structure is initialized, but we don't actually
 - * configure the card at this point -- we wait until we receive a
 - * card insertion event.
 - */
 -
  static int
  xirc2ps_probe(struct pcmcia_device *link)
  {
      link->priv = dev;
  
      /* General socket configuration */
 -    link->conf.Attributes = CONF_ENABLE_IRQ;
 -    link->conf.IntType = INT_MEMORY_AND_IO;
 -    link->conf.ConfigIndex = 1;
 +    link->config_index = 1;
  
      /* Fill in card specific entries */
      dev->netdev_ops = &netdev_ops;
      return xirc2ps_config(link);
  } /* xirc2ps_attach */
  
 -/****************
 - *  This deletes a driver "instance".  The device is de-registered
 - *  with Card Services.  If it has been released, all local data
 - *  structures are freed.  Otherwise, the structures will be freed
 - *  when the device is released.
 - */
 -
  static void
  xirc2ps_detach(struct pcmcia_device *link)
  {
@@@ -566,11 -603,11 +561,11 @@@ set_card_type(struct pcmcia_device *lin
      local->modem = 0;
      local->card_type = XIR_UNKNOWN;
      if (!(prodid & 0x40)) {
-       printk(KNOT_XIRC "Ooops: Not a creditcard\n");
+       pr_notice("Oops: Not a creditcard\n");
        return 0;
      }
      if (!(mediaid & 0x01)) {
-       printk(KNOT_XIRC "Not an Ethernet card\n");
+       pr_notice("Not an Ethernet card\n");
        return 0;
      }
      if (mediaid & 0x10) {
        }
      }
      if (local->card_type == XIR_CE || local->card_type == XIR_CEM) {
-       printk(KNOT_XIRC "Sorry, this is an old CE card\n");
+       pr_notice("Sorry, this is an old CE card\n");
        return 0;
      }
      if (local->card_type == XIR_UNKNOWN)
-       printk(KNOT_XIRC "unknown card (mediaid=%02x prodid=%02x)\n",
-              mediaid, prodid);
+       pr_notice("unknown card (mediaid=%02x prodid=%02x)\n", mediaid, prodid);
  
      return 1;
  }
@@@ -625,53 -661,44 +619,53 @@@ has_ce2_string(struct pcmcia_device * p
  }
  
  static int
 -xirc2ps_config_modem(struct pcmcia_device *p_dev,
 -                   cistpl_cftable_entry_t *cf,
 -                   cistpl_cftable_entry_t *dflt,
 -                   unsigned int vcc,
 -                   void *priv_data)
 +xirc2ps_config_modem(struct pcmcia_device *p_dev, void *priv_data)
  {
        unsigned int ioaddr;
  
 -      if (cf->io.nwin > 0  &&  (cf->io.win[0].base & 0xf) == 8) {
 -              for (ioaddr = 0x300; ioaddr < 0x400; ioaddr += 0x10) {
 -                      p_dev->resource[1]->start = cf->io.win[0].base;
 -                      p_dev->resource[0]->start = ioaddr;
 -                      if (!pcmcia_request_io(p_dev))
 -                              return 0;
 -              }
 +      if ((p_dev->resource[0]->start & 0xf) == 8)
 +              return -ENODEV;
 +
 +      p_dev->resource[0]->end = 16;
 +      p_dev->resource[1]->end = 8;
 +      p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
 +      p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_16;
 +      p_dev->resource[1]->flags &= ~IO_DATA_PATH_WIDTH;
 +      p_dev->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
 +      p_dev->io_lines = 10;
 +
 +      p_dev->resource[1]->start = p_dev->resource[0]->start;
 +      for (ioaddr = 0x300; ioaddr < 0x400; ioaddr += 0x10) {
 +              p_dev->resource[0]->start = ioaddr;
 +              if (!pcmcia_request_io(p_dev))
 +                      return 0;
        }
        return -ENODEV;
  }
  
  static int
 -xirc2ps_config_check(struct pcmcia_device *p_dev,
 -                   cistpl_cftable_entry_t *cf,
 -                   cistpl_cftable_entry_t *dflt,
 -                   unsigned int vcc,
 -                   void *priv_data)
 +xirc2ps_config_check(struct pcmcia_device *p_dev, void *priv_data)
  {
        int *pass = priv_data;
 +      resource_size_t tmp = p_dev->resource[1]->start;
  
 -      if (cf->io.nwin > 0 && (cf->io.win[0].base & 0xf) == 8) {
 -              p_dev->resource[1]->start = cf->io.win[0].base;
 -              p_dev->resource[0]->start = p_dev->resource[1]->start
 -                      + (*pass ? (cf->index & 0x20 ? -24:8)
 -                         : (cf->index & 0x20 ?   8:-24));
 -              if (!pcmcia_request_io(p_dev))
 -                      return 0;
 -      }
 -      return -ENODEV;
 +      tmp += (*pass ? (p_dev->config_index & 0x20 ? -24 : 8)
 +              : (p_dev->config_index & 0x20 ?   8 : -24));
 +
 +      if ((p_dev->resource[0]->start & 0xf) == 8)
 +              return -ENODEV;
 +
 +      p_dev->resource[0]->end = 18;
 +      p_dev->resource[1]->end = 8;
 +      p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
 +      p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_16;
 +      p_dev->resource[1]->flags &= ~IO_DATA_PATH_WIDTH;
 +      p_dev->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
 +      p_dev->io_lines = 10;
  
 +      p_dev->resource[1]->start = p_dev->resource[0]->start;
 +      p_dev->resource[0]->start = tmp;
 +      return pcmcia_request_io(p_dev);
  }
  
  
@@@ -694,6 -721,11 +688,6 @@@ static int pcmcia_get_mac_ce(struct pcm
  };
  
  
 -/****************
 - * xirc2ps_config() is scheduled to run after a CARD_INSERTION event
 - * is received, to configure the PCMCIA socket, and to make the
 - * ethernet device available to the system.
 - */
  static int
  xirc2ps_config(struct pcmcia_device * link)
  {
  
      /* Is this a valid        card */
      if (link->has_manf_id == 0) {
-       printk(KNOT_XIRC "manfid not found in CIS\n");
+       pr_notice("manfid not found in CIS\n");
        goto failure;
      }
  
        local->manf_str = "Toshiba";
        break;
        default:
-       printk(KNOT_XIRC "Unknown Card Manufacturer ID: 0x%04x\n",
-              (unsigned)link->manf_id);
+       pr_notice("Unknown Card Manufacturer ID: 0x%04x\n",
+                 (unsigned)link->manf_id);
        goto failure;
      }
      dev_dbg(&link->dev, "found %s card\n", local->manf_str);
  
      if (!set_card_type(link)) {
-       printk(KNOT_XIRC "this card is not supported\n");
+       pr_notice("this card is not supported\n");
        goto failure;
      }
  
        err = pcmcia_loop_tuple(link, CISTPL_FUNCE, pcmcia_get_mac_ce, dev);
  
      if (err) {
-       printk(KNOT_XIRC "node-id not found in CIS\n");
+       pr_notice("node-id not found in CIS\n");
        goto failure;
      }
  
 -    link->resource[0]->flags |= IO_DATA_PATH_WIDTH_16;
 -    link->io_lines = 10;
      if (local->modem) {
        int pass;
 +      link->config_flags |= CONF_AUTO_SET_IO;
  
 -      if (do_sound) {
 -          link->conf.Attributes |= CONF_ENABLE_SPKR;
 -          link->conf.Status |= CCSR_AUDIO_ENA;
 -      }
 -      link->resource[1]->end = 8;
 -      link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
        if (local->dingo) {
            /* Take the Modem IO port from the CIS and scan for a free
             * Ethernet port */
 -          link->resource[0]->end = 16; /* no Mako stuff anymore */
            if (!pcmcia_loop_config(link, xirc2ps_config_modem, NULL))
                    goto port_found;
        } else {
 -          link->resource[0]->end = 18;
            /* We do 2 passes here: The first one uses the regular mapping and
             * the second tries again, thereby considering that the 32 ports are
             * mirrored every 32 bytes. Actually we use a mirrored port for
             * the Mako if (on the first pass) the COR bit 5 is set.
             */
            for (pass=0; pass < 2; pass++)
 -                  if (!pcmcia_loop_config(link, xirc2ps_config_check, &pass))
 +                  if (!pcmcia_loop_config(link, xirc2ps_config_check,
 +                                                  &pass))
                            goto port_found;
            /* if special option:
             * try to configure as Ethernet only.
             * .... */
        }
-       printk(KNOT_XIRC "no ports available\n");
+       pr_notice("no ports available\n");
      } else {
 +      link->io_lines = 10;
        link->resource[0]->end = 16;
 +      link->resource[0]->flags |= IO_DATA_PATH_WIDTH_16;
        for (ioaddr = 0x300; ioaddr < 0x400; ioaddr += 0x10) {
            link->resource[0]->start = ioaddr;
            if (!(err = pcmcia_request_io(link)))
      if ((err=pcmcia_request_irq(link, xirc2ps_interrupt)))
        goto config_error;
  
 -    /****************
 -     * This actually configures the PCMCIA socket -- setting up
 -     * the I/O windows and the interrupt mapping.
 -     */
 -    if ((err=pcmcia_request_configuration(link, &link->conf)))
 +    link->config_flags |= CONF_ENABLE_IRQ;
 +    if (do_sound)
 +          link->config_flags |= CONF_ENABLE_SPKR;
 +
 +    if ((err = pcmcia_enable_device(link)))
        goto config_error;
  
      if (local->dingo) {
 -      win_req_t req;
 -
        /* Reset the modem's BAR to the correct value
         * This is necessary because in the RequestConfiguration call,
         * the base address of the ethernet port (BasePort1) is written
         * is at 0x0800. So we allocate a window into the attribute
         * memory and write direct to the CIS registers
         */
 -      req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
 -      req.Base = req.Size = 0;
 -      req.AccessSpeed = 0;
 -      if ((err = pcmcia_request_window(link, &req, &link->win)))
 +      link->resource[2]->flags = WIN_DATA_WIDTH_8 | WIN_MEMORY_TYPE_AM |
 +                                      WIN_ENABLE;
 +      link->resource[2]->start = link->resource[2]->end = 0;
 +      if ((err = pcmcia_request_window(link, link->resource[2], 0)))
            goto config_error;
  
 -      local->dingo_ccr = ioremap(req.Base,0x1000) + 0x0800;
 -      if ((err = pcmcia_map_mem_page(link, link->win, 0)))
 +      local->dingo_ccr = ioremap(link->resource[2]->start, 0x1000) + 0x0800;
 +      if ((err = pcmcia_map_mem_page(link, link->resource[2], 0)))
            goto config_error;
  
        /* Setup the CCRs; there are no infos in the CIS about the Ethernet
        #if 0
        {
            u_char tmp;
-           printk(KERN_INFO "ECOR:");
+           pr_info("ECOR:");
            for (i=0; i < 7; i++) {
                tmp = readb(local->dingo_ccr + i*2);
-               printk(" %02x", tmp);
+               pr_cont(" %02x", tmp);
            }
-           printk("\n");
-           printk(KERN_INFO "DCOR:");
+           pr_cont("\n");
+           pr_info("DCOR:");
            for (i=0; i < 4; i++) {
                tmp = readb(local->dingo_ccr + 0x20 + i*2);
-               printk(" %02x", tmp);
+               pr_cont(" %02x", tmp);
            }
-           printk("\n");
-           printk(KERN_INFO "SCOR:");
+           pr_cont("\n");
+           pr_info("SCOR:");
            for (i=0; i < 10; i++) {
                tmp = readb(local->dingo_ccr + 0x40 + i*2);
-               printk(" %02x", tmp);
+               pr_cont(" %02x", tmp);
            }
-           printk("\n");
+           pr_cont("\n");
        }
        #endif
  
               (local->mohawk && if_port==4))
        dev->if_port = if_port;
      else
-       printk(KNOT_XIRC "invalid if_port requested\n");
+       pr_notice("invalid if_port requested\n");
  
      /* we can now register the device with the net subsystem */
      dev->irq = link->irq;
      SET_NETDEV_DEV(dev, &link->dev);
  
      if ((err=register_netdev(dev))) {
-       printk(KNOT_XIRC "register_netdev() failed\n");
+       pr_notice("register_netdev() failed\n");
        goto config_error;
      }
  
      /* give some infos about the hardware */
-     printk(KERN_INFO "%s: %s: port %#3lx, irq %d, hwaddr %pM\n",
-          dev->name, local->manf_str,(u_long)dev->base_addr, (int)dev->irq,
-          dev->dev_addr);
+     netdev_info(dev, "%s: port %#3lx, irq %d, hwaddr %pM\n",
+               local->manf_str, (u_long)dev->base_addr, (int)dev->irq,
+               dev->dev_addr);
  
      return 0;
  
      return -ENODEV;
  } /* xirc2ps_config */
  
 -/****************
 - * After a card is removed, xirc2ps_release() will unregister the net
 - * device, and release the PCMCIA configuration.  If the device is
 - * still open, this will be postponed until it is closed.
 - */
  static void
  xirc2ps_release(struct pcmcia_device *link)
  {
        dev_dbg(&link->dev, "release\n");
  
 -      if (link->win) {
 +      if (link->resource[2]->end) {
                struct net_device *dev = link->priv;
                local_info_t *local = netdev_priv(dev);
                if (local->dingo)
@@@ -1047,8 -1092,7 +1041,7 @@@ xirc2ps_interrupt(int irq, void *dev_id
  
            skb = dev_alloc_skb(pktlen+3); /* 1 extra so we can use insw */
            if (!skb) {
-               printk(KNOT_XIRC "low memory, packet dropped (size=%u)\n",
-                      pktlen);
+               pr_notice("low memory, packet dropped (size=%u)\n", pktlen);
                dev->stats.rx_dropped++;
            } else { /* okay get the packet */
                skb_reserve(skb, 2);
@@@ -1217,7 -1261,7 +1210,7 @@@ xirc_tx_timeout(struct net_device *dev
  {
      local_info_t *lp = netdev_priv(dev);
      dev->stats.tx_errors++;
-     printk(KERN_NOTICE "%s: transmit timed out\n", dev->name);
+     netdev_notice(dev, "transmit timed out\n");
      schedule_work(&lp->tx_timeout_task);
  }
  
@@@ -1384,8 -1428,7 +1377,7 @@@ do_config(struct net_device *dev, struc
            local->probe_port = 0;
            dev->if_port = map->port;
        }
-       printk(KERN_INFO "%s: switching to %s port\n",
-              dev->name, if_names[dev->if_port]);
+       netdev_info(dev, "switching to %s port\n", if_names[dev->if_port]);
        do_reset(dev,1);  /* not the fine way :-) */
      }
      return 0;
@@@ -1525,7 -1568,7 +1517,7 @@@ do_reset(struct net_device *dev, int fu
      {
        SelectPage(0);
        value = GetByte(XIRCREG_ESR);    /* read the ESR */
-       printk(KERN_DEBUG "%s: ESR is: %#02x\n", dev->name, value);
+       pr_debug("%s: ESR is: %#02x\n", dev->name, value);
      }
    #endif
  
  
      if (full && local->mohawk && init_mii(dev)) {
        if (dev->if_port == 4 || local->dingo || local->new_mii) {
-           printk(KERN_INFO "%s: MII selected\n", dev->name);
+           netdev_info(dev, "MII selected\n");
            SelectPage(2);
            PutByte(XIRCREG2_MSR, GetByte(XIRCREG2_MSR) | 0x08);
            msleep(20);
        } else {
-           printk(KERN_INFO "%s: MII detected; using 10mbs\n",
-                  dev->name);
+           netdev_info(dev, "MII detected; using 10mbs\n");
            SelectPage(0x42);
            if (dev->if_port == 2) /* enable 10Base2 */
                PutByte(XIRCREG42_SWC1, 0xC0);
      }
  
      if (full)
-       printk(KERN_INFO "%s: media %s, silicon revision %d\n",
-              dev->name, if_names[dev->if_port], local->silicon);
+       netdev_info(dev, "media %s, silicon revision %d\n",
+                   if_names[dev->if_port], local->silicon);
      /* We should switch back to page 0 to avoid a bug in revision 0
       * where regs with offset below 8 can't be read after an access
       * to the MAC registers */
@@@ -1669,8 -1711,7 +1660,7 @@@ init_mii(struct net_device *dev
      control = mii_rd(ioaddr, 0, 0);
  
      if (control & 0x0400) {
-       printk(KERN_NOTICE "%s can't take PHY out of isolation mode\n",
-              dev->name);
+       netdev_notice(dev, "can't take PHY out of isolation mode\n");
        local->probe_port = 0;
        return 0;
      }
        }
  
        if (!(status & 0x0020)) {
-           printk(KERN_INFO "%s: autonegotiation failed;"
-                  " using 10mbs\n", dev->name);
+           netdev_info(dev, "autonegotiation failed; using 10mbs\n");
            if (!local->new_mii) {
                control = 0x0000;
                mii_wr(ioaddr,  0, 0, control, 16);
            }
        } else {
            linkpartner = mii_rd(ioaddr, 0, 5);
-           printk(KERN_INFO "%s: MII link partner: %04x\n",
-                  dev->name, linkpartner);
+           netdev_info(dev, "MII link partner: %04x\n", linkpartner);
            if (linkpartner & 0x0080) {
                dev->if_port = 4;
            } else
@@@ -1779,7 -1818,9 +1767,7 @@@ MODULE_DEVICE_TABLE(pcmcia, xirc2ps_ids
  
  static struct pcmcia_driver xirc2ps_cs_driver = {
        .owner          = THIS_MODULE,
 -      .drv            = {
 -              .name   = "xirc2ps_cs",
 -      },
 +      .name           = "xirc2ps_cs",
        .probe          = xirc2ps_probe,
        .remove         = xirc2ps_detach,
        .id_table       = xirc2ps_ids,
@@@ -856,8 -856,7 +856,8 @@@ static const struct file_operations ppp
        .poll           = ppp_poll,
        .unlocked_ioctl = ppp_ioctl,
        .open           = ppp_open,
 -      .release        = ppp_release
 +      .release        = ppp_release,
 +      .llseek         = noop_llseek,
  };
  
  static __net_init int ppp_init_net(struct net *net)
@@@ -1548,9 -1547,11 +1548,11 @@@ ppp_channel_push(struct channel *pch
   * Receive-side routines.
   */
  
- /* misuse a few fields of the skb for MP reconstruction */
- #define sequence      priority
- #define BEbits                cb[0]
+ struct ppp_mp_skb_parm {
+       u32             sequence;
+       u8              BEbits;
+ };
+ #define PPP_MP_CB(skb)        ((struct ppp_mp_skb_parm *)((skb)->cb))
  
  static inline void
  ppp_do_recv(struct ppp *ppp, struct sk_buff *skb, struct channel *pch)
@@@ -1879,13 -1880,13 +1881,13 @@@ ppp_receive_mp_frame(struct ppp *ppp, s
                seq = (skb->data[3] << 16) | (skb->data[4] << 8)| skb->data[5];
                mask = 0xffffff;
        }
-       skb->BEbits = skb->data[2];
+       PPP_MP_CB(skb)->BEbits = skb->data[2];
        skb_pull(skb, mphdrlen);        /* pull off PPP and MP headers */
  
        /*
         * Do protocol ID decompression on the first fragment of each packet.
         */
-       if ((skb->BEbits & B) && (skb->data[0] & 1))
+       if ((PPP_MP_CB(skb)->BEbits & B) && (skb->data[0] & 1))
                *skb_push(skb, 1) = 0;
  
        /*
                seq += mask + 1;
        else if ((int)(seq - ppp->minseq) > (int)(mask >> 1))
                seq -= mask + 1;        /* should never happen */
-       skb->sequence = seq;
+       PPP_MP_CB(skb)->sequence = seq;
        pch->lastseq = seq;
  
        /*
           before the start of the queue. */
        if (skb_queue_len(&ppp->mrq) >= PPP_MP_MAX_QLEN) {
                struct sk_buff *mskb = skb_peek(&ppp->mrq);
-               if (seq_before(ppp->minseq, mskb->sequence))
-                       ppp->minseq = mskb->sequence;
+               if (seq_before(ppp->minseq, PPP_MP_CB(mskb)->sequence))
+                       ppp->minseq = PPP_MP_CB(mskb)->sequence;
        }
  
        /* Pull completed packets off the queue and receive them. */
@@@ -1964,12 -1965,12 +1966,12 @@@ ppp_mp_insert(struct ppp *ppp, struct s
  {
        struct sk_buff *p;
        struct sk_buff_head *list = &ppp->mrq;
-       u32 seq = skb->sequence;
+       u32 seq = PPP_MP_CB(skb)->sequence;
  
        /* N.B. we don't need to lock the list lock because we have the
           ppp unit receive-side lock. */
        skb_queue_walk(list, p) {
-               if (seq_before(seq, p->sequence))
+               if (seq_before(seq, PPP_MP_CB(p)->sequence))
                        break;
        }
        __skb_queue_before(list, p, skb);
@@@ -1998,22 -1999,22 +2000,22 @@@ ppp_mp_reconstruct(struct ppp *ppp
        tail = NULL;
        for (p = head; p != (struct sk_buff *) list; p = next) {
                next = p->next;
-               if (seq_before(p->sequence, seq)) {
+               if (seq_before(PPP_MP_CB(p)->sequence, seq)) {
                        /* this can't happen, anyway ignore the skb */
                        printk(KERN_ERR "ppp_mp_reconstruct bad seq %u < %u\n",
-                              p->sequence, seq);
+                              PPP_MP_CB(p)->sequence, seq);
                        head = next;
                        continue;
                }
-               if (p->sequence != seq) {
+               if (PPP_MP_CB(p)->sequence != seq) {
                        /* Fragment `seq' is missing.  If it is after
                           minseq, it might arrive later, so stop here. */
                        if (seq_after(seq, minseq))
                                break;
                        /* Fragment `seq' is lost, keep going. */
                        lost = 1;
-                       seq = seq_before(minseq, p->sequence)?
-                               minseq + 1: p->sequence;
+                       seq = seq_before(minseq, PPP_MP_CB(p)->sequence)?
+                               minseq + 1: PPP_MP_CB(p)->sequence;
                        next = p;
                        continue;
                }
                 */
  
                /* B bit set indicates this fragment starts a packet */
-               if (p->BEbits & B) {
+               if (PPP_MP_CB(p)->BEbits & B) {
                        head = p;
                        lost = 0;
                        len = 0;
                len += p->len;
  
                /* Got a complete packet yet? */
-               if (lost == 0 && (p->BEbits & E) && (head->BEbits & B)) {
+               if (lost == 0 && (PPP_MP_CB(p)->BEbits & E) &&
+                   (PPP_MP_CB(head)->BEbits & B)) {
                        if (len > ppp->mrru + 2) {
                                ++ppp->dev->stats.rx_length_errors;
                                printk(KERN_DEBUG "PPP: reconstructed packet"
                 * and we haven't found a complete valid packet yet,
                 * we can discard up to and including this fragment.
                 */
-               if (p->BEbits & E)
+               if (PPP_MP_CB(p)->BEbits & E)
                        head = next;
  
                ++seq;
        if (tail != NULL) {
                /* If we have discarded any fragments,
                   signal a receive error. */
-               if (head->sequence != ppp->nextseq) {
+               if (PPP_MP_CB(head)->sequence != ppp->nextseq) {
                        if (ppp->debug & 1)
                                printk(KERN_DEBUG "  missed pkts %u..%u\n",
-                                      ppp->nextseq, head->sequence-1);
+                                      ppp->nextseq,
+                                      PPP_MP_CB(head)->sequence-1);
                        ++ppp->dev->stats.rx_dropped;
                        ppp_receive_error(ppp);
                }
                        /* copy to a single skb */
                        for (p = head; p != tail->next; p = p->next)
                                skb_copy_bits(p, 0, skb_put(skb, p->len), p->len);
-               ppp->nextseq = tail->sequence + 1;
+               ppp->nextseq = PPP_MP_CB(tail)->sequence + 1;
                head = tail->next;
        }
  
diff --combined drivers/net/usb/hso.c
@@@ -843,16 -843,7 +843,7 @@@ static netdev_tx_t hso_net_start_xmit(s
        return NETDEV_TX_OK;
  }
  
- static void hso_get_drvinfo(struct net_device *net, struct ethtool_drvinfo *info)
- {
-       struct hso_net *odev = netdev_priv(net);
-       strncpy(info->driver, driver_name, ETHTOOL_BUSINFO_LEN);
-       usb_make_path(odev->parent->usb, info->bus_info, sizeof info->bus_info);
- }
  static const struct ethtool_ops ops = {
-       .get_drvinfo = hso_get_drvinfo,
        .get_link = ethtool_op_get_link
  };
  
@@@ -1645,11 -1636,11 +1636,11 @@@ hso_wait_modem_status(struct hso_seria
   * NB: both 1->0 and 0->1 transitions are counted except for
   *     RI where only 0->1 is counted.
   */
 -static int hso_get_count(struct hso_serial *serial,
 -                        struct serial_icounter_struct __user *icnt)
 +static int hso_get_count(struct tty_struct *tty,
 +                struct serial_icounter_struct *icount)
  {
 -      struct serial_icounter_struct icount;
        struct uart_icount cnow;
 +      struct hso_serial *serial = get_serial_by_tty(tty);
        struct hso_tiocmget  *tiocmget = serial->tiocmget;
  
        memset(&icount, 0, sizeof(struct serial_icounter_struct));
        memcpy(&cnow, &tiocmget->icount, sizeof(struct uart_icount));
        spin_unlock_irq(&serial->serial_lock);
  
 -      icount.cts         = cnow.cts;
 -      icount.dsr         = cnow.dsr;
 -      icount.rng         = cnow.rng;
 -      icount.dcd         = cnow.dcd;
 -      icount.rx          = cnow.rx;
 -      icount.tx          = cnow.tx;
 -      icount.frame       = cnow.frame;
 -      icount.overrun     = cnow.overrun;
 -      icount.parity      = cnow.parity;
 -      icount.brk         = cnow.brk;
 -      icount.buf_overrun = cnow.buf_overrun;
 +      icount->cts         = cnow.cts;
 +      icount->dsr         = cnow.dsr;
 +      icount->rng         = cnow.rng;
 +      icount->dcd         = cnow.dcd;
 +      icount->rx          = cnow.rx;
 +      icount->tx          = cnow.tx;
 +      icount->frame       = cnow.frame;
 +      icount->overrun     = cnow.overrun;
 +      icount->parity      = cnow.parity;
 +      icount->brk         = cnow.brk;
 +      icount->buf_overrun = cnow.buf_overrun;
  
 -      return copy_to_user(icnt, &icount, sizeof(icount)) ? -EFAULT : 0;
 +      return 0;
  }
  
  
@@@ -1764,6 -1755,10 +1755,6 @@@ static int hso_serial_ioctl(struct tty_
        case TIOCMIWAIT:
                ret = hso_wait_modem_status(serial, arg);
                break;
 -
 -      case TIOCGICOUNT:
 -              ret = hso_get_count(serial, uarg);
 -              break;
        default:
                ret = -ENOIOCTLCMD;
                break;
@@@ -3296,7 -3291,6 +3287,7 @@@ static const struct tty_operations hso_
        .chars_in_buffer = hso_serial_chars_in_buffer,
        .tiocmget = hso_serial_tiocmget,
        .tiocmset = hso_serial_tiocmset,
 +      .get_icount = hso_get_count,
        .unthrottle = hso_unthrottle
  };
  
@@@ -105,7 -105,7 +105,7 @@@ static struct pci_driver airo_driver = 
     of statistics in the /proc filesystem */
  
  #define IGNLABEL(comment) NULL
- static char *statsLabels[] = {
+ static const char *statsLabels[] = {
        "RxOverrun",
        IGNLABEL("RxPlcpCrcErr"),
        IGNLABEL("RxPlcpFormatErr"),
     (no spaces) list of rates (up to 8). */
  
  static int rates[8];
- static int basic_rate;
  static char *ssids[3];
  
  static int io[4];
@@@ -250,7 -249,6 +249,6 @@@ MODULE_LICENSE("Dual BSD/GPL")
  MODULE_SUPPORTED_DEVICE("Aironet 4500, 4800 and Cisco 340/350");
  module_param_array(io, int, NULL, 0);
  module_param_array(irq, int, NULL, 0);
- module_param(basic_rate, int, 0);
  module_param_array(rates, int, NULL, 0);
  module_param_array(ssids, charp, NULL, 0);
  module_param(auto_wep, int, 0);
@@@ -932,7 -930,7 +930,7 @@@ typedef struct aironet_ioctl 
        unsigned char __user *data;     // d-data
  } aironet_ioctl;
  
- static char swversion[] = "2.1";
+ static const char swversion[] = "2.1";
  #endif /* CISCO_EXT */
  
  #define NUM_MODULES       2
@@@ -1374,7 -1372,7 +1372,7 @@@ static int micsetup(struct airo_info *a
        return SUCCESS;
  }
  
- static char micsnap[] = {0xAA,0xAA,0x03,0x00,0x40,0x96,0x00,0x02};
+ static const u8 micsnap[] = {0xAA,0xAA,0x03,0x00,0x40,0x96,0x00,0x02};
  
  /*===========================================================================
   * Description: Mic a packet
@@@ -2723,9 -2721,8 +2721,8 @@@ static int airo_networks_allocate(struc
        if (ai->networks)
                return 0;
  
-       ai->networks =
-           kzalloc(AIRO_MAX_NETWORK_COUNT * sizeof(BSSListElement),
-                   GFP_KERNEL);
+       ai->networks = kcalloc(AIRO_MAX_NETWORK_COUNT, sizeof(BSSListElement),
+                              GFP_KERNEL);
        if (!ai->networks) {
                airo_print_warn("", "Out of memory allocating beacons");
                return -ENOMEM;
@@@ -3884,15 -3881,6 +3881,6 @@@ static u16 setup_card(struct airo_info 
                                ai->config.rates[i] = rates[i];
                        }
                }
-               if ( basic_rate > 0 ) {
-                       for( i = 0; i < 8; i++ ) {
-                               if ( ai->config.rates[i] == basic_rate ||
-                                    !ai->config.rates ) {
-                                       ai->config.rates[i] = basic_rate | 0x80;
-                                       break;
-                               }
-                       }
-               }
                set_bit (FLAG_COMMIT, &ai->flags);
        }
  
@@@ -4430,24 -4418,21 +4418,24 @@@ static const struct file_operations pro
        .owner          = THIS_MODULE,
        .read           = proc_read,
        .open           = proc_statsdelta_open,
 -      .release        = proc_close
 +      .release        = proc_close,
 +      .llseek         = default_llseek,
  };
  
  static const struct file_operations proc_stats_ops = {
        .owner          = THIS_MODULE,
        .read           = proc_read,
        .open           = proc_stats_open,
 -      .release        = proc_close
 +      .release        = proc_close,
 +      .llseek         = default_llseek,
  };
  
  static const struct file_operations proc_status_ops = {
        .owner          = THIS_MODULE,
        .read           = proc_read,
        .open           = proc_status_open,
 -      .release        = proc_close
 +      .release        = proc_close,
 +      .llseek         = default_llseek,
  };
  
  static const struct file_operations proc_SSID_ops = {
        .read           = proc_read,
        .write          = proc_write,
        .open           = proc_SSID_open,
 -      .release        = proc_close
 +      .release        = proc_close,
 +      .llseek         = default_llseek,
  };
  
  static const struct file_operations proc_BSSList_ops = {
        .read           = proc_read,
        .write          = proc_write,
        .open           = proc_BSSList_open,
 -      .release        = proc_close
 +      .release        = proc_close,
 +      .llseek         = default_llseek,
  };
  
  static const struct file_operations proc_APList_ops = {
        .read           = proc_read,
        .write          = proc_write,
        .open           = proc_APList_open,
 -      .release        = proc_close
 +      .release        = proc_close,
 +      .llseek         = default_llseek,
  };
  
  static const struct file_operations proc_config_ops = {
        .read           = proc_read,
        .write          = proc_write,
        .open           = proc_config_open,
 -      .release        = proc_close
 +      .release        = proc_close,
 +      .llseek         = default_llseek,
  };
  
  static const struct file_operations proc_wepkey_ops = {
        .read           = proc_read,
        .write          = proc_write,
        .open           = proc_wepkey_open,
 -      .release        = proc_close
 +      .release        = proc_close,
 +      .llseek         = default_llseek,
  };
  
  static struct proc_dir_entry *airo_entry;
@@@ -5032,7 -5012,7 +5020,7 @@@ static void proc_config_on_close(struc
        airo_config_commit(dev, NULL, NULL, NULL);
  }
  
- static char *get_rmode(__le16 mode)
+ static const char *get_rmode(__le16 mode)
  {
          switch(mode & RXMODE_MASK) {
          case RXMODE_RFMON:  return "rfmon";
@@@ -60,6 -60,7 +60,7 @@@
  
  #include "base.h"
  #include "debug.h"
+ #include "../debug.h"
  
  static unsigned int ath5k_debug;
  module_param_named(debug, ath5k_debug, uint, 0);
@@@ -71,8 -72,6 +72,6 @@@
  #include "reg.h"
  #include "ani.h"
  
- static struct dentry *ath5k_global_debugfs;
  static int ath5k_debugfs_open(struct inode *inode, struct file *file)
  {
        file->private_data = inode->i_private;
@@@ -271,7 -270,6 +270,7 @@@ static const struct file_operations fop
        .write = write_file_beacon,
        .open = ath5k_debugfs_open,
        .owner = THIS_MODULE,
 +      .llseek = default_llseek,
  };
  
  
@@@ -291,7 -289,6 +290,7 @@@ static const struct file_operations fop
        .write = write_file_reset,
        .open = ath5k_debugfs_open,
        .owner = THIS_MODULE,
 +      .llseek = noop_llseek,
  };
  
  
@@@ -314,6 -311,7 +313,7 @@@ static const struct 
        { ATH5K_DEBUG_DUMP_TX,  "dumptx",       "print transmit skb content" },
        { ATH5K_DEBUG_DUMPBANDS, "dumpbands",   "dump bands" },
        { ATH5K_DEBUG_ANI,      "ani",          "adaptive noise immunity" },
+       { ATH5K_DEBUG_DESC,     "desc",         "descriptor chains" },
        { ATH5K_DEBUG_ANY,      "all",          "show all debug levels" },
  };
  
@@@ -371,7 -369,6 +371,7 @@@ static const struct file_operations fop
        .write = write_file_debug,
        .open = ath5k_debugfs_open,
        .owner = THIS_MODULE,
 +      .llseek = default_llseek,
  };
  
  
@@@ -483,9 -480,62 +483,63 @@@ static const struct file_operations fop
        .write = write_file_antenna,
        .open = ath5k_debugfs_open,
        .owner = THIS_MODULE,
 +      .llseek = default_llseek,
  };
  
+ /* debugfs: misc */
+ static ssize_t read_file_misc(struct file *file, char __user *user_buf,
+                                  size_t count, loff_t *ppos)
+ {
+       struct ath5k_softc *sc = file->private_data;
+       char buf[700];
+       unsigned int len = 0;
+       u32 filt = ath5k_hw_get_rx_filter(sc->ah);
+       len += snprintf(buf+len, sizeof(buf)-len, "bssid-mask: %pM\n",
+                       sc->bssidmask);
+       len += snprintf(buf+len, sizeof(buf)-len, "filter-flags: 0x%x ",
+                       filt);
+       if (filt & AR5K_RX_FILTER_UCAST)
+               len += snprintf(buf+len, sizeof(buf)-len, " UCAST");
+       if (filt & AR5K_RX_FILTER_MCAST)
+               len += snprintf(buf+len, sizeof(buf)-len, " MCAST");
+       if (filt & AR5K_RX_FILTER_BCAST)
+               len += snprintf(buf+len, sizeof(buf)-len, " BCAST");
+       if (filt & AR5K_RX_FILTER_CONTROL)
+               len += snprintf(buf+len, sizeof(buf)-len, " CONTROL");
+       if (filt & AR5K_RX_FILTER_BEACON)
+               len += snprintf(buf+len, sizeof(buf)-len, " BEACON");
+       if (filt & AR5K_RX_FILTER_PROM)
+               len += snprintf(buf+len, sizeof(buf)-len, " PROM");
+       if (filt & AR5K_RX_FILTER_XRPOLL)
+               len += snprintf(buf+len, sizeof(buf)-len, " XRPOLL");
+       if (filt & AR5K_RX_FILTER_PROBEREQ)
+               len += snprintf(buf+len, sizeof(buf)-len, " PROBEREQ");
+       if (filt & AR5K_RX_FILTER_PHYERR_5212)
+               len += snprintf(buf+len, sizeof(buf)-len, " PHYERR-5212");
+       if (filt & AR5K_RX_FILTER_RADARERR_5212)
+               len += snprintf(buf+len, sizeof(buf)-len, " RADARERR-5212");
+       if (filt & AR5K_RX_FILTER_PHYERR_5211)
+               snprintf(buf+len, sizeof(buf)-len, " PHYERR-5211");
+       if (filt & AR5K_RX_FILTER_RADARERR_5211)
+               len += snprintf(buf+len, sizeof(buf)-len, " RADARERR-5211");
+       len += snprintf(buf+len, sizeof(buf)-len, "\nopmode: %s (%d)\n",
+                       ath_opmode_to_string(sc->opmode), sc->opmode);
+       if (len > sizeof(buf))
+               len = sizeof(buf);
+       return simple_read_from_buffer(user_buf, count, ppos, buf, len);
+ }
+ static const struct file_operations fops_misc = {
+       .read = read_file_misc,
+       .open = ath5k_debugfs_open,
+       .owner = THIS_MODULE,
+ };
  
  /* debugfs: frameerrors */
  
@@@ -537,6 -587,8 +591,8 @@@ static ssize_t read_file_frameerrors(st
                                st->rxerr_jumbo*100/st->rx_all_count : 0);
        len += snprintf(buf+len, sizeof(buf)-len, "[RX all\t%d]\n",
                        st->rx_all_count);
+       len += snprintf(buf+len, sizeof(buf)-len, "RX-all-bytes\t%d\n",
+                       st->rx_bytes_count);
  
        len += snprintf(buf+len, sizeof(buf)-len,
                        "\nTX\n---------------------\n");
                                st->txerr_filt*100/st->tx_all_count : 0);
        len += snprintf(buf+len, sizeof(buf)-len, "[TX all\t%d]\n",
                        st->tx_all_count);
+       len += snprintf(buf+len, sizeof(buf)-len, "TX-all-bytes\t%d\n",
+                       st->tx_bytes_count);
  
        if (len > sizeof(buf))
                len = sizeof(buf);
@@@ -595,7 -649,6 +653,7 @@@ static const struct file_operations fop
        .write = write_file_frameerrors,
        .open = ath5k_debugfs_open,
        .owner = THIS_MODULE,
 +      .llseek = default_llseek,
  };
  
  
@@@ -662,20 -715,21 +720,21 @@@ static ssize_t read_file_ani(struct fil
        len += snprintf(buf+len, sizeof(buf)-len,
                        "beacon RSSI average:\t%d\n",
                        sc->ah->ah_beacon_rssi_avg.avg);
+ #define CC_PRINT(_struct, _field) \
+       _struct._field, \
+       _struct.cycles > 0 ? \
+       _struct._field*100/_struct.cycles : 0
        len += snprintf(buf+len, sizeof(buf)-len, "profcnt tx\t\t%u\t(%d%%)\n",
-                       as->pfc_tx,
-                       as->pfc_cycles > 0 ?
-                       as->pfc_tx*100/as->pfc_cycles : 0);
+                       CC_PRINT(as->last_cc, tx_frame));
        len += snprintf(buf+len, sizeof(buf)-len, "profcnt rx\t\t%u\t(%d%%)\n",
-                       as->pfc_rx,
-                       as->pfc_cycles > 0 ?
-                       as->pfc_rx*100/as->pfc_cycles : 0);
+                       CC_PRINT(as->last_cc, rx_frame));
        len += snprintf(buf+len, sizeof(buf)-len, "profcnt busy\t\t%u\t(%d%%)\n",
-                       as->pfc_busy,
-                       as->pfc_cycles > 0 ?
-                       as->pfc_busy*100/as->pfc_cycles : 0);
+                       CC_PRINT(as->last_cc, rx_busy));
+ #undef CC_PRINT
        len += snprintf(buf+len, sizeof(buf)-len, "profcnt cycles\t\t%u\n",
-                       as->pfc_cycles);
+                       as->last_cc.cycles);
        len += snprintf(buf+len, sizeof(buf)-len,
                        "listen time\t\t%d\tlast: %d\n",
                        as->listen_time, as->last_listen);
@@@ -753,7 -807,6 +812,7 @@@ static const struct file_operations fop
        .write = write_file_ani,
        .open = ath5k_debugfs_open,
        .owner = THIS_MODULE,
 +      .llseek = default_llseek,
  };
  
  
@@@ -768,7 -821,7 +827,7 @@@ static ssize_t read_file_queue(struct f
  
        struct ath5k_txq *txq;
        struct ath5k_buf *bf, *bf0;
-       int i, n = 0;
+       int i, n;
  
        len += snprintf(buf+len, sizeof(buf)-len,
                        "available txbuffers: %d\n", sc->txbuf_len);
                if (!txq->setup)
                        continue;
  
+               n = 0;
+               spin_lock_bh(&txq->lock);
                list_for_each_entry_safe(bf, bf0, &txq->q, list)
                        n++;
-               len += snprintf(buf+len, sizeof(buf)-len, "  len: %d\n", n);
+               spin_unlock_bh(&txq->lock);
+               len += snprintf(buf+len, sizeof(buf)-len,
+                               "  len: %d bufs: %d\n", txq->txq_len, n);
+               len += snprintf(buf+len, sizeof(buf)-len,
+                               "  stuck: %d\n", txq->txq_stuck);
        }
  
        if (len > sizeof(buf))
@@@ -817,25 -877,16 +883,17 @@@ static const struct file_operations fop
        .write = write_file_queue,
        .open = ath5k_debugfs_open,
        .owner = THIS_MODULE,
 +      .llseek = default_llseek,
  };
  
  
- /* init */
- void
- ath5k_debug_init(void)
- {
-       ath5k_global_debugfs = debugfs_create_dir("ath5k", NULL);
- }
  void
  ath5k_debug_init_device(struct ath5k_softc *sc)
  {
        sc->debug.level = ath5k_debug;
  
-       sc->debug.debugfs_phydir = debugfs_create_dir(wiphy_name(sc->hw->wiphy),
-                               ath5k_global_debugfs);
+       sc->debug.debugfs_phydir = debugfs_create_dir("ath5k",
+                               sc->hw->wiphy->debugfsdir);
  
        sc->debug.debugfs_debug = debugfs_create_file("debug",
                                S_IWUSR | S_IRUSR,
                                S_IWUSR | S_IRUSR,
                                sc->debug.debugfs_phydir, sc, &fops_antenna);
  
+       sc->debug.debugfs_misc = debugfs_create_file("misc",
+                               S_IRUSR,
+                               sc->debug.debugfs_phydir, sc, &fops_misc);
        sc->debug.debugfs_frameerrors = debugfs_create_file("frameerrors",
                                S_IWUSR | S_IRUSR,
                                sc->debug.debugfs_phydir, sc,
                                &fops_queue);
  }
  
- void
- ath5k_debug_finish(void)
- {
-       debugfs_remove(ath5k_global_debugfs);
- }
  void
  ath5k_debug_finish_device(struct ath5k_softc *sc)
  {
        debugfs_remove(sc->debug.debugfs_beacon);
        debugfs_remove(sc->debug.debugfs_reset);
        debugfs_remove(sc->debug.debugfs_antenna);
+       debugfs_remove(sc->debug.debugfs_misc);
        debugfs_remove(sc->debug.debugfs_frameerrors);
        debugfs_remove(sc->debug.debugfs_ani);
        debugfs_remove(sc->debug.debugfs_queue);
@@@ -962,7 -1012,7 +1019,7 @@@ ath5k_debug_printrxbuffs(struct ath5k_s
        struct ath5k_rx_status rs = {};
        int status;
  
-       if (likely(!(sc->debug.level & ATH5K_DEBUG_RESET)))
+       if (likely(!(sc->debug.level & ATH5K_DEBUG_DESC)))
                return;
  
        printk(KERN_DEBUG "rxdp %x, rxlink %p\n",
@@@ -1004,7 -1054,7 +1061,7 @@@ ath5k_debug_printtxbuf(struct ath5k_sof
        struct ath5k_tx_status ts = {};
        int done;
  
-       if (likely(!(sc->debug.level & ATH5K_DEBUG_RESET)))
+       if (likely(!(sc->debug.level & ATH5K_DEBUG_DESC)))
                return;
  
        done = sc->ah->ah_proc_tx_desc(sc->ah, bf->desc, &ts);
@@@ -71,8 -71,7 +71,8 @@@ static const struct file_operations fop
        .read = read_file_debug,
        .write = write_file_debug,
        .open = ath9k_debugfs_open,
 -      .owner = THIS_MODULE
 +      .owner = THIS_MODULE,
 +      .llseek = default_llseek,
  };
  
  #endif
@@@ -117,8 -116,7 +117,8 @@@ static const struct file_operations fop
        .read = read_file_tx_chainmask,
        .write = write_file_tx_chainmask,
        .open = ath9k_debugfs_open,
 -      .owner = THIS_MODULE
 +      .owner = THIS_MODULE,
 +      .llseek = default_llseek,
  };
  
  
@@@ -160,8 -158,7 +160,8 @@@ static const struct file_operations fop
        .read = read_file_rx_chainmask,
        .write = write_file_rx_chainmask,
        .open = ath9k_debugfs_open,
 -      .owner = THIS_MODULE
 +      .owner = THIS_MODULE,
 +      .llseek = default_llseek,
  };
  
  
@@@ -262,8 -259,7 +262,8 @@@ static ssize_t read_file_dma(struct fil
  static const struct file_operations fops_dma = {
        .read = read_file_dma,
        .open = ath9k_debugfs_open,
 -      .owner = THIS_MODULE
 +      .owner = THIS_MODULE,
 +      .llseek = default_llseek,
  };
  
  
@@@ -379,100 -375,9 +379,10 @@@ static ssize_t read_file_interrupt(stru
  static const struct file_operations fops_interrupt = {
        .read = read_file_interrupt,
        .open = ath9k_debugfs_open,
 -      .owner = THIS_MODULE
 +      .owner = THIS_MODULE,
 +      .llseek = default_llseek,
  };
  
- void ath_debug_stat_rc(struct ath_softc *sc, int final_rate)
- {
-       struct ath_rc_stats *stats;
-       stats = &sc->debug.stats.rcstats[final_rate];
-       stats->success++;
- }
- void ath_debug_stat_retries(struct ath_softc *sc, int rix,
-                           int xretries, int retries, u8 per)
- {
-       struct ath_rc_stats *stats = &sc->debug.stats.rcstats[rix];
-       stats->xretries += xretries;
-       stats->retries += retries;
-       stats->per = per;
- }
- static ssize_t read_file_rcstat(struct file *file, char __user *user_buf,
-                               size_t count, loff_t *ppos)
- {
-       struct ath_softc *sc = file->private_data;
-       char *buf;
-       unsigned int len = 0, max;
-       int i = 0;
-       ssize_t retval;
-       if (sc->cur_rate_table == NULL)
-               return 0;
-       max = 80 + sc->cur_rate_table->rate_cnt * 1024 + 1;
-       buf = kmalloc(max, GFP_KERNEL);
-       if (buf == NULL)
-               return -ENOMEM;
-       len += sprintf(buf, "%6s %6s %6s "
-                      "%10s %10s %10s %10s\n",
-                      "HT", "MCS", "Rate",
-                      "Success", "Retries", "XRetries", "PER");
-       for (i = 0; i < sc->cur_rate_table->rate_cnt; i++) {
-               u32 ratekbps = sc->cur_rate_table->info[i].ratekbps;
-               struct ath_rc_stats *stats = &sc->debug.stats.rcstats[i];
-               char mcs[5];
-               char htmode[5];
-               int used_mcs = 0, used_htmode = 0;
-               if (WLAN_RC_PHY_HT(sc->cur_rate_table->info[i].phy)) {
-                       used_mcs = snprintf(mcs, 5, "%d",
-                               sc->cur_rate_table->info[i].ratecode);
-                       if (WLAN_RC_PHY_40(sc->cur_rate_table->info[i].phy))
-                               used_htmode = snprintf(htmode, 5, "HT40");
-                       else if (WLAN_RC_PHY_20(sc->cur_rate_table->info[i].phy))
-                               used_htmode = snprintf(htmode, 5, "HT20");
-                       else
-                               used_htmode = snprintf(htmode, 5, "????");
-               }
-               mcs[used_mcs] = '\0';
-               htmode[used_htmode] = '\0';
-               len += snprintf(buf + len, max - len,
-                       "%6s %6s %3u.%d: "
-                       "%10u %10u %10u %10u\n",
-                       htmode,
-                       mcs,
-                       ratekbps / 1000,
-                       (ratekbps % 1000) / 100,
-                       stats->success,
-                       stats->retries,
-                       stats->xretries,
-                       stats->per);
-       }
-       if (len > max)
-               len = max;
-       retval = simple_read_from_buffer(user_buf, count, ppos, buf, len);
-       kfree(buf);
-       return retval;
- }
- static const struct file_operations fops_rcstat = {
-       .read = read_file_rcstat,
-       .open = ath9k_debugfs_open,
-       .owner = THIS_MODULE,
-       .llseek = default_llseek,
- };
  static const char * ath_wiphy_state_str(enum ath_wiphy_state state)
  {
        switch (state) {
@@@ -494,26 -399,20 +404,20 @@@ static ssize_t read_file_wiphy(struct f
                               size_t count, loff_t *ppos)
  {
        struct ath_softc *sc = file->private_data;
+       struct ath_wiphy *aphy = sc->pri_wiphy;
+       struct ieee80211_channel *chan = aphy->hw->conf.channel;
        char buf[512];
        unsigned int len = 0;
        int i;
        u8 addr[ETH_ALEN];
+       u32 tmp;
  
        len += snprintf(buf + len, sizeof(buf) - len,
                        "primary: %s (%s chan=%d ht=%d)\n",
                        wiphy_name(sc->pri_wiphy->hw->wiphy),
                        ath_wiphy_state_str(sc->pri_wiphy->state),
-                       sc->pri_wiphy->chan_idx, sc->pri_wiphy->chan_is_ht);
-       for (i = 0; i < sc->num_sec_wiphy; i++) {
-               struct ath_wiphy *aphy = sc->sec_wiphy[i];
-               if (aphy == NULL)
-                       continue;
-               len += snprintf(buf + len, sizeof(buf) - len,
-                               "secondary: %s (%s chan=%d ht=%d)\n",
-                               wiphy_name(aphy->hw->wiphy),
-                               ath_wiphy_state_str(aphy->state),
-                               aphy->chan_idx, aphy->chan_is_ht);
-       }
+                       ieee80211_frequency_to_channel(chan->center_freq),
+                       aphy->chan_is_ht);
  
        put_unaligned_le32(REG_READ_D(sc->sc_ah, AR_STA_ID0), addr);
        put_unaligned_le16(REG_READ_D(sc->sc_ah, AR_STA_ID1) & 0xffff, addr + 4);
        put_unaligned_le16(REG_READ_D(sc->sc_ah, AR_BSSMSKU) & 0xffff, addr + 4);
        len += snprintf(buf + len, sizeof(buf) - len,
                        "addrmask: %pM\n", addr);
+       tmp = ath9k_hw_getrxfilter(sc->sc_ah);
+       len += snprintf(buf + len, sizeof(buf) - len,
+                       "rfilt: 0x%x", tmp);
+       if (tmp & ATH9K_RX_FILTER_UCAST)
+               len += snprintf(buf + len, sizeof(buf) - len, " UCAST");
+       if (tmp & ATH9K_RX_FILTER_MCAST)
+               len += snprintf(buf + len, sizeof(buf) - len, " MCAST");
+       if (tmp & ATH9K_RX_FILTER_BCAST)
+               len += snprintf(buf + len, sizeof(buf) - len, " BCAST");
+       if (tmp & ATH9K_RX_FILTER_CONTROL)
+               len += snprintf(buf + len, sizeof(buf) - len, " CONTROL");
+       if (tmp & ATH9K_RX_FILTER_BEACON)
+               len += snprintf(buf + len, sizeof(buf) - len, " BEACON");
+       if (tmp & ATH9K_RX_FILTER_PROM)
+               len += snprintf(buf + len, sizeof(buf) - len, " PROM");
+       if (tmp & ATH9K_RX_FILTER_PROBEREQ)
+               len += snprintf(buf + len, sizeof(buf) - len, " PROBEREQ");
+       if (tmp & ATH9K_RX_FILTER_PHYERR)
+               len += snprintf(buf + len, sizeof(buf) - len, " PHYERR");
+       if (tmp & ATH9K_RX_FILTER_MYBEACON)
+               len += snprintf(buf + len, sizeof(buf) - len, " MYBEACON");
+       if (tmp & ATH9K_RX_FILTER_COMP_BAR)
+               len += snprintf(buf + len, sizeof(buf) - len, " COMP_BAR");
+       if (tmp & ATH9K_RX_FILTER_PSPOLL)
+               len += snprintf(buf + len, sizeof(buf) - len, " PSPOLL");
+       if (tmp & ATH9K_RX_FILTER_PHYRADAR)
+               len += snprintf(buf + len, sizeof(buf) - len, " PHYRADAR");
+       if (tmp & ATH9K_RX_FILTER_MCAST_BCAST_ALL)
+               len += snprintf(buf + len, sizeof(buf) - len, " MCAST_BCAST_ALL\n");
+       else
+               len += snprintf(buf + len, sizeof(buf) - len, "\n");
+       /* Put variable-length stuff down here, and check for overflows. */
+       for (i = 0; i < sc->num_sec_wiphy; i++) {
+               struct ath_wiphy *aphy = sc->sec_wiphy[i];
+               if (aphy == NULL)
+                       continue;
+               chan = aphy->hw->conf.channel;
+               len += snprintf(buf + len, sizeof(buf) - len,
+                       "secondary: %s (%s chan=%d ht=%d)\n",
+                       wiphy_name(aphy->hw->wiphy),
+                       ath_wiphy_state_str(aphy->state),
+                       ieee80211_frequency_to_channel(chan->center_freq),
+                       aphy->chan_is_ht);
+       }
        if (len > sizeof(buf))
                len = sizeof(buf);
  
@@@ -629,8 -572,7 +577,8 @@@ static const struct file_operations fop
        .read = read_file_wiphy,
        .write = write_file_wiphy,
        .open = ath9k_debugfs_open,
 -      .owner = THIS_MODULE
 +      .owner = THIS_MODULE,
 +      .llseek = default_llseek,
  };
  
  #define PR(str, elem)                                                 \
@@@ -670,6 -612,8 +618,8 @@@ static ssize_t read_file_xmit(struct fi
        PR("DESC CFG Error:  ", desc_cfg_err);
        PR("DATA Underrun:   ", data_underrun);
        PR("DELIM Underrun:  ", delim_underrun);
+       PR("TX-Pkts-All:     ", tx_pkts_all);
+       PR("TX-Bytes-All:    ", tx_bytes_all);
  
        if (len > size)
                len = size;
  void ath_debug_stat_tx(struct ath_softc *sc, struct ath_txq *txq,
                       struct ath_buf *bf, struct ath_tx_status *ts)
  {
+       TX_STAT_INC(txq->axq_qnum, tx_pkts_all);
+       sc->debug.stats.txstats[txq->axq_qnum].tx_bytes_all += bf->bf_mpdu->len;
        if (bf_isampdu(bf)) {
                if (bf_isxretried(bf))
                        TX_STAT_INC(txq->axq_qnum, a_xretries);
  static const struct file_operations fops_xmit = {
        .read = read_file_xmit,
        .open = ath9k_debugfs_open,
 -      .owner = THIS_MODULE
 +      .owner = THIS_MODULE,
 +      .llseek = default_llseek,
  };
  
  static ssize_t read_file_recv(struct file *file, char __user *user_buf,
        PHY_ERR("HT-LENGTH", ATH9K_PHYERR_HT_LENGTH_ILLEGAL);
        PHY_ERR("HT-RATE", ATH9K_PHYERR_HT_RATE_ILLEGAL);
  
+       len += snprintf(buf + len, size - len,
+                       "%18s : %10u\n", "RX-Pkts-All",
+                       sc->debug.stats.rxstats.rx_pkts_all);
+       len += snprintf(buf + len, size - len,
+                       "%18s : %10u\n", "RX-Bytes-All",
+                       sc->debug.stats.rxstats.rx_bytes_all);
        if (len > size)
                len = size;
  
@@@ -796,6 -749,9 +756,9 @@@ void ath_debug_stat_rx(struct ath_soft
  
        u32 phyerr;
  
+       RX_STAT_INC(rx_pkts_all);
+       sc->debug.stats.rxstats.rx_bytes_all += rs->rs_datalen;
        if (rs->rs_status & ATH9K_RXERR_CRC)
                RX_STAT_INC(crc_err);
        if (rs->rs_status & ATH9K_RXERR_DECRYPT)
  static const struct file_operations fops_recv = {
        .read = read_file_recv,
        .open = ath9k_debugfs_open,
 -      .owner = THIS_MODULE
 +      .owner = THIS_MODULE,
 +      .llseek = default_llseek,
  };
  
  static ssize_t read_file_regidx(struct file *file, char __user *user_buf,
@@@ -861,8 -816,7 +824,8 @@@ static const struct file_operations fop
        .read = read_file_regidx,
        .write = write_file_regidx,
        .open = ath9k_debugfs_open,
 -      .owner = THIS_MODULE
 +      .owner = THIS_MODULE,
 +      .llseek = default_llseek,
  };
  
  static ssize_t read_file_regval(struct file *file, char __user *user_buf,
@@@ -904,8 -858,7 +867,8 @@@ static const struct file_operations fop
        .read = read_file_regval,
        .write = write_file_regval,
        .open = ath9k_debugfs_open,
 -      .owner = THIS_MODULE
 +      .owner = THIS_MODULE,
 +      .llseek = default_llseek,
  };
  
  int ath9k_init_debug(struct ath_hw *ah)
                        sc, &fops_interrupt))
                goto err;
  
-       if (!debugfs_create_file("rcstat", S_IRUSR, sc->debug.debugfs_phy,
-                       sc, &fops_rcstat))
-               goto err;
        if (!debugfs_create_file("wiphy", S_IRUSR | S_IWUSR,
                        sc->debug.debugfs_phy, sc, &fops_wiphy))
                goto err;
@@@ -137,8 -137,6 +137,6 @@@ static int ath9k_htc_set_channel(struc
        if (priv->op_flags & OP_FULL_RESET)
                fastcc = false;
  
-       /* Fiddle around with fastcc later on, for now just use full reset */
-       fastcc = false;
        ath9k_htc_ps_wakeup(priv);
        htc_stop(priv->htc);
        WMI_CMD(WMI_DISABLE_INTR_CMDID);
        WMI_CMD(WMI_STOP_RECV_CMDID);
  
        ath_print(common, ATH_DBG_CONFIG,
-                 "(%u MHz) -> (%u MHz), HT: %d, HT40: %d\n",
+                 "(%u MHz) -> (%u MHz), HT: %d, HT40: %d fastcc: %d\n",
                  priv->ah->curchan->channel,
-                 channel->center_freq, conf_is_ht(conf), conf_is_ht40(conf));
+                 channel->center_freq, conf_is_ht(conf), conf_is_ht40(conf),
+                 fastcc);
  
        caldata = &priv->caldata[channel->hw_value];
        ret = ath9k_hw_reset(ah, hchan, caldata, fastcc);
@@@ -536,8 -535,7 +535,8 @@@ static ssize_t read_file_tgt_stats(stru
  static const struct file_operations fops_tgt_stats = {
        .read = read_file_tgt_stats,
        .open = ath9k_debugfs_open,
 -      .owner = THIS_MODULE
 +      .owner = THIS_MODULE,
 +      .llseek = default_llseek,
  };
  
  static ssize_t read_file_xmit(struct file *file, char __user *user_buf,
  static const struct file_operations fops_xmit = {
        .read = read_file_xmit,
        .open = ath9k_debugfs_open,
 -      .owner = THIS_MODULE
 +      .owner = THIS_MODULE,
 +      .llseek = default_llseek,
  };
  
  static ssize_t read_file_recv(struct file *file, char __user *user_buf,
  static const struct file_operations fops_recv = {
        .read = read_file_recv,
        .open = ath9k_debugfs_open,
 -      .owner = THIS_MODULE
 +      .owner = THIS_MODULE,
 +      .llseek = default_llseek,
  };
  
  int ath9k_htc_init_debug(struct ath_hw *ah)
@@@ -764,23 -760,12 +763,12 @@@ void ath9k_ani_work(struct work_struct 
                        ath9k_hw_ani_monitor(ah, ah->curchan);
  
                /* Perform calibration if necessary */
-               if (longcal || shortcal) {
+               if (longcal || shortcal)
                        common->ani.caldone =
                                ath9k_hw_calibrate(ah, ah->curchan,
                                                   common->rx_chainmask,
                                                   longcal);
  
-                       if (longcal)
-                               common->ani.noise_floor =
-                                       ath9k_hw_getchan_noise(ah, ah->curchan);
-                       ath_print(common, ATH_DBG_ANI,
-                                 " calibrate chan %u/%x nf: %d\n",
-                                 ah->curchan->channel,
-                                 ah->curchan->channelFlags,
-                                 common->ani.noise_floor);
-               }
                ath9k_htc_ps_restore(priv);
        }
  
@@@ -1213,6 -1198,12 +1201,12 @@@ static int ath9k_htc_start(struct ieee8
  
        ieee80211_wake_queues(hw);
  
+       if (ah->btcoex_hw.scheme == ATH_BTCOEX_CFG_3WIRE) {
+               ath9k_hw_btcoex_set_weight(ah, AR_BT_COEX_WGHT,
+                                          AR_STOMP_LOW_WLAN_WGHT);
+               ath9k_hw_btcoex_enable(ah);
+               ath_htc_resume_btcoex_work(priv);
+       }
        mutex_unlock(&priv->mutex);
  
        return ret;
@@@ -1236,7 -1227,6 +1230,6 @@@ static void ath9k_htc_stop(struct ieee8
  
        /* Cancel all the running timers/work .. */
        cancel_work_sync(&priv->ps_work);
-       cancel_delayed_work_sync(&priv->ath9k_ani_work);
        cancel_delayed_work_sync(&priv->ath9k_led_blink_work);
        ath9k_led_stop_brightness(priv);
  
                                  "Monitor interface removed\n");
        }
  
+       if (ah->btcoex_hw.enabled) {
+               ath9k_hw_btcoex_disable(ah);
+               if (ah->btcoex_hw.scheme == ATH_BTCOEX_CFG_3WIRE)
+                       ath_htc_cancel_btcoex_work(priv);
+       }
        ath9k_hw_phy_disable(ah);
        ath9k_hw_disable(ah);
        ath9k_hw_configpcipowersave(ah, 1, 1);
@@@ -1458,6 -1454,7 +1457,7 @@@ out
        FIF_PSPOLL |                            \
        FIF_OTHER_BSS |                         \
        FIF_BCN_PRBRESP_PROMISC |               \
+       FIF_PROBE_REQ |                         \
        FIF_FCSFAIL)
  
  static void ath9k_htc_configure_filter(struct ieee80211_hw *hw,
@@@ -1583,20 -1580,21 +1583,21 @@@ static int ath9k_htc_set_key(struct iee
  
        switch (cmd) {
        case SET_KEY:
-               ret = ath9k_cmn_key_config(common, vif, sta, key);
+               ret = ath_key_config(common, vif, sta, key);
                if (ret >= 0) {
                        key->hw_key_idx = ret;
                        /* push IV and Michael MIC generation to stack */
                        key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
-                       if (key->alg == ALG_TKIP)
+                       if (key->cipher == WLAN_CIPHER_SUITE_TKIP)
                                key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
-                       if (priv->ah->sw_mgmt_crypto && key->alg == ALG_CCMP)
+                       if (priv->ah->sw_mgmt_crypto &&
+                           key->cipher == WLAN_CIPHER_SUITE_CCMP)
                                key->flags |= IEEE80211_KEY_FLAG_SW_MGMT;
                        ret = 0;
                }
                break;
        case DISABLE_KEY:
-               ath9k_cmn_key_delete(common, key);
+               ath_key_delete(common, key);
                break;
        default:
                ret = -EINVAL;
@@@ -1777,7 -1775,8 +1778,8 @@@ static void ath9k_htc_sw_scan_start(str
        priv->op_flags |= OP_SCANNING;
        spin_unlock_bh(&priv->beacon_lock);
        cancel_work_sync(&priv->ps_work);
-       cancel_delayed_work_sync(&priv->ath9k_ani_work);
+       if (priv->op_flags & OP_ASSOCIATED)
+               cancel_delayed_work_sync(&priv->ath9k_ani_work);
        mutex_unlock(&priv->mutex);
  }
  
@@@ -1791,9 -1790,10 +1793,10 @@@ static void ath9k_htc_sw_scan_complete(
        priv->op_flags &= ~OP_SCANNING;
        spin_unlock_bh(&priv->beacon_lock);
        priv->op_flags |= OP_FULL_RESET;
-       if (priv->op_flags & OP_ASSOCIATED)
+       if (priv->op_flags & OP_ASSOCIATED) {
                ath9k_htc_beacon_config(priv, priv->vif);
-       ath_start_ani(priv);
+               ath_start_ani(priv);
+       }
        ath9k_htc_ps_restore(priv);
        mutex_unlock(&priv->mutex);
  }
@@@ -343,7 -343,7 +343,7 @@@ void iwl3945_rs_rate_init(struct iwl_pr
        int i;
  
        IWL_DEBUG_INFO(priv, "enter\n");
-       if (sta_id == priv->hw_params.bcast_sta_id)
+       if (sta_id == priv->contexts[IWL_RXON_CTX_BSS].bcast_sta_id)
                goto out;
  
        psta = (struct iwl3945_sta_priv *) sta->drv_priv;
@@@ -873,7 -873,6 +873,7 @@@ static ssize_t iwl3945_sta_dbgfs_stats_
  static const struct file_operations rs_sta_dbgfs_stats_table_ops = {
        .read = iwl3945_sta_dbgfs_stats_table_read,
        .open = iwl3945_open_file_generic,
 +      .llseek = default_llseek,
  };
  
  static void iwl3945_add_debugfs(void *priv, void *priv_sta,
@@@ -933,7 -932,7 +933,7 @@@ void iwl3945_rate_scale_init(struct iee
  
        rcu_read_lock();
  
-       sta = ieee80211_find_sta(priv->vif,
+       sta = ieee80211_find_sta(priv->contexts[IWL_RXON_CTX_BSS].vif,
                                 priv->stations[sta_id].sta.sta.addr);
        if (!sta) {
                IWL_DEBUG_RATE(priv, "Unable to find station to initialize rate scaling.\n");
        switch (priv->band) {
        case IEEE80211_BAND_2GHZ:
                /* TODO: this always does G, not a regression */
-               if (priv->active_rxon.flags & RXON_FLG_TGG_PROTECT_MSK) {
+               if (priv->contexts[IWL_RXON_CTX_BSS].active.flags &
+                                               RXON_FLG_TGG_PROTECT_MSK) {
                        rs_sta->tgg = 1;
                        rs_sta->expected_tpt = iwl3945_expected_tpt_g_prot;
                } else
@@@ -39,6 -39,7 +39,7 @@@
  #include "iwl-dev.h"
  #include "iwl-sta.h"
  #include "iwl-core.h"
+ #include "iwl-agn.h"
  
  #define RS_NAME "iwl-agn-rs"
  
@@@ -76,12 -77,81 +77,81 @@@ static const u8 ant_toggle_lookup[] = 
        /*ANT_ABC  -> */ ANT_ABC,
  };
  
+ #define IWL_DECLARE_RATE_INFO(r, s, ip, in, rp, rn, pp, np)    \
+       [IWL_RATE_##r##M_INDEX] = { IWL_RATE_##r##M_PLCP,      \
+                                   IWL_RATE_SISO_##s##M_PLCP, \
+                                   IWL_RATE_MIMO2_##s##M_PLCP,\
+                                   IWL_RATE_MIMO3_##s##M_PLCP,\
+                                   IWL_RATE_##r##M_IEEE,      \
+                                   IWL_RATE_##ip##M_INDEX,    \
+                                   IWL_RATE_##in##M_INDEX,    \
+                                   IWL_RATE_##rp##M_INDEX,    \
+                                   IWL_RATE_##rn##M_INDEX,    \
+                                   IWL_RATE_##pp##M_INDEX,    \
+                                   IWL_RATE_##np##M_INDEX }
+ /*
+  * Parameter order:
+  *   rate, ht rate, prev rate, next rate, prev tgg rate, next tgg rate
+  *
+  * If there isn't a valid next or previous rate then INV is used which
+  * maps to IWL_RATE_INVALID
+  *
+  */
+ const struct iwl_rate_info iwl_rates[IWL_RATE_COUNT] = {
+       IWL_DECLARE_RATE_INFO(1, INV, INV, 2, INV, 2, INV, 2),    /*  1mbps */
+       IWL_DECLARE_RATE_INFO(2, INV, 1, 5, 1, 5, 1, 5),          /*  2mbps */
+       IWL_DECLARE_RATE_INFO(5, INV, 2, 6, 2, 11, 2, 11),        /*5.5mbps */
+       IWL_DECLARE_RATE_INFO(11, INV, 9, 12, 9, 12, 5, 18),      /* 11mbps */
+       IWL_DECLARE_RATE_INFO(6, 6, 5, 9, 5, 11, 5, 11),        /*  6mbps */
+       IWL_DECLARE_RATE_INFO(9, 6, 6, 11, 6, 11, 5, 11),       /*  9mbps */
+       IWL_DECLARE_RATE_INFO(12, 12, 11, 18, 11, 18, 11, 18),   /* 12mbps */
+       IWL_DECLARE_RATE_INFO(18, 18, 12, 24, 12, 24, 11, 24),   /* 18mbps */
+       IWL_DECLARE_RATE_INFO(24, 24, 18, 36, 18, 36, 18, 36),   /* 24mbps */
+       IWL_DECLARE_RATE_INFO(36, 36, 24, 48, 24, 48, 24, 48),   /* 36mbps */
+       IWL_DECLARE_RATE_INFO(48, 48, 36, 54, 36, 54, 36, 54),   /* 48mbps */
+       IWL_DECLARE_RATE_INFO(54, 54, 48, INV, 48, INV, 48, INV),/* 54mbps */
+       IWL_DECLARE_RATE_INFO(60, 60, 48, INV, 48, INV, 48, INV),/* 60mbps */
+       /* FIXME:RS:          ^^    should be INV (legacy) */
+ };
+ static int iwl_hwrate_to_plcp_idx(u32 rate_n_flags)
+ {
+       int idx = 0;
+       /* HT rate format */
+       if (rate_n_flags & RATE_MCS_HT_MSK) {
+               idx = (rate_n_flags & 0xff);
+               if (idx >= IWL_RATE_MIMO3_6M_PLCP)
+                       idx = idx - IWL_RATE_MIMO3_6M_PLCP;
+               else if (idx >= IWL_RATE_MIMO2_6M_PLCP)
+                       idx = idx - IWL_RATE_MIMO2_6M_PLCP;
+               idx += IWL_FIRST_OFDM_RATE;
+               /* skip 9M not supported in ht*/
+               if (idx >= IWL_RATE_9M_INDEX)
+                       idx += 1;
+               if ((idx >= IWL_FIRST_OFDM_RATE) && (idx <= IWL_LAST_OFDM_RATE))
+                       return idx;
+       /* legacy rate format, search for match in table */
+       } else {
+               for (idx = 0; idx < ARRAY_SIZE(iwl_rates); idx++)
+                       if (iwl_rates[idx].plcp == (rate_n_flags & 0xFF))
+                               return idx;
+       }
+       return -1;
+ }
  static void rs_rate_scale_perform(struct iwl_priv *priv,
                                   struct sk_buff *skb,
                                   struct ieee80211_sta *sta,
                                   struct iwl_lq_sta *lq_sta);
  static void rs_fill_link_cmd(struct iwl_priv *priv,
                             struct iwl_lq_sta *lq_sta, u32 rate_n_flags);
+ static void rs_stay_in_table(struct iwl_lq_sta *lq_sta, bool force_search);
  
  
  #ifdef CONFIG_MAC80211_DEBUGFS
@@@ -300,7 -370,19 +370,19 @@@ static int rs_tl_turn_on_agg_for_tid(st
                                      struct ieee80211_sta *sta)
  {
        int ret = -EAGAIN;
-       u32 load = rs_tl_get_load(lq_data, tid);
+       u32 load;
+       /*
+        * Don't create TX aggregation sessions when in high
+        * BT traffic, as they would just be disrupted by BT.
+        */
+       if (priv->bt_traffic_load >= IWL_BT_COEX_TRAFFIC_LOAD_HIGH) {
+               IWL_ERR(priv, "BT traffic (%d), no aggregation allowed\n",
+                       priv->bt_traffic_load);
+               return ret;
+       }
+       load = rs_tl_get_load(lq_data, tid);
  
        if (load > IWL_AGG_LOAD_THRESHOLD) {
                IWL_DEBUG_HT(priv, "Starting Tx agg: STA: %pM tid: %d\n",
@@@ -502,6 -584,7 +584,7 @@@ static int rs_get_tbl_info_from_mcs(con
        u8 num_of_ant = get_num_of_ant_from_rate(rate_n_flags);
        u8 mcs;
  
+       memset(tbl, 0, sizeof(struct iwl_scale_tbl_info));
        *rate_idx = iwl_hwrate_to_plcp_idx(rate_n_flags);
  
        if (*rate_idx  == IWL_RATE_INVALID) {
@@@ -588,11 -671,13 +671,13 @@@ static int rs_toggle_antenna(u32 valid_
   * Green-field mode is valid if the station supports it and
   * there are no non-GF stations present in the BSS.
   */
- static inline u8 rs_use_green(struct ieee80211_sta *sta,
-                             struct iwl_ht_config *ht_conf)
+ static bool rs_use_green(struct ieee80211_sta *sta)
  {
+       struct iwl_station_priv *sta_priv = (void *)sta->drv_priv;
+       struct iwl_rxon_context *ctx = sta_priv->common.ctx;
        return (sta->ht_cap.cap & IEEE80211_HT_CAP_GRN_FLD) &&
-               !(ht_conf->non_GF_STA_present);
+               !(ctx->ht.non_gf_sta_present);
  }
  
  /**
@@@ -744,6 -829,32 +829,32 @@@ static bool table_type_matches(struct i
                (a->is_SGI == b->is_SGI);
  }
  
+ static void rs_bt_update_lq(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
+                           struct iwl_lq_sta *lq_sta)
+ {
+       struct iwl_scale_tbl_info *tbl;
+       bool full_concurrent;
+       unsigned long flags;
+       spin_lock_irqsave(&priv->lock, flags);
+       if (priv->bt_ci_compliance && priv->bt_ant_couple_ok)
+               full_concurrent = true;
+       else
+               full_concurrent = false;
+       spin_unlock_irqrestore(&priv->lock, flags);
+       if (priv->bt_full_concurrent != full_concurrent) {
+               priv->bt_full_concurrent = full_concurrent;
+               /* Update uCode's rate table. */
+               tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
+               rs_fill_link_cmd(priv, lq_sta, tbl->current_rate);
+               iwl_send_lq_cmd(priv, ctx, &lq_sta->lq, CMD_ASYNC, false);
+               queue_work(priv->workqueue, &priv->bt_full_concurrency);
+       }
+ }
  /*
   * mac80211 sends us Tx status
   */
@@@ -763,6 -874,8 +874,8 @@@ static void rs_tx_status(void *priv_r, 
        u32 tx_rate;
        struct iwl_scale_tbl_info tbl_type;
        struct iwl_scale_tbl_info *curr_tbl, *other_tbl, *tmp_tbl;
+       struct iwl_station_priv *sta_priv = (void *)sta->drv_priv;
+       struct iwl_rxon_context *ctx = sta_priv->common.ctx;
  
        IWL_DEBUG_RATE_LIMIT(priv, "get frame ack response, update rate scale window\n");
  
                lq_sta->missed_rate_counter++;
                if (lq_sta->missed_rate_counter > IWL_MISSED_RATE_MAX) {
                        lq_sta->missed_rate_counter = 0;
-                       iwl_send_lq_cmd(priv, &lq_sta->lq, CMD_ASYNC, false);
+                       iwl_send_lq_cmd(priv, ctx, &lq_sta->lq, CMD_ASYNC, false);
                }
                /* Regardless, ignore this status info for outdated rate */
                return;
                other_tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
        } else {
                IWL_DEBUG_RATE(priv, "Neither active nor search matches tx rate\n");
-               return;
+               tmp_tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
+               IWL_DEBUG_RATE(priv, "active- lq:%x, ant:%x, SGI:%d\n",
+                       tmp_tbl->lq_type, tmp_tbl->ant_type, tmp_tbl->is_SGI);
+               tmp_tbl = &(lq_sta->lq_info[1 - lq_sta->active_tbl]);
+               IWL_DEBUG_RATE(priv, "search- lq:%x, ant:%x, SGI:%d\n",
+                       tmp_tbl->lq_type, tmp_tbl->ant_type, tmp_tbl->is_SGI);
+               IWL_DEBUG_RATE(priv, "actual- lq:%x, ant:%x, SGI:%d\n",
+                       tbl_type.lq_type, tbl_type.ant_type, tbl_type.is_SGI);
+               /*
+                * no matching table found, let's by-pass the data collection
+                * and continue to perform rate scale to find the rate table
+                */
+               rs_stay_in_table(lq_sta, true);
+               goto done;
        }
  
        /*
        }
        /* The last TX rate is cached in lq_sta; it's set in if/else above */
        lq_sta->last_rate_n_flags = tx_rate;
+ done:
        /* See if there's a better rate or modulation mode to try. */
        if (sta && sta->supp_rates[sband->band])
                rs_rate_scale_perform(priv, skb, sta, lq_sta);
+       /* Is there a need to switch between full concurrency and 3-wire? */
+       if (priv->bt_ant_couple_ok)
+               rs_bt_update_lq(priv, ctx, lq_sta);
  }
  
  /*
@@@ -1106,6 -1236,8 +1236,8 @@@ static int rs_switch_to_mimo2(struct iw
        u16 rate_mask;
        s32 rate;
        s8 is_green = lq_sta->is_green;
+       struct iwl_station_priv *sta_priv = (void *)sta->drv_priv;
+       struct iwl_rxon_context *ctx = sta_priv->common.ctx;
  
        if (!conf_is_ht(conf) || !sta->ht_cap.ht_supported)
                return -1;
        tbl->max_search = IWL_MAX_SEARCH;
        rate_mask = lq_sta->active_mimo2_rate;
  
-       if (iwl_is_ht40_tx_allowed(priv, &sta->ht_cap))
+       if (iwl_is_ht40_tx_allowed(priv, ctx, &sta->ht_cap))
                tbl->is_ht40 = 1;
        else
                tbl->is_ht40 = 0;
@@@ -1160,6 -1292,8 +1292,8 @@@ static int rs_switch_to_mimo3(struct iw
        u16 rate_mask;
        s32 rate;
        s8 is_green = lq_sta->is_green;
+       struct iwl_station_priv *sta_priv = (void *)sta->drv_priv;
+       struct iwl_rxon_context *ctx = sta_priv->common.ctx;
  
        if (!conf_is_ht(conf) || !sta->ht_cap.ht_supported)
                return -1;
        tbl->max_search = IWL_MAX_11N_MIMO3_SEARCH;
        rate_mask = lq_sta->active_mimo3_rate;
  
-       if (iwl_is_ht40_tx_allowed(priv, &sta->ht_cap))
+       if (iwl_is_ht40_tx_allowed(priv, ctx, &sta->ht_cap))
                tbl->is_ht40 = 1;
        else
                tbl->is_ht40 = 0;
@@@ -1215,6 -1349,8 +1349,8 @@@ static int rs_switch_to_siso(struct iwl
        u16 rate_mask;
        u8 is_green = lq_sta->is_green;
        s32 rate;
+       struct iwl_station_priv *sta_priv = (void *)sta->drv_priv;
+       struct iwl_rxon_context *ctx = sta_priv->common.ctx;
  
        if (!conf_is_ht(conf) || !sta->ht_cap.ht_supported)
                return -1;
        tbl->max_search = IWL_MAX_SEARCH;
        rate_mask = lq_sta->active_siso_rate;
  
-       if (iwl_is_ht40_tx_allowed(priv, &sta->ht_cap))
+       if (iwl_is_ht40_tx_allowed(priv, ctx, &sta->ht_cap))
                tbl->is_ht40 = 1;
        else
                tbl->is_ht40 = 0;
@@@ -1265,18 -1401,52 +1401,52 @@@ static int rs_move_legacy_other(struct 
        struct iwl_rate_scale_data *window = &(tbl->win[index]);
        u32 sz = (sizeof(struct iwl_scale_tbl_info) -
                  (sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT));
-       u8 start_action = tbl->action;
+       u8 start_action;
        u8 valid_tx_ant = priv->hw_params.valid_tx_ant;
        u8 tx_chains_num = priv->hw_params.tx_chains_num;
        int ret = 0;
        u8 update_search_tbl_counter = 0;
  
+       switch (priv->bt_traffic_load) {
+       case IWL_BT_COEX_TRAFFIC_LOAD_NONE:
+               /* nothing */
+               break;
+       case IWL_BT_COEX_TRAFFIC_LOAD_LOW:
+               /* avoid antenna B unless MIMO */
+               valid_tx_ant = first_antenna(priv->hw_params.valid_tx_ant);
+               if (tbl->action == IWL_LEGACY_SWITCH_ANTENNA2)
+                       tbl->action = IWL_LEGACY_SWITCH_ANTENNA1;
+               break;
+       case IWL_BT_COEX_TRAFFIC_LOAD_HIGH:
+       case IWL_BT_COEX_TRAFFIC_LOAD_CONTINUOUS:
+               /* avoid antenna B and MIMO */
+               valid_tx_ant = first_antenna(priv->hw_params.valid_tx_ant);
+               if (tbl->action >= IWL_LEGACY_SWITCH_ANTENNA2 &&
+                   tbl->action != IWL_LEGACY_SWITCH_SISO)
+                       tbl->action = IWL_LEGACY_SWITCH_SISO;
+               break;
+       default:
+               IWL_ERR(priv, "Invalid BT load %d", priv->bt_traffic_load);
+               break;
+       }
        if (!iwl_ht_enabled(priv))
                /* stay in Legacy */
                tbl->action = IWL_LEGACY_SWITCH_ANTENNA1;
        else if (iwl_tx_ant_restriction(priv) == IWL_ANT_OK_SINGLE &&
                   tbl->action > IWL_LEGACY_SWITCH_SISO)
                tbl->action = IWL_LEGACY_SWITCH_SISO;
+       /* configure as 1x1 if bt full concurrency */
+       if (priv->bt_full_concurrent) {
+               if (!iwl_ht_enabled(priv))
+                       tbl->action = IWL_LEGACY_SWITCH_ANTENNA1;
+               else if (tbl->action >= IWL_LEGACY_SWITCH_ANTENNA2)
+                       tbl->action = IWL_LEGACY_SWITCH_SISO;
+               valid_tx_ant = first_antenna(priv->hw_params.valid_tx_ant);
+       }
+       start_action = tbl->action;
        for (; ;) {
                lq_sta->action_counter++;
                switch (tbl->action) {
                                break;
  
                        /* Don't change antenna if success has been great */
-                       if (window->success_ratio >= IWL_RS_GOOD_RATIO)
+                       if (window->success_ratio >= IWL_RS_GOOD_RATIO &&
+                           !priv->bt_full_concurrent &&
+                           priv->bt_traffic_load ==
+                                       IWL_BT_COEX_TRAFFIC_LOAD_NONE)
                                break;
  
                        /* Set up search table to try other antenna */
@@@ -1403,31 -1576,64 +1576,64 @@@ static int rs_move_siso_to_other(struc
        struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
        u32 sz = (sizeof(struct iwl_scale_tbl_info) -
                  (sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT));
-       u8 start_action = tbl->action;
+       u8 start_action;
        u8 valid_tx_ant = priv->hw_params.valid_tx_ant;
        u8 tx_chains_num = priv->hw_params.tx_chains_num;
        u8 update_search_tbl_counter = 0;
        int ret;
  
+       switch (priv->bt_traffic_load) {
+       case IWL_BT_COEX_TRAFFIC_LOAD_NONE:
+               /* nothing */
+               break;
+       case IWL_BT_COEX_TRAFFIC_LOAD_LOW:
+               /* avoid antenna B unless MIMO */
+               valid_tx_ant = first_antenna(priv->hw_params.valid_tx_ant);
+               if (tbl->action == IWL_SISO_SWITCH_ANTENNA2)
+                       tbl->action = IWL_SISO_SWITCH_ANTENNA1;
+               break;
+       case IWL_BT_COEX_TRAFFIC_LOAD_HIGH:
+       case IWL_BT_COEX_TRAFFIC_LOAD_CONTINUOUS:
+               /* avoid antenna B and MIMO */
+               valid_tx_ant = first_antenna(priv->hw_params.valid_tx_ant);
+               if (tbl->action != IWL_SISO_SWITCH_ANTENNA1)
+                       tbl->action = IWL_SISO_SWITCH_ANTENNA1;
+               break;
+       default:
+               IWL_ERR(priv, "Invalid BT load %d", priv->bt_traffic_load);
+               break;
+       }
        if (iwl_tx_ant_restriction(priv) == IWL_ANT_OK_SINGLE &&
            tbl->action > IWL_SISO_SWITCH_ANTENNA2) {
                /* stay in SISO */
                tbl->action = IWL_SISO_SWITCH_ANTENNA1;
        }
+       /* configure as 1x1 if bt full concurrency */
+       if (priv->bt_full_concurrent) {
+               valid_tx_ant = first_antenna(priv->hw_params.valid_tx_ant);
+               if (tbl->action >= IWL_LEGACY_SWITCH_ANTENNA2)
+                       tbl->action = IWL_SISO_SWITCH_ANTENNA1;
+       }
+       start_action = tbl->action;
        for (;;) {
                lq_sta->action_counter++;
                switch (tbl->action) {
                case IWL_SISO_SWITCH_ANTENNA1:
                case IWL_SISO_SWITCH_ANTENNA2:
                        IWL_DEBUG_RATE(priv, "LQ: SISO toggle Antenna\n");
                        if ((tbl->action == IWL_SISO_SWITCH_ANTENNA1 &&
-                                                       tx_chains_num <= 1) ||
+                                               tx_chains_num <= 1) ||
                            (tbl->action == IWL_SISO_SWITCH_ANTENNA2 &&
-                                                       tx_chains_num <= 2))
+                                               tx_chains_num <= 2))
                                break;
  
-                       if (window->success_ratio >= IWL_RS_GOOD_RATIO)
+                       if (window->success_ratio >= IWL_RS_GOOD_RATIO &&
+                           !priv->bt_full_concurrent &&
+                           priv->bt_traffic_load ==
+                                       IWL_BT_COEX_TRAFFIC_LOAD_NONE)
                                break;
  
                        memcpy(search_tbl, tbl, sz);
@@@ -1541,18 -1747,47 +1747,47 @@@ static int rs_move_mimo2_to_other(struc
        struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
        u32 sz = (sizeof(struct iwl_scale_tbl_info) -
                  (sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT));
-       u8 start_action = tbl->action;
+       u8 start_action;
        u8 valid_tx_ant = priv->hw_params.valid_tx_ant;
        u8 tx_chains_num = priv->hw_params.tx_chains_num;
        u8 update_search_tbl_counter = 0;
        int ret;
  
+       switch (priv->bt_traffic_load) {
+       case IWL_BT_COEX_TRAFFIC_LOAD_NONE:
+               /* nothing */
+               break;
+       case IWL_BT_COEX_TRAFFIC_LOAD_HIGH:
+       case IWL_BT_COEX_TRAFFIC_LOAD_CONTINUOUS:
+               /* avoid antenna B and MIMO */
+               if (tbl->action != IWL_MIMO2_SWITCH_SISO_A)
+                       tbl->action = IWL_MIMO2_SWITCH_SISO_A;
+               break;
+       case IWL_BT_COEX_TRAFFIC_LOAD_LOW:
+               /* avoid antenna B unless MIMO */
+               if (tbl->action == IWL_MIMO2_SWITCH_SISO_B ||
+                   tbl->action == IWL_MIMO2_SWITCH_SISO_C)
+                       tbl->action = IWL_MIMO2_SWITCH_SISO_A;
+               break;
+       default:
+               IWL_ERR(priv, "Invalid BT load %d", priv->bt_traffic_load);
+               break;
+       }
        if ((iwl_tx_ant_restriction(priv) == IWL_ANT_OK_SINGLE) &&
            (tbl->action < IWL_MIMO2_SWITCH_SISO_A ||
             tbl->action > IWL_MIMO2_SWITCH_SISO_C)) {
                /* switch in SISO */
                tbl->action = IWL_MIMO2_SWITCH_SISO_A;
        }
+       /* configure as 1x1 if bt full concurrency */
+       if (priv->bt_full_concurrent &&
+           (tbl->action < IWL_MIMO2_SWITCH_SISO_A ||
+            tbl->action > IWL_MIMO2_SWITCH_SISO_C))
+               tbl->action = IWL_MIMO2_SWITCH_SISO_A;
+       start_action = tbl->action;
        for (;;) {
                lq_sta->action_counter++;
                switch (tbl->action) {
@@@ -1682,18 -1917,47 +1917,47 @@@ static int rs_move_mimo3_to_other(struc
        struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
        u32 sz = (sizeof(struct iwl_scale_tbl_info) -
                  (sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT));
-       u8 start_action = tbl->action;
+       u8 start_action;
        u8 valid_tx_ant = priv->hw_params.valid_tx_ant;
        u8 tx_chains_num = priv->hw_params.tx_chains_num;
        int ret;
        u8 update_search_tbl_counter = 0;
  
+       switch (priv->bt_traffic_load) {
+       case IWL_BT_COEX_TRAFFIC_LOAD_NONE:
+               /* nothing */
+               break;
+       case IWL_BT_COEX_TRAFFIC_LOAD_HIGH:
+       case IWL_BT_COEX_TRAFFIC_LOAD_CONTINUOUS:
+               /* avoid antenna B and MIMO */
+               if (tbl->action != IWL_MIMO3_SWITCH_SISO_A)
+                       tbl->action = IWL_MIMO3_SWITCH_SISO_A;
+               break;
+       case IWL_BT_COEX_TRAFFIC_LOAD_LOW:
+               /* avoid antenna B unless MIMO */
+               if (tbl->action == IWL_MIMO3_SWITCH_SISO_B ||
+                   tbl->action == IWL_MIMO3_SWITCH_SISO_C)
+                       tbl->action = IWL_MIMO3_SWITCH_SISO_A;
+               break;
+       default:
+               IWL_ERR(priv, "Invalid BT load %d", priv->bt_traffic_load);
+               break;
+       }
        if ((iwl_tx_ant_restriction(priv) == IWL_ANT_OK_SINGLE) &&
            (tbl->action < IWL_MIMO3_SWITCH_SISO_A ||
             tbl->action > IWL_MIMO3_SWITCH_SISO_C)) {
                /* switch in SISO */
                tbl->action = IWL_MIMO3_SWITCH_SISO_A;
        }
+       /* configure as 1x1 if bt full concurrency */
+       if (priv->bt_full_concurrent &&
+           (tbl->action < IWL_MIMO3_SWITCH_SISO_A ||
+            tbl->action > IWL_MIMO3_SWITCH_SISO_C))
+               tbl->action = IWL_MIMO3_SWITCH_SISO_A;
+       start_action = tbl->action;
        for (;;) {
                lq_sta->action_counter++;
                switch (tbl->action) {
   * 2) # times calling this function
   * 3) elapsed time in this mode (not used, for now)
   */
- static void rs_stay_in_table(struct iwl_lq_sta *lq_sta)
+ static void rs_stay_in_table(struct iwl_lq_sta *lq_sta, bool force_search)
  {
        struct iwl_scale_tbl_info *tbl;
        int i;
                 * allow a new search.  Also (below) reset all bitmaps and
                 * stats in active history.
                 */
-               if ((lq_sta->total_failed > lq_sta->max_failure_limit) ||
+               if (force_search ||
+                   (lq_sta->total_failed > lq_sta->max_failure_limit) ||
                    (lq_sta->total_success > lq_sta->max_success_limit) ||
                    ((!lq_sta->search_better_tbl) && (lq_sta->flush_timer)
                     && (flush_interval_passed))) {
   * return rate_n_flags as used in the table
   */
  static u32 rs_update_rate_tbl(struct iwl_priv *priv,
+                             struct iwl_rxon_context *ctx,
                                struct iwl_lq_sta *lq_sta,
                                struct iwl_scale_tbl_info *tbl,
                                int index, u8 is_green)
        /* Update uCode's rate table. */
        rate = rate_n_flags_from_tbl(priv, tbl, index, is_green);
        rs_fill_link_cmd(priv, lq_sta, rate);
-       iwl_send_lq_cmd(priv, &lq_sta->lq, CMD_ASYNC, false);
+       iwl_send_lq_cmd(priv, ctx, &lq_sta->lq, CMD_ASYNC, false);
  
        return rate;
  }
@@@ -1948,6 -2214,8 +2214,8 @@@ static void rs_rate_scale_perform(struc
        s32 sr;
        u8 tid = MAX_TID_COUNT;
        struct iwl_tid_data *tid_data;
+       struct iwl_station_priv *sta_priv = (void *)sta->drv_priv;
+       struct iwl_rxon_context *ctx = sta_priv->common.ctx;
  
        IWL_DEBUG_RATE(priv, "rate scale calculate new rate for skb\n");
  
        if (is_legacy(tbl->lq_type))
                lq_sta->is_green = 0;
        else
-               lq_sta->is_green = rs_use_green(sta, &priv->current_ht_config);
+               lq_sta->is_green = rs_use_green(sta);
        is_green = lq_sta->is_green;
  
        /* current tx rate */
                        tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
                        /* get "active" rate info */
                        index = iwl_hwrate_to_plcp_idx(tbl->current_rate);
-                       rate = rs_update_rate_tbl(priv, lq_sta,
+                       rate = rs_update_rate_tbl(priv, ctx, lq_sta,
                                                  tbl, index, is_green);
                }
                return;
  
                /* Should we stay with this modulation mode,
                 * or search for a new one? */
-               rs_stay_in_table(lq_sta);
+               rs_stay_in_table(lq_sta, false);
  
                goto out;
        }
        if (iwl_tx_ant_restriction(priv) != IWL_ANT_OK_MULTI &&
                (is_mimo2(tbl->lq_type) || is_mimo3(tbl->lq_type)))
                scale_action = -1;
+       if ((priv->bt_traffic_load >= IWL_BT_COEX_TRAFFIC_LOAD_HIGH) &&
+            (is_mimo2(tbl->lq_type) || is_mimo3(tbl->lq_type))) {
+               if (lq_sta->last_bt_traffic > priv->bt_traffic_load) {
+                       /*
+                        * don't set scale_action, don't want to scale up if
+                        * the rate scale doesn't otherwise think that is a
+                        * good idea.
+                        */
+               } else if (lq_sta->last_bt_traffic <= priv->bt_traffic_load) {
+                       scale_action = -1;
+               }
+       }
+       lq_sta->last_bt_traffic = priv->bt_traffic_load;
+       if ((priv->bt_traffic_load >= IWL_BT_COEX_TRAFFIC_LOAD_HIGH) &&
+            (is_mimo2(tbl->lq_type) || is_mimo3(tbl->lq_type))) {
+               /* search for a new modulation */
+               rs_stay_in_table(lq_sta, true);
+               goto lq_update;
+       }
        switch (scale_action) {
        case -1:
                /* Decrease starting rate, update uCode's rate table */
  lq_update:
        /* Replace uCode's rate table for the destination station. */
        if (update_lq)
-               rate = rs_update_rate_tbl(priv, lq_sta,
+               rate = rs_update_rate_tbl(priv, ctx, lq_sta,
                                          tbl, index, is_green);
  
        if (iwl_tx_ant_restriction(priv) == IWL_ANT_OK_MULTI) {
                /* Should we stay with this modulation mode,
                 * or search for a new one? */
-               rs_stay_in_table(lq_sta);
+         rs_stay_in_table(lq_sta, false);
        }
        /*
         * Search for new modulation mode if we're:
                        IWL_DEBUG_RATE(priv, "Switch current  mcs: %X index: %d\n",
                                     tbl->current_rate, index);
                        rs_fill_link_cmd(priv, lq_sta, tbl->current_rate);
-                       iwl_send_lq_cmd(priv, &lq_sta->lq, CMD_ASYNC, false);
+                       iwl_send_lq_cmd(priv, ctx, &lq_sta->lq, CMD_ASYNC, false);
                } else
                        done_search = 1;
        }
@@@ -2357,12 -2647,17 +2647,17 @@@ static void rs_initialize_lq(struct iwl
        int rate_idx;
        int i;
        u32 rate;
-       u8 use_green = rs_use_green(sta, &priv->current_ht_config);
+       u8 use_green = rs_use_green(sta);
        u8 active_tbl = 0;
        u8 valid_tx_ant;
+       struct iwl_station_priv *sta_priv;
+       struct iwl_rxon_context *ctx;
  
        if (!sta || !lq_sta)
-               goto out;
+               return;
+       sta_priv = (void *)sta->drv_priv;
+       ctx = sta_priv->common.ctx;
  
        i = lq_sta->last_txrate_idx;
  
        rs_set_expected_tpt_table(lq_sta, tbl);
        rs_fill_link_cmd(NULL, lq_sta, rate);
        priv->stations[lq_sta->lq.sta_id].lq = &lq_sta->lq;
-       iwl_send_lq_cmd(priv, &lq_sta->lq, CMD_SYNC, true);
-  out:
-       return;
+       iwl_send_lq_cmd(priv, ctx, &lq_sta->lq, CMD_SYNC, true);
  }
  
  static void rs_get_rate(void *priv_r, struct ieee80211_sta *sta, void *priv_sta,
@@@ -2524,7 -2817,7 +2817,7 @@@ void iwl_rs_rate_init(struct iwl_priv *
        lq_sta->is_dup = 0;
        lq_sta->max_rate_idx = -1;
        lq_sta->missed_rate_counter = IWL_MISSED_RATE_MAX;
-       lq_sta->is_green = rs_use_green(sta, &priv->current_ht_config);
+       lq_sta->is_green = rs_use_green(sta);
        lq_sta->active_legacy_rate = priv->active_rate & ~(0x1000);
        lq_sta->band = priv->band;
        /*
@@@ -2594,10 -2887,15 +2887,15 @@@ static void rs_fill_link_cmd(struct iwl
        rs_dbgfs_set_mcs(lq_sta, &new_rate, index);
  
        /* Interpret new_rate (rate_n_flags) */
-       memset(&tbl_type, 0, sizeof(tbl_type));
        rs_get_tbl_info_from_mcs(new_rate, lq_sta->band,
                                  &tbl_type, &rate_idx);
  
+       if (priv && priv->bt_full_concurrent) {
+               /* 1x1 only */
+               tbl_type.ant_type =
+                       first_antenna(priv->hw_params.valid_tx_ant);
+       }
        /* How many times should we repeat the initial rate? */
        if (is_legacy(tbl_type.lq_type)) {
                ant_toggle_cnt = 1;
  
        index++;
        repeat_rate--;
-       if (priv)
-               valid_tx_ant = priv->hw_params.valid_tx_ant;
+       if (priv) {
+               if (priv->bt_full_concurrent)
+                       valid_tx_ant = ANT_A;
+               else
+                       valid_tx_ant = priv->hw_params.valid_tx_ant;
+       }
  
        /* Fill rest of rate table */
        while (index < LINK_QUAL_MAX_RETRY_NUM) {
                                         rs_toggle_antenna(valid_tx_ant,
                                                        &new_rate, &tbl_type))
                                        ant_toggle_cnt = 1;
- }
                      }
  
                        /* Override next rate if needed for debug purposes */
                        rs_dbgfs_set_mcs(lq_sta, &new_rate, index);
                rs_get_tbl_info_from_mcs(new_rate, lq_sta->band, &tbl_type,
                                                &rate_idx);
  
+               if (priv && priv->bt_full_concurrent) {
+                       /* 1x1 only */
+                       tbl_type.ant_type =
+                               first_antenna(priv->hw_params.valid_tx_ant);
+               }
                /* Indicate to uCode which entries might be MIMO.
                 * If initial rate was MIMO, this will finally end up
                 * as (IWL_HT_NUMBER_TRY * 2), after 2nd pass, otherwise 0. */
  
        lq_cmd->agg_params.agg_frame_cnt_limit = LINK_QUAL_AGG_FRAME_LIMIT_DEF;
        lq_cmd->agg_params.agg_dis_start_th = LINK_QUAL_AGG_DISABLE_START_DEF;
        lq_cmd->agg_params.agg_time_limit =
                cpu_to_le16(LINK_QUAL_AGG_TIME_LIMIT_DEF);
+       /*
+        * overwrite if needed, pass aggregation time limit
+        * to uCode in uSec
+        */
+       if (priv && priv->cfg->bt_params &&
+           priv->cfg->bt_params->agg_time_limit &&
+           priv->cfg->bt_params->agg_time_limit >=
+               LINK_QUAL_AGG_TIME_LIMIT_MIN &&
+           priv->cfg->bt_params->agg_time_limit <=
+                LINK_QUAL_AGG_TIME_LIMIT_MAX)
+               lq_cmd->agg_params.agg_time_limit =
+                       cpu_to_le16(priv->cfg->bt_params->agg_time_limit);
  }
  
  static void *rs_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir)
@@@ -2760,6 -3080,9 +3080,9 @@@ static ssize_t rs_sta_dbgfs_scale_table
        char buf[64];
        int buf_size;
        u32 parsed_rate;
+       struct iwl_station_priv *sta_priv =
+               container_of(lq_sta, struct iwl_station_priv, lq_sta);
+       struct iwl_rxon_context *ctx = sta_priv->common.ctx;
  
        priv = lq_sta->drv;
        memset(buf, 0, sizeof(buf));
  
        if (lq_sta->dbg_fixed_rate) {
                rs_fill_link_cmd(NULL, lq_sta, lq_sta->dbg_fixed_rate);
-               iwl_send_lq_cmd(lq_sta->drv, &lq_sta->lq, CMD_ASYNC, false);
+               iwl_send_lq_cmd(lq_sta->drv, ctx, &lq_sta->lq, CMD_ASYNC,
+                               false);
        }
  
        return count;
@@@ -2873,7 -3197,6 +3197,7 @@@ static const struct file_operations rs_
        .write = rs_sta_dbgfs_scale_table_write,
        .read = rs_sta_dbgfs_scale_table_read,
        .open = open_file_generic,
 +      .llseek = default_llseek,
  };
  static ssize_t rs_sta_dbgfs_stats_table_read(struct file *file,
                        char __user *user_buf, size_t count, loff_t *ppos)
  static const struct file_operations rs_sta_dbgfs_stats_table_ops = {
        .read = rs_sta_dbgfs_stats_table_read,
        .open = open_file_generic,
 +      .llseek = default_llseek,
  };
  
  static ssize_t rs_sta_dbgfs_rate_scale_data_read(struct file *file,
  static const struct file_operations rs_sta_dbgfs_rate_scale_data_ops = {
        .read = rs_sta_dbgfs_rate_scale_data_read,
        .open = open_file_generic,
 +      .llseek = default_llseek,
  };
  
  static void rs_add_debugfs(void *priv, void *priv_sta,
@@@ -39,7 -39,6 +39,6 @@@
  #include "iwl-debug.h"
  #include "iwl-core.h"
  #include "iwl-io.h"
- #include "iwl-calib.h"
  
  /* create and remove of files */
  #define DEBUGFS_ADD_FILE(name, parent, mode) do {                     \
@@@ -87,7 -86,6 +86,7 @@@ static int iwl_dbgfs_open_file_generic(
  static const struct file_operations iwl_dbgfs_##name##_ops = {          \
        .read = iwl_dbgfs_##name##_read,                                \
        .open = iwl_dbgfs_open_file_generic,                            \
 +      .llseek = generic_file_llseek,                                  \
  };
  
  #define DEBUGFS_WRITE_FILE_OPS(name)                                    \
@@@ -95,7 -93,6 +94,7 @@@
  static const struct file_operations iwl_dbgfs_##name##_ops = {          \
        .write = iwl_dbgfs_##name##_write,                              \
        .open = iwl_dbgfs_open_file_generic,                            \
 +      .llseek = generic_file_llseek,                                  \
  };
  
  
@@@ -106,7 -103,6 +105,7 @@@ static const struct file_operations iwl
        .write = iwl_dbgfs_##name##_write,                              \
        .read = iwl_dbgfs_##name##_read,                                \
        .open = iwl_dbgfs_open_file_generic,                            \
 +      .llseek = generic_file_llseek,                                  \
  };
  
  static ssize_t iwl_dbgfs_tx_statistics_read(struct file *file,
@@@ -359,7 -355,7 +358,7 @@@ static ssize_t iwl_dbgfs_nvm_read(struc
        const u8 *ptr;
        char *buf;
        u16 eeprom_ver;
-       size_t eeprom_len = priv->cfg->eeprom_size;
+       size_t eeprom_len = priv->cfg->base_params->eeprom_size;
        buf_size = 4 * eeprom_len + 256;
  
        if (eeprom_len % 16) {
@@@ -470,8 -466,7 +469,7 @@@ static ssize_t iwl_dbgfs_channels_read(
                for (i = 0; i < supp_band->n_channels; i++)
                        pos += scnprintf(buf + pos, bufsz - pos,
                                        "%d: %ddBm: BSS%s%s, %s.\n",
-                                       ieee80211_frequency_to_channel(
-                                       channels[i].center_freq),
+                                       channels[i].hw_value,
                                        channels[i].max_power,
                                        channels[i].flags & IEEE80211_CHAN_RADAR ?
                                        " (IEEE 802.11h required)" : "",
                for (i = 0; i < supp_band->n_channels; i++)
                        pos += scnprintf(buf + pos, bufsz - pos,
                                        "%d: %ddBm: BSS%s%s, %s.\n",
-                                       ieee80211_frequency_to_channel(
-                                       channels[i].center_freq),
+                                       channels[i].hw_value,
                                        channels[i].max_power,
                                        channels[i].flags & IEEE80211_CHAN_RADAR ?
                                        " (IEEE 802.11h required)" : "",
@@@ -580,10 -574,10 +577,10 @@@ static ssize_t iwl_dbgfs_interrupt_read
                priv->isr_stats.hw);
        pos += scnprintf(buf + pos, bufsz - pos, "SW Error:\t\t\t %u\n",
                priv->isr_stats.sw);
-       if (priv->isr_stats.sw > 0) {
+       if (priv->isr_stats.sw || priv->isr_stats.hw) {
                pos += scnprintf(buf + pos, bufsz - pos,
                        "\tLast Restarting Code:  0x%X\n",
-                       priv->isr_stats.sw_err);
+                       priv->isr_stats.err_code);
        }
  #ifdef CONFIG_IWLWIFI_DEBUG
        pos += scnprintf(buf + pos, bufsz - pos, "Frame transmitted:\t\t %u\n",
@@@ -648,19 -642,25 +645,25 @@@ static ssize_t iwl_dbgfs_qos_read(struc
                                       size_t count, loff_t *ppos)
  {
        struct iwl_priv *priv = file->private_data;
+       struct iwl_rxon_context *ctx;
        int pos = 0, i;
-       char buf[256];
+       char buf[256 * NUM_IWL_RXON_CTX];
        const size_t bufsz = sizeof(buf);
  
-       for (i = 0; i < AC_NUM; i++) {
-               pos += scnprintf(buf + pos, bufsz - pos,
-                       "\tcw_min\tcw_max\taifsn\ttxop\n");
-               pos += scnprintf(buf + pos, bufsz - pos,
+       for_each_context(priv, ctx) {
+               pos += scnprintf(buf + pos, bufsz - pos, "context %d:\n",
+                                ctx->ctxid);
+               for (i = 0; i < AC_NUM; i++) {
+                       pos += scnprintf(buf + pos, bufsz - pos,
+                               "\tcw_min\tcw_max\taifsn\ttxop\n");
+                       pos += scnprintf(buf + pos, bufsz - pos,
                                "AC[%d]\t%u\t%u\t%u\t%u\n", i,
-                               priv->qos_data.def_qos_parm.ac[i].cw_min,
-                               priv->qos_data.def_qos_parm.ac[i].cw_max,
-                               priv->qos_data.def_qos_parm.ac[i].aifsn,
-                               priv->qos_data.def_qos_parm.ac[i].edca_txop);
+                               ctx->qos_data.def_qos_parm.ac[i].cw_min,
+                               ctx->qos_data.def_qos_parm.ac[i].cw_max,
+                               ctx->qos_data.def_qos_parm.ac[i].aifsn,
+                               ctx->qos_data.def_qos_parm.ac[i].edca_txop);
+               }
+               pos += scnprintf(buf + pos, bufsz - pos, "\n");
        }
        return simple_read_from_buffer(user_buf, count, ppos, buf, pos);
  }
@@@ -735,7 -735,7 +738,7 @@@ static ssize_t iwl_dbgfs_disable_ht40_w
                return -EFAULT;
        if (sscanf(buf, "%d", &ht40) != 1)
                return -EFAULT;
-       if (!iwl_is_associated(priv))
+       if (!iwl_is_any_associated(priv))
                priv->disable_ht40 = ht40 ? true : false;
        else {
                IWL_ERR(priv, "Sta associated with AP - "
@@@ -871,7 -871,7 +874,7 @@@ static ssize_t iwl_dbgfs_traffic_log_re
        struct iwl_rx_queue *rxq = &priv->rxq;
        char *buf;
        int bufsz = ((IWL_TRAFFIC_ENTRIES * IWL_TRAFFIC_ENTRY_SIZE * 64) * 2) +
-               (priv->cfg->num_of_queues * 32 * 8) + 400;
+               (priv->cfg->base_params->num_of_queues * 32 * 8) + 400;
        const u8 *ptr;
        ssize_t ret;
  
@@@ -970,7 -970,8 +973,8 @@@ static ssize_t iwl_dbgfs_tx_queue_read(
        int pos = 0;
        int cnt;
        int ret;
-       const size_t bufsz = sizeof(char) * 64 * priv->cfg->num_of_queues;
+       const size_t bufsz = sizeof(char) * 64 *
+                               priv->cfg->base_params->num_of_queues;
  
        if (!priv->txq) {
                IWL_ERR(priv, "txq not ready\n");
@@@ -1324,7 -1325,8 +1328,8 @@@ static ssize_t iwl_dbgfs_rxon_flags_rea
        int len = 0;
        char buf[20];
  
-       len = sprintf(buf, "0x%04X\n", le32_to_cpu(priv->active_rxon.flags));
+       len = sprintf(buf, "0x%04X\n",
+               le32_to_cpu(priv->contexts[IWL_RXON_CTX_BSS].active.flags));
        return simple_read_from_buffer(user_buf, count, ppos, buf, len);
  }
  
@@@ -1337,7 -1339,7 +1342,7 @@@ static ssize_t iwl_dbgfs_rxon_filter_fl
        char buf[20];
  
        len = sprintf(buf, "0x%04X\n",
-                     le32_to_cpu(priv->active_rxon.filter_flags));
+               le32_to_cpu(priv->contexts[IWL_RXON_CTX_BSS].active.filter_flags));
        return simple_read_from_buffer(user_buf, count, ppos, buf, len);
  }
  
@@@ -1413,7 -1415,7 +1418,7 @@@ static ssize_t iwl_dbgfs_plcp_delta_rea
        const size_t bufsz = sizeof(buf);
  
        pos += scnprintf(buf + pos, bufsz - pos, "%u\n",
-                       priv->cfg->plcp_delta_threshold);
+                       priv->cfg->base_params->plcp_delta_threshold);
  
        return simple_read_from_buffer(user_buf, count, ppos, buf, pos);
  }
@@@ -1435,10 -1437,10 +1440,10 @@@ static ssize_t iwl_dbgfs_plcp_delta_wri
                return -EINVAL;
        if ((plcp < IWL_MAX_PLCP_ERR_THRESHOLD_MIN) ||
                (plcp > IWL_MAX_PLCP_ERR_THRESHOLD_MAX))
-               priv->cfg->plcp_delta_threshold =
+               priv->cfg->base_params->plcp_delta_threshold =
                        IWL_MAX_PLCP_ERR_THRESHOLD_DISABLE;
        else
-               priv->cfg->plcp_delta_threshold = plcp;
+               priv->cfg->base_params->plcp_delta_threshold = plcp;
        return count;
  }
  
@@@ -1532,6 -1534,135 +1537,135 @@@ static ssize_t iwl_dbgfs_ucode_bt_stats
                        user_buf, count, ppos);
  }
  
+ static ssize_t iwl_dbgfs_monitor_period_write(struct file *file,
+                                       const char __user *user_buf,
+                                       size_t count, loff_t *ppos) {
+       struct iwl_priv *priv = file->private_data;
+       char buf[8];
+       int buf_size;
+       int period;
+       memset(buf, 0, sizeof(buf));
+       buf_size = min(count, sizeof(buf) -  1);
+       if (copy_from_user(buf, user_buf, buf_size))
+               return -EFAULT;
+       if (sscanf(buf, "%d", &period) != 1)
+               return -EINVAL;
+       if (period < 0 || period > IWL_MAX_MONITORING_PERIOD)
+               priv->cfg->base_params->monitor_recover_period =
+                       IWL_DEF_MONITORING_PERIOD;
+       else
+               priv->cfg->base_params->monitor_recover_period = period;
+       if (priv->cfg->base_params->monitor_recover_period)
+               mod_timer(&priv->monitor_recover, jiffies + msecs_to_jiffies(
+                         priv->cfg->base_params->monitor_recover_period));
+       else
+               del_timer_sync(&priv->monitor_recover);
+       return count;
+ }
+ static ssize_t iwl_dbgfs_bt_traffic_read(struct file *file,
+                                       char __user *user_buf,
+                                       size_t count, loff_t *ppos) {
+       struct iwl_priv *priv = (struct iwl_priv *)file->private_data;
+       int pos = 0;
+       char buf[200];
+       const size_t bufsz = sizeof(buf);
+       ssize_t ret;
+       pos += scnprintf(buf + pos, bufsz - pos, "BT in %s mode\n",
+               priv->bt_full_concurrent ? "full concurrency" : "3-wire");
+       pos += scnprintf(buf + pos, bufsz - pos, "BT status: %s, "
+                        "last traffic notif: %d\n",
+               priv->bt_status ? "On" : "Off", priv->notif_bt_traffic_load);
+       pos += scnprintf(buf + pos, bufsz - pos, "ch_announcement: %d, "
+                        "sco_active: %d, kill_ack_mask: %x, "
+                        "kill_cts_mask: %x\n",
+               priv->bt_ch_announce, priv->bt_sco_active,
+               priv->kill_ack_mask, priv->kill_cts_mask);
+       pos += scnprintf(buf + pos, bufsz - pos, "bluetooth traffic load: ");
+       switch (priv->bt_traffic_load) {
+       case IWL_BT_COEX_TRAFFIC_LOAD_CONTINUOUS:
+               pos += scnprintf(buf + pos, bufsz - pos, "Continuous\n");
+               break;
+       case IWL_BT_COEX_TRAFFIC_LOAD_HIGH:
+               pos += scnprintf(buf + pos, bufsz - pos, "High\n");
+               break;
+       case IWL_BT_COEX_TRAFFIC_LOAD_LOW:
+               pos += scnprintf(buf + pos, bufsz - pos, "Low\n");
+               break;
+       case IWL_BT_COEX_TRAFFIC_LOAD_NONE:
+       default:
+               pos += scnprintf(buf + pos, bufsz - pos, "None\n");
+               break;
+       }
+       ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
+       return ret;
+ }
+ static ssize_t iwl_dbgfs_protection_mode_read(struct file *file,
+                                       char __user *user_buf,
+                                       size_t count, loff_t *ppos)
+ {
+       struct iwl_priv *priv = (struct iwl_priv *)file->private_data;
+       int pos = 0;
+       char buf[40];
+       const size_t bufsz = sizeof(buf);
+       if (priv->cfg->ht_params)
+               pos += scnprintf(buf + pos, bufsz - pos,
+                        "use %s for aggregation\n",
+                        (priv->cfg->ht_params->use_rts_for_aggregation) ?
+                               "rts/cts" : "cts-to-self");
+       else
+               pos += scnprintf(buf + pos, bufsz - pos, "N/A");
+       return simple_read_from_buffer(user_buf, count, ppos, buf, pos);
+ }
+ static ssize_t iwl_dbgfs_protection_mode_write(struct file *file,
+                                       const char __user *user_buf,
+                                       size_t count, loff_t *ppos) {
+       struct iwl_priv *priv = file->private_data;
+       char buf[8];
+       int buf_size;
+       int rts;
+       if (!priv->cfg->ht_params)
+               return -EINVAL;
+       memset(buf, 0, sizeof(buf));
+       buf_size = min(count, sizeof(buf) -  1);
+       if (copy_from_user(buf, user_buf, buf_size))
+               return -EFAULT;
+       if (sscanf(buf, "%d", &rts) != 1)
+               return -EINVAL;
+       if (rts)
+               priv->cfg->ht_params->use_rts_for_aggregation = true;
+       else
+               priv->cfg->ht_params->use_rts_for_aggregation = false;
+       return count;
+ }
+ static ssize_t iwl_dbgfs_reply_tx_error_read(struct file *file,
+                                       char __user *user_buf,
+                                       size_t count, loff_t *ppos)
+ {
+       struct iwl_priv *priv = file->private_data;
+       if (priv->cfg->ops->lib->debugfs_ops.reply_tx_error)
+               return priv->cfg->ops->lib->debugfs_ops.reply_tx_error(
+                       file, user_buf, count, ppos);
+       else
+               return -ENODATA;
+ }
  DEBUGFS_READ_FILE_OPS(rx_statistics);
  DEBUGFS_READ_FILE_OPS(tx_statistics);
  DEBUGFS_READ_WRITE_FILE_OPS(traffic_log);
@@@ -1555,6 -1686,10 +1689,10 @@@ DEBUGFS_READ_FILE_OPS(rxon_flags)
  DEBUGFS_READ_FILE_OPS(rxon_filter_flags);
  DEBUGFS_WRITE_FILE_OPS(txfifo_flush);
  DEBUGFS_READ_FILE_OPS(ucode_bt_stats);
+ DEBUGFS_WRITE_FILE_OPS(monitor_period);
+ DEBUGFS_READ_FILE_OPS(bt_traffic);
+ DEBUGFS_READ_WRITE_FILE_OPS(protection_mode);
+ DEBUGFS_READ_FILE_OPS(reply_tx_error);
  
  /*
   * Create the debugfs files and directories
@@@ -1590,7 -1725,7 +1728,7 @@@ int iwl_dbgfs_register(struct iwl_priv 
        DEBUGFS_ADD_FILE(interrupt, dir_data, S_IWUSR | S_IRUSR);
        DEBUGFS_ADD_FILE(qos, dir_data, S_IRUSR);
        DEBUGFS_ADD_FILE(led, dir_data, S_IRUSR);
-       if (!priv->cfg->broken_powersave) {
+       if (!priv->cfg->base_params->broken_powersave) {
                DEBUGFS_ADD_FILE(sleep_level_override, dir_data,
                                 S_IWUSR | S_IRUSR);
                DEBUGFS_ADD_FILE(current_sleep_command, dir_data, S_IRUSR);
        DEBUGFS_ADD_FILE(ucode_general_stats, dir_debug, S_IRUSR);
        if (priv->cfg->ops->lib->dev_txfifo_flush)
                DEBUGFS_ADD_FILE(txfifo_flush, dir_debug, S_IWUSR);
+       DEBUGFS_ADD_FILE(protection_mode, dir_debug, S_IWUSR | S_IRUSR);
  
-       if (priv->cfg->sensitivity_calib_by_driver)
+       if (priv->cfg->base_params->sensitivity_calib_by_driver)
                DEBUGFS_ADD_FILE(sensitivity, dir_debug, S_IRUSR);
-       if (priv->cfg->chain_noise_calib_by_driver)
+       if (priv->cfg->base_params->chain_noise_calib_by_driver)
                DEBUGFS_ADD_FILE(chain_noise, dir_debug, S_IRUSR);
-       if (priv->cfg->ucode_tracing)
+       if (priv->cfg->base_params->ucode_tracing)
                DEBUGFS_ADD_FILE(ucode_tracing, dir_debug, S_IWUSR | S_IRUSR);
-       if (priv->cfg->bt_statistics)
+       if (priv->cfg->bt_params && priv->cfg->bt_params->bt_statistics)
                DEBUGFS_ADD_FILE(ucode_bt_stats, dir_debug, S_IRUSR);
+       DEBUGFS_ADD_FILE(reply_tx_error, dir_debug, S_IRUSR);
        DEBUGFS_ADD_FILE(rxon_flags, dir_debug, S_IWUSR);
        DEBUGFS_ADD_FILE(rxon_filter_flags, dir_debug, S_IWUSR);
-       if (priv->cfg->sensitivity_calib_by_driver)
+       DEBUGFS_ADD_FILE(monitor_period, dir_debug, S_IWUSR);
+       if (priv->cfg->bt_params && priv->cfg->bt_params->advanced_bt_coexist)
+               DEBUGFS_ADD_FILE(bt_traffic, dir_debug, S_IRUSR);
+       if (priv->cfg->base_params->sensitivity_calib_by_driver)
                DEBUGFS_ADD_BOOL(disable_sensitivity, dir_rf,
                                 &priv->disable_sens_cal);
-       if (priv->cfg->chain_noise_calib_by_driver)
+       if (priv->cfg->base_params->chain_noise_calib_by_driver)
                DEBUGFS_ADD_BOOL(disable_chain_noise, dir_rf,
                                 &priv->disable_chain_noise_cal);
-       if (priv->cfg->tx_power_by_driver)
+       if (priv->cfg->base_params->tx_power_by_driver)
                DEBUGFS_ADD_BOOL(disable_tx_power, dir_rf,
                                &priv->disable_tx_power_cal);
        return 0;
@@@ -28,6 -28,7 +28,6 @@@
  #include <linux/firmware.h>
  #include <linux/netdevice.h>
  
 -#include <pcmcia/cs.h>
  #include <pcmcia/cistpl.h>
  #include <pcmcia/ds.h>
  
@@@ -47,7 -48,6 +47,6 @@@
  MODULE_AUTHOR("Holger Schurig <hs4233@mail.mn-solutions.de>");
  MODULE_DESCRIPTION("Driver for Marvell 83xx compact flash WLAN cards");
  MODULE_LICENSE("GPL");
- MODULE_FIRMWARE("libertas_cs_helper.fw");
  
  
  
@@@ -60,9 -60,34 +59,34 @@@ struct if_cs_card 
        struct lbs_private *priv;
        void __iomem *iobase;
        bool align_regs;
+       u32 model;
  };
  
  
+ enum {
+       MODEL_UNKNOWN = 0x00,
+       MODEL_8305 = 0x01,
+       MODEL_8381 = 0x02,
+       MODEL_8385 = 0x03
+ };
+ static const struct lbs_fw_table fw_table[] = {
+       { MODEL_8305, "libertas/cf8305.bin", NULL },
+       { MODEL_8305, "libertas_cs_helper.fw", NULL },
+       { MODEL_8381, "libertas/cf8381_helper.bin", "libertas/cf8381.bin" },
+       { MODEL_8381, "libertas_cs_helper.fw", "libertas_cs.fw" },
+       { MODEL_8385, "libertas/cf8385_helper.bin", "libertas/cf8385.bin" },
+       { MODEL_8385, "libertas_cs_helper.fw", "libertas_cs.fw" },
+       { 0, NULL, NULL }
+ };
+ MODULE_FIRMWARE("libertas/cf8305.bin");
+ MODULE_FIRMWARE("libertas/cf8381_helper.bin");
+ MODULE_FIRMWARE("libertas/cf8381.bin");
+ MODULE_FIRMWARE("libertas/cf8385_helper.bin");
+ MODULE_FIRMWARE("libertas/cf8385.bin");
+ MODULE_FIRMWARE("libertas_cs_helper.fw");
+ MODULE_FIRMWARE("libertas_cs.fw");
  
  /********************************************************************/
  /* Hardware access                                                  */
@@@ -288,22 -313,19 +312,19 @@@ static int if_cs_poll_while_fw_download
  #define CF8385_MANFID         0x02df
  #define CF8385_CARDID         0x8103
  
- static inline int if_cs_hw_is_cf8305(struct pcmcia_device *p_dev)
- {
-       return (p_dev->manf_id == CF8305_MANFID &&
-               p_dev->card_id == CF8305_CARDID);
- }
- static inline int if_cs_hw_is_cf8381(struct pcmcia_device *p_dev)
- {
-       return (p_dev->manf_id == CF8381_MANFID &&
-               p_dev->card_id == CF8381_CARDID);
- }
- static inline int if_cs_hw_is_cf8385(struct pcmcia_device *p_dev)
+ /* FIXME: just use the 'driver_info' field of 'struct pcmcia_device_id' when
+  * that gets fixed.  Currently there's no way to access it from the probe hook.
+  */
+ static inline u32 get_model(u16 manf_id, u16 card_id)
  {
-       return (p_dev->manf_id == CF8385_MANFID &&
-               p_dev->card_id == CF8385_CARDID);
+       /* NOTE: keep in sync with if_cs_ids */
+       if (manf_id == CF8305_MANFID && card_id == CF8305_CARDID)
+               return MODEL_8305;
+       else if (manf_id == CF8381_MANFID && card_id == CF8381_CARDID)
+               return MODEL_8381;
+       else if (manf_id == CF8385_MANFID && card_id == CF8385_CARDID)
+               return MODEL_8385;
+       return MODEL_UNKNOWN;
  }
  
  /********************************************************************/
@@@ -557,12 -579,11 +578,11 @@@ static irqreturn_t if_cs_interrupt(int 
   *
   * Return 0 on success
   */
- static int if_cs_prog_helper(struct if_cs_card *card)
+ static int if_cs_prog_helper(struct if_cs_card *card, const struct firmware *fw)
  {
        int ret = 0;
        int sent = 0;
        u8  scratch;
-       const struct firmware *fw;
  
        lbs_deb_enter(LBS_DEB_CS);
  
                goto done;
        }
  
-       /* TODO: make firmware file configurable */
-       ret = request_firmware(&fw, "libertas_cs_helper.fw",
-               &card->p_dev->dev);
-       if (ret) {
-               lbs_pr_err("can't load helper firmware\n");
-               ret = -ENODEV;
-               goto done;
-       }
        lbs_deb_cs("helper size %td\n", fw->size);
  
        /* "Set the 5 bytes of the helper image to 0" */
                if (ret < 0) {
                        lbs_pr_err("can't download helper at 0x%x, ret %d\n",
                                sent, ret);
-                       goto err_release;
+                       goto done;
                }
  
                if (count == 0)
                sent += count;
        }
  
- err_release:
-       release_firmware(fw);
  done:
        lbs_deb_leave_args(LBS_DEB_CS, "ret %d", ret);
        return ret;
  }
  
  
- static int if_cs_prog_real(struct if_cs_card *card)
+ static int if_cs_prog_real(struct if_cs_card *card, const struct firmware *fw)
  {
-       const struct firmware *fw;
        int ret = 0;
        int retry = 0;
        int len = 0;
  
        lbs_deb_enter(LBS_DEB_CS);
  
-       /* TODO: make firmware file configurable */
-       ret = request_firmware(&fw, "libertas_cs.fw",
-               &card->p_dev->dev);
-       if (ret) {
-               lbs_pr_err("can't load firmware\n");
-               ret = -ENODEV;
-               goto done;
-       }
        lbs_deb_cs("fw size %td\n", fw->size);
  
        ret = if_cs_poll_while_fw_download(card, IF_CS_SQ_READ_LOW,
                IF_CS_SQ_HELPER_OK);
        if (ret < 0) {
                lbs_pr_err("helper firmware doesn't answer\n");
-               goto err_release;
+               goto done;
        }
  
        for (sent = 0; sent < fw->size; sent += len) {
                if (retry > 20) {
                        lbs_pr_err("could not download firmware\n");
                        ret = -ENODEV;
-                       goto err_release;
+                       goto done;
                }
                if (retry) {
                        sent -= len;
                        IF_CS_BIT_COMMAND);
                if (ret < 0) {
                        lbs_pr_err("can't download firmware at 0x%x\n", sent);
-                       goto err_release;
+                       goto done;
                }
        }
  
        if (ret < 0)
                lbs_pr_err("firmware download failed\n");
  
- err_release:
-       release_firmware(fw);
  done:
        lbs_deb_leave_args(LBS_DEB_CS, "ret %d", ret);
        return ret;
@@@ -760,6 -759,15 +758,6 @@@ static int if_cs_host_to_card(struct lb
  }
  
  
 -/********************************************************************/
 -/* Card Services                                                    */
 -/********************************************************************/
 -
 -/*
 - * After a card is removed, if_cs_release() will unregister the
 - * device, and release the PCMCIA configuration.  If the device is
 - * still open, this will be postponed until it is closed.
 - */
  static void if_cs_release(struct pcmcia_device *p_dev)
  {
        struct if_cs_card *card = p_dev->priv;
  }
  
  
 -/*
 - * This creates an "instance" of the driver, allocating local data
 - * structures for one device.  The device is registered with Card
 - * Services.
 - *
 - * The dev_link structure is initialized, but we don't actually
 - * configure the card at this point -- we wait until we receive a card
 - * insertion event.
 - */
 -
 -static int if_cs_ioprobe(struct pcmcia_device *p_dev,
 -                       cistpl_cftable_entry_t *cfg,
 -                       cistpl_cftable_entry_t *dflt,
 -                       unsigned int vcc,
 -                       void *priv_data)
 +static int if_cs_ioprobe(struct pcmcia_device *p_dev, void *priv_data)
  {
 +      p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
        p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
 -      p_dev->resource[0]->start = cfg->io.win[0].base;
 -      p_dev->resource[0]->end = cfg->io.win[0].len;
  
 -      /* Do we need to allocate an interrupt? */
 -      p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
 -
 -      /* IO window settings */
 -      if (cfg->io.nwin != 1) {
 +      if (p_dev->resource[1]->end) {
                lbs_pr_err("wrong CIS (check number of IO windows)\n");
                return -ENODEV;
        }
@@@ -795,6 -822,8 +793,8 @@@ static int if_cs_probe(struct pcmcia_de
        unsigned int prod_id;
        struct lbs_private *priv;
        struct if_cs_card *card;
+       const struct firmware *helper = NULL;
+       const struct firmware *mainfw = NULL;
  
        lbs_deb_enter(LBS_DEB_CS);
  
        card->p_dev = p_dev;
        p_dev->priv = card;
  
 -      p_dev->conf.Attributes = 0;
 -      p_dev->conf.IntType = INT_MEMORY_AND_IO;
 +      p_dev->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
  
        if (pcmcia_loop_config(p_dev, if_cs_ioprobe, NULL)) {
                lbs_pr_err("error in pcmcia_loop_config\n");
                goto out1;
        }
  
 -      /*
 -       * This actually configures the PCMCIA socket -- setting up
 -       * the I/O windows and the interrupt mapping, and putting the
 -       * card and host interface into "Memory and IO" mode.
 -       */
 -      ret = pcmcia_request_configuration(p_dev, &p_dev->conf);
 +      ret = pcmcia_enable_device(p_dev);
        if (ret) {
 -              lbs_pr_err("error in pcmcia_request_configuration\n");
 +              lbs_pr_err("error in pcmcia_enable_device\n");
                goto out2;
        }
  
         */
        card->align_regs = 0;
  
+       card->model = get_model(p_dev->manf_id, p_dev->card_id);
+       if (card->model == MODEL_UNKNOWN) {
+               lbs_pr_err("unsupported manf_id 0x%04x / card_id 0x%04x\n",
+                          p_dev->manf_id, p_dev->card_id);
+               goto out2;
+       }
        /* Check if we have a current silicon */
        prod_id = if_cs_read8(card, IF_CS_PRODUCT_ID);
-       if (if_cs_hw_is_cf8305(p_dev)) {
+       if (card->model == MODEL_8305) {
                card->align_regs = 1;
                if (prod_id < IF_CS_CF8305_B1_REV) {
-                       lbs_pr_err("old chips like 8305 rev B3 "
-                               "aren't supported\n");
+                       lbs_pr_err("8305 rev B0 and older are not supported\n");
                        ret = -ENODEV;
                        goto out2;
                }
        }
  
-       if (if_cs_hw_is_cf8381(p_dev) && prod_id < IF_CS_CF8381_B3_REV) {
-               lbs_pr_err("old chips like 8381 rev B3 aren't supported\n");
+       if ((card->model == MODEL_8381) && prod_id < IF_CS_CF8381_B3_REV) {
+               lbs_pr_err("8381 rev B2 and older are not supported\n");
                ret = -ENODEV;
                goto out2;
        }
  
-       if (if_cs_hw_is_cf8385(p_dev) && prod_id < IF_CS_CF8385_B1_REV) {
-               lbs_pr_err("old chips like 8385 rev B1 aren't supported\n");
+       if ((card->model == MODEL_8385) && prod_id < IF_CS_CF8385_B1_REV) {
+               lbs_pr_err("8385 rev B0 and older are not supported\n");
                ret = -ENODEV;
                goto out2;
        }
  
+       ret = lbs_get_firmware(&p_dev->dev, NULL, NULL, card->model,
+                               &fw_table[0], &helper, &mainfw);
+       if (ret) {
+               lbs_pr_err("failed to find firmware (%d)\n", ret);
+               goto out2;
+       }
        /* Load the firmware early, before calling into libertas.ko */
-       ret = if_cs_prog_helper(card);
-       if (ret == 0 && !if_cs_hw_is_cf8305(p_dev))
-               ret = if_cs_prog_real(card);
+       ret = if_cs_prog_helper(card, helper);
+       if (ret == 0 && (card->model != MODEL_8305))
+               ret = if_cs_prog_real(card, mainfw);
        if (ret)
                goto out2;
  
@@@ -921,11 -969,22 +934,16 @@@ out2
  out1:
        pcmcia_disable_device(p_dev);
  out:
+       if (helper)
+               release_firmware(helper);
+       if (mainfw)
+               release_firmware(mainfw);
        lbs_deb_leave_args(LBS_DEB_CS, "ret %d", ret);
        return ret;
  }
  
  
 -/*
 - * This deletes a driver "instance".  The device is de-registered with
 - * Card Services.  If it has been released, all local data structures
 - * are freed.  Otherwise, the structures will be freed when the device
 - * is released.
 - */
  static void if_cs_detach(struct pcmcia_device *p_dev)
  {
        struct if_cs_card *card = p_dev->priv;
@@@ -951,6 -1010,7 +969,7 @@@ static struct pcmcia_device_id if_cs_id
        PCMCIA_DEVICE_MANF_CARD(CF8305_MANFID, CF8305_CARDID),
        PCMCIA_DEVICE_MANF_CARD(CF8381_MANFID, CF8381_CARDID),
        PCMCIA_DEVICE_MANF_CARD(CF8385_MANFID, CF8385_CARDID),
+       /* NOTE: keep in sync with get_model() */
        PCMCIA_DEVICE_NULL,
  };
  MODULE_DEVICE_TABLE(pcmcia, if_cs_ids);
  
  static struct pcmcia_driver lbs_driver = {
        .owner          = THIS_MODULE,
 -      .drv            = {
 -              .name   = DRV_NAME,
 -      },
 +      .name           = DRV_NAME,
        .probe          = if_cs_probe,
        .remove         = if_cs_detach,
        .id_table       = if_cs_ids,
@@@ -43,9 -43,9 +43,8 @@@
  #include <linux/if_arp.h>
  #include <linux/ioport.h>
  #include <linux/skbuff.h>
- #include <linux/ethtool.h>
  #include <linux/ieee80211.h>
  
 -#include <pcmcia/cs.h>
  #include <pcmcia/cistpl.h>
  #include <pcmcia/cisreg.h>
  #include <pcmcia/ds.h>
@@@ -79,8 -79,6 +78,6 @@@ static int ray_dev_config(struct net_de
  static struct net_device_stats *ray_get_stats(struct net_device *dev);
  static int ray_dev_init(struct net_device *dev);
  
- static const struct ethtool_ops netdev_ethtool_ops;
  static int ray_open(struct net_device *dev);
  static netdev_tx_t ray_dev_start_xmit(struct sk_buff *skb,
                                            struct net_device *dev);
@@@ -168,6 -166,13 +165,6 @@@ static int bc
   */
  static char *phy_addr = NULL;
  
 -
 -/* A struct pcmcia_device structure has fields for most things that are needed
 -   to keep track of a socket, but there will usually be some device
 -   specific information that also needs to be kept track of.  The
 -   'priv' pointer in a struct pcmcia_device structure can be used to point to
 -   a device-specific private data structure, like this.
 -*/
  static unsigned int ray_mem_speed = 500;
  
  /* WARNING: THIS DRIVER IS NOT CAPABLE OF HANDLING MULTIPLE DEVICES! */
@@@ -189,7 -194,7 +186,7 @@@ module_param(bc, int, 0)
  module_param(phy_addr, charp, 0);
  module_param(ray_mem_speed, int, 0);
  
- static UCHAR b5_default_startup_parms[] = {
+ static const UCHAR b5_default_startup_parms[] = {
        0, 0,                   /* Adhoc station */
        'L', 'I', 'N', 'U', 'X', 0, 0, 0,       /* 32 char ESSID */
        0, 0, 0, 0, 0, 0, 0, 0,
        2, 0, 0, 0, 0, 0, 0, 0  /* basic rate set */
  };
  
- static UCHAR b4_default_startup_parms[] = {
+ static const UCHAR b4_default_startup_parms[] = {
        0, 0,                   /* Adhoc station */
        'L', 'I', 'N', 'U', 'X', 0, 0, 0,       /* 32 char ESSID */
        0, 0, 0, 0, 0, 0, 0, 0,
  };
  
  /*===========================================================================*/
- static unsigned char eth2_llc[] = { 0xaa, 0xaa, 3, 0, 0, 0 };
+ static const u8 eth2_llc[] = { 0xaa, 0xaa, 3, 0, 0, 0 };
  
- static char hop_pattern_length[] = { 1,
+ static const char hop_pattern_length[] = { 1,
        USA_HOP_MOD, EUROPE_HOP_MOD,
        JAPAN_HOP_MOD, KOREA_HOP_MOD,
        SPAIN_HOP_MOD, FRANCE_HOP_MOD,
        JAPAN_TEST_HOP_MOD
  };
  
- static char rcsid[] =
+ static const char rcsid[] =
      "Raylink/WebGear wireless LAN - Corey <Thomas corey@world.std.com>";
  
  static const struct net_device_ops ray_netdev_ops = {
        .ndo_validate_addr      = eth_validate_addr,
  };
  
 -/*=============================================================================
 -    ray_attach() creates an "instance" of the driver, allocating
 -    local data structures for one device.  The device is registered
 -    with Card Services.
 -    The dev_link structure is initialized, but we don't actually
 -    configure the card at this point -- we wait until we receive a
 -    card insertion event.
 -=============================================================================*/
  static int ray_probe(struct pcmcia_device *p_dev)
  {
        ray_dev_t *local;
        p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
  
        /* General socket configuration */
 -      p_dev->conf.Attributes = CONF_ENABLE_IRQ;
 -      p_dev->conf.IntType = INT_MEMORY_AND_IO;
 -      p_dev->conf.ConfigIndex = 1;
 +      p_dev->config_flags |= CONF_ENABLE_IRQ;
 +      p_dev->config_index = 1;
  
        p_dev->priv = dev;
  
  
        /* Raylink entries in the device structure */
        dev->netdev_ops = &ray_netdev_ops;
-       SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
        dev->wireless_handlers = &ray_handler_def;
  #ifdef WIRELESS_SPY
        local->wireless_data.spy_data = &local->spy_data;
@@@ -336,6 -349,12 +332,6 @@@ fail_alloc_dev
        return -ENOMEM;
  } /* ray_attach */
  
 -/*=============================================================================
 -    This deletes a driver "instance".  The device is de-registered
 -    with Card Services.  If it has been released, all local data
 -    structures are freed.  Otherwise, the structures will be freed
 -    when the device is released.
 -=============================================================================*/
  static void ray_detach(struct pcmcia_device *link)
  {
        struct net_device *dev;
        dev_dbg(&link->dev, "ray_cs ray_detach ending\n");
  } /* ray_detach */
  
 -/*=============================================================================
 -    ray_config() is run after a CARD_INSERTION event
 -    is received, to configure the PCMCIA socket, and to make the
 -    ethernet device available to the system.
 -=============================================================================*/
  #define MAX_TUPLE_SIZE 128
  static int ray_config(struct pcmcia_device *link)
  {
        int ret = 0;
        int i;
 -      win_req_t req;
        struct net_device *dev = (struct net_device *)link->priv;
        ray_dev_t *local = netdev_priv(dev);
  
                goto failed;
        dev->irq = link->irq;
  
 -      /* This actually configures the PCMCIA socket -- setting up
 -         the I/O windows and the interrupt mapping.
 -       */
 -      ret = pcmcia_request_configuration(link, &link->conf);
 +      ret = pcmcia_enable_device(link);
        if (ret)
                goto failed;
  
  /*** Set up 32k window for shared memory (transmit and control) ************/
 -      req.Attributes =
 -          WIN_DATA_WIDTH_8 | WIN_MEMORY_TYPE_CM | WIN_ENABLE | WIN_USE_WAIT;
 -      req.Base = 0;
 -      req.Size = 0x8000;
 -      req.AccessSpeed = ray_mem_speed;
 -      ret = pcmcia_request_window(link, &req, &link->win);
 +      link->resource[2]->flags |= WIN_DATA_WIDTH_8 | WIN_MEMORY_TYPE_CM | WIN_ENABLE | WIN_USE_WAIT;
 +      link->resource[2]->start = 0;
 +      link->resource[2]->end = 0x8000;
 +      ret = pcmcia_request_window(link, link->resource[2], ray_mem_speed);
        if (ret)
                goto failed;
 -      ret = pcmcia_map_mem_page(link, link->win, 0);
 +      ret = pcmcia_map_mem_page(link, link->resource[2], 0);
        if (ret)
                goto failed;
 -      local->sram = ioremap(req.Base, req.Size);
 +      local->sram = ioremap(link->resource[2]->start,
 +                      resource_size(link->resource[2]));
  
  /*** Set up 16k window for shared memory (receive buffer) ***************/
 -      req.Attributes =
 +      link->resource[3]->flags |=
            WIN_DATA_WIDTH_8 | WIN_MEMORY_TYPE_CM | WIN_ENABLE | WIN_USE_WAIT;
 -      req.Base = 0;
 -      req.Size = 0x4000;
 -      req.AccessSpeed = ray_mem_speed;
 -      ret = pcmcia_request_window(link, &req, &local->rmem_handle);
 +      link->resource[3]->start = 0;
 +      link->resource[3]->end = 0x4000;
 +      ret = pcmcia_request_window(link, link->resource[3], ray_mem_speed);
        if (ret)
                goto failed;
 -      ret = pcmcia_map_mem_page(link, local->rmem_handle, 0x8000);
 +      ret = pcmcia_map_mem_page(link, link->resource[3], 0x8000);
        if (ret)
                goto failed;
 -      local->rmem = ioremap(req.Base, req.Size);
 +      local->rmem = ioremap(link->resource[3]->start,
 +                      resource_size(link->resource[3]));
  
  /*** Set up window for attribute memory ***********************************/
 -      req.Attributes =
 +      link->resource[4]->flags |=
            WIN_DATA_WIDTH_8 | WIN_MEMORY_TYPE_AM | WIN_ENABLE | WIN_USE_WAIT;
 -      req.Base = 0;
 -      req.Size = 0x1000;
 -      req.AccessSpeed = ray_mem_speed;
 -      ret = pcmcia_request_window(link, &req, &local->amem_handle);
 +      link->resource[4]->start = 0;
 +      link->resource[4]->end = 0x1000;
 +      ret = pcmcia_request_window(link, link->resource[4], ray_mem_speed);
        if (ret)
                goto failed;
 -      ret = pcmcia_map_mem_page(link, local->amem_handle, 0);
 +      ret = pcmcia_map_mem_page(link, link->resource[4], 0);
        if (ret)
                goto failed;
 -      local->amem = ioremap(req.Base, req.Size);
 +      local->amem = ioremap(link->resource[4]->start,
 +                      resource_size(link->resource[4]));
  
        dev_dbg(&link->dev, "ray_config sram=%p\n", local->sram);
        dev_dbg(&link->dev, "ray_config rmem=%p\n", local->rmem);
@@@ -575,7 -604,7 +571,7 @@@ static int dl_startup_params(struct net
        /* Start kernel timer to wait for dl startup to complete. */
        local->timer.expires = jiffies + HZ / 2;
        local->timer.data = (long)local;
-       local->timer.function = &verify_dl_startup;
+       local->timer.function = verify_dl_startup;
        add_timer(&local->timer);
        dev_dbg(&link->dev,
              "ray_cs dl_startup_params started timer for verify_dl_startup\n");
@@@ -742,7 -771,11 +738,7 @@@ static void join_net(u_long data
        local->card_status = CARD_DOING_ACQ;
  }
  
 -/*============================================================================
 -    After a card is removed, ray_release() will unregister the net
 -    device, and release the PCMCIA configuration.  If the device is
 -    still open, this will be postponed until it is closed.
 -=============================================================================*/
 +
  static void ray_release(struct pcmcia_device *link)
  {
        struct net_device *dev = link->priv;
@@@ -1025,18 -1058,6 +1021,6 @@@ AP to AP       1       1       dest AP         src AP          dest    sour
        }
  } /* end encapsulate_frame */
  
- /*===========================================================================*/
- static void netdev_get_drvinfo(struct net_device *dev,
-                              struct ethtool_drvinfo *info)
- {
-       strcpy(info->driver, "ray_cs");
- }
- static const struct ethtool_ops netdev_ethtool_ops = {
-       .get_drvinfo = netdev_get_drvinfo,
- };
  /*====================================================================*/
  
  /*------------------------------------------------------------------*/
@@@ -1960,12 -1981,12 +1944,12 @@@ static irqreturn_t ray_interrupt(int ir
                                        dev_dbg(&link->dev,
                                              "ray_cs interrupt network \"%s\" start failed\n",
                                              local->sparm.b4.a_current_ess_id);
-                                       local->timer.function = &start_net;
+                                       local->timer.function = start_net;
                                } else {
                                        dev_dbg(&link->dev,
                                              "ray_cs interrupt network \"%s\" join failed\n",
                                              local->sparm.b4.a_current_ess_id);
-                                       local->timer.function = &join_net;
+                                       local->timer.function = join_net;
                                }
                                add_timer(&local->timer);
                        }
@@@ -2433,9 -2454,9 +2417,9 @@@ static void authenticate(ray_dev_t *loc
  
        del_timer(&local->timer);
        if (build_auth_frame(local, local->bss_id, OPEN_AUTH_REQUEST)) {
-               local->timer.function = &join_net;
+               local->timer.function = join_net;
        } else {
-               local->timer.function = &authenticate_timeout;
+               local->timer.function = authenticate_timeout;
        }
        local->timer.expires = jiffies + HZ * 2;
        local->timer.data = (long)local;
@@@ -2520,7 -2541,7 +2504,7 @@@ static void associate(ray_dev_t *local
                del_timer(&local->timer);
                local->timer.expires = jiffies + HZ * 2;
                local->timer.data = (long)local;
-               local->timer.function = &join_net;
+               local->timer.function = join_net;
                add_timer(&local->timer);
                local->card_status = CARD_ASSOC_FAILED;
                return;
@@@ -2554,7 -2575,7 +2538,7 @@@ static void clear_interrupt(ray_dev_t *
  #ifdef CONFIG_PROC_FS
  #define MAXDATA (PAGE_SIZE - 80)
  
- static char *card_status[] = {
+ static const char *card_status[] = {
        "Card inserted - uninitialized",        /* 0 */
        "Card not downloaded",                  /* 1 */
        "Waiting for download parameters",      /* 2 */
        "Association failed"                    /* 16 */
  };
  
- static char *nettype[] = { "Adhoc", "Infra " };
- static char *framing[] = { "Encapsulation", "Translation" }
+ static const char *nettype[] = { "Adhoc", "Infra " };
+ static const char *framing[] = { "Encapsulation", "Translation" }
  
  ;
  /*===========================================================================*/
@@@ -2765,7 -2786,6 +2749,7 @@@ static ssize_t ray_cs_essid_proc_write(
  static const struct file_operations ray_cs_essid_proc_fops = {
        .owner          = THIS_MODULE,
        .write          = ray_cs_essid_proc_write,
 +      .llseek         = noop_llseek,
  };
  
  static ssize_t int_proc_write(struct file *file, const char __user *buffer,
  static const struct file_operations int_proc_fops = {
        .owner          = THIS_MODULE,
        .write          = int_proc_write,
 +      .llseek         = noop_llseek,
  };
  #endif
  
@@@ -2812,7 -2831,9 +2796,7 @@@ MODULE_DEVICE_TABLE(pcmcia, ray_ids)
  
  static struct pcmcia_driver ray_driver = {
        .owner = THIS_MODULE,
 -      .drv = {
 -              .name = "ray_cs",
 -              },
 +      .name = "ray_cs",
        .probe = ray_probe,
        .remove = ray_detach,
        .id_table = ray_ids,
@@@ -315,7 -315,6 +315,7 @@@ static const struct file_operations rt2
        .poll           = rt2x00debug_poll_queue_dump,
        .open           = rt2x00debug_open_queue_dump,
        .release        = rt2x00debug_release_queue_dump,
 +      .llseek         = default_llseek,
  };
  
  static ssize_t rt2x00debug_read_queue_stats(struct file *file,
        if (*offset)
                return 0;
  
-       data = kzalloc(lines * MAX_LINE_LENGTH, GFP_KERNEL);
+       data = kcalloc(lines, MAX_LINE_LENGTH, GFP_KERNEL);
        if (!data)
                return -ENOMEM;
  
        temp = data +
-           sprintf(data, "qid\tcount\tlimit\tlength\tindex\tdone\tcrypto\n");
+           sprintf(data, "qid\tcount\tlimit\tlength\tindex\tdma done\tdone\n");
  
        queue_for_each(intf->rt2x00dev, queue) {
                spin_lock_irqsave(&queue->lock, irqflags);
                temp += sprintf(temp, "%d\t%d\t%d\t%d\t%d\t%d\t%d\n", queue->qid,
                                queue->count, queue->limit, queue->length,
                                queue->index[Q_INDEX],
-                               queue->index[Q_INDEX_DONE],
-                               queue->index[Q_INDEX_CRYPTO]);
+                               queue->index[Q_INDEX_DMA_DONE],
+                               queue->index[Q_INDEX_DONE]);
  
                spin_unlock_irqrestore(&queue->lock, irqflags);
        }
@@@ -372,7 -371,6 +372,7 @@@ static const struct file_operations rt2
        .read           = rt2x00debug_read_queue_stats,
        .open           = rt2x00debug_file_open,
        .release        = rt2x00debug_file_release,
 +      .llseek         = default_llseek,
  };
  
  #ifdef CONFIG_RT2X00_LIB_CRYPTO
@@@ -382,7 -380,7 +382,7 @@@ static ssize_t rt2x00debug_read_crypto_
                                             loff_t *offset)
  {
        struct rt2x00debug_intf *intf = file->private_data;
-       char *name[] = { "WEP64", "WEP128", "TKIP", "AES" };
+       static const char * const name[] = { "WEP64", "WEP128", "TKIP", "AES" };
        char *data;
        char *temp;
        size_t size;
@@@ -425,7 -423,6 +425,7 @@@ static const struct file_operations rt2
        .read           = rt2x00debug_read_crypto_stats,
        .open           = rt2x00debug_file_open,
        .release        = rt2x00debug_file_release,
 +      .llseek         = default_llseek,
  };
  #endif
  
@@@ -484,6 -481,9 +484,9 @@@ static ssize_t rt2x00debug_write_##__na
        if (index >= debug->__name.word_count)                  \
                return -EINVAL;                                 \
                                                                \
+       if (length > sizeof(line))                              \
+               return -EINVAL;                                 \
+                                                               \
        if (copy_from_user(line, buf, length))                  \
                return -EFAULT;                                 \
                                                                \
@@@ -512,7 -512,6 +515,7 @@@ static const struct file_operations rt2
        .write          = rt2x00debug_write_##__name,           \
        .open           = rt2x00debug_file_open,                \
        .release        = rt2x00debug_file_release,             \
 +      .llseek         = generic_file_llseek,                  \
  };
  
  RT2X00DEBUGFS_OPS(csr, "0x%.8x\n", u32);
@@@ -546,7 -545,6 +549,7 @@@ static const struct file_operations rt2
        .read           = rt2x00debug_read_dev_flags,
        .open           = rt2x00debug_file_open,
        .release        = rt2x00debug_file_release,
 +      .llseek         = default_llseek,
  };
  
  static struct dentry *rt2x00debug_create_file_driver(const char *name,
@@@ -3,8 -3,6 +3,6 @@@
   *
   * Copyright (C) 2009 Nokia Corporation
   *
-  * Contact: Kalle Valo <kalle.valo@nokia.com>
-  *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License
   * version 2 as published by the Free Software Foundation.
   *
   */
  
- #include "wl1251_debugfs.h"
+ #include "debugfs.h"
  
  #include <linux/skbuff.h>
  #include <linux/slab.h>
  
  #include "wl1251.h"
- #include "wl1251_acx.h"
- #include "wl1251_ps.h"
+ #include "acx.h"
+ #include "ps.h"
  
  /* ms */
  #define WL1251_DEBUGFS_STATS_LIFETIME 1000
@@@ -50,7 -48,6 +48,7 @@@ static ssize_t name## _read(struct fil
  static const struct file_operations name## _ops = {                   \
        .read = name## _read,                                           \
        .open = wl1251_open_file_generic,                               \
 +      .llseek = generic_file_llseek,                                  \
  };
  
  #define DEBUGFS_ADD(name, parent)                                     \
@@@ -87,7 -84,6 +85,7 @@@ static ssize_t sub## _ ##name## _read(s
  static const struct file_operations sub## _ ##name## _ops = {         \
        .read = sub## _ ##name## _read,                                 \
        .open = wl1251_open_file_generic,                               \
 +      .llseek = generic_file_llseek,                                  \
  };
  
  #define DEBUGFS_FWSTATS_ADD(sub, name)                                \
@@@ -238,7 -234,6 +236,7 @@@ static ssize_t tx_queue_len_read(struc
  static const struct file_operations tx_queue_len_ops = {
        .read = tx_queue_len_read,
        .open = wl1251_open_file_generic,
 +      .llseek = generic_file_llseek,
  };
  
  static ssize_t tx_queue_status_read(struct file *file, char __user *userbuf,
  static const struct file_operations tx_queue_status_ops = {
        .read = tx_queue_status_read,
        .open = wl1251_open_file_generic,
 +      .llseek = generic_file_llseek,
  };
  
  static void wl1251_debugfs_delete_files(struct wl1251 *wl)
@@@ -29,7 -29,6 +29,6 @@@
  
  #include <linux/delay.h>
  #include <linux/types.h>
- #include <linux/ethtool.h>
  #include <linux/init.h>
  #include <linux/interrupt.h>
  #include <linux/in.h>
@@@ -48,6 -47,7 +47,6 @@@
  
  #include <net/iw_handler.h>
  
 -#include <pcmcia/cs.h>
  #include <pcmcia/cistpl.h>
  #include <pcmcia/cisreg.h>
  #include <pcmcia/ds.h>
  #define WL3501_RESUME 0
  #define WL3501_SUSPEND        1
  
 -/*
 - * The event() function is this driver's Card Services event handler.  It will
 - * be called by Card Services when an appropriate card status event is
 - * received. The config() and release() entry points are used to configure or
 - * release a socket, in response to card insertion and ejection events.  They
 - * are invoked from the wl24 event handler.
 - */
  static int wl3501_config(struct pcmcia_device *link);
  static void wl3501_release(struct pcmcia_device *link);
  
@@@ -1403,15 -1410,6 +1402,6 @@@ static struct iw_statistics *wl3501_get
        return wstats;
  }
  
- static void wl3501_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
- {
-       strlcpy(info->driver, "wl3501_cs", sizeof(info->driver));
- }
- static const struct ethtool_ops ops = {
-       .get_drvinfo = wl3501_get_drvinfo
- };
  /**
   * wl3501_detach - deletes a driver "instance"
   * @link - FILL_IN
@@@ -1861,6 -1859,15 +1851,6 @@@ static const struct net_device_ops wl35
        .ndo_validate_addr      = eth_validate_addr,
  };
  
 -/**
 - * wl3501_attach - creates an "instance" of the driver
 - *
 - * Creates an "instance" of the driver, allocating local data structures for
 - * one device.  The device is registered with Card Services.
 - *
 - * The dev_link structure is initialized, but we don't actually configure the
 - * card at this point -- we wait until we receive a card insertion event.
 - */
  static int wl3501_probe(struct pcmcia_device *p_dev)
  {
        struct net_device *dev;
        p_dev->resource[0]->flags       = IO_DATA_PATH_WIDTH_8;
  
        /* General socket configuration */
 -      p_dev->conf.Attributes  = CONF_ENABLE_IRQ;
 -      p_dev->conf.IntType     = INT_MEMORY_AND_IO;
 -      p_dev->conf.ConfigIndex = 1;
 +      p_dev->config_flags     = CONF_ENABLE_IRQ;
 +      p_dev->config_index     = 1;
  
        dev = alloc_etherdev(sizeof(struct wl3501_card));
        if (!dev)
        this->p_dev = p_dev;
        dev->wireless_data      = &this->wireless_data;
        dev->wireless_handlers  = &wl3501_handler_def;
-       SET_ETHTOOL_OPS(dev, &ops);
        netif_stop_queue(dev);
        p_dev->priv = dev;
  
@@@ -1896,6 -1903,14 +1885,6 @@@ out_link
        return -ENOMEM;
  }
  
 -/**
 - * wl3501_config - configure the PCMCIA socket and make eth device available
 - * @link - FILL_IN
 - *
 - * wl3501_config() is scheduled to run after a CARD_INSERTION event is
 - * received, to configure the PCMCIA socket, and to make the ethernet device
 - * available to the system.
 - */
  static int wl3501_config(struct pcmcia_device *link)
  {
        struct net_device *dev = link->priv;
        if (ret)
                goto failed;
  
 -      /* This actually configures the PCMCIA socket -- setting up the I/O
 -       * windows and the interrupt mapping.  */
 -
 -      ret = pcmcia_request_configuration(link, &link->conf);
 +      ret = pcmcia_enable_device(link);
        if (ret)
                goto failed;
  
@@@ -1981,6 -1999,14 +1970,6 @@@ failed
        return -ENODEV;
  }
  
 -/**
 - * wl3501_release - unregister the net, release PCMCIA configuration
 - * @arg - link
 - *
 - * After a card is removed, wl3501_release() will unregister the net device,
 - * and release the PCMCIA configuration.  If the device is still open, this
 - * will be postponed until it is closed.
 - */
  static void wl3501_release(struct pcmcia_device *link)
  {
        pcmcia_disable_device(link);
@@@ -2019,7 -2045,9 +2008,7 @@@ MODULE_DEVICE_TABLE(pcmcia, wl3501_ids)
  
  static struct pcmcia_driver wl3501_driver = {
        .owner          = THIS_MODULE,
 -      .drv            = {
 -              .name   = "wl3501_cs",
 -      },
 +      .name           = "wl3501_cs",
        .probe          = wl3501_probe,
        .remove         = wl3501_detach,
        .id_table       = wl3501_ids,
@@@ -60,11 -60,13 +60,11 @@@ static inline void zfcp_qdio_account(st
        unsigned long long now, span;
        int used;
  
 -      spin_lock(&qdio->stat_lock);
        now = get_clock_monotonic();
        span = (now - qdio->req_q_time) >> 12;
        used = QDIO_MAX_BUFFERS_PER_Q - atomic_read(&qdio->req_q_free);
        qdio->req_q_util += used * span;
        qdio->req_q_time = now;
 -      spin_unlock(&qdio->stat_lock);
  }
  
  static void zfcp_qdio_int_req(struct ccw_device *cdev, unsigned int qdio_err,
@@@ -82,9 -84,7 +82,9 @@@
        /* cleanup all SBALs being program-owned now */
        zfcp_qdio_zero_sbals(qdio->req_q, idx, count);
  
 +      spin_lock_irq(&qdio->stat_lock);
        zfcp_qdio_account(qdio);
 +      spin_unlock_irq(&qdio->stat_lock);
        atomic_add(count, &qdio->req_q_free);
        wake_up(&qdio->req_q_wq);
  }
@@@ -201,11 -201,11 +201,11 @@@ int zfcp_qdio_sbals_from_sg(struct zfcp
  
  static int zfcp_qdio_sbal_check(struct zfcp_qdio *qdio)
  {
 -      spin_lock_bh(&qdio->req_q_lock);
 +      spin_lock_irq(&qdio->req_q_lock);
        if (atomic_read(&qdio->req_q_free) ||
            !(atomic_read(&qdio->adapter->status) & ZFCP_STATUS_ADAPTER_QDIOUP))
                return 1;
 -      spin_unlock_bh(&qdio->req_q_lock);
 +      spin_unlock_irq(&qdio->req_q_lock);
        return 0;
  }
  
@@@ -223,7 -223,7 +223,7 @@@ int zfcp_qdio_sbal_get(struct zfcp_qdi
  {
        long ret;
  
 -      spin_unlock_bh(&qdio->req_q_lock);
 +      spin_unlock_irq(&qdio->req_q_lock);
        ret = wait_event_interruptible_timeout(qdio->req_q_wq,
                               zfcp_qdio_sbal_check(qdio), 5 * HZ);
  
                zfcp_erp_adapter_reopen(qdio->adapter, 0, "qdsbg_1", NULL);
        }
  
 -      spin_lock_bh(&qdio->req_q_lock);
 +      spin_lock_irq(&qdio->req_q_lock);
        return -EIO;
  }
  
@@@ -254,9 -254,7 +254,9 @@@ int zfcp_qdio_send(struct zfcp_qdio *qd
        int retval;
        u8 sbal_number = q_req->sbal_number;
  
 +      spin_lock(&qdio->stat_lock);
        zfcp_qdio_account(qdio);
 +      spin_unlock(&qdio->stat_lock);
  
        retval = do_QDIO(qdio->adapter->ccw_device, QDIO_FLAG_SYNC_OUTPUT, 0,
                         q_req->sbal_first, sbal_number);
  static void zfcp_qdio_setup_init_data(struct qdio_initialize *id,
                                      struct zfcp_qdio *qdio)
  {
+       memset(id, 0, sizeof(*id));
        id->cdev = qdio->adapter->ccw_device;
        id->q_format = QDIO_ZFCP_QFMT;
        memcpy(id->adapter_name, dev_name(&id->cdev->dev), 8);
        ASCEBC(id->adapter_name, 8);
        id->qib_rflags = QIB_RFLAGS_ENABLE_DATA_DIV;
-       id->qib_param_field_format = 0;
-       id->qib_param_field = NULL;
-       id->input_slib_elements = NULL;
-       id->output_slib_elements = NULL;
        id->no_input_qs = 1;
        id->no_output_qs = 1;
        id->input_handler = zfcp_qdio_int_resp;
@@@ -330,9 -324,9 +326,9 @@@ void zfcp_qdio_close(struct zfcp_qdio *
                return;
  
        /* clear QDIOUP flag, thus do_QDIO is not called during qdio_shutdown */
 -      spin_lock_bh(&qdio->req_q_lock);
 +      spin_lock_irq(&qdio->req_q_lock);
        atomic_clear_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &adapter->status);
 -      spin_unlock_bh(&qdio->req_q_lock);
 +      spin_unlock_irq(&qdio->req_q_lock);
  
        wake_up(&qdio->req_q_wq);
  
@@@ -58,6 -58,8 +58,8 @@@
  #define MAX_PAGES_PER_CTRL_STRUCT_POOL        8
  #define BNX2I_RESERVED_SLOW_PATH_CMD_SLOTS    4
  
+ #define BNX2I_5771X_DBELL_PAGE_SIZE   128
  /* 5706/08 hardware has limit on maximum buffer size per BD it can handle */
  #define MAX_BD_LENGTH                 65535
  #define BD_SPLIT_SIZE                 32768
@@@ -753,7 -755,7 +755,7 @@@ extern int bnx2i_send_iscsi_tmf(struct 
  extern int bnx2i_send_iscsi_scsicmd(struct bnx2i_conn *conn,
                                    struct bnx2i_cmd *cmnd);
  extern int bnx2i_send_iscsi_nopout(struct bnx2i_conn *conn,
 -                                 struct iscsi_task *mtask, u32 ttt,
 +                                 struct iscsi_task *mtask,
                                   char *datap, int data_len, int unsol);
  extern int bnx2i_send_iscsi_logout(struct bnx2i_conn *conn,
                                   struct iscsi_task *mtask);
@@@ -385,6 -385,7 +385,6 @@@ int bnx2i_send_iscsi_tmf(struct bnx2i_c
        struct bnx2i_cmd *bnx2i_cmd;
        struct bnx2i_tmf_request *tmfabort_wqe;
        u32 dword;
 -      u32 scsi_lun[2];
  
        bnx2i_cmd = (struct bnx2i_cmd *)mtask->dd_data;
        tmfabort_hdr = (struct iscsi_tm *)mtask->hdr;
                                                bnx2i_conn->ep->qp.sq_prod_qe;
  
        tmfabort_wqe->op_code = tmfabort_hdr->opcode;
 -      tmfabort_wqe->op_attr = 0;
 -      tmfabort_wqe->op_attr =
 -              ISCSI_TMF_REQUEST_ALWAYS_ONE | ISCSI_TM_FUNC_ABORT_TASK;
 +      tmfabort_wqe->op_attr = tmfabort_hdr->flags;
  
        tmfabort_wqe->itt = (mtask->itt | (ISCSI_TASK_TYPE_MPATH << 14));
        tmfabort_wqe->reserved2 = 0;
        tmfabort_wqe->cmd_sn = be32_to_cpu(tmfabort_hdr->cmdsn);
  
 -      ctask = iscsi_itt_to_task(conn, tmfabort_hdr->rtt);
 -      if (!ctask || !ctask->sc)
 -              /*
 -               * the iscsi layer must have completed the cmd while this
 -               * was starting up.
 -               *
 -               * Note: In the case of a SCSI cmd timeout, the task's sc
 -               *       is still active; hence ctask->sc != 0
 -               *       In this case, the task must be aborted
 -               */
 -              return 0;
 -
 -      ref_sc = ctask->sc;
 -
 -      /* Retrieve LUN directly from the ref_sc */
 -      int_to_scsilun(ref_sc->device->lun, (struct scsi_lun *) scsi_lun);
 -      tmfabort_wqe->lun[0] = be32_to_cpu(scsi_lun[0]);
 -      tmfabort_wqe->lun[1] = be32_to_cpu(scsi_lun[1]);
 -
 -      if (ref_sc->sc_data_direction == DMA_TO_DEVICE)
 -              dword = (ISCSI_TASK_TYPE_WRITE << ISCSI_CMD_REQUEST_TYPE_SHIFT);
 -      else
 -              dword = (ISCSI_TASK_TYPE_READ << ISCSI_CMD_REQUEST_TYPE_SHIFT);
 -      tmfabort_wqe->ref_itt = (dword | (tmfabort_hdr->rtt & ISCSI_ITT_MASK));
 +      switch (tmfabort_hdr->flags & ISCSI_FLAG_TM_FUNC_MASK) {
 +      case ISCSI_TM_FUNC_ABORT_TASK:
 +      case ISCSI_TM_FUNC_TASK_REASSIGN:
 +              ctask = iscsi_itt_to_task(conn, tmfabort_hdr->rtt);
 +              if (!ctask || !ctask->sc)
 +                      /*
 +                       * the iscsi layer must have completed the cmd while
 +                       * was starting up.
 +                       *
 +                       * Note: In the case of a SCSI cmd timeout, the task's
 +                       *       sc is still active; hence ctask->sc != 0
 +                       *       In this case, the task must be aborted
 +                       */
 +                      return 0;
 +
 +              ref_sc = ctask->sc;
 +              if (ref_sc->sc_data_direction == DMA_TO_DEVICE)
 +                      dword = (ISCSI_TASK_TYPE_WRITE <<
 +                               ISCSI_CMD_REQUEST_TYPE_SHIFT);
 +              else
 +                      dword = (ISCSI_TASK_TYPE_READ <<
 +                               ISCSI_CMD_REQUEST_TYPE_SHIFT);
 +              tmfabort_wqe->ref_itt = (dword |
 +                                      (tmfabort_hdr->rtt & ISCSI_ITT_MASK));
 +              break;
 +      default:
 +              tmfabort_wqe->ref_itt = RESERVED_ITT;
 +      }
 +      memcpy(tmfabort_wqe->lun, tmfabort_hdr->lun, sizeof(struct scsi_lun));
        tmfabort_wqe->ref_cmd_sn = be32_to_cpu(tmfabort_hdr->refcmdsn);
  
        tmfabort_wqe->bd_list_addr_lo = (u32) bnx2i_conn->hba->mp_bd_dma;
@@@ -466,6 -464,7 +466,6 @@@ int bnx2i_send_iscsi_scsicmd(struct bnx
   * @conn:             iscsi connection
   * @cmd:              driver command structure which is requesting
   *                    a WQE to sent to chip for further processing
 - * @ttt:              TTT to be used when building pdu header
   * @datap:            payload buffer pointer
   * @data_len:         payload data length
   * @unsol:            indicated whether nopout pdu is unsolicited pdu or
   * prepare and post a nopout request WQE to CNIC firmware
   */
  int bnx2i_send_iscsi_nopout(struct bnx2i_conn *bnx2i_conn,
 -                          struct iscsi_task *task, u32 ttt,
 +                          struct iscsi_task *task,
                            char *datap, int data_len, int unsol)
  {
        struct bnx2i_endpoint *ep = bnx2i_conn->ep;
        nopout_wqe->itt = ((u16)task->itt |
                           (ISCSI_TASK_TYPE_MPATH <<
                            ISCSI_TMF_REQUEST_TYPE_SHIFT));
 -      nopout_wqe->ttt = ttt;
 +      nopout_wqe->ttt = nopout_hdr->ttt;
        nopout_wqe->flags = 0;
        if (!unsol)
                nopout_wqe->flags = ISCSI_NOP_OUT_REQUEST_LOCAL_COMPLETION;
@@@ -2406,7 -2405,8 +2406,8 @@@ int bnx2i_map_ep_dbell_regs(struct bnx2
        if (test_bit(BNX2I_NX2_DEV_57710, &ep->hba->cnic_dev_type)) {
                reg_base = pci_resource_start(ep->hba->pcidev,
                                              BNX2X_DOORBELL_PCI_BAR);
-               reg_off = PAGE_SIZE * (cid_num & 0x1FFFF) + DPM_TRIGER_TYPE;
+               reg_off = BNX2I_5771X_DBELL_PAGE_SIZE * (cid_num & 0x1FFFF) +
+                         DPM_TRIGER_TYPE;
                ep->qp.ctx_base = ioremap_nocache(reg_base + reg_off, 4);
                goto arm_cq;
        }
diff --combined drivers/vhost/net.c
@@@ -127,10 -127,7 +127,10 @@@ static void handle_tx(struct vhost_net 
        size_t len, total_len = 0;
        int err, wmem;
        size_t hdr_size;
 -      struct socket *sock = rcu_dereference(vq->private_data);
 +      struct socket *sock;
 +
 +      sock = rcu_dereference_check(vq->private_data,
 +                                   lockdep_is_held(&vq->mutex));
        if (!sock)
                return;
  
@@@ -246,7 -243,7 +246,7 @@@ static int get_rx_bufs(struct vhost_vir
        int r, nlogs = 0;
  
        while (datalen > 0) {
-               if (unlikely(seg >= VHOST_NET_MAX_SG)) {
+               if (unlikely(seg >= UIO_MAXIOV)) {
                        r = -ENOBUFS;
                        goto err;
                }
@@@ -585,10 -582,7 +585,10 @@@ static void vhost_net_disable_vq(struc
  static void vhost_net_enable_vq(struct vhost_net *n,
                                struct vhost_virtqueue *vq)
  {
 -      struct socket *sock = vq->private_data;
 +      struct socket *sock;
 +
 +      sock = rcu_dereference_protected(vq->private_data,
 +                                       lockdep_is_held(&vq->mutex));
        if (!sock)
                return;
        if (vq == n->vqs + VHOST_NET_VQ_TX) {
@@@ -604,8 -598,7 +604,8 @@@ static struct socket *vhost_net_stop_vq
        struct socket *sock;
  
        mutex_lock(&vq->mutex);
 -      sock = vq->private_data;
 +      sock = rcu_dereference_protected(vq->private_data,
 +                                       lockdep_is_held(&vq->mutex));
        vhost_net_disable_vq(n, vq);
        rcu_assign_pointer(vq->private_data, NULL);
        mutex_unlock(&vq->mutex);
@@@ -743,8 -736,7 +743,8 @@@ static long vhost_net_set_backend(struc
        }
  
        /* start polling new socket */
 -      oldsock = vq->private_data;
 +      oldsock = rcu_dereference_protected(vq->private_data,
 +                                          lockdep_is_held(&vq->mutex));
        if (sock != oldsock) {
                  vhost_net_disable_vq(n, vq);
                  rcu_assign_pointer(vq->private_data, sock);
@@@ -877,7 -869,6 +877,7 @@@ static const struct file_operations vho
        .compat_ioctl   = vhost_net_compat_ioctl,
  #endif
        .open           = vhost_net_open,
 +      .llseek         = noop_llseek,
  };
  
  static struct miscdevice vhost_net_misc = {
diff --combined drivers/vhost/vhost.c
@@@ -212,6 -212,45 +212,45 @@@ static int vhost_worker(void *data
        }
  }
  
+ /* Helper to allocate iovec buffers for all vqs. */
+ static long vhost_dev_alloc_iovecs(struct vhost_dev *dev)
+ {
+       int i;
+       for (i = 0; i < dev->nvqs; ++i) {
+               dev->vqs[i].indirect = kmalloc(sizeof *dev->vqs[i].indirect *
+                                              UIO_MAXIOV, GFP_KERNEL);
+               dev->vqs[i].log = kmalloc(sizeof *dev->vqs[i].log * UIO_MAXIOV,
+                                         GFP_KERNEL);
+               dev->vqs[i].heads = kmalloc(sizeof *dev->vqs[i].heads *
+                                           UIO_MAXIOV, GFP_KERNEL);
+               if (!dev->vqs[i].indirect || !dev->vqs[i].log ||
+                       !dev->vqs[i].heads)
+                       goto err_nomem;
+       }
+       return 0;
+ err_nomem:
+       for (; i >= 0; --i) {
+               kfree(dev->vqs[i].indirect);
+               kfree(dev->vqs[i].log);
+               kfree(dev->vqs[i].heads);
+       }
+       return -ENOMEM;
+ }
+ static void vhost_dev_free_iovecs(struct vhost_dev *dev)
+ {
+       int i;
+       for (i = 0; i < dev->nvqs; ++i) {
+               kfree(dev->vqs[i].indirect);
+               dev->vqs[i].indirect = NULL;
+               kfree(dev->vqs[i].log);
+               dev->vqs[i].log = NULL;
+               kfree(dev->vqs[i].heads);
+               dev->vqs[i].heads = NULL;
+       }
+ }
  long vhost_dev_init(struct vhost_dev *dev,
                    struct vhost_virtqueue *vqs, int nvqs)
  {
        dev->worker = NULL;
  
        for (i = 0; i < dev->nvqs; ++i) {
+               dev->vqs[i].log = NULL;
+               dev->vqs[i].indirect = NULL;
+               dev->vqs[i].heads = NULL;
                dev->vqs[i].dev = dev;
                mutex_init(&dev->vqs[i].mutex);
                vhost_vq_reset(dev, dev->vqs + i);
@@@ -295,6 -337,10 +337,10 @@@ static long vhost_dev_set_owner(struct 
        if (err)
                goto err_cgroup;
  
+       err = vhost_dev_alloc_iovecs(dev);
+       if (err)
+               goto err_cgroup;
        return 0;
  err_cgroup:
        kthread_stop(worker);
@@@ -320,7 -366,7 +366,7 @@@ long vhost_dev_reset_owner(struct vhost
        vhost_dev_cleanup(dev);
  
        memory->nregions = 0;
 -      dev->memory = memory;
 +      RCU_INIT_POINTER(dev->memory, memory);
        return 0;
  }
  
@@@ -345,6 -391,7 +391,7 @@@ void vhost_dev_cleanup(struct vhost_de
                        fput(dev->vqs[i].call);
                vhost_vq_reset(dev, dev->vqs + i);
        }
+       vhost_dev_free_iovecs(dev);
        if (dev->log_ctx)
                eventfd_ctx_put(dev->log_ctx);
        dev->log_ctx = NULL;
                fput(dev->log_file);
        dev->log_file = NULL;
        /* No one will access memory at this point */
 -      kfree(dev->memory);
 -      dev->memory = NULL;
 +      kfree(rcu_dereference_protected(dev->memory,
 +                                      lockdep_is_held(&dev->mutex)));
 +      RCU_INIT_POINTER(dev->memory, NULL);
        if (dev->mm)
                mmput(dev->mm);
        dev->mm = NULL;
@@@ -372,7 -418,7 +419,7 @@@ static int log_access_ok(void __user *l
        /* Make sure 64 bit math will not overflow. */
        if (a > ULONG_MAX - (unsigned long)log_base ||
            a + (unsigned long)log_base > ULONG_MAX)
-               return -EFAULT;
+               return 0;
  
        return access_ok(VERIFY_WRITE, log_base + a,
                         (sz + VHOST_PAGE_SIZE * 8 - 1) / VHOST_PAGE_SIZE / 8);
@@@ -441,22 -487,14 +488,22 @@@ static int vq_access_ok(unsigned int nu
  /* Caller should have device mutex but not vq mutex */
  int vhost_log_access_ok(struct vhost_dev *dev)
  {
 -      return memory_access_ok(dev, dev->memory, 1);
 +      struct vhost_memory *mp;
 +
 +      mp = rcu_dereference_protected(dev->memory,
 +                                     lockdep_is_held(&dev->mutex));
 +      return memory_access_ok(dev, mp, 1);
  }
  
  /* Verify access for write logging. */
  /* Caller should have vq mutex and device mutex */
  static int vq_log_access_ok(struct vhost_virtqueue *vq, void __user *log_base)
  {
 -      return vq_memory_access_ok(log_base, vq->dev->memory,
 +      struct vhost_memory *mp;
 +
 +      mp = rcu_dereference_protected(vq->dev->memory,
 +                                     lockdep_is_held(&vq->mutex));
 +      return vq_memory_access_ok(log_base, mp,
                            vhost_has_feature(vq->dev, VHOST_F_LOG_ALL)) &&
                (!vq->log_used || log_access_ok(log_base, vq->log_addr,
                                        sizeof *vq->used +
@@@ -496,8 -534,7 +543,8 @@@ static long vhost_set_memory(struct vho
                kfree(newmem);
                return -EFAULT;
        }
 -      oldmem = d->memory;
 +      oldmem = rcu_dereference_protected(d->memory,
 +                                         lockdep_is_held(&d->mutex));
        rcu_assign_pointer(d->memory, newmem);
        synchronize_rcu();
        kfree(oldmem);
@@@ -957,7 -994,7 +1004,7 @@@ static int get_indirect(struct vhost_de
        }
  
        ret = translate_desc(dev, indirect->addr, indirect->len, vq->indirect,
-                            ARRAY_SIZE(vq->indirect));
+                            UIO_MAXIOV);
        if (unlikely(ret < 0)) {
                vq_err(vq, "Translation failure %d in indirect.\n", ret);
                return ret;
diff --combined drivers/vhost/vhost.h
  
  struct vhost_device;
  
- enum {
-       /* Enough place for all fragments, head, and virtio net header. */
-       VHOST_NET_MAX_SG = MAX_SKB_FRAGS + 2,
- };
  struct vhost_work;
  typedef void (*vhost_work_fn_t)(struct vhost_work *work);
  
@@@ -93,12 -88,15 +88,15 @@@ struct vhost_virtqueue 
        bool log_used;
        u64 log_addr;
  
-       struct iovec indirect[VHOST_NET_MAX_SG];
-       struct iovec iov[VHOST_NET_MAX_SG];
-       struct iovec hdr[VHOST_NET_MAX_SG];
+       struct iovec iov[UIO_MAXIOV];
+       /* hdr is used to store the virtio header.
+        * Since each iovec has >= 1 byte length, we never need more than
+        * header length entries to store the header. */
+       struct iovec hdr[sizeof(struct virtio_net_hdr_mrg_rxbuf)];
+       struct iovec *indirect;
        size_t vhost_hlen;
        size_t sock_hlen;
-       struct vring_used_elem heads[VHOST_NET_MAX_SG];
+       struct vring_used_elem *heads;
        /* We use a kind of RCU to access private pointer.
         * All readers access it from worker, which makes it possible to
         * flush the vhost_work instead of synchronize_rcu. Therefore readers do
         * vhost_work execution acts instead of rcu_read_lock() and the end of
         * vhost_work execution acts instead of rcu_read_lock().
         * Writers use virtqueue mutex. */
 -      void *private_data;
 +      void __rcu *private_data;
        /* Log write descriptors */
        void __user *log_base;
-       struct vhost_log log[VHOST_NET_MAX_SG];
+       struct vhost_log *log;
  };
  
  struct vhost_dev {
        /* Readers use RCU to access memory table pointer
         * log base pointer and features.
         * Writers use mutex below.*/
 -      struct vhost_memory *memory;
 +      struct vhost_memory __rcu *memory;
        struct mm_struct *mm;
        struct mutex mutex;
        unsigned acked_features;
@@@ -173,11 -171,7 +171,11 @@@ enum 
  
  static inline int vhost_has_feature(struct vhost_dev *dev, int bit)
  {
 -      unsigned acked_features = rcu_dereference(dev->acked_features);
 +      unsigned acked_features;
 +
 +      acked_features =
 +              rcu_dereference_index_check(dev->acked_features,
 +                                          lockdep_is_held(&dev->mutex));
        return acked_features & (1 << bit);
  }
  
@@@ -39,9 -39,8 +39,9 @@@ enum ctattr_type 
        CTA_TUPLE_MASTER,
        CTA_NAT_SEQ_ADJ_ORIG,
        CTA_NAT_SEQ_ADJ_REPLY,
 -      CTA_SECMARK,
 +      CTA_SECMARK,            /* obsolete */
        CTA_ZONE,
 +      CTA_SECCTX,
        __CTA_MAX
  };
  #define CTA_MAX (__CTA_MAX - 1)
@@@ -162,6 -161,7 +162,7 @@@ enum ctattr_expect 
        CTA_EXPECT_ID,
        CTA_EXPECT_HELP_NAME,
        CTA_EXPECT_ZONE,
+       CTA_EXPECT_FLAGS,
        __CTA_EXPECT_MAX
  };
  #define CTA_EXPECT_MAX (__CTA_EXPECT_MAX - 1)
@@@ -173,11 -173,4 +174,11 @@@ enum ctattr_help 
  };
  #define CTA_HELP_MAX (__CTA_HELP_MAX - 1)
  
 +enum ctattr_secctx {
 +      CTA_SECCTX_UNSPEC,
 +      CTA_SECCTX_NAME,
 +      __CTA_SECCTX_MAX
 +};
 +#define CTA_SECCTX_MAX (__CTA_SECCTX_MAX - 1)
 +
  #endif /* _IPCONNTRACK_NETLINK_H */
diff --combined include/linux/pci_ids.h
  #define PCI_DEVICE_ID_AMD_11H_NB_DRAM 0x1302
  #define PCI_DEVICE_ID_AMD_11H_NB_MISC 0x1303
  #define PCI_DEVICE_ID_AMD_11H_NB_LINK 0x1304
 +#define PCI_DEVICE_ID_AMD_15H_NB_MISC 0x1603
  #define PCI_DEVICE_ID_AMD_LANCE               0x2000
  #define PCI_DEVICE_ID_AMD_LANCE_HOME  0x2001
  #define PCI_DEVICE_ID_AMD_SCSI                0x2020
  #define PCI_DEVICE_ID_HP_CISSC                0x3230
  #define PCI_DEVICE_ID_HP_CISSD                0x3238
  #define PCI_DEVICE_ID_HP_CISSE                0x323a
 +#define PCI_DEVICE_ID_HP_CISSF                0x323b
  #define PCI_DEVICE_ID_HP_ZX2_IOC      0x4031
  
  #define PCI_VENDOR_ID_PCTECH          0x1042
  #define PCI_VENDOR_ID_ARIMA           0x161f
  
  #define PCI_VENDOR_ID_BROCADE         0x1657
+ #define PCI_DEVICE_ID_BROCADE_CT      0x0014
+ #define PCI_DEVICE_ID_BROCADE_FC_8G1P 0x0017
+ #define PCI_DEVICE_ID_BROCADE_CT_FC   0x0021
  
  #define PCI_VENDOR_ID_SIBYTE          0x166d
  #define PCI_DEVICE_ID_BCM1250_PCI     0x0001
  #define PCI_DEVICE_ID_P4080           0x0401
  #define PCI_DEVICE_ID_P4040E          0x0408
  #define PCI_DEVICE_ID_P4040           0x0409
 +#define PCI_DEVICE_ID_P2040E          0x0410
 +#define PCI_DEVICE_ID_P2040           0x0411
 +#define PCI_DEVICE_ID_P3041E          0x041E
 +#define PCI_DEVICE_ID_P3041           0x041F
 +#define PCI_DEVICE_ID_P5020E          0x0420
 +#define PCI_DEVICE_ID_P5020           0x0421
 +#define PCI_DEVICE_ID_P5010E          0x0428
 +#define PCI_DEVICE_ID_P5010           0x0429
  #define PCI_DEVICE_ID_MPC8641         0x7010
  #define PCI_DEVICE_ID_MPC8641D                0x7011
  #define PCI_DEVICE_ID_MPC8610         0x7018
@@@ -183,9 -183,7 +183,7 @@@ static struct device *rfcomm_get_device
  static ssize_t show_address(struct device *tty_dev, struct device_attribute *attr, char *buf)
  {
        struct rfcomm_dev *dev = dev_get_drvdata(tty_dev);
-       bdaddr_t bdaddr;
-       baswap(&bdaddr, &dev->dst);
-       return sprintf(buf, "%s\n", batostr(&bdaddr));
+       return sprintf(buf, "%s\n", batostr(&dev->dst));
  }
  
  static ssize_t show_channel(struct device *tty_dev, struct device_attribute *attr, char *buf)
@@@ -844,6 -842,10 +842,6 @@@ static int rfcomm_tty_ioctl(struct tty_
                BT_DBG("TIOCMIWAIT");
                break;
  
 -      case TIOCGICOUNT:
 -              BT_DBG("TIOCGICOUNT");
 -              break;
 -
        case TIOCGSERIAL:
                BT_ERR("TIOCGSERIAL is not supported");
                return -ENOIOCTLCMD;
diff --combined net/core/datagram.c
@@@ -243,7 -243,6 +243,7 @@@ void skb_free_datagram_locked(struct so
        unlock_sock_fast(sk, slow);
  
        /* skb is now orphaned, can be freed outside of locked section */
 +      trace_kfree_skb(skb, skb_free_datagram_locked);
        __kfree_skb(skb);
  }
  EXPORT_SYMBOL(skb_free_datagram_locked);
@@@ -747,13 -746,12 +747,12 @@@ unsigned int datagram_poll(struct file 
        if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue))
                mask |= POLLERR;
        if (sk->sk_shutdown & RCV_SHUTDOWN)
-               mask |= POLLRDHUP;
+               mask |= POLLRDHUP | POLLIN | POLLRDNORM;
        if (sk->sk_shutdown == SHUTDOWN_MASK)
                mask |= POLLHUP;
  
        /* readable? */
-       if (!skb_queue_empty(&sk->sk_receive_queue) ||
-           (sk->sk_shutdown & RCV_SHUTDOWN))
+       if (!skb_queue_empty(&sk->sk_receive_queue))
                mask |= POLLIN | POLLRDNORM;
  
        /* Connection-based need to check for termination and startup */
diff --combined net/core/dev.c
  #include <linux/jhash.h>
  #include <linux/random.h>
  #include <trace/events/napi.h>
 +#include <trace/events/net.h>
 +#include <trace/events/skb.h>
  #include <linux/pci.h>
+ #include <linux/inetdevice.h>
  
  #include "net-sysfs.h"
  
@@@ -373,6 -372,14 +374,14 @@@ static inline void netdev_set_addr_lock
   *                                                    --ANK (980803)
   */
  
+ static inline struct list_head *ptype_head(const struct packet_type *pt)
+ {
+       if (pt->type == htons(ETH_P_ALL))
+               return &ptype_all;
+       else
+               return &ptype_base[ntohs(pt->type) & PTYPE_HASH_MASK];
+ }
  /**
   *    dev_add_pack - add packet handler
   *    @pt: packet type declaration
  
  void dev_add_pack(struct packet_type *pt)
  {
-       int hash;
+       struct list_head *head = ptype_head(pt);
  
-       spin_lock_bh(&ptype_lock);
-       if (pt->type == htons(ETH_P_ALL))
-               list_add_rcu(&pt->list, &ptype_all);
-       else {
-               hash = ntohs(pt->type) & PTYPE_HASH_MASK;
-               list_add_rcu(&pt->list, &ptype_base[hash]);
-       }
-       spin_unlock_bh(&ptype_lock);
+       spin_lock(&ptype_lock);
+       list_add_rcu(&pt->list, head);
+       spin_unlock(&ptype_lock);
  }
  EXPORT_SYMBOL(dev_add_pack);
  
   */
  void __dev_remove_pack(struct packet_type *pt)
  {
-       struct list_head *head;
+       struct list_head *head = ptype_head(pt);
        struct packet_type *pt1;
  
-       spin_lock_bh(&ptype_lock);
-       if (pt->type == htons(ETH_P_ALL))
-               head = &ptype_all;
-       else
-               head = &ptype_base[ntohs(pt->type) & PTYPE_HASH_MASK];
+       spin_lock(&ptype_lock);
  
        list_for_each_entry(pt1, head, list) {
                if (pt == pt1) {
  
        printk(KERN_WARNING "dev_remove_pack: %p not found.\n", pt);
  out:
-       spin_unlock_bh(&ptype_lock);
+       spin_unlock(&ptype_lock);
  }
  EXPORT_SYMBOL(__dev_remove_pack);
  
@@@ -1486,8 -1483,9 +1485,9 @@@ int dev_forward_skb(struct net_device *
        skb_orphan(skb);
        nf_reset(skb);
  
-       if (!(dev->flags & IFF_UP) ||
-           (skb->len > (dev->mtu + dev->hard_header_len))) {
+       if (unlikely(!(dev->flags & IFF_UP) ||
+                    (skb->len > (dev->mtu + dev->hard_header_len + VLAN_HLEN)))) {
+               atomic_long_inc(&dev->rx_dropped);
                kfree_skb(skb);
                return NET_RX_DROP;
        }
@@@ -1555,21 -1553,56 +1555,56 @@@ static void dev_queue_xmit_nit(struct s
   * Routine to help set real_num_tx_queues. To avoid skbs mapped to queues
   * greater then real_num_tx_queues stale skbs on the qdisc must be flushed.
   */
void netif_set_real_num_tx_queues(struct net_device *dev, unsigned int txq)
int netif_set_real_num_tx_queues(struct net_device *dev, unsigned int txq)
  {
-       unsigned int real_num = dev->real_num_tx_queues;
+       if (txq < 1 || txq > dev->num_tx_queues)
+               return -EINVAL;
  
-       if (unlikely(txq > dev->num_tx_queues))
-               ;
-       else if (txq > real_num)
-               dev->real_num_tx_queues = txq;
-       else if (txq < real_num) {
-               dev->real_num_tx_queues = txq;
-               qdisc_reset_all_tx_gt(dev, txq);
+       if (dev->reg_state == NETREG_REGISTERED) {
+               ASSERT_RTNL();
+               if (txq < dev->real_num_tx_queues)
+                       qdisc_reset_all_tx_gt(dev, txq);
        }
+       dev->real_num_tx_queues = txq;
+       return 0;
  }
  EXPORT_SYMBOL(netif_set_real_num_tx_queues);
  
+ #ifdef CONFIG_RPS
+ /**
+  *    netif_set_real_num_rx_queues - set actual number of RX queues used
+  *    @dev: Network device
+  *    @rxq: Actual number of RX queues
+  *
+  *    This must be called either with the rtnl_lock held or before
+  *    registration of the net device.  Returns 0 on success, or a
+  *    negative error code.  If called before registration, it always
+  *    succeeds.
+  */
+ int netif_set_real_num_rx_queues(struct net_device *dev, unsigned int rxq)
+ {
+       int rc;
+       if (rxq < 1 || rxq > dev->num_rx_queues)
+               return -EINVAL;
+       if (dev->reg_state == NETREG_REGISTERED) {
+               ASSERT_RTNL();
+               rc = net_rx_queue_update_kobjects(dev, dev->real_num_rx_queues,
+                                                 rxq);
+               if (rc)
+                       return rc;
+       }
+       dev->real_num_rx_queues = rxq;
+       return 0;
+ }
+ EXPORT_SYMBOL(netif_set_real_num_rx_queues);
+ #endif
  static inline void __netif_reschedule(struct Qdisc *q)
  {
        struct softnet_data *sd;
@@@ -1661,7 -1694,12 +1696,12 @@@ static bool can_checksum_protocol(unsig
  
  static bool dev_can_checksum(struct net_device *dev, struct sk_buff *skb)
  {
-       if (can_checksum_protocol(dev->features, skb->protocol))
+       int features = dev->features;
+       if (vlan_tx_tag_present(skb))
+               features &= dev->vlan_features;
+       if (can_checksum_protocol(features, skb->protocol))
                return true;
  
        if (skb->protocol == htons(ETH_P_8021Q)) {
@@@ -1760,6 -1798,16 +1800,16 @@@ struct sk_buff *skb_gso_segment(struct 
        __be16 type = skb->protocol;
        int err;
  
+       if (type == htons(ETH_P_8021Q)) {
+               struct vlan_ethhdr *veh;
+               if (unlikely(!pskb_may_pull(skb, VLAN_ETH_HLEN)))
+                       return ERR_PTR(-EINVAL);
+               veh = (struct vlan_ethhdr *)skb->data;
+               type = veh->h_vlan_encapsulated_proto;
+       }
        skb_reset_mac_header(skb);
        skb->mac_len = skb->network_header - skb->mac_header;
        __skb_pull(skb, skb->mac_len);
@@@ -1904,14 -1952,14 +1954,14 @@@ static int dev_gso_segment(struct sk_bu
  
  /*
   * Try to orphan skb early, right before transmission by the device.
-  * We cannot orphan skb if tx timestamp is requested, since
-  * drivers need to call skb_tstamp_tx() to send the timestamp.
+  * We cannot orphan skb if tx timestamp is requested or the sk-reference
+  * is needed on driver level for other reasons, e.g. see net/can/raw.c
   */
  static inline void skb_orphan_try(struct sk_buff *skb)
  {
        struct sock *sk = skb->sk;
  
-       if (sk && !skb_tx(skb)->flags) {
+       if (sk && !skb_shinfo(skb)->tx_flags) {
                /* skb_tx_hash() wont be able to get sk.
                 * We copy sk_hash into skb->rxhash
                 */
  static inline int skb_needs_linearize(struct sk_buff *skb,
                                      struct net_device *dev)
  {
+       int features = dev->features;
+       if (skb->protocol == htons(ETH_P_8021Q) || vlan_tx_tag_present(skb))
+               features &= dev->vlan_features;
        return skb_is_nonlinear(skb) &&
-              ((skb_has_frags(skb) && !(dev->features & NETIF_F_FRAGLIST)) ||
-               (skb_shinfo(skb)->nr_frags && (!(dev->features & NETIF_F_SG) ||
+              ((skb_has_frag_list(skb) && !(features & NETIF_F_FRAGLIST)) ||
+               (skb_shinfo(skb)->nr_frags && (!(features & NETIF_F_SG) ||
                                              illegal_highdma(dev, skb))));
  }
  
@@@ -1956,6 -2009,15 +2011,15 @@@ int dev_hard_start_xmit(struct sk_buff 
  
                skb_orphan_try(skb);
  
+               if (vlan_tx_tag_present(skb) &&
+                   !(dev->features & NETIF_F_HW_VLAN_TX)) {
+                       skb = __vlan_put_tag(skb, vlan_tx_tag_get(skb));
+                       if (unlikely(!skb))
+                               goto out;
+                       skb->vlan_tci = 0;
+               }
                if (netif_needs_gso(dev, skb)) {
                        if (unlikely(dev_gso_segment(skb)))
                                goto out_kfree_skb;
                }
  
                rc = ops->ndo_start_xmit(skb, dev);
 +              trace_net_dev_xmit(skb, rc);
                if (rc == NETDEV_TX_OK)
                        txq_trans_update(txq);
                return rc;
@@@ -2001,7 -2062,6 +2065,7 @@@ gso
                        skb_dst_drop(nskb);
  
                rc = ops->ndo_start_xmit(nskb, dev);
 +              trace_net_dev_xmit(nskb, rc);
                if (unlikely(rc != NETDEV_TX_OK)) {
                        if (rc & ~NETDEV_TX_MASK)
                                goto out_kfree_gso_skb;
@@@ -2019,6 -2079,7 +2083,7 @@@ out_kfree_gso_skb
                skb->destructor = DEV_GSO_CB(skb)->destructor;
  out_kfree_skb:
        kfree_skb(skb);
+ out:
        return rc;
  }
  
@@@ -2147,6 -2208,9 +2212,9 @@@ static inline int __dev_xmit_skb(struc
        return rc;
  }
  
+ static DEFINE_PER_CPU(int, xmit_recursion);
+ #define RECURSION_LIMIT 3
  /**
   *    dev_queue_xmit - transmit a buffer
   *    @skb: buffer to transmit
@@@ -2190,7 -2254,6 +2258,7 @@@ int dev_queue_xmit(struct sk_buff *skb
  #ifdef CONFIG_NET_CLS_ACT
        skb->tc_verd = SET_TC_AT(skb->tc_verd, AT_EGRESS);
  #endif
 +      trace_net_dev_queue(skb);
        if (q->enqueue) {
                rc = __dev_xmit_skb(skb, q, dev, txq);
                goto out;
  
                if (txq->xmit_lock_owner != cpu) {
  
+                       if (__this_cpu_read(xmit_recursion) > RECURSION_LIMIT)
+                               goto recursion_alert;
                        HARD_TX_LOCK(dev, txq, cpu);
  
                        if (!netif_tx_queue_stopped(txq)) {
+                               __this_cpu_inc(xmit_recursion);
                                rc = dev_hard_start_xmit(skb, dev, txq);
+                               __this_cpu_dec(xmit_recursion);
                                if (dev_xmit_complete(rc)) {
                                        HARD_TX_UNLOCK(dev, txq);
                                        goto out;
                                       "queue packet!\n", dev->name);
                } else {
                        /* Recursion is detected! It is possible,
-                        * unfortunately */
+                        * unfortunately
+                        */
+ recursion_alert:
                        if (net_ratelimit())
                                printk(KERN_CRIT "Dead loop on virtual device "
                                       "%s, fix it urgently!\n", dev->name);
@@@ -2264,69 -2334,44 +2339,44 @@@ static inline void ____napi_schedule(st
        __raise_softirq_irqoff(NET_RX_SOFTIRQ);
  }
  
- #ifdef CONFIG_RPS
- /* One global table that all flow-based protocols share. */
- struct rps_sock_flow_table *rps_sock_flow_table __read_mostly;
- EXPORT_SYMBOL(rps_sock_flow_table);
  /*
-  * get_rps_cpu is called from netif_receive_skb and returns the target
-  * CPU from the RPS map of the receiving queue for a given skb.
-  * rcu_read_lock must be held on entry.
+  * __skb_get_rxhash: calculate a flow hash based on src/dst addresses
+  * and src/dst port numbers. Returns a non-zero hash number on success
+  * and 0 on failure.
   */
- static int get_rps_cpu(struct net_device *dev, struct sk_buff *skb,
-                      struct rps_dev_flow **rflowp)
+ __u32 __skb_get_rxhash(struct sk_buff *skb)
  {
+       int nhoff, hash = 0, poff;
        struct ipv6hdr *ip6;
        struct iphdr *ip;
-       struct netdev_rx_queue *rxqueue;
-       struct rps_map *map;
-       struct rps_dev_flow_table *flow_table;
-       struct rps_sock_flow_table *sock_flow_table;
-       int cpu = -1;
        u8 ip_proto;
-       u16 tcpu;
        u32 addr1, addr2, ihl;
        union {
                u32 v32;
                u16 v16[2];
        } ports;
  
-       if (skb_rx_queue_recorded(skb)) {
-               u16 index = skb_get_rx_queue(skb);
-               if (unlikely(index >= dev->num_rx_queues)) {
-                       WARN_ONCE(dev->num_rx_queues > 1, "%s received packet "
-                               "on queue %u, but number of RX queues is %u\n",
-                               dev->name, index, dev->num_rx_queues);
-                       goto done;
-               }
-               rxqueue = dev->_rx + index;
-       } else
-               rxqueue = dev->_rx;
-       if (!rxqueue->rps_map && !rxqueue->rps_flow_table)
-               goto done;
-       if (skb->rxhash)
-               goto got_hash; /* Skip hash computation on packet header */
+       nhoff = skb_network_offset(skb);
  
        switch (skb->protocol) {
        case __constant_htons(ETH_P_IP):
-               if (!pskb_may_pull(skb, sizeof(*ip)))
+               if (!pskb_may_pull(skb, sizeof(*ip) + nhoff))
                        goto done;
  
-               ip = (struct iphdr *) skb->data;
-               ip_proto = ip->protocol;
+               ip = (struct iphdr *) (skb->data + nhoff);
+               if (ip->frag_off & htons(IP_MF | IP_OFFSET))
+                       ip_proto = 0;
+               else
+                       ip_proto = ip->protocol;
                addr1 = (__force u32) ip->saddr;
                addr2 = (__force u32) ip->daddr;
                ihl = ip->ihl;
                break;
        case __constant_htons(ETH_P_IPV6):
-               if (!pskb_may_pull(skb, sizeof(*ip6)))
+               if (!pskb_may_pull(skb, sizeof(*ip6) + nhoff))
                        goto done;
  
-               ip6 = (struct ipv6hdr *) skb->data;
+               ip6 = (struct ipv6hdr *) (skb->data + nhoff);
                ip_proto = ip6->nexthdr;
                addr1 = (__force u32) ip6->saddr.s6_addr32[3];
                addr2 = (__force u32) ip6->daddr.s6_addr32[3];
        default:
                goto done;
        }
-       switch (ip_proto) {
-       case IPPROTO_TCP:
-       case IPPROTO_UDP:
-       case IPPROTO_DCCP:
-       case IPPROTO_ESP:
-       case IPPROTO_AH:
-       case IPPROTO_SCTP:
-       case IPPROTO_UDPLITE:
-               if (pskb_may_pull(skb, (ihl * 4) + 4)) {
-                       ports.v32 = * (__force u32 *) (skb->data + (ihl * 4));
+       ports.v32 = 0;
+       poff = proto_ports_offset(ip_proto);
+       if (poff >= 0) {
+               nhoff += ihl * 4 + poff;
+               if (pskb_may_pull(skb, nhoff + 4)) {
+                       ports.v32 = * (__force u32 *) (skb->data + nhoff);
                        if (ports.v16[1] < ports.v16[0])
                                swap(ports.v16[0], ports.v16[1]);
-                       break;
                }
-       default:
-               ports.v32 = 0;
-               break;
        }
  
        /* get a consistent hash (same value on both flow directions) */
        if (addr2 < addr1)
                swap(addr1, addr2);
-       skb->rxhash = jhash_3words(addr1, addr2, ports.v32, hashrnd);
-       if (!skb->rxhash)
-               skb->rxhash = 1;
  
- got_hash:
+       hash = jhash_3words(addr1, addr2, ports.v32, hashrnd);
+       if (!hash)
+               hash = 1;
+ done:
+       return hash;
+ }
+ EXPORT_SYMBOL(__skb_get_rxhash);
+ #ifdef CONFIG_RPS
+ /* One global table that all flow-based protocols share. */
+ struct rps_sock_flow_table *rps_sock_flow_table __read_mostly;
+ EXPORT_SYMBOL(rps_sock_flow_table);
+ /*
+  * get_rps_cpu is called from netif_receive_skb and returns the target
+  * CPU from the RPS map of the receiving queue for a given skb.
+  * rcu_read_lock must be held on entry.
+  */
+ static int get_rps_cpu(struct net_device *dev, struct sk_buff *skb,
+                      struct rps_dev_flow **rflowp)
+ {
+       struct netdev_rx_queue *rxqueue;
+       struct rps_map *map = NULL;
+       struct rps_dev_flow_table *flow_table;
+       struct rps_sock_flow_table *sock_flow_table;
+       int cpu = -1;
+       u16 tcpu;
+       if (skb_rx_queue_recorded(skb)) {
+               u16 index = skb_get_rx_queue(skb);
+               if (unlikely(index >= dev->real_num_rx_queues)) {
+                       WARN_ONCE(dev->real_num_rx_queues > 1,
+                                 "%s received packet on queue %u, but number "
+                                 "of RX queues is %u\n",
+                                 dev->name, index, dev->real_num_rx_queues);
+                       goto done;
+               }
+               rxqueue = dev->_rx + index;
+       } else
+               rxqueue = dev->_rx;
+       if (rxqueue->rps_map) {
+               map = rcu_dereference(rxqueue->rps_map);
+               if (map && map->len == 1) {
+                       tcpu = map->cpus[0];
+                       if (cpu_online(tcpu))
+                               cpu = tcpu;
+                       goto done;
+               }
+       } else if (!rxqueue->rps_flow_table) {
+               goto done;
+       }
+       skb_reset_network_header(skb);
+       if (!skb_get_rxhash(skb))
+               goto done;
        flow_table = rcu_dereference(rxqueue->rps_flow_table);
        sock_flow_table = rcu_dereference(rps_sock_flow_table);
        if (flow_table && sock_flow_table) {
                }
        }
  
-       map = rcu_dereference(rxqueue->rps_map);
        if (map) {
                tcpu = map->cpus[((u64) skb->rxhash * map->len) >> 32];
  
@@@ -2487,6 -2579,7 +2584,7 @@@ enqueue
  
        local_irq_restore(flags);
  
+       atomic_long_inc(&skb->dev->rx_dropped);
        kfree_skb(skb);
        return NET_RX_DROP;
  }
@@@ -2517,7 -2610,6 +2615,7 @@@ int netif_rx(struct sk_buff *skb
        if (netdev_tstamp_prequeue)
                net_timestamp_check(skb);
  
 +      trace_netif_rx(skb);
  #ifdef CONFIG_RPS
        {
                struct rps_dev_flow voidflow, *rflow = &voidflow;
@@@ -2577,7 -2669,6 +2675,7 @@@ static void net_tx_action(struct softir
                        clist = clist->next;
  
                        WARN_ON(atomic_read(&skb->users));
 +                      trace_kfree_skb(skb, net_tx_action);
                        __kfree_skb(skb);
                }
        }
@@@ -2643,11 -2734,10 +2741,10 @@@ EXPORT_SYMBOL_GPL(br_fdb_test_addr_hook
   * the ingress scheduler, you just cant add policies on ingress.
   *
   */
- static int ing_filter(struct sk_buff *skb)
+ static int ing_filter(struct sk_buff *skb, struct netdev_queue *rxq)
  {
        struct net_device *dev = skb->dev;
        u32 ttl = G_TC_RTTL(skb->tc_verd);
-       struct netdev_queue *rxq;
        int result = TC_ACT_OK;
        struct Qdisc *q;
  
        skb->tc_verd = SET_TC_RTTL(skb->tc_verd, ttl);
        skb->tc_verd = SET_TC_AT(skb->tc_verd, AT_INGRESS);
  
-       rxq = &dev->rx_queue;
        q = rxq->qdisc;
        if (q != &noop_qdisc) {
                spin_lock(qdisc_lock(q));
@@@ -2678,7 -2766,9 +2773,9 @@@ static inline struct sk_buff *handle_in
                                         struct packet_type **pt_prev,
                                         int *ret, struct net_device *orig_dev)
  {
-       if (skb->dev->rx_queue.qdisc == &noop_qdisc)
+       struct netdev_queue *rxq = rcu_dereference(skb->dev->ingress_queue);
+       if (!rxq || rxq->qdisc == &noop_qdisc)
                goto out;
  
        if (*pt_prev) {
                *pt_prev = NULL;
        }
  
-       switch (ing_filter(skb)) {
+       switch (ing_filter(skb, rxq)) {
        case TC_ACT_SHOT:
        case TC_ACT_STOLEN:
                kfree_skb(skb);
@@@ -2699,33 -2789,6 +2796,6 @@@ out
  }
  #endif
  
- /*
-  *    netif_nit_deliver - deliver received packets to network taps
-  *    @skb: buffer
-  *
-  *    This function is used to deliver incoming packets to network
-  *    taps. It should be used when the normal netif_receive_skb path
-  *    is bypassed, for example because of VLAN acceleration.
-  */
- void netif_nit_deliver(struct sk_buff *skb)
- {
-       struct packet_type *ptype;
-       if (list_empty(&ptype_all))
-               return;
-       skb_reset_network_header(skb);
-       skb_reset_transport_header(skb);
-       skb->mac_len = skb->network_header - skb->mac_header;
-       rcu_read_lock();
-       list_for_each_entry_rcu(ptype, &ptype_all, list) {
-               if (!ptype->dev || ptype->dev == skb->dev)
-                       deliver_skb(skb, ptype, skb->dev);
-       }
-       rcu_read_unlock();
- }
  /**
   *    netdev_rx_handler_register - register receive handler
   *    @dev: device to register a handler for
@@@ -2835,10 -2898,6 +2905,8 @@@ static int __netif_receive_skb(struct s
        if (!netdev_tstamp_prequeue)
                net_timestamp_check(skb);
  
-       if (vlan_tx_tag_present(skb) && vlan_hwaccel_do_receive(skb))
-               return NET_RX_SUCCESS;
 +      trace_netif_receive_skb(skb);
 +
        /* if we've gotten here through NAPI, check netpoll */
        if (netpoll_receive_skb(skb))
                return NET_RX_DROP;
         * be delivered to pkt handlers that are exact matches.  Also
         * the deliver_no_wcard flag will be set.  If packet handlers
         * are sensitive to duplicate packets these skbs will need to
-        * be dropped at the handler.  The vlan accel path may have
-        * already set the deliver_no_wcard flag.
+        * be dropped at the handler.
         */
        null_or_orig = NULL;
        orig_dev = skb->dev;
@@@ -2911,6 -2969,18 +2978,18 @@@ ncls
                        goto out;
        }
  
+       if (vlan_tx_tag_present(skb)) {
+               if (pt_prev) {
+                       ret = deliver_skb(skb, pt_prev, orig_dev);
+                       pt_prev = NULL;
+               }
+               if (vlan_hwaccel_do_receive(&skb)) {
+                       ret = __netif_receive_skb(skb);
+                       goto out;
+               } else if (unlikely(!skb))
+                       goto out;
+       }
        /*
         * Make sure frames received on VLAN interfaces stacked on
         * bonding interfaces still make their way to any base bonding
        if (pt_prev) {
                ret = pt_prev->func(skb, skb->dev, pt_prev, orig_dev);
        } else {
+               atomic_long_inc(&skb->dev->rx_dropped);
                kfree_skb(skb);
                /* Jamal, now you will not able to escape explaining
                 * me how you were going to use this. :-)
@@@ -3058,7 -3129,7 +3138,7 @@@ out
        return netif_receive_skb(skb);
  }
  
static void napi_gro_flush(struct napi_struct *napi)
inline void napi_gro_flush(struct napi_struct *napi)
  {
        struct sk_buff *skb, *next;
  
        napi->gro_count = 0;
        napi->gro_list = NULL;
  }
+ EXPORT_SYMBOL(napi_gro_flush);
  
  enum gro_result dev_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
  {
        if (!(skb->dev->features & NETIF_F_GRO) || netpoll_rx_on(skb))
                goto normal;
  
-       if (skb_is_gso(skb) || skb_has_frags(skb))
+       if (skb_is_gso(skb) || skb_has_frag_list(skb))
                goto normal;
  
        rcu_read_lock();
@@@ -3164,16 -3236,19 +3245,19 @@@ normal
  }
  EXPORT_SYMBOL(dev_gro_receive);
  
- static gro_result_t
+ static inline gro_result_t
  __napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
  {
        struct sk_buff *p;
  
        for (p = napi->gro_list; p; p = p->next) {
-               NAPI_GRO_CB(p)->same_flow =
-                       (p->dev == skb->dev) &&
-                       !compare_ether_header(skb_mac_header(p),
+               unsigned long diffs;
+               diffs = (unsigned long)p->dev ^ (unsigned long)skb->dev;
+               diffs |= p->vlan_tci ^ skb->vlan_tci;
+               diffs |= compare_ether_header(skb_mac_header(p),
                                              skb_gro_mac_header(skb));
+               NAPI_GRO_CB(p)->same_flow = !diffs;
                NAPI_GRO_CB(p)->flush = 0;
        }
  
@@@ -3226,14 -3301,14 +3310,14 @@@ gro_result_t napi_gro_receive(struct na
  }
  EXPORT_SYMBOL(napi_gro_receive);
  
- void napi_reuse_skb(struct napi_struct *napi, struct sk_buff *skb)
static void napi_reuse_skb(struct napi_struct *napi, struct sk_buff *skb)
  {
        __skb_pull(skb, skb_headlen(skb));
        skb_reserve(skb, NET_IP_ALIGN - skb_headroom(skb));
+       skb->vlan_tci = 0;
  
        napi->skb = skb;
  }
- EXPORT_SYMBOL(napi_reuse_skb);
  
  struct sk_buff *napi_get_frags(struct napi_struct *napi)
  {
@@@ -4867,21 -4942,6 +4951,6 @@@ static void rollback_registered(struct 
        rollback_registered_many(&single);
  }
  
- static void __netdev_init_queue_locks_one(struct net_device *dev,
-                                         struct netdev_queue *dev_queue,
-                                         void *_unused)
- {
-       spin_lock_init(&dev_queue->_xmit_lock);
-       netdev_set_xmit_lockdep_class(&dev_queue->_xmit_lock, dev->type);
-       dev_queue->xmit_lock_owner = -1;
- }
- static void netdev_init_queue_locks(struct net_device *dev)
- {
-       netdev_for_each_tx_queue(dev, __netdev_init_queue_locks_one, NULL);
-       __netdev_init_queue_locks_one(dev, &dev->rx_queue, NULL);
- }
  unsigned long netdev_fix_features(unsigned long features, const char *name)
  {
        /* Fix illegal SG+CSUM combinations. */
@@@ -4949,6 -5009,66 +5018,66 @@@ void netif_stacked_transfer_operstate(c
  }
  EXPORT_SYMBOL(netif_stacked_transfer_operstate);
  
+ static int netif_alloc_rx_queues(struct net_device *dev)
+ {
+ #ifdef CONFIG_RPS
+       unsigned int i, count = dev->num_rx_queues;
+       struct netdev_rx_queue *rx;
+       BUG_ON(count < 1);
+       rx = kcalloc(count, sizeof(struct netdev_rx_queue), GFP_KERNEL);
+       if (!rx) {
+               pr_err("netdev: Unable to allocate %u rx queues.\n", count);
+               return -ENOMEM;
+       }
+       dev->_rx = rx;
+       /*
+        * Set a pointer to first element in the array which holds the
+        * reference count.
+        */
+       for (i = 0; i < count; i++)
+               rx[i].first = rx;
+ #endif
+       return 0;
+ }
+ static int netif_alloc_netdev_queues(struct net_device *dev)
+ {
+       unsigned int count = dev->num_tx_queues;
+       struct netdev_queue *tx;
+       BUG_ON(count < 1);
+       tx = kcalloc(count, sizeof(struct netdev_queue), GFP_KERNEL);
+       if (!tx) {
+               pr_err("netdev: Unable to allocate %u tx queues.\n",
+                      count);
+               return -ENOMEM;
+       }
+       dev->_tx = tx;
+       return 0;
+ }
+ static void netdev_init_one_queue(struct net_device *dev,
+                                 struct netdev_queue *queue,
+                                 void *_unused)
+ {
+       queue->dev = dev;
+       /* Initialize queue lock */
+       spin_lock_init(&queue->_xmit_lock);
+       netdev_set_xmit_lockdep_class(&queue->_xmit_lock, dev->type);
+       queue->xmit_lock_owner = -1;
+ }
+ static void netdev_init_queues(struct net_device *dev)
+ {
+       netdev_for_each_tx_queue(dev, netdev_init_one_queue, NULL);
+       spin_lock_init(&dev->tx_global_lock);
+ }
  /**
   *    register_netdevice      - register a network device
   *    @dev: device to register
@@@ -4982,28 -5102,19 +5111,19 @@@ int register_netdevice(struct net_devic
  
        spin_lock_init(&dev->addr_list_lock);
        netdev_set_addr_lockdep_class(dev);
-       netdev_init_queue_locks(dev);
  
        dev->iflink = -1;
  
- #ifdef CONFIG_RPS
-       if (!dev->num_rx_queues) {
-               /*
-                * Allocate a single RX queue if driver never called
-                * alloc_netdev_mq
-                */
+       ret = netif_alloc_rx_queues(dev);
+       if (ret)
+               goto out;
  
-               dev->_rx = kzalloc(sizeof(struct netdev_rx_queue), GFP_KERNEL);
-               if (!dev->_rx) {
-                       ret = -ENOMEM;
-                       goto out;
-               }
+       ret = netif_alloc_netdev_queues(dev);
+       if (ret)
+               goto out;
+       netdev_init_queues(dev);
  
-               dev->_rx->first = dev->_rx;
-               atomic_set(&dev->_rx->count, 1);
-               dev->num_rx_queues = 1;
-       }
- #endif
        /* Init, if this function is available */
        if (dev->netdev_ops->ndo_init) {
                ret = dev->netdev_ops->ndo_init(dev);
        if (dev->features & NETIF_F_SG)
                dev->features |= NETIF_F_GSO;
  
+       /* Enable GRO and NETIF_F_HIGHDMA for vlans by default,
+        * vlan_dev_init() will do the dev->features check, so these features
+        * are enabled only if supported by underlying device.
+        */
+       dev->vlan_features |= (NETIF_F_GRO | NETIF_F_HIGHDMA);
        ret = call_netdevice_notifiers(NETDEV_POST_INIT, dev);
        ret = notifier_to_errno(ret);
        if (ret)
@@@ -5113,9 -5230,6 +5239,6 @@@ int init_dummy_netdev(struct net_devic
         */
        dev->reg_state = NETREG_DUMMY;
  
-       /* initialize the ref count */
-       atomic_set(&dev->refcnt, 1);
        /* NAPI wants this */
        INIT_LIST_HEAD(&dev->napi_list);
  
        set_bit(__LINK_STATE_PRESENT, &dev->state);
        set_bit(__LINK_STATE_START, &dev->state);
  
+       /* Note : We dont allocate pcpu_refcnt for dummy devices,
+        * because users of this 'device' dont need to change
+        * its refcount.
+        */
        return 0;
  }
  EXPORT_SYMBOL_GPL(init_dummy_netdev);
  }
  EXPORT_SYMBOL(register_netdev);
  
+ int netdev_refcnt_read(const struct net_device *dev)
+ {
+       int i, refcnt = 0;
+       for_each_possible_cpu(i)
+               refcnt += *per_cpu_ptr(dev->pcpu_refcnt, i);
+       return refcnt;
+ }
+ EXPORT_SYMBOL(netdev_refcnt_read);
  /*
   * netdev_wait_allrefs - wait until all references are gone.
   *
  static void netdev_wait_allrefs(struct net_device *dev)
  {
        unsigned long rebroadcast_time, warning_time;
+       int refcnt;
  
        linkwatch_forget_dev(dev);
  
        rebroadcast_time = warning_time = jiffies;
-       while (atomic_read(&dev->refcnt) != 0) {
+       refcnt = netdev_refcnt_read(dev);
+       while (refcnt != 0) {
                if (time_after(jiffies, rebroadcast_time + 1 * HZ)) {
                        rtnl_lock();
  
  
                msleep(250);
  
+               refcnt = netdev_refcnt_read(dev);
                if (time_after(jiffies, warning_time + 10 * HZ)) {
                        printk(KERN_EMERG "unregister_netdevice: "
                               "waiting for %s to become free. Usage "
                               "count = %d\n",
-                              dev->name, atomic_read(&dev->refcnt));
+                              dev->name, refcnt);
                        warning_time = jiffies;
                }
        }
@@@ -5271,8 -5405,8 +5414,8 @@@ void netdev_run_todo(void
                netdev_wait_allrefs(dev);
  
                /* paranoia */
-               BUG_ON(atomic_read(&dev->refcnt));
-               WARN_ON(dev->ip_ptr);
+               BUG_ON(netdev_refcnt_read(dev));
+               WARN_ON(rcu_dereference_raw(dev->ip_ptr));
                WARN_ON(dev->ip6_ptr);
                WARN_ON(dev->dn_ptr);
  
@@@ -5350,30 -5484,34 +5493,34 @@@ struct rtnl_link_stats64 *dev_get_stats
  
        if (ops->ndo_get_stats64) {
                memset(storage, 0, sizeof(*storage));
-               return ops->ndo_get_stats64(dev, storage);
-       }
-       if (ops->ndo_get_stats) {
+               ops->ndo_get_stats64(dev, storage);
+       } else if (ops->ndo_get_stats) {
                netdev_stats_to_stats64(storage, ops->ndo_get_stats(dev));
-               return storage;
+       } else {
+               netdev_stats_to_stats64(storage, &dev->stats);
+               dev_txq_stats_fold(dev, storage);
        }
-       netdev_stats_to_stats64(storage, &dev->stats);
-       dev_txq_stats_fold(dev, storage);
+       storage->rx_dropped += atomic_long_read(&dev->rx_dropped);
        return storage;
  }
  EXPORT_SYMBOL(dev_get_stats);
  
- static void netdev_init_one_queue(struct net_device *dev,
-                                 struct netdev_queue *queue,
-                                 void *_unused)
+ struct netdev_queue *dev_ingress_queue_create(struct net_device *dev)
  {
-       queue->dev = dev;
- }
+       struct netdev_queue *queue = dev_ingress_queue(dev);
  
- static void netdev_init_queues(struct net_device *dev)
- {
-       netdev_init_one_queue(dev, &dev->rx_queue, NULL);
-       netdev_for_each_tx_queue(dev, netdev_init_one_queue, NULL);
-       spin_lock_init(&dev->tx_global_lock);
+ #ifdef CONFIG_NET_CLS_ACT
+       if (queue)
+               return queue;
+       queue = kzalloc(sizeof(*queue), GFP_KERNEL);
+       if (!queue)
+               return NULL;
+       netdev_init_one_queue(dev, queue, NULL);
+       queue->qdisc = &noop_qdisc;
+       queue->qdisc_sleeping = &noop_qdisc;
+       rcu_assign_pointer(dev->ingress_queue, queue);
+ #endif
+       return queue;
  }
  
  /**
  struct net_device *alloc_netdev_mq(int sizeof_priv, const char *name,
                void (*setup)(struct net_device *), unsigned int queue_count)
  {
-       struct netdev_queue *tx;
        struct net_device *dev;
        size_t alloc_size;
        struct net_device *p;
- #ifdef CONFIG_RPS
-       struct netdev_rx_queue *rx;
-       int i;
- #endif
  
        BUG_ON(strlen(name) >= sizeof(dev->name));
  
+       if (queue_count < 1) {
+               pr_err("alloc_netdev: Unable to allocate device "
+                      "with zero queues.\n");
+               return NULL;
+       }
        alloc_size = sizeof(struct net_device);
        if (sizeof_priv) {
                /* ensure 32-byte alignment of private area */
                return NULL;
        }
  
-       tx = kcalloc(queue_count, sizeof(struct netdev_queue), GFP_KERNEL);
-       if (!tx) {
-               printk(KERN_ERR "alloc_netdev: Unable to allocate "
-                      "tx qdiscs.\n");
-               goto free_p;
-       }
- #ifdef CONFIG_RPS
-       rx = kcalloc(queue_count, sizeof(struct netdev_rx_queue), GFP_KERNEL);
-       if (!rx) {
-               printk(KERN_ERR "alloc_netdev: Unable to allocate "
-                      "rx queues.\n");
-               goto free_tx;
-       }
-       atomic_set(&rx->count, queue_count);
-       /*
-        * Set a pointer to first element in the array which holds the
-        * reference count.
-        */
-       for (i = 0; i < queue_count; i++)
-               rx[i].first = rx;
- #endif
        dev = PTR_ALIGN(p, NETDEV_ALIGN);
        dev->padded = (char *)dev - (char *)p;
  
+       dev->pcpu_refcnt = alloc_percpu(int);
+       if (!dev->pcpu_refcnt)
+               goto free_p;
        if (dev_addr_init(dev))
-               goto free_rx;
+               goto free_pcpu;
  
        dev_mc_init(dev);
        dev_uc_init(dev);
  
        dev_net_set(dev, &init_net);
  
-       dev->_tx = tx;
        dev->num_tx_queues = queue_count;
        dev->real_num_tx_queues = queue_count;
  
  #ifdef CONFIG_RPS
-       dev->_rx = rx;
        dev->num_rx_queues = queue_count;
+       dev->real_num_rx_queues = queue_count;
  #endif
  
        dev->gso_max_size = GSO_MAX_SIZE;
  
-       netdev_init_queues(dev);
        INIT_LIST_HEAD(&dev->ethtool_ntuple_list.list);
        dev->ethtool_ntuple_list.count = 0;
        INIT_LIST_HEAD(&dev->napi_list);
        strcpy(dev->name, name);
        return dev;
  
- free_rx:
- #ifdef CONFIG_RPS
-       kfree(rx);
- free_tx:
- #endif
-       kfree(tx);
+ free_pcpu:
+       free_percpu(dev->pcpu_refcnt);
  free_p:
        kfree(p);
        return NULL;
@@@ -5503,6 -5614,8 +5623,8 @@@ void free_netdev(struct net_device *dev
  
        kfree(dev->_tx);
  
+       kfree(rcu_dereference_raw(dev->ingress_queue));
        /* Flush device addresses */
        dev_addr_flush(dev);
  
        list_for_each_entry_safe(p, n, &dev->napi_list, dev_list)
                netif_napi_del(p);
  
+       free_percpu(dev->pcpu_refcnt);
+       dev->pcpu_refcnt = NULL;
        /*  Compatibility with error handling in drivers */
        if (dev->reg_state == NETREG_UNINITIALIZED) {
                kfree((char *)dev - dev->padded);
@@@ -5666,6 -5782,10 +5791,10 @@@ int dev_change_net_namespace(struct net
  
        /* Notify protocols, that we are about to destroy
           this device. They should clean all the things.
+          Note that dev->reg_state stays at NETREG_REGISTERED.
+          This is wanted because this way 8021q and macvlan know
+          the device is just moving and can keep their slaves up.
        */
        call_netdevice_notifiers(NETDEV_UNREGISTER, dev);
        call_netdevice_notifiers(NETDEV_UNREGISTER_BATCH, dev);
diff --combined net/core/skbuff.c
@@@ -202,8 -202,6 +202,6 @@@ struct sk_buff *__alloc_skb(unsigned in
        skb->data = data;
        skb_reset_tail_pointer(skb);
        skb->end = skb->tail + size;
-       kmemcheck_annotate_bitfield(skb, flags1);
-       kmemcheck_annotate_bitfield(skb, flags2);
  #ifdef NET_SKBUFF_DATA_USES_OFFSET
        skb->mac_header = ~0U;
  #endif
@@@ -249,10 -247,9 +247,9 @@@ EXPORT_SYMBOL(__alloc_skb)
  struct sk_buff *__netdev_alloc_skb(struct net_device *dev,
                unsigned int length, gfp_t gfp_mask)
  {
-       int node = dev->dev.parent ? dev_to_node(dev->dev.parent) : -1;
        struct sk_buff *skb;
  
-       skb = __alloc_skb(length + NET_SKB_PAD, gfp_mask, 0, node);
+       skb = __alloc_skb(length + NET_SKB_PAD, gfp_mask, 0, NUMA_NO_NODE);
        if (likely(skb)) {
                skb_reserve(skb, NET_SKB_PAD);
                skb->dev = dev;
  }
  EXPORT_SYMBOL(__netdev_alloc_skb);
  
- struct page *__netdev_alloc_page(struct net_device *dev, gfp_t gfp_mask)
- {
-       int node = dev->dev.parent ? dev_to_node(dev->dev.parent) : -1;
-       struct page *page;
-       page = alloc_pages_node(node, gfp_mask, 0);
-       return page;
- }
- EXPORT_SYMBOL(__netdev_alloc_page);
  void skb_add_rx_frag(struct sk_buff *skb, int i, struct page *page, int off,
                int size)
  {
@@@ -340,7 -327,7 +327,7 @@@ static void skb_release_data(struct sk_
                                put_page(skb_shinfo(skb)->frags[i].page);
                }
  
-               if (skb_has_frags(skb))
+               if (skb_has_frag_list(skb))
                        skb_drop_fraglist(skb);
  
                kfree(skb->head);
@@@ -466,7 -453,6 +453,7 @@@ void consume_skb(struct sk_buff *skb
                smp_rmb();
        else if (likely(!atomic_dec_and_test(&skb->users)))
                return;
 +      trace_consume_skb(skb);
        __kfree_skb(skb);
  }
  EXPORT_SYMBOL(consume_skb);
@@@ -686,16 -672,10 +673,10 @@@ static void copy_skb_header(struct sk_b
  
  struct sk_buff *skb_copy(const struct sk_buff *skb, gfp_t gfp_mask)
  {
-       int headerlen = skb->data - skb->head;
-       /*
-        *      Allocate the copy buffer
-        */
-       struct sk_buff *n;
- #ifdef NET_SKBUFF_DATA_USES_OFFSET
-       n = alloc_skb(skb->end + skb->data_len, gfp_mask);
- #else
-       n = alloc_skb(skb->end - skb->head + skb->data_len, gfp_mask);
- #endif
+       int headerlen = skb_headroom(skb);
+       unsigned int size = (skb_end_pointer(skb) - skb->head) + skb->data_len;
+       struct sk_buff *n = alloc_skb(size, gfp_mask);
        if (!n)
                return NULL;
  
@@@ -727,20 -707,14 +708,14 @@@ EXPORT_SYMBOL(skb_copy)
  
  struct sk_buff *pskb_copy(struct sk_buff *skb, gfp_t gfp_mask)
  {
-       /*
-        *      Allocate the copy buffer
-        */
-       struct sk_buff *n;
- #ifdef NET_SKBUFF_DATA_USES_OFFSET
-       n = alloc_skb(skb->end, gfp_mask);
- #else
-       n = alloc_skb(skb->end - skb->head, gfp_mask);
- #endif
+       unsigned int size = skb_end_pointer(skb) - skb->head;
+       struct sk_buff *n = alloc_skb(size, gfp_mask);
        if (!n)
                goto out;
  
        /* Set the data pointer */
-       skb_reserve(n, skb->data - skb->head);
+       skb_reserve(n, skb_headroom(skb));
        /* Set the tail pointer and length */
        skb_put(n, skb_headlen(skb));
        /* Copy the bytes */
                skb_shinfo(n)->nr_frags = i;
        }
  
-       if (skb_has_frags(skb)) {
+       if (skb_has_frag_list(skb)) {
                skb_shinfo(n)->frag_list = skb_shinfo(skb)->frag_list;
                skb_clone_fraglist(n);
        }
@@@ -792,12 -766,9 +767,9 @@@ int pskb_expand_head(struct sk_buff *sk
  {
        int i;
        u8 *data;
- #ifdef NET_SKBUFF_DATA_USES_OFFSET
-       int size = nhead + skb->end + ntail;
- #else
-       int size = nhead + (skb->end - skb->head) + ntail;
- #endif
+       int size = nhead + (skb_end_pointer(skb) - skb->head) + ntail;
        long off;
+       bool fastpath;
  
        BUG_ON(nhead < 0);
  
                goto nodata;
  
        /* Copy only real data... and, alas, header. This should be
-        * optimized for the cases when header is void. */
- #ifdef NET_SKBUFF_DATA_USES_OFFSET
-       memcpy(data + nhead, skb->head, skb->tail);
- #else
-       memcpy(data + nhead, skb->head, skb->tail - skb->head);
- #endif
-       memcpy(data + size, skb_end_pointer(skb),
+        * optimized for the cases when header is void.
+        */
+       memcpy(data + nhead, skb->head, skb_tail_pointer(skb) - skb->head);
+       memcpy((struct skb_shared_info *)(data + size),
+              skb_shinfo(skb),
               offsetof(struct skb_shared_info, frags[skb_shinfo(skb)->nr_frags]));
  
-       for (i = 0; i < skb_shinfo(skb)->nr_frags; i++)
-               get_page(skb_shinfo(skb)->frags[i].page);
+       /* Check if we can avoid taking references on fragments if we own
+        * the last reference on skb->head. (see skb_release_data())
+        */
+       if (!skb->cloned)
+               fastpath = true;
+       else {
+               int delta = skb->nohdr ? (1 << SKB_DATAREF_SHIFT) + 1 : 1;
  
-       if (skb_has_frags(skb))
-               skb_clone_fraglist(skb);
+               fastpath = atomic_read(&skb_shinfo(skb)->dataref) == delta;
+       }
  
-       skb_release_data(skb);
+       if (fastpath) {
+               kfree(skb->head);
+       } else {
+               for (i = 0; i < skb_shinfo(skb)->nr_frags; i++)
+                       get_page(skb_shinfo(skb)->frags[i].page);
  
+               if (skb_has_frag_list(skb))
+                       skb_clone_fraglist(skb);
+               skb_release_data(skb);
+       }
        off = (data + nhead) - skb->head;
  
        skb->head     = data;
@@@ -1100,7 -1084,7 +1085,7 @@@ drop_pages
                for (; i < nfrags; i++)
                        put_page(skb_shinfo(skb)->frags[i].page);
  
-               if (skb_has_frags(skb))
+               if (skb_has_frag_list(skb))
                        skb_drop_fraglist(skb);
                goto done;
        }
@@@ -1195,7 -1179,7 +1180,7 @@@ unsigned char *__pskb_pull_tail(struct 
        /* Optimization: no fragments, no reasons to preestimate
         * size of pulled pages. Superb.
         */
-       if (!skb_has_frags(skb))
+       if (!skb_has_frag_list(skb))
                goto pull_pages;
  
        /* Estimate size of pulled pages. */
@@@ -2324,7 -2308,7 +2309,7 @@@ next_skb
                st->frag_data = NULL;
        }
  
-       if (st->root_skb == st->cur_skb && skb_has_frags(st->root_skb)) {
+       if (st->root_skb == st->cur_skb && skb_has_frag_list(st->root_skb)) {
                st->cur_skb = skb_shinfo(st->root_skb)->frag_list;
                st->frag_idx = 0;
                goto next_skb;
@@@ -2894,7 -2878,7 +2879,7 @@@ int skb_cow_data(struct sk_buff *skb, i
                return -ENOMEM;
  
        /* Easy case. Most of packets will go this way. */
-       if (!skb_has_frags(skb)) {
+       if (!skb_has_frag_list(skb)) {
                /* A little of trouble, not enough of space for trailer.
                 * This should not happen, when stack is tuned to generate
                 * good frames. OK, on miss we reallocate and reserve even more
  
                if (skb1->next == NULL && tailbits) {
                        if (skb_shinfo(skb1)->nr_frags ||
-                           skb_has_frags(skb1) ||
+                           skb_has_frag_list(skb1) ||
                            skb_tailroom(skb1) < tailbits)
                                ntail = tailbits + 128;
                }
                    skb_cloned(skb1) ||
                    ntail ||
                    skb_shinfo(skb1)->nr_frags ||
-                   skb_has_frags(skb1)) {
+                   skb_has_frag_list(skb1)) {
                        struct sk_buff *skb2;
  
                        /* Fuck, we are miserable poor guys... */
@@@ -3021,7 -3005,7 +3006,7 @@@ void skb_tstamp_tx(struct sk_buff *orig
        } else {
                /*
                 * no hardware time stamps available,
-                * so keep the skb_shared_tx and only
+                * so keep the shared tx_flags and only
                 * store software time stamp
                 */
                skb->tstamp = ktime_get_real();
diff --combined net/core/sock.c
@@@ -1078,11 -1078,8 +1078,11 @@@ static void sk_prot_free(struct proto *
  #ifdef CONFIG_CGROUPS
  void sock_update_classid(struct sock *sk)
  {
 -      u32 classid = task_cls_classid(current);
 +      u32 classid;
  
 +      rcu_read_lock();  /* doing current task, which cannot vanish. */
 +      classid = task_cls_classid(current);
 +      rcu_read_unlock();
        if (classid && classid != sk->sk_classid)
                sk->sk_classid = classid;
  }
@@@ -1560,6 -1557,8 +1560,8 @@@ struct sk_buff *sock_alloc_send_skb(str
  EXPORT_SYMBOL(sock_alloc_send_skb);
  
  static void __lock_sock(struct sock *sk)
+       __releases(&sk->sk_lock.slock)
+       __acquires(&sk->sk_lock.slock)
  {
        DEFINE_WAIT(wait);
  
  }
  
  static void __release_sock(struct sock *sk)
+       __releases(&sk->sk_lock.slock)
+       __acquires(&sk->sk_lock.slock)
  {
        struct sk_buff *skb = sk->sk_backlog.head;
  
@@@ -38,7 -38,7 +38,7 @@@ static DEFINE_SPINLOCK(nf_nat_lock)
  static struct nf_conntrack_l3proto *l3proto __read_mostly;
  
  #define MAX_IP_NAT_PROTO 256
 -static const struct nf_nat_protocol *nf_nat_protos[MAX_IP_NAT_PROTO]
 +static const struct nf_nat_protocol __rcu *nf_nat_protos[MAX_IP_NAT_PROTO]
                                                __read_mostly;
  
  static inline const struct nf_nat_protocol *
@@@ -47,7 -47,7 +47,7 @@@ __nf_nat_proto_find(u_int8_t protonum
        return rcu_dereference(nf_nat_protos[protonum]);
  }
  
- const struct nf_nat_protocol *
static const struct nf_nat_protocol *
  nf_nat_proto_find_get(u_int8_t protonum)
  {
        const struct nf_nat_protocol *p;
  
        return p;
  }
- EXPORT_SYMBOL_GPL(nf_nat_proto_find_get);
  
- void
static void
  nf_nat_proto_put(const struct nf_nat_protocol *p)
  {
        module_put(p->me);
  }
- EXPORT_SYMBOL_GPL(nf_nat_proto_put);
  
  /* We keep an extra hash for each conntrack, for fast searching. */
  static inline unsigned int
@@@ -262,11 -260,17 +260,17 @@@ get_unique_tuple(struct nf_conntrack_tu
        proto = __nf_nat_proto_find(orig_tuple->dst.protonum);
  
        /* Only bother mapping if it's not already in range and unique */
-       if (!(range->flags & IP_NAT_RANGE_PROTO_RANDOM) &&
-           (!(range->flags & IP_NAT_RANGE_PROTO_SPECIFIED) ||
-            proto->in_range(tuple, maniptype, &range->min, &range->max)) &&
-           !nf_nat_used_tuple(tuple, ct))
-               goto out;
+       if (!(range->flags & IP_NAT_RANGE_PROTO_RANDOM)) {
+               if (range->flags & IP_NAT_RANGE_PROTO_SPECIFIED) {
+                       if (proto->in_range(tuple, maniptype, &range->min,
+                                           &range->max) &&
+                           (range->min.all == range->max.all ||
+                            !nf_nat_used_tuple(tuple, ct)))
+                               goto out;
+               } else if (!nf_nat_used_tuple(tuple, ct)) {
+                       goto out;
+               }
+       }
  
        /* Last change: get protocol to try to obtain unique tuple. */
        proto->unique_tuple(tuple, range, maniptype, ct);
@@@ -458,6 -462,18 +462,18 @@@ int nf_nat_icmp_reply_translation(struc
                        return 0;
        }
  
+       if (manip == IP_NAT_MANIP_SRC)
+               statusbit = IPS_SRC_NAT;
+       else
+               statusbit = IPS_DST_NAT;
+       /* Invert if this is reply dir. */
+       if (dir == IP_CT_DIR_REPLY)
+               statusbit ^= IPS_NAT_MASK;
+       if (!(ct->status & statusbit))
+               return 1;
        pr_debug("icmp_reply_translation: translating error %p manip %u "
                 "dir %s\n", skb, manip,
                 dir == IP_CT_DIR_ORIGINAL ? "ORIG" : "REPLY");
  
        /* Change outer to look the reply to an incoming packet
         * (proto 0 means don't invert per-proto part). */
-       if (manip == IP_NAT_MANIP_SRC)
-               statusbit = IPS_SRC_NAT;
-       else
-               statusbit = IPS_DST_NAT;
-       /* Invert if this is reply dir. */
-       if (dir == IP_CT_DIR_REPLY)
-               statusbit ^= IPS_NAT_MASK;
-       if (ct->status & statusbit) {
-               nf_ct_invert_tuplepr(&target, &ct->tuplehash[!dir].tuple);
-               if (!manip_pkt(0, skb, 0, &target, manip))
-                       return 0;
-       }
+       nf_ct_invert_tuplepr(&target, &ct->tuplehash[!dir].tuple);
+       if (!manip_pkt(0, skb, 0, &target, manip))
+               return 0;
  
        return 1;
  }
diff --combined net/mac80211/debugfs.c
@@@ -36,7 -36,6 +36,7 @@@ static ssize_t name## _read(struct fil
  static const struct file_operations name## _ops = {                   \
        .read = name## _read,                                           \
        .open = mac80211_open_file_generic,                             \
 +      .llseek = generic_file_llseek,                                  \
  };
  
  #define DEBUGFS_ADD(name)                                             \
@@@ -86,13 -85,15 +86,15 @@@ static ssize_t tsf_write(struct file *f
        if (strncmp(buf, "reset", 5) == 0) {
                if (local->ops->reset_tsf) {
                        drv_reset_tsf(local);
-                       printk(KERN_INFO "%s: debugfs reset TSF\n", wiphy_name(local->hw.wiphy));
+                       wiphy_info(local->hw.wiphy, "debugfs reset TSF\n");
                }
        } else {
                tsf = simple_strtoul(buf, NULL, 0);
                if (local->ops->set_tsf) {
                        drv_set_tsf(local, tsf);
-                       printk(KERN_INFO "%s: debugfs set TSF to %#018llx\n", wiphy_name(local->hw.wiphy), tsf);
+                       wiphy_info(local->hw.wiphy,
+                                  "debugfs set TSF to %#018llx\n", tsf);
                }
        }
  
  static const struct file_operations tsf_ops = {
        .read = tsf_read,
        .write = tsf_write,
 -      .open = mac80211_open_file_generic
 +      .open = mac80211_open_file_generic,
 +      .llseek = default_llseek,
  };
  
  static ssize_t reset_write(struct file *file, const char __user *user_buf,
  static const struct file_operations reset_ops = {
        .write = reset_write,
        .open = mac80211_open_file_generic,
 +      .llseek = noop_llseek,
  };
  
  static ssize_t noack_read(struct file *file, char __user *user_buf,
@@@ -158,8 -157,7 +160,8 @@@ static ssize_t noack_write(struct file 
  static const struct file_operations noack_ops = {
        .read = noack_read,
        .write = noack_write,
 -      .open = mac80211_open_file_generic
 +      .open = mac80211_open_file_generic,
 +      .llseek = default_llseek,
  };
  
  static ssize_t uapsd_queues_read(struct file *file, char __user *user_buf,
@@@ -205,8 -203,7 +207,8 @@@ static ssize_t uapsd_queues_write(struc
  static const struct file_operations uapsd_queues_ops = {
        .read = uapsd_queues_read,
        .write = uapsd_queues_write,
 -      .open = mac80211_open_file_generic
 +      .open = mac80211_open_file_generic,
 +      .llseek = default_llseek,
  };
  
  static ssize_t uapsd_max_sp_len_read(struct file *file, char __user *user_buf,
@@@ -252,8 -249,7 +254,8 @@@ static ssize_t uapsd_max_sp_len_write(s
  static const struct file_operations uapsd_max_sp_len_ops = {
        .read = uapsd_max_sp_len_read,
        .write = uapsd_max_sp_len_write,
 -      .open = mac80211_open_file_generic
 +      .open = mac80211_open_file_generic,
 +      .llseek = default_llseek,
  };
  
  static ssize_t channel_type_read(struct file *file, char __user *user_buf,
  
  static const struct file_operations channel_type_ops = {
        .read = channel_type_read,
 -      .open = mac80211_open_file_generic
 +      .open = mac80211_open_file_generic,
 +      .llseek = default_llseek,
  };
  
  static ssize_t queues_read(struct file *file, char __user *user_buf,
  
  static const struct file_operations queues_ops = {
        .read = queues_read,
 -      .open = mac80211_open_file_generic
 +      .open = mac80211_open_file_generic,
 +      .llseek = default_llseek,
  };
  
  /* statistics stuff */
@@@ -354,7 -348,6 +356,7 @@@ static ssize_t stats_ ##name## _read(st
  static const struct file_operations stats_ ##name## _ops = {          \
        .read = stats_ ##name## _read,                                  \
        .open = mac80211_open_file_generic,                             \
 +      .llseek = generic_file_llseek,                                  \
  };
  
  #define DEBUGFS_STATS_ADD(name, field)                                        \
@@@ -375,7 -368,6 +377,6 @@@ void debugfs_hw_add(struct ieee80211_lo
        if (!phyd)
                return;
  
-       local->debugfs.stations = debugfs_create_dir("stations", phyd);
        local->debugfs.keys = debugfs_create_dir("keys", phyd);
  
        DEBUGFS_ADD(frequency);
@@@ -32,7 -32,6 +32,7 @@@ static ssize_t key_##name##_read(struc
  static const struct file_operations key_ ##name## _ops = {            \
        .read = key_##name##_read,                                      \
        .open = mac80211_open_file_generic,                             \
 +      .llseek = generic_file_llseek,                                  \
  }
  
  #define KEY_FILE(name, format)                                                \
@@@ -47,7 -46,6 +47,7 @@@
  static const struct file_operations key_ ##name## _ops = {            \
        .read = key_conf_##name##_read,                                 \
        .open = mac80211_open_file_generic,                             \
 +      .llseek = generic_file_llseek,                                  \
  }
  
  #define KEY_CONF_FILE(name, format)                                   \
@@@ -66,26 -64,13 +66,13 @@@ static ssize_t key_algorithm_read(struc
                                  char __user *userbuf,
                                  size_t count, loff_t *ppos)
  {
-       char *alg;
+       char buf[15];
        struct ieee80211_key *key = file->private_data;
+       u32 c = key->conf.cipher;
  
-       switch (key->conf.alg) {
-       case ALG_WEP:
-               alg = "WEP\n";
-               break;
-       case ALG_TKIP:
-               alg = "TKIP\n";
-               break;
-       case ALG_CCMP:
-               alg = "CCMP\n";
-               break;
-       case ALG_AES_CMAC:
-               alg = "AES-128-CMAC\n";
-               break;
-       default:
-               return 0;
-       }
-       return simple_read_from_buffer(userbuf, count, ppos, alg, strlen(alg));
+       sprintf(buf, "%.2x-%.2x-%.2x:%d\n",
+               c >> 24, (c >> 16) & 0xff, (c >> 8) & 0xff, c & 0xff);
+       return simple_read_from_buffer(userbuf, count, ppos, buf, strlen(buf));
  }
  KEY_OPS(algorithm);
  
@@@ -97,21 -82,22 +84,22 @@@ static ssize_t key_tx_spec_read(struct 
        int len;
        struct ieee80211_key *key = file->private_data;
  
-       switch (key->conf.alg) {
-       case ALG_WEP:
+       switch (key->conf.cipher) {
+       case WLAN_CIPHER_SUITE_WEP40:
+       case WLAN_CIPHER_SUITE_WEP104:
                len = scnprintf(buf, sizeof(buf), "\n");
                break;
-       case ALG_TKIP:
+       case WLAN_CIPHER_SUITE_TKIP:
                len = scnprintf(buf, sizeof(buf), "%08x %04x\n",
                                key->u.tkip.tx.iv32,
                                key->u.tkip.tx.iv16);
                break;
-       case ALG_CCMP:
+       case WLAN_CIPHER_SUITE_CCMP:
                tpn = key->u.ccmp.tx_pn;
                len = scnprintf(buf, sizeof(buf), "%02x%02x%02x%02x%02x%02x\n",
                                tpn[0], tpn[1], tpn[2], tpn[3], tpn[4], tpn[5]);
                break;
-       case ALG_AES_CMAC:
+       case WLAN_CIPHER_SUITE_AES_CMAC:
                tpn = key->u.aes_cmac.tx_pn;
                len = scnprintf(buf, sizeof(buf), "%02x%02x%02x%02x%02x%02x\n",
                                tpn[0], tpn[1], tpn[2], tpn[3], tpn[4],
@@@ -132,11 -118,12 +120,12 @@@ static ssize_t key_rx_spec_read(struct 
        int i, len;
        const u8 *rpn;
  
-       switch (key->conf.alg) {
-       case ALG_WEP:
+       switch (key->conf.cipher) {
+       case WLAN_CIPHER_SUITE_WEP40:
+       case WLAN_CIPHER_SUITE_WEP104:
                len = scnprintf(buf, sizeof(buf), "\n");
                break;
-       case ALG_TKIP:
+       case WLAN_CIPHER_SUITE_TKIP:
                for (i = 0; i < NUM_RX_DATA_QUEUES; i++)
                        p += scnprintf(p, sizeof(buf)+buf-p,
                                       "%08x %04x\n",
                                       key->u.tkip.rx[i].iv16);
                len = p - buf;
                break;
-       case ALG_CCMP:
+       case WLAN_CIPHER_SUITE_CCMP:
                for (i = 0; i < NUM_RX_DATA_QUEUES + 1; i++) {
                        rpn = key->u.ccmp.rx_pn[i];
                        p += scnprintf(p, sizeof(buf)+buf-p,
                }
                len = p - buf;
                break;
-       case ALG_AES_CMAC:
+       case WLAN_CIPHER_SUITE_AES_CMAC:
                rpn = key->u.aes_cmac.rx_pn;
                p += scnprintf(p, sizeof(buf)+buf-p,
                               "%02x%02x%02x%02x%02x%02x\n",
@@@ -176,11 -163,11 +165,11 @@@ static ssize_t key_replays_read(struct 
        char buf[20];
        int len;
  
-       switch (key->conf.alg) {
-       case ALG_CCMP:
+       switch (key->conf.cipher) {
+       case WLAN_CIPHER_SUITE_CCMP:
                len = scnprintf(buf, sizeof(buf), "%u\n", key->u.ccmp.replays);
                break;
-       case ALG_AES_CMAC:
+       case WLAN_CIPHER_SUITE_AES_CMAC:
                len = scnprintf(buf, sizeof(buf), "%u\n",
                                key->u.aes_cmac.replays);
                break;
@@@ -198,8 -185,8 +187,8 @@@ static ssize_t key_icverrors_read(struc
        char buf[20];
        int len;
  
-       switch (key->conf.alg) {
-       case ALG_AES_CMAC:
+       switch (key->conf.cipher) {
+       case WLAN_CIPHER_SUITE_AES_CMAC:
                len = scnprintf(buf, sizeof(buf), "%u\n",
                                key->u.aes_cmac.icverrors);
                break;
@@@ -121,7 -121,6 +121,7 @@@ static const struct file_operations nam
        .read = ieee80211_if_read_##name,                               \
        .write = (_write),                                              \
        .open = mac80211_open_file_generic,                             \
 +      .llseek = generic_file_llseek,                                  \
  }
  
  #define __IEEE80211_IF_FILE_W(name)                                   \
@@@ -410,6 -409,9 +410,9 @@@ void ieee80211_debugfs_add_netdev(struc
        sprintf(buf, "netdev:%s", sdata->name);
        sdata->debugfs.dir = debugfs_create_dir(buf,
                sdata->local->hw.wiphy->debugfsdir);
+       if (sdata->debugfs.dir)
+               sdata->debugfs.subdir_stations = debugfs_create_dir("stations",
+                       sdata->debugfs.dir);
        add_files(sdata);
  }
  
@@@ -36,7 -36,6 +36,7 @@@ static ssize_t sta_ ##name## _read(stru
  static const struct file_operations sta_ ##name## _ops = {            \
        .read = sta_##name##_read,                                      \
        .open = mac80211_open_file_generic,                             \
 +      .llseek = generic_file_llseek,                                  \
  }
  
  #define STA_OPS_RW(name)                                              \
@@@ -44,7 -43,6 +44,7 @@@ static const struct file_operations sta
        .read = sta_##name##_read,                                      \
        .write = sta_##name##_write,                                    \
        .open = mac80211_open_file_generic,                             \
 +      .llseek = generic_file_llseek,                                  \
  }
  
  #define STA_FILE(name, field, format)                                 \
@@@ -198,7 -196,8 +198,8 @@@ static ssize_t sta_agg_status_write(str
                else
                        ret = ieee80211_stop_tx_ba_session(&sta->sta, tid);
        } else {
-               __ieee80211_stop_rx_ba_session(sta, tid, WLAN_BACK_RECIPIENT, 3);
+               __ieee80211_stop_rx_ba_session(sta, tid, WLAN_BACK_RECIPIENT,
+                                              3, true);
                ret = 0;
        }
  
@@@ -302,7 -301,7 +303,7 @@@ STA_OPS(ht_capa)
  
  void ieee80211_sta_debugfs_add(struct sta_info *sta)
  {
-       struct dentry *stations_dir = sta->local->debugfs.stations;
+       struct dentry *stations_dir = sta->sdata->debugfs.subdir_stations;
        u8 mac[3*ETH_ALEN];
  
        sta->debugfs.add_has_run = true;
diff --combined net/mac80211/rate.c
@@@ -145,7 -145,6 +145,7 @@@ static ssize_t rcname_read(struct file 
  static const struct file_operations rcname_ops = {
        .read = rcname_read,
        .open = mac80211_open_file_generic,
 +      .llseek = default_llseek,
  };
  #endif
  
@@@ -208,7 -207,7 +208,7 @@@ static bool rc_no_data_or_no_ack(struc
  
        fc = hdr->frame_control;
  
-       return ((info->flags & IEEE80211_TX_CTL_NO_ACK) || !ieee80211_is_data(fc));
+       return (info->flags & IEEE80211_TX_CTL_NO_ACK) || !ieee80211_is_data(fc);
  }
  
  static void rc_send_low_broadcast(s8 *idx, u32 basic_rates, u8 max_rate_idx)
@@@ -369,8 -368,8 +369,8 @@@ int ieee80211_init_rate_ctrl_alg(struc
  
        ref = rate_control_alloc(name, local);
        if (!ref) {
-               printk(KERN_WARNING "%s: Failed to select rate control "
-                      "algorithm\n", wiphy_name(local->hw.wiphy));
+               wiphy_warn(local->hw.wiphy,
+                          "Failed to select rate control algorithm\n");
                return -ENOENT;
        }
  
                sta_info_flush(local, NULL);
        }
  
-       printk(KERN_DEBUG "%s: Selected rate control "
-              "algorithm '%s'\n", wiphy_name(local->hw.wiphy),
-              ref->ops->name);
+       wiphy_debug(local->hw.wiphy, "Selected rate control algorithm '%s'\n",
+                   ref->ops->name);
  
        return 0;
  }
@@@ -162,7 -162,7 +162,7 @@@ static ssize_t rate_control_pid_events_
        file_info->next_entry = (file_info->next_entry + 1) %
                                RC_PID_EVENT_RING_SIZE;
  
-       /* Print information about the event. Note that userpace needs to
+       /* Print information about the event. Note that userspace needs to
         * provide large enough buffers. */
        length = length < RC_PID_PRINT_BUF_SIZE ?
                 length : RC_PID_PRINT_BUF_SIZE;
@@@ -206,7 -206,6 +206,7 @@@ static const struct file_operations rc_
        .poll = rate_control_pid_events_poll,
        .open = rate_control_pid_events_open,
        .release = rate_control_pid_events_release,
 +      .llseek = noop_llseek,
  };
  
  void rate_control_pid_add_sta_debugfs(void *priv, void *priv_sta,
diff --combined net/netfilter/core.c
@@@ -27,7 -27,7 +27,7 @@@
  
  static DEFINE_MUTEX(afinfo_mutex);
  
 -const struct nf_afinfo *nf_afinfo[NFPROTO_NUMPROTO] __read_mostly;
 +const struct nf_afinfo __rcu *nf_afinfo[NFPROTO_NUMPROTO] __read_mostly;
  EXPORT_SYMBOL(nf_afinfo);
  
  int nf_register_afinfo(const struct nf_afinfo *afinfo)
@@@ -105,10 -105,8 +105,8 @@@ EXPORT_SYMBOL(nf_register_hooks)
  
  void nf_unregister_hooks(struct nf_hook_ops *reg, unsigned int n)
  {
-       unsigned int i;
-       for (i = 0; i < n; i++)
-               nf_unregister_hook(&reg[i]);
+       while (n-- > 0)
+               nf_unregister_hook(&reg[n]);
  }
  EXPORT_SYMBOL(nf_unregister_hooks);
  
@@@ -22,7 -22,6 +22,7 @@@
  #include <linux/rculist_nulls.h>
  #include <linux/types.h>
  #include <linux/timer.h>
 +#include <linux/security.h>
  #include <linux/skbuff.h>
  #include <linux/errno.h>
  #include <linux/netlink.h>
@@@ -246,31 -245,16 +246,31 @@@ nla_put_failure
  
  #ifdef CONFIG_NF_CONNTRACK_SECMARK
  static inline int
 -ctnetlink_dump_secmark(struct sk_buff *skb, const struct nf_conn *ct)
 +ctnetlink_dump_secctx(struct sk_buff *skb, const struct nf_conn *ct)
  {
 -      NLA_PUT_BE32(skb, CTA_SECMARK, htonl(ct->secmark));
 -      return 0;
 +      struct nlattr *nest_secctx;
 +      int len, ret;
 +      char *secctx;
 +
 +      ret = security_secid_to_secctx(ct->secmark, &secctx, &len);
 +      if (ret)
 +              return ret;
 +
 +      ret = -1;
 +      nest_secctx = nla_nest_start(skb, CTA_SECCTX | NLA_F_NESTED);
 +      if (!nest_secctx)
 +              goto nla_put_failure;
 +
 +      NLA_PUT_STRING(skb, CTA_SECCTX_NAME, secctx);
 +      nla_nest_end(skb, nest_secctx);
  
 +      ret = 0;
  nla_put_failure:
 -      return -1;
 +      security_release_secctx(secctx, len);
 +      return ret;
  }
  #else
 -#define ctnetlink_dump_secmark(a, b) (0)
 +#define ctnetlink_dump_secctx(a, b) (0)
  #endif
  
  #define master_tuple(ct) &(ct->master->tuplehash[IP_CT_DIR_ORIGINAL].tuple)
@@@ -407,7 -391,7 +407,7 @@@ ctnetlink_fill_info(struct sk_buff *skb
            ctnetlink_dump_protoinfo(skb, ct) < 0 ||
            ctnetlink_dump_helpinfo(skb, ct) < 0 ||
            ctnetlink_dump_mark(skb, ct) < 0 ||
 -          ctnetlink_dump_secmark(skb, ct) < 0 ||
 +          ctnetlink_dump_secctx(skb, ct) < 0 ||
            ctnetlink_dump_id(skb, ct) < 0 ||
            ctnetlink_dump_use(skb, ct) < 0 ||
            ctnetlink_dump_master(skb, ct) < 0 ||
@@@ -453,17 -437,6 +453,17 @@@ ctnetlink_counters_size(const struct nf
               ;
  }
  
 +#ifdef CONFIG_NF_CONNTRACK_SECMARK
 +static int ctnetlink_nlmsg_secctx_size(const struct nf_conn *ct)
 +{
 +      int len;
 +
 +      security_secid_to_secctx(ct->secmark, NULL, &len);
 +
 +      return sizeof(char) * len;
 +}
 +#endif
 +
  static inline size_t
  ctnetlink_nlmsg_size(const struct nf_conn *ct)
  {
               + nla_total_size(0) /* CTA_HELP */
               + nla_total_size(NF_CT_HELPER_NAME_LEN) /* CTA_HELP_NAME */
  #ifdef CONFIG_NF_CONNTRACK_SECMARK
 -             + nla_total_size(sizeof(u_int32_t)) /* CTA_SECMARK */
 +             + nla_total_size(0) /* CTA_SECCTX */
 +             + nla_total_size(ctnetlink_nlmsg_secctx_size(ct)) /* CTA_SECCTX_NAME */
  #endif
  #ifdef CONFIG_NF_NAT_NEEDED
               + 2 * nla_total_size(0) /* CTA_NAT_SEQ_ADJ_ORIG|REPL */
@@@ -584,7 -556,7 +584,7 @@@ ctnetlink_conntrack_event(unsigned int 
  
  #ifdef CONFIG_NF_CONNTRACK_SECMARK
                if ((events & (1 << IPCT_SECMARK) || ct->secmark)
 -                  && ctnetlink_dump_secmark(skb, ct) < 0)
 +                  && ctnetlink_dump_secctx(skb, ct) < 0)
                        goto nla_put_failure;
  #endif
  
@@@ -1588,8 -1560,8 +1588,8 @@@ ctnetlink_exp_dump_expect(struct sk_buf
                          const struct nf_conntrack_expect *exp)
  {
        struct nf_conn *master = exp->master;
-       struct nf_conntrack_helper *helper;
        long timeout = (exp->timeout.expires - jiffies) / HZ;
+       struct nf_conn_help *help;
  
        if (timeout < 0)
                timeout = 0;
  
        NLA_PUT_BE32(skb, CTA_EXPECT_TIMEOUT, htonl(timeout));
        NLA_PUT_BE32(skb, CTA_EXPECT_ID, htonl((unsigned long)exp));
-       helper = rcu_dereference(nfct_help(master)->helper);
-       if (helper)
-               NLA_PUT_STRING(skb, CTA_EXPECT_HELP_NAME, helper->name);
+       NLA_PUT_BE32(skb, CTA_EXPECT_FLAGS, htonl(exp->flags));
+       help = nfct_help(master);
+       if (help) {
+               struct nf_conntrack_helper *helper;
+               helper = rcu_dereference(help->helper);
+               if (helper)
+                       NLA_PUT_STRING(skb, CTA_EXPECT_HELP_NAME, helper->name);
+       }
  
        return 0;
  
@@@ -1654,17 -1632,20 +1660,20 @@@ ctnetlink_expect_event(unsigned int eve
        struct nlmsghdr *nlh;
        struct nfgenmsg *nfmsg;
        struct sk_buff *skb;
-       unsigned int type;
+       unsigned int type, group;
        int flags = 0;
  
-       if (events & (1 << IPEXP_NEW)) {
+       if (events & (1 << IPEXP_DESTROY)) {
+               type = IPCTNL_MSG_EXP_DELETE;
+               group = NFNLGRP_CONNTRACK_EXP_DESTROY;
+       } else if (events & (1 << IPEXP_NEW)) {
                type = IPCTNL_MSG_EXP_NEW;
                flags = NLM_F_CREATE|NLM_F_EXCL;
+               group = NFNLGRP_CONNTRACK_EXP_NEW;
        } else
                return 0;
  
-       if (!item->report &&
-           !nfnetlink_has_listeners(net, NFNLGRP_CONNTRACK_EXP_NEW))
+       if (!item->report && !nfnetlink_has_listeners(net, group))
                return 0;
  
        skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
        rcu_read_unlock();
  
        nlmsg_end(skb, nlh);
-       nfnetlink_send(skb, net, item->pid, NFNLGRP_CONNTRACK_EXP_NEW,
-                      item->report, GFP_ATOMIC);
+       nfnetlink_send(skb, net, item->pid, group, item->report, GFP_ATOMIC);
        return 0;
  
  nla_put_failure:
@@@ -1761,6 -1741,8 +1769,8 @@@ static const struct nla_policy exp_nla_
        [CTA_EXPECT_TIMEOUT]    = { .type = NLA_U32 },
        [CTA_EXPECT_ID]         = { .type = NLA_U32 },
        [CTA_EXPECT_HELP_NAME]  = { .type = NLA_NUL_STRING },
+       [CTA_EXPECT_ZONE]       = { .type = NLA_U16 },
+       [CTA_EXPECT_FLAGS]      = { .type = NLA_U32 },
  };
  
  static int
@@@ -1869,7 -1851,13 +1879,13 @@@ ctnetlink_del_expect(struct sock *ctnl
                }
  
                /* after list removal, usage count == 1 */
-               nf_ct_unexpect_related(exp);
+               spin_lock_bh(&nf_conntrack_lock);
+               if (del_timer(&exp->timeout)) {
+                       nf_ct_unlink_expect_report(exp, NETLINK_CB(skb).pid,
+                                                  nlmsg_report(nlh));
+                       nf_ct_expect_put(exp);
+               }
+               spin_unlock_bh(&nf_conntrack_lock);
                /* have to put what we 'get' above.
                 * after this line usage count == 0 */
                nf_ct_expect_put(exp);
                                m_help = nfct_help(exp->master);
                                if (!strcmp(m_help->helper->name, name) &&
                                    del_timer(&exp->timeout)) {
-                                       nf_ct_unlink_expect(exp);
+                                       nf_ct_unlink_expect_report(exp,
+                                                       NETLINK_CB(skb).pid,
+                                                       nlmsg_report(nlh));
                                        nf_ct_expect_put(exp);
                                }
                        }
                                                  &net->ct.expect_hash[i],
                                                  hnode) {
                                if (del_timer(&exp->timeout)) {
-                                       nf_ct_unlink_expect(exp);
+                                       nf_ct_unlink_expect_report(exp,
+                                                       NETLINK_CB(skb).pid,
+                                                       nlmsg_report(nlh));
                                        nf_ct_expect_put(exp);
                                }
                        }
@@@ -1946,23 -1938,35 +1966,35 @@@ ctnetlink_create_expect(struct net *net
        if (!h)
                return -ENOENT;
        ct = nf_ct_tuplehash_to_ctrack(h);
-       help = nfct_help(ct);
-       if (!help || !help->helper) {
-               /* such conntrack hasn't got any helper, abort */
-               err = -EOPNOTSUPP;
-               goto out;
-       }
        exp = nf_ct_expect_alloc(ct);
        if (!exp) {
                err = -ENOMEM;
                goto out;
        }
+       help = nfct_help(ct);
+       if (!help) {
+               if (!cda[CTA_EXPECT_TIMEOUT]) {
+                       err = -EINVAL;
+                       goto out;
+               }
+               exp->timeout.expires =
+                 jiffies + ntohl(nla_get_be32(cda[CTA_EXPECT_TIMEOUT])) * HZ;
+               exp->flags = NF_CT_EXPECT_USERSPACE;
+               if (cda[CTA_EXPECT_FLAGS]) {
+                       exp->flags |=
+                               ntohl(nla_get_be32(cda[CTA_EXPECT_FLAGS]));
+               }
+       } else {
+               if (cda[CTA_EXPECT_FLAGS]) {
+                       exp->flags = ntohl(nla_get_be32(cda[CTA_EXPECT_FLAGS]));
+                       exp->flags &= ~NF_CT_EXPECT_USERSPACE;
+               } else
+                       exp->flags = 0;
+       }
  
        exp->class = 0;
        exp->expectfn = NULL;
-       exp->flags = 0;
        exp->master = ct;
        exp->helper = NULL;
        memcpy(&exp->tuple, &tuple, sizeof(struct nf_conntrack_tuple));
@@@ -2130,6 -2134,7 +2162,7 @@@ static void __exit ctnetlink_exit(void
  {
        pr_info("ctnetlink: unregistering from nfnetlink.\n");
  
+       nf_ct_remove_userspace_expectations();
  #ifdef CONFIG_NF_CONNTRACK_EVENTS
        nf_ct_expect_unregister_notifier(&ctnl_notifier_exp);
        nf_conntrack_unregister_notifier(&ctnl_notifier);
diff --combined net/sctp/probe.c
@@@ -22,6 -22,8 +22,8 @@@
   * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
   */
  
+ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  #include <linux/kernel.h>
  #include <linux/kprobes.h>
  #include <linux/socket.h>
@@@ -117,7 -119,6 +119,7 @@@ static const struct file_operations sct
        .owner  = THIS_MODULE,
        .open   = sctpprobe_open,
        .read   = sctpprobe_read,
 +      .llseek = noop_llseek,
  };
  
  sctp_disposition_t jsctp_sf_eat_sack(const struct sctp_endpoint *ep,
@@@ -193,7 -194,7 +195,7 @@@ static __init int sctpprobe_init(void
        if (ret)
                goto remove_proc;
  
-       pr_info("SCTP probe registered (port=%d)\n", port);
+       pr_info("probe registered (port=%d)\n", port);
  
        return 0;
  
diff --combined net/socket.c
@@@ -209,8 -209,8 +209,8 @@@ int move_addr_to_kernel(void __user *ua
   *    specified. Zero is returned for a success.
   */
  
int move_addr_to_user(struct sockaddr *kaddr, int klen, void __user *uaddr,
-                     int __user *ulen)
static int move_addr_to_user(struct sockaddr *kaddr, int klen,
+                            void __user *uaddr, int __user *ulen)
  {
        int err;
        int len;
@@@ -502,7 -502,6 +502,7 @@@ static int sock_no_open(struct inode *i
  const struct file_operations bad_sock_fops = {
        .owner = THIS_MODULE,
        .open = sock_no_open,
 +      .llseek = noop_llseek,
  };
  
  /**
@@@ -536,14 -535,13 +536,13 @@@ void sock_release(struct socket *sock
  }
  EXPORT_SYMBOL(sock_release);
  
- int sock_tx_timestamp(struct msghdr *msg, struct sock *sk,
-                     union skb_shared_tx *shtx)
+ int sock_tx_timestamp(struct sock *sk, __u8 *tx_flags)
  {
-       shtx->flags = 0;
+       *tx_flags = 0;
        if (sock_flag(sk, SOCK_TIMESTAMPING_TX_HARDWARE))
-               shtx->hardware = 1;
+               *tx_flags |= SKBTX_HW_TSTAMP;
        if (sock_flag(sk, SOCK_TIMESTAMPING_TX_SOFTWARE))
-               shtx->software = 1;
+               *tx_flags |= SKBTX_SW_TSTAMP;
        return 0;
  }
  EXPORT_SYMBOL(sock_tx_timestamp);
@@@ -663,7 -661,8 +662,8 @@@ void __sock_recv_timestamp(struct msghd
  }
  EXPORT_SYMBOL_GPL(__sock_recv_timestamp);
  
- inline void sock_recv_drops(struct msghdr *msg, struct sock *sk, struct sk_buff *skb)
+ static inline void sock_recv_drops(struct msghdr *msg, struct sock *sk,
+                                  struct sk_buff *skb)
  {
        if (sock_flag(sk, SOCK_RXQ_OVFL) && skb && skb->dropcount)
                put_cmsg(msg, SOL_SOCKET, SO_RXQ_OVFL,
@@@ -1920,7 -1919,8 +1920,8 @@@ SYSCALL_DEFINE3(sendmsg, int, fd, struc
                 * Afterwards, it will be a kernel pointer. Thus the compiler-assisted
                 * checking falls down on this.
                 */
-               if (copy_from_user(ctl_buf, (void __user *)msg_sys.msg_control,
+               if (copy_from_user(ctl_buf,
+                                  (void __user __force *)msg_sys.msg_control,
                                   ctl_len))
                        goto out_freectl;
                msg_sys.msg_control = ctl_buf;
@@@ -3055,14 -3055,19 +3056,19 @@@ int kernel_getsockopt(struct socket *so
                        char *optval, int *optlen)
  {
        mm_segment_t oldfs = get_fs();
+       char __user *uoptval;
+       int __user *uoptlen;
        int err;
  
+       uoptval = (char __user __force *) optval;
+       uoptlen = (int __user __force *) optlen;
        set_fs(KERNEL_DS);
        if (level == SOL_SOCKET)
-               err = sock_getsockopt(sock, level, optname, optval, optlen);
+               err = sock_getsockopt(sock, level, optname, uoptval, uoptlen);
        else
-               err = sock->ops->getsockopt(sock, level, optname, optval,
-                                           optlen);
+               err = sock->ops->getsockopt(sock, level, optname, uoptval,
+                                           uoptlen);
        set_fs(oldfs);
        return err;
  }
@@@ -3072,13 -3077,16 +3078,16 @@@ int kernel_setsockopt(struct socket *so
                        char *optval, unsigned int optlen)
  {
        mm_segment_t oldfs = get_fs();
+       char __user *uoptval;
        int err;
  
+       uoptval = (char __user __force *) optval;
        set_fs(KERNEL_DS);
        if (level == SOL_SOCKET)
-               err = sock_setsockopt(sock, level, optname, optval, optlen);
+               err = sock_setsockopt(sock, level, optname, uoptval, optlen);
        else
-               err = sock->ops->setsockopt(sock, level, optname, optval,
+               err = sock->ops->setsockopt(sock, level, optname, uoptval,
                                            optlen);
        set_fs(oldfs);
        return err;