diff options
author | David S. Miller <davem@davemloft.net> | 2014-07-08 22:58:54 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-07-08 22:58:54 -0400 |
commit | 2167cefc9e07753d158a56be0c58eb7702aa122b (patch) | |
tree | 21d8b55f81282fecf3c4c7bbe3880f508368abbd /drivers/net | |
parent | 9274f9f895be561274ac13b37494abbc4243aebc (diff) | |
parent | 2695bab2a6a18f31839c4e862eba3b450c0d2868 (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>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 33 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/en_rx.c | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/en_selftest.c | 3 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/mlx4.h | 5 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | 4 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/port.c | 32 |
6 files changed, 43 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 | ||
763 | static int mlx4_en_do_set_mac(struct mlx4_en_priv *priv) | 763 | static 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 | ||
1003 | static void mlx4_en_do_multicast(struct mlx4_en_priv *priv, | 997 | 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 | } | 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[] = { | |||
922 | void mlx4_en_calc_rx_buf(struct net_device *dev) | 922 | void 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 | |||
70 | struct mlx4_set_port_prio2tc_context { | 65 | struct 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 | ||
245 | void __mlx4_unregister_mac(struct mlx4_dev *dev, u8 port, u64 mac) | 245 | void __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; |