Commit 2167cefc authored by David S. Miller's avatar David S. Miller

Merge branch 'mlx4-next'

Amir Vadai says:

====================
Mellanox driver update Jul-08-2014

This patch set introduce some small bug fixes.
Most of the patches are small fixes to cornet case bugs.
The patch by Noa ("Fix mac_hash database inconsistency") was sent in the past
[1] and was droped because a fix to the bonding code was supposed to make it
unnecessary. After a second look on the patch, it is still needed even
after the direct access to dev_addr by the bonding will be fixed.

Patches were applied and tested over commit bd4578b
("drivers/net/hyperv/netvsc.c: remove unnecessary null test before kfree")

[1] - http://permalink.gmane.org/gmane.linux.network/315900
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 9274f9f8 2695bab2
...@@ -760,21 +760,22 @@ static int mlx4_en_replace_mac(struct mlx4_en_priv *priv, int qpn, ...@@ -760,21 +760,22 @@ static int mlx4_en_replace_mac(struct mlx4_en_priv *priv, int qpn,
return __mlx4_replace_mac(dev, priv->port, qpn, new_mac_u64); return __mlx4_replace_mac(dev, priv->port, qpn, new_mac_u64);
} }
static int mlx4_en_do_set_mac(struct mlx4_en_priv *priv) static int mlx4_en_do_set_mac(struct mlx4_en_priv *priv,
unsigned char new_mac[ETH_ALEN + 2])
{ {
int err = 0; int err = 0;
if (priv->port_up) { if (priv->port_up) {
/* Remove old MAC and insert the new one */ /* Remove old MAC and insert the new one */
err = mlx4_en_replace_mac(priv, priv->base_qpn, err = mlx4_en_replace_mac(priv, priv->base_qpn,
priv->dev->dev_addr, priv->prev_mac); new_mac, priv->current_mac);
if (err) if (err)
en_err(priv, "Failed changing HW MAC address\n"); en_err(priv, "Failed changing HW MAC address\n");
} else } else
en_dbg(HW, priv, "Port is down while registering mac, exiting...\n"); en_dbg(HW, priv, "Port is down while registering mac, exiting...\n");
memcpy(priv->prev_mac, priv->dev->dev_addr, if (!err)
sizeof(priv->prev_mac)); memcpy(priv->current_mac, new_mac, sizeof(priv->current_mac));
return err; return err;
} }
...@@ -784,14 +785,17 @@ static int mlx4_en_set_mac(struct net_device *dev, void *addr) ...@@ -784,14 +785,17 @@ static int mlx4_en_set_mac(struct net_device *dev, void *addr)
struct mlx4_en_priv *priv = netdev_priv(dev); struct mlx4_en_priv *priv = netdev_priv(dev);
struct mlx4_en_dev *mdev = priv->mdev; struct mlx4_en_dev *mdev = priv->mdev;
struct sockaddr *saddr = addr; struct sockaddr *saddr = addr;
unsigned char new_mac[ETH_ALEN + 2];
int err; int err;
if (!is_valid_ether_addr(saddr->sa_data)) if (!is_valid_ether_addr(saddr->sa_data))
return -EADDRNOTAVAIL; return -EADDRNOTAVAIL;
mutex_lock(&mdev->state_lock); mutex_lock(&mdev->state_lock);
memcpy(dev->dev_addr, saddr->sa_data, ETH_ALEN); memcpy(new_mac, saddr->sa_data, ETH_ALEN);
err = mlx4_en_do_set_mac(priv); err = mlx4_en_do_set_mac(priv, new_mac);
if (!err)
memcpy(dev->dev_addr, saddr->sa_data, ETH_ALEN);
mutex_unlock(&mdev->state_lock); mutex_unlock(&mdev->state_lock);
return err; return err;
...@@ -940,11 +944,6 @@ static void mlx4_en_set_promisc_mode(struct mlx4_en_priv *priv, ...@@ -940,11 +944,6 @@ static void mlx4_en_set_promisc_mode(struct mlx4_en_priv *priv,
0, MLX4_MCAST_DISABLE); 0, MLX4_MCAST_DISABLE);
if (err) if (err)
en_err(priv, "Failed disabling multicast filter\n"); en_err(priv, "Failed disabling multicast filter\n");
/* Disable port VLAN filter */
err = mlx4_SET_VLAN_FLTR(mdev->dev, priv);
if (err)
en_err(priv, "Failed disabling VLAN filter\n");
} }
} }
...@@ -993,11 +992,6 @@ static void mlx4_en_clear_promisc_mode(struct mlx4_en_priv *priv, ...@@ -993,11 +992,6 @@ static void mlx4_en_clear_promisc_mode(struct mlx4_en_priv *priv,
en_err(priv, "Failed disabling promiscuous mode\n"); en_err(priv, "Failed disabling promiscuous mode\n");
break; break;
} }
/* Enable port VLAN filter */
err = mlx4_SET_VLAN_FLTR(mdev->dev, priv);
if (err)
en_err(priv, "Failed enabling VLAN filter\n");
} }
static void mlx4_en_do_multicast(struct mlx4_en_priv *priv, static void mlx4_en_do_multicast(struct mlx4_en_priv *priv,
...@@ -1166,7 +1160,8 @@ static void mlx4_en_do_uc_filter(struct mlx4_en_priv *priv, ...@@ -1166,7 +1160,8 @@ static void mlx4_en_do_uc_filter(struct mlx4_en_priv *priv,
} }
/* MAC address of the port is not in uc list */ /* MAC address of the port is not in uc list */
if (ether_addr_equal_64bits(entry->mac, dev->dev_addr)) if (ether_addr_equal_64bits(entry->mac,
priv->current_mac))
found = true; found = true;
if (!found) { if (!found) {
...@@ -1476,7 +1471,7 @@ static void mlx4_en_do_get_stats(struct work_struct *work) ...@@ -1476,7 +1471,7 @@ static void mlx4_en_do_get_stats(struct work_struct *work)
queue_delayed_work(mdev->workqueue, &priv->stats_task, STATS_DELAY); queue_delayed_work(mdev->workqueue, &priv->stats_task, STATS_DELAY);
} }
if (mdev->mac_removed[MLX4_MAX_PORTS + 1 - priv->port]) { if (mdev->mac_removed[MLX4_MAX_PORTS + 1 - priv->port]) {
mlx4_en_do_set_mac(priv); mlx4_en_do_set_mac(priv, priv->current_mac);
mdev->mac_removed[MLX4_MAX_PORTS + 1 - priv->port] = 0; mdev->mac_removed[MLX4_MAX_PORTS + 1 - priv->port] = 0;
} }
mutex_unlock(&mdev->state_lock); mutex_unlock(&mdev->state_lock);
...@@ -2534,7 +2529,7 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, ...@@ -2534,7 +2529,7 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
} }
} }
memcpy(priv->prev_mac, dev->dev_addr, sizeof(priv->prev_mac)); memcpy(priv->current_mac, dev->dev_addr, sizeof(priv->current_mac));
priv->stride = roundup_pow_of_two(sizeof(struct mlx4_en_rx_desc) + priv->stride = roundup_pow_of_two(sizeof(struct mlx4_en_rx_desc) +
DS_SIZE * MLX4_EN_MAX_RX_FRAGS); DS_SIZE * MLX4_EN_MAX_RX_FRAGS);
......
...@@ -922,7 +922,7 @@ static const int frag_sizes[] = { ...@@ -922,7 +922,7 @@ static const int frag_sizes[] = {
void mlx4_en_calc_rx_buf(struct net_device *dev) void mlx4_en_calc_rx_buf(struct net_device *dev)
{ {
struct mlx4_en_priv *priv = netdev_priv(dev); struct mlx4_en_priv *priv = netdev_priv(dev);
int eff_mtu = dev->mtu + ETH_HLEN + VLAN_HLEN + ETH_LLC_SNAP_SIZE; int eff_mtu = dev->mtu + ETH_HLEN + VLAN_HLEN;
int buf_size = 0; int buf_size = 0;
int i = 0; int i = 0;
......
...@@ -159,7 +159,8 @@ void mlx4_en_ex_selftest(struct net_device *dev, u32 *flags, u64 *buf) ...@@ -159,7 +159,8 @@ void mlx4_en_ex_selftest(struct net_device *dev, u32 *flags, u64 *buf)
if (priv->mdev->dev->caps.flags & if (priv->mdev->dev->caps.flags &
MLX4_DEV_CAP_FLAG_UC_LOOPBACK) { MLX4_DEV_CAP_FLAG_UC_LOOPBACK) {
buf[3] = mlx4_en_test_registers(priv); buf[3] = mlx4_en_test_registers(priv);
buf[4] = mlx4_en_test_loopback(priv); if (priv->port_up)
buf[4] = mlx4_en_test_loopback(priv);
} }
if (carrier_ok) if (carrier_ok)
......
...@@ -62,11 +62,6 @@ ...@@ -62,11 +62,6 @@
#define INIT_HCA_TPT_MW_ENABLE (1 << 7) #define INIT_HCA_TPT_MW_ENABLE (1 << 7)
#define MLX4_NUM_UP 8
#define MLX4_NUM_TC 8
#define MLX4_RATELIMIT_UNITS 3 /* 100 Mbps */
#define MLX4_RATELIMIT_DEFAULT 0xffff
struct mlx4_set_port_prio2tc_context { struct mlx4_set_port_prio2tc_context {
u8 prio2tc[4]; u8 prio2tc[4];
}; };
......
...@@ -152,8 +152,6 @@ enum { ...@@ -152,8 +152,6 @@ enum {
#define MLX4_EN_TX_POLL_MODER 16 #define MLX4_EN_TX_POLL_MODER 16
#define MLX4_EN_TX_POLL_TIMEOUT (HZ / 4) #define MLX4_EN_TX_POLL_TIMEOUT (HZ / 4)
#define ETH_LLC_SNAP_SIZE 8
#define SMALL_PACKET_SIZE (256 - NET_IP_ALIGN) #define SMALL_PACKET_SIZE (256 - NET_IP_ALIGN)
#define HEADER_COPY_SIZE (128 - NET_IP_ALIGN) #define HEADER_COPY_SIZE (128 - NET_IP_ALIGN)
#define MLX4_LOOPBACK_TEST_PAYLOAD (HEADER_COPY_SIZE - ETH_HLEN) #define MLX4_LOOPBACK_TEST_PAYLOAD (HEADER_COPY_SIZE - ETH_HLEN)
...@@ -532,7 +530,7 @@ struct mlx4_en_priv { ...@@ -532,7 +530,7 @@ struct mlx4_en_priv {
int registered; int registered;
int allocated; int allocated;
int stride; int stride;
unsigned char prev_mac[ETH_ALEN + 2]; unsigned char current_mac[ETH_ALEN + 2];
int mac_index; int mac_index;
unsigned max_mtu; unsigned max_mtu;
int base_qpn; int base_qpn;
......
...@@ -244,10 +244,16 @@ EXPORT_SYMBOL_GPL(mlx4_get_base_qpn); ...@@ -244,10 +244,16 @@ EXPORT_SYMBOL_GPL(mlx4_get_base_qpn);
void __mlx4_unregister_mac(struct mlx4_dev *dev, u8 port, u64 mac) void __mlx4_unregister_mac(struct mlx4_dev *dev, u8 port, u64 mac)
{ {
struct mlx4_port_info *info = &mlx4_priv(dev)->port[port]; struct mlx4_port_info *info;
struct mlx4_mac_table *table = &info->mac_table; struct mlx4_mac_table *table;
int index; int index;
if (port < 1 || port > dev->caps.num_ports) {
mlx4_warn(dev, "invalid port number (%d), aborting...\n", port);
return;
}
info = &mlx4_priv(dev)->port[port];
table = &info->mac_table;
mutex_lock(&table->mutex); mutex_lock(&table->mutex);
index = find_index(dev, table, mac); index = find_index(dev, table, mac);
...@@ -1051,14 +1057,26 @@ int mlx4_SET_PORT_SCHEDULER(struct mlx4_dev *dev, u8 port, u8 *tc_tx_bw, ...@@ -1051,14 +1057,26 @@ int mlx4_SET_PORT_SCHEDULER(struct mlx4_dev *dev, u8 port, u8 *tc_tx_bw,
for (i = 0; i < MLX4_NUM_TC; i++) { for (i = 0; i < MLX4_NUM_TC; i++) {
struct mlx4_port_scheduler_tc_cfg_be *tc = &context->tc[i]; struct mlx4_port_scheduler_tc_cfg_be *tc = &context->tc[i];
u16 r = ratelimit && ratelimit[i] ? ratelimit[i] : u16 r;
MLX4_RATELIMIT_DEFAULT;
if (ratelimit && ratelimit[i]) {
if (ratelimit[i] <= MLX4_MAX_100M_UNITS_VAL) {
r = ratelimit[i];
tc->max_bw_units =
htons(MLX4_RATELIMIT_100M_UNITS);
} else {
r = ratelimit[i]/10;
tc->max_bw_units =
htons(MLX4_RATELIMIT_1G_UNITS);
}
tc->max_bw_value = htons(r);
} else {
tc->max_bw_value = htons(MLX4_RATELIMIT_DEFAULT);
tc->max_bw_units = htons(MLX4_RATELIMIT_1G_UNITS);
}
tc->pg = htons(pg[i]); tc->pg = htons(pg[i]);
tc->bw_precentage = htons(tc_tx_bw[i]); tc->bw_precentage = htons(tc_tx_bw[i]);
tc->max_bw_units = htons(MLX4_RATELIMIT_UNITS);
tc->max_bw_value = htons(r);
} }
in_mod = MLX4_SET_PORT_SCHEDULER << 8 | port; in_mod = MLX4_SET_PORT_SCHEDULER << 8 | port;
......
...@@ -48,6 +48,17 @@ ...@@ -48,6 +48,17 @@
#define MSIX_LEGACY_SZ 4 #define MSIX_LEGACY_SZ 4
#define MIN_MSIX_P_PORT 5 #define MIN_MSIX_P_PORT 5
#define MLX4_NUM_UP 8
#define MLX4_NUM_TC 8
#define MLX4_MAX_100M_UNITS_VAL 255 /*
* work around: can't set values
* greater then this value when
* using 100 Mbps units.
*/
#define MLX4_RATELIMIT_100M_UNITS 3 /* 100 Mbps */
#define MLX4_RATELIMIT_1G_UNITS 4 /* 1 Gbps */
#define MLX4_RATELIMIT_DEFAULT 0x00ff
#define MLX4_ROCE_MAX_GIDS 128 #define MLX4_ROCE_MAX_GIDS 128
#define MLX4_ROCE_PF_GIDS 16 #define MLX4_ROCE_PF_GIDS 16
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment