ixgbe: fix smatch splat due to missing NULL check
[platform/kernel/linux-arm64.git] / drivers / net / ethernet / intel / ixgbe / ixgbe_main.c
index 9cd44ad..8ef92d1 100644 (file)
@@ -56,8 +56,8 @@ char ixgbe_driver_name[] = "ixgbe";
 static const char ixgbe_driver_string[] =
                              "Intel(R) 10 Gigabit PCI Express Network Driver";
 #define MAJ 3
-#define MIN 4
-#define BUILD 8
+#define MIN 6
+#define BUILD 7
 #define DRV_VERSION __stringify(MAJ) "." __stringify(MIN) "." \
        __stringify(BUILD) "-k"
 const char ixgbe_driver_version[] = DRV_VERSION;
@@ -105,6 +105,7 @@ static DEFINE_PCI_DEVICE_TABLE(ixgbe_pci_tbl) = {
        {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_X540T), board_X540 },
        {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_SFP_SF2), board_82599 },
        {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_LS), board_82599 },
+       {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599EN_SFP), board_82599 },
        /* required last entry */
        {0, }
 };
@@ -1325,7 +1326,7 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
 
                        skb->len += upper_len;
                        skb->data_len += upper_len;
-                       skb->truesize += upper_len;
+                       skb->truesize += PAGE_SIZE / 2;
                }
 
                i++;
@@ -2815,6 +2816,7 @@ static void ixgbe_configure_virtualization(struct ixgbe_adapter *adapter)
        u32 vt_reg_bits;
        u32 reg_offset, vf_shift;
        u32 vmdctl;
+       int i;
 
        if (!(adapter->flags & IXGBE_FLAG_SRIOV_ENABLED))
                return;
@@ -2850,9 +2852,13 @@ static void ixgbe_configure_virtualization(struct ixgbe_adapter *adapter)
        IXGBE_WRITE_REG(hw, IXGBE_PFDTXGSWC, IXGBE_PFDTXGSWC_VT_LBEN);
        /* Enable MAC Anti-Spoofing */
        hw->mac.ops.set_mac_anti_spoofing(hw,
-                                         (adapter->antispoofing_enabled =
-                                          (adapter->num_vfs != 0)),
+                                          (adapter->num_vfs != 0),
                                          adapter->num_vfs);
+       /* For VFs that have spoof checking turned off */
+       for (i = 0; i < adapter->num_vfs; i++) {
+               if (!adapter->vfinfo[i].spoofchk_enabled)
+                       ixgbe_ndo_set_vf_spoofchk(adapter->netdev, i, false);
+       }
 }
 
 static void ixgbe_set_rx_buffer_len(struct ixgbe_adapter *adapter)
@@ -3339,32 +3345,25 @@ static void ixgbe_configure_dcb(struct ixgbe_adapter *adapter)
 
        hw->mac.ops.set_vfta(&adapter->hw, 0, 0, true);
 
