int ret;
 
        if (vlgrp && (opts2 & RxVlanTag)) {
-               __vlan_hwaccel_rx(skb, vlgrp, swab16(opts2 & 0xffff), polling);
+               u16 vtag = swab16(opts2 & 0xffff);
+
+               if (likely(polling))
+                       vlan_gro_receive(&tp->napi, vlgrp, vtag, skb);
+               else
+                       __vlan_hwaccel_rx(skb, vlgrp, vtag, polling);
                ret = 0;
        } else
                ret = -1;
 #ifdef CONFIG_R8169_VLAN
        dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
 #endif
+       dev->features |= NETIF_F_GRO;
 
        tp->intr_mask = 0xffff;
        tp->align = cfg->align;
 
                        if (rtl8169_rx_vlan_skb(tp, desc, skb, polling) < 0) {
                                if (likely(polling))
-                                       netif_receive_skb(skb);
+                                       napi_gro_receive(&tp->napi, skb);
                                else
                                        netif_rx(skb);
                        }