svn commit: r341548 - in head/sys/dev/mlx4: . mlx4_core mlx4_en

Slava Shwartsman slavash at FreeBSD.org
Wed Dec 5 13:32:18 UTC 2018


Author: slavash
Date: Wed Dec  5 13:32:15 2018
New Revision: 341548
URL: https://svnweb.freebsd.org/changeset/base/341548

Log:
  mlx4en: Add support for netdump.
  
  Implement the needed callback functions and support for polling the driver.
  
  Differential Revision: https://reviews.freebsd.org/D15259
  Approved by:    hselasky (mentor)
  MFC after:      1 week
  Sponsored by:   Mellanox Technologies

Modified:
  head/sys/dev/mlx4/driver.h
  head/sys/dev/mlx4/mlx4_core/mlx4_eq.c
  head/sys/dev/mlx4/mlx4_en/en.h
  head/sys/dev/mlx4/mlx4_en/mlx4_en_netdev.c
  head/sys/dev/mlx4/mlx4_en/mlx4_en_tx.c

Modified: head/sys/dev/mlx4/driver.h
==============================================================================
--- head/sys/dev/mlx4/driver.h	Wed Dec  5 13:31:45 2018	(r341547)
+++ head/sys/dev/mlx4/driver.h	Wed Dec  5 13:32:15 2018	(r341548)
@@ -101,4 +101,7 @@ static inline u64 mlx4_mac_to_u64(const u8 *addr)
 	return mac;
 }
 
+void mlx4_disable_interrupts(struct mlx4_dev *);
+void mlx4_poll_interrupts(struct mlx4_dev *);
+
 #endif /* MLX4_DRIVER_H */

Modified: head/sys/dev/mlx4/mlx4_core/mlx4_eq.c
==============================================================================
--- head/sys/dev/mlx4/mlx4_core/mlx4_eq.c	Wed Dec  5 13:31:45 2018	(r341547)
+++ head/sys/dev/mlx4/mlx4_core/mlx4_eq.c	Wed Dec  5 13:32:15 2018	(r341548)
@@ -1535,3 +1535,34 @@ void mlx4_release_eq(struct mlx4_dev *dev, int vec)
 }
 EXPORT_SYMBOL(mlx4_release_eq);
 
+void
+mlx4_disable_interrupts(struct mlx4_dev *dev)
+{
+	struct mlx4_priv *priv = container_of(dev, struct mlx4_priv, dev);
+	int i;
+
+	if (dev->flags & MLX4_FLAG_MSI_X) {
+		for (i = 0; i < (dev->caps.num_comp_vectors + 1); ++i)
+			disable_irq(priv->eq_table.eq[i].irq);
+	} else {
+		disable_irq(dev->persist->pdev->irq);
+	}
+}
+EXPORT_SYMBOL(mlx4_disable_interrupts);
+
+void
+mlx4_poll_interrupts(struct mlx4_dev *dev)
+{
+	struct mlx4_priv *priv = container_of(dev, struct mlx4_priv, dev);
+	int i;
+
+	if (dev->flags & MLX4_FLAG_MSI_X) {
+		for (i = 0; i < (dev->caps.num_comp_vectors + 1); ++i) {
+			mlx4_msi_x_interrupt(priv->eq_table.eq[i].irq,
+					     priv->eq_table.eq + i);
+		}
+	} else {
+		mlx4_interrupt(dev->persist->pdev->irq, dev);
+	}
+}
+EXPORT_SYMBOL(mlx4_poll_interrupts);

Modified: head/sys/dev/mlx4/mlx4_en/en.h
==============================================================================
--- head/sys/dev/mlx4/mlx4_en/en.h	Wed Dec  5 13:31:45 2018	(r341547)
+++ head/sys/dev/mlx4/mlx4_en/en.h	Wed Dec  5 13:32:15 2018	(r341548)
@@ -54,6 +54,7 @@
 #include <dev/mlx4/cmd.h>
 
 #include <netinet/tcp_lro.h>
+#include <netinet/netdump/netdump.h>
 
 #include "en_port.h"
 #include <dev/mlx4/stats.h>
