drivers/infiniband/hw/mlx4/cm.c | 27 ++++
drivers/infiniband/hw/mlx4/main.c | 8 +
drivers/net/ethernet/mellanox/mlx4/cmd.c | 6 +
- drivers/net/ethernet/mellanox/mlx4/en_clock.c | 2 +
+ drivers/net/ethernet/mellanox/mlx4/en_clock.c | 10 ++
drivers/net/ethernet/mellanox/mlx4/en_cq.c | 11 ++
drivers/net/ethernet/mellanox/mlx4/en_dcb_nl.c | 4 +
- drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | 62 ++++++-
+ drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | 87 +++++++++-
drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 206 ++++++++++++++++++++++++
drivers/net/ethernet/mellanox/mlx4/en_rx.c | 84 +++++++++-
drivers/net/ethernet/mellanox/mlx4/en_tx.c | 53 +++++-
drivers/net/ethernet/mellanox/mlx4/main.c | 24 +++
drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | 21 ++-
include/linux/mlx4/cq.h | 5 +
- 14 files changed, 518 insertions(+), 5 deletions(-)
+ include/linux/mlx4/device.h | 4 +
+ 15 files changed, 553 insertions(+), 7 deletions(-)
diff --git a/drivers/infiniband/hw/mlx4/cm.c b/drivers/infiniband/hw/mlx4/cm.c
index xxxxxxx..xxxxxxx xxxxxx
.pps = 0,
.adjfreq = mlx4_en_phc_adjfreq,
.adjtime = mlx4_en_phc_adjtime,
+@@ -289,7 +291,11 @@ void mlx4_en_init_timestamp(struct mlx4_en_dev *mdev)
+ {
+ struct mlx4_dev *dev = mdev->dev;
+ unsigned long flags;
++#ifdef HAVE_CYCLECOUNTER_CYC2NS_4_PARAMS
++ u64 ns, zero = 0;
++#else
+ u64 ns;
++#endif
+
+ rwlock_init(&mdev->clock_lock);
+
+@@ -314,7 +320,11 @@ void mlx4_en_init_timestamp(struct mlx4_en_dev *mdev)
+ /* Calculate period in seconds to call the overflow watchdog - to make
+ * sure counter is checked at least once every wrap around.
+ */
++#ifdef HAVE_CYCLECOUNTER_CYC2NS_4_PARAMS
++ ns = cyclecounter_cyc2ns(&mdev->cycles, mdev->cycles.mask, zero, &zero);
++#else
+ ns = cyclecounter_cyc2ns(&mdev->cycles, mdev->cycles.mask);
++#endif
+ do_div(ns, NSEC_PER_SEC / 2 / HZ);
+ mdev->overflow_period = ns;
+
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_cq.c b/drivers/net/ethernet/mellanox/mlx4/en_cq.c
index xxxxxxx..xxxxxxx xxxxxx
--- a/drivers/net/ethernet/mellanox/mlx4/en_cq.c
index xxxxxxx..xxxxxxx xxxxxx
--- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
-@@ -580,6 +580,7 @@ static void mlx4_en_get_ringparam(struct net_device *dev,
+@@ -580,14 +580,27 @@ static void mlx4_en_get_ringparam(struct net_device *dev,
param->tx_pending = priv->tx_ring[0]->size;
}
-+#if defined(HAVE_GET_SET_RXFH) || defined(HAVE_GET_SET_RXFH_INDIR)
- static u32 mlx4_en_get_rxfh_indir_size(struct net_device *dev)
+-static u32 mlx4_en_get_rxfh_indir_size(struct net_device *dev)
++#if defined(HAVE_RXFH_INDIR_SIZE) || defined(HAVE_RXFH_INDIR_SIZE_EXT)
++u32 mlx4_en_get_rxfh_indir_size(struct net_device *dev)
{
struct mlx4_en_priv *priv = netdev_priv(dev);
-@@ -587,7 +588,11 @@ static u32 mlx4_en_get_rxfh_indir_size(struct net_device *dev)
+
return priv->rx_ring_num;
}
++#endif
-+#ifdef HAVE_GET_SET_RXFH_INDIR
-+static int mlx4_en_get_rxfh_indir(struct net_device *dev, u32 *ring_index)
+-static int mlx4_en_get_rxfh(struct net_device *dev, u32 *ring_index, u8 *key)
++#if defined(HAVE_GET_SET_RXFH) && !defined(HAVE_GET_SET_RXFH_INDIR_EXT)
++static int mlx4_en_get_rxfh(struct net_device *dev, u32 *ring_index,
++#ifdef HAVE_ETH_SS_RSS_HASH_FUNCS
++ u8 *key, u8 *hfunc)
+#else
- static int mlx4_en_get_rxfh(struct net_device *dev, u32 *ring_index, u8 *key)
++ u8 *key)
++#endif
++#elif defined(HAVE_GET_SET_RXFH_INDIR) || defined (HAVE_GET_SET_RXFH_INDIR_EXT)
++static int mlx4_en_get_rxfh_indir(struct net_device *dev, u32 *ring_index)
++#elif defined(CONFIG_SYSFS_INDIR_SETTING)
++int mlx4_en_get_rxfh_indir(struct net_device *dev, u32 *ring_index)
+#endif
{
struct mlx4_en_priv *priv = netdev_priv(dev);
struct mlx4_en_rss_map *rss_map = &priv->rss_map;
-@@ -605,8 +610,13 @@ static int mlx4_en_get_rxfh(struct net_device *dev, u32 *ring_index, u8 *key)
+@@ -605,8 +618,18 @@ static int mlx4_en_get_rxfh(struct net_device *dev, u32 *ring_index, u8 *key)
return err;
}
-+#ifdef HAVE_GET_SET_RXFH_INDIR
-+static int mlx4_en_set_rxfh_indir(struct net_device *dev,
-+ const u32 *ring_index)
-+#else
++#if defined(HAVE_GET_SET_RXFH) && !defined(HAVE_GET_SET_RXFH_INDIR_EXT)
static int mlx4_en_set_rxfh(struct net_device *dev, const u32 *ring_index,
++#ifdef HAVE_ETH_SS_RSS_HASH_FUNCS
++ const u8 *key, const u8 hfunc)
++#else
const u8 *key)
++#endif
++#elif defined(HAVE_GET_SET_RXFH_INDIR) || defined (HAVE_GET_SET_RXFH_INDIR_EXT)
++static int mlx4_en_set_rxfh_indir(struct net_device *dev, const u32 *ring_index)
++#elif defined(CONFIG_SYSFS_INDIR_SETTING)
++int mlx4_en_set_rxfh_indir(struct net_device *dev, const u32 *ring_index)
+#endif
{
struct mlx4_en_priv *priv = netdev_priv(dev);
struct mlx4_en_dev *mdev = priv->mdev;
-@@ -650,6 +660,7 @@ static int mlx4_en_set_rxfh(struct net_device *dev, const u32 *ring_index,
- mutex_unlock(&mdev->state_lock);
- return err;
- }
-+#endif
-
- #define all_zeros_or_all_ones(field) \
- ((field) == 0 || (field) == (__force typeof(field))-1)
-@@ -664,11 +675,13 @@ static int mlx4_en_validate_flow(struct net_device *dev,
+@@ -664,11 +687,13 @@ static int mlx4_en_validate_flow(struct net_device *dev,
if (cmd->fs.location >= MAX_NUM_OF_FS_RULES)
return -EINVAL;
switch (cmd->fs.flow_type & ~(FLOW_EXT | FLOW_MAC_EXT)) {
case TCP_V4_FLOW:
-@@ -760,9 +773,11 @@ static int mlx4_en_ethtool_add_mac_rule_by_ipv4(struct mlx4_en_priv *priv,
+@@ -760,9 +785,11 @@ static int mlx4_en_ethtool_add_mac_rule_by_ipv4(struct mlx4_en_priv *priv,
unsigned char mac[ETH_ALEN];
if (!ipv4_is_multicast(ipv4_dst)) {
memcpy(&mac, priv->dev->dev_addr, ETH_ALEN);
} else {
ip_eth_mc_map(ipv4_dst, mac);
-@@ -1058,8 +1073,13 @@ static int mlx4_en_get_num_flows(struct mlx4_en_priv *priv)
+@@ -1058,8 +1085,13 @@ static int mlx4_en_get_num_flows(struct mlx4_en_priv *priv)
}
{
struct mlx4_en_priv *priv = netdev_priv(dev);
struct mlx4_en_dev *mdev = priv->mdev;
-@@ -1087,7 +1107,11 @@ static int mlx4_en_get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd,
+@@ -1087,7 +1119,11 @@ static int mlx4_en_get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd,
while ((!err || err == -ENOENT) && priority < cmd->rule_cnt) {
err = mlx4_en_get_flow(dev, cmd, i);
if (!err)
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0))
++#ifdef HAVE_ETHTOOL_OPS_GET_RXNFC_U32_RULE_LOCS
rule_locs[priority++] = i;
+#else
+ ((u32 *)(rule_locs))[priority++] = i;
i++;
}
err = 0;
-@@ -1125,6 +1149,7 @@ static int mlx4_en_set_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd)
+@@ -1125,6 +1161,7 @@ static int mlx4_en_set_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd)
return err;
}
static void mlx4_en_get_channels(struct net_device *dev,
struct ethtool_channels *channel)
{
-@@ -1174,8 +1199,12 @@ static int mlx4_en_set_channels(struct net_device *dev,
+@@ -1171,11 +1208,17 @@ static int mlx4_en_set_channels(struct net_device *dev,
+ goto out;
+ }
+
++#ifdef HAVE_NEW_TX_RING_SCHEME
netif_set_real_num_tx_queues(dev, priv->tx_ring_num);
++#else
++ dev->real_num_tx_queues = priv->tx_ring_num;
++#endif
netif_set_real_num_rx_queues(dev, priv->rx_ring_num);
-+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,39))
- if (dev->num_tc)
-- mlx4_en_setup_tc(dev, MLX4_EN_NUM_UP);
-+#else
+- if (dev->num_tc)
++#ifdef HAVE_NEW_TX_RING_SCHEME
+ if (netdev_get_num_tc(dev))
+ mlx4_en_setup_tc(dev, MLX4_EN_NUM_UP);
+#endif
-+ mlx4_en_setup_tc(dev, MLX4_EN_NUM_UP);
en_warn(priv, "Using %d TX rings\n", priv->tx_ring_num);
en_warn(priv, "Using %d RX rings\n", priv->rx_ring_num);
-@@ -1192,7 +1221,9 @@ out:
+@@ -1192,7 +1235,9 @@ out:
mutex_unlock(&mdev->state_lock);
return err;
}
static int mlx4_en_get_ts_info(struct net_device *dev,
struct ethtool_ts_info *info)
{
-@@ -1224,6 +1255,7 @@ static int mlx4_en_get_ts_info(struct net_device *dev,
+@@ -1224,6 +1269,7 @@ static int mlx4_en_get_ts_info(struct net_device *dev,
return ret;
}
static int mlx4_en_set_priv_flags(struct net_device *dev, u32 flags)
{
-@@ -1267,6 +1299,7 @@ static u32 mlx4_en_get_priv_flags(struct net_device *dev)
+@@ -1267,6 +1313,7 @@ static u32 mlx4_en_get_priv_flags(struct net_device *dev)
return priv->pflags;
}
static int mlx4_en_get_tunable(struct net_device *dev,
const struct ethtool_tunable *tuna,
void *data)
-@@ -1308,7 +1341,7 @@ static int mlx4_en_set_tunable(struct net_device *dev,
+@@ -1308,7 +1355,7 @@ static int mlx4_en_set_tunable(struct net_device *dev,
return ret;
}
const struct ethtool_ops mlx4_en_ethtool_ops = {
.get_drvinfo = mlx4_en_get_drvinfo,
-@@ -1331,18 +1364,43 @@ const struct ethtool_ops mlx4_en_ethtool_ops = {
+@@ -1331,18 +1378,50 @@ const struct ethtool_ops mlx4_en_ethtool_ops = {
.set_ringparam = mlx4_en_set_ringparam,
.get_rxnfc = mlx4_en_get_rxnfc,
.set_rxnfc = mlx4_en_set_rxnfc,
-+#if defined(HAVE_GET_SET_RXFH) && !defined(HAVE_GET_SET_RXFH_INDIR)
++#if defined(HAVE_RXFH_INDIR_SIZE) && !defined(HAVE_RXFH_INDIR_SIZE_EXT)
.get_rxfh_indir_size = mlx4_en_get_rxfh_indir_size,
++#endif
++#if defined(HAVE_GET_SET_RXFH) && !defined(HAVE_GET_SET_RXFH_INDIR_EXT)
.get_rxfh = mlx4_en_get_rxfh,
.set_rxfh = mlx4_en_set_rxfh,
++#elif defined(HAVE_GET_SET_RXFH_INDIR) && !defined(HAVE_GET_SET_RXFH_INDIR_EXT)
++ .get_rxfh_indir = mlx4_en_get_rxfh_indir,
++ .set_rxfh_indir = mlx4_en_set_rxfh_indir,
+#endif
+#ifdef HAVE_GET_SET_CHANNELS
.get_channels = mlx4_en_get_channels,
+#ifdef HAVE_ETHTOOL_OPS_EXT
+const struct ethtool_ops_ext mlx4_en_ethtool_ops_ext = {
+ .size = sizeof(struct ethtool_ops_ext),
++#ifdef HAVE_RXFH_INDIR_SIZE_EXT
+ .get_rxfh_indir_size = mlx4_en_get_rxfh_indir_size,
-+#ifdef HAVE_GET_SET_RXFH_INDIR
++#endif
++#ifdef HAVE_GET_SET_RXFH_INDIR_EXT
+ .get_rxfh_indir = mlx4_en_get_rxfh_indir,
+ .set_rxfh_indir = mlx4_en_set_rxfh_indir,
+#endif
#include <linux/mlx4/device.h>
#include <linux/mlx4/doorbell.h>
+diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h
+index xxxxxxx..xxxxxxx xxxxxx
+--- a/include/linux/mlx4/device.h
++++ b/include/linux/mlx4/device.h
+@@ -42,7 +42,11 @@
+
+ #include <linux/atomic.h>
+
++#ifdef HAVE_TIMECOUNTER_H
++#include <linux/timecounter.h>
++#else
+ #include <linux/clocksource.h>
++#endif
+
+ #define MAX_MSIX_P_PORT 17
+ #define MAX_MSIX 64