ramips: fix tx bql related race condition in the ethernet driver
authorFelix Fietkau <nbd@openwrt.org>
Sat, 17 Jan 2015 13:13:55 +0000 (13:13 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Sat, 17 Jan 2015 13:13:55 +0000 (13:13 +0000)
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
SVN-Revision: 43995

target/linux/ramips/files/drivers/net/ethernet/ralink/ralink_soc_eth.c

index 67934c61a0ba4f2dab752e6d7eab36dbb651466b..925cc4cc6b6aae65b9696408b1939ceb791a99d2 100644 (file)
@@ -568,6 +568,9 @@ static int fe_tx_map_dma(struct sk_buff *skb, struct net_device *dev,
        /* store skb to cleanup */
        priv->tx_skb[j] = skb;
 
        /* store skb to cleanup */
        priv->tx_skb[j] = skb;
 
+       netdev_sent_queue(dev, skb->len);
+       skb_tx_timestamp(skb);
+
        wmb();
        j = NEXT_TX_DESP_IDX(j);
        fe_reg_w32(j, FE_REG_TX_CTX_IDX0);
        wmb();
        j = NEXT_TX_DESP_IDX(j);
        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;
        u32 tx;
        int tx_num;
        struct net_device_stats *stats = &dev->stats;
        u32 tx;
        int tx_num;
+       int len = skb->len;
 
        if (fe_skb_padto(skb, priv)) {
                netif_warn(priv, tx_err, dev, "tx padding failed!\n");
 
        if (fe_skb_padto(skb, priv)) {
                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++;
        } else {
 
                stats->tx_dropped++;
        } 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);