]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
cxgb4: copy the length of cpl_tx_pkt_core to fw_wr
authorGanesh Goudar <ganeshgr@chelsio.com>
Mon, 21 May 2018 06:56:36 +0000 (12:26 +0530)
committerDavid S. Miller <davem@davemloft.net>
Mon, 21 May 2018 16:16:23 +0000 (12:16 -0400)
immdlen field of FW_ETH_TX_PKT_WR is filled in a wrong way,
we must copy the length of all the cpls encapsulated in fw
work request. In the xmit path we missed adding the length
of CPL_TX_PKT_CORE but we added the length of WR_HDR and it
worked because WR_HDR and CPL_TX_PKT_CORE are of same length.
Add the length of cpl_tx_pkt_core not WR_HDR's. This also
fixes the lso cpl errors for udp tunnels

Fixes: d0a1299c6bf7 ("cxgb4: add support for vxlan segmentation offload")
Signed-off-by: Ganesh Goudar <ganeshgr@chelsio.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/chelsio/cxgb4/sge.c

index 0f87e973a1584fa157c8e2843299805a82c4c425..276f22357f81acf48aba9600b3800878a4a44861 100644 (file)
@@ -1411,8 +1411,9 @@ out_free: dev_kfree_skb_any(skb);
        end = (u64 *)wr + flits;
 
        len = immediate ? skb->len : 0;
+       len += sizeof(*cpl);
        if (ssi->gso_size) {
-               struct cpl_tx_pkt_lso *lso = (void *)wr;
+               struct cpl_tx_pkt_lso_core *lso = (void *)(wr + 1);
                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;
@@ -1442,20 +1443,19 @@ out_free:       dev_kfree_skb_any(skb);
                        if (skb->ip_summed == CHECKSUM_PARTIAL)
                                cntrl = hwcsum(adap->params.chip, skb);
                } else {
-                       lso->c.lso_ctrl = htonl(LSO_OPCODE_V(CPL_TX_PKT_LSO) |
-                                         LSO_FIRST_SLICE_F | LSO_LAST_SLICE_F |
-                                         LSO_IPV6_V(v6) |
-                                         LSO_ETHHDR_LEN_V(eth_xtra_len / 4) |
-                                         LSO_IPHDR_LEN_V(l3hdr_len / 4) |
-                                         LSO_TCPHDR_LEN_V(tcp_hdr(skb)->doff));
-                       lso->c.ipid_ofst = htons(0);
-                       lso->c.mss = htons(ssi->gso_size);
-                       lso->c.seqno_offset = htonl(0);
+                       lso->lso_ctrl = htonl(LSO_OPCODE_V(CPL_TX_PKT_LSO) |
+                                       LSO_FIRST_SLICE_F | LSO_LAST_SLICE_F |
+                                       LSO_IPV6_V(v6) |
+                                       LSO_ETHHDR_LEN_V(eth_xtra_len / 4) |
+                                       LSO_IPHDR_LEN_V(l3hdr_len / 4) |
+                                       LSO_TCPHDR_LEN_V(tcp_hdr(skb)->doff));
+                       lso->ipid_ofst = htons(0);
+                       lso->mss = htons(ssi->gso_size);
+                       lso->seqno_offset = htonl(0);
                        if (is_t4(adap->params.chip))
-                               lso->c.len = htonl(skb->len);
+                               lso->len = htonl(skb->len);
                        else
-                               lso->c.len =
-                                       htonl(LSO_T5_XFER_SIZE_V(skb->len));
+                               lso->len = htonl(LSO_T5_XFER_SIZE_V(skb->len));
                        cpl = (void *)(lso + 1);
 
                        if (CHELSIO_CHIP_VERSION(adap->params.chip)
@@ -1484,7 +1484,6 @@ out_free: dev_kfree_skb_any(skb);
                q->tso++;
                q->tx_cso += ssi->gso_segs;
        } else {
-               len += sizeof(*cpl);
                if (ptp_enabled)
                        op = FW_PTP_TX_PKT_WR;
                else
@@ -1538,7 +1537,7 @@ out_free: dev_kfree_skb_any(skb);
                if (last_desc >= q->q.size)
                        last_desc -= q->q.size;
                q->q.sdesc[last_desc].skb = skb;
-               q->q.sdesc[last_desc].sgl = (struct ulptx_sgl *)(cpl + 1);
+               q->q.sdesc[last_desc].sgl = (struct ulptx_sgl *)sgl;
        }
 
        txq_advance(&q->q, ndesc);