Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
authorDavid S. Miller <davem@davemloft.net>
Thu, 4 Feb 2010 03:38:22 +0000 (19:38 -0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 4 Feb 2010 03:38:22 +0000 (19:38 -0800)
1  2 
drivers/net/ixgbe/ixgbe_main.c
drivers/net/netxen/netxen_nic_main.c
drivers/net/sky2.c
net/key/af_key.c

@@@ -45,7 -45,6 +45,7 @@@
  #include "ixgbe.h"
  #include "ixgbe_common.h"
  #include "ixgbe_dcb_82599.h"
 +#include "ixgbe_sriov.h"
  
  char ixgbe_driver_name[] = "ixgbe";
  static const char ixgbe_driver_string[] =
@@@ -68,7 -67,7 +68,7 @@@ static const struct ixgbe_info *ixgbe_i
   * { Vendor ID, Device ID, SubVendor ID, SubDevice ID,
   *   Class, Class Mask, private data (not used) }
   */
 -static struct pci_device_id ixgbe_pci_tbl[] = {
 +static DEFINE_PCI_DEVICE_TABLE(ixgbe_pci_tbl) = {
        {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598),
         board_82598 },
        {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598AF_DUAL_PORT),
@@@ -125,13 -124,6 +125,13 @@@ static struct notifier_block dca_notifi
  };
  #endif
  
 +#ifdef CONFIG_PCI_IOV
 +static unsigned int max_vfs;
 +module_param(max_vfs, uint, 0);
 +MODULE_PARM_DESC(max_vfs, "Maximum number of virtual functions to allocate "
 +                 "per physical function");
 +#endif /* CONFIG_PCI_IOV */
 +
  MODULE_AUTHOR("Intel Corporation, <linux.nics@intel.com>");
  MODULE_DESCRIPTION("Intel(R) 10 Gigabit PCI Express Network Driver");
  MODULE_LICENSE("GPL");
@@@ -139,41 -131,6 +139,41 @@@ MODULE_VERSION(DRV_VERSION)
  
  #define DEFAULT_DEBUG_LEVEL_SHIFT 3
  
 +static inline void ixgbe_disable_sriov(struct ixgbe_adapter *adapter)
 +{
 +      struct ixgbe_hw *hw = &adapter->hw;
 +      u32 gcr;
 +      u32 gpie;
 +      u32 vmdctl;
 +
 +#ifdef CONFIG_PCI_IOV
 +      /* disable iov and allow time for transactions to clear */
 +      pci_disable_sriov(adapter->pdev);
 +#endif
 +
 +      /* turn off device IOV mode */
 +      gcr = IXGBE_READ_REG(hw, IXGBE_GCR_EXT);
 +      gcr &= ~(IXGBE_GCR_EXT_SRIOV);
 +      IXGBE_WRITE_REG(hw, IXGBE_GCR_EXT, gcr);
 +      gpie = IXGBE_READ_REG(hw, IXGBE_GPIE);
 +      gpie &= ~IXGBE_GPIE_VTMODE_MASK;
 +      IXGBE_WRITE_REG(hw, IXGBE_GPIE, gpie);
 +
 +      /* set default pool back to 0 */
 +      vmdctl = IXGBE_READ_REG(hw, IXGBE_VT_CTL);
 +      vmdctl &= ~IXGBE_VT_CTL_POOL_MASK;
 +      IXGBE_WRITE_REG(hw, IXGBE_VT_CTL, vmdctl);
 +
 +      /* take a breather then clean up driver data */
 +      msleep(100);
 +      if (adapter->vfinfo)
 +              kfree(adapter->vfinfo);
 +      adapter->vfinfo = NULL;
 +
 +      adapter->num_vfs = 0;
 +      adapter->flags &= ~IXGBE_FLAG_SRIOV_ENABLED;
 +}
 +
  static void ixgbe_release_hw_control(struct ixgbe_adapter *adapter)
  {
        u32 ctrl_ext;
@@@ -1068,12 -1025,7 +1068,12 @@@ static void ixgbe_configure_msix(struc
  
        /* set up to autoclear timer, and the vectors */
        mask = IXGBE_EIMS_ENABLE_MASK;
 -      mask &= ~(IXGBE_EIMS_OTHER | IXGBE_EIMS_LSC);
 +      if (adapter->num_vfs)
 +              mask &= ~(IXGBE_EIMS_OTHER |
 +                        IXGBE_EIMS_MAILBOX |
 +                        IXGBE_EIMS_LSC);
 +      else
 +              mask &= ~(IXGBE_EIMS_OTHER | IXGBE_EIMS_LSC);
        IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIAC, mask);
  }
  
@@@ -1302,9 -1254,6 +1302,9 @@@ static irqreturn_t ixgbe_msix_lsc(int i
        if (eicr & IXGBE_EICR_LSC)
                ixgbe_check_lsc(adapter);
  
 +      if (eicr & IXGBE_EICR_MAILBOX)
 +              ixgbe_msg_task(adapter);
 +
        if (hw->mac.type == ixgbe_mac_82598EB)
                ixgbe_check_fan_failure(adapter, eicr);
  
@@@ -1819,8 -1768,6 +1819,8 @@@ static inline void ixgbe_irq_enable(str
                mask |= IXGBE_EIMS_ECC;
                mask |= IXGBE_EIMS_GPI_SDP1;
                mask |= IXGBE_EIMS_GPI_SDP2;
 +              if (adapter->num_vfs)
 +                      mask |= IXGBE_EIMS_MAILBOX;
        }
        if (adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE ||
            adapter->flags & IXGBE_FLAG_FDIR_PERFECT_CAPABLE)
        IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, mask);
        ixgbe_irq_enable_queues(adapter, ~0);
        IXGBE_WRITE_FLUSH(&adapter->hw);
 +
 +      if (adapter->num_vfs > 32) {
 +              u32 eitrsel = (1 << (adapter->num_vfs - 32)) - 1;
 +              IXGBE_WRITE_REG(&adapter->hw, IXGBE_EITRSEL, eitrsel);
 +      }
  }
  
  /**
@@@ -1963,8 -1905,6 +1963,8 @@@ static inline void ixgbe_irq_disable(st
                IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, 0xFFFF0000);
                IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC_EX(0), ~0);
                IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC_EX(1), ~0);
 +              if (adapter->num_vfs > 32)
 +                      IXGBE_WRITE_REG(&adapter->hw, IXGBE_EITRSEL, 0);
        }
        IXGBE_WRITE_FLUSH(&adapter->hw);
        if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) {
@@@ -2049,32 -1989,18 +2049,32 @@@ static void ixgbe_configure_tx(struct i
  
        if (hw->mac.type == ixgbe_mac_82599EB) {
                u32 rttdcs;
 +              u32 mask;
  
                /* disable the arbiter while setting MTQC */
                rttdcs = IXGBE_READ_REG(hw, IXGBE_RTTDCS);
                rttdcs |= IXGBE_RTTDCS_ARBDIS;
                IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs);
  
 -              /* We enable 8 traffic classes, DCB only */
 -              if (adapter->flags & IXGBE_FLAG_DCB_ENABLED)
 -                      IXGBE_WRITE_REG(hw, IXGBE_MTQC, (IXGBE_MTQC_RT_ENA |
 -                                      IXGBE_MTQC_8TC_8TQ));
 -              else
 +              /* set transmit pool layout */
 +              mask = (IXGBE_FLAG_SRIOV_ENABLED | IXGBE_FLAG_DCB_ENABLED);
 +              switch (adapter->flags & mask) {
 +
 +              case (IXGBE_FLAG_SRIOV_ENABLED):
 +                      IXGBE_WRITE_REG(hw, IXGBE_MTQC,
 +                                      (IXGBE_MTQC_VT_ENA | IXGBE_MTQC_64VF));
 +                      break;
 +
 +              case (IXGBE_FLAG_DCB_ENABLED):
 +                      /* We enable 8 traffic classes, DCB only */
 +                      IXGBE_WRITE_REG(hw, IXGBE_MTQC,
 +                                    (IXGBE_MTQC_RT_ENA | IXGBE_MTQC_8TC_8TQ));
 +                      break;
 +
 +              default:
                        IXGBE_WRITE_REG(hw, IXGBE_MTQC, IXGBE_MTQC_64Q_1PB);
 +                      break;
 +              }
  
                /* re-eable the arbiter */
                rttdcs &= ~IXGBE_RTTDCS_ARBDIS;
