summaryrefslogtreecommitdiff
path: root/target/linux
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2013-03-10 18:25:11 +0000
committerFelix Fietkau <nbd@openwrt.org>2013-03-10 18:25:11 +0000
commitc1adc793282fe8e81bf893cda1202653e0f736e8 (patch)
treed73e7fb374335a5e1539aa31638c71c81e0a6f4b /target/linux
parent9a71711d399475de130b91809d9c54fb4670ee93 (diff)
downloadmtk-20170518-c1adc793282fe8e81bf893cda1202653e0f736e8.zip
mtk-20170518-c1adc793282fe8e81bf893cda1202653e0f736e8.tar.gz
mtk-20170518-c1adc793282fe8e81bf893cda1202653e0f736e8.tar.bz2
cns3xxx: fix ethernet driver memory barrier usage
SVN-Revision: 35941
Diffstat (limited to 'target/linux')
-rw-r--r--target/linux/cns3xxx/files/drivers/net/ethernet/cavium/cns3xxx_eth.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/target/linux/cns3xxx/files/drivers/net/ethernet/cavium/cns3xxx_eth.c b/target/linux/cns3xxx/files/drivers/net/ethernet/cavium/cns3xxx_eth.c
index d554c40..7ffff68 100644
--- a/target/linux/cns3xxx/files/drivers/net/ethernet/cavium/cns3xxx_eth.c
+++ b/target/linux/cns3xxx/files/drivers/net/ethernet/cavium/cns3xxx_eth.c
@@ -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)
- 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);
- goto out;
+ break;
}
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;
@@ -543,7 +545,7 @@ static void cns3xxx_alloc_rx_buf(struct sw *sw, int received)
desc++;
}
}
-out:
+
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);
}
+ wmb();
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;
- mb();
+ wmb();
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);
- mb();
+ wmb();
spin_lock(&tx_lock);
tx_ring->num_used += nr_desc + 1;