cxgb4: fix TSO descriptors
authorDimitris Michailidis <dm@chelsio.com>
Mon, 2 Aug 2010 13:19:18 +0000 (13:19 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 2 Aug 2010 23:26:41 +0000 (16:26 -0700)
Commit 1704d74894912b8ecc3e95cecd7bde336a0b1bf2 ("cxgb4vf: small changes
to message processing structures/macros") was incomplete and causes cxgb4
to write bad TSO descriptors.  Fix that up by reverting the offending part
of that commit and adjusting field accesses now that they are one level
deeper.

Signed-off-by: Dimitris Michailidis <dm@chelsio.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/cxgb4/sge.c

index 304302a71dbc85889d86efe0d4717d7bd7ca2ef7..5cacfc7c53a6b967f2513f413a77e00092ca3df6 100644 (file)
@@ -931,23 +931,23 @@ out_free: dev_kfree_skb(skb);
 
        ssi = skb_shinfo(skb);
        if (ssi->gso_size) {
-               struct cpl_tx_pkt_lso_core *lso = (void *)(wr + 1);
+               struct cpl_tx_pkt_lso *lso = (void *)wr;
                bool v6 = (ssi->gso_type & SKB_GSO_TCPV6) != 0;
                int l3hdr_len = skb_network_header_len(skb);
                int eth_xtra_len = skb_network_offset(skb) - ETH_HLEN;
 
                wr->op_immdlen = htonl(FW_WR_OP(FW_ETH_TX_PKT_WR) |
                                       FW_WR_IMMDLEN(sizeof(*lso)));
-               lso->lso_ctrl = htonl(LSO_OPCODE(CPL_TX_PKT_LSO) |
-                                     LSO_FIRST_SLICE | LSO_LAST_SLICE |
-                                     LSO_IPV6(v6) |
-                                     LSO_ETHHDR_LEN(eth_xtra_len / 4) |
-                                     LSO_IPHDR_LEN(l3hdr_len / 4) |
-                                     LSO_TCPHDR_LEN(tcp_hdr(skb)->doff));
-               lso->ipid_ofst = htons(0);
-               lso->mss = htons(ssi->gso_size);
-               lso->seqno_offset = htonl(0);
-               lso->len = htonl(skb->len);
+               lso->c.lso_ctrl = htonl(LSO_OPCODE(CPL_TX_PKT_LSO) |
+                                       LSO_FIRST_SLICE | LSO_LAST_SLICE |
+                                       LSO_IPV6(v6) |
+                                       LSO_ETHHDR_LEN(eth_xtra_len / 4) |
+                                       LSO_IPHDR_LEN(l3hdr_len / 4) |
+                                       LSO_TCPHDR_LEN(tcp_hdr(skb)->doff));
+               lso->c.ipid_ofst = htons(0);
+               lso->c.mss = htons(ssi->gso_size);
+               lso->c.seqno_offset = htonl(0);
+               lso->c.len = htonl(skb->len);
                cpl = (void *)(lso + 1);
                cntrl = TXPKT_CSUM_TYPE(v6 ? TX_CSUM_TCPIP6 : TX_CSUM_TCPIP) |
                        TXPKT_IPHDR_LEN(l3hdr_len) |