@@@ -2133,16 -2059,12 +2133,16 @@@ static u32 ixgbe_setup_mrqc(struct ixgb
  #ifdef CONFIG_IXGBE_DCB
                                 | IXGBE_FLAG_DCB_ENABLED
  #endif
 +                               | IXGBE_FLAG_SRIOV_ENABLED
                                );
  
        switch (mask) {
        case (IXGBE_FLAG_RSS_ENABLED):
                mrqc = IXGBE_MRQC_RSSEN;
                break;
 +      case (IXGBE_FLAG_SRIOV_ENABLED):
 +              mrqc = IXGBE_MRQC_VMDQEN;
 +              break;
  #ifdef CONFIG_IXGBE_DCB
        case (IXGBE_FLAG_DCB_ENABLED):
                mrqc = IXGBE_MRQC_RT8TCEN;
@@@ -2223,9 -2145,7 +2223,9 @@@ static void ixgbe_configure_rx(struct i
        int rx_buf_len;
  
        /* Decide whether to use packet split mode or not */
 -      adapter->flags |= IXGBE_FLAG_RX_PS_ENABLED;
 +      /* Do not use packet split if we're in SR-IOV Mode */
 +      if (!adapter->num_vfs)
 +              adapter->flags |= IXGBE_FLAG_RX_PS_ENABLED;
  
        /* Set the RX buffer length according to the mode */
        if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED) {
                                      IXGBE_PSRTYPE_IPV4HDR |
                                      IXGBE_PSRTYPE_IPV6HDR |
                                      IXGBE_PSRTYPE_L2HDR;
 -                      IXGBE_WRITE_REG(hw, IXGBE_PSRTYPE(0), psrtype);
 +                      IXGBE_WRITE_REG(hw,
 +                                      IXGBE_PSRTYPE(adapter->num_vfs),
 +                                      psrtype);
                }
        } else {
                if (!(adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED) &&
                IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, rdrxctl);
        }
  
 +      if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED) {
 +              u32 vt_reg_bits;
 +              u32 reg_offset, vf_shift;
 +              u32 vmdctl = IXGBE_READ_REG(hw, IXGBE_VT_CTL);
 +              vt_reg_bits = IXGBE_VMD_CTL_VMDQ_EN
 +                      | IXGBE_VT_CTL_REPLEN;
 +              vt_reg_bits |= (adapter->num_vfs <<
 +                              IXGBE_VT_CTL_POOL_SHIFT);
 +              IXGBE_WRITE_REG(hw, IXGBE_VT_CTL, vmdctl | vt_reg_bits);
 +              IXGBE_WRITE_REG(hw, IXGBE_MRQC, 0);
 +
 +              vf_shift = adapter->num_vfs % 32;
 +              reg_offset = adapter->num_vfs / 32;
 +              IXGBE_WRITE_REG(hw, IXGBE_VFRE(0), 0);
 +              IXGBE_WRITE_REG(hw, IXGBE_VFRE(1), 0);
 +              IXGBE_WRITE_REG(hw, IXGBE_VFTE(0), 0);
 +              IXGBE_WRITE_REG(hw, IXGBE_VFTE(1), 0);
 +              /* Enable only the PF's pool for Tx/Rx */
 +              IXGBE_WRITE_REG(hw, IXGBE_VFRE(reg_offset), (1 << vf_shift));
 +              IXGBE_WRITE_REG(hw, IXGBE_VFTE(reg_offset), (1 << vf_shift));
 +              IXGBE_WRITE_REG(hw, IXGBE_PFDTXGSWC, IXGBE_PFDTXGSWC_VT_LBEN);
 +              ixgbe_set_vmolr(hw, adapter->num_vfs);
 +      }
 +
        /* Program MRQC for the distribution of queues */
        mrqc = ixgbe_setup_mrqc(adapter);
  
        }
        IXGBE_WRITE_REG(hw, IXGBE_MRQC, mrqc);
  
 +      if (adapter->num_vfs) {
 +              u32 reg;
 +
 +              /* Map PF MAC address in RAR Entry 0 to first pool
 +               * following VFs */
 +              hw->mac.ops.set_vmdq(hw, 0, adapter->num_vfs);
 +
 +              /* Set up VF register offsets for selected VT Mode, i.e.
 +               * 64 VFs for SR-IOV */
 +              reg = IXGBE_READ_REG(hw, IXGBE_GCR_EXT);
 +              reg |= IXGBE_GCR_EXT_SRIOV;
 +              IXGBE_WRITE_REG(hw, IXGBE_GCR_EXT, reg);
 +      }
 +
        rxcsum = IXGBE_READ_REG(hw, IXGBE_RXCSUM);
  
        if (adapter->flags & IXGBE_FLAG_RSS_ENABLED ||
@@@ -2432,17 -2312,15 +2432,17 @@@ static void ixgbe_vlan_rx_add_vid(struc
  {
        struct ixgbe_adapter *adapter = netdev_priv(netdev);
        struct ixgbe_hw *hw = &adapter->hw;
 +      int pool_ndx = adapter->num_vfs;
  
        /* add VID to filter table */
 -      hw->mac.ops.set_vfta(&adapter->hw, vid, 0, true);
 +      hw->mac.ops.set_vfta(&adapter->hw, vid, pool_ndx, true);
  }
  
  static void ixgbe_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
  {
        struct ixgbe_adapter *adapter = netdev_priv(netdev);
        struct ixgbe_hw *hw = &adapter->hw;
 +      int pool_ndx = adapter->num_vfs;
  
        if (!test_bit(__IXGBE_DOWN, &adapter->state))
                ixgbe_irq_disable(adapter);
                ixgbe_irq_enable(adapter);
  
        /* remove VID from filter table */
 -      hw->mac.ops.set_vfta(&adapter->hw, vid, 0, false);
 +      hw->mac.ops.set_vfta(&adapter->hw, vid, pool_ndx, false);
  }
  
  static void ixgbe_vlan_rx_register(struct net_device *netdev,
@@@ -2536,7 -2414,7 +2536,7 @@@ static u8 *ixgbe_addr_list_itr(struct i
   * responsible for configuring the hardware for proper unicast, multicast and
   * promiscuous mode.
   **/
 -static void ixgbe_set_rx_mode(struct net_device *netdev)
 +void ixgbe_set_rx_mode(struct net_device *netdev)
  {
        struct ixgbe_adapter *adapter = netdev_priv(netdev);
        struct ixgbe_hw *hw = &adapter->hw;
        IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, vlnctrl);
  
        /* reprogram secondary unicast list */
 -      hw->mac.ops.update_uc_addr_list(hw, &netdev->uc.list);
 +      hw->mac.ops.update_uc_addr_list(hw, netdev);
  
        /* reprogram multicast list */
        addr_count = netdev->mc_count;
                addr_list = netdev->mc_list->dmi_addr;
        hw->mac.ops.update_mc_addr_list(hw, addr_list, addr_count,
                                        ixgbe_addr_list_itr);
 +      if (adapter->num_vfs)
 +              ixgbe_restore_vf_multicasts(adapter);
  }
  
  static void ixgbe_napi_enable_all(struct ixgbe_adapter *adapter)
@@@ -2826,7 -2702,6 +2826,7 @@@ static int ixgbe_up_complete(struct ixg
        u32 txdctl, rxdctl, mhadd;
        u32 dmatxctl;
        u32 gpie;
 +      u32 ctrl_ext;
  
        ixgbe_get_hw_control(adapter);
  
                        /* MSI only */
                        gpie = 0;
                }
 +              if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED) {
 +                      gpie &= ~IXGBE_GPIE_VTMODE_MASK;
 +                      gpie |= IXGBE_GPIE_VTMODE_64;
 +              }
                /* XXX: to interrupt immediately for EICS writes, enable this */
                /* gpie |= IXGBE_GPIE_EIMEN; */
                IXGBE_WRITE_REG(hw, IXGBE_GPIE, gpie);
                txdctl = IXGBE_READ_REG(hw, IXGBE_TXDCTL(j));
                txdctl |= IXGBE_TXDCTL_ENABLE;
                IXGBE_WRITE_REG(hw, IXGBE_TXDCTL(j), txdctl);
 +              if (hw->mac.type == ixgbe_mac_82599EB) {
 +                      int wait_loop = 10;
 +                      /* poll for Tx Enable ready */
 +                      do {
 +                              msleep(1);
 +                              txdctl = IXGBE_READ_REG(hw, IXGBE_TXDCTL(j));
 +                      } while (--wait_loop &&
 +                               !(txdctl & IXGBE_TXDCTL_ENABLE));
 +                      if (!wait_loop)
 +                              DPRINTK(DRV, ERR, "Could not enable "
 +                                      "Tx Queue %d\n", j);
 +              }
        }
  
        for (i = 0; i < num_rx_rings; i++) {
        adapter->flags |= IXGBE_FLAG_NEED_LINK_UPDATE;
        adapter->link_check_timeout = jiffies;
        mod_timer(&adapter->watchdog_timer, jiffies);
 +
 +      /* Set PF Reset Done bit so PF/VF Mail Ops can work */
 +      ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
 +      ctrl_ext |= IXGBE_CTRL_EXT_PFRSTD;
 +      IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, ctrl_ext);
 +
        return 0;
  }
  
