aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/pasemi_mac.c21
1 files changed, 8 insertions, 13 deletions
diff --git a/drivers/net/pasemi_mac.c b/drivers/net/pasemi_mac.c
index 643fce860e5c..c2d34a804d40 100644
--- a/drivers/net/pasemi_mac.c
+++ b/drivers/net/pasemi_mac.c
@@ -370,23 +370,18 @@ static void pasemi_mac_free_rx_resources(struct net_device *dev)
370 mac->rx = NULL; 370 mac->rx = NULL;
371} 371}
372 372
373static void pasemi_mac_replenish_rx_ring(struct net_device *dev) 373static void pasemi_mac_replenish_rx_ring(struct net_device *dev, int limit)
374{ 374{
375 struct pasemi_mac *mac = netdev_priv(dev); 375 struct pasemi_mac *mac = netdev_priv(dev);
376 unsigned int i; 376 unsigned int i;
377 int start = mac->rx->next_to_fill; 377 int start = mac->rx->next_to_fill;
378 unsigned int limit, count; 378 int count;
379
380 limit = RING_AVAIL(mac->rx);
381 /* Check to see if we're doing first-time setup */
382 if (unlikely(mac->rx->next_to_clean == 0 && mac->rx->next_to_fill == 0))
383 limit = RX_RING_SIZE;
384 379
385 if (limit <= 0) 380 if (limit <= 0)
386 return; 381 return;
387 382
388 i = start; 383 i = start;
389 for (count = limit; count; count--) { 384 for (count = 0; count < limit; count++) {
390 struct pasemi_mac_buffer *info = &RX_DESC_INFO(mac, i); 385 struct pasemi_mac_buffer *info = &RX_DESC_INFO(mac, i);
391 u64 *buff = &RX_BUFF(mac, i); 386 u64 *buff = &RX_BUFF(mac, i);
392 struct sk_buff *skb; 387 struct sk_buff *skb;
@@ -417,10 +412,10 @@ static void pasemi_mac_replenish_rx_ring(struct net_device *dev)
417 412
418 wmb(); 413 wmb();
419 414
420 write_dma_reg(mac, PAS_DMA_RXCHAN_INCR(mac->dma_rxch), limit - count); 415 write_dma_reg(mac, PAS_DMA_RXCHAN_INCR(mac->dma_rxch), count);
421 write_dma_reg(mac, PAS_DMA_RXINT_INCR(mac->dma_if), limit - count); 416 write_dma_reg(mac, PAS_DMA_RXINT_INCR(mac->dma_if), count);
422 417
423 mac->rx->next_to_fill += limit - count; 418 mac->rx->next_to_fill += count;
424} 419}
425 420
426static void pasemi_mac_restart_rx_intr(struct pasemi_mac *mac) 421static void pasemi_mac_restart_rx_intr(struct pasemi_mac *mac)
@@ -538,7 +533,7 @@ static int pasemi_mac_clean_rx(struct pasemi_mac *mac, int limit)
538 } 533 }
539 534
540 mac->rx->next_to_clean += limit - count; 535 mac->rx->next_to_clean += limit - count;
541 pasemi_mac_replenish_rx_ring(mac->netdev); 536 pasemi_mac_replenish_rx_ring(mac->netdev, limit-count);
542 537
543 spin_unlock(&mac->rx->lock); 538 spin_unlock(&mac->rx->lock);
544 539
@@ -825,7 +820,7 @@ static int pasemi_mac_open(struct net_device *dev)
825 write_dma_reg(mac, PAS_DMA_TXCHAN_TCMDSTA(mac->dma_txch), 820 write_dma_reg(mac, PAS_DMA_TXCHAN_TCMDSTA(mac->dma_txch),
826 PAS_DMA_TXCHAN_TCMDSTA_EN); 821 PAS_DMA_TXCHAN_TCMDSTA_EN);
827 822
828 pasemi_mac_replenish_rx_ring(dev); 823 pasemi_mac_replenish_rx_ring(dev, RX_RING_SIZE);
829 824
830 flags = PAS_MAC_CFG_PCFG_S1 | PAS_MAC_CFG_PCFG_PE | 825 flags = PAS_MAC_CFG_PCFG_S1 | PAS_MAC_CFG_PCFG_PE |
831 PAS_MAC_CFG_PCFG_PR | PAS_MAC_CFG_PCFG_CE; 826 PAS_MAC_CFG_PCFG_PR | PAS_MAC_CFG_PCFG_CE;