svn commit: r347419 - stable/11/sys/dev/ixgbe
Eric Joyner
erj at FreeBSD.org
Fri May 10 00:46:46 UTC 2019
Author: erj
Date: Fri May 10 00:46:43 2019
New Revision: 347419
URL: https://svnweb.freebsd.org/changeset/base/347419
Log:
ix(4): Move {mod,msf,mbx,fdir,phy,link}_task to lock protected handler
This patch introduces adapter->task_requests register responsible for recording
requests for mod_task, msf_task, mbx_task, fdir_task, phy_task and link_task
calls. Instead of enqueueing each of these tasks with GROUPTASK_ENQUEUE, new
task is created and all handlers are called from one task while holding
adapter->core_mtx lock.
SIOCGIFXMEDIA ioctl() call reads adapter->media list. The list is deleted and
rewritten in ixgbe_handle_msf() task without holding adapter->core_mtx lock.
This change is needed to maintain data coherency when sharing adapter info via
ioctl() calls.
Since handlers for abovementioned tasks will no longer act as task handlers,
but as regular functions, 'pending' parameter is removed from them.
This patch also removes ixgbe_update_link_status() call from
ixgbe_handle_link() handler. From now on, link status will be updated by
calling ixgbe_update_link_status() periodically from ixgbe_local_timer(). This
fixes problem with link flapping during changing interface state to UP.
Parameter keep_traffic is added to ixgbe_disable_intr(). This enables
ixgbe_handle_admin_task() to not disable and queue interrupts. Accordingly,
skip_traffic parameter is added to ixgbe_enable_intr() to let
ixgbe_handle_admin_task() skip enabling queues while enabling interrupts.
This patch is a port of r343621. r343621 can't be merged from current since
stable/11 contains ixgbe driver without iflib support.
Patch co-authored by Krzysztof Galazka <krzysztof.galazka at intel.com>.
Submitted by: Piotr Pietruszewski <piotr.pietruszewski at intel.com>
Reviewed by: #IntelNetworking
Sponsored by: Intel Corporation
Differential Revision: https://reviews.freebsd.org/D19711
Modified:
stable/11/sys/dev/ixgbe/if_fdir.c
stable/11/sys/dev/ixgbe/if_ix.c
stable/11/sys/dev/ixgbe/if_sriov.c
stable/11/sys/dev/ixgbe/ixgbe.h
stable/11/sys/dev/ixgbe/ixgbe_fdir.h
stable/11/sys/dev/ixgbe/ixgbe_sriov.h
stable/11/sys/dev/ixgbe/ixgbe_type.h
Modified: stable/11/sys/dev/ixgbe/if_fdir.c
==============================================================================
--- stable/11/sys/dev/ixgbe/if_fdir.c Fri May 10 00:41:42 2019 (r347418)
+++ stable/11/sys/dev/ixgbe/if_fdir.c Fri May 10 00:46:43 2019 (r347419)
@@ -50,7 +50,7 @@ ixgbe_init_fdir(struct adapter *adapter)
} /* 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 @@ ixgbe_atr(struct tx_ring *txr, struct mbuf *mp)
/* 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
Modified: stable/11/sys/dev/ixgbe/if_ix.c
==============================================================================
--- stable/11/sys/dev/ixgbe/if_ix.c Fri May 10 00:41:42 2019 (r347418)
+++ stable/11/sys/dev/ixgbe/if_ix.c Fri May 10 00:46:43 2019 (r347419)
@@ -156,8 +156,8 @@ static void ixgbe_enable_rx_drop(struct adapter *)
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 @@ static void ixgbe_msix_link(void *);
/* 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 @@ ixgbe_attach(device_t dev)
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 @@ ixgbe_config_link(struct adapter *adapter)
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 @@ ixgbe_msix_link(void *arg)
/* 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 @@ ixgbe_msix_link(void *arg)
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 @@ ixgbe_msix_link(void *arg)
/* 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 @@ ixgbe_msix_link(void *arg)
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 @@ ixgbe_msix_link(void *arg)
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 @@ ixgbe_detach(device_t dev)
}
}
- /* 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 @@ ixgbe_detach(device_t dev)
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 @@ ixgbe_init_locked(struct adapter *adapter)
/* 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_init_locked(struct adapter *adapter)
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 @@ out:
* 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 @@ ixgbe_handle_mod(void *context, int pending)
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_mod(void *context, int pending)
* 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_msf(void *context, int pending)
* 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(void *context, int pending)
} /* 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 @@ ixgbe_stop(void *arg)
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_config_dmac(struct adapter *adapter)
/************************************************************************
* 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_enable_intr(struct adapter *adapter)
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_enable_intr(struct adapter *adapter)
/************************************************************************
* 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 @@ ixgbe_legacy_irq(void *arg)
++que->irqs;
if (eicr == 0) {
- ixgbe_enable_intr(adapter);
+ ixgbe_enable_intr(adapter, false);
return;
}
@@ -3807,8 +3880,10 @@ ixgbe_legacy_irq(void *arg)
}
/* 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 @@ ixgbe_legacy_irq(void *arg)
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 @@ ixgbe_ioctl(struct ifnet *ifp, u_long command, caddr_t
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 @@ ixgbe_handle_que(void *context, int pending)
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 @@ ixgbe_allocate_legacy(struct adapter *adapter)
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 @@ ixgbe_allocate_msix(struct adapter *adapter)
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 @@ msi:
* 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);
Modified: stable/11/sys/dev/ixgbe/if_sriov.c
==============================================================================
--- stable/11/sys/dev/ixgbe/if_sriov.c Fri May 10 00:41:42 2019 (r347418)
+++ stable/11/sys/dev/ixgbe/if_sriov.c Fri May 10 00:46:43 2019 (r347419)
@@ -620,7 +620,7 @@ ixgbe_process_vf_msg(struct adapter *adapter, struct i
/* 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 @@ ixgbe_add_vf(device_t dev, u16 vfnum, const nvlist_t *
#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
Modified: stable/11/sys/dev/ixgbe/ixgbe.h
==============================================================================
--- stable/11/sys/dev/ixgbe/ixgbe.h Fri May 10 00:41:42 2019 (r347418)
+++ stable/11/sys/dev/ixgbe/ixgbe.h Fri May 10 00:46:43 2019 (r347419)
@@ -464,17 +464,15 @@ struct adapter {
/* 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:
Modified: stable/11/sys/dev/ixgbe/ixgbe_fdir.h
==============================================================================
--- stable/11/sys/dev/ixgbe/ixgbe_fdir.h Fri May 10 00:41:42 2019 (r347418)
+++ stable/11/sys/dev/ixgbe/ixgbe_fdir.h Fri May 10 00:46:43 2019 (r347419)
@@ -52,7 +52,7 @@ void ixgbe_init_fdir(struct adapter *);
#endif
-void ixgbe_reinit_fdir(void *, int);
+void ixgbe_reinit_fdir(void *);
void ixgbe_atr(struct tx_ring *, struct mbuf *);
#endif /* _IXGBE_FDIR_H_ */
Modified: stable/11/sys/dev/ixgbe/ixgbe_sriov.h
==============================================================================
--- stable/11/sys/dev/ixgbe/ixgbe_sriov.h Fri May 10 00:41:42 2019 (r347418)
+++ stable/11/sys/dev/ixgbe/ixgbe_sriov.h Fri May 10 00:46:43 2019 (r347419)
@@ -96,7 +96,7 @@ u32 ixgbe_get_mrqc(int);
#endif /* PCI_IOV */
-void ixgbe_handle_mbx(void *, int);
+void ixgbe_handle_mbx(void *);
int ixgbe_vf_que_index(int, int, int);
#endif
Modified: stable/11/sys/dev/ixgbe/ixgbe_type.h
==============================================================================
--- stable/11/sys/dev/ixgbe/ixgbe_type.h Fri May 10 00:41:42 2019 (r347418)
+++ stable/11/sys/dev/ixgbe/ixgbe_type.h Fri May 10 00:46:43 2019 (r347419)
@@ -4392,4 +4392,11 @@ struct ixgbe_bypass_eeprom {
#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_ */
More information about the svn-src-stable-11
mailing list