From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: "Csókás, Bence" <csokas.bence@prolan.hu>,
"Michal Swiatkowski" <michal.swiatkowski@linux.intel.com>,
"Jacob Keller" <jacob.e.keller@intel.com>,
"Simon Horman" <horms@kernel.org>,
"Paolo Abeni" <pabeni@redhat.com>,
"Sasha Levin" <sashal@kernel.org>,
wei.fang@nxp.com, andrew+netdev@lunn.ch, davem@davemloft.net,
edumazet@google.com, kuba@kernel.org, imx@lists.linux.dev,
netdev@vger.kernel.org
Subject: [PATCH AUTOSEL 6.6 239/294] net: fec: Refactor MAC reset to function
Date: Mon, 5 May 2025 18:55:39 -0400 [thread overview]
Message-ID: <20250505225634.2688578-239-sashal@kernel.org> (raw)
In-Reply-To: <20250505225634.2688578-1-sashal@kernel.org>
From: Csókás, Bence <csokas.bence@prolan.hu>
[ Upstream commit 67800d296191d0a9bde0a7776f99ca1ddfa0fc26 ]
The core is reset both in `fec_restart()` (called on link-up) and
`fec_stop()` (going to sleep, driver remove etc.). These two functions
had their separate implementations, which was at first only a register
write and a `udelay()` (and the accompanying block comment). However,
since then we got soft-reset (MAC disable) and Wake-on-LAN support, which
meant that these implementations diverged, often causing bugs.
For instance, as of now, `fec_stop()` does not check for
`FEC_QUIRK_NO_HARD_RESET`, meaning the MII/RMII mode is cleared on eg.
a PM power-down event; and `fec_restart()` missed the refactor renaming
the "magic" constant `1` to `FEC_ECR_RESET`.
To harmonize current implementations, and eliminate this source of
potential future bugs, refactor implementation to a common function.
Reviewed-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: Csókás, Bence <csokas.bence@prolan.hu>
Link: https://patch.msgid.link/20250207121255.161146-2-csokas.bence@prolan.hu
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
drivers/net/ethernet/freescale/fec_main.c | 52 +++++++++++------------
1 file changed, 25 insertions(+), 27 deletions(-)
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index 2d6b50903c923..419df6559492e 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -1074,6 +1074,29 @@ static void fec_enet_enable_ring(struct net_device *ndev)
}
}
+/* Whack a reset. We should wait for this.
+ * For i.MX6SX SOC, enet use AXI bus, we use disable MAC
+ * instead of reset MAC itself.
+ */
+static void fec_ctrl_reset(struct fec_enet_private *fep, bool allow_wol)
+{
+ u32 val;
+
+ if (!allow_wol || !(fep->wol_flag & FEC_WOL_FLAG_SLEEP_ON)) {
+ if (fep->quirks & FEC_QUIRK_HAS_MULTI_QUEUES ||
+ ((fep->quirks & FEC_QUIRK_NO_HARD_RESET) && fep->link)) {
+ writel(0, fep->hwp + FEC_ECNTRL);
+ } else {
+ writel(FEC_ECR_RESET, fep->hwp + FEC_ECNTRL);
+ udelay(10);
+ }
+ } else {
+ val = readl(fep->hwp + FEC_ECNTRL);
+ val |= (FEC_ECR_MAGICEN | FEC_ECR_SLEEP);
+ writel(val, fep->hwp + FEC_ECNTRL);
+ }
+}
+
/*
* This function is called to start or restart the FEC during a link
* change, transmit timeout, or to reconfigure the FEC. The network
@@ -1090,17 +1113,7 @@ fec_restart(struct net_device *ndev)
if (fep->bufdesc_ex)
fec_ptp_save_state(fep);
- /* Whack a reset. We should wait for this.
- * For i.MX6SX SOC, enet use AXI bus, we use disable MAC
- * instead of reset MAC itself.
- */
- if (fep->quirks & FEC_QUIRK_HAS_MULTI_QUEUES ||
- ((fep->quirks & FEC_QUIRK_NO_HARD_RESET) && fep->link)) {
- writel(0, fep->hwp + FEC_ECNTRL);
- } else {
- writel(1, fep->hwp + FEC_ECNTRL);
- udelay(10);
- }
+ fec_ctrl_reset(fep, false);
/*
* enet-mac reset will reset mac address registers too,
@@ -1354,22 +1367,7 @@ fec_stop(struct net_device *ndev)
if (fep->bufdesc_ex)
fec_ptp_save_state(fep);
- /* Whack a reset. We should wait for this.
- * For i.MX6SX SOC, enet use AXI bus, we use disable MAC
- * instead of reset MAC itself.
- */
- if (!(fep->wol_flag & FEC_WOL_FLAG_SLEEP_ON)) {
- if (fep->quirks & FEC_QUIRK_HAS_MULTI_QUEUES) {
- writel(0, fep->hwp + FEC_ECNTRL);
- } else {
- writel(FEC_ECR_RESET, fep->hwp + FEC_ECNTRL);
- udelay(10);
- }
- } else {
- val = readl(fep->hwp + FEC_ECNTRL);
- val |= (FEC_ECR_MAGICEN | FEC_ECR_SLEEP);
- writel(val, fep->hwp + FEC_ECNTRL);
- }
+ fec_ctrl_reset(fep, true);
writel(fep->phy_speed, fep->hwp + FEC_MII_SPEED);
writel(FEC_DEFAULT_IMASK, fep->hwp + FEC_IMASK);
--
2.39.5
next prev parent reply other threads:[~2025-05-05 23:04 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20250505225634.2688578-1-sashal@kernel.org>
2025-05-05 22:51 ` [PATCH AUTOSEL 6.6 010/294] SUNRPC: Don't allow waiting for exiting tasks Sasha Levin
2025-05-05 22:52 ` [PATCH AUTOSEL 6.6 023/294] SUNRPC: rpc_clnt_set_transport() must not change the autobind setting Sasha Levin
2025-05-05 22:52 ` [PATCH AUTOSEL 6.6 024/294] SUNRPC: rpcbind should never reset the port to the value '0' Sasha Levin
2025-05-05 22:52 ` [PATCH AUTOSEL 6.6 063/294] tcp: reorganize tcp_in_ack_event() and tcp_count_delivered() Sasha Levin
2025-05-05 22:52 ` [PATCH AUTOSEL 6.6 072/294] net/smc: use the correct ndev to find pnetid by pnetid table Sasha Levin
2025-05-05 22:53 ` [PATCH AUTOSEL 6.6 084/294] netfilter: conntrack: Bound nf_conntrack sysctl writes Sasha Levin
2025-05-05 22:53 ` [PATCH AUTOSEL 6.6 092/294] ipv6: save dontfrag in cork Sasha Levin
2025-05-05 22:53 ` [PATCH AUTOSEL 6.6 108/294] tcp: bring back NUMA dispersion in inet_ehash_locks_alloc() Sasha Levin
2025-05-05 22:53 ` [PATCH AUTOSEL 6.6 110/294] ieee802154: ca8210: Use proper setters and getters for bitwise types Sasha Levin
2025-05-05 22:53 ` [PATCH AUTOSEL 6.6 116/294] net: phylink: use pl->link_interface in phylink_expects_phy() Sasha Levin
2025-05-05 22:53 ` [PATCH AUTOSEL 6.6 122/294] net: ethernet: ti: cpsw_new: populate netdev of_node Sasha Levin
2025-05-05 22:53 ` [PATCH AUTOSEL 6.6 123/294] net: pktgen: fix mpls maximum labels list parsing Sasha Levin
2025-05-05 22:53 ` [PATCH AUTOSEL 6.6 126/294] ipv4: fib: Move fib_valid_key_len() to rtm_to_fib_config() Sasha Levin
2025-05-05 22:54 ` [PATCH AUTOSEL 6.6 144/294] net/mlx5: Avoid report two health errors on same syndrome Sasha Levin
2025-05-05 22:54 ` [PATCH AUTOSEL 6.6 145/294] selftests/net: have `gro.sh -t` return a correct exit code Sasha Levin
2025-05-05 22:54 ` [PATCH AUTOSEL 6.6 148/294] net: ethernet: mtk_ppe_offload: Allow QinQ, double ETH_P_8021Q only Sasha Levin
2025-05-05 22:54 ` [PATCH AUTOSEL 6.6 149/294] net: xgene-v2: remove incorrect ACPI_PTR annotation Sasha Levin
2025-05-05 22:54 ` [PATCH AUTOSEL 6.6 150/294] bonding: report duplicate MAC address in all situations Sasha Levin
2025-05-05 22:54 ` [PATCH AUTOSEL 6.6 153/294] Octeontx2-af: RPM: Register driver with PCI subsys IDs Sasha Levin
2025-05-05 22:54 ` [PATCH AUTOSEL 6.6 160/294] vhost-scsi: Return queue full for page alloc failures during copy Sasha Levin
2025-05-05 22:54 ` [PATCH AUTOSEL 6.6 168/294] net/mlx5: Change POOL_NEXT_SIZE define value and make it global Sasha Levin
2025-05-05 22:54 ` [PATCH AUTOSEL 6.6 181/294] net: pktgen: fix access outside of user given buffer in pktgen_thread_write() Sasha Levin
2025-05-05 22:54 ` [PATCH AUTOSEL 6.6 183/294] bpf: Prevent unsafe access to the sock fields in the BPF timestamping callback Sasha Levin
2025-05-05 22:54 ` [PATCH AUTOSEL 6.6 191/294] eth: mlx4: don't try to complete XDP frames in netpoll Sasha Levin
2025-05-05 22:54 ` [PATCH AUTOSEL 6.6 194/294] vxlan: Join / leave MC group after remote changes Sasha Levin
2025-05-05 22:54 ` [PATCH AUTOSEL 6.6 196/294] net/mlx5: Modify LSB bitmask in temperature event to include only the first bit Sasha Levin
2025-05-05 22:54 ` [PATCH AUTOSEL 6.6 197/294] net/mlx5: Apply rate-limiting to high temperature warning Sasha Levin
2025-05-05 22:55 ` [PATCH AUTOSEL 6.6 214/294] net/mlx4_core: Avoid impossible mlx4_db_alloc() order value Sasha Levin
2025-05-05 22:55 ` [PATCH AUTOSEL 6.6 232/294] net/mlx5: Extend Ethtool loopback selftest to support non-linear SKB Sasha Levin
2025-05-05 22:55 ` [PATCH AUTOSEL 6.6 233/294] net/mlx5e: set the tx_queue_len for pfifo_fast Sasha Levin
2025-05-05 22:55 ` [PATCH AUTOSEL 6.6 234/294] net/mlx5e: reduce rep rxq depth to 256 for ECPF Sasha Levin
2025-05-05 22:55 ` [PATCH AUTOSEL 6.6 235/294] net/mlx5e: reduce the max log mpwrq sz for ECPF and reps Sasha Levin
2025-05-05 22:55 ` Sasha Levin [this message]
2025-05-05 22:55 ` [PATCH AUTOSEL 6.6 242/294] ip: fib_rules: Fetch net from fib_rule in fib[46]_rule_configure() Sasha Levin
2025-05-05 22:55 ` [PATCH AUTOSEL 6.6 243/294] r8152: add vendor/device ID pair for Dell Alienware AW1022z Sasha Levin
2025-05-05 22:55 ` [PATCH AUTOSEL 6.6 255/294] net/mlx5e: Avoid WARN_ON when configuring MQPRIO with HTB offload enabled Sasha Levin
2025-05-05 22:55 ` [PATCH AUTOSEL 6.6 256/294] vxlan: Annotate FDB data races Sasha Levin
2025-05-05 22:55 ` [PATCH AUTOSEL 6.6 257/294] ipv4: ip_gre: Fix set but not used warning in ipgre_err() if IPv4-only Sasha Levin
2025-05-05 22:55 ` [PATCH AUTOSEL 6.6 258/294] r8169: don't scan PHY addresses > 0 Sasha Levin
2025-05-05 22:55 ` [PATCH AUTOSEL 6.6 259/294] bridge: mdb: Allow replace of a host-joined group Sasha Levin
2025-05-05 22:56 ` [PATCH AUTOSEL 6.6 260/294] net-sysfs: prevent uncleared queues from being re-added Sasha Levin
2025-05-05 22:56 ` [PATCH AUTOSEL 6.6 261/294] ice: treat dyn_allowed only as suggestion Sasha Levin
2025-05-05 22:56 ` [PATCH AUTOSEL 6.6 266/294] ice: count combined queues using Rx/Tx count Sasha Levin
2025-05-05 22:56 ` [PATCH AUTOSEL 6.6 267/294] net/mana: fix warning in the writer of client oob Sasha Levin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250505225634.2688578-239-sashal@kernel.org \
--to=sashal@kernel.org \
--cc=andrew+netdev@lunn.ch \
--cc=csokas.bence@prolan.hu \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=horms@kernel.org \
--cc=imx@lists.linux.dev \
--cc=jacob.e.keller@intel.com \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=michal.swiatkowski@linux.intel.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=stable@vger.kernel.org \
--cc=wei.fang@nxp.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).