diff options
Diffstat (limited to 'drivers/net/macb.c')
-rw-r--r-- | drivers/net/macb.c | 44 |
1 files changed, 27 insertions, 17 deletions
diff --git a/drivers/net/macb.c b/drivers/net/macb.c index ff2f158ab0b9..6c6a02869dfc 100644 --- a/drivers/net/macb.c +++ b/drivers/net/macb.c | |||
@@ -260,7 +260,7 @@ static int macb_mii_init(struct macb *bp) | |||
260 | for (i = 0; i < PHY_MAX_ADDR; i++) | 260 | for (i = 0; i < PHY_MAX_ADDR; i++) |
261 | bp->mii_bus->irq[i] = PHY_POLL; | 261 | bp->mii_bus->irq[i] = PHY_POLL; |
262 | 262 | ||
263 | platform_set_drvdata(bp->dev, bp->mii_bus); | 263 | dev_set_drvdata(&bp->dev->dev, bp->mii_bus); |
264 | 264 | ||
265 | if (mdiobus_register(bp->mii_bus)) | 265 | if (mdiobus_register(bp->mii_bus)) |
266 | goto err_out_free_mdio_irq; | 266 | goto err_out_free_mdio_irq; |
@@ -407,7 +407,7 @@ static int macb_rx_frame(struct macb *bp, unsigned int first_frag, | |||
407 | } | 407 | } |
408 | 408 | ||
409 | skb_reserve(skb, RX_OFFSET); | 409 | skb_reserve(skb, RX_OFFSET); |
410 | skb->ip_summed = CHECKSUM_NONE; | 410 | skb_checksum_none_assert(skb); |
411 | skb_put(skb, len); | 411 | skb_put(skb, len); |
412 | 412 | ||
413 | for (frag = first_frag; ; frag = NEXT_RX(frag)) { | 413 | for (frag = first_frag; ; frag = NEXT_RX(frag)) { |
@@ -515,14 +515,15 @@ static int macb_poll(struct napi_struct *napi, int budget) | |||
515 | (unsigned long)status, budget); | 515 | (unsigned long)status, budget); |
516 | 516 | ||
517 | work_done = macb_rx(bp, budget); | 517 | work_done = macb_rx(bp, budget); |
518 | if (work_done < budget) | 518 | if (work_done < budget) { |
519 | napi_complete(napi); | 519 | napi_complete(napi); |
520 | 520 | ||
521 | /* | 521 | /* |
522 | * We've done what we can to clean the buffers. Make sure we | 522 | * We've done what we can to clean the buffers. Make sure we |
523 | * get notified when new packets arrive. | 523 | * get notified when new packets arrive. |
524 | */ | 524 | */ |
525 | macb_writel(bp, IER, MACB_RX_INT_FLAGS); | 525 | macb_writel(bp, IER, MACB_RX_INT_FLAGS); |
526 | } | ||
526 | 527 | ||
527 | /* TODO: Handle errors */ | 528 | /* TODO: Handle errors */ |
528 | 529 | ||
@@ -550,12 +551,16 @@ static irqreturn_t macb_interrupt(int irq, void *dev_id) | |||
550 | } | 551 | } |
551 | 552 | ||
552 | if (status & MACB_RX_INT_FLAGS) { | 553 | if (status & MACB_RX_INT_FLAGS) { |
554 | /* | ||
555 | * There's no point taking any more interrupts | ||
556 | * until we have processed the buffers. The | ||
557 | * scheduling call may fail if the poll routine | ||
558 | * is already scheduled, so disable interrupts | ||
559 | * now. | ||
560 | */ | ||
561 | macb_writel(bp, IDR, MACB_RX_INT_FLAGS); | ||
562 | |||
553 | if (napi_schedule_prep(&bp->napi)) { | 563 | if (napi_schedule_prep(&bp->napi)) { |
554 | /* | ||
555 | * There's no point taking any more interrupts | ||
556 | * until we have processed the buffers | ||
557 | */ | ||
558 | macb_writel(bp, IDR, MACB_RX_INT_FLAGS); | ||
559 | dev_dbg(&bp->pdev->dev, | 564 | dev_dbg(&bp->pdev->dev, |
560 | "scheduling RX softirq\n"); | 565 | "scheduling RX softirq\n"); |
561 | __napi_schedule(&bp->napi); | 566 | __napi_schedule(&bp->napi); |
@@ -571,6 +576,11 @@ static irqreturn_t macb_interrupt(int irq, void *dev_id) | |||
571 | * add that if/when we get our hands on a full-blown MII PHY. | 576 | * add that if/when we get our hands on a full-blown MII PHY. |
572 | */ | 577 | */ |
573 | 578 | ||
579 | if (status & MACB_BIT(ISR_ROVR)) { | ||
580 | /* We missed at least one packet */ | ||
581 | bp->hw_stats.rx_overruns++; | ||
582 | } | ||
583 | |||
574 | if (status & MACB_BIT(HRESP)) { | 584 | if (status & MACB_BIT(HRESP)) { |
575 | /* | 585 | /* |
576 | * TODO: Reset the hardware, and maybe move the printk | 586 | * TODO: Reset the hardware, and maybe move the printk |
@@ -1019,7 +1029,8 @@ static struct net_device_stats *macb_get_stats(struct net_device *dev) | |||
1019 | hwstat->rx_jabbers + | 1029 | hwstat->rx_jabbers + |
1020 | hwstat->rx_undersize_pkts + | 1030 | hwstat->rx_undersize_pkts + |
1021 | hwstat->rx_length_mismatch); | 1031 | hwstat->rx_length_mismatch); |
1022 | nstat->rx_over_errors = hwstat->rx_resource_errors; | 1032 | nstat->rx_over_errors = hwstat->rx_resource_errors + |
1033 | hwstat->rx_overruns; | ||
1023 | nstat->rx_crc_errors = hwstat->rx_fcs_errors; | 1034 | nstat->rx_crc_errors = hwstat->rx_fcs_errors; |
1024 | nstat->rx_frame_errors = hwstat->rx_align_errors; | 1035 | nstat->rx_frame_errors = hwstat->rx_align_errors; |
1025 | nstat->rx_fifo_errors = hwstat->rx_overruns; | 1036 | nstat->rx_fifo_errors = hwstat->rx_overruns; |
@@ -1166,8 +1177,7 @@ static int __init macb_probe(struct platform_device *pdev) | |||
1166 | } | 1177 | } |
1167 | 1178 | ||
1168 | dev->irq = platform_get_irq(pdev, 0); | 1179 | dev->irq = platform_get_irq(pdev, 0); |
1169 | err = request_irq(dev->irq, macb_interrupt, IRQF_SAMPLE_RANDOM, | 1180 | err = request_irq(dev->irq, macb_interrupt, 0, dev->name, dev); |
1170 | dev->name, dev); | ||
1171 | if (err) { | 1181 | if (err) { |
1172 | printk(KERN_ERR | 1182 | printk(KERN_ERR |
1173 | "%s: Unable to request IRQ %d (error %d)\n", | 1183 | "%s: Unable to request IRQ %d (error %d)\n", |
@@ -1346,5 +1356,5 @@ module_exit(macb_exit); | |||
1346 | 1356 | ||
1347 | MODULE_LICENSE("GPL"); | 1357 | MODULE_LICENSE("GPL"); |
1348 | MODULE_DESCRIPTION("Atmel MACB Ethernet driver"); | 1358 | MODULE_DESCRIPTION("Atmel MACB Ethernet driver"); |
1349 | MODULE_AUTHOR("Haavard Skinnemoen <hskinnemoen@atmel.com>"); | 1359 | MODULE_AUTHOR("Haavard Skinnemoen (Atmel)"); |
1350 | MODULE_ALIAS("platform:macb"); | 1360 | MODULE_ALIAS("platform:macb"); |