diff options
Diffstat (limited to 'drivers/net/ethernet/cadence/macb.c')
-rw-r--r-- | drivers/net/ethernet/cadence/macb.c | 35 |
1 files changed, 17 insertions, 18 deletions
diff --git a/drivers/net/ethernet/cadence/macb.c b/drivers/net/ethernet/cadence/macb.c index ca97005e24b4..e9daa072ebb4 100644 --- a/drivers/net/ethernet/cadence/macb.c +++ b/drivers/net/ethernet/cadence/macb.c | |||
@@ -599,25 +599,16 @@ static void gem_rx_refill(struct macb *bp) | |||
599 | { | 599 | { |
600 | unsigned int entry; | 600 | unsigned int entry; |
601 | struct sk_buff *skb; | 601 | struct sk_buff *skb; |
602 | struct macb_dma_desc *desc; | ||
603 | dma_addr_t paddr; | 602 | dma_addr_t paddr; |
604 | 603 | ||
605 | while (CIRC_SPACE(bp->rx_prepared_head, bp->rx_tail, RX_RING_SIZE) > 0) { | 604 | while (CIRC_SPACE(bp->rx_prepared_head, bp->rx_tail, RX_RING_SIZE) > 0) { |
606 | u32 addr, ctrl; | ||
607 | |||
608 | entry = macb_rx_ring_wrap(bp->rx_prepared_head); | 605 | entry = macb_rx_ring_wrap(bp->rx_prepared_head); |
609 | desc = &bp->rx_ring[entry]; | ||
610 | 606 | ||
611 | /* Make hw descriptor updates visible to CPU */ | 607 | /* Make hw descriptor updates visible to CPU */ |
612 | rmb(); | 608 | rmb(); |
613 | 609 | ||
614 | addr = desc->addr; | ||
615 | ctrl = desc->ctrl; | ||
616 | bp->rx_prepared_head++; | 610 | bp->rx_prepared_head++; |
617 | 611 | ||
618 | if ((addr & MACB_BIT(RX_USED))) | ||
619 | continue; | ||
620 | |||
621 | if (bp->rx_skbuff[entry] == NULL) { | 612 | if (bp->rx_skbuff[entry] == NULL) { |
622 | /* allocate sk_buff for this free entry in ring */ | 613 | /* allocate sk_buff for this free entry in ring */ |
623 | skb = netdev_alloc_skb(bp->dev, bp->rx_buffer_size); | 614 | skb = netdev_alloc_skb(bp->dev, bp->rx_buffer_size); |
@@ -698,7 +689,6 @@ static int gem_rx(struct macb *bp, int budget) | |||
698 | if (!(addr & MACB_BIT(RX_USED))) | 689 | if (!(addr & MACB_BIT(RX_USED))) |
699 | break; | 690 | break; |
700 | 691 | ||
701 | desc->addr &= ~MACB_BIT(RX_USED); | ||
702 | bp->rx_tail++; | 692 | bp->rx_tail++; |
703 | count++; | 693 | count++; |
704 | 694 | ||
@@ -891,16 +881,15 @@ static int macb_poll(struct napi_struct *napi, int budget) | |||
891 | if (work_done < budget) { | 881 | if (work_done < budget) { |
892 | napi_complete(napi); | 882 | napi_complete(napi); |
893 | 883 | ||
894 | /* | ||
895 | * We've done what we can to clean the buffers. Make sure we | ||
896 | * get notified when new packets arrive. | ||
897 | */ | ||
898 | macb_writel(bp, IER, MACB_RX_INT_FLAGS); | ||
899 | |||
900 | /* Packets received while interrupts were disabled */ | 884 | /* Packets received while interrupts were disabled */ |
901 | status = macb_readl(bp, RSR); | 885 | status = macb_readl(bp, RSR); |
902 | if (unlikely(status)) | 886 | if (status) { |
887 | if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE) | ||
888 | macb_writel(bp, ISR, MACB_BIT(RCOMP)); | ||
903 | napi_reschedule(napi); | 889 | napi_reschedule(napi); |
890 | } else { | ||
891 | macb_writel(bp, IER, MACB_RX_INT_FLAGS); | ||
892 | } | ||
904 | } | 893 | } |
905 | 894 | ||
906 | /* TODO: Handle errors */ | 895 | /* TODO: Handle errors */ |
@@ -951,6 +940,10 @@ static irqreturn_t macb_interrupt(int irq, void *dev_id) | |||
951 | if (unlikely(status & (MACB_TX_ERR_FLAGS))) { | 940 | if (unlikely(status & (MACB_TX_ERR_FLAGS))) { |
952 | macb_writel(bp, IDR, MACB_TX_INT_FLAGS); | 941 | macb_writel(bp, IDR, MACB_TX_INT_FLAGS); |
953 | schedule_work(&bp->tx_error_task); | 942 | schedule_work(&bp->tx_error_task); |
943 | |||
944 | if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE) | ||
945 | macb_writel(bp, ISR, MACB_TX_ERR_FLAGS); | ||
946 | |||
954 | break; | 947 | break; |
955 | } | 948 | } |
956 | 949 | ||
@@ -968,6 +961,9 @@ static irqreturn_t macb_interrupt(int irq, void *dev_id) | |||
968 | bp->hw_stats.gem.rx_overruns++; | 961 | bp->hw_stats.gem.rx_overruns++; |
969 | else | 962 | else |
970 | bp->hw_stats.macb.rx_overruns++; | 963 | bp->hw_stats.macb.rx_overruns++; |
964 | |||
965 | if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE) | ||
966 | macb_writel(bp, ISR, MACB_BIT(ISR_ROVR)); | ||
971 | } | 967 | } |
972 | 968 | ||
973 | if (status & MACB_BIT(HRESP)) { | 969 | if (status & MACB_BIT(HRESP)) { |
@@ -977,6 +973,9 @@ static irqreturn_t macb_interrupt(int irq, void *dev_id) | |||
977 | * (work queue?) | 973 | * (work queue?) |
978 | */ | 974 | */ |
979 | netdev_err(dev, "DMA bus error: HRESP not OK\n"); | 975 | netdev_err(dev, "DMA bus error: HRESP not OK\n"); |
976 | |||
977 | if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE) | ||
978 | macb_writel(bp, ISR, MACB_BIT(HRESP)); | ||
980 | } | 979 | } |
981 | 980 | ||
982 | status = macb_readl(bp, ISR); | 981 | status = macb_readl(bp, ISR); |
@@ -1113,7 +1112,7 @@ static void gem_free_rx_buffers(struct macb *bp) | |||
1113 | 1112 | ||
1114 | desc = &bp->rx_ring[i]; | 1113 | desc = &bp->rx_ring[i]; |
1115 | addr = MACB_BF(RX_WADDR, MACB_BFEXT(RX_WADDR, desc->addr)); | 1114 | addr = MACB_BF(RX_WADDR, MACB_BFEXT(RX_WADDR, desc->addr)); |
1116 | dma_unmap_single(&bp->pdev->dev, addr, skb->len, | 1115 | dma_unmap_single(&bp->pdev->dev, addr, bp->rx_buffer_size, |
1117 | DMA_FROM_DEVICE); | 1116 | DMA_FROM_DEVICE); |
1118 | dev_kfree_skb_any(skb); | 1117 | dev_kfree_skb_any(skb); |
1119 | skb = NULL; | 1118 | skb = NULL; |