diff options
author | David S. Miller <davem@davemloft.net> | 2009-03-29 04:39:41 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-03-29 04:39:41 -0400 |
commit | 4099e01224e2afcaeea439cd92db3e7cf6e0f84f (patch) | |
tree | cb733ec9ab8eff25ccf1f231644ce190a92122a1 | |
parent | 129dd9677b30a07bb832247dfe8d6089f1ac61a0 (diff) |
niu: Add GRO support.
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/niu.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/drivers/net/niu.c b/drivers/net/niu.c index 50c11126a3db..02c37e2f08a9 100644 --- a/drivers/net/niu.c +++ b/drivers/net/niu.c | |||
@@ -3441,7 +3441,8 @@ static int niu_rx_pkt_ignore(struct niu *np, struct rx_ring_info *rp) | |||
3441 | return num_rcr; | 3441 | return num_rcr; |
3442 | } | 3442 | } |
3443 | 3443 | ||
3444 | static int niu_process_rx_pkt(struct niu *np, struct rx_ring_info *rp) | 3444 | static int niu_process_rx_pkt(struct napi_struct *napi, struct niu *np, |
3445 | struct rx_ring_info *rp) | ||
3445 | { | 3446 | { |
3446 | unsigned int index = rp->rcr_index; | 3447 | unsigned int index = rp->rcr_index; |
3447 | struct sk_buff *skb; | 3448 | struct sk_buff *skb; |
@@ -3518,7 +3519,7 @@ static int niu_process_rx_pkt(struct niu *np, struct rx_ring_info *rp) | |||
3518 | 3519 | ||
3519 | skb->protocol = eth_type_trans(skb, np->dev); | 3520 | skb->protocol = eth_type_trans(skb, np->dev); |
3520 | skb_record_rx_queue(skb, rp->rx_channel); | 3521 | skb_record_rx_queue(skb, rp->rx_channel); |
3521 | netif_receive_skb(skb); | 3522 | napi_gro_receive(napi, skb); |
3522 | 3523 | ||
3523 | return num_rcr; | 3524 | return num_rcr; |
3524 | } | 3525 | } |
@@ -3706,7 +3707,8 @@ static inline void niu_sync_rx_discard_stats(struct niu *np, | |||
3706 | } | 3707 | } |
3707 | } | 3708 | } |
3708 | 3709 | ||
3709 | static int niu_rx_work(struct niu *np, struct rx_ring_info *rp, int budget) | 3710 | static int niu_rx_work(struct napi_struct *napi, struct niu *np, |
3711 | struct rx_ring_info *rp, int budget) | ||
3710 | { | 3712 | { |
3711 | int qlen, rcr_done = 0, work_done = 0; | 3713 | int qlen, rcr_done = 0, work_done = 0; |
3712 | struct rxdma_mailbox *mbox = rp->mbox; | 3714 | struct rxdma_mailbox *mbox = rp->mbox; |
@@ -3728,7 +3730,7 @@ static int niu_rx_work(struct niu *np, struct rx_ring_info *rp, int budget) | |||
3728 | rcr_done = work_done = 0; | 3730 | rcr_done = work_done = 0; |
3729 | qlen = min(qlen, budget); | 3731 | qlen = min(qlen, budget); |
3730 | while (work_done < qlen) { | 3732 | while (work_done < qlen) { |
3731 | rcr_done += niu_process_rx_pkt(np, rp); | 3733 | rcr_done += niu_process_rx_pkt(napi, np, rp); |
3732 | work_done++; | 3734 | work_done++; |
3733 | } | 3735 | } |
3734 | 3736 | ||
@@ -3776,7 +3778,7 @@ static int niu_poll_core(struct niu *np, struct niu_ldg *lp, int budget) | |||
3776 | if (rx_vec & (1 << rp->rx_channel)) { | 3778 | if (rx_vec & (1 << rp->rx_channel)) { |
3777 | int this_work_done; | 3779 | int this_work_done; |
3778 | 3780 | ||
3779 | this_work_done = niu_rx_work(np, rp, | 3781 | this_work_done = niu_rx_work(&lp->napi, np, rp, |
3780 | budget); | 3782 | budget); |
3781 | 3783 | ||
3782 | budget -= this_work_done; | 3784 | budget -= this_work_done; |