Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 24 Aug 2017 22:56:22 +0000 (UTC)
From:      Eric Joyner <erj@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r322865 - head/sys/dev/ixgbe
Message-ID:  <201708242256.v7OMuMGX030692@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: erj
Date: Thu Aug 24 22:56:22 2017
New Revision: 322865
URL: https://svnweb.freebsd.org/changeset/base/322865

Log:
  ixv(4): Add more robust mailbox API negotiation
  
  The previous update to the driver to 3.2.12-k changed the VF's API version
  to 1.2, but did not let the VF fall back to 1.1 or 1.0 versions. So, this
  patch tries 1.2 first, then the older versions in succession if that fails.
  
  This should allow the VF driver to negotiate 1.1 and work with older PF
  drivers, such as the one used in Amazon's EC2 service.
  
  PR:		220872
  Submitted by:	Jeb Cramer <jeb.j.cramer@intel.com>
  MFC after:	1 week
  Sponsored by:	Intel Corporation

Modified:
  head/sys/dev/ixgbe/if_ixv.c

Modified: head/sys/dev/ixgbe/if_ixv.c
==============================================================================
--- head/sys/dev/ixgbe/if_ixv.c	Thu Aug 24 22:33:42 2017	(r322864)
+++ head/sys/dev/ixgbe/if_ixv.c	Thu Aug 24 22:56:22 2017	(r322865)
@@ -93,6 +93,7 @@ static int      ixv_configure_interrupts(struct adapte
 static void     ixv_free_pci_resources(struct adapter *);
 static void     ixv_local_timer(void *);
 static void     ixv_setup_interface(device_t, struct adapter *);
+static int      ixv_negotiate_api(struct adapter *);
 
 static void     ixv_initialize_transmit_units(struct adapter *);
 static void     ixv_initialize_receive_units(struct adapter *);
@@ -384,11 +385,10 @@ ixv_attach(device_t dev)
 	}
 
 	/* Negotiate mailbox API version */
-	error = ixgbevf_negotiate_api_version(hw, ixgbe_mbox_api_12);
+	error = ixv_negotiate_api(adapter);
 	if (error) {
-		device_printf(dev, "MBX API 1.2 negotiation failed! Error %d\n",
-		    error);
-		error = EIO;
+		device_printf(dev,
+		    "Mailbox API negotiation failed during attach!\n");
 		goto err_out;
 	}
 
@@ -584,10 +584,12 @@ ixv_init_locked(struct adapter *adapter)
 
 	/* Reset VF and renegotiate mailbox API version */
 	hw->mac.ops.reset_hw(hw);
-	error = ixgbevf_negotiate_api_version(hw, ixgbe_mbox_api_12);
-	if (error)
-		device_printf(dev, "MBX API 1.2 negotiation failed! Error %d\n",
-		    error);
+	error = ixv_negotiate_api(adapter);
+	if (error) {
+		device_printf(dev,
+		    "Mailbox API negotiation failed in init_locked!\n");
+		return;
+	}
 
 	ixv_initialize_transmit_units(adapter);
 
@@ -873,6 +875,31 @@ ixv_media_change(struct ifnet *ifp)
 
 	return (0);
 } /* ixv_media_change */
+
+
+/************************************************************************
+ * ixv_negotiate_api
+ *
+ *   Negotiate the Mailbox API with the PF;
+ *   start with the most featured API first.
+ ************************************************************************/
+static int
+ixv_negotiate_api(struct adapter *adapter)
+{
+	struct ixgbe_hw *hw = &adapter->hw;
+	int             mbx_api[] = { ixgbe_mbox_api_11,
+	                              ixgbe_mbox_api_10,
+	                              ixgbe_mbox_api_unknown };
+	int             i = 0;
+
+	while (mbx_api[i] != ixgbe_mbox_api_unknown) {
+		if (ixgbevf_negotiate_api_version(hw, mbx_api[i]) == 0)
+			return (0);
+		i++;
+	}
+
+	return (EINVAL);
+} /* ixv_negotiate_api */
 
 
 /************************************************************************



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201708242256.v7OMuMGX030692>