Commit 4099e012 authored by David S. Miller's avatar David S. Miller

niu: Add GRO support.

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 129dd967
...@@ -3441,7 +3441,8 @@ static int niu_rx_pkt_ignore(struct niu *np, struct rx_ring_info *rp) ...@@ -3441,7 +3441,8 @@ static int niu_rx_pkt_ignore(struct niu *np, struct rx_ring_info *rp)
return num_rcr; return num_rcr;
} }
static int niu_process_rx_pkt(struct niu *np, struct rx_ring_info *rp) static int niu_process_rx_pkt(struct napi_struct *napi, struct niu *np,
struct rx_ring_info *rp)
{ {
unsigned int index = rp->rcr_index; unsigned int index = rp->rcr_index;
struct sk_buff *skb; struct sk_buff *skb;
...@@ -3518,7 +3519,7 @@ static int niu_process_rx_pkt(struct niu *np, struct rx_ring_info *rp) ...@@ -3518,7 +3519,7 @@ static int niu_process_rx_pkt(struct niu *np, struct rx_ring_info *rp)
skb->protocol = eth_type_trans(skb, np->dev); skb->protocol = eth_type_trans(skb, np->dev);
skb_record_rx_queue(skb, rp->rx_channel); skb_record_rx_queue(skb, rp->rx_channel);
netif_receive_skb(skb); napi_gro_receive(napi, skb);
return num_rcr; return num_rcr;
} }
...@@ -3706,7 +3707,8 @@ static inline void niu_sync_rx_discard_stats(struct niu *np, ...@@ -3706,7 +3707,8 @@ static inline void niu_sync_rx_discard_stats(struct niu *np,
} }
} }
static int niu_rx_work(struct niu *np, struct rx_ring_info *rp, int budget) static int niu_rx_work(struct napi_struct *napi, struct niu *np,
struct rx_ring_info *rp, int budget)
{ {
int qlen, rcr_done = 0, work_done = 0; int qlen, rcr_done = 0, work_done = 0;
struct rxdma_mailbox *mbox = rp->mbox; 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,7 +3730,7 @@ static int niu_rx_work(struct niu *np, struct rx_ring_info *rp, int budget)
rcr_done = work_done = 0; rcr_done = work_done = 0;
qlen = min(qlen, budget); qlen = min(qlen, budget);
while (work_done < qlen) { while (work_done < qlen) {
rcr_done += niu_process_rx_pkt(np, rp); rcr_done += niu_process_rx_pkt(napi, np, rp);
work_done++; work_done++;
} }
...@@ -3776,7 +3778,7 @@ static int niu_poll_core(struct niu *np, struct niu_ldg *lp, int budget) ...@@ -3776,7 +3778,7 @@ static int niu_poll_core(struct niu *np, struct niu_ldg *lp, int budget)
if (rx_vec & (1 << rp->rx_channel)) { if (rx_vec & (1 << rp->rx_channel)) {
int this_work_done; int this_work_done;
this_work_done = niu_rx_work(np, rp, this_work_done = niu_rx_work(&lp->napi, np, rp,
budget); budget);
budget -= this_work_done; budget -= this_work_done;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment