Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/pci/ixgbe Reduce code duplication. No functional cha...
details: https://anonhg.NetBSD.org/src/rev/6d25e42ee55e
branches: trunk
changeset: 979524:6d25e42ee55e
user: msaitoh <msaitoh%NetBSD.org@localhost>
date: Thu Dec 31 12:34:33 2020 +0000
description:
Reduce code duplication. No functional change.
Add new ixgbe_intr_admin_common() and use it in both ixgbe_msix_admin()
and ixgbe_legacy_irq().
diffstat:
sys/dev/pci/ixgbe/ixgbe.c | 170 +++++++++------------------------------------
1 files changed, 34 insertions(+), 136 deletions(-)
diffs (290 lines):
diff -r 85efe076e1a0 -r 6d25e42ee55e sys/dev/pci/ixgbe/ixgbe.c
--- a/sys/dev/pci/ixgbe/ixgbe.c Thu Dec 31 11:36:12 2020 +0000
+++ b/sys/dev/pci/ixgbe/ixgbe.c Thu Dec 31 12:34:33 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ixgbe.c,v 1.276 2020/12/26 06:27:38 msaitoh Exp $ */
+/* $NetBSD: ixgbe.c,v 1.277 2020/12/31 12:34:33 msaitoh Exp $ */
/******************************************************************************
@@ -258,12 +258,11 @@
static int ixgbe_sysctl_wol_enable(SYSCTLFN_PROTO);
static int ixgbe_sysctl_wufc(SYSCTLFN_PROTO);
-/* Legacy (single vector) interrupt handler */
-static int ixgbe_legacy_irq(void *);
-
-/* The MSI/MSI-X Interrupt handlers */
+/* Interrupt functions */
static int ixgbe_msix_que(void *);
static int ixgbe_msix_admin(void *);
+static void ixgbe_intr_admin_common(struct adapter *, u32, u32 *);
+static int ixgbe_legacy_irq(void *);
/* Event handlers running on workqueue */
static void ixgbe_handle_que(void *);
@@ -3089,11 +3088,9 @@
{
struct adapter *adapter = arg;
struct ixgbe_hw *hw = &adapter->hw;
- u32 eicr, eicr_mask;
+ u32 eicr;
u32 eims_orig;
u32 eims_disable = 0;
- u32 task_requests = 0;
- s32 retval;
++adapter->admin_irqev.ev_count;
@@ -3115,10 +3112,26 @@
/* Clear all OTHER interrupts with write */
IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr);
+ ixgbe_intr_admin_common(adapter, eicr, &eims_disable);
+
+ /* Re-enable some OTHER interrupts */
+ IXGBE_WRITE_REG(hw, IXGBE_EIMS, eims_orig & ~eims_disable);
+
+ return 1;
+} /* ixgbe_msix_admin */
+
+static void
+ixgbe_intr_admin_common(struct adapter *adapter, u32 eicr, u32 *eims_disable)
+{
+ struct ixgbe_hw *hw = &adapter->hw;
+ u32 eicr_mask;
+ u32 task_requests = 0;
+ s32 retval;
+
/* Link status change */
if (eicr & IXGBE_EICR_LSC) {
task_requests |= IXGBE_REQUEST_TASK_LSC;
- eims_disable |= IXGBE_EIMS_LSC;
+ *eims_disable |= IXGBE_EIMS_LSC;
}
if (ixgbe_is_sfp(hw)) {
@@ -3138,13 +3151,13 @@
|| ((hw->phy.sfp_type == ixgbe_sfp_type_not_present)
&& (eicr & IXGBE_EICR_LSC))) {
task_requests |= IXGBE_REQUEST_TASK_MOD;
- eims_disable |= IXGBE_EIMS_LSC;
+ *eims_disable |= IXGBE_EIMS_LSC;
}
if ((hw->mac.type == ixgbe_mac_82599EB) &&
(eicr & IXGBE_EICR_GPI_SDP1_BY_MAC(hw))) {
task_requests |= IXGBE_REQUEST_TASK_MSF;
- eims_disable |= IXGBE_EIMS_GPI_SDP1_BY_MAC(hw);
+ *eims_disable |= IXGBE_EIMS_GPI_SDP1_BY_MAC(hw);
}
}
@@ -3154,7 +3167,7 @@
if (!atomic_cas_uint(&adapter->fdir_reinit, 0, 1)) {
task_requests |= IXGBE_REQUEST_TASK_FDIR;
/* Disable the interrupt */
- eims_disable |= IXGBE_EIMS_FLOW_DIR;
+ *eims_disable |= IXGBE_EIMS_FLOW_DIR;
}
}
@@ -3162,7 +3175,7 @@
device_printf(adapter->dev,
"CRITICAL: ECC ERROR!! Please Reboot!!\n");
/* Disable interrupt to prevent log spam */
- eims_disable |= IXGBE_EICR_ECC;
+ *eims_disable |= IXGBE_EICR_ECC;
}
/* Check for over temp condition */
@@ -3172,7 +3185,7 @@
if (!(eicr & IXGBE_EICR_GPI_SDP0_X550EM_a))
break;
/* Disable interrupt to prevent log spam */
- eims_disable |= IXGBE_EICR_GPI_SDP0_X550EM_a;
+ *eims_disable |= IXGBE_EICR_GPI_SDP0_X550EM_a;
retval = hw->phy.ops.check_overtemp(hw);
if (retval != IXGBE_ERR_OVERTEMP)
@@ -3184,7 +3197,7 @@
if (!(eicr & IXGBE_EICR_TS))
break;
/* Disable interrupt to prevent log spam */
- eims_disable |= IXGBE_EIMS_TS;
+ *eims_disable |= IXGBE_EIMS_TS;
retval = hw->phy.ops.check_overtemp(hw);
if (retval != IXGBE_ERR_OVERTEMP)
@@ -3199,7 +3212,7 @@
if ((adapter->feat_en & IXGBE_FEATURE_SRIOV) &&
(eicr & IXGBE_EICR_MAILBOX)) {
task_requests |= IXGBE_REQUEST_TASK_MBX;
- eims_disable |= IXGBE_EIMS_MAILBOX;
+ *eims_disable |= IXGBE_EIMS_MAILBOX;
}
}
@@ -3208,7 +3221,7 @@
retval = ixgbe_check_fan_failure(adapter, eicr, true);
if (retval == IXGBE_ERR_FAN_FAILURE) {
/* Disable interrupt to prevent log spam */
- eims_disable |= IXGBE_EIMS_GPI_SDP1_BY_MAC(hw);
+ *eims_disable |= IXGBE_EIMS_GPI_SDP1_BY_MAC(hw);
}
}
@@ -3216,7 +3229,7 @@
if ((hw->phy.type == ixgbe_phy_x550em_ext_t) &&
(eicr & IXGBE_EICR_GPI_SDP0_X540)) {
task_requests |= IXGBE_REQUEST_TASK_PHY;
- eims_disable |= IXGBE_EICR_GPI_SDP0_X540;
+ *eims_disable |= IXGBE_EICR_GPI_SDP0_X540;
}
if (task_requests != 0) {
@@ -3226,11 +3239,7 @@
mutex_exit(&adapter->admin_mtx);
}
- /* Re-enable some OTHER interrupts */
- IXGBE_WRITE_REG(hw, IXGBE_EIMS, eims_orig & ~eims_disable);
-
- return 1;
-} /* ixgbe_msix_admin */
+}
static void
ixgbe_eitr_write(struct adapter *adapter, uint32_t index, uint32_t itr)
@@ -5189,12 +5198,10 @@
struct adapter *adapter = que->adapter;
struct ixgbe_hw *hw = &adapter->hw;
struct tx_ring *txr = adapter->tx_rings;
- u32 eicr, eicr_mask;
+ u32 eicr;
u32 eims_orig;
u32 eims_enable = 0;
u32 eims_disable = 0;
- u32 task_requests = 0;
- s32 retval;
eims_orig = IXGBE_READ_REG(hw, IXGBE_EIMS);
/*
@@ -5239,116 +5246,7 @@
} else
eims_enable |= IXGBE_EIMC_RTX_QUEUE;
- /* Link status change */
- if (eicr & IXGBE_EICR_LSC) {
- task_requests |= IXGBE_REQUEST_TASK_LSC;
- eims_disable |= IXGBE_EIMS_LSC;
- }
-
- if (ixgbe_is_sfp(hw)) {
- /* Pluggable optics-related interrupt */
- if (hw->mac.type >= ixgbe_mac_X540)
- eicr_mask = IXGBE_EICR_GPI_SDP0_X540;
- else
- eicr_mask = IXGBE_EICR_GPI_SDP2_BY_MAC(hw);
-
- /*
- * An interrupt might not arrive when a module is inserted.
- * When an link status change interrupt occurred and the driver
- * still regard SFP as unplugged, issue the module softint
- * and then issue LSC interrupt.
- */
- if ((eicr & eicr_mask)
- || ((hw->phy.sfp_type == ixgbe_sfp_type_not_present)
- && (eicr & IXGBE_EICR_LSC))) {
- task_requests |= IXGBE_REQUEST_TASK_MOD;
- eims_disable |= IXGBE_EIMS_LSC;
- }
-
- if ((hw->mac.type == ixgbe_mac_82599EB) &&
- (eicr & IXGBE_EICR_GPI_SDP1_BY_MAC(hw))) {
- task_requests |= IXGBE_REQUEST_TASK_MSF;
- eims_disable |= IXGBE_EIMS_GPI_SDP1_BY_MAC(hw);
- }
- }
-
- if (adapter->hw.mac.type != ixgbe_mac_82598EB) {
- if ((adapter->feat_en & IXGBE_FEATURE_FDIR) &&
- (eicr & IXGBE_EICR_FLOW_DIR)) {
- if (!atomic_cas_uint(&adapter->fdir_reinit, 0, 1)) {
- task_requests |= IXGBE_REQUEST_TASK_FDIR;
- /* Disable the interrupt */
- eims_disable |= IXGBE_EIMS_FLOW_DIR;
- }
- }
-
- if (eicr & IXGBE_EICR_ECC) {
- device_printf(adapter->dev,
- "CRITICAL: ECC ERROR!! Please Reboot!!\n");
- /* Disable interrupt to prevent log spam */
- eims_disable |= IXGBE_EICR_ECC;
- }
-
- /* Check for over temp condition */
- if (adapter->feat_en & IXGBE_FEATURE_TEMP_SENSOR) {
- switch (adapter->hw.mac.type) {
- case ixgbe_mac_X550EM_a:
- if (!(eicr & IXGBE_EICR_GPI_SDP0_X550EM_a))
- break;
- /* Disable interrupt to prevent log spam */
- eims_disable |= IXGBE_EICR_GPI_SDP0_X550EM_a;
-
- retval = hw->phy.ops.check_overtemp(hw);
- if (retval != IXGBE_ERR_OVERTEMP)
- break;
- device_printf(adapter->dev, "CRITICAL: OVER TEMP!! PHY IS SHUT DOWN!!\n");
- device_printf(adapter->dev, "System shutdown required!\n");
- break;
- default:
- if (!(eicr & IXGBE_EICR_TS))
- break;
- /* Disable interrupt to prevent log spam */
- eims_disable |= IXGBE_EIMS_TS;
-
- retval = hw->phy.ops.check_overtemp(hw);
- if (retval != IXGBE_ERR_OVERTEMP)
- break;
- device_printf(adapter->dev, "CRITICAL: OVER TEMP!! PHY IS SHUT DOWN!!\n");
- device_printf(adapter->dev, "System shutdown required!\n");
- break;
- }
- }
-
- /* Check for VF message */
- if ((adapter->feat_en & IXGBE_FEATURE_SRIOV) &&
- (eicr & IXGBE_EICR_MAILBOX)) {
- task_requests |= IXGBE_REQUEST_TASK_MBX;
- eims_disable |= IXGBE_EIMS_MAILBOX;
- }
- }
-
- /* Check for fan failure */
- if (adapter->feat_en & IXGBE_FEATURE_FAN_FAIL) {
- retval = ixgbe_check_fan_failure(adapter, eicr, true);
- if (retval == IXGBE_ERR_FAN_FAILURE) {
- /* Disable interrupt to prevent log spam */
- eims_disable |= IXGBE_EIMS_GPI_SDP1_BY_MAC(hw);
- }
- }
-
- /* External PHY interrupt */
- if ((hw->phy.type == ixgbe_phy_x550em_ext_t) &&
- (eicr & IXGBE_EICR_GPI_SDP0_X540)) {
- task_requests |= IXGBE_REQUEST_TASK_PHY;
- eims_disable |= IXGBE_EICR_GPI_SDP0_X540;
- }
-
- if (task_requests != 0) {
- mutex_enter(&adapter->admin_mtx);
- adapter->task_requests |= task_requests;
- ixgbe_schedule_admin_tasklet(adapter);
- mutex_exit(&adapter->admin_mtx);
- }
+ ixgbe_intr_admin_common(adapter, eicr, &eims_disable);
/* Re-enable some interrupts */
IXGBE_WRITE_REG(hw, IXGBE_EIMS,
Home |
Main Index |
Thread Index |
Old Index