cxgb4: copy the length of cpl_tx_pkt_core to fw_wr
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>
This commit is contained in:
parent
6c541b4595
commit
a6076fcd18
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user