@@ -784,6 +785,7 @@ int mlx4_en_arm_cq(struct mlx4_en_priv *priv, struct m
 void mlx4_en_tx_irq(struct mlx4_cq *mcq);
 u16 mlx4_en_select_queue(struct net_device *dev, struct mbuf *mb);
 
+int mlx4_en_xmit(struct mlx4_en_priv *priv, int tx_ind, struct mbuf **mbp);
 int mlx4_en_transmit(struct ifnet *dev, struct mbuf *m);
 int mlx4_en_create_tx_ring(struct mlx4_en_priv *priv,
 			   struct mlx4_en_tx_ring **pring,

Modified: head/sys/dev/mlx4/mlx4_en/mlx4_en_netdev.c
==============================================================================
--- head/sys/dev/mlx4/mlx4_en/mlx4_en_netdev.c	Wed Dec  5 13:31:45 2018	(r341547)
+++ head/sys/dev/mlx4/mlx4_en/mlx4_en_netdev.c	Wed Dec  5 13:32:15 2018	(r341548)
@@ -53,6 +53,8 @@
 #include "en.h"
 #include "en_port.h"
 
+NETDUMP_DEFINE(mlx4_en);
+
 static void mlx4_en_sysctl_stat(struct mlx4_en_priv *priv);
 static void mlx4_en_sysctl_conf(struct mlx4_en_priv *priv);
 
@@ -2311,6 +2313,8 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int 
 	ifmedia_add(&priv->media, IFM_ETHER | IFM_AUTO, 0, NULL);
 	ifmedia_set(&priv->media, IFM_ETHER | IFM_AUTO);
 
+	NETDUMP_SET(dev, mlx4_en);
+
 	en_warn(priv, "Using %d TX rings\n", prof->tx_ring_num);
 	en_warn(priv, "Using %d RX rings\n", prof->rx_ring_num);
 
@@ -2892,3 +2896,54 @@ static void mlx4_en_sysctl_stat(struct mlx4_en_priv *p
 		    CTLFLAG_RD, &rx_ring->errors, 0, "RX soft errors");
 	}
 }
+
+#ifdef NETDUMP
+static void
+mlx4_en_netdump_init(struct ifnet *dev, int *nrxr, int *ncl, int *clsize)
+{
+	struct mlx4_en_priv *priv;
+
+	priv = if_getsoftc(dev);
+	mutex_lock(&priv->mdev->state_lock);
+	*nrxr = priv->rx_ring_num;
+	*ncl = NETDUMP_MAX_IN_FLIGHT;
+	*clsize = priv->rx_mb_size;
+	mutex_unlock(&priv->mdev->state_lock);
+}
+
+static void
+mlx4_en_netdump_event(struct ifnet *dev, enum netdump_ev event)
+{
+}
+
+static int
+mlx4_en_netdump_transmit(struct ifnet *dev, struct mbuf *m)
+{
+	struct mlx4_en_priv *priv;
+	int err;
+
+	priv = if_getsoftc(dev);
+	if ((if_getdrvflags(dev) & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
+	    IFF_DRV_RUNNING || !priv->link_state)
+		return (ENOENT);
+
+	err = mlx4_en_xmit(priv, 0, &m);
+	if (err != 0 && m != NULL)
+		m_freem(m);
+	return (err);
+}
+
+static int
+mlx4_en_netdump_poll(struct ifnet *dev, int count)
+{
+	struct mlx4_en_priv *priv;
+
+	priv = if_getsoftc(dev);
+	if ((if_getdrvflags(dev) & IFF_DRV_RUNNING) == 0 || !priv->link_state)
+		return (ENOENT);
+
+	mlx4_poll_interrupts(priv->mdev->dev);
+
+	return (0);
+}
+#endif /* NETDUMP */

Modified: head/sys/dev/mlx4/mlx4_en/mlx4_en_tx.c
==============================================================================
--- head/sys/dev/mlx4/mlx4_en/mlx4_en_tx.c	Wed Dec  5 13:31:45 2018	(r341547)
+++ head/sys/dev/mlx4/mlx4_en/mlx4_en_tx.c	Wed Dec  5 13:32:15 2018	(r341548)
@@ -628,7 +628,7 @@ static void mlx4_bf_copy(void __iomem *dst, volatile u
 	__iowrite64_copy(dst, __DEVOLATILE(void *, src), bytecnt / 8);
 }
 
-static int mlx4_en_xmit(struct mlx4_en_priv *priv, int tx_ind, struct mbuf **mbp)
+int mlx4_en_xmit(struct mlx4_en_priv *priv, int tx_ind, struct mbuf **mbp)
 {
 	enum {
 		DS_FACT = TXBB_SIZE / DS_SIZE_ALIGNMENT,


More information about the svn-src-head mailing list