diff options
author | Amir Vadai <amirv@mellanox.co.il> | 2011-11-26 14:55:19 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-11-27 17:17:04 -0500 |
commit | 60d6fe99e4a507f77b63c090eb8aacb67e21687a (patch) | |
tree | 52473d54554d44fbaf2b020fd203965b934ccaeb /drivers/net/ethernet | |
parent | 559a9f1d354b577af28f84181751820ff7d29feb (diff) |
net/mlx4_en: adding loopback support
Device must be in promiscuous mode or DMAC must be same as the host MAC, or
else packet will be dropped by the HW rx filtering.
Signed-off-by: Amir Vadai <amirv@mellanox.co.il>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet')
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 19 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/en_tx.c | 3 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | 1 |
3 files changed, 21 insertions, 2 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c index 78d776bc355c..4c5bbb3aad31 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c | |||
@@ -974,6 +974,21 @@ static int mlx4_en_change_mtu(struct net_device *dev, int new_mtu) | |||
974 | return 0; | 974 | return 0; |
975 | } | 975 | } |
976 | 976 | ||
977 | static int mlx4_en_set_features(struct net_device *netdev, | ||
978 | netdev_features_t features) | ||
979 | { | ||
980 | struct mlx4_en_priv *priv = netdev_priv(netdev); | ||
981 | |||
982 | if (features & NETIF_F_LOOPBACK) | ||
983 | priv->ctrl_flags |= cpu_to_be32(MLX4_WQE_CTRL_FORCE_LOOPBACK); | ||
984 | else | ||
985 | priv->ctrl_flags &= | ||
986 | cpu_to_be32(~MLX4_WQE_CTRL_FORCE_LOOPBACK); | ||
987 | |||
988 | return 0; | ||
989 | |||
990 | } | ||
991 | |||
977 | static const struct net_device_ops mlx4_netdev_ops = { | 992 | static const struct net_device_ops mlx4_netdev_ops = { |
978 | .ndo_open = mlx4_en_open, | 993 | .ndo_open = mlx4_en_open, |
979 | .ndo_stop = mlx4_en_close, | 994 | .ndo_stop = mlx4_en_close, |
@@ -990,6 +1005,7 @@ static const struct net_device_ops mlx4_netdev_ops = { | |||
990 | #ifdef CONFIG_NET_POLL_CONTROLLER | 1005 | #ifdef CONFIG_NET_POLL_CONTROLLER |
991 | .ndo_poll_controller = mlx4_en_netpoll, | 1006 | .ndo_poll_controller = mlx4_en_netpoll, |
992 | #endif | 1007 | #endif |
1008 | .ndo_set_features = mlx4_en_set_features, | ||
993 | }; | 1009 | }; |
994 | 1010 | ||
995 | int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, | 1011 | int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, |
@@ -1022,6 +1038,8 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, | |||
1022 | priv->port = port; | 1038 | priv->port = port; |
1023 | priv->port_up = false; | 1039 | priv->port_up = false; |
1024 | priv->flags = prof->flags; | 1040 | priv->flags = prof->flags; |
1041 | priv->ctrl_flags = cpu_to_be32(MLX4_WQE_CTRL_CQ_UPDATE | | ||
1042 | MLX4_WQE_CTRL_SOLICITED); | ||
1025 | priv->tx_ring_num = prof->tx_ring_num; | 1043 | priv->tx_ring_num = prof->tx_ring_num; |
1026 | priv->rx_ring_num = prof->rx_ring_num; | 1044 | priv->rx_ring_num = prof->rx_ring_num; |
1027 | priv->mac_index = -1; | 1045 | priv->mac_index = -1; |
@@ -1088,6 +1106,7 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, | |||
1088 | dev->features = dev->hw_features | NETIF_F_HIGHDMA | | 1106 | dev->features = dev->hw_features | NETIF_F_HIGHDMA | |
1089 | NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX | | 1107 | NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX | |
1090 | NETIF_F_HW_VLAN_FILTER; | 1108 | NETIF_F_HW_VLAN_FILTER; |
1109 | dev->hw_features |= NETIF_F_LOOPBACK; | ||
1091 | 1110 | ||
1092 | mdev->pndev[port] = dev; | 1111 | mdev->pndev[port] = dev; |
1093 | 1112 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c index 3094f940b928..807c2186548c 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c | |||
@@ -679,8 +679,7 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev) | |||
679 | tx_desc->ctrl.vlan_tag = cpu_to_be16(vlan_tag); | 679 | tx_desc->ctrl.vlan_tag = cpu_to_be16(vlan_tag); |
680 | tx_desc->ctrl.ins_vlan = MLX4_WQE_CTRL_INS_VLAN * !!vlan_tag; | 680 | tx_desc->ctrl.ins_vlan = MLX4_WQE_CTRL_INS_VLAN * !!vlan_tag; |
681 | tx_desc->ctrl.fence_size = (real_size / 16) & 0x3f; | 681 | tx_desc->ctrl.fence_size = (real_size / 16) & 0x3f; |
682 | tx_desc->ctrl.srcrb_flags = cpu_to_be32(MLX4_WQE_CTRL_CQ_UPDATE | | 682 | tx_desc->ctrl.srcrb_flags = priv->ctrl_flags; |
683 | MLX4_WQE_CTRL_SOLICITED); | ||
684 | if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) { | 683 | if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) { |
685 | tx_desc->ctrl.srcrb_flags |= cpu_to_be32(MLX4_WQE_CTRL_IP_CSUM | | 684 | tx_desc->ctrl.srcrb_flags |= cpu_to_be32(MLX4_WQE_CTRL_IP_CSUM | |
686 | MLX4_WQE_CTRL_TCP_UDP_CSUM); | 685 | MLX4_WQE_CTRL_TCP_UDP_CSUM); |
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h index d2dd97fa091f..ea2ba6899e9a 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | |||
@@ -453,6 +453,7 @@ struct mlx4_en_priv { | |||
453 | int base_qpn; | 453 | int base_qpn; |
454 | 454 | ||
455 | struct mlx4_en_rss_map rss_map; | 455 | struct mlx4_en_rss_map rss_map; |
456 | u32 ctrl_flags; | ||
456 | u32 flags; | 457 | u32 flags; |
457 | #define MLX4_EN_FLAG_PROMISC 0x1 | 458 | #define MLX4_EN_FLAG_PROMISC 0x1 |
458 | #define MLX4_EN_FLAG_MC_PROMISC 0x2 | 459 | #define MLX4_EN_FLAG_MC_PROMISC 0x2 |