diff options
Diffstat (limited to 'drivers/net/ethernet/ibm/emac')
| -rw-r--r-- | drivers/net/ethernet/ibm/emac/mal.c | 16 | 
1 files changed, 8 insertions, 8 deletions
| diff --git a/drivers/net/ethernet/ibm/emac/mal.c b/drivers/net/ethernet/ibm/emac/mal.c index dac564c25440..e7847510eda2 100644 --- a/drivers/net/ethernet/ibm/emac/mal.c +++ b/drivers/net/ethernet/ibm/emac/mal.c @@ -263,7 +263,9 @@ static inline void mal_schedule_poll(struct mal_instance *mal)  {  	if (likely(napi_schedule_prep(&mal->napi))) {  		MAL_DBG2(mal, "schedule_poll" NL); +		spin_lock(&mal->lock);  		mal_disable_eob_irq(mal); +		spin_unlock(&mal->lock);  		__napi_schedule(&mal->napi);  	} else  		MAL_DBG2(mal, "already in poll" NL); @@ -442,15 +444,13 @@ static int mal_poll(struct napi_struct *napi, int budget)  		if (unlikely(mc->ops->peek_rx(mc->dev) ||  			     test_bit(MAL_COMMAC_RX_STOPPED, &mc->flags))) {  			MAL_DBG2(mal, "rotting packet" NL); -			if (napi_reschedule(napi)) -				mal_disable_eob_irq(mal); -			else -				MAL_DBG2(mal, "already in poll list" NL); - -			if (budget > 0) -				goto again; -			else +			if (!napi_reschedule(napi))  				goto more_work; + +			spin_lock_irqsave(&mal->lock, flags); +			mal_disable_eob_irq(mal); +			spin_unlock_irqrestore(&mal->lock, flags); +			goto again;  		}  		mc->ops->poll_tx(mc->dev);  	} |