net/mlx4_en: Fix bridged vSwitch configuration for non SRIOV
[opensuse:kernel-source.git] / patches.drivers / mlx4-0287-net-mlx4_en-Fix-bridged-vSwitch-configuration-for-no.patch
1 From: Yan Burman <yanb@mellanox.com>
2 Date: Thu, 17 Jan 2013 05:30:42 +0000
3 Subject: net/mlx4_en: Fix bridged vSwitch configuration for non SRIOV mode
4 Patch-mainline: v3.8-rc6
5 Git-commit: 213815a1e6ae70b9648483b110bc5081795f99e8
6 References: bnc#786036 FATE#314304
7
8 Commit 5b4c4d36860e "mlx4_en: Allow communication between functions on
9 same host" introduced a regression under which a bridge acting as vSwitch
10 whose uplink is an mlx4 Ethernet device become non-operative in native
11 (non sriov) mode. This happens since broadcast ARP requests sent by VMs
12 were loopback-ed by the HW and hence the bridge learned VM source MACs
13 on both the VM and the uplink ports.
14
15 The fix is to place the DMAC in the send WQE only under SRIOV/eSwitch
16 configuration or when the device is in selftest.
17
18 Reviewed-by: Or Gerlitz <ogerlitz@mellanox.com>
19 Signed-off-by: Yan Burman <yanb@mellanox.com>
20 Signed-off-by: Amir Vadai <amirv@mellanox.com>
21 Signed-off-by: David S. Miller <davem@davemloft.net>
22 Acked-by: Benjamin Poirier <bpoirier@suse.de>
23 ---
24  drivers/net/ethernet/mellanox/mlx4/en_tx.c |   13 +++++++++----
25  1 file changed, 9 insertions(+), 4 deletions(-)
26 --- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c
27 +++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c
28 @@ -630,10 +630,15 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff
29                 ring->tx_csum++;
30         }
31  
32 -       /* Copy dst mac address to wqe */
33 -       ethh = (struct ethhdr *)skb->data;
34 -       tx_desc->ctrl.srcrb_flags16[0] = get_unaligned((__be16 *)ethh->h_dest);
35 -       tx_desc->ctrl.imm = get_unaligned((__be32 *)(ethh->h_dest + 2));
36 +       if (mlx4_is_mfunc(mdev->dev) || priv->validate_loopback) {
37 +               /* Copy dst mac address to wqe. This allows loopback in eSwitch,
38 +                * so that VFs and PF can communicate with each other
39 +                */
40 +               ethh = (struct ethhdr *)skb->data;
41 +               tx_desc->ctrl.srcrb_flags16[0] = get_unaligned((__be16 *)ethh->h_dest);
42 +               tx_desc->ctrl.imm = get_unaligned((__be32 *)(ethh->h_dest + 2));
43 +       }
44 +
45         /* Handle LSO (TSO) packets */
46         if (lso_header_size) {
47                 /* Mark opcode as LSO */