@@@ -3070,8 -2923,7 +3070,8 @@@ void ixgbe_reset(struct ixgbe_adapter *
        }
  
        /* reprogram the RAR[0] in case user changed it. */
 -      hw->mac.ops.set_rar(hw, 0, hw->mac.addr, 0, IXGBE_RAH_AV);
 +      hw->mac.ops.set_rar(hw, 0, hw->mac.addr, adapter->num_vfs,
 +                          IXGBE_RAH_AV);
  }
  
  /**
@@@ -3203,17 -3055,6 +3203,17 @@@ void ixgbe_down(struct ixgbe_adapter *a
        /* signal that we are down to the interrupt handler */
        set_bit(__IXGBE_DOWN, &adapter->state);
  
 +      /* disable receive for all VFs and wait one second */
 +      if (adapter->num_vfs) {
 +              for (i = 0 ; i < adapter->num_vfs; i++)
 +                      adapter->vfinfo[i].clear_to_send = 0;
 +
 +              /* ping all the active vfs to let them know we are going down */
 +              ixgbe_ping_all_vfs(adapter);
 +              /* Disable all VFTE/VFRE TX/RX */
 +              ixgbe_disable_tx_rx(adapter);
 +      }
 +
        /* disable receives */
        rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
        IXGBE_WRITE_REG(hw, IXGBE_RXCTRL, rxctrl & ~IXGBE_RXCTRL_RXEN);
