X-Git-Url: http://git.openwrt.org/?p=openwrt%2Fsvn-archive%2Farchive.git;a=blobdiff_plain;f=target%2Flinux%2Fcns3xxx%2Ffiles%2Fdrivers%2Fnet%2Fethernet%2Fcavium%2Fcns3xxx_eth.c;h=7ffff684de337f524b9dd453a14a2187e1e2b5a8;hp=d554c40e7f73849b531f2bb07dd06730a309660f;hb=cbb965a7da7a27018ed89579266dcf375a811af5;hpb=343a8a4980c45349fcb9698edfe32da0c8131302 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 d554c40e7f..7ffff684de 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;