|
@@ -1395,10 +1395,13 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota)
|
|
|
|
|
|
int entry = mdp->cur_rx % mdp->num_rx_ring;
|
|
|
int boguscnt = (mdp->dirty_rx + mdp->num_rx_ring) - mdp->cur_rx;
|
|
|
+ int limit;
|
|
|
struct sk_buff *skb;
|
|
|
u16 pkt_len = 0;
|
|
|
u32 desc_status;
|
|
|
|
|
|
+ boguscnt = min(boguscnt, *quota);
|
|
|
+ limit = boguscnt;
|
|
|
rxdesc = &mdp->rx_ring[entry];
|
|
|
while (!(rxdesc->status & cpu_to_edmac(mdp, RD_RACT))) {
|
|
|
desc_status = edmac_to_cpu(mdp, rxdesc->status);
|
|
@@ -1407,11 +1410,6 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota)
|
|
|
if (--boguscnt < 0)
|
|
|
break;
|
|
|
|
|
|
- if (*quota <= 0)
|
|
|
- break;
|
|
|
-
|
|
|
- (*quota)--;
|
|
|
-
|
|
|
if (!(desc_status & RDFEND))
|
|
|
ndev->stats.rx_length_errors++;
|
|
|
|
|
@@ -1502,6 +1500,8 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota)
|
|
|
sh_eth_write(ndev, EDRRR_R, EDRRR);
|
|
|
}
|
|
|
|
|
|
+ *quota -= limit - boguscnt - 1;
|
|
|
+
|
|
|
return *quota <= 0;
|
|
|
}
|
|
|
|