diff options
Diffstat (limited to 'drivers/net/ethernet/ti')
| -rw-r--r-- | drivers/net/ethernet/ti/davinci_cpdma.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/ti/davinci_emac.c | 8 | 
2 files changed, 10 insertions, 0 deletions
diff --git a/drivers/net/ethernet/ti/davinci_cpdma.c b/drivers/net/ethernet/ti/davinci_cpdma.c index dca9d3369cd..c97d2f59085 100644 --- a/drivers/net/ethernet/ti/davinci_cpdma.c +++ b/drivers/net/ethernet/ti/davinci_cpdma.c @@ -836,11 +836,13 @@ int cpdma_chan_stop(struct cpdma_chan *chan)  	chan_write(chan, cp, CPDMA_TEARDOWN_VALUE);  	/* handle completed packets */ +	spin_unlock_irqrestore(&chan->lock, flags);  	do {  		ret = __cpdma_chan_process(chan);  		if (ret < 0)  			break;  	} while ((ret & CPDMA_DESC_TD_COMPLETE) == 0); +	spin_lock_irqsave(&chan->lock, flags);  	/* remaining packets haven't been tx/rx'ed, clean them up */  	while (chan->head) { diff --git a/drivers/net/ethernet/ti/davinci_emac.c b/drivers/net/ethernet/ti/davinci_emac.c index 815c7970261..794ac30a577 100644 --- a/drivers/net/ethernet/ti/davinci_emac.c +++ b/drivers/net/ethernet/ti/davinci_emac.c @@ -115,6 +115,7 @@ static const char emac_version_string[] = "TI DaVinci EMAC Linux v6.1";  #define EMAC_DEF_TX_CH			(0) /* Default 0th channel */  #define EMAC_DEF_RX_CH			(0) /* Default 0th channel */  #define EMAC_DEF_RX_NUM_DESC		(128) +#define EMAC_DEF_TX_NUM_DESC		(128)  #define EMAC_DEF_MAX_TX_CH		(1) /* Max TX channels configured */  #define EMAC_DEF_MAX_RX_CH		(1) /* Max RX channels configured */  #define EMAC_POLL_WEIGHT		(64) /* Default NAPI poll weight */ @@ -336,6 +337,7 @@ struct emac_priv {  	u32 mac_hash2;  	u32 multicast_hash_cnt[EMAC_NUM_MULTICAST_BITS];  	u32 rx_addr_type; +	atomic_t cur_tx;  	const char *phy_id;  	struct phy_device *phydev;  	spinlock_t lock; @@ -1044,6 +1046,9 @@ static void emac_tx_handler(void *token, int len, int status)  {  	struct sk_buff		*skb = token;  	struct net_device	*ndev = skb->dev; +	struct emac_priv	*priv = netdev_priv(ndev); + +	atomic_dec(&priv->cur_tx);  	if (unlikely(netif_queue_stopped(ndev)))  		netif_start_queue(ndev); @@ -1092,6 +1097,9 @@ static int emac_dev_xmit(struct sk_buff *skb, struct net_device *ndev)  		goto fail_tx;  	} +	if (atomic_inc_return(&priv->cur_tx) >= EMAC_DEF_TX_NUM_DESC) +		netif_stop_queue(ndev); +  	return NETDEV_TX_OK;  fail_tx:  |