-       /* reconfigure the hardware */
-       if (adapter->dcbx_cap & DCB_CAP_DCBX_VER_CEE) {
 #ifdef IXGBE_FCOE
-               if (adapter->netdev->features & NETIF_F_FCOE_MTU)
-                       max_frame = max(max_frame, IXGBE_FCOE_JUMBO_FRAME_SIZE);
+       if (adapter->netdev->features & NETIF_F_FCOE_MTU)
+               max_frame = max(max_frame, IXGBE_FCOE_JUMBO_FRAME_SIZE);
 #endif
+
+       /* reconfigure the hardware */
+       if (adapter->dcbx_cap & DCB_CAP_DCBX_VER_CEE) {
                ixgbe_dcb_calculate_tc_credits(hw, &adapter->dcb_cfg, max_frame,
                                                DCB_TX_CONFIG);
                ixgbe_dcb_calculate_tc_credits(hw, &adapter->dcb_cfg, max_frame,
                                                DCB_RX_CONFIG);
                ixgbe_dcb_hw_config(hw, &adapter->dcb_cfg);
-       } else {
-               struct net_device *dev = adapter->netdev;
-
-               if (adapter->ixgbe_ieee_ets) {
-                       struct ieee_ets *ets = adapter->ixgbe_ieee_ets;
-                       int max_frame = dev->mtu + ETH_HLEN + ETH_FCS_LEN;
-
-                       ixgbe_dcb_hw_ets(&adapter->hw, ets, max_frame);
-               }
-
-               if (adapter->ixgbe_ieee_pfc) {
-                       struct ieee_pfc *pfc = adapter->ixgbe_ieee_pfc;
-
-                       ixgbe_dcb_hw_pfc_config(&adapter->hw, pfc->pfc_en);
-               }
+       } else if (adapter->ixgbe_ieee_ets && adapter->ixgbe_ieee_pfc) {
+               ixgbe_dcb_hw_ets(&adapter->hw,
+                                adapter->ixgbe_ieee_ets,
+                                max_frame);
+               ixgbe_dcb_hw_pfc_config(&adapter->hw,
+                                       adapter->ixgbe_ieee_pfc->pfc_en,
+                                       adapter->ixgbe_ieee_ets->prio_tc);
        }
 
        /* Enable RSS Hash per TC */
@@ -4240,7 +4239,6 @@ static inline bool ixgbe_set_dcb_queues(struct ixgbe_adapter *adapter)
        q = min((int)num_online_cpus(), per_tc_q);
 
        for (i = 0; i < tcs; i++) {
-               netdev_set_prio_tc_map(dev, i, i);
                netdev_set_tc_queue(dev, i, q, offset);
                offset += q;
        }
@@ -4988,6 +4986,17 @@ static int __devinit ixgbe_sw_init(struct ixgbe_adapter *adapter)
        spin_lock_init(&adapter->fdir_perfect_lock);
 
 #ifdef CONFIG_IXGBE_DCB
+       switch (hw->mac.type) {
+       case ixgbe_mac_X540:
+               adapter->dcb_cfg.num_tcs.pg_tcs = X540_TRAFFIC_CLASS;
+               adapter->dcb_cfg.num_tcs.pfc_tcs = X540_TRAFFIC_CLASS;
+               break;
+       default:
+               adapter->dcb_cfg.num_tcs.pg_tcs = MAX_TRAFFIC_CLASS;
+               adapter->dcb_cfg.num_tcs.pfc_tcs = MAX_TRAFFIC_CLASS;
+               break;
+       }
+
        /* Configure DCB traffic classes */
        for (j = 0; j < MAX_TRAFFIC_CLASS; j++) {
                tc = &adapter->dcb_cfg.tc_config[j];
@@ -4997,6 +5006,12 @@ static int __devinit ixgbe_sw_init(struct ixgbe_adapter *adapter)
                tc->path[DCB_RX_CONFIG].bwg_percent = 12 + (j & 1);
                tc->dcb_pfc = pfc_disabled;
        }
+
+       /* Initialize default user to priority mapping, UPx->TC0 */
+       tc = &adapter->dcb_cfg.tc_config[0];
+       tc->path[DCB_TX_CONFIG].up_to_tc_bitmap = 0xFF;
+       tc->path[DCB_RX_CONFIG].up_to_tc_bitmap = 0xFF;
+
        adapter->dcb_cfg.bw_percentage[DCB_TX_CONFIG][0] = 100;
        adapter->dcb_cfg.bw_percentage[DCB_RX_CONFIG][0] = 100;
        adapter->dcb_cfg.pfc_mode_enable = false;
@@ -5533,6 +5548,11 @@ void ixgbe_update_stats(struct ixgbe_adapter *adapter)
        u64 non_eop_descs = 0, restart_queue = 0, tx_busy = 0;
        u64 alloc_rx_page_failed = 0, alloc_rx_buff_failed = 0;
        u64 bytes = 0, packets = 0;
+#ifdef IXGBE_FCOE
+       struct ixgbe_fcoe *fcoe = &adapter->fcoe;
+       unsigned int cpu;
+       u64 fcoe_noddp_counts_sum = 0, fcoe_noddp_ext_buff_counts_sum = 0;
+#endif /* IXGBE_FCOE */
 
        if (test_bit(__IXGBE_DOWN, &adapter->state) ||
            test_bit(__IXGBE_RESETTING, &adapter->state))
@@ -5660,6 +5680,18 @@ void ixgbe_update_stats(struct ixgbe_adapter *adapter)
                hwstats->fcoeptc += IXGBE_READ_REG(hw, IXGBE_FCOEPTC);
                hwstats->fcoedwrc += IXGBE_READ_REG(hw, IXGBE_FCOEDWRC);
                hwstats->fcoedwtc += IXGBE_READ_REG(hw, IXGBE_FCOEDWTC);
+               /* Add up per cpu counters for total ddp aloc fail */
+               if (fcoe->pcpu_noddp && fcoe->pcpu_noddp_ext_buff) {
+                       for_each_possible_cpu(cpu) {
+                               fcoe_noddp_counts_sum +=
+                                       *per_cpu_ptr(fcoe->pcpu_noddp, cpu);
+                               fcoe_noddp_ext_buff_counts_sum +=
+                                       *per_cpu_ptr(fcoe->
+                                               pcpu_noddp_ext_buff, cpu);
+                       }
+               }
+               hwstats->fcoe_noddp = fcoe_noddp_counts_sum;
+               hwstats->fcoe_noddp_ext_buff = fcoe_noddp_ext_buff_counts_sum;
 #endif /* IXGBE_FCOE */
                break;
        default:
@@ -5978,7 +6010,8 @@ static void ixgbe_spoof_check(struct ixgbe_adapter *adapter)
 static void ixgbe_watchdog_subtask(struct ixgbe_adapter *adapter)
 {
        /* if interface is down do nothing */
-       if (test_bit(__IXGBE_DOWN, &adapter->state))
+       if (test_bit(__IXGBE_DOWN, &adapter->state) ||
+           test_bit(__IXGBE_RESETTING, &adapter->state))
                return;
 
        ixgbe_watchdog_update_link(adapter);
@@ -6083,7 +6116,6 @@ static void ixgbe_sfp_link_config_subtask(struct ixgbe_adapter *adapter)
        autoneg = hw->phy.autoneg_advertised;
        if ((!autoneg) && (hw->mac.ops.get_link_capabilities))
                hw->mac.ops.get_link_capabilities(hw, &autoneg, &negotiation);
-       hw->mac.autotry_restart = false;
        if (hw->mac.ops.setup_link)
                hw->mac.ops.setup_link(hw, autoneg, negotiation, true);
 
@@ -6092,6 +6124,51 @@ static void ixgbe_sfp_link_config_subtask(struct ixgbe_adapter *adapter)
        clear_bit(__IXGBE_IN_SFP_INIT, &adapter->state);
 }
 
+#ifdef CONFIG_PCI_IOV
+static void ixgbe_check_for_bad_vf(struct ixgbe_adapter *adapter)
+{
+       int vf;
+       struct ixgbe_hw *hw = &adapter->hw;
+       struct net_device *netdev = adapter->netdev;
+       u32 gpc;
+       u32 ciaa, ciad;
+
+       gpc = IXGBE_READ_REG(hw, IXGBE_TXDGPC);
+       if (gpc) /* If incrementing then no need for the check below */
+               return;
+       /*
+        * Check to see if a bad DMA write target from an errant or
+        * malicious VF has caused a PCIe error.  If so then we can
+        * issue a VFLR to the offending VF(s) and then resume without
+        * requesting a full slot reset.
+        */
+
+       for (vf = 0; vf < adapter->num_vfs; vf++) {
+               ciaa = (vf << 16) | 0x80000000;
+               /* 32 bit read so align, we really want status at offset 6 */
+               ciaa |= PCI_COMMAND;
+               IXGBE_WRITE_REG(hw, IXGBE_CIAA_82599, ciaa);
+               ciad = IXGBE_READ_REG(hw, IXGBE_CIAD_82599);
+               ciaa &= 0x7FFFFFFF;
+               /* disable debug mode asap after reading data */
+               IXGBE_WRITE_REG(hw, IXGBE_CIAA_82599, ciaa);
+               /* Get the upper 16 bits which will be the PCI status reg */
+               ciad >>= 16;
+               if (ciad & PCI_STATUS_REC_MASTER_ABORT) {
+                       netdev_err(netdev, "VF %d Hung DMA\n", vf);
+                       /* Issue VFLR */
+                       ciaa = (vf << 16) | 0x80000000;
+                       ciaa |= 0xA8;
+                       IXGBE_WRITE_REG(hw, IXGBE_CIAA_82599, ciaa);
+                       ciad = 0x00008000;  /* VFLR */
+                       IXGBE_WRITE_REG(hw, IXGBE_CIAD_82599, ciad);
+                       ciaa &= 0x7FFFFFFF;
+                       IXGBE_WRITE_REG(hw, IXGBE_CIAA_82599, ciaa);
+               }
+       }
+}
+
+#endif
 /**
  * ixgbe_service_timer - Timer Call-back
  * @data: pointer to adapter cast into an unsigned long
@@ -6100,17 +6177,49 @@ static void ixgbe_service_timer(unsigned long data)
 {
        struct ixgbe_adapter *adapter = (struct ixgbe_adapter *)data;
        unsigned long next_event_offset;
+       bool ready = true;
+
+#ifdef CONFIG_PCI_IOV
+       ready = false;
+
+       /*
+        * don't bother with SR-IOV VF DMA hang check if there are
+        * no VFs or the link is down
+        */
+       if (!adapter->num_vfs ||
+           (adapter->flags & IXGBE_FLAG_NEED_LINK_UPDATE)) {
+               ready = true;
+               goto normal_timer_service;
+       }
+
+       /* If we have VFs allocated then we must check for DMA hangs */
+       ixgbe_check_for_bad_vf(adapter);
+       next_event_offset = HZ / 50;
+       adapter->timer_event_accumulator++;
+
+       if (adapter->timer_event_accumulator >= 100) {
+               ready = true;
+               adapter->timer_event_accumulator = 0;
+       }
 
+       goto schedule_event;
+
+normal_timer_service:
+#endif
        /* poll faster when waiting for link */
        if (adapter->flags & IXGBE_FLAG_NEED_LINK_UPDATE)
                next_event_offset = HZ / 10;
        else
                next_event_offset = HZ * 2;
 
+#ifdef CONFIG_PCI_IOV
+schedule_event:
+#endif
        /* Reset the timer */
        mod_timer(&adapter->service_timer, next_event_offset + jiffies);
 
-       ixgbe_service_event_schedule(adapter);
+       if (ready)
+               ixgbe_service_event_schedule(adapter);
 }
 
 static void ixgbe_reset_subtask(struct ixgbe_adapter *adapter)
