diff options
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/sky2.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index 194e5cf8c763..a6ff113d34bb 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c | |||
@@ -2520,24 +2520,27 @@ static inline void sky2_tx_done(struct net_device *dev, u16 last) | |||
2520 | } | 2520 | } |
2521 | } | 2521 | } |
2522 | 2522 | ||
2523 | static inline void sky2_skb_rx(const struct sky2_port *sky2, | 2523 | static inline void sky2_skb_rx(struct napi_struct *napi, |
2524 | const struct sky2_port *sky2, | ||
2524 | u32 status, struct sk_buff *skb) | 2525 | u32 status, struct sk_buff *skb) |
2525 | { | 2526 | { |
2526 | #ifdef SKY2_VLAN_TAG_USED | 2527 | #ifdef SKY2_VLAN_TAG_USED |
2527 | u16 vlan_tag = be16_to_cpu(sky2->rx_tag); | ||
2528 | if (sky2->vlgrp && (status & GMR_FS_VLAN)) { | 2528 | if (sky2->vlgrp && (status & GMR_FS_VLAN)) { |
2529 | if (skb->ip_summed == CHECKSUM_NONE) | 2529 | u16 vlan_tag = be16_to_cpu(sky2->rx_tag); |
2530 | |||
2531 | if (skb->ip_summed == CHECKSUM_NONE || | ||
2532 | sky2->netdev != napi->dev) | ||
2530 | vlan_hwaccel_receive_skb(skb, sky2->vlgrp, vlan_tag); | 2533 | vlan_hwaccel_receive_skb(skb, sky2->vlgrp, vlan_tag); |
2531 | else | 2534 | else |
2532 | vlan_gro_receive(&sky2->hw->napi, sky2->vlgrp, | 2535 | vlan_gro_receive(napi, sky2->vlgrp, vlan_tag, skb); |
2533 | vlan_tag, skb); | ||
2534 | return; | 2536 | return; |
2535 | } | 2537 | } |
2536 | #endif | 2538 | #endif |
2537 | if (skb->ip_summed == CHECKSUM_NONE) | 2539 | if (skb->ip_summed == CHECKSUM_NONE || |
2540 | sky2->netdev != napi->dev) | ||
2538 | netif_receive_skb(skb); | 2541 | netif_receive_skb(skb); |
2539 | else | 2542 | else |
2540 | napi_gro_receive(&sky2->hw->napi, skb); | 2543 | napi_gro_receive(napi, skb); |
2541 | } | 2544 | } |
2542 | 2545 | ||
2543 | static inline void sky2_rx_done(struct sky2_hw *hw, unsigned port, | 2546 | static inline void sky2_rx_done(struct sky2_hw *hw, unsigned port, |
@@ -2638,7 +2641,7 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do, u16 idx) | |||
2638 | 2641 | ||
2639 | skb->protocol = eth_type_trans(skb, dev); | 2642 | skb->protocol = eth_type_trans(skb, dev); |
2640 | 2643 | ||
2641 | sky2_skb_rx(sky2, status, skb); | 2644 | sky2_skb_rx(&hw->napi, sky2, status, skb); |
2642 | 2645 | ||
2643 | /* Stop after net poll weight */ | 2646 | /* Stop after net poll weight */ |
2644 | if (++work_done >= to_do) | 2647 | if (++work_done >= to_do) |