]> git.karo-electronics.de Git - mv-sheeva.git/commitdiff
mlx4_en: dont change mac_header on xmit
authorEric Dumazet <eric.dumazet@gmail.com>
Sat, 25 Feb 2012 00:51:05 +0000 (00:51 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sun, 26 Feb 2012 19:22:05 +0000 (14:22 -0500)
A driver xmit function is not allowed to change skb without special
care.

mlx4_en_xmit() should not call skb_reset_mac_header() and instead should
use skb->data to access ethernet header.

This removes a dumb test : if (ethh && ethh->h_dest)

Also remove this slow mlx4_en_mac_to_u64() call, we can use
get_unaligned() to get faster code.

Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Cc: Yevgeny Petrilin <yevgenyp@mellanox.co.il>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlx4/en_tx.c
include/linux/mlx4/qp.h

index ff3250586584f9a7229aa97b4b2f290e36348f7e..2fd51405a509cfa5c296f91184e217755377c840 100644 (file)
@@ -601,8 +601,6 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)
        struct skb_frag_struct *frag;
        struct mlx4_en_tx_info *tx_info;
        struct ethhdr *ethh;
-       u64 mac;
-       u32 mac_l, mac_h;
        int tx_ind = 0;
        int nr_txbb;
        int desc_size;
@@ -687,16 +685,9 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)
        }
 
        /* Copy dst mac address to wqe */
-       skb_reset_mac_header(skb);
-       ethh = eth_hdr(skb);
-       if (ethh && ethh->h_dest) {
-               mac = mlx4_en_mac_to_u64(ethh->h_dest);
-               mac_h = (u32) ((mac & 0xffff00000000ULL) >> 16);
-               mac_l = (u32) (mac & 0xffffffff);
-               tx_desc->ctrl.srcrb_flags |= cpu_to_be32(mac_h);
-               tx_desc->ctrl.imm = cpu_to_be32(mac_l);
-       }
-
+       ethh = (struct ethhdr *)skb->data;
+       tx_desc->ctrl.srcrb_flags16[0] = get_unaligned((u16 *)ethh->h_dest);
+       tx_desc->ctrl.imm = get_unaligned((u32 *)(ethh->h_dest + 2));
        /* Handle LSO (TSO) packets */
        if (lso_header_size) {
                /* Mark opcode as LSO */
index bee8fa231276e2d29d7b4419b9ac92e8620fb2d8..091f9e7dc8b9629387a3d8e0d4bee9e3f915b702 100644 (file)
@@ -212,7 +212,10 @@ struct mlx4_wqe_ctrl_seg {
         * [1]   SE (solicited event)
         * [0]   FL (force loopback)
         */
-       __be32                  srcrb_flags;
+       union {
+               __be32                  srcrb_flags;
+               __be16                  srcrb_flags16[2];
+       };
        /*
         * imm is immediate data for send/RDMA write w/ immediate;
         * also invalidation key for send with invalidate; input