mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-04 12:16:51 -04:00
Merge branch 'vmxnet3-fixes'
Ronak Doshi says: ==================== vmxnet3: couple of fixes This series fixes following issues: Patch 1: This patch provides a fix to correctly report encapsulated LRO'ed packet. Patch 2: This patch provides a fix to use correct intrConf reference. Changes in v2: - declare generic descriptor to be used - remove white spaces - remove single quote around commit reference in patch 2 - remove if check for encap_lro ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -75,8 +75,14 @@ vmxnet3_enable_all_intrs(struct vmxnet3_adapter *adapter)
|
||||
|
||||
for (i = 0; i < adapter->intr.num_intrs; i++)
|
||||
vmxnet3_enable_intr(adapter, i);
|
||||
adapter->shared->devRead.intrConf.intrCtrl &=
|
||||
if (!VMXNET3_VERSION_GE_6(adapter) ||
|
||||
!adapter->queuesExtEnabled) {
|
||||
adapter->shared->devRead.intrConf.intrCtrl &=
|
||||
cpu_to_le32(~VMXNET3_IC_DISABLE_ALL);
|
||||
} else {
|
||||
adapter->shared->devReadExt.intrConfExt.intrCtrl &=
|
||||
cpu_to_le32(~VMXNET3_IC_DISABLE_ALL);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -85,8 +91,14 @@ vmxnet3_disable_all_intrs(struct vmxnet3_adapter *adapter)
|
||||
{
|
||||
int i;
|
||||
|
||||
adapter->shared->devRead.intrConf.intrCtrl |=
|
||||
if (!VMXNET3_VERSION_GE_6(adapter) ||
|
||||
!adapter->queuesExtEnabled) {
|
||||
adapter->shared->devRead.intrConf.intrCtrl |=
|
||||
cpu_to_le32(VMXNET3_IC_DISABLE_ALL);
|
||||
} else {
|
||||
adapter->shared->devReadExt.intrConfExt.intrCtrl |=
|
||||
cpu_to_le32(VMXNET3_IC_DISABLE_ALL);
|
||||
}
|
||||
for (i = 0; i < adapter->intr.num_intrs; i++)
|
||||
vmxnet3_disable_intr(adapter, i);
|
||||
}
|
||||
@@ -1396,6 +1408,7 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq,
|
||||
};
|
||||
u32 num_pkts = 0;
|
||||
bool skip_page_frags = false;
|
||||
bool encap_lro = false;
|
||||
struct Vmxnet3_RxCompDesc *rcd;
|
||||
struct vmxnet3_rx_ctx *ctx = &rq->rx_ctx;
|
||||
u16 segCnt = 0, mss = 0;
|
||||
@@ -1556,13 +1569,18 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq,
|
||||
if (VMXNET3_VERSION_GE_2(adapter) &&
|
||||
rcd->type == VMXNET3_CDTYPE_RXCOMP_LRO) {
|
||||
struct Vmxnet3_RxCompDescExt *rcdlro;
|
||||
union Vmxnet3_GenericDesc *gdesc;
|
||||
|
||||
rcdlro = (struct Vmxnet3_RxCompDescExt *)rcd;
|
||||
gdesc = (union Vmxnet3_GenericDesc *)rcd;
|
||||
|
||||
segCnt = rcdlro->segCnt;
|
||||
WARN_ON_ONCE(segCnt == 0);
|
||||
mss = rcdlro->mss;
|
||||
if (unlikely(segCnt <= 1))
|
||||
segCnt = 0;
|
||||
encap_lro = (le32_to_cpu(gdesc->dword[0]) &
|
||||
(1UL << VMXNET3_RCD_HDR_INNER_SHIFT));
|
||||
} else {
|
||||
segCnt = 0;
|
||||
}
|
||||
@@ -1630,7 +1648,7 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq,
|
||||
vmxnet3_rx_csum(adapter, skb,
|
||||
(union Vmxnet3_GenericDesc *)rcd);
|
||||
skb->protocol = eth_type_trans(skb, adapter->netdev);
|
||||
if (!rcd->tcp ||
|
||||
if ((!rcd->tcp && !encap_lro) ||
|
||||
!(adapter->netdev->features & NETIF_F_LRO))
|
||||
goto not_lro;
|
||||
|
||||
@@ -1639,7 +1657,7 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq,
|
||||
SKB_GSO_TCPV4 : SKB_GSO_TCPV6;
|
||||
skb_shinfo(skb)->gso_size = mss;
|
||||
skb_shinfo(skb)->gso_segs = segCnt;
|
||||
} else if (segCnt != 0 || skb->len > mtu) {
|
||||
} else if ((segCnt != 0 || skb->len > mtu) && !encap_lro) {
|
||||
u32 hlen;
|
||||
|
||||
hlen = vmxnet3_get_hdr_len(adapter, skb,
|
||||
@@ -1668,6 +1686,7 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq,
|
||||
napi_gro_receive(&rq->napi, skb);
|
||||
|
||||
ctx->skb = NULL;
|
||||
encap_lro = false;
|
||||
num_pkts++;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user