Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
authorDavid S. Miller <davem@davemloft.net>
Fri, 6 Nov 2009 08:55:55 +0000 (00:55 -0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 6 Nov 2009 08:55:55 +0000 (00:55 -0800)
Conflicts:
drivers/net/usb/cdc_ether.c

All CDC ethernet devices of type USB_CLASS_COMM need to use
'&mbm_info'.

Signed-off-by: David S. Miller <davem@davemloft.net>

26 files changed:
1  2 
MAINTAINERS
drivers/net/benet/be_cmds.h
drivers/net/davinci_emac.c
drivers/net/e100.c
drivers/net/e1000e/e1000.h
drivers/net/r8169.c
drivers/net/sky2.c
drivers/net/usb/cdc_ether.c
drivers/net/virtio_net.c
drivers/net/wireless/ath/ath9k/rc.c
drivers/net/wireless/ipw2x00/ipw2200.c
drivers/net/wireless/libertas/if_usb.c
firmware/Makefile
firmware/WHENCE
include/linux/skbuff.h
include/net/ip_fib.h
net/bridge/br_if.c
net/core/datagram.c
net/ipv4/fib_frontend.c
net/ipv4/ip_gre.c
net/ipv4/route.c
net/ipv4/udp.c
net/ipv6/udp.c
net/rose/rose_route.c
net/sunrpc/svcsock.c
net/wireless/sme.c

diff --combined MAINTAINERS
@@@ -257,13 -257,6 +257,13 @@@ W:       http://www.lesswatts.org/projects/ac
  S:    Supported
  F:    drivers/acpi/fan.c
  
 +ACPI PROCESSOR AGGREGATOR DRIVER
 +M:    Shaohua Li <shaohua.li@intel.com>
 +L:    linux-acpi@vger.kernel.org
 +W:    http://www.lesswatts.org/projects/acpi/
 +S:    Supported
 +F:    drivers/acpi/acpi_pad.c
 +
  ACPI THERMAL DRIVER
  M:    Zhang Rui <rui.zhang@intel.com>
  L:    linux-acpi@vger.kernel.org
@@@ -653,24 -646,24 +653,24 @@@ ARM/INTEL IOP32X ARM ARCHITECTUR
  M:    Lennert Buytenhek <kernel@wantstofly.org>
  M:    Dan Williams <dan.j.williams@intel.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Supported
 +S:    Maintained
  
  ARM/INTEL IOP33X ARM ARCHITECTURE
  M:    Dan Williams <dan.j.williams@intel.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Supported
 +S:    Maintained
  
  ARM/INTEL IOP13XX ARM ARCHITECTURE
  M:    Lennert Buytenhek <kernel@wantstofly.org>
  M:    Dan Williams <dan.j.williams@intel.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Supported
 +S:    Maintained
  
  ARM/INTEL IQ81342EX MACHINE SUPPORT
  M:    Lennert Buytenhek <kernel@wantstofly.org>
  M:    Dan Williams <dan.j.williams@intel.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Supported
 +S:    Maintained
  
  ARM/INTEL IXP2000 ARM ARCHITECTURE
  M:    Lennert Buytenhek <kernel@wantstofly.org>
@@@ -690,7 -683,7 +690,7 @@@ S: Maintaine
  ARM/INTEL IXP4XX ARM ARCHITECTURE
  M:    Imre Kaloz <kaloz@openwrt.org>
  M:    Krzysztof Halasa <khc@pm.waw.pl>
 -L:    linux-arm-kernel@lists.infradead.org
 +L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  F:    arch/arm/mach-ixp4xx/
  
@@@ -698,7 -691,7 +698,7 @@@ ARM/INTEL XSC3 (MANZANO) ARM COR
  M:    Lennert Buytenhek <kernel@wantstofly.org>
  M:    Dan Williams <dan.j.williams@intel.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Supported
 +S:    Maintained
  
  ARM/IP FABRICS DOUBLE ESPRESSO MACHINE SUPPORT
  M:    Lennert Buytenhek <kernel@wantstofly.org>
@@@ -747,37 -740,20 +747,37 @@@ M:      Dmitry Eremin-Solenikov <dbaryshkov@
  M:    Dirk Opfer <dirk@opfer-online.de>
  S:    Maintained
  
 -ARM/PALMTX,PALMT5,PALMLD,PALMTE2 SUPPORT
 +ARM/PALMTX,PALMT5,PALMLD,PALMTE2,PALMTC SUPPORT
  M:    Marek Vasut <marek.vasut@gmail.com>
 +L:    linux-arm-kernel@lists.infradead.org
  W:    http://hackndev.com
  S:    Maintained
 +F:    arch/arm/mach-pxa/include/mach/palmtx.h
 +F:    arch/arm/mach-pxa/palmtx.c
 +F:    arch/arm/mach-pxa/include/mach/palmt5.h
 +F:    arch/arm/mach-pxa/palmt5.c
 +F:    arch/arm/mach-pxa/include/mach/palmld.h
 +F:    arch/arm/mach-pxa/palmld.c
 +F:    arch/arm/mach-pxa/include/mach/palmte2.h
 +F:    arch/arm/mach-pxa/palmte2.c
 +F:    arch/arm/mach-pxa/include/mach/palmtc.h
 +F:    arch/arm/mach-pxa/palmtc.c
  
  ARM/PALM TREO 680 SUPPORT
  M:    Tomas Cech <sleep_walker@suse.cz>
 +L:    linux-arm-kernel@lists.infradead.org
  W:    http://hackndev.com
  S:    Maintained
 +F:    arch/arm/mach-pxa/include/mach/treo680.h
 +F:    arch/arm/mach-pxa/treo680.c
  
  ARM/PALMZ72 SUPPORT
  M:    Sergey Lapin <slapin@ossfans.org>
 +L:    linux-arm-kernel@lists.infradead.org
  W:    http://hackndev.com
  S:    Maintained
 +F:    arch/arm/mach-pxa/include/mach/palmz72.h
 +F:    arch/arm/mach-pxa/palmz72.c
  
  ARM/PLEB SUPPORT
  M:    Peter Chubb <pleb@gelato.unsw.edu.au>
@@@ -1086,6 -1062,7 +1086,6 @@@ F:      include/net/ax25.
  F:    net/ax25/
  
  B43 WIRELESS DRIVER
 -M:    Michael Buesch <mb@bu3sch.de>
  M:    Stefano Brivio <stefano.brivio@polimi.it>
  L:    linux-wireless@vger.kernel.org
  W:    http://linuxwireless.org/en/users/Drivers/b43
@@@ -2701,7 -2678,7 +2701,7 @@@ F:      include/linux/intel-iommu.
  
  INTEL IOP-ADMA DMA DRIVER
  M:    Dan Williams <dan.j.williams@intel.com>
 -S:    Supported
 +S:    Maintained
  F:    drivers/dma/iop-adma.c
  
  INTEL IXP4XX QMGR, NPE, ETHERNET and HSS SUPPORT
@@@ -3655,6 -3632,7 +3655,7 @@@ L:      netdev@vger.kernel.or
  W:    http://www.linuxfoundation.org/en/Net
  W:    http://patchwork.ozlabs.org/project/netdev/list/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6.git
+ T:    git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6.git
  S:    Maintained
  F:    net/
  F:    include/net/
@@@ -68,7 -68,7 +68,7 @@@ enum 
  #define CQE_STATUS_COMPL_MASK         0xFFFF
  #define CQE_STATUS_COMPL_SHIFT                0       /* bits 0 - 15 */
  #define CQE_STATUS_EXTD_MASK          0xFFFF
- #define CQE_STATUS_EXTD_SHIFT         0       /* bits 0 - 15 */
+ #define CQE_STATUS_EXTD_SHIFT         16      /* bits 16 - 31 */
  
  struct be_mcc_compl {
        u32 status;             /* dword 0 */
@@@ -138,9 -138,6 +138,9 @@@ struct be_mcc_mailbox 
  #define OPCODE_COMMON_NTWK_PMAC_ADD                   59
  #define OPCODE_COMMON_NTWK_PMAC_DEL                   60
  #define OPCODE_COMMON_FUNCTION_RESET                  61
 +#define OPCODE_COMMON_ENABLE_DISABLE_BEACON           69
 +#define OPCODE_COMMON_GET_BEACON_STATE                        70
 +#define OPCODE_COMMON_READ_TRANSRECV_DATA             73
  
  #define OPCODE_ETH_ACPI_CONFIG                                2
  #define OPCODE_ETH_PROMISCUOUS                                3
@@@ -636,47 -633,9 +636,47 @@@ struct be_cmd_resp_link_status 
        u8 mac_fault;
        u8 mgmt_mac_duplex;
        u8 mgmt_mac_speed;
 -      u16 rsvd0;
 +      u16 link_speed;
 +      u32 rsvd0;
  } __packed;
  
 +/******************** Port Identification ***************************/
 +/*    Identifies the type of port attached to NIC     */
 +struct be_cmd_req_port_type {
 +      struct be_cmd_req_hdr hdr;
 +      u32 page_num;
 +      u32 port;
 +};
 +
 +enum {
 +      TR_PAGE_A0 = 0xa0,
 +      TR_PAGE_A2 = 0xa2
 +};
 +
 +struct be_cmd_resp_port_type {
 +      struct be_cmd_resp_hdr hdr;
 +      u32 page_num;
 +      u32 port;
 +      struct data {
 +              u8 identifier;
 +              u8 identifier_ext;
 +              u8 connector;
 +              u8 transceiver[8];
 +              u8 rsvd0[3];
 +              u8 length_km;
 +              u8 length_hm;
 +              u8 length_om1;
 +              u8 length_om2;
 +              u8 length_cu;
 +              u8 length_cu_m;
 +              u8 vendor_name[16];
 +              u8 rsvd;
 +              u8 vendor_oui[3];
 +              u8 vendor_pn[16];
 +              u8 vendor_rev[4];
 +      } data;
 +};
 +
  /******************** Get FW Version *******************/
  struct be_cmd_req_get_fw_version {
        struct be_cmd_req_hdr hdr;
@@@ -740,37 -699,6 +740,37 @@@ struct be_cmd_resp_query_fw_cfg 
        u32 rsvd[26];
  };
  
 +/******************** Port Beacon ***************************/
 +
 +#define BEACON_STATE_ENABLED          0x1
 +#define BEACON_STATE_DISABLED         0x0
 +
 +struct be_cmd_req_enable_disable_beacon {
 +      struct be_cmd_req_hdr hdr;
 +      u8  port_num;
 +      u8  beacon_state;
 +      u8  beacon_duration;
 +      u8  status_duration;
 +} __packed;
 +
 +struct be_cmd_resp_enable_disable_beacon {
 +      struct be_cmd_resp_hdr resp_hdr;
 +      u32 rsvd0;
 +} __packed;
 +
 +struct be_cmd_req_get_beacon_state {
 +      struct be_cmd_req_hdr hdr;
 +      u8  port_num;
 +      u8  rsvd0;
 +      u16 rsvd1;
 +} __packed;
 +
 +struct be_cmd_resp_get_beacon_state {
 +      struct be_cmd_resp_hdr resp_hdr;
 +      u8 beacon_state;
 +      u8 rsvd0[3];
 +} __packed;
 +
  /****************** Firmware Flash ******************/
  struct flashrom_params {
        u32 op_code;
@@@ -815,7 -743,7 +815,7 @@@ extern int be_cmd_rxq_create(struct be_
  extern int be_cmd_q_destroy(struct be_adapter *adapter, struct be_queue_info *q,
                        int type);
  extern int be_cmd_link_status_query(struct be_adapter *adapter,
 -                      bool *link_up);
 +                      bool *link_up, u8 *mac_speed, u16 *link_speed);
  extern int be_cmd_reset(struct be_adapter *adapter);
  extern int be_cmd_get_stats(struct be_adapter *adapter,
                        struct be_dma_mem *nonemb_cmd);
@@@ -837,12 -765,6 +837,12 @@@ extern int be_cmd_query_fw_cfg(struct b
                        u32 *port_num, u32 *cap);
  extern int be_cmd_reset_function(struct be_adapter *adapter);
  extern int be_process_mcc(struct be_adapter *adapter);
 +extern int be_cmd_set_beacon_state(struct be_adapter *adapter,
 +                      u8 port_num, u8 beacon, u8 status, u8 state);
 +extern int be_cmd_get_beacon_state(struct be_adapter *adapter,
 +                      u8 port_num, u32 *state);
 +extern int be_cmd_read_port_type(struct be_adapter *adapter, u32 port,
 +                                      u8 *connector);
  extern int be_cmd_write_flashrom(struct be_adapter *adapter,
                        struct be_dma_mem *cmd, u32 flash_oper,
                        u32 flash_opcode, u32 buf_size);
@@@ -164,14 -164,16 +164,14 @@@ static const char emac_version_string[
  # define EMAC_MBP_MCASTCHAN(ch)               ((ch) & 0x7)
  
  /* EMAC mac_control register */
 -#define EMAC_MACCONTROL_TXPTYPE               (0x200)
 -#define EMAC_MACCONTROL_TXPACEEN      (0x40)
 -#define EMAC_MACCONTROL_MIIEN         (0x20)
 -#define EMAC_MACCONTROL_GIGABITEN     (0x80)
 -#define EMAC_MACCONTROL_GIGABITEN_SHIFT (7)
 -#define EMAC_MACCONTROL_FULLDUPLEXEN  (0x1)
 +#define EMAC_MACCONTROL_TXPTYPE               BIT(9)
 +#define EMAC_MACCONTROL_TXPACEEN      BIT(6)
 +#define EMAC_MACCONTROL_GMIIEN                BIT(5)
 +#define EMAC_MACCONTROL_GIGABITEN     BIT(7)
 +#define EMAC_MACCONTROL_FULLDUPLEXEN  BIT(0)
  #define EMAC_MACCONTROL_RMIISPEED_MASK        BIT(15)
  
  /* GIGABIT MODE related bits */
 -#define EMAC_DM646X_MACCONTORL_GMIIEN BIT(5)
  #define EMAC_DM646X_MACCONTORL_GIG    BIT(7)
  #define EMAC_DM646X_MACCONTORL_GIGFORCE       BIT(17)
  
  #define EMAC_RX_BUFFER_OFFSET_MASK    (0xFFFF)
  
  /* MAC_IN_VECTOR (0x180) register bit fields */
 -#define EMAC_DM644X_MAC_IN_VECTOR_HOST_INT          (0x20000)
 -#define EMAC_DM644X_MAC_IN_VECTOR_STATPEND_INT              (0x10000)
 -#define EMAC_DM644X_MAC_IN_VECTOR_RX_INT_VEC        (0x0100)
 -#define EMAC_DM644X_MAC_IN_VECTOR_TX_INT_VEC        (0x01)
 +#define EMAC_DM644X_MAC_IN_VECTOR_HOST_INT    BIT(17)
 +#define EMAC_DM644X_MAC_IN_VECTOR_STATPEND_INT        BIT(16)
 +#define EMAC_DM644X_MAC_IN_VECTOR_RX_INT_VEC  BIT(8)
 +#define EMAC_DM644X_MAC_IN_VECTOR_TX_INT_VEC  BIT(0)
  
  /** NOTE:: For DM646x the IN_VECTOR has changed */
  #define EMAC_DM646X_MAC_IN_VECTOR_RX_INT_VEC  BIT(EMAC_DEF_RX_CH)
  #define EMAC_DM646X_MAC_IN_VECTOR_HOST_INT    BIT(26)
  #define EMAC_DM646X_MAC_IN_VECTOR_STATPEND_INT        BIT(27)
  
 -
  /* CPPI bit positions */
  #define EMAC_CPPI_SOP_BIT             BIT(31)
  #define EMAC_CPPI_EOP_BIT             BIT(30)
@@@ -747,7 -750,8 +747,7 @@@ static void emac_update_phystatus(struc
  
        if (priv->speed == SPEED_1000 && (priv->version == EMAC_VERSION_2)) {
                mac_control = emac_read(EMAC_MACCONTROL);
 -              mac_control |= (EMAC_DM646X_MACCONTORL_GMIIEN |
 -                              EMAC_DM646X_MACCONTORL_GIG |
 +              mac_control |= (EMAC_DM646X_MACCONTORL_GIG |
                                EMAC_DM646X_MACCONTORL_GIGFORCE);
        } else {
                /* Clear the GIG bit and GIGFORCE bit */
@@@ -2104,7 -2108,7 +2104,7 @@@ static int emac_hw_enable(struct emac_p
  
        /* Enable MII */
        val = emac_read(EMAC_MACCONTROL);
 -      val |= (EMAC_MACCONTROL_MIIEN);
 +      val |= (EMAC_MACCONTROL_GMIIEN);
        emac_write(EMAC_MACCONTROL, val);
  
        /* Enable NAPI and interrupts */
@@@ -2217,7 -2221,7 +2217,7 @@@ void emac_poll_controller(struct net_de
        struct emac_priv *priv = netdev_priv(ndev);
  
        emac_int_disable(priv);
-       emac_irq(ndev->irq, priv);
+       emac_irq(ndev->irq, ndev);
        emac_int_enable(priv);
  }
  #endif
@@@ -2806,33 -2810,11 +2806,33 @@@ static int __devexit davinci_emac_remov
        return 0;
  }
  
 +static
 +int davinci_emac_suspend(struct platform_device *pdev, pm_message_t state)
 +{
 +      struct net_device *dev = platform_get_drvdata(pdev);
 +
 +      if (netif_running(dev))
 +              emac_dev_stop(dev);
 +
 +      clk_disable(emac_clk);
 +
 +      return 0;
 +}
 +
 +static int davinci_emac_resume(struct platform_device *pdev)
 +{
 +      struct net_device *dev = platform_get_drvdata(pdev);
 +
 +      clk_enable(emac_clk);
 +
 +      if (netif_running(dev))
 +              emac_dev_open(dev);
 +
 +      return 0;
 +}
 +
  /**
   * davinci_emac_driver: EMAC platform driver structure
 - *
 - * We implement only probe and remove functions - suspend/resume and
 - * others not supported by this module
   */
  static struct platform_driver davinci_emac_driver = {
        .driver = {
        },
        .probe = davinci_emac_probe,
        .remove = __devexit_p(davinci_emac_remove),
 +      .suspend = davinci_emac_suspend,
 +      .resume = davinci_emac_resume,
  };
  
  /**
diff --combined drivers/net/e100.c
@@@ -621,7 -621,6 +621,7 @@@ struct nic 
        u16 eeprom_wc;
        __le16 eeprom[256];
        spinlock_t mdio_lock;
 +      const struct firmware *fw;
  };
  
  static inline void e100_write_flush(struct nic *nic)
@@@ -1223,9 -1222,9 +1223,9 @@@ static void e100_configure(struct nic *
  static const struct firmware *e100_request_firmware(struct nic *nic)
  {
        const char *fw_name;
 -      const struct firmware *fw;
 +      const struct firmware *fw = nic->fw;
        u8 timer, bundle, min_size;
 -      int err;
 +      int err = 0;
  
        /* do not load u-code for ICH devices */
        if (nic->flags & ich)
        else /* No ucode on other devices */
                return NULL;
  
 -      err = request_firmware(&fw, fw_name, &nic->pdev->dev);
 +      /* If the firmware has not previously been loaded, request a pointer
 +       * to it. If it was previously loaded, we are reinitializing the
 +       * adapter, possibly in a resume from hibernate, in which case
 +       * request_firmware() cannot be used.
 +       */
 +      if (!fw)
 +              err = request_firmware(&fw, fw_name, &nic->pdev->dev);
 +
        if (err) {
                DPRINTK(PROBE, ERR, "Failed to load firmware \"%s\": %d\n",
                        fw_name, err);
                return ERR_PTR(err);
        }
 +
        /* Firmware should be precisely UCODE_SIZE (words) plus three bytes
           indicating the offsets for BUNDLESMALL, BUNDLEMAX, INTDELAY */
        if (fw->size != UCODE_SIZE * 4 + 3) {
                release_firmware(fw);
                return ERR_PTR(-EINVAL);
        }
 -      /* OK, firmware is validated and ready to use... */
 +
 +      /* OK, firmware is validated and ready to use. Save a pointer
 +       * to it in the nic */
 +      nic->fw = fw;
        return fw;
  }
  
@@@ -1438,19 -1426,31 +1438,31 @@@ static int e100_phy_init(struct nic *ni
        } else
                DPRINTK(HW, DEBUG, "phy_addr = %d\n", nic->mii.phy_id);
  
-       /* Isolate all the PHY ids */
-       for (addr = 0; addr < 32; addr++)
-               mdio_write(netdev, addr, MII_BMCR, BMCR_ISOLATE);
-       /* Select the discovered PHY */
-       bmcr &= ~BMCR_ISOLATE;
-       mdio_write(netdev, nic->mii.phy_id, MII_BMCR, bmcr);
        /* Get phy ID */
        id_lo = mdio_read(netdev, nic->mii.phy_id, MII_PHYSID1);
        id_hi = mdio_read(netdev, nic->mii.phy_id, MII_PHYSID2);
        nic->phy = (u32)id_hi << 16 | (u32)id_lo;
        DPRINTK(HW, DEBUG, "phy ID = 0x%08X\n", nic->phy);
  
+       /* Select the phy and isolate the rest */
+       for (addr = 0; addr < 32; addr++) {
+               if (addr != nic->mii.phy_id) {
+                       mdio_write(netdev, addr, MII_BMCR, BMCR_ISOLATE);
+               } else if (nic->phy != phy_82552_v) {
+                       bmcr = mdio_read(netdev, addr, MII_BMCR);
+                       mdio_write(netdev, addr, MII_BMCR,
+                               bmcr & ~BMCR_ISOLATE);
+               }
+       }
+       /*
+        * Workaround for 82552:
+        * Clear the ISOLATE bit on selected phy_id last (mirrored on all
+        * other phy_id's) using bmcr value from addr discovery loop above.
+        */
+       if (nic->phy == phy_82552_v)
+               mdio_write(netdev, nic->mii.phy_id, MII_BMCR,
+                       bmcr & ~BMCR_ISOLATE);
        /* Handle National tx phys */
  #define NCS_PHY_MODEL_MASK    0xFFF0FFFF
        if ((nic->phy & NCS_PHY_MODEL_MASK) == phy_nsc_tx) {
@@@ -1851,10 -1851,11 +1863,10 @@@ static inline void e100_start_receiver(
  #define RFD_BUF_LEN (sizeof(struct rfd) + VLAN_ETH_FRAME_LEN)
  static int e100_rx_alloc_skb(struct nic *nic, struct rx *rx)
  {
 -      if (!(rx->skb = netdev_alloc_skb(nic->netdev, RFD_BUF_LEN + NET_IP_ALIGN)))
 +      if (!(rx->skb = netdev_alloc_skb_ip_align(nic->netdev, RFD_BUF_LEN)))
                return -ENOMEM;
  
 -      /* Align, init, and map the RFD. */
 -      skb_reserve(rx->skb, NET_IP_ALIGN);
 +      /* Init, and map the RFD. */
        skb_copy_to_linear_data(rx->skb, &nic->blank_rfd, sizeof(struct rfd));
        rx->dma_addr = pci_map_single(nic->pdev, rx->skb->data,
                RFD_BUF_LEN, PCI_DMA_BIDIRECTIONAL);
@@@ -141,6 -141,20 +141,20 @@@ struct e1000_info
  #define HV_TNCRS_UPPER                PHY_REG(778, 29) /* Transmit with no CRS */
  #define HV_TNCRS_LOWER                PHY_REG(778, 30)
  
+ /* BM PHY Copper Specific Status */
+ #define BM_CS_STATUS                      17
+ #define BM_CS_STATUS_LINK_UP              0x0400
+ #define BM_CS_STATUS_RESOLVED             0x0800
+ #define BM_CS_STATUS_SPEED_MASK           0xC000
+ #define BM_CS_STATUS_SPEED_1000           0x8000
+ /* 82577 Mobile Phy Status Register */
+ #define HV_M_STATUS                       26
+ #define HV_M_STATUS_AUTONEG_COMPLETE      0x1000
+ #define HV_M_STATUS_SPEED_MASK            0x0300
+ #define HV_M_STATUS_SPEED_1000            0x0200
+ #define HV_M_STATUS_LINK_UP               0x0040
  enum e1000_boards {
        board_82571,
        board_82572,
@@@ -315,6 -329,7 +329,6 @@@ struct e1000_adapter 
        /* OS defined structs */
        struct net_device *netdev;
        struct pci_dev *pdev;
 -      struct net_device_stats net_stats;
  
        /* structs defined in e1000_hw.h */
        struct e1000_hw hw;
diff --combined drivers/net/r8169.c
@@@ -3379,7 -3379,7 +3379,7 @@@ static u16 rtl_rw_cpluscmd(void __iome
  static void rtl_set_rx_max_size(void __iomem *ioaddr, unsigned int rx_buf_sz)
  {
        /* Low hurts. Let's disable the filtering. */
-       RTL_W16(RxMaxSize, rx_buf_sz);
+       RTL_W16(RxMaxSize, rx_buf_sz + 1);
  }
  
  static void rtl8169_set_magic_reg(void __iomem *ioaddr, unsigned mac_version)
@@@ -4443,12 -4443,13 +4443,12 @@@ static inline bool rtl8169_try_rx_copy(
        if (pkt_size >= rx_copybreak)
                goto out;
  
 -      skb = netdev_alloc_skb(tp->dev, pkt_size + NET_IP_ALIGN);
 +      skb = netdev_alloc_skb_ip_align(tp->dev, pkt_size);
        if (!skb)
                goto out;
  
        pci_dma_sync_single_for_cpu(tp->pci_dev, addr, pkt_size,
                                    PCI_DMA_FROMDEVICE);
 -      skb_reserve(skb, NET_IP_ALIGN);
        skb_copy_from_linear_data(*sk_buff, skb->data, pkt_size);
        *sk_buff = skb;
        done = true;
diff --combined drivers/net/sky2.c
@@@ -50,7 -50,7 +50,7 @@@
  #include "sky2.h"
  
  #define DRV_NAME              "sky2"
 -#define DRV_VERSION           "1.25"
 +#define DRV_VERSION           "1.26"
  #define PFX                   DRV_NAME " "
  
  /*
@@@ -102,7 -102,6 +102,7 @@@ MODULE_PARM_DESC(disable_msi, "Disable 
  static DEFINE_PCI_DEVICE_TABLE(sky2_id_table) = {
        { PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, 0x9000) }, /* SK-9Sxx */
        { PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, 0x9E00) }, /* SK-9Exx */
 +      { PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, 0x9E01) }, /* SK-9E21M */
        { PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4b00) },    /* DGE-560T */
        { PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4001) },    /* DGE-550SX */
        { PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4B02) },    /* DGE-560SX */
        { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x436D) }, /* 88E8055 */
        { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4370) }, /* 88E8075 */
        { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4380) }, /* 88E8057 */
 +      { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4381) }, /* 88E8059 */
        { 0 }
  };
  
@@@ -604,16 -602,6 +604,16 @@@ static void sky2_phy_init(struct sky2_h
                /* apply workaround for integrated resistors calibration */
                gm_phy_write(hw, port, PHY_MARV_PAGE_ADDR, 17);
                gm_phy_write(hw, port, PHY_MARV_PAGE_DATA, 0x3f60);
 +      } else if (hw->chip_id == CHIP_ID_YUKON_OPT && hw->chip_rev == 0) {
 +              /* apply fixes in PHY AFE */
 +              gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 0x00ff);
 +
 +              /* apply RDAC termination workaround */
 +              gm_phy_write(hw, port, 24, 0x2800);
 +              gm_phy_write(hw, port, 23, 0x2001);
 +
 +              /* set page register back to 0 */
 +              gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 0);
        } else if (hw->chip_id != CHIP_ID_YUKON_EX &&
                   hw->chip_id < CHIP_ID_YUKON_SUPR) {
                /* no effect on Yukon-XL */
@@@ -798,7 -786,8 +798,7 @@@ static void sky2_set_tx_stfwd(struct sk
  
        if ( (hw->chip_id == CHIP_ID_YUKON_EX &&
              hw->chip_rev != CHIP_REV_YU_EX_A0) ||
 -           hw->chip_id == CHIP_ID_YUKON_FE_P ||
 -           hw->chip_id == CHIP_ID_YUKON_SUPR) {
 +           hw->chip_id >= CHIP_ID_YUKON_FE_P) {
                /* Yukon-Extreme B0 and further Extreme devices */
                /* enable Store & Forward mode for TX */
  
@@@ -936,14 -925,8 +936,14 @@@ static void sky2_mac_init(struct sky2_h
  
        /* On chips without ram buffer, pause is controled by MAC level */
        if (!(hw->flags & SKY2_HW_RAM_BUFFER)) {
 -              sky2_write8(hw, SK_REG(port, RX_GMF_LP_THR), 768/8);
 -              sky2_write8(hw, SK_REG(port, RX_GMF_UP_THR), 1024/8);
 +              /* Pause threshold is scaled by 8 in bytes */
 +              if (hw->chip_id == CHIP_ID_YUKON_FE_P
 +                      && hw->chip_rev == CHIP_REV_YU_FE2_A0)
 +                      reg = 1568 / 8;
 +              else
 +                      reg = 1024 / 8;
 +              sky2_write16(hw, SK_REG(port, RX_GMF_UP_THR), reg);
 +              sky2_write16(hw, SK_REG(port, RX_GMF_LP_THR), 768 / 8);
  
                sky2_set_tx_stfwd(hw, port);
        }
@@@ -1414,31 -1397,6 +1414,31 @@@ static int sky2_rx_start(struct sky2_po
  
        /* Tell chip about available buffers */
        sky2_rx_update(sky2, rxq);
 +
 +      if (hw->chip_id == CHIP_ID_YUKON_EX ||
 +          hw->chip_id == CHIP_ID_YUKON_SUPR) {
 +              /*
 +               * Disable flushing of non ASF packets;
 +               * must be done after initializing the BMUs;
 +               * drivers without ASF support should do this too, otherwise
 +               * it may happen that they cannot run on ASF devices;
 +               * remember that the MAC FIFO isn't reset during initialization.
 +               */
 +              sky2_write32(hw, SK_REG(sky2->port, RX_GMF_CTRL_T), RX_MACSEC_FLUSH_OFF);
 +      }
 +
 +      if (hw->chip_id >= CHIP_ID_YUKON_SUPR) {
 +              /* Enable RX Home Address & Routing Header checksum fix */
 +              sky2_write16(hw, SK_REG(sky2->port, RX_GMF_FL_CTRL),
 +                           RX_IPV6_SA_MOB_ENA | RX_IPV6_DA_MOB_ENA);
 +
 +              /* Enable TX Home Address & Routing Header checksum fix */
 +              sky2_write32(hw, Q_ADDR(txqaddr[sky2->port], Q_TEST),
 +                           TBMU_TEST_HOME_ADD_FIX_EN | TBMU_TEST_ROUTING_ADD_FIX_EN);
 +      }
 +
 +
 +
        return 0;
  nomem:
        sky2_rx_clean(sky2);
        spin_unlock(&sky2->phy_lock);
  }
  
 +/* Special quick link interrupt (Yukon-2 Optima only) */
 +static void sky2_qlink_intr(struct sky2_hw *hw)
 +{
 +      struct sky2_port *sky2 = netdev_priv(hw->dev[0]);
 +      u32 imask;
 +      u16 phy;
 +
 +      /* disable irq */
 +      imask = sky2_read32(hw, B0_IMSK);
 +      imask &= ~Y2_IS_PHY_QLNK;
 +      sky2_write32(hw, B0_IMSK, imask);
 +
 +      /* reset PHY Link Detect */
 +      phy = sky2_pci_read16(hw, PSM_CONFIG_REG4);
 +      sky2_pci_write16(hw, PSM_CONFIG_REG4, phy | 1);
 +
 +      sky2_link_up(sky2);
 +}
 +
  /* Transmit timeout is only called if we are running, carrier is up
   * and tx queue is full (stopped).
   */
@@@ -2252,8 -2191,9 +2252,8 @@@ static struct sk_buff *receive_copy(str
  {
        struct sk_buff *skb;
  
 -      skb = netdev_alloc_skb(sky2->netdev, length + 2);
 +      skb = netdev_alloc_skb_ip_align(sky2->netdev, length);
        if (likely(skb)) {
 -              skb_reserve(skb, 2);
                pci_dma_sync_single_for_cpu(sky2->hw->pdev, re->data_addr,
                                            length, PCI_DMA_FROMDEVICE);
                skb_copy_from_linear_data(re->skb, skb->data, length);
@@@ -2826,9 -2766,6 +2826,9 @@@ static int sky2_poll(struct napi_struc
        if (status & Y2_IS_IRQ_PHY2)
                sky2_phy_intr(hw, 1);
  
 +      if (status & Y2_IS_PHY_QLNK)
 +              sky2_qlink_intr(hw);
 +
        while ((idx = sky2_read16(hw, STAT_PUT_IDX)) != hw->st_idx) {
                work_done += sky2_status_intr(hw, work_limit - work_done, idx);
  
@@@ -2878,7 -2815,6 +2878,7 @@@ static u32 sky2_mhz(const struct sky2_h
        case CHIP_ID_YUKON_EX:
        case CHIP_ID_YUKON_SUPR:
        case CHIP_ID_YUKON_UL_2:
 +      case CHIP_ID_YUKON_OPT:
                return 125;
  
        case CHIP_ID_YUKON_FE:
@@@ -2968,7 -2904,6 +2968,7 @@@ static int __devinit sky2_init(struct s
                break;
  
        case CHIP_ID_YUKON_UL_2:
 +      case CHIP_ID_YUKON_OPT:
                hw->flags = SKY2_HW_GIGABIT
                        | SKY2_HW_ADV_POWER_CTL;
                break;
@@@ -3051,52 -2986,6 +3051,52 @@@ static void sky2_reset(struct sky2_hw *
                        sky2_write16(hw, SK_REG(i, GMAC_CTRL),
                                     GMC_BYP_MACSECRX_ON | GMC_BYP_MACSECTX_ON
                                     | GMC_BYP_RETR_ON);
 +
 +      }
 +
 +      if (hw->chip_id == CHIP_ID_YUKON_SUPR && hw->chip_rev > CHIP_REV_YU_SU_B0) {
 +              /* enable MACSec clock gating */
 +              sky2_pci_write32(hw, PCI_DEV_REG3, P_CLK_MACSEC_DIS);
 +      }
 +
 +      if (hw->chip_id == CHIP_ID_YUKON_OPT) {
 +              u16 reg;
 +              u32 msk;
 +
 +              if (hw->chip_rev == 0) {
 +                      /* disable PCI-E PHY power down (set PHY reg 0x80, bit 7 */
 +                      sky2_write32(hw, Y2_PEX_PHY_DATA, (0x80UL << 16) | (1 << 7));
 +
 +                      /* set PHY Link Detect Timer to 1.1 second (11x 100ms) */
 +                      reg = 10;
 +              } else {
 +                      /* set PHY Link Detect Timer to 0.4 second (4x 100ms) */
 +                      reg = 3;
 +              }
 +
 +              reg <<= PSM_CONFIG_REG4_TIMER_PHY_LINK_DETECT_BASE;
 +
 +              /* reset PHY Link Detect */
 +              sky2_pci_write16(hw, PSM_CONFIG_REG4,
 +                               reg | PSM_CONFIG_REG4_RST_PHY_LINK_DETECT);
 +              sky2_pci_write16(hw, PSM_CONFIG_REG4, reg);
 +
 +
 +              /* enable PHY Quick Link */
 +              msk = sky2_read32(hw, B0_IMSK);
 +              msk |= Y2_IS_PHY_QLNK;
 +              sky2_write32(hw, B0_IMSK, msk);
 +
 +              /* check if PSMv2 was running before */
 +              reg = sky2_pci_read16(hw, PSM_CONFIG_REG3);
 +              if (reg & PCI_EXP_LNKCTL_ASPMC) {
 +                      int cap = pci_find_capability(pdev, PCI_CAP_ID_EXP);
 +                      /* restore the PCIe Link Control register */
 +                      sky2_pci_write16(hw, cap + PCI_EXP_LNKCTL, reg);
 +              }
 +
 +              /* re-enable PEX PM in PEX PHY debug reg. 8 (clear bit 12) */
 +              sky2_write32(hw, Y2_PEX_PHY_DATA, PEX_DB_ACCESS | (0x08UL << 16));
        }
  
        /* Clear I2C IRQ noise */
@@@ -4517,11 -4406,9 +4517,11 @@@ static const char *sky2_name(u8 chipid
                "FE+",          /* 0xb8 */
                "Supreme",      /* 0xb9 */
                "UL 2",         /* 0xba */
 +              "Unknown",      /* 0xbb */
 +              "Optima",       /* 0xbc */
        };
  
 -      if (chipid >= CHIP_ID_YUKON_XL && chipid < CHIP_ID_YUKON_UL_2)
 +      if (chipid >= CHIP_ID_YUKON_XL && chipid < CHIP_ID_YUKON_OPT)
                strncpy(buf, name[chipid - CHIP_ID_YUKON_XL], sz);
        else
                snprintf(buf, sz, "(chip %#x)", chipid);
@@@ -4651,6 -4538,8 +4651,8 @@@ static int __devinit sky2_probe(struct 
                goto err_out_free_netdev;
        }
  
+       netif_carrier_off(dev);
        netif_napi_add(dev, &hw->napi, sky2_poll, NAPI_WEIGHT);
  
        err = request_irq(pdev->irq, sky2_intr,
@@@ -420,14 -420,6 +420,14 @@@ static const struct driver_info  cdc_inf
        .status =       cdc_status,
  };
  
 +static const struct driver_info mbm_info = {
 +      .description =  "Mobile Broadband Network Device",
 +      .flags =        FLAG_WWAN,
 +      .bind =         cdc_bind,
 +      .unbind =       usbnet_cdc_unbind,
 +      .status =       cdc_status,
 +};
 +
  /*-------------------------------------------------------------------------*/
  
  
@@@ -540,32 -532,72 +540,72 @@@ static const struct usb_device_id       produ
        /* Ericsson F3507g */
        USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1900, USB_CLASS_COMM,
                        USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
 -      .driver_info = (unsigned long) &cdc_info,
 +      .driver_info = (unsigned long) &mbm_info,
  }, {
        /* Ericsson F3507g ver. 2 */
        USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1902, USB_CLASS_COMM,
                        USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
 -      .driver_info = (unsigned long) &cdc_info,
 +      .driver_info = (unsigned long) &mbm_info,
  }, {
        /* Ericsson F3607gw */
        USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1904, USB_CLASS_COMM,
                        USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
 -      .driver_info = (unsigned long) &cdc_info,
 +      .driver_info = (unsigned long) &mbm_info,
  }, {
-       /* Ericsson F3307 */
+       /* Ericsson F3607gw ver 2 */
+       USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1905, USB_CLASS_COMM,
+                       USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
 -      .driver_info = (unsigned long) &cdc_info,
++      .driver_info = (unsigned long) &mbm_info,
+ }, {
+       /* Ericsson F3607gw ver 3 */
        USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1906, USB_CLASS_COMM,
                        USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
 -      .driver_info = (unsigned long) &cdc_info,
 +      .driver_info = (unsigned long) &mbm_info,
  }, {
+       /* Ericsson F3307 */
+       USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x190a, USB_CLASS_COMM,
+                       USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
 -      .driver_info = (unsigned long) &cdc_info,
++      .driver_info = (unsigned long) &mbm_info,
+ }, {
+       /* Ericsson F3307 ver 2 */
+       USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1909, USB_CLASS_COMM,
+                       USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
 -      .driver_info = (unsigned long) &cdc_info,
++      .driver_info = (unsigned long) &mbm_info,
+ }, {
+       /* Ericsson C3607w */
+       USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1049, USB_CLASS_COMM,
+                       USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
 -      .driver_info = (unsigned long) &cdc_info,
++      .driver_info = (unsigned long) &mbm_info,
+ }, {
        /* Toshiba F3507g */
        USB_DEVICE_AND_INTERFACE_INFO(0x0930, 0x130b, USB_CLASS_COMM,
                        USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
 -      .driver_info = (unsigned long) &cdc_info,
 +      .driver_info = (unsigned long) &mbm_info,
  }, {
+       /* Toshiba F3607gw */
+       USB_DEVICE_AND_INTERFACE_INFO(0x0930, 0x130c, USB_CLASS_COMM,
+                       USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
 -      .driver_info = (unsigned long) &cdc_info,
++      .driver_info = (unsigned long) &mbm_info,
+ }, {
+       /* Toshiba F3607gw ver 2 */
+       USB_DEVICE_AND_INTERFACE_INFO(0x0930, 0x1311, USB_CLASS_COMM,
+                       USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
 -      .driver_info = (unsigned long) &cdc_info,
++      .driver_info = (unsigned long) &mbm_info,
+ }, {
        /* Dell F3507g */
        USB_DEVICE_AND_INTERFACE_INFO(0x413c, 0x8147, USB_CLASS_COMM,
                        USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
 -      .driver_info = (unsigned long) &cdc_info,
 +      .driver_info = (unsigned long) &mbm_info,
+ }, {
+       /* Dell F3607gw */
+       USB_DEVICE_AND_INTERFACE_INFO(0x413c, 0x8183, USB_CLASS_COMM,
+                       USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
 -      .driver_info = (unsigned long) &cdc_info,
++      .driver_info = (unsigned long) &mbm_info,
+ }, {
+       /* Dell F3607gw ver 2 */
+       USB_DEVICE_AND_INTERFACE_INFO(0x413c, 0x8184, USB_CLASS_COMM,
+                       USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
 -      .driver_info = (unsigned long) &cdc_info,
++      .driver_info = (unsigned long) &mbm_info,
  },
        { },            // END
  };
diff --combined drivers/net/virtio_net.c
@@@ -283,12 -283,13 +283,12 @@@ static bool try_fill_recv_maxbufs(struc
        do {
                struct skb_vnet_hdr *hdr;
  
 -              skb = netdev_alloc_skb(vi->dev, MAX_PACKET_LEN + NET_IP_ALIGN);
 +              skb = netdev_alloc_skb_ip_align(vi->dev, MAX_PACKET_LEN);
                if (unlikely(!skb)) {
                        oom = true;
                        break;
                }
  
 -              skb_reserve(skb, NET_IP_ALIGN);
                skb_put(skb, MAX_PACKET_LEN);
  
                hdr = skb_vnet_hdr(skb);
@@@ -343,12 -344,14 +343,12 @@@ static bool try_fill_recv(struct virtne
        do {
                skb_frag_t *f;
  
 -              skb = netdev_alloc_skb(vi->dev, GOOD_COPY_LEN + NET_IP_ALIGN);
 +              skb = netdev_alloc_skb_ip_align(vi->dev, GOOD_COPY_LEN);
                if (unlikely(!skb)) {
                        oom = true;
                        break;
                }
  
 -              skb_reserve(skb, NET_IP_ALIGN);
 -
                f = &skb_shinfo(skb)->frags[0];
                f->page = get_a_page(vi, gfp);
                if (!f->page) {
@@@ -996,7 -999,7 +996,7 @@@ static unsigned int features[] = 
        VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN,
  };
  
- static struct virtio_driver virtio_net = {
+ static struct virtio_driver virtio_net_driver = {
        .feature_table = features,
        .feature_table_size = ARRAY_SIZE(features),
        .driver.name =  KBUILD_MODNAME,
  
  static int __init init(void)
  {
-       return register_virtio_driver(&virtio_net);
+       return register_virtio_driver(&virtio_net_driver);
  }
  
  static void __exit fini(void)
  {
-       unregister_virtio_driver(&virtio_net);
+       unregister_virtio_driver(&virtio_net_driver);
  }
  module_init(init);
  module_exit(fini);
@@@ -425,7 -425,7 +425,7 @@@ static void ath_rc_init_valid_txmask(st
  static inline void ath_rc_set_valid_txmask(struct ath_rate_priv *ath_rc_priv,
                                           u8 index, int valid_tx_rate)
  {
 -      ASSERT(index <= ath_rc_priv->rate_table_size);
 +      BUG_ON(index > ath_rc_priv->rate_table_size);
        ath_rc_priv->valid_rate_index[index] = valid_tx_rate ? 1 : 0;
  }
  
@@@ -679,7 -679,7 +679,7 @@@ static u8 ath_rc_get_highest_rix(struc
                return rate;
  
        if (rate_table->info[rate].valid_single_stream &&
-           !(ath_rc_priv->ht_cap & WLAN_RC_DS_FLAG));
+           !(ath_rc_priv->ht_cap & WLAN_RC_DS_FLAG))
                return rate;
  
        /* This should not happen */
@@@ -1160,7 -1160,6 +1160,7 @@@ struct ath_rate_table *ath_choose_rate_
                                             bool is_cw_40)
  {
        int mode = 0;
 +      struct ath_common *common = ath9k_hw_common(sc->sc_ah);
  
        switch(band) {
        case IEEE80211_BAND_2GHZ:
                        mode = ATH9K_MODE_11NA_HT40PLUS;
                break;
        default:
 -              DPRINTF(sc, ATH_DBG_CONFIG, "Invalid band\n");
 +              ath_print(common, ATH_DBG_CONFIG, "Invalid band\n");
                return NULL;
        }
  
        BUG_ON(mode >= ATH9K_MODE_MAX);
  
 -      DPRINTF(sc, ATH_DBG_CONFIG, "Choosing rate table for mode: %d\n", mode);
 +      ath_print(common, ATH_DBG_CONFIG,
 +                "Choosing rate table for mode: %d\n", mode);
        return sc->hw_rate_table[mode];
  }
  
@@@ -1196,13 -1194,11 +1196,13 @@@ static void ath_rc_init(struct ath_soft
                        const struct ath_rate_table *rate_table)
  {
        struct ath_rateset *rateset = &ath_rc_priv->neg_rates;
 +      struct ath_common *common = ath9k_hw_common(sc->sc_ah);
        u8 *ht_mcs = (u8 *)&ath_rc_priv->neg_ht_rates;
        u8 i, j, k, hi = 0, hthi = 0;
  
        if (!rate_table) {
 -              DPRINTF(sc, ATH_DBG_FATAL, "Rate table not initialized\n");
 +              ath_print(common, ATH_DBG_FATAL,
 +                        "Rate table not initialized\n");
                return;
        }
  
  
        ath_rc_priv->rate_table_size = hi + 1;
        ath_rc_priv->rate_max_phy = 0;
 -      ASSERT(ath_rc_priv->rate_table_size <= RATE_TABLE_SIZE);
 +      BUG_ON(ath_rc_priv->rate_table_size > RATE_TABLE_SIZE);
  
        for (i = 0, k = 0; i < WLAN_RC_PHY_MAX; i++) {
                for (j = 0; j < ath_rc_priv->valid_phy_ratecnt[i]; j++) {
  
                ath_rc_priv->rate_max_phy = ath_rc_priv->valid_phy_rateidx[i][j-1];
        }
 -      ASSERT(ath_rc_priv->rate_table_size <= RATE_TABLE_SIZE);
 -      ASSERT(k <= RATE_TABLE_SIZE);
 +      BUG_ON(ath_rc_priv->rate_table_size > RATE_TABLE_SIZE);
 +      BUG_ON(k > RATE_TABLE_SIZE);
  
        ath_rc_priv->max_valid_rate = k;
        ath_rc_sort_validrates(rate_table, ath_rc_priv);
        ath_rc_priv->rate_max_phy = ath_rc_priv->valid_rate_index[k-4];
        sc->cur_rate_table = rate_table;
  
 -      DPRINTF(sc, ATH_DBG_CONFIG, "RC Initialized with capabilities: 0x%x\n",
 -              ath_rc_priv->ht_cap);
 +      ath_print(common, ATH_DBG_CONFIG,
 +                "RC Initialized with capabilities: 0x%x\n",
 +                ath_rc_priv->ht_cap);
  }
  
  static u8 ath_rc_build_ht_caps(struct ath_softc *sc, struct ieee80211_sta *sta,
@@@ -1443,9 -1438,9 +1443,9 @@@ static void ath_rate_update(void *priv
                                                   oper_cw40, oper_sgi40);
                        ath_rc_init(sc, priv_sta, sband, sta, rate_table);
  
 -                      DPRINTF(sc, ATH_DBG_CONFIG,
 -                              "Operating HT Bandwidth changed to: %d\n",
 -                              sc->hw->conf.channel_type);
 +                      ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_CONFIG,
 +                                "Operating HT Bandwidth changed to: %d\n",
 +                                sc->hw->conf.channel_type);
                }
        }
  }
@@@ -1468,8 -1463,8 +1468,8 @@@ static void *ath_rate_alloc_sta(void *p
  
        rate_priv = kzalloc(sizeof(struct ath_rate_priv), gfp);
        if (!rate_priv) {
 -              DPRINTF(sc, ATH_DBG_FATAL,
 -                      "Unable to allocate private rc structure\n");
 +              ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_FATAL,
 +                        "Unable to allocate private rc structure\n");
                return NULL;
        }
  
@@@ -11275,7 -11275,6 +11275,7 @@@ static int ipw_up(struct ipw_priv *priv
                if (!(priv->config & CFG_CUSTOM_MAC))
                        eeprom_parse_mac(priv, priv->mac_addr);
                memcpy(priv->net_dev->dev_addr, priv->mac_addr, ETH_ALEN);
 +              memcpy(priv->net_dev->perm_addr, priv->mac_addr, ETH_ALEN);
  
                for (j = 0; j < ARRAY_SIZE(ipw_geos); j++) {
                        if (!memcmp(&priv->eeprom[EEPROM_COUNTRY_CODE],
@@@ -11822,6 -11821,7 +11822,7 @@@ static int __devinit ipw_pci_probe(stru
                if (err) {
                        IPW_ERROR("Failed to register promiscuous network "
                                  "device (error %d).\n", err);
+                       unregister_ieee80211(priv->ieee);
                        unregister_netdev(priv->net_dev);
                        goto out_remove_sysfs;
                }
@@@ -11872,6 -11872,7 +11873,7 @@@ static void __devexit ipw_pci_remove(st
  
        mutex_unlock(&priv->mutex);
  
+       unregister_ieee80211(priv->ieee);
        unregister_netdev(priv->net_dev);
  
        if (priv->rxq) {
@@@ -300,9 -300,6 +300,9 @@@ static int if_usb_probe(struct usb_inte
        cardp->priv->fw_ready = 1;
  
        priv->hw_host_to_card = if_usb_host_to_card;
 +      priv->enter_deep_sleep = NULL;
 +      priv->exit_deep_sleep = NULL;
 +      priv->reset_deep_sleep_wakeup = NULL;
  #ifdef CONFIG_OLPC
        if (machine_is_olpc())
                priv->reset_card = if_usb_reset_olpc_card;
@@@ -511,7 -508,7 +511,7 @@@ static int __if_usb_submit_rx_urb(struc
        /* Fill the receive configuration URB and initialise the Rx call back */
        usb_fill_bulk_urb(cardp->rx_urb, cardp->udev,
                          usb_rcvbulkpipe(cardp->udev, cardp->ep_in),
-                         (void *) (skb->tail + (size_t) IPFIELD_ALIGN_OFFSET),
+                         skb->data + IPFIELD_ALIGN_OFFSET,
                          MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn,
                          cardp);
  
diff --combined firmware/Makefile
@@@ -32,7 -32,7 +32,7 @@@ fw-shipped-$(CONFIG_ADAPTEC_STARFIRE) +
                                         adaptec/starfire_tx.bin
  fw-shipped-$(CONFIG_ATARI_DSP56K) += dsp56k/bootstrap.bin
  fw-shipped-$(CONFIG_ATM_AMBASSADOR) += atmsar11.fw
 -fw-shipped-$(CONFIG_BNX2X) += bnx2x-e1-5.0.21.0.fw bnx2x-e1h-5.0.21.0.fw
 +fw-shipped-$(CONFIG_BNX2X) += bnx2x-e1-5.2.7.0.fw bnx2x-e1h-5.2.7.0.fw
  fw-shipped-$(CONFIG_BNX2) += bnx2/bnx2-mips-09-5.0.0.j3.fw \
                             bnx2/bnx2-rv2p-09-5.0.0.j3.fw \
                             bnx2/bnx2-rv2p-09ax-5.0.0.j3.fw \
@@@ -69,11 -69,13 +69,13 @@@ fw-shipped-$(CONFIG_E100) += e100/d101m
  fw-shipped-$(CONFIG_MYRI_SBUS) += myricom/lanai.bin
  fw-shipped-$(CONFIG_PCMCIA_PCNET) += cis/LA-PCM.cis cis/PCMLM28.cis \
                                     cis/DP83903.cis cis/NE2K.cis \
-                                    cis/tamarack.cis
+                                    cis/tamarack.cis cis/PE-200.cis
  fw-shipped-$(CONFIG_PCMCIA_3C589) += cis/3CXEM556.cis
  fw-shipped-$(CONFIG_PCMCIA_3C574) += cis/3CCFEM556.cis
  fw-shipped-$(CONFIG_SERIAL_8250_CS) += cis/MT5634ZLX.cis cis/RS-COM-2P.cis \
-                                      cis/COMpad2.cis cis/COMpad4.cis
+                                      cis/COMpad2.cis cis/COMpad4.cis \
+                                      cis/SW_555_SER.cis cis/SW_7xx_SER.cis \
+                                      cis/SW_8xx_SER.cis
  fw-shipped-$(CONFIG_PCMCIA_SMC91C92) += ositech/Xilinx7OD.bin
  fw-shipped-$(CONFIG_SCSI_ADVANSYS) += advansys/mcode.bin advansys/38C1600.bin \
                                      advansys/3550.bin advansys/38C0800.bin
diff --combined firmware/WHENCE
@@@ -600,6 -600,7 +600,7 @@@ File: cis/LA-PCM.ci
        cis/DP83903.cis
        cis/NE2K.cis
        cis/tamarack.cis
+       cis/PE-200.cis
  
  Licence: GPL
  
@@@ -633,6 -634,9 +634,9 @@@ File: cis/MT5634ZLX.ci
        cis/RS-COM-2P.cis
        cis/COMpad2.cis
        cis/COMpad4.cis
+       cis/SW_555_SER.cis
+       cis/SW_7xx_SER.cis
+       cis/SW_8xx_SER.cis
  
  Licence: GPL
  
@@@ -674,8 -678,8 +678,8 @@@ Found in hex form in kernel source
  
  Driver: bnx2x: Broadcom Everest
  
 -File: bnx2x-e1-4.8.53.0.fw.ihex
 -File: bnx2x-e1h-4.8.53.0.fw.ihex
 +File: bnx2x-e1-5.2.7.0.fw.ihex
 +File: bnx2x-e1h-5.2.7.0.fw.ihex
  
  License:
    Copyright (c) 2007-2009 Broadcom Corporation
diff --combined include/linux/skbuff.h
@@@ -354,8 -354,8 +354,8 @@@ struct sk_buff 
                                ipvs_property:1,
                                peeked:1,
                                nf_trace:1;
+       __be16                  protocol:16;
        kmemcheck_bitfield_end(flags1);
-       __be16                  protocol;
  
        void                    (*destructor)(struct sk_buff *skb);
  #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
  #endif
  
        int                     iif;
-       __u16                   queue_mapping;
  #ifdef CONFIG_NET_SCHED
        __u16                   tc_index;       /* traffic control index */
  #ifdef CONFIG_NET_CLS_ACT
  #endif
  
        kmemcheck_bitfield_begin(flags2);
+       __u16                   queue_mapping:16;
  #ifdef CONFIG_IPV6_NDISC_NODETYPE
        __u8                    ndisc_nodetype:2;
  #endif
  #ifdef CONFIG_NETWORK_SECMARK
        __u32                   secmark;
  #endif
 -
 -      __u32                   mark;
 +      union {
 +              __u32           mark;
 +              __u32           dropcount;
 +      };
  
        __u16                   vlan_tci;
  
@@@ -491,7 -489,8 +491,7 @@@ extern int skb_append_datato_frags(stru
                        int len,int odd, struct sk_buff *skb),
                        void *from, int length);
  
 -struct skb_seq_state
 -{
 +struct skb_seq_state {
        __u32           lower_offset;
        __u32           upper_offset;
        __u32           frag_idx;
@@@ -1490,16 -1489,6 +1490,16 @@@ static inline struct sk_buff *netdev_al
        return __netdev_alloc_skb(dev, length, GFP_ATOMIC);
  }
  
 +static inline struct sk_buff *netdev_alloc_skb_ip_align(struct net_device *dev,
 +              unsigned int length)
 +{
 +      struct sk_buff *skb = netdev_alloc_skb(dev, length + NET_IP_ALIGN);
 +
 +      if (NET_IP_ALIGN && skb)
 +              skb_reserve(skb, NET_IP_ALIGN);
 +      return skb;
 +}
 +
  extern struct page *__netdev_alloc_page(struct net_device *dev, gfp_t gfp_mask);
  
  /**
@@@ -1768,6 -1757,8 +1768,8 @@@ extern int             skb_copy_datagram_con
                                                     int to_offset,
                                                     int size);
  extern void          skb_free_datagram(struct sock *sk, struct sk_buff *skb);
+ extern void          skb_free_datagram_locked(struct sock *sk,
+                                               struct sk_buff *skb);
  extern int           skb_kill_datagram(struct sock *sk, struct sk_buff *skb,
                                         unsigned int flags);
  extern __wsum        skb_checksum(const struct sk_buff *skb, int offset,
diff --combined include/net/ip_fib.h
@@@ -144,21 -144,18 +144,21 @@@ struct fib_table 
        struct hlist_node tb_hlist;
        u32             tb_id;
        int             tb_default;
        unsigned char   tb_data[0];
  };
  
 +extern int fib_table_lookup(struct fib_table *tb, const struct flowi *flp,
 +                          struct fib_result *res);
 +extern int fib_table_insert(struct fib_table *, struct fib_config *);
 +extern int fib_table_delete(struct fib_table *, struct fib_config *);
 +extern int fib_table_dump(struct fib_table *table, struct sk_buff *skb,
 +                        struct netlink_callback *cb);
 +extern int fib_table_flush(struct fib_table *table);
 +extern void fib_table_select_default(struct fib_table *table,
 +                                   const struct flowi *flp,
 +                                   struct fib_result *res);
 +
 +
  #ifndef CONFIG_IP_MULTIPLE_TABLES
  
  #define TABLE_LOCAL_INDEX     0
@@@ -185,11 -182,11 +185,11 @@@ static inline int fib_lookup(struct ne
        struct fib_table *table;
  
        table = fib_get_table(net, RT_TABLE_LOCAL);
 -      if (!table->tb_lookup(table, flp, res))
 +      if (!fib_table_lookup(table, flp, res))
                return 0;
  
        table = fib_get_table(net, RT_TABLE_MAIN);
 -      if (!table->tb_lookup(table, flp, res))
 +      if (!fib_table_lookup(table, flp, res))
                return 0;
        return -ENETUNREACH;
  }
@@@ -213,7 -210,8 +213,8 @@@ extern struct fib_table *fib_get_table(
  extern const struct nla_policy rtm_ipv4_policy[];
  extern void           ip_fib_init(void);
  extern int fib_validate_source(__be32 src, __be32 dst, u8 tos, int oif,
-                              struct net_device *dev, __be32 *spec_dst, u32 *itag);
+                              struct net_device *dev, __be32 *spec_dst,
+                              u32 *itag, u32 mark);
  extern void fib_select_default(struct net *net, const struct flowi *flp,
                               struct fib_result *res);
  
diff --combined net/bridge/br_if.c
@@@ -154,7 -154,7 +154,7 @@@ static void del_nbp(struct net_bridge_p
  }
  
  /* called with RTNL */
 -static void del_br(struct net_bridge *br)
 +static void del_br(struct net_bridge *br, struct list_head *head)
  {
        struct net_bridge_port *p, *n;
  
        del_timer_sync(&br->gc_timer);
  
        br_sysfs_delbr(br->dev);
 -      unregister_netdevice(br->dev);
 +      unregister_netdevice_queue(br->dev, head);
  }
  
  static struct net_device *new_bridge_dev(struct net *net, const char *name)
@@@ -323,7 -323,7 +323,7 @@@ int br_del_bridge(struct net *net, cons
        }
  
        else
 -              del_br(netdev_priv(dev));
 +              del_br(netdev_priv(dev), NULL);
  
        rtnl_unlock();
        return ret;
@@@ -377,12 -377,16 +377,16 @@@ int br_add_if(struct net_bridge *br, st
        struct net_bridge_port *p;
        int err = 0;
  
-       if (dev->flags & IFF_LOOPBACK || dev->type != ARPHRD_ETHER)
+       /* Don't allow bridging non-ethernet like devices */
+       if ((dev->flags & IFF_LOOPBACK) ||
+           dev->type != ARPHRD_ETHER || dev->addr_len != ETH_ALEN)
                return -EINVAL;
  
+       /* No bridging of bridges */
        if (dev->netdev_ops->ndo_start_xmit == br_dev_xmit)
                return -ELOOP;
  
+       /* Device is already being bridged */
        if (dev->br_port != NULL)
                return -EBUSY;
  
@@@ -462,14 -466,15 +466,14 @@@ int br_del_if(struct net_bridge *br, st
  void br_net_exit(struct net *net)
  {
        struct net_device *dev;
 +      LIST_HEAD(list);
  
        rtnl_lock();
 -restart:
 -      for_each_netdev(net, dev) {
 -              if (dev->priv_flags & IFF_EBRIDGE) {
 -                      del_br(netdev_priv(dev));
 -                      goto restart;
 -              }
 -      }
 +      for_each_netdev(net, dev)
 +              if (dev->priv_flags & IFF_EBRIDGE)
 +                      del_br(netdev_priv(dev), &list);
 +
 +      unregister_netdevice_many(&list);
        rtnl_unlock();
  
  }
diff --combined net/core/datagram.c
@@@ -224,6 -224,15 +224,15 @@@ void skb_free_datagram(struct sock *sk
        consume_skb(skb);
        sk_mem_reclaim_partial(sk);
  }
+ EXPORT_SYMBOL(skb_free_datagram);
+ void skb_free_datagram_locked(struct sock *sk, struct sk_buff *skb)
+ {
+       lock_sock(sk);
+       skb_free_datagram(sk, skb);
+       release_sock(sk);
+ }
+ EXPORT_SYMBOL(skb_free_datagram_locked);
  
  /**
   *    skb_kill_datagram - Free a datagram skbuff forcibly
@@@ -262,7 -271,6 +271,7 @@@ int skb_kill_datagram(struct sock *sk, 
        }
  
        kfree_skb(skb);
 +      atomic_inc(&sk->sk_drops);
        sk_mem_reclaim_partial(sk);
  
        return err;
@@@ -753,5 -761,4 +762,4 @@@ unsigned int datagram_poll(struct file 
  EXPORT_SYMBOL(datagram_poll);
  EXPORT_SYMBOL(skb_copy_and_csum_datagram_iovec);
  EXPORT_SYMBOL(skb_copy_datagram_iovec);
- EXPORT_SYMBOL(skb_free_datagram);
  EXPORT_SYMBOL(skb_recv_datagram);
diff --combined net/ipv4/fib_frontend.c
@@@ -125,7 -125,7 +125,7 @@@ void fib_select_default(struct net *net
  #endif
        tb = fib_get_table(net, table);
        if (FIB_RES_GW(*res) && FIB_RES_NH(*res).nh_scope == RT_SCOPE_LINK)
 -              tb->tb_select_default(tb, flp, res);
 +              fib_table_select_default(tb, flp, res);
  }
  
  static void fib_flush(struct net *net)
        for (h = 0; h < FIB_TABLE_HASHSZ; h++) {
                head = &net->ipv4.fib_table_hash[h];
                hlist_for_each_entry(tb, node, head, tb_hlist)
 -                      flushed += tb->tb_flush(tb);
 +                      flushed += fib_table_flush(tb);
        }
  
        if (flushed)
@@@ -162,7 -162,7 +162,7 @@@ struct net_device * ip_dev_find(struct 
  #endif
  
        local_table = fib_get_table(net, RT_TABLE_LOCAL);
 -      if (!local_table || local_table->tb_lookup(local_table, &fl, &res))
 +      if (!local_table || fib_table_lookup(local_table, &fl, &res))
                return NULL;
        if (res.type != RTN_LOCAL)
                goto out;
@@@ -200,7 -200,7 +200,7 @@@ static inline unsigned __inet_dev_addr_
        local_table = fib_get_table(net, RT_TABLE_LOCAL);
        if (local_table) {
                ret = RTN_UNICAST;
 -              if (!local_table->tb_lookup(local_table, &fl, &res)) {
 +              if (!fib_table_lookup(local_table, &fl, &res)) {
                        if (!dev || dev == res.fi->fib_dev)
                                ret = res.type;
                        fib_res_put(&res);
@@@ -229,14 -229,17 +229,17 @@@ unsigned int inet_dev_addr_type(struct 
   */
  
  int fib_validate_source(__be32 src, __be32 dst, u8 tos, int oif,
-                       struct net_device *dev, __be32 *spec_dst, u32 *itag)
+                       struct net_device *dev, __be32 *spec_dst,
+                       u32 *itag, u32 mark)
  {
        struct in_device *in_dev;
        struct flowi fl = { .nl_u = { .ip4_u =
                                      { .daddr = src,
                                        .saddr = dst,
                                        .tos = tos } },
+                           .mark = mark,
                            .iif = oif };
        struct fib_result res;
        int no_addr, rpf;
        int ret;
@@@ -473,13 -476,13 +476,13 @@@ int ip_rt_ioctl(struct net *net, unsign
                        if (cmd == SIOCDELRT) {
                                tb = fib_get_table(net, cfg.fc_table);
                                if (tb)
 -                                      err = tb->tb_delete(tb, &cfg);
 +                                      err = fib_table_delete(tb, &cfg);
                                else
                                        err = -ESRCH;
                        } else {
                                tb = fib_new_table(net, cfg.fc_table);
                                if (tb)
 -                                      err = tb->tb_insert(tb, &cfg);
 +                                      err = fib_table_insert(tb, &cfg);
                                else
                                        err = -ENOBUFS;
                        }
@@@ -594,7 -597,7 +597,7 @@@ static int inet_rtm_delroute(struct sk_
                goto errout;
        }
  
 -      err = tb->tb_delete(tb, &cfg);
 +      err = fib_table_delete(tb, &cfg);
  errout:
        return err;
  }
@@@ -616,7 -619,7 +619,7 @@@ static int inet_rtm_newroute(struct sk_
                goto errout;
        }
  
 -      err = tb->tb_insert(tb, &cfg);
 +      err = fib_table_insert(tb, &cfg);
  errout:
        return err;
  }
@@@ -647,7 -650,7 +650,7 @@@ static int inet_dump_fib(struct sk_buf
                        if (dumped)
                                memset(&cb->args[2], 0, sizeof(cb->args) -
                                                 2 * sizeof(cb->args[0]));
 -                      if (tb->tb_dump(tb, skb, cb) < 0)
 +                      if (fib_table_dump(tb, skb, cb) < 0)
                                goto out;
                        dumped = 1;
  next:
@@@ -701,9 -704,9 +704,9 @@@ static void fib_magic(int cmd, int type
                cfg.fc_scope = RT_SCOPE_HOST;
  
        if (cmd == RTM_NEWROUTE)
 -              tb->tb_insert(tb, &cfg);
 +              fib_table_insert(tb, &cfg);
        else
 -              tb->tb_delete(tb, &cfg);
 +              fib_table_delete(tb, &cfg);
  }
  
  void fib_add_ifaddr(struct in_ifaddr *ifa)
@@@ -832,7 -835,7 +835,7 @@@ static void nl_fib_lookup(struct fib_re
                local_bh_disable();
  
                frn->tb_id = tb->tb_id;
 -              frn->err = tb->tb_lookup(tb, &fl, &res);
 +              frn->err = fib_table_lookup(tb, &fl, &res);
  
                if (!frn->err) {
                        frn->prefixlen = res.prefixlen;
@@@ -1009,7 -1012,7 +1012,7 @@@ static void __net_exit ip_fib_net_exit(
                head = &net->ipv4.fib_table_hash[i];
                hlist_for_each_entry_safe(tb, node, tmp, head, tb_hlist) {
                        hlist_del(node);
 -                      tb->tb_flush(tb);
 +                      fib_table_flush(tb);
                        kfree(tb);
                }
        }
diff --combined net/ipv4/ip_gre.c
@@@ -156,13 -156,8 +156,13 @@@ struct ipgre_net 
  #define tunnels_r     tunnels[2]
  #define tunnels_l     tunnels[1]
  #define tunnels_wc    tunnels[0]
 +/*
 + * Locking : hash tables are protected by RCU and a spinlock
 + */
 +static DEFINE_SPINLOCK(ipgre_lock);
  
 -static DEFINE_RWLOCK(ipgre_lock);
 +#define for_each_ip_tunnel_rcu(start) \
 +      for (t = rcu_dereference(start); t; t = rcu_dereference(t->next))
  
  /* Given src, dst and key, find appropriate for input tunnel. */
  
@@@ -180,7 -175,7 +180,7 @@@ static struct ip_tunnel * ipgre_tunnel_
                       ARPHRD_ETHER : ARPHRD_IPGRE;
        int score, cand_score = 4;
  
 -      for (t = ign->tunnels_r_l[h0^h1]; t; t = t->next) {
 +      for_each_ip_tunnel_rcu(ign->tunnels_r_l[h0 ^ h1]) {
                if (local != t->parms.iph.saddr ||
                    remote != t->parms.iph.daddr ||
                    key != t->parms.i_key ||
                }
        }
  
 -      for (t = ign->tunnels_r[h0^h1]; t; t = t->next) {
 +      for_each_ip_tunnel_rcu(ign->tunnels_r[h0 ^ h1]) {
                if (remote != t->parms.iph.daddr ||
                    key != t->parms.i_key ||
                    !(t->dev->flags & IFF_UP))
                }
        }
  
 -      for (t = ign->tunnels_l[h1]; t; t = t->next) {
 +      for_each_ip_tunnel_rcu(ign->tunnels_l[h1]) {
                if ((local != t->parms.iph.saddr &&
                     (local != t->parms.iph.daddr ||
                      !ipv4_is_multicast(local))) ||
                }
        }
  
 -      for (t = ign->tunnels_wc[h1]; t; t = t->next) {
 +      for_each_ip_tunnel_rcu(ign->tunnels_wc[h1]) {
                if (t->parms.i_key != key ||
                    !(t->dev->flags & IFF_UP))
                        continue;
        if (cand != NULL)
                return cand;
  
 -      if (ign->fb_tunnel_dev->flags & IFF_UP)
 -              return netdev_priv(ign->fb_tunnel_dev);
 +      dev = ign->fb_tunnel_dev;
 +      if (dev->flags & IFF_UP)
 +              return netdev_priv(dev);
  
        return NULL;
  }
@@@ -317,10 -311,10 +317,10 @@@ static void ipgre_tunnel_link(struct ip
  {
        struct ip_tunnel **tp = ipgre_bucket(ign, t);
  
 +      spin_lock_bh(&ipgre_lock);
        t->next = *tp;
 -      write_lock_bh(&ipgre_lock);
 -      *tp = t;
 -      write_unlock_bh(&ipgre_lock);
 +      rcu_assign_pointer(*tp, t);
 +      spin_unlock_bh(&ipgre_lock);
  }
  
  static void ipgre_tunnel_unlink(struct ipgre_net *ign, struct ip_tunnel *t)
  
        for (tp = ipgre_bucket(ign, t); *tp; tp = &(*tp)->next) {
                if (t == *tp) {
 -                      write_lock_bh(&ipgre_lock);
 +                      spin_lock_bh(&ipgre_lock);
                        *tp = t->next;
 -                      write_unlock_bh(&ipgre_lock);
 +                      spin_unlock_bh(&ipgre_lock);
                        break;
                }
        }
@@@ -482,7 -476,7 +482,7 @@@ static void ipgre_err(struct sk_buff *s
                break;
        }
  
 -      read_lock(&ipgre_lock);
 +      rcu_read_lock();
        t = ipgre_tunnel_lookup(skb->dev, iph->daddr, iph->saddr,
                                flags & GRE_KEY ?
                                *(((__be32 *)p) + (grehlen / 4) - 1) : 0,
                t->err_count = 1;
        t->err_time = jiffies;
  out:
 -      read_unlock(&ipgre_lock);
 +      rcu_read_unlock();
        return;
  }
  
@@@ -579,7 -573,7 +579,7 @@@ static int ipgre_rcv(struct sk_buff *sk
  
        gre_proto = *(__be16 *)(h + 2);
  
 -      read_lock(&ipgre_lock);
 +      rcu_read_lock();
        if ((tunnel = ipgre_tunnel_lookup(skb->dev,
                                          iph->saddr, iph->daddr, key,
                                          gre_proto))) {
                ipgre_ecn_decapsulate(iph, skb);
  
                netif_rx(skb);
 -              read_unlock(&ipgre_lock);
 +              rcu_read_unlock();
                return(0);
        }
        icmp_send(skb, ICMP_DEST_UNREACH, ICMP_PORT_UNREACH, 0);
  
  drop:
 -      read_unlock(&ipgre_lock);
 +      rcu_read_unlock();
  drop_nolock:
        kfree_skb(skb);
        return(0);
  static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
  {
        struct ip_tunnel *tunnel = netdev_priv(dev);
 -      struct net_device_stats *stats = &tunnel->dev->stats;
 +      struct net_device_stats *stats = &dev->stats;
 +      struct netdev_queue *txq = netdev_get_tx_queue(dev, 0);
        struct iphdr  *old_iph = ip_hdr(skb);
        struct iphdr  *tiph;
        u8     tos;
                struct sk_buff *new_skb = skb_realloc_headroom(skb, max_headroom);
                if (!new_skb) {
                        ip_rt_put(rt);
 -                      stats->tx_dropped++;
 +                      txq->tx_dropped++;
                        dev_kfree_skb(skb);
                        return NETDEV_TX_OK;
                }
@@@ -1290,19 -1283,16 +1290,19 @@@ static const struct net_protocol ipgre_
        .netns_ok       =       1,
  };
  
 -static void ipgre_destroy_tunnels(struct ipgre_net *ign)
 +static void ipgre_destroy_tunnels(struct ipgre_net *ign, struct list_head *head)
  {
        int prio;
  
        for (prio = 0; prio < 4; prio++) {
                int h;
                for (h = 0; h < HASH_SIZE; h++) {
 -                      struct ip_tunnel *t;
 -                      while ((t = ign->tunnels[prio][h]) != NULL)
 -                              unregister_netdevice(t->dev);
 +                      struct ip_tunnel *t = ign->tunnels[prio][h];
 +
 +                      while (t != NULL) {
 +                              unregister_netdevice_queue(t->dev, head);
 +                              t = t->next;
 +                      }
                }
        }
  }
@@@ -1350,12 -1340,10 +1350,12 @@@ err_alloc
  static void ipgre_exit_net(struct net *net)
  {
        struct ipgre_net *ign;
 +      LIST_HEAD(list);
  
        ign = net_generic(net, ipgre_net_id);
        rtnl_lock();
 -      ipgre_destroy_tunnels(ign);
 +      ipgre_destroy_tunnels(ign, &list);
 +      unregister_netdevice_many(&list);
        rtnl_unlock();
        kfree(ign);
  }
@@@ -1476,7 -1464,7 +1476,7 @@@ static void ipgre_tap_setup(struct net_
  
        ether_setup(dev);
  
-       dev->netdev_ops         = &ipgre_netdev_ops;
+       dev->netdev_ops         = &ipgre_tap_netdev_ops;
        dev->destructor         = free_netdev;
  
        dev->iflink             = 0;
@@@ -1537,25 -1525,29 +1537,29 @@@ static int ipgre_changelink(struct net_
                if (t->dev != dev)
                        return -EEXIST;
        } else {
-               unsigned nflags = 0;
                t = nt;
  
-               if (ipv4_is_multicast(p.iph.daddr))
-                       nflags = IFF_BROADCAST;
-               else if (p.iph.daddr)
-                       nflags = IFF_POINTOPOINT;
+               if (dev->type != ARPHRD_ETHER) {
+                       unsigned nflags = 0;
  
-               if ((dev->flags ^ nflags) &
-                   (IFF_POINTOPOINT | IFF_BROADCAST))
-                       return -EINVAL;
+                       if (ipv4_is_multicast(p.iph.daddr))
+                               nflags = IFF_BROADCAST;
+                       else if (p.iph.daddr)
+                               nflags = IFF_POINTOPOINT;
+                       if ((dev->flags ^ nflags) &
+                           (IFF_POINTOPOINT | IFF_BROADCAST))
+                               return -EINVAL;
+               }
  
                ipgre_tunnel_unlink(ign, t);
                t->parms.iph.saddr = p.iph.saddr;
                t->parms.iph.daddr = p.iph.daddr;
                t->parms.i_key = p.i_key;
-               memcpy(dev->dev_addr, &p.iph.saddr, 4);
-               memcpy(dev->broadcast, &p.iph.daddr, 4);
+               if (dev->type != ARPHRD_ETHER) {
+                       memcpy(dev->dev_addr, &p.iph.saddr, 4);
+                       memcpy(dev->broadcast, &p.iph.daddr, 4);
+               }
                ipgre_tunnel_link(ign, t);
                netdev_state_change(dev);
        }
diff --combined net/ipv4/route.c
@@@ -1628,6 -1628,9 +1628,6 @@@ unsigned short ip_rt_frag_needed(struc
        __be32  daddr = iph->daddr;
        unsigned short est_mtu = 0;
  
 -      if (ipv4_config.no_pmtu_disc)
 -              return 0;
 -
        for (k = 0; k < 2; k++) {
                for (i = 0; i < 2; i++) {
                        unsigned hash = rt_hash(daddr, skeys[i], ikeys[k],
@@@ -1851,7 -1854,7 +1851,7 @@@ static int ip_route_input_mc(struct sk_
                        goto e_inval;
                spec_dst = inet_select_addr(dev, 0, RT_SCOPE_LINK);
        } else if (fib_validate_source(saddr, 0, tos, 0,
-                                       dev, &spec_dst, &itag) < 0)
+                                       dev, &spec_dst, &itag, 0) < 0)
                goto e_inval;
  
        rth = dst_alloc(&ipv4_dst_ops);
@@@ -1964,7 -1967,7 +1964,7 @@@ static int __mkroute_input(struct sk_bu
  
  
        err = fib_validate_source(saddr, daddr, tos, FIB_RES_OIF(*res),
-                                 in_dev->dev, &spec_dst, &itag);
+                                 in_dev->dev, &spec_dst, &itag, skb->mark);
        if (err < 0) {
                ip_handle_martian_source(in_dev->dev, in_dev, skb, daddr,
                                         saddr);
@@@ -2138,7 -2141,7 +2138,7 @@@ static int ip_route_input_slow(struct s
                int result;
                result = fib_validate_source(saddr, daddr, tos,
                                             net->loopback_dev->ifindex,
-                                            dev, &spec_dst, &itag);
+                                            dev, &spec_dst, &itag, skb->mark);
                if (result < 0)
                        goto martian_source;
                if (result)
@@@ -2167,7 -2170,7 +2167,7 @@@ brd_input
                spec_dst = inet_select_addr(dev, 0, RT_SCOPE_LINK);
        else {
                err = fib_validate_source(saddr, 0, tos, 0, dev, &spec_dst,
-                                         &itag);
+                                         &itag, skb->mark);
                if (err < 0)
                        goto martian_source;
                if (err)
diff --combined net/ipv4/udp.c
  #include <net/xfrm.h>
  #include "udp_impl.h"
  
 -struct udp_table udp_table;
 +struct udp_table udp_table __read_mostly;
  EXPORT_SYMBOL(udp_table);
  
  int sysctl_udp_mem[3] __read_mostly;
@@@ -121,16 -121,14 +121,16 @@@ EXPORT_SYMBOL(sysctl_udp_wmem_min)
  atomic_t udp_memory_allocated;
  EXPORT_SYMBOL(udp_memory_allocated);
  
 -#define PORTS_PER_CHAIN (65536 / UDP_HTABLE_SIZE)
 +#define MAX_UDP_PORTS 65536
 +#define PORTS_PER_CHAIN (MAX_UDP_PORTS / UDP_HTABLE_SIZE_MIN)
  
  static int udp_lib_lport_inuse(struct net *net, __u16 num,
                               const struct udp_hslot *hslot,
                               unsigned long *bitmap,
                               struct sock *sk,
                               int (*saddr_comp)(const struct sock *sk1,
 -                                               const struct sock *sk2))
 +                                               const struct sock *sk2),
 +                             unsigned int log)
  {
        struct sock *sk2;
        struct hlist_nulls_node *node;
                        || sk2->sk_bound_dev_if == sk->sk_bound_dev_if) &&
                    (*saddr_comp)(sk, sk2)) {
                        if (bitmap)
 -                              __set_bit(sk2->sk_hash / UDP_HTABLE_SIZE,
 -                                        bitmap);
 +                              __set_bit(sk2->sk_hash >> log, bitmap);
                        else
                                return 1;
                }
@@@ -181,15 -180,13 +181,15 @@@ int udp_lib_get_port(struct sock *sk, u
                /*
                 * force rand to be an odd multiple of UDP_HTABLE_SIZE
                 */
 -              rand = (rand | 1) * UDP_HTABLE_SIZE;
 -              for (last = first + UDP_HTABLE_SIZE; first != last; first++) {
 -                      hslot = &udptable->hash[udp_hashfn(net, first)];
 +              rand = (rand | 1) * (udptable->mask + 1);
 +              for (last = first + udptable->mask + 1;
 +                   first != last;
 +                   first++) {
 +                      hslot = udp_hashslot(udptable, net, first);
                        bitmap_zero(bitmap, PORTS_PER_CHAIN);
                        spin_lock_bh(&hslot->lock);
                        udp_lib_lport_inuse(net, snum, hslot, bitmap, sk,
 -                                          saddr_comp);
 +                                          saddr_comp, udptable->log);
  
                        snum = first;
                        /*
                         */
                        do {
                                if (low <= snum && snum <= high &&
 -                                  !test_bit(snum / UDP_HTABLE_SIZE, bitmap))
 +                                  !test_bit(snum >> udptable->log, bitmap))
                                        goto found;
                                snum += rand;
                        } while (snum != first);
                }
                goto fail;
        } else {
 -              hslot = &udptable->hash[udp_hashfn(net, snum)];
 +              hslot = udp_hashslot(udptable, net, snum);
                spin_lock_bh(&hslot->lock);
 -              if (udp_lib_lport_inuse(net, snum, hslot, NULL, sk, saddr_comp))
 +              if (udp_lib_lport_inuse(net, snum, hslot, NULL, sk,
 +                                      saddr_comp, 0))
                        goto fail_unlock;
        }
  found:
 -      inet_sk(sk)->num = snum;
 +      inet_sk(sk)->inet_num = snum;
        sk->sk_hash = snum;
        if (sk_unhashed(sk)) {
                sk_nulls_add_node_rcu(sk, &hslot->head);
@@@ -233,8 -229,8 +233,8 @@@ static int ipv4_rcv_saddr_equal(const s
        struct inet_sock *inet1 = inet_sk(sk1), *inet2 = inet_sk(sk2);
  
        return  (!ipv6_only_sock(sk2)  &&
 -               (!inet1->rcv_saddr || !inet2->rcv_saddr ||
 -                 inet1->rcv_saddr == inet2->rcv_saddr));
 +               (!inet1->inet_rcv_saddr || !inet2->inet_rcv_saddr ||
 +                 inet1->inet_rcv_saddr == inet2->inet_rcv_saddr));
  }
  
  int udp_v4_get_port(struct sock *sk, unsigned short snum)
@@@ -253,18 -249,18 +253,18 @@@ static inline int compute_score(struct 
                struct inet_sock *inet = inet_sk(sk);
  
                score = (sk->sk_family == PF_INET ? 1 : 0);
 -              if (inet->rcv_saddr) {
 -                      if (inet->rcv_saddr != daddr)
 +              if (inet->inet_rcv_saddr) {
 +                      if (inet->inet_rcv_saddr != daddr)
                                return -1;
                        score += 2;
                }
 -              if (inet->daddr) {
 -                      if (inet->daddr != saddr)
 +              if (inet->inet_daddr) {
 +                      if (inet->inet_daddr != saddr)
                                return -1;
                        score += 2;
                }
 -              if (inet->dport) {
 -                      if (inet->dport != sport)
 +              if (inet->inet_dport) {
 +                      if (inet->inet_dport != sport)
                                return -1;
                        score += 2;
                }
@@@ -287,7 -283,7 +287,7 @@@ static struct sock *__udp4_lib_lookup(s
        struct sock *sk, *result;
        struct hlist_nulls_node *node;
        unsigned short hnum = ntohs(dport);
 -      unsigned int hash = udp_hashfn(net, hnum);
 +      unsigned int hash = udp_hashfn(net, hnum, udptable->mask);
        struct udp_hslot *hslot = &udptable->hash[hash];
        int score, badness;
  
@@@ -360,10 -356,9 +360,10 @@@ static inline struct sock *udp_v4_mcast
  
                if (!net_eq(sock_net(s), net)                           ||
                    s->sk_hash != hnum                                  ||
 -                  (inet->daddr && inet->daddr != rmt_addr)            ||
 -                  (inet->dport != rmt_port && inet->dport)            ||
 -                  (inet->rcv_saddr && inet->rcv_saddr != loc_addr)    ||
 +                  (inet->inet_daddr && inet->inet_daddr != rmt_addr)  ||
 +                  (inet->inet_dport != rmt_port && inet->inet_dport)  ||
 +                  (inet->inet_rcv_saddr       &&
 +                   inet->inet_rcv_saddr != loc_addr)                  ||
                    ipv6_only_sock(s)                                   ||
                    (s->sk_bound_dev_if && s->sk_bound_dev_if != dif))
                        continue;
@@@ -647,14 -642,14 +647,14 @@@ int udp_sendmsg(struct kiocb *iocb, str
        } else {
                if (sk->sk_state != TCP_ESTABLISHED)
                        return -EDESTADDRREQ;
 -              daddr = inet->daddr;
 -              dport = inet->dport;
 +              daddr = inet->inet_daddr;
 +              dport = inet->inet_dport;
                /* Open fast path for connected socket.
                   Route will not be used, if at least one option is set.
                 */
                connected = 1;
        }
 -      ipc.addr = inet->saddr;
 +      ipc.addr = inet->inet_saddr;
  
        ipc.oif = sk->sk_bound_dev_if;
        err = sock_tx_timestamp(msg, sk, &ipc.shtx);
                                    .proto = sk->sk_protocol,
                                    .flags = inet_sk_flowi_flags(sk),
                                    .uli_u = { .ports =
 -                                             { .sport = inet->sport,
 +                                             { .sport = inet->inet_sport,
                                                 .dport = dport } } };
                struct net *net = sock_net(sk);
  
@@@ -753,7 -748,7 +753,7 @@@ back_from_confirm
        inet->cork.fl.fl4_dst = daddr;
        inet->cork.fl.fl_ip_dport = dport;
        inet->cork.fl.fl4_src = saddr;
 -      inet->cork.fl.fl_ip_sport = inet->sport;
 +      inet->cork.fl.fl_ip_sport = inet->inet_sport;
        up->pending = AF_INET;
  
  do_append_data:
@@@ -867,7 -862,6 +867,7 @@@ static unsigned int first_packet_length
                udp_lib_checksum_complete(skb)) {
                UDP_INC_STATS_BH(sock_net(sk), UDP_MIB_INERRORS,
                                 IS_UDPLITE(sk));
 +              atomic_inc(&sk->sk_drops);
                __skb_unlink(skb, rcvq);
                __skb_queue_tail(&list_kill, skb);
        }
@@@ -988,7 -982,7 +988,7 @@@ try_again
                UDP_INC_STATS_USER(sock_net(sk),
                                UDP_MIB_INDATAGRAMS, is_udplite);
  
 -      sock_recv_timestamp(msg, sk, skb);
 +      sock_recv_ts_and_drops(msg, sk, skb);
  
        /* Copy the address. */
        if (sin) {
                err = ulen;
  
  out_free:
-       lock_sock(sk);
-       skb_free_datagram(sk, skb);
-       release_sock(sk);
+       skb_free_datagram_locked(sk, skb);
  out:
        return err;
  
@@@ -1031,15 -1023,15 +1029,15 @@@ int udp_disconnect(struct sock *sk, in
         */
  
        sk->sk_state = TCP_CLOSE;
 -      inet->daddr = 0;
 -      inet->dport = 0;
 +      inet->inet_daddr = 0;
 +      inet->inet_dport = 0;
        sk->sk_bound_dev_if = 0;
        if (!(sk->sk_userlocks & SOCK_BINDADDR_LOCK))
                inet_reset_saddr(sk);
  
        if (!(sk->sk_userlocks & SOCK_BINDPORT_LOCK)) {
                sk->sk_prot->unhash(sk);
 -              inet->sport = 0;
 +              inet->inet_sport = 0;
        }
        sk_dst_reset(sk);
        return 0;
@@@ -1050,12 -1042,12 +1048,12 @@@ void udp_lib_unhash(struct sock *sk
  {
        if (sk_hashed(sk)) {
                struct udp_table *udptable = sk->sk_prot->h.udp_table;
 -              unsigned int hash = udp_hashfn(sock_net(sk), sk->sk_hash);
 -              struct udp_hslot *hslot = &udptable->hash[hash];
 +              struct udp_hslot *hslot = udp_hashslot(udptable, sock_net(sk),
 +                                                   sk->sk_hash);
  
                spin_lock_bh(&hslot->lock);
                if (sk_nulls_del_node_init_rcu(sk)) {
 -                      inet_sk(sk)->num = 0;
 +                      inet_sk(sk)->inet_num = 0;
                        sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
                }
                spin_unlock_bh(&hslot->lock);
@@@ -1065,22 -1057,25 +1063,22 @@@ EXPORT_SYMBOL(udp_lib_unhash)
  
  static int __udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
  {
 -      int is_udplite = IS_UDPLITE(sk);
 -      int rc;
 +      int rc = sock_queue_rcv_skb(sk, skb);
 +
 +      if (rc < 0) {
 +              int is_udplite = IS_UDPLITE(sk);
  
 -      if ((rc = sock_queue_rcv_skb(sk, skb)) < 0) {
                /* Note that an ENOMEM error is charged twice */
 -              if (rc == -ENOMEM) {
 +              if (rc == -ENOMEM)
                        UDP_INC_STATS_BH(sock_net(sk), UDP_MIB_RCVBUFERRORS,
                                         is_udplite);
 -                      atomic_inc(&sk->sk_drops);
 -              }
 -              goto drop;
 +              UDP_INC_STATS_BH(sock_net(sk), UDP_MIB_INERRORS, is_udplite);
 +              kfree_skb(skb);
 +              return -1;
        }
  
        return 0;
  
 -drop:
 -      UDP_INC_STATS_BH(sock_net(sk), UDP_MIB_INERRORS, is_udplite);
 -      kfree_skb(skb);
 -      return -1;
  }
  
  /* returns:
@@@ -1187,7 -1182,6 +1185,7 @@@ int udp_queue_rcv_skb(struct sock *sk, 
  
  drop:
        UDP_INC_STATS_BH(sock_net(sk), UDP_MIB_INERRORS, is_udplite);
 +      atomic_inc(&sk->sk_drops);
        kfree_skb(skb);
        return -1;
  }
@@@ -1204,7 -1198,7 +1202,7 @@@ static int __udp4_lib_mcast_deliver(str
                                    struct udp_table *udptable)
  {
        struct sock *sk;
 -      struct udp_hslot *hslot = &udptable->hash[udp_hashfn(net, ntohs(uh->dest))];
 +      struct udp_hslot *hslot = udp_hashslot(udptable, net, ntohs(uh->dest));
        int dif;
  
        spin_lock(&hslot->lock);
@@@ -1626,14 -1620,9 +1624,14 @@@ static struct sock *udp_get_first(struc
        struct udp_iter_state *state = seq->private;
        struct net *net = seq_file_net(seq);
  
 -      for (state->bucket = start; state->bucket < UDP_HTABLE_SIZE; ++state->bucket) {
 +      for (state->bucket = start; state->bucket <= state->udp_table->mask;
 +           ++state->bucket) {
                struct hlist_nulls_node *node;
                struct udp_hslot *hslot = &state->udp_table->hash[state->bucket];
 +
 +              if (hlist_nulls_empty(&hslot->head))
 +                      continue;
 +
                spin_lock_bh(&hslot->lock);
                sk_nulls_for_each(sk, node, &hslot->head) {
                        if (!net_eq(sock_net(sk), net))
@@@ -1658,7 -1647,7 +1656,7 @@@ static struct sock *udp_get_next(struc
        } while (sk && (!net_eq(sock_net(sk), net) || sk->sk_family != state->family));
  
        if (!sk) {
 -              if (state->bucket < UDP_HTABLE_SIZE)
 +              if (state->bucket <= state->udp_table->mask)
                        spin_unlock_bh(&state->udp_table->hash[state->bucket].lock);
                return udp_get_first(seq, state->bucket + 1);
        }
@@@ -1678,7 -1667,7 +1676,7 @@@ static struct sock *udp_get_idx(struct 
  static void *udp_seq_start(struct seq_file *seq, loff_t *pos)
  {
        struct udp_iter_state *state = seq->private;
 -      state->bucket = UDP_HTABLE_SIZE;
 +      state->bucket = MAX_UDP_PORTS;
  
        return *pos ? udp_get_idx(seq, *pos-1) : SEQ_START_TOKEN;
  }
@@@ -1700,7 -1689,7 +1698,7 @@@ static void udp_seq_stop(struct seq_fil
  {
        struct udp_iter_state *state = seq->private;
  
 -      if (state->bucket < UDP_HTABLE_SIZE)
 +      if (state->bucket <= state->udp_table->mask)
                spin_unlock_bh(&state->udp_table->hash[state->bucket].lock);
  }
  
@@@ -1755,12 -1744,12 +1753,12 @@@ static void udp4_format_sock(struct soc
                int bucket, int *len)
  {
        struct inet_sock *inet = inet_sk(sp);
 -      __be32 dest = inet->daddr;
 -      __be32 src  = inet->rcv_saddr;
 -      __u16 destp       = ntohs(inet->dport);
 -      __u16 srcp        = ntohs(inet->sport);
 +      __be32 dest = inet->inet_daddr;
 +      __be32 src  = inet->inet_rcv_saddr;
 +      __u16 destp       = ntohs(inet->inet_dport);
 +      __u16 srcp        = ntohs(inet->inet_sport);
  
 -      seq_printf(f, "%4d: %08X:%04X %08X:%04X"
 +      seq_printf(f, "%5d: %08X:%04X %08X:%04X"
                " %02X %08X:%08X %02X:%08lX %08X %5d %8d %lu %d %p %d%n",
                bucket, src, srcp, dest, destp, sp->sk_state,
                sk_wmem_alloc_get(sp),
@@@ -1826,43 -1815,11 +1824,43 @@@ void udp4_proc_exit(void
  }
  #endif /* CONFIG_PROC_FS */
  
 -void __init udp_table_init(struct udp_table *table)
 +static __initdata unsigned long uhash_entries;
 +static int __init set_uhash_entries(char *str)
  {
 -      int i;
 +      if (!str)
 +              return 0;
 +      uhash_entries = simple_strtoul(str, &str, 0);
 +      if (uhash_entries && uhash_entries < UDP_HTABLE_SIZE_MIN)
 +              uhash_entries = UDP_HTABLE_SIZE_MIN;
 +      return 1;
 +}
 +__setup("uhash_entries=", set_uhash_entries);
  
 -      for (i = 0; i < UDP_HTABLE_SIZE; i++) {
 +void __init udp_table_init(struct udp_table *table, const char *name)
 +{
 +      unsigned int i;
 +
 +      if (!CONFIG_BASE_SMALL)
 +              table->hash = alloc_large_system_hash(name,
 +                      sizeof(struct udp_hslot),
 +                      uhash_entries,
 +                      21, /* one slot per 2 MB */
 +                      0,
 +                      &table->log,
 +                      &table->mask,
 +                      64 * 1024);
 +      /*
 +       * Make sure hash table has the minimum size
 +       */
 +      if (CONFIG_BASE_SMALL || table->mask < UDP_HTABLE_SIZE_MIN - 1) {
 +              table->hash = kmalloc(UDP_HTABLE_SIZE_MIN *
 +                                    sizeof(struct udp_hslot), GFP_KERNEL);
 +              if (!table->hash)
 +                      panic(name);
 +              table->log = ilog2(UDP_HTABLE_SIZE_MIN);
 +              table->mask = UDP_HTABLE_SIZE_MIN - 1;
 +      }
 +      for (i = 0; i <= table->mask; i++) {
                INIT_HLIST_NULLS_HEAD(&table->hash[i].head, i);
                spin_lock_init(&table->hash[i].lock);
        }
@@@ -1872,7 -1829,7 +1870,7 @@@ void __init udp_init(void
  {
        unsigned long nr_pages, limit;
  
 -      udp_table_init(&udp_table);
 +      udp_table_init(&udp_table, "UDP");
        /* Set the pressure threshold up by the same strategy of TCP. It is a
         * fraction of global memory that is up to 1/2 at 256 MB, decreasing
         * toward zero with the amount of memory, with a floor of 128 pages.
diff --combined net/ipv6/udp.c
@@@ -53,7 -53,7 +53,7 @@@ int ipv6_rcv_saddr_equal(const struct s
  {
        const struct in6_addr *sk_rcv_saddr6 = &inet6_sk(sk)->rcv_saddr;
        const struct in6_addr *sk2_rcv_saddr6 = inet6_rcv_saddr(sk2);
 -      __be32 sk_rcv_saddr = inet_sk(sk)->rcv_saddr;
 +      __be32 sk1_rcv_saddr = inet_sk(sk)->inet_rcv_saddr;
        __be32 sk2_rcv_saddr = inet_rcv_saddr(sk2);
        int sk_ipv6only = ipv6_only_sock(sk);
        int sk2_ipv6only = inet_v6_ipv6only(sk2);
@@@ -63,8 -63,8 +63,8 @@@
        /* if both are mapped, treat as IPv4 */
        if (addr_type == IPV6_ADDR_MAPPED && addr_type2 == IPV6_ADDR_MAPPED)
                return (!sk2_ipv6only &&
 -                      (!sk_rcv_saddr || !sk2_rcv_saddr ||
 -                        sk_rcv_saddr == sk2_rcv_saddr));
 +                      (!sk1_rcv_saddr || !sk2_rcv_saddr ||
 +                        sk1_rcv_saddr == sk2_rcv_saddr));
  
        if (addr_type2 == IPV6_ADDR_ANY &&
            !(sk2_ipv6only && addr_type == IPV6_ADDR_MAPPED))
@@@ -100,8 -100,8 +100,8 @@@ static inline int compute_score(struct 
                struct inet_sock *inet = inet_sk(sk);
  
                score = 0;
 -              if (inet->dport) {
 -                      if (inet->dport != sport)
 +              if (inet->inet_dport) {
 +                      if (inet->inet_dport != sport)
                                return -1;
                        score++;
                }
@@@ -132,7 -132,7 +132,7 @@@ static struct sock *__udp6_lib_lookup(s
        struct sock *sk, *result;
        struct hlist_nulls_node *node;
        unsigned short hnum = ntohs(dport);
 -      unsigned int hash = udp_hashfn(net, hnum);
 +      unsigned int hash = udp_hashfn(net, hnum, udptable->mask);
        struct udp_hslot *hslot = &udptable->hash[hash];
        int score, badness;
  
@@@ -252,7 -252,7 +252,7 @@@ try_again
                                        UDP_MIB_INDATAGRAMS, is_udplite);
        }
  
 -      sock_recv_timestamp(msg, sk, skb);
 +      sock_recv_ts_and_drops(msg, sk, skb);
  
        /* Copy the address. */
        if (msg->msg_name) {
                sin6->sin6_scope_id = 0;
  
                if (is_udp4)
 -                      ipv6_addr_set(&sin6->sin6_addr, 0, 0,
 -                                    htonl(0xffff), ip_hdr(skb)->saddr);
 +                      ipv6_addr_set_v4mapped(ip_hdr(skb)->saddr,
 +                                             &sin6->sin6_addr);
                else {
                        ipv6_addr_copy(&sin6->sin6_addr,
                                       &ipv6_hdr(skb)->saddr);
                err = ulen;
  
  out_free:
-       lock_sock(sk);
-       skb_free_datagram(sk, skb);
-       release_sock(sk);
+       skb_free_datagram_locked(sk, skb);
  out:
        return err;
  
@@@ -385,18 -383,18 +383,18 @@@ int udpv6_queue_rcv_skb(struct sock * s
                        goto drop;
        }
  
 -      if ((rc = sock_queue_rcv_skb(sk,skb)) < 0) {
 +      if ((rc = sock_queue_rcv_skb(sk, skb)) < 0) {
                /* Note that an ENOMEM error is charged twice */
 -              if (rc == -ENOMEM) {
 +              if (rc == -ENOMEM)
                        UDP6_INC_STATS_BH(sock_net(sk),
                                        UDP_MIB_RCVBUFERRORS, is_udplite);
 -                      atomic_inc(&sk->sk_drops);
 -              }
 -              goto drop;
 +              goto drop_no_sk_drops_inc;
        }
  
        return 0;
  drop:
 +      atomic_inc(&sk->sk_drops);
 +drop_no_sk_drops_inc:
        UDP6_INC_STATS_BH(sock_net(sk), UDP_MIB_INERRORS, is_udplite);
        kfree_skb(skb);
        return -1;
@@@ -419,8 -417,8 +417,8 @@@ static struct sock *udp_v6_mcast_next(s
  
                if (s->sk_hash == num && s->sk_family == PF_INET6) {
                        struct ipv6_pinfo *np = inet6_sk(s);
 -                      if (inet->dport) {
 -                              if (inet->dport != rmt_port)
 +                      if (inet->inet_dport) {
 +                              if (inet->inet_dport != rmt_port)
                                        continue;
                        }
                        if (!ipv6_addr_any(&np->daddr) &&
@@@ -452,7 -450,7 +450,7 @@@ static int __udp6_lib_mcast_deliver(str
  {
        struct sock *sk, *sk2;
        const struct udphdr *uh = udp_hdr(skb);
 -      struct udp_hslot *hslot = &udptable->hash[udp_hashfn(net, ntohs(uh->dest))];
 +      struct udp_hslot *hslot = udp_hashslot(udptable, net, ntohs(uh->dest));
        int dif;
  
        spin_lock(&hslot->lock);
@@@ -794,7 -792,7 +792,7 @@@ int udpv6_sendmsg(struct kiocb *iocb, s
                if (ipv6_addr_v4mapped(daddr)) {
                        struct sockaddr_in sin;
                        sin.sin_family = AF_INET;
 -                      sin.sin_port = sin6 ? sin6->sin6_port : inet->dport;
 +                      sin.sin_port = sin6 ? sin6->sin6_port : inet->inet_dport;
                        sin.sin_addr.s_addr = daddr->s6_addr32[3];
                        msg->msg_name = &sin;
                        msg->msg_namelen = sizeof(sin);
@@@ -867,7 -865,7 +865,7 @@@ do_udp_sendmsg
                if (sk->sk_state != TCP_ESTABLISHED)
                        return -EDESTADDRREQ;
  
 -              fl.fl_ip_dport = inet->dport;
 +              fl.fl_ip_dport = inet->inet_dport;
                daddr = &np->daddr;
                fl.fl6_flowlabel = np->flow_label;
                connected = 1;
        if (!fl.oif)
                fl.oif = np->sticky_pktinfo.ipi6_ifindex;
  
 +      fl.mark = sk->sk_mark;
 +
        if (msg->msg_controllen) {
                opt = &opt_space;
                memset(opt, 0, sizeof(struct ipv6_txoptions));
                fl.fl6_dst.s6_addr[15] = 0x1; /* :: means loopback (BSD'ism) */
        if (ipv6_addr_any(&fl.fl6_src) && !ipv6_addr_any(&np->saddr))
                ipv6_addr_copy(&fl.fl6_src, &np->saddr);
 -      fl.fl_ip_sport = inet->sport;
 +      fl.fl_ip_sport = inet->inet_sport;
  
        /* merge ip6_build_xmit from ip6_output */
        if (opt && opt->srcrt) {
@@@ -1194,10 -1190,10 +1192,10 @@@ static void udp6_sock_seq_show(struct s
  
        dest  = &np->daddr;
        src   = &np->rcv_saddr;
 -      destp = ntohs(inet->dport);
 -      srcp  = ntohs(inet->sport);
 +      destp = ntohs(inet->inet_dport);
 +      srcp  = ntohs(inet->inet_sport);
        seq_printf(seq,
 -                 "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
 +                 "%5d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X "
                   "%02X %08X:%08X %02X:%08lX %08X %5d %8d %lu %d %p %d\n",
                   bucket,
                   src->s6_addr32[0], src->s6_addr32[1],
@@@ -1286,6 -1282,7 +1284,6 @@@ static struct inet_protosw udpv6_protos
        .protocol =  IPPROTO_UDP,
        .prot =      &udpv6_prot,
        .ops =       &inet6_dgram_ops,
 -      .capability =-1,
        .no_check =  UDP_CSUM_DEFAULT,
        .flags =     INET_PROTOSW_PERMANENT,
  };
diff --combined net/rose/rose_route.c
@@@ -578,18 -578,18 +578,18 @@@ static int rose_clear_routes(void
  
  /*
   *    Check that the device given is a valid AX.25 interface that is "up".
+  *    called whith RTNL
   */
- static struct net_device *rose_ax25_dev_get(char *devname)
+ static struct net_device *rose_ax25_dev_find(char *devname)
  {
        struct net_device *dev;
  
-       if ((dev = dev_get_by_name(&init_net, devname)) == NULL)
+       if ((dev = __dev_get_by_name(&init_net, devname)) == NULL)
                return NULL;
  
        if ((dev->flags & IFF_UP) && dev->type == ARPHRD_AX25)
                return dev;
  
-       dev_put(dev);
        return NULL;
  }
  
@@@ -600,13 -600,13 +600,13 @@@ struct net_device *rose_dev_first(void
  {
        struct net_device *dev, *first = NULL;
  
 -      read_lock(&dev_base_lock);
 -      for_each_netdev(&init_net, dev) {
 +      rcu_read_lock();
 +      for_each_netdev_rcu(&init_net, dev) {
                if ((dev->flags & IFF_UP) && dev->type == ARPHRD_ROSE)
                        if (first == NULL || strncmp(dev->name, first->name, 3) < 0)
                                first = dev;
        }
 -      read_unlock(&dev_base_lock);
 +      rcu_read_unlock();
  
        return first;
  }
@@@ -618,8 -618,8 +618,8 @@@ struct net_device *rose_dev_get(rose_ad
  {
        struct net_device *dev;
  
 -      read_lock(&dev_base_lock);
 -      for_each_netdev(&init_net, dev) {
 +      rcu_read_lock();
 +      for_each_netdev_rcu(&init_net, dev) {
                if ((dev->flags & IFF_UP) && dev->type == ARPHRD_ROSE && rosecmp(addr, (rose_address *)dev->dev_addr) == 0) {
                        dev_hold(dev);
                        goto out;
        }
        dev = NULL;
  out:
 -      read_unlock(&dev_base_lock);
 +      rcu_read_unlock();
        return dev;
  }
  
@@@ -635,14 -635,14 +635,14 @@@ static int rose_dev_exists(rose_addres
  {
        struct net_device *dev;
  
 -      read_lock(&dev_base_lock);
 -      for_each_netdev(&init_net, dev) {
 +      rcu_read_lock();
 +      for_each_netdev_rcu(&init_net, dev) {
                if ((dev->flags & IFF_UP) && dev->type == ARPHRD_ROSE && rosecmp(addr, (rose_address *)dev->dev_addr) == 0)
                        goto out;
        }
        dev = NULL;
  out:
 -      read_unlock(&dev_base_lock);
 +      rcu_read_unlock();
        return dev != NULL;
  }
  
@@@ -720,27 -720,23 +720,23 @@@ int rose_rt_ioctl(unsigned int cmd, voi
        case SIOCADDRT:
                if (copy_from_user(&rose_route, arg, sizeof(struct rose_route_struct)))
                        return -EFAULT;
-               if ((dev = rose_ax25_dev_get(rose_route.device)) == NULL)
+               if ((dev = rose_ax25_dev_find(rose_route.device)) == NULL)
                        return -EINVAL;
-               if (rose_dev_exists(&rose_route.address)) { /* Can't add routes to ourself */
-                       dev_put(dev);
+               if (rose_dev_exists(&rose_route.address)) /* Can't add routes to ourself */
                        return -EINVAL;
-               }
                if (rose_route.mask > 10) /* Mask can't be more than 10 digits */
                        return -EINVAL;
                if (rose_route.ndigis > AX25_MAX_DIGIS)
                        return -EINVAL;
                err = rose_add_node(&rose_route, dev);
-               dev_put(dev);
                return err;
  
        case SIOCDELRT:
                if (copy_from_user(&rose_route, arg, sizeof(struct rose_route_struct)))
                        return -EFAULT;
-               if ((dev = rose_ax25_dev_get(rose_route.device)) == NULL)
+               if ((dev = rose_ax25_dev_find(rose_route.device)) == NULL)
                        return -EINVAL;
                err = rose_del_node(&rose_route, dev);
-               dev_put(dev);
                return err;
  
        case SIOCRSCLRRT:
diff --combined net/sunrpc/svcsock.c
@@@ -111,7 -111,7 +111,7 @@@ static void svc_release_skb(struct svc_
                rqstp->rq_xprt_ctxt = NULL;
  
                dprintk("svc: service %p, releasing skb %p\n", rqstp, skb);
-               skb_free_datagram(svsk->sk_sk, skb);
+               skb_free_datagram_locked(svsk->sk_sk, skb);
        }
  }
  
@@@ -272,14 -272,14 +272,14 @@@ static int svc_one_sock_name(struct svc
        case PF_INET:
                len = snprintf(buf, remaining, "ipv4 %s %pI4 %d\n",
                                proto_name,
 -                              &inet_sk(sk)->rcv_saddr,
 -                              inet_sk(sk)->num);
 +                              &inet_sk(sk)->inet_rcv_saddr,
 +                              inet_sk(sk)->inet_num);
                break;
        case PF_INET6:
                len = snprintf(buf, remaining, "ipv6 %s %pI6 %d\n",
                                proto_name,
                                &inet6_sk(sk)->rcv_saddr,
 -                              inet_sk(sk)->num);
 +                              inet_sk(sk)->inet_num);
                break;
        default:
                len = snprintf(buf, remaining, "*unknown-%d*\n",
@@@ -578,7 -578,7 +578,7 @@@ static int svc_udp_recvfrom(struct svc_
                                "svc: received unknown control message %d/%d; "
                                "dropping RPC reply datagram\n",
                                        cmh->cmsg_level, cmh->cmsg_type);
-               skb_free_datagram(svsk->sk_sk, skb);
+               skb_free_datagram_locked(svsk->sk_sk, skb);
                return 0;
        }
  
                if (csum_partial_copy_to_xdr(&rqstp->rq_arg, skb)) {
                        local_bh_enable();
                        /* checksum error */
-                       skb_free_datagram(svsk->sk_sk, skb);
+                       skb_free_datagram_locked(svsk->sk_sk, skb);
                        return 0;
                }
                local_bh_enable();
-               skb_free_datagram(svsk->sk_sk, skb);
+               skb_free_datagram_locked(svsk->sk_sk, skb);
        } else {
                /* we can use it in-place */
                rqstp->rq_arg.head[0].iov_base = skb->data +
                        sizeof(struct udphdr);
                rqstp->rq_arg.head[0].iov_len = len;
                if (skb_checksum_complete(skb)) {
-                       skb_free_datagram(svsk->sk_sk, skb);
+                       skb_free_datagram_locked(svsk->sk_sk, skb);
                        return 0;
                }
                rqstp->rq_xprt_ctxt = skb;
@@@ -1311,7 -1311,7 +1311,7 @@@ static struct svc_sock *svc_setup_socke
        /* Register socket with portmapper */
        if (*errp >= 0 && pmap_register)
                *errp = svc_register(serv, inet->sk_family, inet->sk_protocol,
 -                                   ntohs(inet_sk(inet)->sport));
 +                                   ntohs(inet_sk(inet)->inet_sport));
  
        if (*errp < 0) {
                kfree(svsk);
diff --combined net/wireless/sme.c
@@@ -165,7 -165,7 +165,7 @@@ void cfg80211_conn_work(struct work_str
        struct cfg80211_registered_device *rdev =
                container_of(work, struct cfg80211_registered_device, conn_work);
        struct wireless_dev *wdev;
-       u8 bssid[ETH_ALEN];
+       u8 bssid_buf[ETH_ALEN], *bssid = NULL;
  
        rtnl_lock();
        cfg80211_lock_rdev(rdev);
                        wdev_unlock(wdev);
                        continue;
                }
-               memcpy(bssid, wdev->conn->params.bssid, ETH_ALEN);
+               if (wdev->conn->params.bssid) {
+                       memcpy(bssid_buf, wdev->conn->params.bssid, ETH_ALEN);
+                       bssid = bssid_buf;
+               }
                if (cfg80211_conn_do_work(wdev))
                        __cfg80211_connect_result(
                                        wdev->netdev, bssid,
@@@ -362,7 -365,7 +365,7 @@@ void __cfg80211_connect_result(struct n
  {
        struct wireless_dev *wdev = dev->ieee80211_ptr;
        u8 *country_ie;
 -#ifdef CONFIG_WIRELESS_EXT
 +#ifdef CONFIG_CFG80211_WEXT
        union iwreq_data wrqu;
  #endif
  
                                    resp_ie, resp_ie_len,
                                    status, GFP_KERNEL);
  
 -#ifdef CONFIG_WIRELESS_EXT
 +#ifdef CONFIG_CFG80211_WEXT
        if (wextev) {
                if (req_ie && status == WLAN_STATUS_SUCCESS) {
                        memset(&wrqu, 0, sizeof(wrqu));
@@@ -494,7 -497,7 +497,7 @@@ void __cfg80211_roamed(struct wireless_
                       const u8 *resp_ie, size_t resp_ie_len)
  {
        struct cfg80211_bss *bss;
 -#ifdef CONFIG_WIRELESS_EXT
 +#ifdef CONFIG_CFG80211_WEXT
        union iwreq_data wrqu;
  #endif
  
                            req_ie, req_ie_len, resp_ie, resp_ie_len,
                            GFP_KERNEL);
  
 -#ifdef CONFIG_WIRELESS_EXT
 +#ifdef CONFIG_CFG80211_WEXT
        if (req_ie) {
                memset(&wrqu, 0, sizeof(wrqu));
                wrqu.data.length = req_ie_len;
@@@ -590,7 -593,7 +593,7 @@@ void __cfg80211_disconnected(struct net
        struct wireless_dev *wdev = dev->ieee80211_ptr;
        struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
        int i;
 -#ifdef CONFIG_WIRELESS_EXT
 +#ifdef CONFIG_CFG80211_WEXT
        union iwreq_data wrqu;
  #endif
  
                for (i = 0; i < 6; i++)
                        rdev->ops->del_key(wdev->wiphy, dev, i, NULL);
  
 -#ifdef CONFIG_WIRELESS_EXT
 +#ifdef CONFIG_CFG80211_WEXT
        memset(&wrqu, 0, sizeof(wrqu));
        wrqu.ap_addr.sa_family = ARPHRD_ETHER;
        wireless_send_event(dev, SIOCGIWAP, &wrqu, NULL);