@@@ -3450,19 -3291,6 +3450,19 @@@ static inline bool ixgbe_set_fcoe_queue
  }
  
  #endif /* IXGBE_FCOE */
 +/**
 + * ixgbe_set_sriov_queues: Allocate queues for IOV use
 + * @adapter: board private structure to initialize
 + *
 + * IOV doesn't actually use anything, so just NAK the
 + * request for now and let the other queue routines
 + * figure out what to do.
 + */
 +static inline bool ixgbe_set_sriov_queues(struct ixgbe_adapter *adapter)
 +{
 +      return false;
 +}
 +
  /*
   * ixgbe_set_num_queues: Allocate queues for device, feature dependant
   * @adapter: board private structure to initialize
   **/
  static void ixgbe_set_num_queues(struct ixgbe_adapter *adapter)
  {
 +      /* Start with base case */
 +      adapter->num_rx_queues = 1;
 +      adapter->num_tx_queues = 1;
 +      adapter->num_rx_pools = adapter->num_rx_queues;
 +      adapter->num_rx_queues_per_pool = 1;
 +
 +      if (ixgbe_set_sriov_queues(adapter))
 +              return;
 +
  #ifdef IXGBE_FCOE
        if (ixgbe_set_fcoe_queues(adapter))
                goto done;
@@@ -3756,24 -3575,6 +3756,24 @@@ static inline bool ixgbe_cache_ring_fco
  
  #endif /* IXGBE_FCOE */
  /**
 + * ixgbe_cache_ring_sriov - Descriptor ring to register mapping for sriov
 + * @adapter: board private structure to initialize
 + *
 + * SR-IOV doesn't use any descriptor rings but changes the default if
 + * no other mapping is used.
 + *
 + */
 +static inline bool ixgbe_cache_ring_sriov(struct ixgbe_adapter *adapter)
 +{
 +      adapter->rx_ring[0].reg_idx = adapter->num_vfs * 2;
 +      adapter->tx_ring[0].reg_idx = adapter->num_vfs * 2;
 +      if (adapter->num_vfs)
 +              return true;
 +      else
 +              return false;
 +}
 +
 +/**
   * ixgbe_cache_ring_register - Descriptor ring to register mapping
   * @adapter: board private structure to initialize
   *
@@@ -3790,9 -3591,6 +3790,9 @@@ static void ixgbe_cache_ring_register(s
        adapter->rx_ring[0].reg_idx = 0;
        adapter->tx_ring[0].reg_idx = 0;
  
 +      if (ixgbe_cache_ring_sriov(adapter))
 +              return;
 +
  #ifdef IXGBE_FCOE
        if (ixgbe_cache_ring_fcoe(adapter))
                return;
@@@ -3902,9 -3700,6 +3902,9 @@@ static int ixgbe_set_interrupt_capabili
        adapter->flags &= ~IXGBE_FLAG_FDIR_HASH_CAPABLE;
        adapter->flags &= ~IXGBE_FLAG_FDIR_PERFECT_CAPABLE;
        adapter->atr_sample_rate = 0;
 +      if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED)
 +              ixgbe_disable_sriov(adapter);
 +
        ixgbe_set_num_queues(adapter);
  
        err = pci_enable_msi(adapter->pdev);
@@@ -5384,7 -5179,7 +5384,7 @@@ dma_error
                ixgbe_unmap_and_free_tx_resource(adapter, tx_buffer_info);
        }
  
-       return count;
+       return 0;
  }
  
  static void ixgbe_tx_queue(struct ixgbe_adapter *adapter,
@@@ -5534,8 -5329,11 +5534,11 @@@ static u16 ixgbe_select_queue(struct ne
        struct ixgbe_adapter *adapter = netdev_priv(dev);
        int txq = smp_processor_id();
  
-       if (adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE)
+       if (adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE) {
+               while (unlikely(txq >= dev->real_num_tx_queues))
+                       txq -= dev->real_num_tx_queues;
                return txq;
+       }
  
  #ifdef IXGBE_FCOE
        if ((adapter->flags & IXGBE_FLAG_FCOE_ENABLED) &&
@@@ -5689,8 -5487,7 +5692,8 @@@ static int ixgbe_set_mac(struct net_dev
        memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
        memcpy(hw->mac.addr, addr->sa_data, netdev->addr_len);
  
 -      hw->mac.ops.set_rar(hw, 0, hw->mac.addr, 0, IXGBE_RAH_AV);
 +      hw->mac.ops.set_rar(hw, 0, hw->mac.addr, adapter->num_vfs,
 +                          IXGBE_RAH_AV);
  
        return 0;
  }
@@@ -5827,61 -5624,6 +5830,61 @@@ static const struct net_device_ops ixgb
  #endif /* IXGBE_FCOE */
  };
  
 +static void __devinit ixgbe_probe_vf(struct ixgbe_adapter *adapter,
 +                         const struct ixgbe_info *ii)
 +{
 +#ifdef CONFIG_PCI_IOV
 +      struct ixgbe_hw *hw = &adapter->hw;
 +      int err;
 +
 +      if (hw->mac.type != ixgbe_mac_82599EB || !max_vfs)
 +              return;
 +
 +      /* The 82599 supports up to 64 VFs per physical function
 +       * but this implementation limits allocation to 63 so that
 +       * basic networking resources are still available to the
 +       * physical function
 +       */
 +      adapter->num_vfs = (max_vfs > 63) ? 63 : max_vfs;
 +      adapter->flags |= IXGBE_FLAG_SRIOV_ENABLED;
 +      err = pci_enable_sriov(adapter->pdev, adapter->num_vfs);
 +      if (err) {
 +              DPRINTK(PROBE, ERR,
 +                      "Failed to enable PCI sriov: %d\n", err);
 +              goto err_novfs;
 +      }
 +      /* If call to enable VFs succeeded then allocate memory
 +       * for per VF control structures.
 +       */
 +      adapter->vfinfo =
 +              kcalloc(adapter->num_vfs,
 +                      sizeof(struct vf_data_storage), GFP_KERNEL);
 +      if (adapter->vfinfo) {
 +              /* Now that we're sure SR-IOV is enabled
 +               * and memory allocated set up the mailbox parameters
 +               */
 +              ixgbe_init_mbx_params_pf(hw);
 +              memcpy(&hw->mbx.ops, ii->mbx_ops,
 +                     sizeof(hw->mbx.ops));
 +
 +              /* Disable RSC when in SR-IOV mode */
 +              adapter->flags2 &= ~(IXGBE_FLAG2_RSC_CAPABLE |
 +                                   IXGBE_FLAG2_RSC_ENABLED);
 +              return;
 +      }
 +
 +      /* Oh oh */
 +      DPRINTK(PROBE, ERR,
 +              "Unable to allocate memory for VF "
 +              "Data Storage - SRIOV disabled\n");
 +      pci_disable_sriov(adapter->pdev);
 +
 +err_novfs:
 +      adapter->flags &= ~IXGBE_FLAG_SRIOV_ENABLED;
 +      adapter->num_vfs = 0;
 +#endif /* CONFIG_PCI_IOV */
 +}
 +
  /**
   * ixgbe_probe - Device Initialization Routine
   * @pdev: PCI device information struct
@@@ -6056,8 -5798,6 +6059,8 @@@ static int __devinit ixgbe_probe(struc
                goto err_sw_init;
        }
  
 +      ixgbe_probe_vf(adapter, ii);
 +
        netdev->features = NETIF_F_SG |
                           NETIF_F_IP_CSUM |
                           NETIF_F_HW_VLAN_TX |
        netdev->vlan_features |= NETIF_F_IPV6_CSUM;
        netdev->vlan_features |= NETIF_F_SG;
  
 +      if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED)
 +              adapter->flags &= ~(IXGBE_FLAG_RSS_ENABLED |
 +                                  IXGBE_FLAG_DCB_ENABLED);
        if (adapter->flags & IXGBE_FLAG_DCB_ENABLED)
                adapter->flags &= ~IXGBE_FLAG_RSS_ENABLED;
  
                ixgbe_setup_dca(adapter);
        }
  #endif
 +      if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED) {
 +              DPRINTK(PROBE, INFO, "IOV is enabled with %d VFs\n",
 +                      adapter->num_vfs);
 +              for (i = 0; i < adapter->num_vfs; i++)
 +                      ixgbe_vf_configuration(pdev, (i | 0x10000000));
 +      }
 +
        /* add san mac addr to netdev */
        ixgbe_add_sanmac_netdev(netdev);
  
