aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet
diff options
context:
space:
mode:
authorAmir Vadai <amirv@mellanox.co.il>2011-11-26 14:55:19 -0500
committerDavid S. Miller <davem@davemloft.net>2011-11-27 17:17:04 -0500
commit60d6fe99e4a507f77b63c090eb8aacb67e21687a (patch)
tree52473d54554d44fbaf2b020fd203965b934ccaeb /drivers/net/ethernet
parent559a9f1d354b577af28f84181751820ff7d29feb (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.c19
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_tx.c3
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/mlx4_en.h1
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
977static 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
977static const struct net_device_ops mlx4_netdev_ops = { 992static 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
995int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, 1011int 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