aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2014-07-08 22:58:54 -0400
committerDavid S. Miller <davem@davemloft.net>2014-07-08 22:58:54 -0400
commit2167cefc9e07753d158a56be0c58eb7702aa122b (patch)
tree21d8b55f81282fecf3c4c7bbe3880f508368abbd
parent9274f9f895be561274ac13b37494abbc4243aebc (diff)
parent2695bab2a6a18f31839c4e862eba3b450c0d2868 (diff)
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: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_netdev.c33
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_rx.c2
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_selftest.c3
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/mlx4.h5
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/mlx4_en.h4
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/port.c32
-rw-r--r--include/linux/mlx4/device.h11
7 files changed, 54 insertions, 36 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
index 7d4fb7bf2593..f384b354c88d 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
@@ -760,21 +760,22 @@ static int mlx4_en_replace_mac(struct mlx4_en_priv *priv, int qpn,
760 return __mlx4_replace_mac(dev, priv->port, qpn, new_mac_u64); 760 return __mlx4_replace_mac(dev, priv->port, qpn, new_mac_u64);
761} 761}
762 762
763static int mlx4_en_do_set_mac(struct mlx4_en_priv *priv) 763static int mlx4_en_do_set_mac(struct mlx4_en_priv *priv,
764 unsigned char new_mac[ETH_ALEN + 2])
764{ 765{
765 int err = 0; 766 int err = 0;
766 767
767 if (priv->port_up) { 768 if (priv->port_up) {
768 /* Remove old MAC and insert the new one */ 769 /* Remove old MAC and insert the new one */
769 err = mlx4_en_replace_mac(priv, priv->base_qpn, 770 err = mlx4_en_replace_mac(priv, priv->base_qpn,
770 priv->dev->dev_addr, priv->prev_mac); 771 new_mac, priv->current_mac);
771 if (err) 772 if (err)
772 en_err(priv, "Failed changing HW MAC address\n"); 773 en_err(priv, "Failed changing HW MAC address\n");
773 } else 774 } else
774 en_dbg(HW, priv, "Port is down while registering mac, exiting...\n"); 775 en_dbg(HW, priv, "Port is down while registering mac, exiting...\n");
775 776
776 memcpy(priv->prev_mac, priv->dev->dev_addr, 777 if (!err)
777 sizeof(priv->prev_mac)); 778 memcpy(priv->current_mac, new_mac, sizeof(priv->current_mac));
778 779
779 return err; 780 return err;
780} 781}
@@ -784,14 +785,17 @@ static int mlx4_en_set_mac(struct net_device *dev, void *addr)
784 struct mlx4_en_priv *priv = netdev_priv(dev); 785 struct mlx4_en_priv *priv = netdev_priv(dev);
785 struct mlx4_en_dev *mdev = priv->mdev; 786 struct mlx4_en_dev *mdev = priv->mdev;
786 struct sockaddr *saddr = addr; 787 struct sockaddr *saddr = addr;
788 unsigned char new_mac[ETH_ALEN + 2];
787 int err; 789 int err;
788 790
789 if (!is_valid_ether_addr(saddr->sa_data)) 791 if (!is_valid_ether_addr(saddr->sa_data))
790 return -EADDRNOTAVAIL; 792 return -EADDRNOTAVAIL;
791 793
792 mutex_lock(&mdev->state_lock); 794 mutex_lock(&mdev->state_lock);
793 memcpy(dev->dev_addr, saddr->sa_data, ETH_ALEN); 795 memcpy(new_mac, saddr->sa_data, ETH_ALEN);
794 err = mlx4_en_do_set_mac(priv); 796 err = mlx4_en_do_set_mac(priv, new_mac);
797 if (!err)
798 memcpy(dev->dev_addr, saddr->sa_data, ETH_ALEN);
795 mutex_unlock(&mdev->state_lock); 799 mutex_unlock(&mdev->state_lock);
796 800
797 return err; 801 return err;
@@ -940,11 +944,6 @@ static void mlx4_en_set_promisc_mode(struct mlx4_en_priv *priv,
940 0, MLX4_MCAST_DISABLE); 944 0, MLX4_MCAST_DISABLE);
941 if (err) 945 if (err)
942 en_err(priv, "Failed disabling multicast filter\n"); 946 en_err(priv, "Failed disabling multicast filter\n");
943
944 /* Disable port VLAN filter */
945 err = mlx4_SET_VLAN_FLTR(mdev->dev, priv);
946 if (err)
947 en_err(priv, "Failed disabling VLAN filter\n");
948 } 947 }
949} 948}
950 949
@@ -993,11 +992,6 @@ static void mlx4_en_clear_promisc_mode(struct mlx4_en_priv *priv,
993 en_err(priv, "Failed disabling promiscuous mode\n"); 992 en_err(priv, "Failed disabling promiscuous mode\n");
994 break; 993 break;
995 } 994 }
996
997 /* Enable port VLAN filter */
998 err = mlx4_SET_VLAN_FLTR(mdev->dev, priv);
999 if (err)
1000 en_err(priv, "Failed enabling VLAN filter\n");
1001} 995}
1002 996
1003static void mlx4_en_do_multicast(struct mlx4_en_priv *priv, 997static 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 } 1160 }
1167 1161
1168 /* MAC address of the port is not in uc list */ 1162 /* MAC address of the port is not in uc list */
1169 if (ether_addr_equal_64bits(entry->mac, dev->dev_addr)) 1163 if (ether_addr_equal_64bits(entry->mac,
1164 priv->current_mac))
1170 found = true; 1165 found = true;
1171 1166
1172 if (!found) { 1167 if (!found) {
@@ -1476,7 +1471,7 @@ static void mlx4_en_do_get_stats(struct work_struct *work)
1476 queue_delayed_work(mdev->workqueue, &priv->stats_task, STATS_DELAY); 1471 queue_delayed_work(mdev->workqueue, &priv->stats_task, STATS_DELAY);
1477 } 1472 }
1478 if (mdev->mac_removed[MLX4_MAX_PORTS + 1 - priv->port]) { 1473 if (mdev->mac_removed[MLX4_MAX_PORTS + 1 - priv->port]) {
1479 mlx4_en_do_set_mac(priv); 1474 mlx4_en_do_set_mac(priv, priv->current_mac);
1480 mdev->mac_removed[MLX4_MAX_PORTS + 1 - priv->port] = 0; 1475 mdev->mac_removed[MLX4_MAX_PORTS + 1 - priv->port] = 0;
1481 } 1476 }
1482 mutex_unlock(&mdev->state_lock); 1477 mutex_unlock(&mdev->state_lock);
@@ -2534,7 +2529,7 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
2534 } 2529 }
2535 } 2530 }
2536 2531
2537 memcpy(priv->prev_mac, dev->dev_addr, sizeof(priv->prev_mac)); 2532 memcpy(priv->current_mac, dev->dev_addr, sizeof(priv->current_mac));
2538 2533
2539 priv->stride = roundup_pow_of_two(sizeof(struct mlx4_en_rx_desc) + 2534 priv->stride = roundup_pow_of_two(sizeof(struct mlx4_en_rx_desc) +
2540 DS_SIZE * MLX4_EN_MAX_RX_FRAGS); 2535 DS_SIZE * MLX4_EN_MAX_RX_FRAGS);
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
index d2d415732d99..b8ec9208e12a 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
@@ -922,7 +922,7 @@ static const int frag_sizes[] = {
922void mlx4_en_calc_rx_buf(struct net_device *dev) 922void mlx4_en_calc_rx_buf(struct net_device *dev)
923{ 923{
924 struct mlx4_en_priv *priv = netdev_priv(dev); 924 struct mlx4_en_priv *priv = netdev_priv(dev);
925 int eff_mtu = dev->mtu + ETH_HLEN + VLAN_HLEN + ETH_LLC_SNAP_SIZE; 925 int eff_mtu = dev->mtu + ETH_HLEN + VLAN_HLEN;
926 int buf_size = 0; 926 int buf_size = 0;
927 int i = 0; 927 int i = 0;
928 928
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_selftest.c b/drivers/net/ethernet/mellanox/mlx4/en_selftest.c
index 03e5f6ac67e7..49d5afc7cfb8 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_selftest.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_selftest.c
@@ -159,7 +159,8 @@ void mlx4_en_ex_selftest(struct net_device *dev, u32 *flags, u64 *buf)
159 if (priv->mdev->dev->caps.flags & 159 if (priv->mdev->dev->caps.flags &
160 MLX4_DEV_CAP_FLAG_UC_LOOPBACK) { 160 MLX4_DEV_CAP_FLAG_UC_LOOPBACK) {
161 buf[3] = mlx4_en_test_registers(priv); 161 buf[3] = mlx4_en_test_registers(priv);
162 buf[4] = mlx4_en_test_loopback(priv); 162 if (priv->port_up)
163 buf[4] = mlx4_en_test_loopback(priv);
163 } 164 }
164 165
165 if (carrier_ok) 166 if (carrier_ok)
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4.h b/drivers/net/ethernet/mellanox/mlx4/mlx4.h
index 1d8af7336807..13fbcd03c3e4 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mlx4.h
+++ b/drivers/net/ethernet/mellanox/mlx4/mlx4.h
@@ -62,11 +62,6 @@
62 62
63#define INIT_HCA_TPT_MW_ENABLE (1 << 7) 63#define INIT_HCA_TPT_MW_ENABLE (1 << 7)
64 64
65#define MLX4_NUM_UP 8
66#define MLX4_NUM_TC 8
67#define MLX4_RATELIMIT_UNITS 3 /* 100 Mbps */
68#define MLX4_RATELIMIT_DEFAULT 0xffff
69
70struct mlx4_set_port_prio2tc_context { 65struct mlx4_set_port_prio2tc_context {
71 u8 prio2tc[4]; 66 u8 prio2tc[4];
72}; 67};
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
index 0e15295bedd6..7c1b5ec5378f 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
+++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
@@ -152,8 +152,6 @@ enum {
152#define MLX4_EN_TX_POLL_MODER 16 152#define MLX4_EN_TX_POLL_MODER 16
153#define MLX4_EN_TX_POLL_TIMEOUT (HZ / 4) 153#define MLX4_EN_TX_POLL_TIMEOUT (HZ / 4)
154 154
155#define ETH_LLC_SNAP_SIZE 8
156
157#define SMALL_PACKET_SIZE (256 - NET_IP_ALIGN) 155#define SMALL_PACKET_SIZE (256 - NET_IP_ALIGN)
158#define HEADER_COPY_SIZE (128 - NET_IP_ALIGN) 156#define HEADER_COPY_SIZE (128 - NET_IP_ALIGN)
159#define MLX4_LOOPBACK_TEST_PAYLOAD (HEADER_COPY_SIZE - ETH_HLEN) 157#define MLX4_LOOPBACK_TEST_PAYLOAD (HEADER_COPY_SIZE - ETH_HLEN)
@@ -532,7 +530,7 @@ struct mlx4_en_priv {
532 int registered; 530 int registered;
533 int allocated; 531 int allocated;
534 int stride; 532 int stride;
535 unsigned char prev_mac[ETH_ALEN + 2]; 533 unsigned char current_mac[ETH_ALEN + 2];
536 int mac_index; 534 int mac_index;
537 unsigned max_mtu; 535 unsigned max_mtu;
538 int base_qpn; 536 int base_qpn;
diff --git a/drivers/net/ethernet/mellanox/mlx4/port.c b/drivers/net/ethernet/mellanox/mlx4/port.c
index 7ab97174886d..9ba0c1ca10d5 100644
--- a/drivers/net/ethernet/mellanox/mlx4/port.c
+++ b/drivers/net/ethernet/mellanox/mlx4/port.c
@@ -244,10 +244,16 @@ EXPORT_SYMBOL_GPL(mlx4_get_base_qpn);
244 244
245void __mlx4_unregister_mac(struct mlx4_dev *dev, u8 port, u64 mac) 245void __mlx4_unregister_mac(struct mlx4_dev *dev, u8 port, u64 mac)
246{ 246{
247 struct mlx4_port_info *info = &mlx4_priv(dev)->port[port]; 247 struct mlx4_port_info *info;
248 struct mlx4_mac_table *table = &info->mac_table; 248 struct mlx4_mac_table *table;
249 int index; 249 int index;
250 250
251 if (port < 1 || port > dev->caps.num_ports) {
252 mlx4_warn(dev, "invalid port number (%d), aborting...\n", port);
253 return;
254 }
255 info = &mlx4_priv(dev)->port[port];
256 table = &info->mac_table;
251 mutex_lock(&table->mutex); 257 mutex_lock(&table->mutex);
252 index = find_index(dev, table, mac); 258 index = find_index(dev, table, mac);
253 259
@@ -1051,14 +1057,26 @@ int mlx4_SET_PORT_SCHEDULER(struct mlx4_dev *dev, u8 port, u8 *tc_tx_bw,
1051 1057
1052 for (i = 0; i < MLX4_NUM_TC; i++) { 1058 for (i = 0; i < MLX4_NUM_TC; i++) {
1053 struct mlx4_port_scheduler_tc_cfg_be *tc = &context->tc[i]; 1059 struct mlx4_port_scheduler_tc_cfg_be *tc = &context->tc[i];
1054 u16 r = ratelimit && ratelimit[i] ? ratelimit[i] : 1060 u16 r;
1055 MLX4_RATELIMIT_DEFAULT; 1061
1062 if (ratelimit && ratelimit[i]) {
1063 if (ratelimit[i] <= MLX4_MAX_100M_UNITS_VAL) {
1064 r = ratelimit[i];
1065 tc->max_bw_units =
1066 htons(MLX4_RATELIMIT_100M_UNITS);
1067 } else {
1068 r = ratelimit[i]/10;
1069 tc->max_bw_units =
1070 htons(MLX4_RATELIMIT_1G_UNITS);
1071 }
1072 tc->max_bw_value = htons(r);
1073 } else {
1074 tc->max_bw_value = htons(MLX4_RATELIMIT_DEFAULT);
1075 tc->max_bw_units = htons(MLX4_RATELIMIT_1G_UNITS);
1076 }
1056 1077
1057 tc->pg = htons(pg[i]); 1078 tc->pg = htons(pg[i]);
1058 tc->bw_precentage = htons(tc_tx_bw[i]); 1079 tc->bw_precentage = htons(tc_tx_bw[i]);
1059
1060 tc->max_bw_units = htons(MLX4_RATELIMIT_UNITS);
1061 tc->max_bw_value = htons(r);
1062 } 1080 }
1063 1081
1064 in_mod = MLX4_SET_PORT_SCHEDULER << 8 | port; 1082 in_mod = MLX4_SET_PORT_SCHEDULER << 8 | port;
diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h
index b12f4bbd064c..db0aef37645f 100644
--- a/include/linux/mlx4/device.h
+++ b/include/linux/mlx4/device.h
@@ -48,6 +48,17 @@
48#define MSIX_LEGACY_SZ 4 48#define MSIX_LEGACY_SZ 4
49#define MIN_MSIX_P_PORT 5 49#define MIN_MSIX_P_PORT 5
50 50
51#define MLX4_NUM_UP 8
52#define MLX4_NUM_TC 8
53#define MLX4_MAX_100M_UNITS_VAL 255 /*
54 * work around: can't set values
55 * greater then this value when
56 * using 100 Mbps units.
57 */
58#define MLX4_RATELIMIT_100M_UNITS 3 /* 100 Mbps */
59#define MLX4_RATELIMIT_1G_UNITS 4 /* 1 Gbps */
60#define MLX4_RATELIMIT_DEFAULT 0x00ff
61
51#define MLX4_ROCE_MAX_GIDS 128 62#define MLX4_ROCE_MAX_GIDS 128
52#define MLX4_ROCE_PF_GIDS 16 63#define MLX4_ROCE_PF_GIDS 16
53 64