dpdk: add support for Mellanox ConnectX-5 devices

Change-Id: I3ed2834a326eac50a7cb4faa592f42fd06325d5a
Signed-off-by: Damjan Marion <damarion@cisco.com>
diff --git a/dpdk/dpdk-17.02_patches/0003-dpdk-dev-2-2-net-mlx5-fix-extended-statistics-wrong-number.patch b/dpdk/dpdk-17.02_patches/0003-dpdk-dev-2-2-net-mlx5-fix-extended-statistics-wrong-number.patch
new file mode 100644
index 0000000..05c2e8d
--- /dev/null
+++ b/dpdk/dpdk-17.02_patches/0003-dpdk-dev-2-2-net-mlx5-fix-extended-statistics-wrong-number.patch
@@ -0,0 +1,87 @@
+diff --git a/drivers/net/mlx5/mlx5_stats.c b/drivers/net/mlx5/mlx5_stats.c
+index 0c80e4f..60ffbaa 100644
+--- a/drivers/net/mlx5/mlx5_stats.c
++++ b/drivers/net/mlx5/mlx5_stats.c
+@@ -166,6 +166,29 @@ struct mlx5_counter_ctrl {
+ }
+ 
+ /**
++ * Query the number of statistics provided by ETHTOOL.
++ *
++ * @param priv
++ *   Pointer to private structure.
++ *
++ * @return
++ *   Number of statistics on success, -1 on error.
++ */
++static int
++priv_ethtool_get_stats_n(struct priv *priv) {
++	struct ethtool_drvinfo drvinfo;
++	struct ifreq ifr;
++
++	drvinfo.cmd = ETHTOOL_GDRVINFO;
++	ifr.ifr_data = (caddr_t)&drvinfo;
++	if (priv_ifreq(priv, SIOCETHTOOL, &ifr) != 0) {
++		WARN("unable to query number of statistics");
++		return -1;
++	}
++	return drvinfo.n_stats;
++}
++
++/**
+  * Init the structures to read device counters.
+  *
+  * @param priv
+@@ -178,19 +201,11 @@ struct mlx5_counter_ctrl {
+ 	unsigned int i;
+ 	unsigned int j;
+ 	struct ifreq ifr;
+-	struct ethtool_drvinfo drvinfo;
+ 	struct ethtool_gstrings *strings = NULL;
+ 	unsigned int dev_stats_n;
+ 	unsigned int str_sz;
+ 
+-	/* How many statistics are available. */
+-	drvinfo.cmd = ETHTOOL_GDRVINFO;
+-	ifr.ifr_data = (caddr_t)&drvinfo;
+-	if (priv_ifreq(priv, SIOCETHTOOL, &ifr) != 0) {
+-		WARN("unable to get driver info");
+-		return;
+-	}
+-	dev_stats_n = drvinfo.n_stats;
++	dev_stats_n = priv_ethtool_get_stats_n(priv);
+ 	if (dev_stats_n < 1) {
+ 		WARN("no extended statistics available");
+ 		return;
+@@ -410,7 +425,15 @@ struct mlx5_counter_ctrl {
+ 	int ret = xstats_n;
+ 
+ 	if (n >= xstats_n && stats) {
++		struct mlx5_xstats_ctrl *xstats_ctrl = &priv->xstats_ctrl;
++		int stats_n;
++
+ 		priv_lock(priv);
++		stats_n = priv_ethtool_get_stats_n(priv);
++		if (stats_n < 0)
++			return -1;
++		if (xstats_ctrl->stats_n != stats_n)
++			priv_xstats_init(priv);
+ 		ret = priv_xstats_get(priv, stats);
+ 		priv_unlock(priv);
+ 	}
+@@ -427,8 +450,15 @@ struct mlx5_counter_ctrl {
+ mlx5_xstats_reset(struct rte_eth_dev *dev)
+ {
+ 	struct priv *priv = mlx5_get_priv(dev);
++	struct mlx5_xstats_ctrl *xstats_ctrl = &priv->xstats_ctrl;
++	int stats_n;
+ 
+ 	priv_lock(priv);
++	stats_n = priv_ethtool_get_stats_n(priv);
++	if (stats_n < 0)
++		return;
++	if (xstats_ctrl->stats_n != stats_n)
++		priv_xstats_init(priv);
+ 	priv_xstats_reset(priv);
+ 	priv_unlock(priv);
+ }