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; |
