From: Francois Romieu return 1 in start_xmit() when the required descriptors are not available and wait for more room. Signed-off-by: Francois Romieu Signed-off-by: Andrew Morton --- 25-akpm/drivers/net/r8169.c | 12 +++++++----- 1 files changed, 7 insertions(+), 5 deletions(-) diff -puN drivers/net/r8169.c~r8169-hint-for-tx-flow-control drivers/net/r8169.c --- 25/drivers/net/r8169.c~r8169-hint-for-tx-flow-control Thu Sep 9 16:08:43 2004 +++ 25-akpm/drivers/net/r8169.c Thu Sep 9 16:08:43 2004 @@ -1768,15 +1768,16 @@ static int rtl8169_start_xmit(struct sk_ dma_addr_t mapping; u32 status, len; u32 opts1; + int ret = 0; if (unlikely(TX_BUFFS_AVAIL(tp) < skb_shinfo(skb)->nr_frags)) { printk(KERN_ERR PFX "%s: BUG! Tx Ring full when queue awake!\n", dev->name); - return 1; + goto err_stop; } if (unlikely(le32_to_cpu(txd->opts1) & DescOwn)) - goto err_drop; + goto err_stop; opts1 = DescOwn | rtl8169_tx_csum(skb); @@ -1826,10 +1827,11 @@ static int rtl8169_start_xmit(struct sk_ } out: - return 0; + return ret; -err_drop: - dev_kfree_skb(skb); +err_stop: + netif_stop_queue(dev); + ret = 1; err_update_stats: tp->stats.tx_dropped++; goto out; _