@@@ -6226,8 -5956,6 +6229,8 @@@ err_register
        ixgbe_clear_interrupt_scheme(adapter);
  err_sw_init:
  err_eeprom:
 +      if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED)
 +              ixgbe_disable_sriov(adapter);
        clear_bit(__IXGBE_SFP_MODULE_NOT_FOUND, &adapter->state);
        del_timer_sync(&adapter->sfp_timer);
        cancel_work_sync(&adapter->sfp_task);
@@@ -6296,9 -6024,6 +6299,9 @@@ static void __devexit ixgbe_remove(stru
        if (netdev->reg_state == NETREG_REGISTERED)
                unregister_netdev(netdev);
  
 +      if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED)
 +              ixgbe_disable_sriov(adapter);
 +
        ixgbe_clear_interrupt_scheme(adapter);
  
        ixgbe_release_hw_control(adapter);
@@@ -19,7 -19,7 +19,7 @@@
   * MA  02111-1307, USA.
   *
   * The full GNU General Public License is included in this distribution
 - * in the file called LICENSE.
 + * in the file called "COPYING".
   *
   */
  
@@@ -35,7 -35,6 +35,7 @@@
  #include <linux/ipv6.h>
  #include <linux/inetdevice.h>
  #include <linux/sysfs.h>
 +#include <linux/aer.h>
  
  MODULE_DESCRIPTION("QLogic/NetXen (1/10) GbE Converged Ethernet Driver");
  MODULE_LICENSE("GPL");
@@@ -85,7 -84,6 +85,7 @@@ static void netxen_remove_sysfs_entries
  static void netxen_create_diag_entries(struct netxen_adapter *adapter);
  static void netxen_remove_diag_entries(struct netxen_adapter *adapter);
  
 +static int nx_dev_request_aer(struct netxen_adapter *adapter);
  static int nx_decr_dev_ref_cnt(struct netxen_adapter *adapter);
  static int netxen_can_start_firmware(struct netxen_adapter *adapter);
  
