ramips: fix tx bql related race condition in the ethernet driver

Signed-off-by: Felix Fietkau <nbd@openwrt.org>

SVN-Revision: 43995
master
Felix Fietkau 10 years ago
parent 748d452899
commit 00db07be58
  1. 9
      target/linux/ramips/files/drivers/net/ethernet/ralink/ralink_soc_eth.c

@ -568,6 +568,9 @@ static int fe_tx_map_dma(struct sk_buff *skb, struct net_device *dev,
/* store skb to cleanup */ /* store skb to cleanup */
priv->tx_skb[j] = skb; priv->tx_skb[j] = skb;
netdev_sent_queue(dev, skb->len);
skb_tx_timestamp(skb);
wmb(); wmb();
j = NEXT_TX_DESP_IDX(j); j = NEXT_TX_DESP_IDX(j);
fe_reg_w32(j, FE_REG_TX_CTX_IDX0); fe_reg_w32(j, FE_REG_TX_CTX_IDX0);
@ -646,6 +649,7 @@ static int fe_start_xmit(struct sk_buff *skb, struct net_device *dev)
struct net_device_stats *stats = &dev->stats; struct net_device_stats *stats = &dev->stats;
u32 tx; u32 tx;
int tx_num; int tx_num;
int len = skb->len;
if (fe_skb_padto(skb, priv)) { if (fe_skb_padto(skb, priv)) {
netif_warn(priv, tx_err, dev, "tx padding failed!\n"); netif_warn(priv, tx_err, dev, "tx padding failed!\n");
@ -669,11 +673,8 @@ static int fe_start_xmit(struct sk_buff *skb, struct net_device *dev)
stats->tx_dropped++; stats->tx_dropped++;
} else { } else {
netdev_sent_queue(dev, skb->len);
skb_tx_timestamp(skb);
stats->tx_packets++; stats->tx_packets++;
stats->tx_bytes += skb->len; stats->tx_bytes += len;
} }
spin_unlock(&priv->page_lock); spin_unlock(&priv->page_lock);

Loading…
Cancel
Save