Index: stable/11/sys/dev/ixgbe/if_fdir.c =================================================================== --- stable/11/sys/dev/ixgbe/if_fdir.c +++ stable/11/sys/dev/ixgbe/if_fdir.c @@ -50,7 +50,7 @@ } /* ixgbe_init_fdir */ void -ixgbe_reinit_fdir(void *context, int pending) +ixgbe_reinit_fdir(void *context) { struct adapter *adapter = context; struct ifnet *ifp = adapter->ifp; @@ -146,9 +146,9 @@ /* TASK_INIT needs this function defined regardless if it's enabled */ void -ixgbe_reinit_fdir(void *context, int pending) +ixgbe_reinit_fdir(void *context) { - UNREFERENCED_2PARAMETER(context, pending); + UNREFERENCED_1PARAMETER(context); } /* ixgbe_reinit_fdir */ void Index: stable/11/sys/dev/ixgbe/if_ix.c =================================================================== --- stable/11/sys/dev/ixgbe/if_ix.c +++ stable/11/sys/dev/ixgbe/if_ix.c @@ -156,8 +156,8 @@ static void ixgbe_disable_rx_drop(struct adapter *); static void ixgbe_initialize_rss_mapping(struct adapter *); -static void ixgbe_enable_intr(struct adapter *); -static void ixgbe_disable_intr(struct adapter *); +static void ixgbe_enable_intr(struct adapter *, bool); +static void ixgbe_disable_intr(struct adapter *, bool); static void ixgbe_update_stats_counters(struct adapter *); static void ixgbe_set_promisc(struct adapter *); static void ixgbe_set_multi(struct adapter *); @@ -209,10 +209,11 @@ /* Deferred interrupt tasklets */ static void ixgbe_handle_que(void *, int); -static void ixgbe_handle_link(void *, int); -static void ixgbe_handle_msf(void *, int); -static void ixgbe_handle_mod(void *, int); -static void ixgbe_handle_phy(void *, int); +static void ixgbe_handle_link(void *); +static void ixgbe_handle_msf(void *); +static void ixgbe_handle_mod(void *); +static void ixgbe_handle_phy(void *); +static void ixgbe_handle_admin_task(void *, int); /************************************************************************ @@ -929,6 +930,15 @@ if (adapter->feat_en & IXGBE_FEATURE_NETMAP) ixgbe_netmap_attach(adapter); + /* Initialize Admin Task */ + TASK_INIT(&adapter->admin_task, 0, ixgbe_handle_admin_task, adapter); + + /* Initialize task queue */ + adapter->tq = taskqueue_create_fast("ixgbe_admin", M_NOWAIT, + taskqueue_thread_enqueue, &adapter->tq); + taskqueue_start_threads(&adapter->tq, 1, PI_NET, "%s admintaskq", + device_get_nameunit(adapter->dev)); + INIT_DEBUGOUT("ixgbe_attach: end"); return (0); @@ -1250,9 +1260,12 @@ if (hw->phy.multispeed_fiber) { hw->mac.ops.setup_sfp(hw); ixgbe_enable_tx_laser(hw); - taskqueue_enqueue(adapter->tq, &adapter->msf_task); - } else - taskqueue_enqueue(adapter->tq, &adapter->mod_task); + adapter->task_requests |= IXGBE_REQUEST_TASK_MSF; + taskqueue_enqueue(adapter->tq, &adapter->admin_task); + } else { + adapter->task_requests |= IXGBE_REQUEST_TASK_MOD; + taskqueue_enqueue(adapter->tq, &adapter->admin_task); + } } else { if (hw->mac.ops.check_link) err = ixgbe_check_link(hw, &adapter->link_speed, @@ -2351,7 +2364,8 @@ /* Link status change */ if (eicr & IXGBE_EICR_LSC) { IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EIMC_LSC); - taskqueue_enqueue(adapter->tq, &adapter->link_task); + adapter->task_requests |= IXGBE_REQUEST_TASK_LINK; + taskqueue_enqueue(adapter->tq, &adapter->admin_task); } if (adapter->hw.mac.type != ixgbe_mac_82598EB) { @@ -2362,7 +2376,8 @@ return; /* Disable the interrupt */ IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EIMC_FLOW_DIR); - taskqueue_enqueue(adapter->tq, &adapter->fdir_task); + adapter->task_requests |= IXGBE_REQUEST_TASK_FDIR; + taskqueue_enqueue(adapter->tq, &adapter->admin_task); } if (eicr & IXGBE_EICR_ECC) { @@ -2402,8 +2417,10 @@ /* Check for VF message */ if ((adapter->feat_en & IXGBE_FEATURE_SRIOV) && - (eicr & IXGBE_EICR_MAILBOX)) - taskqueue_enqueue(adapter->tq, &adapter->mbx_task); + (eicr & IXGBE_EICR_MAILBOX)) { + adapter->task_requests |= IXGBE_REQUEST_TASK_MBX; + taskqueue_enqueue(adapter->tq, &adapter->admin_task); + } } if (ixgbe_is_sfp(hw)) { @@ -2415,14 +2432,16 @@ if (eicr & eicr_mask) { IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr_mask); - taskqueue_enqueue(adapter->tq, &adapter->mod_task); + adapter->task_requests |= IXGBE_REQUEST_TASK_MOD; + taskqueue_enqueue(adapter->tq, &adapter->admin_task); } if ((hw->mac.type == ixgbe_mac_82599EB) && (eicr & IXGBE_EICR_GPI_SDP1_BY_MAC(hw))) { IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP1_BY_MAC(hw)); - taskqueue_enqueue(adapter->tq, &adapter->msf_task); + adapter->task_requests |= IXGBE_REQUEST_TASK_MSF; + taskqueue_enqueue(adapter->tq, &adapter->admin_task); } } @@ -2436,11 +2455,9 @@ if ((hw->phy.type == ixgbe_phy_x550em_ext_t) && (eicr & IXGBE_EICR_GPI_SDP0_X540)) { IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP0_X540); - taskqueue_enqueue(adapter->tq, &adapter->phy_task); + adapter->task_requests |= IXGBE_REQUEST_TASK_PHY; + taskqueue_enqueue(adapter->tq, &adapter->admin_task); } - - /* Re-enable other interrupts */ - IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EIMS_OTHER); } /* ixgbe_msix_link */ /************************************************************************ @@ -2627,19 +2644,6 @@ } } - /* Drain the Link queue */ - if (adapter->tq) { - taskqueue_drain(adapter->tq, &adapter->link_task); - taskqueue_drain(adapter->tq, &adapter->mod_task); - taskqueue_drain(adapter->tq, &adapter->msf_task); - if (adapter->feat_cap & IXGBE_FEATURE_SRIOV) - taskqueue_drain(adapter->tq, &adapter->mbx_task); - taskqueue_drain(adapter->tq, &adapter->phy_task); - if (adapter->feat_en & IXGBE_FEATURE_FDIR) - taskqueue_drain(adapter->tq, &adapter->fdir_task); - taskqueue_free(adapter->tq); - } - /* let hardware know driver is unloading */ ctrl_ext = IXGBE_READ_REG(&adapter->hw, IXGBE_CTRL_EXT); ctrl_ext &= ~IXGBE_CTRL_EXT_DRV_LOAD; @@ -2656,6 +2660,12 @@ if (adapter->feat_en & IXGBE_FEATURE_NETMAP) netmap_detach(adapter->ifp); + /* Drain the Admin Task queue */ + if (adapter->tq) { + taskqueue_drain(adapter->tq, &adapter->admin_task); + taskqueue_free(adapter->tq); + } + ixgbe_free_pci_resources(adapter); bus_generic_detach(dev); if_free(adapter->ifp); @@ -2913,6 +2923,10 @@ /* Configure RX settings */ ixgbe_initialize_receive_units(adapter); + /* Initialize variable holding task enqueue requests + * generated by interrupt handlers */ + adapter->task_requests = 0; + /* Enable SDP & MSI-X interrupts based on adapter */ ixgbe_config_gpie(adapter); @@ -3055,7 +3069,7 @@ ixgbe_config_dmac(adapter); /* And now turn on interrupts */ - ixgbe_enable_intr(adapter); + ixgbe_enable_intr(adapter, false); /* Enable the use of the MBX by the VF's */ if (adapter->feat_en & IXGBE_FEATURE_SRIOV) { @@ -3463,7 +3477,7 @@ * ixgbe_handle_mod - Tasklet for SFP module interrupts ************************************************************************/ static void -ixgbe_handle_mod(void *context, int pending) +ixgbe_handle_mod(void *context) { struct adapter *adapter = context; struct ixgbe_hw *hw = &adapter->hw; @@ -3493,16 +3507,21 @@ if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) { device_printf(dev, "Unsupported SFP+ module type was detected.\n"); - return; + goto handle_mod_out; } err = hw->mac.ops.setup_sfp(hw); if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) { device_printf(dev, "Setup failure - unsupported SFP+ module type.\n"); - return; + goto handle_mod_out; } - taskqueue_enqueue(adapter->tq, &adapter->msf_task); + adapter->task_requests |= IXGBE_REQUEST_TASK_MSF; + taskqueue_enqueue(adapter->tq, &adapter->admin_task); + return; + +handle_mod_out: + adapter->task_requests &= ~(IXGBE_REQUEST_TASK_MSF); } /* ixgbe_handle_mod */ @@ -3510,7 +3529,7 @@ * ixgbe_handle_msf - Tasklet for MSF (multispeed fiber) interrupts ************************************************************************/ static void -ixgbe_handle_msf(void *context, int pending) +ixgbe_handle_msf(void *context) { struct adapter *adapter = context; struct ixgbe_hw *hw = &adapter->hw; @@ -3536,7 +3555,7 @@ * ixgbe_handle_phy - Tasklet for external PHY interrupts ************************************************************************/ static void -ixgbe_handle_phy(void *context, int pending) +ixgbe_handle_phy(void *context) { struct adapter *adapter = context; struct ixgbe_hw *hw = &adapter->hw; @@ -3551,6 +3570,36 @@ } /* ixgbe_handle_phy */ /************************************************************************ + * ixgbe_handle_admin_task - Handler for interrupt tasklets meant to be + * called in separate task. + ************************************************************************/ +static void +ixgbe_handle_admin_task(void *context, int pending) +{ + struct adapter *adapter = context; + + IXGBE_CORE_LOCK(adapter); + ixgbe_disable_intr(adapter, true); + + if (adapter->task_requests & IXGBE_REQUEST_TASK_MOD) + ixgbe_handle_mod(adapter); + if (adapter->task_requests & IXGBE_REQUEST_TASK_MSF) + ixgbe_handle_msf(adapter); + if (adapter->task_requests & IXGBE_REQUEST_TASK_MBX) + ixgbe_handle_mbx(adapter); + if (adapter->task_requests & IXGBE_REQUEST_TASK_FDIR) + ixgbe_reinit_fdir(adapter); + if (adapter->task_requests & IXGBE_REQUEST_TASK_PHY) + ixgbe_handle_phy(adapter); + if (adapter->task_requests & IXGBE_REQUEST_TASK_LINK) + ixgbe_handle_link(adapter); + adapter->task_requests = 0; + + ixgbe_enable_intr(adapter, true); + IXGBE_CORE_UNLOCK(adapter); +} /* ixgbe_handle_admin_task */ + +/************************************************************************ * ixgbe_stop - Stop the hardware * * Disables all traffic on the adapter by issuing a @@ -3568,7 +3617,7 @@ mtx_assert(&adapter->core_mtx, MA_OWNED); INIT_DEBUGOUT("ixgbe_stop: begin\n"); - ixgbe_disable_intr(adapter); + ixgbe_disable_intr(adapter, false); callout_stop(&adapter->timer); /* Let the stack know...*/ @@ -3662,9 +3711,13 @@ /************************************************************************ * ixgbe_enable_intr + * If skip_traffic parameter is set, queues' irqs are not enabled. + * This is useful while reenabling interrupts after disabling them + * with ixgbe_disable_intr() 'keep_traffic' parameter set to true + * as queues' interrupts are already enabled. ************************************************************************/ static void -ixgbe_enable_intr(struct adapter *adapter) +ixgbe_enable_intr(struct adapter *adapter, bool skip_traffic) { struct ixgbe_hw *hw = &adapter->hw; struct ix_queue *que = adapter->queues; @@ -3732,13 +3785,15 @@ IXGBE_WRITE_REG(hw, IXGBE_EIAC, mask); } - /* - * Now enable all queues, this is done separately to - * allow for handling the extended (beyond 32) MSI-X - * vectors that can be used by 82599 - */ - for (int i = 0; i < adapter->num_queues; i++, que++) - ixgbe_enable_queue(adapter, que->msix); + if (!skip_traffic) { + /* + * Now enable all queues, this is done separately to + * allow for handling the extended (beyond 32) MSI-X + * vectors that can be used by 82599 + */ + for (int i = 0; i < adapter->num_queues; i++, que++) + ixgbe_enable_queue(adapter, que->msix); + } IXGBE_WRITE_FLUSH(hw); @@ -3747,21 +3802,39 @@ /************************************************************************ * ixgbe_disable_intr + * If keep_traffic parameter is set, queue interrupts are not disabled. + * This is needed by ixgbe_handle_admin_task() to handle link specific + * interrupt procedures without stopping the traffic. ************************************************************************/ static void -ixgbe_disable_intr(struct adapter *adapter) +ixgbe_disable_intr(struct adapter *adapter, bool keep_traffic) { - if (adapter->msix_mem) - IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIAC, 0); - if (adapter->hw.mac.type == ixgbe_mac_82598EB) { - IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, ~0); + struct ixgbe_hw *hw = &adapter->hw; + u32 eiac_mask, eimc_mask, eimc_ext_mask; + + if (keep_traffic) { + /* Autoclear only queue irqs */ + eiac_mask = IXGBE_EICR_RTX_QUEUE; + + /* Disable everything but queue irqs */ + eimc_mask = ~0; + eimc_mask &= ~IXGBE_EIMC_RTX_QUEUE; + eimc_ext_mask = 0; } else { - 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); + eiac_mask = 0; + eimc_mask = (hw->mac.type == ixgbe_mac_82598EB) ? ~0 : 0xFFFF0000; + eimc_ext_mask = ~0; } - IXGBE_WRITE_FLUSH(&adapter->hw); + if (adapter->msix_mem) + IXGBE_WRITE_REG(hw, IXGBE_EIAC, eiac_mask); + + IXGBE_WRITE_REG(hw, IXGBE_EIMC, eimc_mask); + IXGBE_WRITE_REG(hw, IXGBE_EIMC_EX(0), eimc_ext_mask); + IXGBE_WRITE_REG(hw, IXGBE_EIMC_EX(1), eimc_ext_mask); + + IXGBE_WRITE_FLUSH(hw); + return; } /* ixgbe_disable_intr */ @@ -3786,7 +3859,7 @@ ++que->irqs; if (eicr == 0) { - ixgbe_enable_intr(adapter); + ixgbe_enable_intr(adapter, false); return; } @@ -3807,8 +3880,10 @@ } /* Link status change */ - if (eicr & IXGBE_EICR_LSC) - taskqueue_enqueue(adapter->tq, &adapter->link_task); + if (eicr & IXGBE_EICR_LSC){ + adapter->task_requests |= IXGBE_REQUEST_TASK_LINK; + taskqueue_enqueue(adapter->tq, &adapter->admin_task); + } if (ixgbe_is_sfp(hw)) { /* Pluggable optics-related interrupt */ @@ -3819,26 +3894,30 @@ if (eicr & eicr_mask) { IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr_mask); - taskqueue_enqueue(adapter->tq, &adapter->mod_task); + adapter->task_requests |= IXGBE_REQUEST_TASK_MOD; + taskqueue_enqueue(adapter->tq, &adapter->admin_task); } if ((hw->mac.type == ixgbe_mac_82599EB) && (eicr & IXGBE_EICR_GPI_SDP1_BY_MAC(hw))) { IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP1_BY_MAC(hw)); - taskqueue_enqueue(adapter->tq, &adapter->msf_task); + adapter->task_requests |= IXGBE_REQUEST_TASK_MSF; + taskqueue_enqueue(adapter->tq, &adapter->admin_task); } } /* External PHY interrupt */ if ((hw->phy.type == ixgbe_phy_x550em_ext_t) && - (eicr & IXGBE_EICR_GPI_SDP0_X540)) - taskqueue_enqueue(adapter->tq, &adapter->phy_task); + (eicr & IXGBE_EICR_GPI_SDP0_X540)) { + adapter->task_requests |= IXGBE_REQUEST_TASK_PHY; + taskqueue_enqueue(adapter->tq, &adapter->admin_task); + } if (more) taskqueue_enqueue(que->tq, &que->que_task); else - ixgbe_enable_intr(adapter); + ixgbe_enable_intr(adapter, false); return; } /* ixgbe_legacy_irq */ @@ -4768,9 +4847,9 @@ IOCTL_DEBUGOUT("ioctl: SIOC(ADD|DEL)MULTI"); if (ifp->if_drv_flags & IFF_DRV_RUNNING) { IXGBE_CORE_LOCK(adapter); - ixgbe_disable_intr(adapter); + ixgbe_disable_intr(adapter, false); ixgbe_set_multi(adapter); - ixgbe_enable_intr(adapter); + ixgbe_enable_intr(adapter, false); IXGBE_CORE_UNLOCK(adapter); } break; @@ -4893,7 +4972,7 @@ if (que->res != NULL) ixgbe_enable_queue(adapter, que->msix); else - ixgbe_enable_intr(adapter); + ixgbe_enable_intr(adapter, false); return; } /* ixgbe_handle_que */ @@ -4932,27 +5011,13 @@ taskqueue_start_threads(&que->tq, 1, PI_NET, "%s ixq", device_get_nameunit(adapter->dev)); - /* Tasklets for Link, SFP and Multispeed Fiber */ - TASK_INIT(&adapter->link_task, 0, ixgbe_handle_link, adapter); - TASK_INIT(&adapter->mod_task, 0, ixgbe_handle_mod, adapter); - TASK_INIT(&adapter->msf_task, 0, ixgbe_handle_msf, adapter); - TASK_INIT(&adapter->phy_task, 0, ixgbe_handle_phy, adapter); - if (adapter->feat_en & IXGBE_FEATURE_FDIR) - TASK_INIT(&adapter->fdir_task, 0, ixgbe_reinit_fdir, adapter); - adapter->tq = taskqueue_create_fast("ixgbe_link", M_NOWAIT, - taskqueue_thread_enqueue, &adapter->tq); - taskqueue_start_threads(&adapter->tq, 1, PI_NET, "%s linkq", - device_get_nameunit(adapter->dev)); - if ((error = bus_setup_intr(dev, adapter->res, INTR_TYPE_NET | INTR_MPSAFE, NULL, ixgbe_legacy_irq, que, &adapter->tag)) != 0) { device_printf(dev, "Failed to register fast interrupt handler: %d\n", error); taskqueue_free(que->tq); - taskqueue_free(adapter->tq); que->tq = NULL; - adapter->tq = NULL; return (error); } @@ -5093,20 +5158,6 @@ bus_describe_intr(dev, adapter->res, adapter->tag, "link"); #endif adapter->vector = vector; - /* Tasklets for Link, SFP and Multispeed Fiber */ - TASK_INIT(&adapter->link_task, 0, ixgbe_handle_link, adapter); - TASK_INIT(&adapter->mod_task, 0, ixgbe_handle_mod, adapter); - TASK_INIT(&adapter->msf_task, 0, ixgbe_handle_msf, adapter); - if (adapter->feat_cap & IXGBE_FEATURE_SRIOV) - TASK_INIT(&adapter->mbx_task, 0, ixgbe_handle_mbx, adapter); - TASK_INIT(&adapter->phy_task, 0, ixgbe_handle_phy, adapter); - if (adapter->feat_en & IXGBE_FEATURE_FDIR) - TASK_INIT(&adapter->fdir_task, 0, ixgbe_reinit_fdir, adapter); - adapter->tq = taskqueue_create_fast("ixgbe_link", M_NOWAIT, - taskqueue_thread_enqueue, &adapter->tq); - taskqueue_start_threads(&adapter->tq, 1, PI_NET, "%s linkq", - device_get_nameunit(adapter->dev)); - return (0); } /* ixgbe_allocate_msix */ @@ -5232,13 +5283,12 @@ * Done outside of interrupt context since the driver might sleep ************************************************************************/ static void -ixgbe_handle_link(void *context, int pending) +ixgbe_handle_link(void *context) { struct adapter *adapter = context; struct ixgbe_hw *hw = &adapter->hw; ixgbe_check_link(hw, &adapter->link_speed, &adapter->link_up, 0); - ixgbe_update_link_status(adapter); /* Re-enable link interrupts */ IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EIMS_LSC); Index: stable/11/sys/dev/ixgbe/if_sriov.c =================================================================== --- stable/11/sys/dev/ixgbe/if_sriov.c +++ stable/11/sys/dev/ixgbe/if_sriov.c @@ -620,7 +620,7 @@ /* Tasklet for handling VF -> PF mailbox messages */ void -ixgbe_handle_mbx(void *context, int pending) +ixgbe_handle_mbx(void *context) { struct adapter *adapter; struct ixgbe_hw *hw; @@ -898,9 +898,9 @@ #else void -ixgbe_handle_mbx(void *context, int pending) +ixgbe_handle_mbx(void *context) { - UNREFERENCED_2PARAMETER(context, pending); + UNREFERENCED_1PARAMETER(context); } /* ixgbe_handle_mbx */ inline int Index: stable/11/sys/dev/ixgbe/ixgbe.h =================================================================== --- stable/11/sys/dev/ixgbe/ixgbe.h +++ stable/11/sys/dev/ixgbe/ixgbe.h @@ -464,17 +464,15 @@ /* Support for pluggable optics */ bool sfp_probe; - struct task link_task; /* Link tasklet */ - struct task mod_task; /* SFP tasklet */ - struct task msf_task; /* Multispeed Fiber */ - struct task mbx_task; /* VF -> PF mailbox interrupt */ + struct task link_task; /* Link tasklet */ /* Flow Director */ int fdir_reinit; - struct task fdir_task; - struct task phy_task; /* PHY intr tasklet */ - struct taskqueue *tq; + /* Admin task */ + struct taskqueue *tq; + struct task admin_task; + u32 task_requests; /* * Queues: Index: stable/11/sys/dev/ixgbe/ixgbe_fdir.h =================================================================== --- stable/11/sys/dev/ixgbe/ixgbe_fdir.h +++ stable/11/sys/dev/ixgbe/ixgbe_fdir.h @@ -52,7 +52,7 @@ #endif -void ixgbe_reinit_fdir(void *, int); +void ixgbe_reinit_fdir(void *); void ixgbe_atr(struct tx_ring *, struct mbuf *); #endif /* _IXGBE_FDIR_H_ */ Index: stable/11/sys/dev/ixgbe/ixgbe_sriov.h =================================================================== --- stable/11/sys/dev/ixgbe/ixgbe_sriov.h +++ stable/11/sys/dev/ixgbe/ixgbe_sriov.h @@ -96,7 +96,7 @@ #endif /* PCI_IOV */ -void ixgbe_handle_mbx(void *, int); +void ixgbe_handle_mbx(void *); int ixgbe_vf_que_index(int, int, int); #endif Index: stable/11/sys/dev/ixgbe/ixgbe_type.h =================================================================== --- stable/11/sys/dev/ixgbe/ixgbe_type.h +++ stable/11/sys/dev/ixgbe/ixgbe_type.h @@ -4392,4 +4392,11 @@ #define IXGBE_NW_MNG_IF_SEL_MDIO_PHY_ADD \ (0x1F << IXGBE_NW_MNG_IF_SEL_MDIO_PHY_ADD_SHIFT) +#define IXGBE_REQUEST_TASK_MOD 0x01 +#define IXGBE_REQUEST_TASK_MSF 0x02 +#define IXGBE_REQUEST_TASK_MBX 0x04 +#define IXGBE_REQUEST_TASK_FDIR 0x08 +#define IXGBE_REQUEST_TASK_PHY 0x10 +#define IXGBE_REQUEST_TASK_LINK 0x20 + #endif /* _IXGBE_TYPE_H_ */