Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F140120378
D40532.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
11 KB
Referenced Files
None
Subscribers
None
D40532.diff
View Options
diff --git a/sys/dev/ixl/if_ixl.c b/sys/dev/ixl/if_ixl.c
--- a/sys/dev/ixl/if_ixl.c
+++ b/sys/dev/ixl/if_ixl.c
@@ -597,14 +597,14 @@
if (((pf->hw.aq.fw_maj_ver == 4) && (pf->hw.aq.fw_min_ver < 3)) ||
(pf->hw.aq.fw_maj_ver < 4)) {
i40e_aq_stop_lldp(hw, true, false, NULL);
- pf->state |= IXL_PF_STATE_FW_LLDP_DISABLED;
+ ixl_set_state(&pf->state, IXL_STATE_FW_LLDP_DISABLED);
}
/* Try enabling Energy Efficient Ethernet (EEE) mode */
if (i40e_enable_eee(hw, true) == I40E_SUCCESS)
- atomic_set_32(&pf->state, IXL_PF_STATE_EEE_ENABLED);
+ ixl_set_state(&pf->state, IXL_STATE_EEE_ENABLED);
else
- atomic_clear_32(&pf->state, IXL_PF_STATE_EEE_ENABLED);
+ ixl_clear_state(&pf->state, IXL_STATE_EEE_ENABLED);
/* Get MAC addresses from hardware */
i40e_get_mac_addr(hw, hw->mac.addr);
@@ -629,11 +629,11 @@
/* Query device FW LLDP status */
if (i40e_get_fw_lldp_status(hw, &lldp_status) == I40E_SUCCESS) {
if (lldp_status == I40E_GET_FW_LLDP_STATUS_DISABLED) {
- atomic_set_32(&pf->state,
- IXL_PF_STATE_FW_LLDP_DISABLED);
+ ixl_set_state(&pf->state,
+ IXL_STATE_FW_LLDP_DISABLED);
} else {
- atomic_clear_32(&pf->state,
- IXL_PF_STATE_FW_LLDP_DISABLED);
+ ixl_clear_state(&pf->state,
+ IXL_STATE_FW_LLDP_DISABLED);
}
}
@@ -772,7 +772,7 @@
* Driver may have been reloaded. Ensure that the link state
* is consistent with current settings.
*/
- ixl_set_link(pf, (pf->state & IXL_PF_STATE_LINK_ACTIVE_ON_DOWN) != 0);
+ ixl_set_link(pf, ixl_test_state(&pf->state, IXL_STATE_LINK_ACTIVE_ON_DOWN));
hw->phy.get_link_info = true;
i40e_get_link_status(hw, &pf->link_up);
@@ -1032,8 +1032,7 @@
* e.g. on MTU change.
*/
if ((if_getflags(ifp) & IFF_UP) == 0 &&
- (atomic_load_acq_32(&pf->state) &
- IXL_PF_STATE_LINK_ACTIVE_ON_DOWN) == 0)
+ !ixl_test_state(&pf->state, IXL_STATE_LINK_ACTIVE_ON_DOWN))
ixl_set_link(pf, false);
}
@@ -1417,7 +1416,7 @@
if (!i40e_check_asq_alive(&pf->hw))
return;
- if (pf->state & IXL_PF_STATE_MDD_PENDING)
+ if (ixl_test_state(&pf->state, IXL_STATE_MDD_PENDING))
ixl_handle_mdd_event(pf);
ixl_process_adminq(pf, &pending);
diff --git a/sys/dev/ixl/ixl_pf.h b/sys/dev/ixl/ixl_pf.h
--- a/sys/dev/ixl/ixl_pf.h
+++ b/sys/dev/ixl/ixl_pf.h
@@ -76,26 +76,26 @@
};
/* Used in struct ixl_pf's state field */
-enum ixl_pf_state {
- IXL_PF_STATE_RECOVERY_MODE = (1 << 0),
- IXL_PF_STATE_RESETTING = (1 << 1),
- IXL_PF_STATE_MDD_PENDING = (1 << 2),
- IXL_PF_STATE_PF_RESET_REQ = (1 << 3),
- IXL_PF_STATE_VF_RESET_REQ = (1 << 4),
- IXL_PF_STATE_PF_CRIT_ERR = (1 << 5),
- IXL_PF_STATE_CORE_RESET_REQ = (1 << 6),
- IXL_PF_STATE_GLOB_RESET_REQ = (1 << 7),
- IXL_PF_STATE_EMP_RESET_REQ = (1 << 8),
- IXL_PF_STATE_FW_LLDP_DISABLED = (1 << 9),
- IXL_PF_STATE_EEE_ENABLED = (1 << 10),
- IXL_PF_STATE_LINK_ACTIVE_ON_DOWN = (1 << 11),
+enum ixl_state {
+ IXL_STATE_RECOVERY_MODE = 0,
+ IXL_STATE_RESETTING = 1,
+ IXL_STATE_MDD_PENDING = 2,
+ IXL_STATE_PF_RESET_REQ = 3,
+ IXL_STATE_VF_RESET_REQ = 4,
+ IXL_STATE_PF_CRIT_ERR = 5,
+ IXL_STATE_CORE_RESET_REQ = 6,
+ IXL_STATE_GLOB_RESET_REQ = 7,
+ IXL_STATE_EMP_RESET_REQ = 8,
+ IXL_STATE_FW_LLDP_DISABLED = 9,
+ IXL_STATE_EEE_ENABLED = 10,
+ IXL_STATE_LINK_ACTIVE_ON_DOWN = 11,
};
#define IXL_PF_IN_RECOVERY_MODE(pf) \
- ((atomic_load_acq_32(&pf->state) & IXL_PF_STATE_RECOVERY_MODE) != 0)
+ ixl_test_state(&pf->state, IXL_STATE_RECOVERY_MODE)
#define IXL_PF_IS_RESETTING(pf) \
- ((atomic_load_acq_32(&pf->state) & IXL_PF_STATE_RESETTING) != 0)
+ ixl_test_state(&pf->state, IXL_STATE_RESETTING)
struct ixl_vf {
struct ixl_vsi vsi;
@@ -284,6 +284,10 @@
#define ixl_dbg_iov(pf, s, ...) ixl_debug_core((pf)->dev, (pf)->dbg_mask, IXL_DBG_IOV, s, ##__VA_ARGS__)
/* PF-only function declarations */
+void ixl_set_state(volatile u32 *s, enum ixl_state bit);
+void ixl_clear_state(volatile u32 *s, enum ixl_state bit);
+bool ixl_test_state(volatile u32 *s, enum ixl_state bit);
+u32 ixl_testandset_state(volatile u32 *s, enum ixl_state bit);
int ixl_setup_interface(device_t, struct ixl_pf *);
void ixl_print_nvm_cmd(device_t, struct i40e_nvm_access *);
diff --git a/sys/dev/ixl/ixl_pf_iflib.c b/sys/dev/ixl/ixl_pf_iflib.c
--- a/sys/dev/ixl/ixl_pf_iflib.c
+++ b/sys/dev/ixl/ixl_pf_iflib.c
@@ -158,7 +158,7 @@
if (reg & I40E_PFINT_ICR0_MAL_DETECT_MASK) {
mask &= ~I40E_PFINT_ICR0_ENA_MAL_DETECT_MASK;
- atomic_set_32(&pf->state, IXL_PF_STATE_MDD_PENDING);
+ ixl_set_state(&pf->state, IXL_STATE_MDD_PENDING);
do_task = TRUE;
}
@@ -185,7 +185,7 @@
}
device_printf(dev, "Reset Requested! (%s)\n", reset_type);
/* overload admin queue task to check reset progress */
- atomic_set_int(&pf->state, IXL_PF_STATE_RESETTING);
+ ixl_set_state(&pf->state, IXL_STATE_RESETTING);
do_task = TRUE;
}
@@ -202,8 +202,8 @@
/* Checks against the conditions above */
if (reg & IXL_ICR0_CRIT_ERR_MASK) {
mask &= ~IXL_ICR0_CRIT_ERR_MASK;
- atomic_set_32(&pf->state,
- IXL_PF_STATE_PF_RESET_REQ | IXL_PF_STATE_PF_CRIT_ERR);
+ ixl_set_state(&pf->state,
+ IXL_STATE_PF_RESET_REQ | IXL_STATE_PF_CRIT_ERR);
do_task = TRUE;
}
@@ -1037,11 +1037,11 @@
/* Query device FW LLDP status */
if (i40e_get_fw_lldp_status(hw, &lldp_status) == I40E_SUCCESS) {
if (lldp_status == I40E_GET_FW_LLDP_STATUS_DISABLED) {
- atomic_set_32(&pf->state,
- IXL_PF_STATE_FW_LLDP_DISABLED);
+ ixl_set_state(&pf->state,
+ IXL_STATE_FW_LLDP_DISABLED);
} else {
- atomic_clear_32(&pf->state,
- IXL_PF_STATE_FW_LLDP_DISABLED);
+ ixl_clear_state(&pf->state,
+ IXL_STATE_FW_LLDP_DISABLED);
}
}
diff --git a/sys/dev/ixl/ixl_pf_main.c b/sys/dev/ixl/ixl_pf_main.c
--- a/sys/dev/ixl/ixl_pf_main.c
+++ b/sys/dev/ixl/ixl_pf_main.c
@@ -116,6 +116,71 @@
"None"
};
+/* Functions for setting and checking driver state. Note the functions take
+ * bit positions, not bitmasks. The atomic_set_32 and atomic_clear_32
+ * operations require bitmasks. This can easily lead to programming error, so
+ * we provide wrapper functions to avoid this.
+ */
+
+/**
+ * ixl_set_state - Set the specified state
+ * @s: the state bitmap
+ * @bit: the state to set
+ *
+ * Atomically update the state bitmap with the specified bit set.
+ */
+inline void
+ixl_set_state(volatile u32 *s, enum ixl_state bit)
+{
+ /* atomic_set_32 expects a bitmask */
+ atomic_set_32(s, BIT(bit));
+}
+
+/**
+ * ixl_clear_state - Clear the specified state
+ * @s: the state bitmap
+ * @bit: the state to clear
+ *
+ * Atomically update the state bitmap with the specified bit cleared.
+ */
+inline void
+ixl_clear_state(volatile u32 *s, enum ixl_state bit)
+{
+ /* atomic_clear_32 expects a bitmask */
+ atomic_clear_32(s, BIT(bit));
+}
+
+/**
+ * ixl_test_state - Test the specified state
+ * @s: the state bitmap
+ * @bit: the bit to test
+ *
+ * Return true if the state is set, false otherwise. Use this only if the flow
+ * does not need to update the state. If you must update the state as well,
+ * prefer ixl_testandset_state.
+ */
+inline bool
+ixl_test_state(volatile u32 *s, enum ixl_state bit)
+{
+ return !!(*s & BIT(bit));
+}
+
+/**
+ * ixl_testandset_state - Test and set the specified state
+ * @s: the state bitmap
+ * @bit: the bit to test
+ *
+ * Atomically update the state bitmap, setting the specified bit. Returns the
+ * previous value of the bit.
+ */
+inline u32
+ixl_testandset_state(volatile u32 *s, enum ixl_state bit)
+{
+ /* atomic_testandset_32 expects a bit position, as opposed to bitmask
+ expected by other atomic functions */
+ return atomic_testandset_32(s, bit);
+}
+
MALLOC_DEFINE(M_IXL, "ixl", "ixl driver allocations");
/*
@@ -210,7 +275,7 @@
fw_mode = ixl_get_fw_mode(pf);
ixl_dbg_info(pf, "%s: before PF reset FW mode: 0x%08x\n", __func__, fw_mode);
if (fw_mode == IXL_FW_MODE_RECOVERY) {
- atomic_set_32(&pf->state, IXL_PF_STATE_RECOVERY_MODE);
+ ixl_set_state(&pf->state, IXL_STATE_RECOVERY_MODE);
/* Don't try to reset device if it's in recovery mode */
return (0);
}
@@ -224,7 +289,7 @@
fw_mode = ixl_get_fw_mode(pf);
ixl_dbg_info(pf, "%s: after PF reset FW mode: 0x%08x\n", __func__, fw_mode);
if (fw_mode == IXL_FW_MODE_RECOVERY) {
- atomic_set_32(&pf->state, IXL_PF_STATE_RECOVERY_MODE);
+ ixl_set_state(&pf->state, IXL_STATE_RECOVERY_MODE);
return (0);
}
@@ -387,7 +452,7 @@
}
/* Keep link active by default */
- atomic_set_32(&pf->state, IXL_PF_STATE_LINK_ACTIVE_ON_DOWN);
+ ixl_set_state(&pf->state, IXL_STATE_LINK_ACTIVE_ON_DOWN);
/* Print a subset of the capability information. */
device_printf(dev,
@@ -1869,7 +1934,7 @@
ixl_handle_tx_mdd_event(pf);
ixl_handle_rx_mdd_event(pf);
- atomic_clear_32(&pf->state, IXL_PF_STATE_MDD_PENDING);
+ ixl_clear_state(&pf->state, IXL_STATE_MDD_PENDING);
/* re-enable mdd interrupt cause */
reg = rd32(hw, I40E_PFINT_ICR0_ENA);
@@ -1937,7 +2002,7 @@
if (!IXL_PF_IN_RECOVERY_MODE(pf) &&
ixl_get_fw_mode(pf) == IXL_FW_MODE_RECOVERY) {
- atomic_set_32(&pf->state, IXL_PF_STATE_RECOVERY_MODE);
+ ixl_set_state(&pf->state, IXL_STATE_RECOVERY_MODE);
device_printf(pf->dev,
"Firmware recovery mode detected. Limiting functionality. Refer to Intel(R) Ethernet Adapters and Devices User Guide for details on firmware recovery mode.\n");
pf->link_up = FALSE;
@@ -1946,7 +2011,7 @@
ixl_rebuild_hw_structs_after_reset(pf, is_up);
- atomic_clear_32(&pf->state, IXL_PF_STATE_RESETTING);
+ ixl_clear_state(&pf->state, IXL_STATE_RESETTING);
}
void
@@ -4453,7 +4518,7 @@
}
}
- atomic_clear_32(&pf->state, IXL_PF_STATE_FW_LLDP_DISABLED);
+ ixl_clear_state(&pf->state, IXL_STATE_FW_LLDP_DISABLED);
return (0);
}
@@ -4490,7 +4555,7 @@
}
i40e_aq_set_dcb_parameters(hw, true, NULL);
- atomic_set_32(&pf->state, IXL_PF_STATE_FW_LLDP_DISABLED);
+ ixl_set_state(&pf->state, IXL_STATE_FW_LLDP_DISABLED);
return (0);
}
@@ -4500,7 +4565,7 @@
struct ixl_pf *pf = (struct ixl_pf *)arg1;
int state, new_state, error = 0;
- state = new_state = ((pf->state & IXL_PF_STATE_FW_LLDP_DISABLED) == 0);
+ state = new_state = !ixl_test_state(&pf->state, IXL_STATE_FW_LLDP_DISABLED);
/* Read in new mode */
error = sysctl_handle_int(oidp, &new_state, 0, req);
@@ -4526,7 +4591,7 @@
enum i40e_status_code cmd_status;
/* Init states' values */
- state = new_state = (!!(pf->state & IXL_PF_STATE_EEE_ENABLED));
+ state = new_state = ixl_test_state(&pf->state, IXL_STATE_EEE_ENABLED);
/* Get requested mode */
sysctl_handle_status = sysctl_handle_int(oidp, &new_state, 0, req);
@@ -4543,9 +4608,9 @@
/* Save new state or report error */
if (!cmd_status) {
if (new_state == 0)
- atomic_clear_32(&pf->state, IXL_PF_STATE_EEE_ENABLED);
+ ixl_clear_state(&pf->state, IXL_STATE_EEE_ENABLED);
else
- atomic_set_32(&pf->state, IXL_PF_STATE_EEE_ENABLED);
+ ixl_set_state(&pf->state, IXL_STATE_EEE_ENABLED);
} else if (cmd_status == I40E_ERR_CONFIG)
return (EPERM);
else
@@ -4560,17 +4625,16 @@
struct ixl_pf *pf = (struct ixl_pf *)arg1;
int error, state;
- state = !!(atomic_load_acq_32(&pf->state) &
- IXL_PF_STATE_LINK_ACTIVE_ON_DOWN);
+ state = ixl_test_state(&pf->state, IXL_STATE_LINK_ACTIVE_ON_DOWN);
error = sysctl_handle_int(oidp, &state, 0, req);
if ((error) || (req->newptr == NULL))
return (error);
if (state == 0)
- atomic_clear_32(&pf->state, IXL_PF_STATE_LINK_ACTIVE_ON_DOWN);
+ ixl_clear_state(&pf->state, IXL_STATE_LINK_ACTIVE_ON_DOWN);
else
- atomic_set_32(&pf->state, IXL_PF_STATE_LINK_ACTIVE_ON_DOWN);
+ ixl_set_state(&pf->state, IXL_STATE_LINK_ACTIVE_ON_DOWN);
return (0);
}
@@ -4617,7 +4681,7 @@
return (error);
/* Initiate the PF reset later in the admin task */
- atomic_set_32(&pf->state, IXL_PF_STATE_PF_RESET_REQ);
+ ixl_set_state(&pf->state, IXL_STATE_PF_RESET_REQ);
return (error);
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Dec 21, 12:33 PM (4 h, 56 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27112943
Default Alt Text
D40532.diff (11 KB)
Attached To
Mode
D40532: ixl: port ice's atomic API to ixl
Attached
Detach File
Event Timeline
Log In to Comment