@@@ -100,7 -98,7 +100,7 @@@ static void netxen_config_indev_addr(st
        {PCI_DEVICE(PCI_VENDOR_ID_NETXEN, (device)), \
        .class = PCI_CLASS_NETWORK_ETHERNET << 8, .class_mask = ~0}
  
 -static struct pci_device_id netxen_pci_tbl[] __devinitdata = {
 +static DEFINE_PCI_DEVICE_TABLE(netxen_pci_tbl) = {
        ENTRY(PCI_DEVICE_ID_NX2031_10GXSR),
        ENTRY(PCI_DEVICE_ID_NX2031_10GCX4),
        ENTRY(PCI_DEVICE_ID_NX2031_4GCU),
@@@ -432,7 -430,7 +432,7 @@@ netxen_read_mac_addr(struct netxen_adap
  {
        int i;
        unsigned char *p;
 -      __le64 mac_addr;
 +      u64 mac_addr;
        struct net_device *netdev = adapter->netdev;
        struct pci_dev *pdev = adapter->pdev;
  
@@@ -1264,9 -1262,6 +1264,9 @@@ netxen_nic_probe(struct pci_dev *pdev, 
        if ((err = pci_request_regions(pdev, netxen_nic_driver_name)))
                goto err_out_disable_pdev;
  
 +      if (NX_IS_REVISION_P3(pdev->revision))
 +              pci_enable_pcie_error_reporting(pdev);
 +
        pci_set_master(pdev);
  
        netdev = alloc_etherdev(sizeof(struct netxen_adapter));
@@@ -1414,19 -1409,17 +1414,19 @@@ static void __devexit netxen_nic_remove
  
        netxen_release_firmware(adapter);
  
 +      if (NX_IS_REVISION_P3(pdev->revision))
 +              pci_disable_pcie_error_reporting(pdev);
 +
        pci_release_regions(pdev);
        pci_disable_device(pdev);
        pci_set_drvdata(pdev, NULL);
  
        free_netdev(netdev);
  }
 -static int __netxen_nic_shutdown(struct pci_dev *pdev)
 +
 +static void netxen_nic_detach_func(struct netxen_adapter *adapter)
  {
 -      struct netxen_adapter *adapter = pci_get_drvdata(pdev);
        struct net_device *netdev = adapter->netdev;
 -      int retval;
  
        netif_device_detach(netdev);
  
        nx_decr_dev_ref_cnt(adapter);
  
        clear_bit(__NX_RESETTING, &adapter->state);
 -
 -      retval = pci_save_state(pdev);
 -      if (retval)
 -              return retval;
 -
 -      if (netxen_nic_wol_supported(adapter)) {
 -              pci_enable_wake(pdev, PCI_D3cold, 1);
 -              pci_enable_wake(pdev, PCI_D3hot, 1);
 -      }
 -
 -      pci_disable_device(pdev);
 -
 -      return 0;
  }
 -static void netxen_nic_shutdown(struct pci_dev *pdev)
 -{
 -      if (__netxen_nic_shutdown(pdev))
 -              return;
 -}
 -#ifdef CONFIG_PM
 -static int
 -netxen_nic_suspend(struct pci_dev *pdev, pm_message_t state)
 -{
 -      int retval;
 -
 -      retval = __netxen_nic_shutdown(pdev);
 -      if (retval)
 -              return retval;
  
 -      pci_set_power_state(pdev, pci_choose_state(pdev, state));
 -      return 0;
 -}
 -
 -static int
 -netxen_nic_resume(struct pci_dev *pdev)
 +static int netxen_nic_attach_func(struct pci_dev *pdev)
  {
        struct netxen_adapter *adapter = pci_get_drvdata(pdev);
        struct net_device *netdev = adapter->netdev;
        int err;
  
 -      pci_set_power_state(pdev, PCI_D0);
 -      pci_restore_state(pdev);
 -
        err = pci_enable_device(pdev);
        if (err)
                return err;
  
 +      pci_set_power_state(pdev, PCI_D0);
 +      pci_set_master(pdev);
 +      pci_restore_state(pdev);
 +
        adapter->ahw.crb_win = -1;
        adapter->ahw.ocm_win = -1;
  
                if (err)
                        goto err_out_detach;
  
                netxen_config_indev_addr(netdev, NETDEV_UP);
        }
  
 +      netif_device_attach(netdev);
        netxen_schedule_work(adapter, netxen_fw_poll_work, FW_POLL_DELAY);
        return 0;
  
@@@ -1492,85 -1517,6 +1492,85 @@@ err_out
        nx_decr_dev_ref_cnt(adapter);
        return err;
  }
 +
 +static pci_ers_result_t netxen_io_error_detected(struct pci_dev *pdev,
 +                                              pci_channel_state_t state)
 +{
 +      struct netxen_adapter *adapter = pci_get_drvdata(pdev);
 +
 +      if (state == pci_channel_io_perm_failure)
 +              return PCI_ERS_RESULT_DISCONNECT;
 +
 +      if (nx_dev_request_aer(adapter))
 +              return PCI_ERS_RESULT_RECOVERED;
 +
 +      netxen_nic_detach_func(adapter);
 +
 +      pci_disable_device(pdev);
 +
 +      return PCI_ERS_RESULT_NEED_RESET;
 +}
 +
 +static pci_ers_result_t netxen_io_slot_reset(struct pci_dev *pdev)
 +{
 +      int err = 0;
 +
 +      err = netxen_nic_attach_func(pdev);
 +
 +      return err ? PCI_ERS_RESULT_DISCONNECT : PCI_ERS_RESULT_RECOVERED;
 +}
 +
 +static void netxen_io_resume(struct pci_dev *pdev)
 +{
 +      pci_cleanup_aer_uncorrect_error_status(pdev);
 +}
 +
 +static void netxen_nic_shutdown(struct pci_dev *pdev)
 +{
 +      struct netxen_adapter *adapter = pci_get_drvdata(pdev);
 +
 +      netxen_nic_detach_func(adapter);
 +
 +      if (pci_save_state(pdev))
 +              return;
 +
 +      if (netxen_nic_wol_supported(adapter)) {
 +              pci_enable_wake(pdev, PCI_D3cold, 1);
 +              pci_enable_wake(pdev, PCI_D3hot, 1);
 +      }
 +
 +      pci_disable_device(pdev);
 +}
 +
 +#ifdef CONFIG_PM
 +static int
 +netxen_nic_suspend(struct pci_dev *pdev, pm_message_t state)
 +{
 +      struct netxen_adapter *adapter = pci_get_drvdata(pdev);
 +      int retval;
 +
 +      netxen_nic_detach_func(adapter);
 +
 +      retval = pci_save_state(pdev);
 +      if (retval)
 +              return retval;
 +
 +      if (netxen_nic_wol_supported(adapter)) {
 +              pci_enable_wake(pdev, PCI_D3cold, 1);
 +              pci_enable_wake(pdev, PCI_D3hot, 1);
 +      }
 +
 +      pci_disable_device(pdev);
 +      pci_set_power_state(pdev, pci_choose_state(pdev, state));
 +
 +      return 0;
 +}
 +
 +static int
 +netxen_nic_resume(struct pci_dev *pdev)
 +{
 +      return netxen_nic_attach_func(pdev);
 +}
  #endif
  
  static int netxen_nic_open(struct net_device *netdev)
@@@ -1995,7 -1941,7 +1995,7 @@@ static void netxen_tx_timeout_task(stru
                netif_wake_queue(adapter->netdev);
  
                clear_bit(__NX_RESETTING, &adapter->state);
+               return;
        } else {
                clear_bit(__NX_RESETTING, &adapter->state);
                if (!netxen_nic_reset_context(adapter)) {
@@@ -2158,49 -2104,20 +2158,49 @@@ nx_decr_dev_ref_cnt(struct netxen_adapt
        return count;
  }
  
 -static void
 +static int
 +nx_dev_request_aer(struct netxen_adapter *adapter)
 +{
 +      u32 state;
 +      int ret = -EINVAL;
 +
 +      if (netxen_api_lock(adapter))
 +              return ret;
 +
 +      state = NXRD32(adapter, NX_CRB_DEV_STATE);
 +
 +      if (state == NX_DEV_NEED_AER)
 +              ret = 0;
 +      else if (state == NX_DEV_READY) {
 +              NXWR32(adapter, NX_CRB_DEV_STATE, NX_DEV_NEED_AER);
 +              ret = 0;
 +      }
 +
 +      netxen_api_unlock(adapter);
 +      return ret;
 +}
 +
 +static int
  nx_dev_request_reset(struct netxen_adapter *adapter)
  {
        u32 state;
 +      int ret = -EINVAL;
  
        if (netxen_api_lock(adapter))
 -              return;
 +              return ret;
  
        state = NXRD32(adapter, NX_CRB_DEV_STATE);
  
 -      if (state != NX_DEV_INITALIZING)
 +      if (state == NX_DEV_NEED_RESET)
 +              ret = 0;
 +      else if (state != NX_DEV_INITALIZING && state != NX_DEV_NEED_AER) {
                NXWR32(adapter, NX_CRB_DEV_STATE, NX_DEV_NEED_RESET);
 +              ret = 0;
 +      }
  
        netxen_api_unlock(adapter);
 +
 +      return ret;
  }
  
  static int
@@@ -2323,7 -2240,9 +2323,9 @@@ netxen_detach_work(struct work_struct *
  
        netxen_nic_down(adapter, netdev);
  
+       rtnl_lock();
        netxen_nic_detach(adapter);
+       rtnl_unlock();
  
        status = NXRD32(adapter, NETXEN_PEG_HALT_STATUS1);
  
@@@ -2352,29 -2271,17 +2354,29 @@@ netxen_check_health(struct netxen_adapt
        u32 state, heartbit;
        struct net_device *netdev = adapter->netdev;
  
 +      state = NXRD32(adapter, NX_CRB_DEV_STATE);
 +      if (state == NX_DEV_NEED_AER)
 +              return 0;
 +
        if (netxen_nic_check_temp(adapter))
                goto detach;
  
        if (adapter->need_fw_reset) {
 -              nx_dev_request_reset(adapter);
 +              if (nx_dev_request_reset(adapter))
 +                      return 0;
                goto detach;
        }
  
 -      state = NXRD32(adapter, NX_CRB_DEV_STATE);
 -      if (state == NX_DEV_NEED_RESET)
 -              goto detach;
 +      /* NX_DEV_NEED_RESET, this state can be marked in two cases
 +       * 1. Tx timeout 2. Fw hang
 +       * Send request to destroy context in case of tx timeout only
 +       * and doesn't required in case of Fw hang
 +       */
 +      if (state == NX_DEV_NEED_RESET) {
 +              adapter->need_fw_reset = 1;
 +              if (NX_IS_REVISION_P2(adapter->ahw.revision_id))
 +                      goto detach;
 +      }
  
        if (NX_IS_REVISION_P2(adapter->ahw.revision_id))
                return 0;
        if (heartbit != adapter->heartbit) {
                adapter->heartbit = heartbit;
                adapter->fw_fail_cnt = 0;
 +              if (adapter->need_fw_reset)
 +                      goto detach;
                return 0;
        }
  
        if (++adapter->fw_fail_cnt < FW_FAIL_THRESH)
                return 0;
  
 +      if (nx_dev_request_reset(adapter))
 +              return 0;
 +
        clear_bit(__NX_FW_ATTACHED, &adapter->state);
  
        dev_info(&netdev->dev, "firmware hang detected\n");
@@@ -2596,7 -2498,7 +2598,7 @@@ netxen_sysfs_read_mem(struct kobject *k
        return size;
  }
  
 -ssize_t netxen_sysfs_write_mem(struct kobject *kobj,
 +static ssize_t netxen_sysfs_write_mem(struct kobject *kobj,
                struct bin_attribute *attr, char *buf,
                loff_t offset, size_t size)
  {
@@@ -2823,12 -2725,6 +2825,12 @@@ netxen_config_indev_addr(struct net_dev
  { }
  #endif
  
 +static struct pci_error_handlers netxen_err_handler = {
 +      .error_detected = netxen_io_error_detected,
 +      .slot_reset = netxen_io_slot_reset,
 +      .resume = netxen_io_resume,
 +};
 +
  static struct pci_driver netxen_driver = {
        .name = netxen_nic_driver_name,
        .id_table = netxen_pci_tbl,
        .suspend = netxen_nic_suspend,
        .resume = netxen_nic_resume,
  #endif
 -      .shutdown = netxen_nic_shutdown
 +      .shutdown = netxen_nic_shutdown,
 +      .err_handler = &netxen_err_handler
  };
  
  static int __init netxen_init_module(void)
diff --combined drivers/net/sky2.c
@@@ -1025,11 -1025,8 +1025,8 @@@ static void sky2_prefetch_init(struct s
  static inline struct sky2_tx_le *get_tx_le(struct sky2_port *sky2, u16 *slot)
  {
        struct sky2_tx_le *le = sky2->tx_le + *slot;
-       struct tx_ring_info *re = sky2->tx_ring + *slot;
  
        *slot = RING_NEXT(*slot, sky2->tx_ring_size);
-       re->flags = 0;
-       re->skb = NULL;
        le->ctrl = 0;
        return le;
  }
@@@ -1622,8 -1619,7 +1619,7 @@@ static unsigned tx_le_req(const struct 
        return count;
  }
  
- static void sky2_tx_unmap(struct pci_dev *pdev,
-                         const struct tx_ring_info *re)
+ static void sky2_tx_unmap(struct pci_dev *pdev, struct tx_ring_info *re)
  {
        if (re->flags & TX_MAP_SINGLE)
                pci_unmap_single(pdev, pci_unmap_addr(re, mapaddr),
                pci_unmap_page(pdev, pci_unmap_addr(re, mapaddr),
                               pci_unmap_len(re, maplen),
                               PCI_DMA_TODEVICE);
+       re->flags = 0;
  }
  
  /*
@@@ -1839,6 -1836,7 +1836,7 @@@ static void sky2_tx_complete(struct sky
                        dev->stats.tx_packets++;
                        dev->stats.tx_bytes += skb->len;
  
+                       re->skb = NULL;
                        dev_kfree_skb_any(skb);
  
                        sky2->tx_next = RING_NEXT(idx, sky2->tx_ring_size);
@@@ -3190,9 -3188,7 +3188,9 @@@ static void sky2_reset(struct sky2_hw *
  static void sky2_detach(struct net_device *dev)
  {
        if (netif_running(dev)) {
 +              netif_tx_lock(dev);
                netif_device_detach(dev);       /* stop txq */
 +              netif_tx_unlock(dev);
                sky2_down(dev);
        }
  }
@@@ -3868,50 -3864,6 +3866,50 @@@ static int sky2_get_regs_len(struct net
        return 0x4000;
  }
  
 +static int sky2_reg_access_ok(struct sky2_hw *hw, unsigned int b)
 +{
 +      /* This complicated switch statement is to make sure and
 +       * only access regions that are unreserved.
 +       * Some blocks are only valid on dual port cards.
 +       */
 +      switch (b) {
 +      /* second port */
 +      case 5:         /* Tx Arbiter 2 */
 +      case 9:         /* RX2 */
 +      case 14 ... 15: /* TX2 */
 +      case 17: case 19: /* Ram Buffer 2 */
 +      case 22 ... 23: /* Tx Ram Buffer 2 */
 +      case 25:        /* Rx MAC Fifo 1 */
 +      case 27:        /* Tx MAC Fifo 2 */
 +      case 31:        /* GPHY 2 */
 +      case 40 ... 47: /* Pattern Ram 2 */
 +      case 52: case 54: /* TCP Segmentation 2 */
 +      case 112 ... 116: /* GMAC 2 */
 +              return hw->ports > 1;
 +
 +      case 0:         /* Control */
 +      case 2:         /* Mac address */
 +      case 4:         /* Tx Arbiter 1 */
 +      case 7:         /* PCI express reg */
 +      case 8:         /* RX1 */
 +      case 12 ... 13: /* TX1 */
 +      case 16: case 18:/* Rx Ram Buffer 1 */
 +      case 20 ... 21: /* Tx Ram Buffer 1 */
 +      case 24:        /* Rx MAC Fifo 1 */
 +      case 26:        /* Tx MAC Fifo 1 */
 +      case 28 ... 29: /* Descriptor and status unit */
 +      case 30:        /* GPHY 1*/
 +      case 32 ... 39: /* Pattern Ram 1 */
 +      case 48: case 50: /* TCP Segmentation 1 */
 +      case 56 ... 60: /* PCI space */
 +      case 80 ... 84: /* GMAC 1 */
 +              return 1;
 +
 +      default:
 +              return 0;
 +      }
 +}
 +
  /*
   * Returns copy of control register region
   * Note: ethtool_get_regs always provides full size (16k) buffer
@@@ -3926,13 -3878,55 +3924,13 @@@ static void sky2_get_regs(struct net_de
        regs->version = 1;
  
        for (b = 0; b < 128; b++) {
 -              /* This complicated switch statement is to make sure and
 -               * only access regions that are unreserved.
 -               * Some blocks are only valid on dual port cards.
 -               * and block 3 has some special diagnostic registers that
 -               * are poison.
 -               */
 -              switch (b) {
 -              case 3:
 -                      /* skip diagnostic ram region */
 +              /* skip poisonous diagnostic ram region in block 3 */
 +              if (b == 3)
                        memcpy_fromio(p + 0x10, io + 0x10, 128 - 0x10);
 -                      break;
 -
 -              /* dual port cards only */
 -              case 5:         /* Tx Arbiter 2 */
 -              case 9:         /* RX2 */
 -              case 14 ... 15: /* TX2 */
 -              case 17: case 19: /* Ram Buffer 2 */
 -              case 22 ... 23: /* Tx Ram Buffer 2 */
 -              case 25:        /* Rx MAC Fifo 1 */
 -              case 27:        /* Tx MAC Fifo 2 */
 -              case 31:        /* GPHY 2 */
 -              case 40 ... 47: /* Pattern Ram 2 */
 -              case 52: case 54: /* TCP Segmentation 2 */
 -              case 112 ... 116: /* GMAC 2 */
 -                      if (sky2->hw->ports == 1)
 -                              goto reserved;
 -                      /* fall through */
 -              case 0:         /* Control */
 -              case 2:         /* Mac address */
 -              case 4:         /* Tx Arbiter 1 */
 -              case 7:         /* PCI express reg */
 -              case 8:         /* RX1 */
 -              case 12 ... 13: /* TX1 */
 -              case 16: case 18:/* Rx Ram Buffer 1 */
 -              case 20 ... 21: /* Tx Ram Buffer 1 */
 -              case 24:        /* Rx MAC Fifo 1 */
 -              case 26:        /* Tx MAC Fifo 1 */
 -              case 28 ... 29: /* Descriptor and status unit */
 -              case 30:        /* GPHY 1*/
 -              case 32 ... 39: /* Pattern Ram 1 */
 -              case 48: case 50: /* TCP Segmentation 1 */
 -              case 56 ... 60: /* PCI space */
 -              case 80 ... 84: /* GMAC 1 */
 +              else if (sky2_reg_access_ok(sky2->hw, b))
                        memcpy_fromio(p, io, 128);
 -                      break;
 -              default:
 -reserved:
 +              else
                        memset(p, 0, 128);
 -              }
  
                p += 128;
                io += 128;
diff --combined net/key/af_key.c
@@@ -3019,11 -3019,12 +3019,11 @@@ static int pfkey_send_policy_notify(str
  static u32 get_acqseq(void)
  {
        u32 res;
 -      static u32 acqseq;
 -      static DEFINE_SPINLOCK(acqseq_lock);
 +      static atomic_t acqseq;
  
 -      spin_lock_bh(&acqseq_lock);
 -      res = (++acqseq ? : ++acqseq);
 -      spin_unlock_bh(&acqseq_lock);
 +      do {
 +              res = atomic_inc_return(&acqseq);
 +      } while (!res);
        return res;
  }
  
@@@ -3737,17 -3738,17 +3737,17 @@@ static int __net_init pfkey_init_proc(s
        return 0;
  }
  
 -static void pfkey_exit_proc(struct net *net)
 +static void __net_exit pfkey_exit_proc(struct net *net)
  {
        proc_net_remove(net, "pfkey");
  }
  #else
 -static int __net_init pfkey_init_proc(struct net *net)
 +static inline int pfkey_init_proc(struct net *net)
  {
        return 0;
  }
  
 -static void pfkey_exit_proc(struct net *net)
 +static inline void pfkey_exit_proc(struct net *net)
  {
  }
  #endif
@@@ -3793,9 -3794,9 +3793,9 @@@ static struct pernet_operations pfkey_n
  
  static void __exit ipsec_pfkey_exit(void)
  {
-       unregister_pernet_subsys(&pfkey_net_ops);
        xfrm_unregister_km(&pfkeyv2_mgr);
        sock_unregister(PF_KEY);
+       unregister_pernet_subsys(&pfkey_net_ops);
        proto_unregister(&key_proto);
  }
  
@@@ -3806,21 -3807,22 +3806,22 @@@ static int __init ipsec_pfkey_init(void
        if (err != 0)
                goto out;
  
-       err = sock_register(&pfkey_family_ops);
+       err = register_pernet_subsys(&pfkey_net_ops);
        if (err != 0)
                goto out_unregister_key_proto;
+       err = sock_register(&pfkey_family_ops);
+       if (err != 0)
+               goto out_unregister_pernet;
        err = xfrm_register_km(&pfkeyv2_mgr);
        if (err != 0)
                goto out_sock_unregister;
-       err = register_pernet_subsys(&pfkey_net_ops);
-       if (err != 0)
-               goto out_xfrm_unregister_km;
  out:
        return err;
- out_xfrm_unregister_km:
-       xfrm_unregister_km(&pfkeyv2_mgr);
  out_sock_unregister:
        sock_unregister(PF_KEY);
+ out_unregister_pernet:
+       unregister_pernet_subsys(&pfkey_net_ops);
  out_unregister_key_proto:
        proto_unregister(&key_proto);
        goto out;