|
@@ -3042,6 +3042,20 @@ static int mvneta_check_mtu_valid(struct net_device *dev, int mtu)
|
|
|
return mtu;
|
|
|
}
|
|
|
|
|
|
+static void mvneta_percpu_enable(void *arg)
|
|
|
+{
|
|
|
+ struct mvneta_port *pp = arg;
|
|
|
+
|
|
|
+ enable_percpu_irq(pp->dev->irq, IRQ_TYPE_NONE);
|
|
|
+}
|
|
|
+
|
|
|
+static void mvneta_percpu_disable(void *arg)
|
|
|
+{
|
|
|
+ struct mvneta_port *pp = arg;
|
|
|
+
|
|
|
+ disable_percpu_irq(pp->dev->irq);
|
|
|
+}
|
|
|
+
|
|
|
/* Change the device mtu */
|
|
|
static int mvneta_change_mtu(struct net_device *dev, int mtu)
|
|
|
{
|
|
@@ -3066,6 +3080,7 @@ static int mvneta_change_mtu(struct net_device *dev, int mtu)
|
|
|
* reallocation of the queues
|
|
|
*/
|
|
|
mvneta_stop_dev(pp);
|
|
|
+ on_each_cpu(mvneta_percpu_disable, pp, true);
|
|
|
|
|
|
mvneta_cleanup_txqs(pp);
|
|
|
mvneta_cleanup_rxqs(pp);
|
|
@@ -3089,6 +3104,7 @@ static int mvneta_change_mtu(struct net_device *dev, int mtu)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+ on_each_cpu(mvneta_percpu_enable, pp, true);
|
|
|
mvneta_start_dev(pp);
|
|
|
mvneta_port_up(pp);
|
|
|
|
|
@@ -3242,20 +3258,6 @@ static void mvneta_mdio_remove(struct mvneta_port *pp)
|
|
|
pp->phy_dev = NULL;
|
|
|
}
|
|
|
|
|
|
-static void mvneta_percpu_enable(void *arg)
|
|
|
-{
|
|
|
- struct mvneta_port *pp = arg;
|
|
|
-
|
|
|
- enable_percpu_irq(pp->dev->irq, IRQ_TYPE_NONE);
|
|
|
-}
|
|
|
-
|
|
|
-static void mvneta_percpu_disable(void *arg)
|
|
|
-{
|
|
|
- struct mvneta_port *pp = arg;
|
|
|
-
|
|
|
- disable_percpu_irq(pp->dev->irq);
|
|
|
-}
|
|
|
-
|
|
|
/* Electing a CPU must be done in an atomic way: it should be done
|
|
|
* after or before the removal/insertion of a CPU and this function is
|
|
|
* not reentrant.
|