[mcs814x] nuport-mac: close possible race condition during start
[openwrt/svn-archive/archive.git] / target / linux / mcs814x / files-3.3 / drivers / net / ethernet / mcs8140 / nuport_mac.c
index 38dbe1ee7d06b7ffd9ed8f4f62a5739f2c6fd92c..8cd3d0e6b6ea42edc773f998452d454aa482eb89 100644 (file)
@@ -688,6 +688,10 @@ static void nuport_mac_free_rx_ring(struct nuport_mac_priv *priv)
                dev_kfree_skb(priv->rx_skb[i]);
                priv->rx_skb[i] = NULL;
        }
+
+       if (priv->rx_addr)
+               dma_unmap_single(&priv->pdev->dev, priv->rx_addr, RX_ALLOC_SIZE,
+                               DMA_TO_DEVICE);
 }
 
 static void nuport_mac_read_mac_address(struct net_device *dev)
@@ -805,7 +809,11 @@ static int nuport_mac_open(struct net_device *dev)
        nuport_mac_reset_rx_dma(priv);
 
        /* Start RX DMA */
-       return nuport_mac_start_rx_dma(priv, priv->rx_skb[0]);
+       spin_lock_irqsave(&priv->lock, flags);
+       ret = nuport_mac_start_rx_dma(priv, priv->rx_skb[0]);
+       spin_unlock_irqrestore(&priv->lock, flags);
+
+       return ret;
 
 out_rx_skb:
        nuport_mac_free_rx_ring(priv);