mirror of
https://github.com/Ysurac/openmptcprouter.git
synced 2025-02-15 04:42:02 +00:00
88 lines
2.5 KiB
Diff
88 lines
2.5 KiB
Diff
From b3645a487373e2182bd9899a4fe3a2cbf2010e6e Mon Sep 17 00:00:00 2001
|
|
From: Matteo Croce <mcroce@redhat.com>
|
|
Date: Sun, 28 Jul 2019 02:46:45 +0200
|
|
Subject: [PATCH 787/826] mvpp2: refactor MTU change code
|
|
|
|
[ Upstream commit 230bd958c2c846ee292aa38bc6b006296c24ca01 ]
|
|
|
|
The MTU change code can call napi_disable() with the device already down,
|
|
leading to a deadlock. Also, lot of code is duplicated unnecessarily.
|
|
|
|
Rework mvpp2_change_mtu() to avoid the deadlock and remove duplicated code.
|
|
|
|
Fixes: 3f518509dedc ("ethernet: Add new driver for Marvell Armada 375 network unit")
|
|
Signed-off-by: Matteo Croce <mcroce@redhat.com>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
|
---
|
|
.../net/ethernet/marvell/mvpp2/mvpp2_main.c | 41 ++++++-------------
|
|
1 file changed, 13 insertions(+), 28 deletions(-)
|
|
|
|
diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
|
|
index c357aafee106..6455511457ca 100644
|
|
--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
|
|
+++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
|
|
@@ -3501,6 +3501,7 @@ static int mvpp2_set_mac_address(struct net_device *dev, void *p)
|
|
static int mvpp2_change_mtu(struct net_device *dev, int mtu)
|
|
{
|
|
struct mvpp2_port *port = netdev_priv(dev);
|
|
+ bool running = netif_running(dev);
|
|
int err;
|
|
|
|
if (!IS_ALIGNED(MVPP2_RX_PKT_SIZE(mtu), 8)) {
|
|
@@ -3509,40 +3510,24 @@ static int mvpp2_change_mtu(struct net_device *dev, int mtu)
|
|
mtu = ALIGN(MVPP2_RX_PKT_SIZE(mtu), 8);
|
|
}
|
|
|
|
- if (!netif_running(dev)) {
|
|
- err = mvpp2_bm_update_mtu(dev, mtu);
|
|
- if (!err) {
|
|
- port->pkt_size = MVPP2_RX_PKT_SIZE(mtu);
|
|
- return 0;
|
|
- }
|
|
-
|
|
- /* Reconfigure BM to the original MTU */
|
|
- err = mvpp2_bm_update_mtu(dev, dev->mtu);
|
|
- if (err)
|
|
- goto log_error;
|
|
- }
|
|
-
|
|
- mvpp2_stop_dev(port);
|
|
+ if (running)
|
|
+ mvpp2_stop_dev(port);
|
|
|
|
err = mvpp2_bm_update_mtu(dev, mtu);
|
|
- if (!err) {
|
|
+ if (err) {
|
|
+ netdev_err(dev, "failed to change MTU\n");
|
|
+ /* Reconfigure BM to the original MTU */
|
|
+ mvpp2_bm_update_mtu(dev, dev->mtu);
|
|
+ } else {
|
|
port->pkt_size = MVPP2_RX_PKT_SIZE(mtu);
|
|
- goto out_start;
|
|
}
|
|
|
|
- /* Reconfigure BM to the original MTU */
|
|
- err = mvpp2_bm_update_mtu(dev, dev->mtu);
|
|
- if (err)
|
|
- goto log_error;
|
|
-
|
|
-out_start:
|
|
- mvpp2_start_dev(port);
|
|
- mvpp2_egress_enable(port);
|
|
- mvpp2_ingress_enable(port);
|
|
+ if (running) {
|
|
+ mvpp2_start_dev(port);
|
|
+ mvpp2_egress_enable(port);
|
|
+ mvpp2_ingress_enable(port);
|
|
+ }
|
|
|
|
- return 0;
|
|
-log_error:
|
|
- netdev_err(dev, "failed to change MTU\n");
|
|
return err;
|
|
}
|
|
|
|
--
|
|
2.22.0
|
|
|