svn commit: r319414 - head/sys/dev/mlx4/mlx4_en

Hans Petter Selasky hselasky at FreeBSD.org
Thu Jun 1 10:44:50 UTC 2017


Author: hselasky
Date: Thu Jun  1 10:44:48 2017
New Revision: 319414
URL: https://svnweb.freebsd.org/changeset/base/319414

Log:
  Allow communication between functions on the same host when using the
  mlx4en(4) driver in SRIOV mode.
  
  Place a copy of the destination MAC address in the send WQE only under
  SRIOV/eSwitch configuration or when the device is in selftest. This
  allows communication between functions on the same host.
  
  PR:			216493
  MFC after:		3 days
  Sponsored by:		Mellanox Technologies

Modified:
  head/sys/dev/mlx4/mlx4_en/mlx4_en_tx.c

Modified: head/sys/dev/mlx4/mlx4_en/mlx4_en_tx.c
==============================================================================
--- head/sys/dev/mlx4/mlx4_en/mlx4_en_tx.c	Thu Jun  1 10:39:00 2017	(r319413)
+++ head/sys/dev/mlx4/mlx4_en/mlx4_en_tx.c	Thu Jun  1 10:44:48 2017	(r319414)
@@ -661,18 +661,6 @@ static void mlx4_bf_copy(void __iomem *dst, volatile u
 	__iowrite64_copy(dst, __DEVOLATILE(void *, src), bytecnt / 8);
 }
 
-static u64 mlx4_en_mac_to_u64(u8 *addr)
-{
-        u64 mac = 0;
-        int i;
-
-        for (i = 0; i < ETHER_ADDR_LEN; i++) {
-                mac <<= 8;
-                mac |= addr[i];
-        }
-        return mac;
-}
-
 static int mlx4_en_xmit(struct mlx4_en_priv *priv, int tx_ind, struct mbuf **mbp)
 {
 	enum {
@@ -770,8 +758,18 @@ static int mlx4_en_xmit(struct mlx4_en_priv *priv, int
 		tx_desc->ctrl.ins_vlan = 0;
 	}
 
-	/* clear immediate field */
-	tx_desc->ctrl.imm = 0;
+	if (unlikely(mlx4_is_mfunc(priv->mdev->dev) || priv->validate_loopback)) {
+		/*
+		 * Copy destination MAC address to WQE. This allows
+		 * loopback in eSwitch, so that VFs and PF can
+		 * communicate with each other:
+		 */
+		m_copydata(mb, 0, 2, __DEVOLATILE(void *, &tx_desc->ctrl.srcrb_flags16[0]));
+		m_copydata(mb, 2, 4, __DEVOLATILE(void *, &tx_desc->ctrl.imm));
+	} else {
+		/* clear immediate field */
+		tx_desc->ctrl.imm = 0;
+	}
 
 	/* Handle LSO (TSO) packets */
 	if (mb->m_pkthdr.csum_flags & CSUM_TSO) {
@@ -929,22 +927,6 @@ skip_dma:
 		mlx4_en_store_inline_lso_header(dseg_inline, ihs, owner_bit);
 	else
 		mlx4_en_store_inline_header(dseg_inline, ihs, owner_bit);
-
-	if (unlikely(priv->validate_loopback)) {
-		/* Copy dst mac address to wqe */
-                struct ether_header *ethh;
-                u64 mac;
-                u32 mac_l, mac_h;
-
-                ethh = mtod(mb, struct ether_header *);
-                mac = mlx4_en_mac_to_u64(ethh->ether_dhost);
-                if (mac) {
-                        mac_h = (u32) ((mac & 0xffff00000000ULL) >> 16);
-                        mac_l = (u32) (mac & 0xffffffff);
-                        tx_desc->ctrl.srcrb_flags |= cpu_to_be32(mac_h);
-                        tx_desc->ctrl.imm = cpu_to_be32(mac_l);
-                }
-	}
 
 	/* update producer counter */
 	ring->prod += tx_info->nr_txbb;


More information about the svn-src-all mailing list