aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/macb.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/macb.c')
-rw-r--r--drivers/net/macb.c44
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
1347MODULE_LICENSE("GPL"); 1357MODULE_LICENSE("GPL");
1348MODULE_DESCRIPTION("Atmel MACB Ethernet driver"); 1358MODULE_DESCRIPTION("Atmel MACB Ethernet driver");
1349MODULE_AUTHOR("Haavard Skinnemoen <hskinnemoen@atmel.com>"); 1359MODULE_AUTHOR("Haavard Skinnemoen (Atmel)");
1350MODULE_ALIAS("platform:macb"); 1360MODULE_ALIAS("platform:macb");