diff options
Diffstat (limited to 'drivers/net/macb.c')
| -rw-r--r-- | drivers/net/macb.c | 28 | 
1 files changed, 6 insertions, 22 deletions
diff --git a/drivers/net/macb.c b/drivers/net/macb.c index 46073de290c..e82aee41d77 100644 --- a/drivers/net/macb.c +++ b/drivers/net/macb.c @@ -316,10 +316,11 @@ static void macb_tx(struct macb *bp)  	dev_dbg(&bp->pdev->dev, "macb_tx status = %02lx\n",  		(unsigned long)status); -	if (status & MACB_BIT(UND)) { +	if (status & (MACB_BIT(UND) | MACB_BIT(TSR_RLE))) {  		int i; -		printk(KERN_ERR "%s: TX underrun, resetting buffers\n", -			bp->dev->name); +		printk(KERN_ERR "%s: TX %s, resetting buffers\n", +			bp->dev->name, status & MACB_BIT(UND) ? +			"underrun" : "retry limit exceeded");  		/* Transfer ongoing, disable transmitter, to avoid confusion */  		if (status & MACB_BIT(TGO)) @@ -520,27 +521,10 @@ static int macb_poll(struct napi_struct *napi, int budget)  	macb_writel(bp, RSR, status);  	work_done = 0; -	if (!status) { -		/* -		 * This may happen if an interrupt was pending before -		 * this function was called last time, and no packets -		 * have been received since. -		 */ -		napi_complete(napi); -		goto out; -	}  	dev_dbg(&bp->pdev->dev, "poll: status = %08lx, budget = %d\n",  		(unsigned long)status, budget); -	if (!(status & MACB_BIT(REC))) { -		dev_warn(&bp->pdev->dev, -			 "No RX buffers complete, status = %02lx\n", -			 (unsigned long)status); -		napi_complete(napi); -		goto out; -	} -  	work_done = macb_rx(bp, budget);  	if (work_done < budget)  		napi_complete(napi); @@ -549,7 +533,6 @@ static int macb_poll(struct napi_struct *napi, int budget)  	 * We've done what we can to clean the buffers. Make sure we  	 * get notified when new packets arrive.  	 */ -out:  	macb_writel(bp, IER, MACB_RX_INT_FLAGS);  	/* TODO: Handle errors */ @@ -590,7 +573,8 @@ static irqreturn_t macb_interrupt(int irq, void *dev_id)  			}  		} -		if (status & (MACB_BIT(TCOMP) | MACB_BIT(ISR_TUND))) +		if (status & (MACB_BIT(TCOMP) | MACB_BIT(ISR_TUND) | +			    MACB_BIT(ISR_RLE)))  			macb_tx(bp);  		/*  |