if ((cqe->status & cpu_to_be16(MLX4_CQE_STATUS_IPOK)) &&
                            (cqe->checksum == cpu_to_be16(0xffff))) {
                                ring->csum_ok++;
-                               /* This packet is eligible for GRO if it is:
-                                * - DIX Ethernet (type interpretation)
-                                * - TCP/IP (v4)
-                                * - without IP options
-                                * - not an IP fragment
-                                * - no LLS polling in progress
-                                */
-                               if (!mlx4_en_cq_busy_polling(cq) &&
-                                   (dev->features & NETIF_F_GRO)) {
-                                       struct sk_buff *gro_skb = napi_get_frags(&cq->napi);
-                                       if (!gro_skb)
-                                               goto next;
-
-                                       nr = mlx4_en_complete_rx_desc(priv,
-                                               rx_desc, frags, gro_skb,
-                                               length);
-                                       if (!nr)
-                                               goto next;
-
-                                       skb_shinfo(gro_skb)->nr_frags = nr;
-                                       gro_skb->len = length;
-                                       gro_skb->data_len = length;
-                                       gro_skb->ip_summed = CHECKSUM_UNNECESSARY;
-
-                                       if (l2_tunnel)
-                                               gro_skb->csum_level = 1;
-                                       if ((cqe->vlan_my_qpn &
-                                           cpu_to_be32(MLX4_CQE_VLAN_PRESENT_MASK)) &&
-                                           (dev->features & NETIF_F_HW_VLAN_CTAG_RX)) {
-                                               u16 vid = be16_to_cpu(cqe->sl_vid);
-
-                                               __vlan_hwaccel_put_tag(gro_skb, htons(ETH_P_8021Q), vid);
-                                       }
-
-                                       if (dev->features & NETIF_F_RXHASH)
-                                               skb_set_hash(gro_skb,
-                                                            be32_to_cpu(cqe->immed_rss_invalid),
-                                                            PKT_HASH_TYPE_L3);
-
-                                       skb_record_rx_queue(gro_skb, cq->ring);
-                                       skb_mark_napi_id(gro_skb, &cq->napi);
-
-                                       if (ring->hwtstamp_rx_filter == HWTSTAMP_FILTER_ALL) {
-                                               timestamp = mlx4_en_get_cqe_ts(cqe);
-                                               mlx4_en_fill_hwtstamps(mdev,
-                                                                      skb_hwtstamps(gro_skb),
-                                                                      timestamp);
-                                       }
-
-                                       napi_gro_frags(&cq->napi);
-                                       goto next;
-                               }
-
-                               /* GRO not possible, complete processing here */
                                ip_summed = CHECKSUM_UNNECESSARY;
                        } else {
                                ip_summed = CHECKSUM_NONE;
                        ring->csum_none++;
                }
 
+               /* This packet is eligible for GRO if it is:
+                * - DIX Ethernet (type interpretation)
+                * - TCP/IP (v4)
+                * - without IP options
+                * - not an IP fragment
+                * - no LLS polling in progress
+                */
+               if (!mlx4_en_cq_busy_polling(cq) &&
+                   (dev->features & NETIF_F_GRO)) {
+                       struct sk_buff *gro_skb = napi_get_frags(&cq->napi);
+                       if (!gro_skb)
+                               goto next;
+
+                       nr = mlx4_en_complete_rx_desc(priv,
+                               rx_desc, frags, gro_skb,
+                               length);
+                       if (!nr)
+                               goto next;
+
+                       skb_shinfo(gro_skb)->nr_frags = nr;
+                       gro_skb->len = length;
+                       gro_skb->data_len = length;
+                       gro_skb->ip_summed = ip_summed;
+
+                       if (l2_tunnel && ip_summed == CHECKSUM_UNNECESSARY)
+                               gro_skb->encapsulation = 1;
+                       if ((cqe->vlan_my_qpn &
+                           cpu_to_be32(MLX4_CQE_VLAN_PRESENT_MASK)) &&
+                           (dev->features & NETIF_F_HW_VLAN_CTAG_RX)) {
+                               u16 vid = be16_to_cpu(cqe->sl_vid);
+
+                               __vlan_hwaccel_put_tag(gro_skb, htons(ETH_P_8021Q), vid);
+                       }
+
+                       if (dev->features & NETIF_F_RXHASH)
+                               skb_set_hash(gro_skb,
+                                            be32_to_cpu(cqe->immed_rss_invalid),
+                                            PKT_HASH_TYPE_L3);
+
+                       skb_record_rx_queue(gro_skb, cq->ring);
+                       skb_mark_napi_id(gro_skb, &cq->napi);
+
+                       if (ring->hwtstamp_rx_filter == HWTSTAMP_FILTER_ALL) {
+                               timestamp = mlx4_en_get_cqe_ts(cqe);
+                               mlx4_en_fill_hwtstamps(mdev,
+                                                      skb_hwtstamps(gro_skb),
+                                                      timestamp);
+                       }
+
+                       napi_gro_frags(&cq->napi);
+                       goto next;
+               }
+
+               /* GRO not possible, complete processing here */
                skb = mlx4_en_rx_skb(priv, rx_desc, frags, length);
                if (!skb) {
                        priv->stats.rx_dropped++;