aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/cadence/macb.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/cadence/macb.c')
-rw-r--r--drivers/net/ethernet/cadence/macb.c43
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
202static 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;