@@ -6426,9 +6535,9 @@ static void ixgbe_tx_map(struct ixgbe_ring *tx_ring,
 
                frag = &skb_shinfo(skb)->frags[f];
 #ifdef IXGBE_FCOE
-               size = min_t(unsigned int, data_len, frag->size);
+               size = min_t(unsigned int, data_len, skb_frag_size(frag));
 #else
-               size = frag->size;
+               size = skb_frag_size(frag);
 #endif
                data_len -= size;
                f++;
@@ -6702,12 +6811,13 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb,
                tx_flags |= IXGBE_TX_FLAGS_SW_VLAN;
        }
 
+       /* DCB maps skb priorities 0-7 onto 3 bit PCP of VLAN tag. */
        if ((adapter->flags & IXGBE_FLAG_DCB_ENABLED) &&
            ((tx_flags & (IXGBE_TX_FLAGS_HW_VLAN | IXGBE_TX_FLAGS_SW_VLAN)) ||
             (skb->priority != TC_PRIO_CONTROL))) {
                tx_flags &= ~IXGBE_TX_FLAGS_VLAN_PRIO_MASK;
-               tx_flags |= tx_ring->dcb_tc <<
-                           IXGBE_TX_FLAGS_VLAN_PRIO_SHIFT;
+               tx_flags |= (skb->priority & 0x7) <<
+                                       IXGBE_TX_FLAGS_VLAN_PRIO_SHIFT;
                if (tx_flags & IXGBE_TX_FLAGS_SW_VLAN) {
                        struct vlan_ethhdr *vhdr;
                        if (skb_header_cloned(skb) &&
@@ -7013,7 +7123,7 @@ int ixgbe_setup_tc(struct net_device *dev, u8 tc)
        }
 
        /* Hardware supports up to 8 traffic classes */
-       if (tc > MAX_TRAFFIC_CLASS ||
+       if (tc > adapter->dcb_cfg.num_tcs.pg_tcs ||
            (hw->mac.type == ixgbe_mac_82598EB && tc < MAX_TRAFFIC_CLASS))
                return -EINVAL;
 
@@ -7162,6 +7272,7 @@ static const struct net_device_ops ixgbe_netdev_ops = {
        .ndo_set_vf_mac         = ixgbe_ndo_set_vf_mac,
        .ndo_set_vf_vlan        = ixgbe_ndo_set_vf_vlan,
        .ndo_set_vf_tx_rate     = ixgbe_ndo_set_vf_bw,
+       .ndo_set_vf_spoofchk    = ixgbe_ndo_set_vf_spoofchk,
        .ndo_get_vf_config      = ixgbe_ndo_get_vf_config,
        .ndo_get_stats64        = ixgbe_get_stats64,
        .ndo_setup_tc           = ixgbe_setup_tc,
@@ -7468,13 +7579,6 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,
                goto err_eeprom;
        }
 
-       /* power down the optics for multispeed fiber and 82599 SFP+ fiber */
-       if (hw->mac.ops.disable_tx_laser &&
-           ((hw->phy.multispeed_fiber) ||
-            ((hw->mac.ops.get_media_type(hw) == ixgbe_media_type_fiber) &&
-             (hw->mac.type == ixgbe_mac_82599EB))))
-               hw->mac.ops.disable_tx_laser(hw);
-
        setup_timer(&adapter->service_timer, &ixgbe_service_timer,
                    (unsigned long) adapter);
 
@@ -7519,6 +7623,10 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,
        }
        device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol);
 
+       /* save off EEPROM version number */
+       hw->eeprom.ops.read(hw, 0x2e, &adapter->eeprom_verh);
+       hw->eeprom.ops.read(hw, 0x2d, &adapter->eeprom_verl);
+
        /* pick up the PCI bus settings for reporting later */
        hw->mac.ops.get_bus_info(hw);
 
@@ -7551,9 +7659,6 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,
                           "is required.\n");
        }
 
