summaryrefslogtreecommitdiff
path: root/drivers/net/ethernet/freescale
AgeCommit message (Collapse)Author
2023-08-28Merge tag 'v5.15.93' into 5.15-2.2.x-imxEmanuele Ghidoli
This is the 5.15.93 stable release Conflicts: drivers/iio/imu/fxos8700_core.c drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c Signed-off-by: Emanuele Ghidoli <emanuele.ghidoli@toradex.com>
2023-08-28Merge tag 'v5.15.91' into 5.15-2.2.x-imxEmanuele Ghidoli
This is the 5.15.91 stable release Signed-off-by: Emanuele Ghidoli <emanuele.ghidoli@toradex.com>
2023-02-09dpaa2-eth: execute xdp_do_flush() before napi_complete_done()Magnus Karlsson
[ Upstream commit a3191c4d86c5d3bd35b00dfde6910b88391436a0 ] Make sure that xdp_do_flush() is always executed before napi_complete_done(). This is important for two reasons. First, a redirect to an XSKMAP assumes that a call to xdp_do_redirect() from napi context X on CPU Y will be followed by a xdp_do_flush() from the same napi context and CPU. This is not guaranteed if the napi_complete_done() is executed before xdp_do_flush(), as it tells the napi logic that it is fine to schedule napi context X on another CPU. Details from a production system triggering this bug using the veth driver can be found following the first link below. The second reason is that the XDP_REDIRECT logic in itself relies on being inside a single NAPI instance through to the xdp_do_flush() call for RCU protection of all in-kernel data structures. Details can be found in the second link below. Fixes: d678be1dc1ec ("dpaa2-eth: add XDP_REDIRECT support") Signed-off-by: Magnus Karlsson <magnus.karlsson@intel.com> Acked-by: Toke Høiland-Jørgensen <toke@redhat.com> Link: https://lore.kernel.org/r/20221220185903.1105011-1-sbohrer@cloudflare.com Link: https://lore.kernel.org/all/20210624160609.292325-1-toke@redhat.com/ Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
2023-02-09dpaa_eth: execute xdp_do_flush() before napi_complete_done()Magnus Karlsson
[ Upstream commit b534013798b77f81a36f36dafd59bab9de837619 ] Make sure that xdp_do_flush() is always executed before napi_complete_done(). This is important for two reasons. First, a redirect to an XSKMAP assumes that a call to xdp_do_redirect() from napi context X on CPU Y will be followed by a xdp_do_flush() from the same napi context and CPU. This is not guaranteed if the napi_complete_done() is executed before xdp_do_flush(), as it tells the napi logic that it is fine to schedule napi context X on another CPU. Details from a production system triggering this bug using the veth driver can be found following the first link below. The second reason is that the XDP_REDIRECT logic in itself relies on being inside a single NAPI instance through to the xdp_do_flush() call for RCU protection of all in-kernel data structures. Details can be found in the second link below. Fixes: a1e031ffb422 ("dpaa_eth: add XDP_REDIRECT support") Signed-off-by: Magnus Karlsson <magnus.karlsson@intel.com> Acked-by: Toke Høiland-Jørgensen <toke@redhat.com> Link: https://lore.kernel.org/r/20221220185903.1105011-1-sbohrer@cloudflare.com Link: https://lore.kernel.org/all/20210624160609.292325-1-toke@redhat.com/ Acked-by: Camelia Groza <camelia.groza@nxp.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
2023-02-01net: enetc: avoid deadlock in enetc_tx_onestep_tstamp()Vladimir Oltean
[ Upstream commit 3c463721a73bdb57a913e0d3124677a3758886fc ] This lockdep splat says it better than I could: ================================ WARNING: inconsistent lock state 6.2.0-rc2-07010-ga9b9500ffaac-dirty #967 Not tainted -------------------------------- inconsistent {IN-SOFTIRQ-W} -> {SOFTIRQ-ON-W} usage. kworker/1:3/179 [HC0[0]:SC0[0]:HE1:SE1] takes: ffff3ec4036ce098 (_xmit_ETHER#2){+.?.}-{3:3}, at: netif_freeze_queues+0x5c/0xc0 {IN-SOFTIRQ-W} state was registered at: _raw_spin_lock+0x5c/0xc0 sch_direct_xmit+0x148/0x37c __dev_queue_xmit+0x528/0x111c ip6_finish_output2+0x5ec/0xb7c ip6_finish_output+0x240/0x3f0 ip6_output+0x78/0x360 ndisc_send_skb+0x33c/0x85c ndisc_send_rs+0x54/0x12c addrconf_rs_timer+0x154/0x260 call_timer_fn+0xb8/0x3a0 __run_timers.part.0+0x214/0x26c run_timer_softirq+0x3c/0x74 __do_softirq+0x14c/0x5d8 ____do_softirq+0x10/0x20 call_on_irq_stack+0x2c/0x5c do_softirq_own_stack+0x1c/0x30 __irq_exit_rcu+0x168/0x1a0 irq_exit_rcu+0x10/0x40 el1_interrupt+0x38/0x64 irq event stamp: 7825 hardirqs last enabled at (7825): [<ffffdf1f7200cae4>] exit_to_kernel_mode+0x34/0x130 hardirqs last disabled at (7823): [<ffffdf1f708105f0>] __do_softirq+0x550/0x5d8 softirqs last enabled at (7824): [<ffffdf1f7081050c>] __do_softirq+0x46c/0x5d8 softirqs last disabled at (7811): [<ffffdf1f708166e0>] ____do_softirq+0x10/0x20 other info that might help us debug this: Possible unsafe locking scenario: CPU0 ---- lock(_xmit_ETHER#2); <Interrupt> lock(_xmit_ETHER#2); *** DEADLOCK *** 3 locks held by kworker/1:3/179: #0: ffff3ec400004748 ((wq_completion)events){+.+.}-{0:0}, at: process_one_work+0x1f4/0x6c0 #1: ffff80000a0bbdc8 ((work_completion)(&priv->tx_onestep_tstamp)){+.+.}-{0:0}, at: process_one_work+0x1f4/0x6c0 #2: ffff3ec4036cd438 (&dev->tx_global_lock){+.+.}-{3:3}, at: netif_tx_lock+0x1c/0x34 Workqueue: events enetc_tx_onestep_tstamp Call trace: print_usage_bug.part.0+0x208/0x22c mark_lock+0x7f0/0x8b0 __lock_acquire+0x7c4/0x1ce0 lock_acquire.part.0+0xe0/0x220 lock_acquire+0x68/0x84 _raw_spin_lock+0x5c/0xc0 netif_freeze_queues+0x5c/0xc0 netif_tx_lock+0x24/0x34 enetc_tx_onestep_tstamp+0x20/0x100 process_one_work+0x28c/0x6c0 worker_thread+0x74/0x450 kthread+0x118/0x11c but I'll say it anyway: the enetc_tx_onestep_tstamp() work item runs in process context, therefore with softirqs enabled (i.o.w., it can be interrupted by a softirq). If we hold the netif_tx_lock() when there is an interrupt, and the NET_TX softirq then gets scheduled, this will take the netif_tx_lock() a second time and deadlock the kernel. To solve this, use netif_tx_lock_bh(), which blocks softirqs from running. Fixes: 7294380c5211 ("enetc: support PTP Sync packet one-step timestamping") Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Reviewed-by: Alexander Duyck <alexanderduyck@fb.com> Link: https://lore.kernel.org/r/20230112105440.1786799-1-vladimir.oltean@nxp.com Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
2023-01-11Merge tag 'v5.15.86' into 5.15-2.2.x-imxDaiane Angolini
This is the 5.15.86 stable release Conflicts: arch/arm64/kernel/traps.c drivers/gpu/drm/bridge/adv7511/adv7511.h drivers/gpu/drm/bridge/adv7511/adv7533.c drivers/gpu/drm/rockchip/cdn-dp-core.c drivers/net/ethernet/freescale/enetc/enetc.c drivers/usb/dwc3/core.c Signed-off-by: Daiane Angolini <daiane.angolini@foundries.io>
2023-01-11Merge tag 'v5.15.84' into 5.15-2.2.x-imxDaiane Angolini
This is the 5.15.84 stable release Conflicts: sound/soc/fsl/fsl_micfil.c Signed-off-by: Daiane Angolini <daiane.angolini@foundries.io>
2023-01-11Merge tag 'v5.15.83' into 5.15-2.2.x-imxDaiane Angolini
This is the 5.15.83 stable release Signed-off-by: Daiane Angolini <daiane.angolini@foundries.io>
2023-01-11Merge tag 'v5.15.81' into 5.15-2.2.x-imxDaiane Angolini
This is the 5.15.81 stable release Conflicts: drivers/dma-buf/dma-heap.c drivers/net/ethernet/freescale/enetc/enetc_qos.c drivers/tty/serial/fsl_lpuart.c sound/soc/fsl/fsl_sai.c Signed-off-by: Daiane Angolini <daiane.angolini@foundries.io>
2023-01-11Merge tag 'v5.15.79' into 5.15-2.2.x-imxDaiane Angolini
This is the 5.15.79 stable release Signed-off-by: Daiane Angolini <daiane.angolini@foundries.io>
2023-01-11Merge tag 'v5.15.78' into 5.15-2.2.x-imxDaiane Angolini
This is the 5.15.78 stable release Conflicts: arch/arm64/boot/dts/freescale/imx8-ss-conn.dtsi Signed-off-by: Daiane Angolini <daiane.angolini@foundries.io>
2023-01-11Merge tag 'v5.15.77' into 5.15-2.2.x-imxDaiane Angolini
This is the 5.15.77 stable release Conflicts: drivers/tty/serial/fsl_lpuart.c Signed-off-by: Daiane Angolini <daiane.angolini@foundries.io>
2023-01-11Merge tag 'v5.15.75' into 5.15-2.2.x-imxDaiane Angolini
This is the 5.15.75 stable release Removes CONFIG_KERNEL_LZO=y from arch/arm/configs/imx_v7_defconfig Conflicts: arch/arm/boot/dts/imx6dl.dtsi arch/arm/boot/dts/imx6q.dtsi arch/arm/boot/dts/imx6sl.dtsi arch/arm/boot/dts/imx6sll.dtsi arch/arm/boot/dts/imx6sx.dtsi arch/arm/boot/dts/imx7d-sdb.dts drivers/char/hw_random/imx-rngc.c drivers/dma/mxs-dma.c drivers/gpu/drm/bridge/adv7511/adv7511_drv.c drivers/tty/serial/fsl_lpuart.c drivers/usb/host/xhci.h Signed-off-by: Daiane Angolini <daiane.angolini@foundries.io>
2022-12-31net: enetc: avoid buffer leaks on xdp_do_redirect() failureVladimir Oltean
[ Upstream commit 628050ec952d2e2e46ec9fb6aa07e41139e030c8 ] Before enetc_clean_rx_ring_xdp() calls xdp_do_redirect(), each software BD in the RX ring between index orig_i and i can have one of 2 refcount values on its page. We are the owner of the current buffer that is being processed, so the refcount will be at least 1. If the current owner of the buffer at the diametrically opposed index in the RX ring (i.o.w, the other half of this page) has not yet called kfree(), this page's refcount could even be 2. enetc_page_reusable() in enetc_flip_rx_buff() tests for the page refcount against 1, and [ if it's 2 ] does not attempt to reuse it. But if enetc_flip_rx_buff() is put after the xdp_do_redirect() call, the page refcount can have one of 3 values. It can also be 0, if there is no owner of the other page half, and xdp_do_redirect() for this buffer ran so far that it triggered a flush of the devmap/cpumap bulk queue, and the consumers of those bulk queues also freed the buffer, all by the time xdp_do_redirect() returns the execution back to enetc. This is the reason why enetc_flip_rx_buff() is called before xdp_do_redirect(), but there is a big flaw with that reasoning: enetc_flip_rx_buff() will set rx_swbd->page = NULL on both sides of the enetc_page_reusable() branch, and if xdp_do_redirect() returns an error, we call enetc_xdp_free(), which does not deal gracefully with that. In fact, what happens is quite special. The page refcounts start as 1. enetc_flip_rx_buff() figures they're reusable, transfers these rx_swbd->page pointers to a different rx_swbd in enetc_reuse_page(), and bumps the refcount to 2. When xdp_do_redirect() later returns an error, we call the no-op enetc_xdp_free(), but we still haven't lost the reference to that page. A copy of it is still at rx_ring->next_to_alloc, but that has refcount 2 (and there are no concurrent owners of it in flight, to drop the refcount). What really kills the system is when we'll flip the rx_swbd->page the second time around. With an updated refcount of 2, the page will not be reusable and we'll really leak it. Then enetc_new_page() will have to allocate more pages, which will then eventually leak again on further errors from xdp_do_redirect(). The problem, summarized, is that we zeroize rx_swbd->page before we're completely done with it, and this makes it impossible for the error path to do something with it. Since the packet is potentially multi-buffer and therefore the rx_swbd->page is potentially an array, manual passing of the old pointers between enetc_flip_rx_buff() and enetc_xdp_free() is a bit difficult. For the sake of going with a simple solution, we accept the possibility of racing with xdp_do_redirect(), and we move the flip procedure to execute only on the redirect success path. By racing, I mean that the page may be deemed as not reusable by enetc (having a refcount of 0), but there will be no leak in that case, either. Once we accept that, we have something better to do with buffers on XDP_REDIRECT failure. Since we haven't performed half-page flipping yet, we won't, either (and this way, we can avoid enetc_xdp_free() completely, which gives the entire page to the slab allocator). Instead, we'll call enetc_xdp_drop(), which will recycle this half of the buffer back to the RX ring. Fixes: 9d2b68cc108d ("net: enetc: add support for XDP_REDIRECT") Suggested-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com> Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Link: https://lore.kernel.org/r/20221213001908.2347046-1-vladimir.oltean@nxp.com Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
2022-12-19net: fec: properly guard irq coalesce setupRasmus Villemoes
commit 7e6303567ce3ca506e4a2704e4baa86f1d8bde02 upstream. Prior to the Fixes: commit, the initialization code went through the same fec_enet_set_coalesce() function as used by ethtool, and that function correctly checks whether the current variant has support for irq coalescing. Now that the initialization code instead calls fec_enet_itr_coal_set() directly, that call needs to be guarded by a check for the FEC_QUIRK_HAS_COALESCE bit. Fixes: df727d4547de (net: fec: don't reset irq coalesce settings to defaults on "ip link up") Reported-by: Greg Ungerer <gregungerer@westnet.com.au> Signed-off-by: Rasmus Villemoes <linux@rasmusvillemoes.dk> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> Link: https://lore.kernel.org/r/20221205204604.869853-1-linux@rasmusvillemoes.dk Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2022-12-19net: fec: don't reset irq coalesce settings to defaults on "ip link up"Rasmus Villemoes
[ Upstream commit df727d4547de568302b0ed15b0d4e8a469bdb456 ] Currently, when a FEC device is brought up, the irq coalesce settings are reset to their default values (1000us, 200 frames). That's unexpected, and breaks for example use of an appropriate .link file to make systemd-udev apply the desired settings (https://www.freedesktop.org/software/systemd/man/systemd.link.html), or any other method that would do a one-time setup during early boot. Refactor the code so that fec_restart() instead uses fec_enet_itr_coal_set(), which simply applies the settings that are stored in the private data, and initialize that private data with the default values. Signed-off-by: Rasmus Villemoes <linux@rasmusvillemoes.dk> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Sasha Levin <sashal@kernel.org>
2022-12-14dpaa2-switch: Fix memory leak in dpaa2_switch_acl_entry_add() and ↵Yuan Can
dpaa2_switch_acl_entry_remove() [ Upstream commit 4fad22a1281c500f15b172c9d261eff347ca634b ] The cmd_buff needs to be freed when error happened in dpaa2_switch_acl_entry_add() and dpaa2_switch_acl_entry_remove(). Fixes: 1110318d83e8 ("dpaa2-switch: add tc flower hardware offload on ingress traffic") Signed-off-by: Yuan Can <yuancan@huawei.com> Link: https://lore.kernel.org/r/20221205061515.115012-1-yuancan@huawei.com Signed-off-by: Paolo Abeni <pabeni@redhat.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
2022-12-02net: enetc: preserve TX ring priority across reconfigurationVladimir Oltean
[ Upstream commit 290b5fe096e7dd0aad730d1af4f7f2d9fea43e11 ] In the blamed commit, a rudimentary reallocation procedure for RX buffer descriptors was implemented, for the situation when their format changes between normal (no PTP) and extended (PTP). enetc_hwtstamp_set() calls enetc_close() and enetc_open() in a sequence, and this sequence loses information which was previously configured in the TX BDR Mode Register, specifically via the enetc_set_bdr_prio() call. The TX ring priority is configured by tc-mqprio and tc-taprio, and affects important things for TSN such as the TX time of packets. The issue manifests itself most visibly by the fact that isochron --txtime reports premature packet transmissions when PTP is first enabled on an enetc interface. Save the TX ring priority in a new field in struct enetc_bdr (occupies a 2 byte hole on arm64) in order to make this survive a ring reconfiguration. Fixes: 434cebabd3a2 ("enetc: Add dynamic allocation of extended Rx BD rings") Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Reviewed-by: Alexander Lobakin <alexandr.lobakin@intel.com> Link: https://lore.kernel.org/r/20221122130936.1704151-1-vladimir.oltean@nxp.com Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
2022-12-02net: enetc: cache accesses to &priv->si->hwVladimir Oltean
[ Upstream commit 715bf2610f1d1adf3d4f9b7b3dd729984ec4270a ] The &priv->si->hw construct dereferences 2 pointers and makes lines longer than they need to be, in turn making the code harder to read. Replace &priv->si->hw accesses with a "hw" variable when there are 2 or more accesses within a function that dereference this. This includes loops, since &priv->si->hw is a loop invariant. Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org> Stable-dep-of: 290b5fe096e7 ("net: enetc: preserve TX ring priority across reconfiguration") Signed-off-by: Sasha Levin <sashal@kernel.org>
2022-12-02net: enetc: manage ENETC_F_QBV in priv->active_offloads only when enabledVladimir Oltean
[ Upstream commit 32bf8e1f6fb9f6dc334b2b98dffc2e5dcd51e513 ] Future work in this driver would like to look at priv->active_offloads & ENETC_F_QBV to determine whether a tc-taprio qdisc offload was installed, but this does not produce the intended effect. All the other flags in priv->active_offloads are managed dynamically, except ENETC_F_QBV which is set statically based on the probed SI capability. This change makes priv->active_offloads & ENETC_F_QBV really track the presence of a tc-taprio schedule on the port. Some existing users, like the enetc_sched_speed_set() call from phylink_mac_link_up(), are best kept using the old logic: the tc-taprio offload does not re-trigger another link mode resolve, so the scheduler needs to be functional from the get go, as long as Qbv is supported at all on the port. So to preserve functionality there, look at the static station interface capability from pf->si->hw_features instead. Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Reviewed-by: Claudiu Manoil <claudiu.manoil@nxp.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org> Stable-dep-of: 290b5fe096e7 ("net: enetc: preserve TX ring priority across reconfiguration") Signed-off-by: Sasha Levin <sashal@kernel.org>
2022-11-16net: fman: Unregister ethernet device on removalSean Anderson
[ Upstream commit b7cbc6740bd6ad5d43345a2504f7e4beff0d709f ] When the mac device gets removed, it leaves behind the ethernet device. This will result in a segfault next time the ethernet device accesses mac_dev. Remove the ethernet device when we get removed to prevent this. This is not completely reversible, since some resources aren't cleaned up properly, but that can be addressed later. Fixes: 3933961682a3 ("fsl/fman: Add FMan MAC driver") Signed-off-by: Sean Anderson <sean.anderson@seco.com> Link: https://lore.kernel.org/r/20221103182831.2248833-1-sean.anderson@seco.com Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
2022-11-10net: fec: fix improper use of NETDEV_TX_BUSYZhang Changzhong
[ Upstream commit 06a4df5863f73af193a4ff7abf7cb04058584f06 ] The ndo_start_xmit() method must not free skb when returning NETDEV_TX_BUSY, since caller is going to requeue freed skb. Fix it by returning NETDEV_TX_OK in case of dma_map_single() fails. Fixes: 79f339125ea3 ("net: fec: Add software TSO support") Signed-off-by: Zhang Changzhong <zhangchangzhong@huawei.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Sasha Levin <sashal@kernel.org>
2022-11-07net: freescale: xgmac: Do not dereference fwnode in struct devicezhaoxiao
In order to make the underneath API easier to change in the future, prevent users from dereferencing fwnode from struct device. Instead, use the specific dev_fwnode() API for that. Signed-off-by: zhaoxiao <zhaoxiao@uniontech.com> Signed-off-by: David S. Miller <davem@davemloft.net> (cherry picked from commit 105b0468d7b2e6779a188a83b7e128368acb8a1d)
2022-11-07net/fsl: xgmac_mdio: use correct format charactersBill Wendling
When compiling with -Wformat, clang emits the following warning: drivers/net/ethernet/freescale/xgmac_mdio.c:243:22: warning: format specifies type 'unsigned char' but the argument has type 'int' [-Wformat] phy_id, dev_addr, regnum); ^~~~~~ ./include/linux/dev_printk.h:163:47: note: expanded from macro 'dev_dbg' dev_printk(KERN_DEBUG, dev, dev_fmt(fmt), ##__VA_ARGS__); \ ~~~ ^~~~~~~~~~~ ./include/linux/dev_printk.h:129:34: note: expanded from macro 'dev_printk' _dev_printk(level, dev, fmt, ##__VA_ARGS__); \ ~~~ ^~~~~~~~~~~ The types of these arguments are unconditionally defined, so this patch updates the format character to the correct ones for ints and unsigned ints. Link: https://github.com/ClangBuiltLinux/linux/issues/378 Signed-off-by: Bill Wendling <morbo@google.com> Link: https://lore.kernel.org/r/20220316213114.2352352-1-morbo@google.com Signed-off-by: Jakub Kicinski <kuba@kernel.org> (cherry picked from commit c011072c90353814a9d8e2b3cd111e77ae8601ed)
2022-11-07net/fsl: xgmac_mdio: fix return value check in xgmac_mdio_probe()Wei Yongjun
In case of error, the function devm_ioremap() returns NULL pointer not ERR_PTR(). The IS_ERR() test in the return value check should be replaced with NULL test. Fixes: 1d14eb15dc2c ("net/fsl: xgmac_mdio: Use managed device resources") Reported-by: Hulk Robot <hulkci@huawei.com> Signed-off-by: Wei Yongjun <weiyongjun1@huawei.com> Reviewed-by: Tobias Waldekranz <tobias@waldekranz.com> Signed-off-by: David S. Miller <davem@davemloft.net> (cherry picked from commit cc4598cf179ff636d7634008045905a88480bb88)
2022-11-07net/fsl: xgmac_mdio: Fix spelling mistake "frequecy" -> "frequency"Colin Ian King
There is a spelling mistake in a dev_err message. Fix it. Signed-off-by: Colin Ian King <colin.i.king@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net> (cherry picked from commit 34a79c5dca4aeabc26073ef36233ea1f409b4d4b)
2022-11-07net/fsl: xgmac_mdio: Support setting the MDC frequencyTobias Waldekranz
Support the standard "clock-frequency" attribute to set the generated MDC frequency. If not specified, the driver will leave the divisor bits untouched. Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: David S. Miller <davem@davemloft.net> (cherry picked from commit dd8f467eda72cdaff50e4636c382709124956da3)
2022-11-07net/fsl: xgmac_mdio: Support preamble suppressionTobias Waldekranz
Support the standard "suppress-preamble" attribute to disable preamble generation. Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: David S. Miller <davem@davemloft.net> (cherry picked from commit 909bea73485fab5e99e222e727e82b259d667880)
2022-11-07net/fsl: xgmac_mdio: Use managed device resourcesTobias Waldekranz
All of the resources used by this driver has managed interfaces, so use them. Heed the warning in the comment before platform_get_resource and use a bare devm_ioremap to allow for non-exclusive access to the IO memory. Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: David S. Miller <davem@davemloft.net> (cherry picked from commit 1d14eb15dc2c3961ffe88d20df17fb2e2eaf1504)
2022-11-03net: enetc: survive memory pressure without crashingVladimir Oltean
[ Upstream commit 84ce1ca3fe9e1249bf21176ff162200f1c4e5ed1 ] Under memory pressure, enetc_refill_rx_ring() may fail, and when called during the enetc_open() -> enetc_setup_rxbdr() procedure, this is not checked for. An extreme case of memory pressure will result in exactly zero buffers being allocated for the RX ring, and in such a case it is expected that hardware drops all RX packets due to lack of buffers. This does not happen, because the reset-default value of the consumer and produces index is 0, and this makes the ENETC think that all buffers have been initialized and that it owns them (when in reality none were). The hardware guide explains this best: | Configure the receive ring producer index register RBaPIR with a value | of 0. The producer index is initially configured by software but owned | by hardware after the ring has been enabled. Hardware increments the | index when a frame is received which may consume one or more BDs. | Hardware is not allowed to increment the producer index to match the | consumer index since it is used to indicate an empty condition. The ring | can hold at most RBLENR[LENGTH]-1 received BDs. | | Configure the receive ring consumer index register RBaCIR. The | consumer index is owned by software and updated during operation of the | of the BD ring by software, to indicate that any receive data occupied | in the BD has been processed and it has been prepared for new data. | - If consumer index and producer index are initialized to the same | value, it indicates that all BDs in the ring have been prepared and | hardware owns all of the entries. | - If consumer index is initialized to producer index plus N, it would | indicate N BDs have been prepared. Note that hardware cannot start if | only a single buffer is prepared due to the restrictions described in | (2). | - Software may write consumer index to match producer index anytime | while the ring is operational to indicate all received BDs prior have | been processed and new BDs prepared for hardware. Normally, the value of rx_ring->rcir (consumer index) is brought in sync with the rx_ring->next_to_use software index, but this only happens if page allocation ever succeeded. When PI==CI==0, the hardware appears to receive frames and write them to DMA address 0x0 (?!), then set the READY bit in the BD. The enetc_clean_rx_ring() function (and its XDP derivative) is naturally not prepared to handle such a condition. It will attempt to process those frames using the rx_swbd structure associated with index i of the RX ring, but that structure is not fully initialized (enetc_new_page() does all of that). So what happens next is undefined behavior. To operate using no buffer, we must initialize the CI to PI + 1, which will block the hardware from advancing the CI any further, and drop everything. The issue was seen while adding support for zero-copy AF_XDP sockets, where buffer memory comes from user space, which can even decide to supply no buffers at all (example: "xdpsock --txonly"). However, the bug is present also with the network stack code, even though it would take a very determined person to trigger a page allocation failure at the perfect time (a series of ifup/ifdown under memory pressure should eventually reproduce it given enough retries). Fixes: d4fd0404c1c9 ("enetc: Introduce basic PF and VF ENETC ethernet drivers") Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Reviewed-by: Claudiu Manoil <claudiu.manoil@nxp.com> Link: https://lore.kernel.org/r/20221027182925.3256653-1-vladimir.oltean@nxp.com Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
2022-11-03net: fec: limit register access on i.MX6ULJuergen Borleis
[ Upstream commit 0a8b43b12dd78daa77a7dc007b92770d262a2714 ] Using 'ethtool -d […]' on an i.MX6UL leads to a kernel crash: Unhandled fault: external abort on non-linefetch (0x1008) at […] due to this SoC has less registers in its FEC implementation compared to other i.MX6 variants. Thus, a run-time decision is required to avoid access to non-existing registers. Fixes: a51d3ab50702 ("net: fec: use a more proper compatible string for i.MX6UL type device") Signed-off-by: Juergen Borleis <jbe@pengutronix.de> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Link: https://lore.kernel.org/r/20221024080552.21004-1-jbe@pengutronix.de Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
2022-10-26net: fs_enet: Fix wrong check in do_pd_setupZheng Yongjun
[ Upstream commit ec3f06b542a960806a81345042e4eee3f8c5dec4 ] Should check of_iomap return value 'fep->fec.fecp' instead of 'fep->fcc.fccp' Fixes: 976de6a8c304 ("fs_enet: Be an of_platform device when CONFIG_PPC_CPM_NEW_BINDING is set.") Signed-off-by: Zheng Yongjun <zhengyongjun3@huawei.com> Reviewed-by: Christophe Leroy <christophe.leroy@csgroup.eu> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Sasha Levin <sashal@kernel.org>
2022-10-26net: enetc: add support for XDP_TX with zero-copy XDP socketsVladimir Oltean
Add support for the case when the BPF program attached to a ring with an XSK pool returns the XDP_TX verdict. The frame needs to go back on the interface it came from. No dma_map or dma_sync_for_device is necessary, just a small impedance matching logic with the XDP_TX procedure we have in place for non-XSK, since the data structures are different (xdp_buff vs xdp_frame; cannot have multi-buffer with XSK). In the TX confirmation routine, just release the RX buffer (as opposed to non-XSK XDP_TX). Recycling might be possible, but I haven't experimented with it. Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
2022-10-26net: enetc: add TX support for zero-copy XDP socketsVladimir Oltean
Schedule NAPI by hand from enetc_xsk_wakeup(), and send frames from the XSK TX queue from NAPI context. Add them to the completion queue from the enetc_clean_tx_ring() procedure which is common for all kinds of traffic. We reuse one of the TX rings for XDP (XDP_TX/XDP_REDIRECT) for XSK as well. They are already affine with CPUs and cropped from the TX rings that the network stack can use when XDP is enabled (with or without AF_XDP). Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
2022-10-26net: enetc: add RX support for zero-copy XDP socketsVladimir Oltean
Add support for filling an RX ring with buffers coming from an XSK umem. Although enetc has up to 8 RX rings, we still use one of the 2 per-CPU RX rings for XSK. To set up an XSK pool on one of the RX queues, we stop the device and open it again. While not ideal, the alternative would have been way more complex. Since the RX procedure in the NAPI poll function is completely different (both the API for creating an xdp_buff, as well as refilling the ring with memory from user space), create a separate enetc_clean_rx_ring_xsk() function which gets called when we have both an XSK pool and an XDK program on this RX queue. Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
2022-10-26net: enetc: move setting of ENETC_TXBD_FLAGS_F flag to enetc_xdp_map_tx_buff()Vladimir Oltean
XSK transmission will reuse this procedure, and will also need the logic for setting the "final" bit of a TX BD, based on tx_swbd->is_eof. Not sure why this was left to be done by the caller of enetc_xdp_map_tx_buff(), but move it inside. Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
2022-10-26net: enetc: prioritize ability to go down over packet processingVladimir Oltean
napi_synchronize() from enetc_stop() waits until the softirq has finished execution and does not reschedule anymore. However under high traffic load, this will never happen, and the interface can never be closed. The solution chosen here is probably not the best; it is adapted from i40e. Normally one would quiesce the RX ring and let the softirq finish what remains there. But I couldn't immediately see how to do that (plus the fact that the NAPI poll routine is written to update the consumer index which makes the device want to put more buffers in the RX ring, which restarts the madness again). Since the enetc hardirq may trigger while we have ENETC_DOWN set, it may happen that enetc_msix() masks it, but enetc_poll() never unmasks it. To prevent a stall in that case, schedule all NAPI instances when ENETC_DOWN gets cleared. Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
2022-10-26net: enetc: increment rx_byte_cnt for XDP data pathVladimir Oltean
v->rx_ring.stats.bytes is apparently only used for interrupt coalescing, not for printing to ethtool -S. I am unable to find a functional problem caused by the lack of updating this counter, but it is updated from the stack NAPI poll routine, so update it from the XDP one too. Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
2022-10-26net: enetc: rename enetc_free_tx_frame() to enetc_free_tx_swbd()Vladimir Oltean
Create naming consistency between the free procedures for a TX and an RX software BD. Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
2022-10-26net: enetc: consolidate rx_swbd freeingVladimir Oltean
There are multiple code paths in the driver which DMA unmap and free the page held by the shadow copy of an RX buffer descriptor. Refactor them to call the same helper function, which will make it easier to add support for one more RX software BD type in the future (XSK buffer). Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
2022-10-26net: enetc: add support for ethtool --show-channelsVladimir Oltean
In a strange twist of events, some libraries such as libbpf perform an ETHTOOL_GCHANNELS ioctl to find out the max number of queues a device has, number which in turn is used for attaching XDP sockets to queues. To add compatibility with libbpf, it is therefore desirable to report something to this ethtool callback. According to the ethtool man page, "A channel is an IRQ and the set of queues that can trigger that IRQ". In enetc (embedded in NXP LS1028A, a dual core SoC, and LS1018A, a single core SoC), the enetc_alloc_msix() function allocates a number of MSI-X interrupt vectors equal to priv->bdr_int_num (which in turn is equal to the number of CPUs, 2 or 1). Each interrupt vector has 1 RX ring to process (there are more than 2 RX rings available on an ENETC port, but the driver only uses up to 2). In addition, the up to 8 TX rings are distributed in a round-robing manner between the up to 2 available interrupt vectors. Therefore, even if we have more resources than 2 RX rings, given the definitions, we can only report 2 combined channels. So do that. Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
2022-10-26net: enetc: continue NAPI processing on frames with RX errorsVladimir Oltean
If we see frames with RX errors, consume them, mark their buffers for refill, and go through the rest of the ring until the NAPI budget is done. Right now we exit and ask the softirq to be rescheduled. Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
2022-10-26net: enetc: rename "cleaned_cnt" to "buffs_missing"Vladimir Oltean
Calling enetc_bd_unused() on an RX ring returns the number of descriptors necessary for the ring to be full with descriptors owned by hardware (for it to put packets in). Putting this value in a variable named "cleaned_cnt" is misleading, especially since we may start the NAPI poll routine (enetc_clean_rx_ring) with a non-zero cleaned_cnt. Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
2022-10-26net: enetc: move XDP RX queue registration to ndo_open/ndo_closeVladimir Oltean
In a future patch, the XDP RX queues will have to register a shared page memory model, or an XSK pool memory model. For that, the registration needs to be more dynamic than the current one, done in enetc_pf_probe() -> enetc_alloc_msix(). Move it to enetc_open()/enetc_close() and create some nicer names for it. Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
2022-10-26net: enetc: rename "xdp" and "dev" in enetc_setup_bpf()Vladimir Oltean
Follow the convention from this driver, which is to name "struct net_device *" as "ndev", and the convention from other drivers, to name "struct netdev_bpf *" as "bpf". Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
2022-10-26net: enetc: optimize struct enetc_rx_swbd layoutVladimir Oltean
Eliminate a 4 byte hole on arm64, to be able to introduce a new member to this structure in a future patch without increasing the overall structure size. Before: struct enetc_rx_swbd { struct page * page; /* 0 8 */ enum dma_data_direction dir; /* 8 4 */ /* XXX 4 bytes hole, try to pack */ dma_addr_t dma; /* 16 8 */ u16 page_offset; /* 24 2 */ u16 len; /* 26 2 */ /* size: 32, cachelines: 1, members: 5 */ /* sum members: 24, holes: 1, sum holes: 4 */ /* padding: 4 */ /* last cacheline: 32 bytes */ }; After: struct enetc_rx_swbd { struct page * page; /* 0 8 */ dma_addr_t dma; /* 8 8 */ enum dma_data_direction dir; /* 16 4 */ u16 page_offset; /* 20 2 */ u16 len; /* 22 2 */ /* size: 24, cachelines: 1, members: 5 */ /* last cacheline: 24 bytes */ }; Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
2022-10-26net: enetc: survive memory pressure without crashingVladimir Oltean
Under memory pressure, enetc_refill_rx_ring() may fail, and when called during the enetc_open() -> enetc_setup_rxbdr() procedure, this is not checked for. An extreme case of memory pressure will result in exactly zero buffers being allocated for the RX ring, and in such a case it is expected that hardware drops all RX packets due to lack of buffers. There are 2 problems. One is that the hardware drop doesn't happen, the other is that even if this is fixed, the driver has undefined behavior and may even crash. Explanation for the latter follows below. The enetc NAPI poll procedure is shared between RX and TX conf, and enetc_poll() calls enetc_clean_rx_ring() even if the reason why NAPI was scheduled is TX. The enetc_clean_rx_ring() function (and its XDP derivative) is not prepared to handle such a condition. It has this loop exit condition: rxbd = enetc_rxbd(rx_ring, i); bd_status = le32_to_cpu(rxbd->r.lstatus); if (!bd_status) break; otherwise said, the NAPI poll procedure does not look at the Producer Index of the RX ring, instead it just walks circularly through the descriptors until it finds one which is not Ready. The driver undefined behavior is caused by the fact that the enetc_rxbd(rx_ring, i) RX descriptor is only initialized by enetc_refill_rx_ring() if page allocation has succeeded. If memory allocation ever failed, enetc_clean_rx_ring() looks at rxbd->r.lstatus as an exit condition, but "rxbd" itself is uninitialized memory. If it contains junk, then junk buffers will be processed. To fix this problem, memset the DMA coherent area used for RX buffer descriptors in enetc_dma_alloc_bdr(). This makes all BDs be "not ready" by default, which makes enetc_clean_rx_ring() exit early from the BD processing loop when there is no valid buffer available. The other problem (hardware does not drop packet in lack of buffers) is due to an initial misconfiguration of the RX ring consumer index, misconfiguration which is usually masked away by the proper configuration done by enetc_refill_rx_ring() - when page allocation does not fail. The hardware guide recommends BD rings to be configured as follows: | Configure the receive ring producer index register RBaPIR with a value | of 0. The producer index is initially configured by software but owned | by hardware after the ring has been enabled. Hardware increments the | index when a frame is received which may consume one or more BDs. | Hardware is not allowed to increment the producer index to match the | consumer index since it is used to indicate an empty condition. The ring | can hold at most RBLENR[LENGTH]-1 received BDs. | | Configure the receive ring consumer index register RBaCIR. The | consumer index is owned by software and updated during operation of the | of the BD ring by software, to indicate that any receive data occupied | in the BD has been processed and it has been prepared for new data. | - If consumer index and producer index are initialized to the same | value, it indicates that all BDs in the ring have been prepared and | hardware owns all of the entries. | - If consumer index is initialized to producer index plus N, it would | indicate N BDs have been prepared. Note that hardware cannot start if | only a single buffer is prepared due to the restrictions described in | (2). | - Software may write consumer index to match producer index anytime | while the ring is operational to indicate all received BDs prior have | been processed and new BDs prepared for hardware. The reset-default value of the consumer index is 0, and this makes the ENETC think that all buffers have been initialized (when in reality none were). To operate using no buffer, we must initialize the CI to PI + 1. Fixes: d4fd0404c1c9 ("enetc: Introduce basic PF and VF ENETC ethernet drivers") Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
2022-10-17fec_uio: fix implicit declarationDaiane Angolini
Fix the build error: /lmp/source/real-main/build-lmp/tmp-lmp/work-shared/imx8mm-lpddr4-evk/kernel-source/drivers/net/ethernet/freescale/fec_uio.c: In function 'fec_enet_uio_probe': /lmp/source/real-main/build-lmp/tmp-lmp/work-shared/imx8mm-lpddr4-evk/kernel-source/drivers/net/ethernet/freescale/fec_uio.c:573:9: error: implicit declaration of function 'pinctrl_pm_select_default_state' [-Werror=implicit-function-declaration] 573 | pinctrl_pm_select_default_state(&pdev->dev); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Signed-off-by: Daiane Angolini <daiane.angolini@foundries.io> Acked-by: Jason Liu <jason.hui.liu@nxp.com>
2022-10-13fsl/fman: NULL terminate the acpi_device_id structuresCamelia Groza
Add a NULL entry to the end of the acpi_device_id structures. Signed-off-by: Camelia Groza <camelia.groza@nxp.com>
2022-10-13sdk_fman: fix the spelling for the FMBM_RFDC registerCamelia Groza
The FMBM Rx Frames Discard Counter register is exported as fmbm_rfcd in sysfs. Fix the spelling to fmbm_rfdc. Signed-off-by: Camelia Groza <camelia.groza@nxp.com>