diff options
Diffstat (limited to 'drivers/net/ethernet/cadence/macb.c')
-rw-r--r-- | drivers/net/ethernet/cadence/macb.c | 43 |
1 files changed, 18 insertions, 25 deletions
diff --git a/drivers/net/ethernet/cadence/macb.c b/drivers/net/ethernet/cadence/macb.c index d0c38e01e99f..e9daa072ebb4 100644 --- a/drivers/net/ethernet/cadence/macb.c +++ b/drivers/net/ethernet/cadence/macb.c | |||
@@ -199,11 +199,6 @@ static int macb_mdio_write(struct mii_bus *bus, int mii_id, int regnum, | |||
199 | return 0; | 199 | return 0; |
200 | } | 200 | } |
201 | 201 | ||
202 | static int macb_mdio_reset(struct mii_bus *bus) | ||
203 | { | ||
204 | return 0; | ||
205 | } | ||
206 | |||
207 | /** | 202 | /** |
208 | * macb_set_tx_clk() - Set a clock to a new frequency | 203 | * macb_set_tx_clk() - Set a clock to a new frequency |
209 | * @clk Pointer to the clock to change | 204 | * @clk Pointer to the clock to change |
@@ -375,7 +370,6 @@ int macb_mii_init(struct macb *bp) | |||
375 | bp->mii_bus->name = "MACB_mii_bus"; | 370 | bp->mii_bus->name = "MACB_mii_bus"; |
376 | bp->mii_bus->read = &macb_mdio_read; | 371 | bp->mii_bus->read = &macb_mdio_read; |
377 | bp->mii_bus->write = &macb_mdio_write; | 372 | bp->mii_bus->write = &macb_mdio_write; |
378 | bp->mii_bus->reset = &macb_mdio_reset; | ||
379 | snprintf(bp->mii_bus->id, MII_BUS_ID_SIZE, "%s-%x", | 373 | snprintf(bp->mii_bus->id, MII_BUS_ID_SIZE, "%s-%x", |
380 | bp->pdev->name, bp->pdev->id); | 374 | bp->pdev->name, bp->pdev->id); |
381 | bp->mii_bus->priv = bp; | 375 | bp->mii_bus->priv = bp; |
@@ -605,25 +599,16 @@ static void gem_rx_refill(struct macb *bp) | |||
605 | { | 599 | { |
606 | unsigned int entry; | 600 | unsigned int entry; |
607 | struct sk_buff *skb; | 601 | struct sk_buff *skb; |
608 | struct macb_dma_desc *desc; | ||
609 | dma_addr_t paddr; | 602 | dma_addr_t paddr; |
610 | 603 | ||
611 | 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) { |
612 | u32 addr, ctrl; | ||
613 | |||
614 | entry = macb_rx_ring_wrap(bp->rx_prepared_head); | 605 | entry = macb_rx_ring_wrap(bp->rx_prepared_head); |
615 | desc = &bp->rx_ring[entry]; | ||
616 | 606 | ||
617 | /* Make hw descriptor updates visible to CPU */ | 607 | /* Make hw descriptor updates visible to CPU */ |
618 | rmb(); | 608 | rmb(); |
619 | 609 | ||
620 | addr = desc->addr; | ||
621 | ctrl = desc->ctrl; | ||
622 | bp->rx_prepared_head++; | 610 | bp->rx_prepared_head++; |
623 | 611 | ||
624 | if ((addr & MACB_BIT(RX_USED))) | ||
625 | continue; | ||
626 | |||
627 | if (bp->rx_skbuff[entry] == NULL) { | 612 | if (bp->rx_skbuff[entry] == NULL) { |
628 | /* allocate sk_buff for this free entry in ring */ | 613 | /* allocate sk_buff for this free entry in ring */ |
629 | skb = netdev_alloc_skb(bp->dev, bp->rx_buffer_size); | 614 | skb = netdev_alloc_skb(bp->dev, bp->rx_buffer_size); |
@@ -704,7 +689,6 @@ static int gem_rx(struct macb *bp, int budget) | |||
704 | if (!(addr & MACB_BIT(RX_USED))) | 689 | if (!(addr & MACB_BIT(RX_USED))) |
705 | break; | 690 | break; |
706 | 691 | ||
707 | desc->addr &= ~MACB_BIT(RX_USED); | ||
708 | bp->rx_tail++; | 692 | bp->rx_tail++; |
709 | count++; | 693 | count++; |
710 | 694 | ||
@@ -897,16 +881,15 @@ static int macb_poll(struct napi_struct *napi, int budget) | |||
897 | if (work_done < budget) { | 881 | if (work_done < budget) { |
898 | napi_complete(napi); | 882 | napi_complete(napi); |
899 | 883 | ||
900 | /* | ||
901 | * We've done what we can to clean the buffers. Make sure we | ||
902 | * get notified when new packets arrive. | ||
903 | */ | ||
904 | macb_writel(bp, IER, MACB_RX_INT_FLAGS); | ||
905 | |||
906 | /* Packets received while interrupts were disabled */ | 884 | /* Packets received while interrupts were disabled */ |
907 | status = macb_readl(bp, RSR); | 885 | status = macb_readl(bp, RSR); |
908 | if (unlikely(status)) | 886 | if (status) { |
887 | if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE) | ||
888 | macb_writel(bp, ISR, MACB_BIT(RCOMP)); | ||
909 | napi_reschedule(napi); | 889 | napi_reschedule(napi); |
890 | } else { | ||
891 | macb_writel(bp, IER, MACB_RX_INT_FLAGS); | ||
892 | } | ||
910 | } | 893 | } |
911 | 894 | ||
912 | /* TODO: Handle errors */ | 895 | /* TODO: Handle errors */ |
@@ -957,6 +940,10 @@ static irqreturn_t macb_interrupt(int irq, void *dev_id) | |||
957 | if (unlikely(status & (MACB_TX_ERR_FLAGS))) { | 940 | if (unlikely(status & (MACB_TX_ERR_FLAGS))) { |
958 | macb_writel(bp, IDR, MACB_TX_INT_FLAGS); | 941 | macb_writel(bp, IDR, MACB_TX_INT_FLAGS); |
959 | 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 | |||
960 | break; | 947 | break; |
961 | } | 948 | } |
962 | 949 | ||
@@ -974,6 +961,9 @@ static irqreturn_t macb_interrupt(int irq, void *dev_id) | |||
974 | bp->hw_stats.gem.rx_overruns++; | 961 | bp->hw_stats.gem.rx_overruns++; |
975 | else | 962 | else |
976 | 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)); | ||
977 | } | 967 | } |
978 | 968 | ||
979 | if (status & MACB_BIT(HRESP)) { | 969 | if (status & MACB_BIT(HRESP)) { |
@@ -983,6 +973,9 @@ static irqreturn_t macb_interrupt(int irq, void *dev_id) | |||
983 | * (work queue?) | 973 | * (work queue?) |
984 | */ | 974 | */ |
985 | 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)); | ||
986 | } | 979 | } |
987 | 980 | ||
988 | status = macb_readl(bp, ISR); | 981 | status = macb_readl(bp, ISR); |
@@ -1045,7 +1038,7 @@ static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1045 | mapping = dma_map_single(&bp->pdev->dev, skb->data, | 1038 | mapping = dma_map_single(&bp->pdev->dev, skb->data, |
1046 | len, DMA_TO_DEVICE); | 1039 | len, DMA_TO_DEVICE); |
1047 | if (dma_mapping_error(&bp->pdev->dev, mapping)) { | 1040 | if (dma_mapping_error(&bp->pdev->dev, mapping)) { |
1048 | kfree_skb(skb); | 1041 | dev_kfree_skb_any(skb); |
1049 | goto unlock; | 1042 | goto unlock; |
1050 | } | 1043 | } |
1051 | 1044 | ||
@@ -1119,7 +1112,7 @@ static void gem_free_rx_buffers(struct macb *bp) | |||
1119 | 1112 | ||
1120 | desc = &bp->rx_ring[i]; | 1113 | desc = &bp->rx_ring[i]; |
1121 | addr = MACB_BF(RX_WADDR, MACB_BFEXT(RX_WADDR, desc->addr)); | 1114 | addr = MACB_BF(RX_WADDR, MACB_BFEXT(RX_WADDR, desc->addr)); |
1122 | dma_unmap_single(&bp->pdev->dev, addr, skb->len, | 1115 | dma_unmap_single(&bp->pdev->dev, addr, bp->rx_buffer_size, |
1123 | DMA_FROM_DEVICE); | 1116 | DMA_FROM_DEVICE); |
1124 | dev_kfree_skb_any(skb); | 1117 | dev_kfree_skb_any(skb); |
1125 | skb = NULL; | 1118 | skb = NULL; |