-       /* save off EEPROM version number */
-       hw->eeprom.ops.read(hw, 0x29, &adapter->eeprom_version);
-
        /* reset the hardware with the new settings */
        err = hw->mac.ops.start_hw(hw);
 
@@ -7571,6 +7676,13 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,
        if (err)
                goto err_register;
 
+       /* power down the optics for multispeed fiber and 82599 SFP+ fiber */
+       if (hw->mac.ops.disable_tx_laser &&
+           ((hw->phy.multispeed_fiber) ||
+            ((hw->mac.ops.get_media_type(hw) == ixgbe_media_type_fiber) &&
+             (hw->mac.type == ixgbe_mac_82599EB))))
+               hw->mac.ops.disable_tx_laser(hw);
+
        /* carrier off reporting is important to ethtool even BEFORE open */
        netif_carrier_off(netdev);
 
@@ -7586,10 +7698,12 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,
                        ixgbe_vf_configuration(pdev, (i | 0x10000000));
        }
 
-       /* Inform firmware of driver version */
+       /* firmware requires driver version to be 0xFFFFFFFF
+        * since os does not support feature
+        */
        if (hw->mac.ops.set_fw_drv_ver)
-               hw->mac.ops.set_fw_drv_ver(hw, MAJ, MIN, BUILD,
-                                          FW_CEM_UNUSED_VER);
+               hw->mac.ops.set_fw_drv_ver(hw, 0xFF, 0xFF, 0xFF,
+                                          0xFF);
 
        /* add san mac addr to netdev */
        ixgbe_add_sanmac_netdev(netdev);
