diff options
Diffstat (limited to 'drivers/net/r8169.c')
-rw-r--r-- | drivers/net/r8169.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index 56a11e29af0b..54900332f12d 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c | |||
@@ -1076,7 +1076,12 @@ static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc, | |||
1076 | int ret; | 1076 | int ret; |
1077 | 1077 | ||
1078 | if (vlgrp && (opts2 & RxVlanTag)) { | 1078 | if (vlgrp && (opts2 & RxVlanTag)) { |
1079 | __vlan_hwaccel_rx(skb, vlgrp, swab16(opts2 & 0xffff), polling); | 1079 | u16 vtag = swab16(opts2 & 0xffff); |
1080 | |||
1081 | if (likely(polling)) | ||
1082 | vlan_gro_receive(&tp->napi, vlgrp, vtag, skb); | ||
1083 | else | ||
1084 | __vlan_hwaccel_rx(skb, vlgrp, vtag, polling); | ||
1080 | ret = 0; | 1085 | ret = 0; |
1081 | } else | 1086 | } else |
1082 | ret = -1; | 1087 | ret = -1; |
@@ -3186,6 +3191,7 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
3186 | #ifdef CONFIG_R8169_VLAN | 3191 | #ifdef CONFIG_R8169_VLAN |
3187 | dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; | 3192 | dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; |
3188 | #endif | 3193 | #endif |
3194 | dev->features |= NETIF_F_GRO; | ||
3189 | 3195 | ||
3190 | tp->intr_mask = 0xffff; | 3196 | tp->intr_mask = 0xffff; |
3191 | tp->align = cfg->align; | 3197 | tp->align = cfg->align; |
@@ -4561,7 +4567,7 @@ static int rtl8169_rx_interrupt(struct net_device *dev, | |||
4561 | 4567 | ||
4562 | if (rtl8169_rx_vlan_skb(tp, desc, skb, polling) < 0) { | 4568 | if (rtl8169_rx_vlan_skb(tp, desc, skb, polling) < 0) { |
4563 | if (likely(polling)) | 4569 | if (likely(polling)) |
4564 | netif_receive_skb(skb); | 4570 | napi_gro_receive(&tp->napi, skb); |
4565 | else | 4571 | else |
4566 | netif_rx(skb); | 4572 | netif_rx(skb); |
4567 | } | 4573 | } |