|
@@ -3188,6 +3188,20 @@ static int mlx5e_xdp(struct net_device *dev, struct netdev_xdp *xdp)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#ifdef CONFIG_NET_POLL_CONTROLLER
|
|
|
|
+/* Fake "interrupt" called by netpoll (eg netconsole) to send skbs without
|
|
|
|
+ * reenabling interrupts.
|
|
|
|
+ */
|
|
|
|
+static void mlx5e_netpoll(struct net_device *dev)
|
|
|
|
+{
|
|
|
|
+ struct mlx5e_priv *priv = netdev_priv(dev);
|
|
|
|
+ int i;
|
|
|
|
+
|
|
|
|
+ for (i = 0; i < priv->params.num_channels; i++)
|
|
|
|
+ napi_schedule(&priv->channel[i]->napi);
|
|
|
|
+}
|
|
|
|
+#endif
|
|
|
|
+
|
|
static const struct net_device_ops mlx5e_netdev_ops_basic = {
|
|
static const struct net_device_ops mlx5e_netdev_ops_basic = {
|
|
.ndo_open = mlx5e_open,
|
|
.ndo_open = mlx5e_open,
|
|
.ndo_stop = mlx5e_close,
|
|
.ndo_stop = mlx5e_close,
|
|
@@ -3208,6 +3222,9 @@ static const struct net_device_ops mlx5e_netdev_ops_basic = {
|
|
#endif
|
|
#endif
|
|
.ndo_tx_timeout = mlx5e_tx_timeout,
|
|
.ndo_tx_timeout = mlx5e_tx_timeout,
|
|
.ndo_xdp = mlx5e_xdp,
|
|
.ndo_xdp = mlx5e_xdp,
|
|
|
|
+#ifdef CONFIG_NET_POLL_CONTROLLER
|
|
|
|
+ .ndo_poll_controller = mlx5e_netpoll,
|
|
|
|
+#endif
|
|
};
|
|
};
|
|
|
|
|
|
static const struct net_device_ops mlx5e_netdev_ops_sriov = {
|
|
static const struct net_device_ops mlx5e_netdev_ops_sriov = {
|
|
@@ -3240,6 +3257,9 @@ static const struct net_device_ops mlx5e_netdev_ops_sriov = {
|
|
.ndo_get_vf_stats = mlx5e_get_vf_stats,
|
|
.ndo_get_vf_stats = mlx5e_get_vf_stats,
|
|
.ndo_tx_timeout = mlx5e_tx_timeout,
|
|
.ndo_tx_timeout = mlx5e_tx_timeout,
|
|
.ndo_xdp = mlx5e_xdp,
|
|
.ndo_xdp = mlx5e_xdp,
|
|
|
|
+#ifdef CONFIG_NET_POLL_CONTROLLER
|
|
|
|
+ .ndo_poll_controller = mlx5e_netpoll,
|
|
|
|
+#endif
|
|
};
|
|
};
|
|
|
|
|
|
static int mlx5e_check_required_hca_cap(struct mlx5_core_dev *mdev)
|
|
static int mlx5e_check_required_hca_cap(struct mlx5_core_dev *mdev)
|