@@ -7694,6 +7808,91 @@ static pci_ers_result_t ixgbe_io_error_detected(struct pci_dev *pdev,
        struct ixgbe_adapter *adapter = pci_get_drvdata(pdev);
        struct net_device *netdev = adapter->netdev;
 
+#ifdef CONFIG_PCI_IOV
+       struct pci_dev *bdev, *vfdev;
+       u32 dw0, dw1, dw2, dw3;
+       int vf, pos;
+       u16 req_id, pf_func;
+
+       if (adapter->hw.mac.type == ixgbe_mac_82598EB ||
+           adapter->num_vfs == 0)
+               goto skip_bad_vf_detection;
+
+       bdev = pdev->bus->self;
+       while (bdev && (bdev->pcie_type != PCI_EXP_TYPE_ROOT_PORT))
+               bdev = bdev->bus->self;
+
+       if (!bdev)
+               goto skip_bad_vf_detection;
+
+       pos = pci_find_ext_capability(bdev, PCI_EXT_CAP_ID_ERR);
+       if (!pos)
+               goto skip_bad_vf_detection;
+
+       pci_read_config_dword(bdev, pos + PCI_ERR_HEADER_LOG, &dw0);
+       pci_read_config_dword(bdev, pos + PCI_ERR_HEADER_LOG + 4, &dw1);
+       pci_read_config_dword(bdev, pos + PCI_ERR_HEADER_LOG + 8, &dw2);
+       pci_read_config_dword(bdev, pos + PCI_ERR_HEADER_LOG + 12, &dw3);
+
+       req_id = dw1 >> 16;
+       /* On the 82599 if bit 7 of the requestor ID is set then it's a VF */
+       if (!(req_id & 0x0080))
+               goto skip_bad_vf_detection;
+
+       pf_func = req_id & 0x01;
+       if ((pf_func & 1) == (pdev->devfn & 1)) {
+               unsigned int device_id;
+
+               vf = (req_id & 0x7F) >> 1;
+               e_dev_err("VF %d has caused a PCIe error\n", vf);
+               e_dev_err("TLP: dw0: %8.8x\tdw1: %8.8x\tdw2: "
+                               "%8.8x\tdw3: %8.8x\n",
+               dw0, dw1, dw2, dw3);
+               switch (adapter->hw.mac.type) {
+               case ixgbe_mac_82599EB:
+                       device_id = IXGBE_82599_VF_DEVICE_ID;
+                       break;
+               case ixgbe_mac_X540:
+                       device_id = IXGBE_X540_VF_DEVICE_ID;
+                       break;
+               default:
+                       device_id = 0;
+                       break;
+               }
+
+               /* Find the pci device of the offending VF */
+               vfdev = pci_get_device(IXGBE_INTEL_VENDOR_ID, device_id, NULL);
+               while (vfdev) {
+                       if (vfdev->devfn == (req_id & 0xFF))
+                               break;
+                       vfdev = pci_get_device(IXGBE_INTEL_VENDOR_ID,
+                                              device_id, vfdev);
+               }
+               /*
+                * There's a slim chance the VF could have been hot plugged,
+                * so if it is no longer present we don't need to issue the
+                * VFLR.  Just clean up the AER in that case.
+                */
+               if (vfdev) {
+                       e_dev_err("Issuing VFLR to VF %d\n", vf);
+                       pci_write_config_dword(vfdev, 0xA8, 0x00008000);
+               }
+
+               pci_cleanup_aer_uncorrect_error_status(pdev);
+       }
+
+       /*
+        * Even though the error may have occurred on the other port
+        * we still need to increment the vf error reference count for
+        * both ports because the I/O resume function will be called
+        * for both of them.
+        */
+       adapter->vferr_refcount++;
+
+       return PCI_ERS_RESULT_RECOVERED;
+
+skip_bad_vf_detection:
+#endif /* CONFIG_PCI_IOV */
        netif_device_detach(netdev);
 
        if (state == pci_channel_io_perm_failure)
@@ -7756,6 +7955,14 @@ static void ixgbe_io_resume(struct pci_dev *pdev)
        struct ixgbe_adapter *adapter = pci_get_drvdata(pdev);
        struct net_device *netdev = adapter->netdev;
 
+#ifdef CONFIG_PCI_IOV
+       if (adapter->vferr_refcount) {
+               e_info(drv, "Resuming after VF err\n");
+               adapter->vferr_refcount--;
+               return;
+       }
+
+#endif
        if (netif_running(netdev))
                ixgbe_up(adapter);