cns3xxx: fix ethernet driver memory barrier usage
[openwrt/svn-archive/archive.git] / target / linux / cns3xxx / files / drivers / net / ethernet / cavium / cns3xxx_eth.c
index d554c40e7f73849b531f2bb07dd06730a309660f..7ffff684de337f524b9dd453a14a2187e1e2b5a8 100644 (file)
@@ -516,18 +516,20 @@ static void cns3xxx_alloc_rx_buf(struct sw *sw, int received)
        for (received += rx_ring->alloc_count; received > 0; received--) {
                buf = kzalloc(RX_SEGMENT_ALLOC_SIZE, GFP_ATOMIC);
                if (!buf)
        for (received += rx_ring->alloc_count; received > 0; received--) {
                buf = kzalloc(RX_SEGMENT_ALLOC_SIZE, GFP_ATOMIC);
                if (!buf)
-                       goto out;
+                       break;
 
                phys = dma_map_single(NULL, buf + SKB_HEAD_ALIGN,
                                      RX_SEGMENT_MRU, DMA_FROM_DEVICE);
                if (dma_mapping_error(NULL, phys)) {
                        kfree(buf);
 
                phys = dma_map_single(NULL, buf + SKB_HEAD_ALIGN,
                                      RX_SEGMENT_MRU, DMA_FROM_DEVICE);
                if (dma_mapping_error(NULL, phys)) {
                        kfree(buf);
-                       goto out;
+                       break;
                }
 
                desc->sdl = RX_SEGMENT_MRU;
                desc->sdp = phys;
 
                }
 
                desc->sdl = RX_SEGMENT_MRU;
                desc->sdp = phys;
 
+               wmb();
+
                /* put the new buffer on RX-free queue */
                rx_ring->buff_tab[i] = buf;
                rx_ring->phys_tab[i] = phys;
                /* put the new buffer on RX-free queue */
                rx_ring->buff_tab[i] = buf;
                rx_ring->phys_tab[i] = phys;
@@ -543,7 +545,7 @@ static void cns3xxx_alloc_rx_buf(struct sw *sw, int received)
                        desc++;
                }
        }
                        desc++;
                }
        }
-out:
+
        rx_ring->alloc_count = received;
        rx_ring->alloc_index = i;
 }
        rx_ring->alloc_count = received;
        rx_ring->alloc_index = i;
 }
@@ -713,6 +715,7 @@ static int eth_poll(struct napi_struct *napi, int budget)
                enable_irq(IRQ_CNS3XXX_SW_R0RXC);
        }
 
                enable_irq(IRQ_CNS3XXX_SW_R0RXC);
        }
 
+       wmb();
        enable_rx_dma(sw);
 
        spin_lock_bh(&tx_lock);
        enable_rx_dma(sw);
 
        spin_lock_bh(&tx_lock);
@@ -739,7 +742,7 @@ static void eth_set_desc(struct _tx_ring *tx_ring, int index, int index_last,
        if (index == index_last)
                config0 |= LAST_SEGMENT;
 
        if (index == index_last)
                config0 |= LAST_SEGMENT;
 
-       mb();
+       wmb();
        tx_desc->config0 = config0;
 }
 
        tx_desc->config0 = config0;
 }
 
@@ -812,7 +815,7 @@ static int eth_xmit(struct sk_buff *skb, struct net_device *dev)
        eth_set_desc(tx_ring, index0, index_last, skb->data, len0,
                     config0 | FIRST_SEGMENT, pmap);
 
        eth_set_desc(tx_ring, index0, index_last, skb->data, len0,
                     config0 | FIRST_SEGMENT, pmap);
 
-       mb();
+       wmb();
 
        spin_lock(&tx_lock);
        tx_ring->num_used += nr_desc + 1;
 
        spin_lock(&tx_lock);
        tx_ring->num_used += nr_desc + 1;