Commit e931a173 authored by David S. Miller's avatar David S. Miller
Browse files

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: default avatarDavid S. Miller <davem@davemloft.net>
parents 4eb0c285 409e8ec8
Loading
Loading
Loading
Loading
+23 −4
Original line number Diff line number Diff line
@@ -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);
	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;

	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++;
		}