diff options
author | Olof Johansson <olof@lixom.net> | 2015-04-20 10:59:04 -0400 |
---|---|---|
committer | Olof Johansson <olof@lixom.net> | 2015-04-20 10:59:04 -0400 |
commit | cdaa8cf34863028dab238e1498555bf12d693244 (patch) | |
tree | 0034305d152c3c4887b81c8983d0f298e6e3f6cb /drivers/net/ethernet/altera/altera_tse_main.c | |
parent | 30a5c1894a4c932f5a417f0a6ec369c7da81204b (diff) | |
parent | 98b80987c940956da48f0c703f60340128bb8521 (diff) |
Merge branch 'fixes' into next/fixes-non-critical
Merge a set of fixes that we missed sending in before v4.0 release. These
will also be sent to -stable.
* fixes: (659 commits)
ARM: at91/dt: sama5d3 xplained: add phy address for macb1
kbuild: Create directory for target DTB
ARM: mvebu: Disable CPU Idle on Armada 38x
arm64: juno: Fix misleading name of UART reference clock
ARM: dts: sunxi: Remove overclocked/overvoltaged OPP
ARM: dts: sun4i: a10-lime: Override and remove 1008MHz OPP setting
ARM: socfpga: dts: fix spi1 interrupt
ARM: dts: Fix gpio interrupts for dm816x
ARM: dts: dra7: remove ti,hwmod property from pcie phy
ARM: EXYNOS: Fix build breakage cpuidle on !SMP
ARM: OMAP: dmtimer: disable pm runtime on remove
ARM: OMAP: dmtimer: check for pm_runtime_get_sync() failure
ARM: dts: fix lid and power pin-functions for exynos5250-spring
ARM: dts: fix mmc node updates for exynos5250-spring
ARM: OMAP2+: Fix socbus family info for AM33xx devices
ARM: dts: omap3: Add missing dmas for crypto
+ Linux 4.0-rc4
Signed-off-by: Olof Johansson <olof@lixom.net>
Diffstat (limited to 'drivers/net/ethernet/altera/altera_tse_main.c')
-rw-r--r-- | drivers/net/ethernet/altera/altera_tse_main.c | 47 |
1 files changed, 23 insertions, 24 deletions
diff --git a/drivers/net/ethernet/altera/altera_tse_main.c b/drivers/net/ethernet/altera/altera_tse_main.c index 760c72c6e2ac..6725dc00750b 100644 --- a/drivers/net/ethernet/altera/altera_tse_main.c +++ b/drivers/net/ethernet/altera/altera_tse_main.c | |||
@@ -376,7 +376,8 @@ static int tse_rx(struct altera_tse_private *priv, int limit) | |||
376 | u16 pktlength; | 376 | u16 pktlength; |
377 | u16 pktstatus; | 377 | u16 pktstatus; |
378 | 378 | ||
379 | while ((rxstatus = priv->dmaops->get_rx_status(priv)) != 0) { | 379 | while (((rxstatus = priv->dmaops->get_rx_status(priv)) != 0) && |
380 | (count < limit)) { | ||
380 | pktstatus = rxstatus >> 16; | 381 | pktstatus = rxstatus >> 16; |
381 | pktlength = rxstatus & 0xffff; | 382 | pktlength = rxstatus & 0xffff; |
382 | 383 | ||
@@ -491,28 +492,27 @@ static int tse_poll(struct napi_struct *napi, int budget) | |||
491 | struct altera_tse_private *priv = | 492 | struct altera_tse_private *priv = |
492 | container_of(napi, struct altera_tse_private, napi); | 493 | container_of(napi, struct altera_tse_private, napi); |
493 | int rxcomplete = 0; | 494 | int rxcomplete = 0; |
494 | int txcomplete = 0; | ||
495 | unsigned long int flags; | 495 | unsigned long int flags; |
496 | 496 | ||
497 | txcomplete = tse_tx_complete(priv); | 497 | tse_tx_complete(priv); |
498 | 498 | ||
499 | rxcomplete = tse_rx(priv, budget); | 499 | rxcomplete = tse_rx(priv, budget); |
500 | 500 | ||
501 | if (rxcomplete >= budget || txcomplete > 0) | 501 | if (rxcomplete < budget) { |
502 | return rxcomplete; | ||
503 | 502 | ||
504 | napi_gro_flush(napi, false); | 503 | napi_gro_flush(napi, false); |
505 | __napi_complete(napi); | 504 | __napi_complete(napi); |
506 | 505 | ||
507 | netdev_dbg(priv->dev, | 506 | netdev_dbg(priv->dev, |
508 | "NAPI Complete, did %d packets with budget %d\n", | 507 | "NAPI Complete, did %d packets with budget %d\n", |
509 | txcomplete+rxcomplete, budget); | 508 | rxcomplete, budget); |
510 | 509 | ||
511 | spin_lock_irqsave(&priv->rxdma_irq_lock, flags); | 510 | spin_lock_irqsave(&priv->rxdma_irq_lock, flags); |
512 | priv->dmaops->enable_rxirq(priv); | 511 | priv->dmaops->enable_rxirq(priv); |
513 | priv->dmaops->enable_txirq(priv); | 512 | priv->dmaops->enable_txirq(priv); |
514 | spin_unlock_irqrestore(&priv->rxdma_irq_lock, flags); | 513 | spin_unlock_irqrestore(&priv->rxdma_irq_lock, flags); |
515 | return rxcomplete + txcomplete; | 514 | } |
515 | return rxcomplete; | ||
516 | } | 516 | } |
517 | 517 | ||
518 | /* DMA TX & RX FIFO interrupt routing | 518 | /* DMA TX & RX FIFO interrupt routing |
@@ -521,7 +521,6 @@ static irqreturn_t altera_isr(int irq, void *dev_id) | |||
521 | { | 521 | { |
522 | struct net_device *dev = dev_id; | 522 | struct net_device *dev = dev_id; |
523 | struct altera_tse_private *priv; | 523 | struct altera_tse_private *priv; |
524 | unsigned long int flags; | ||
525 | 524 | ||
526 | if (unlikely(!dev)) { | 525 | if (unlikely(!dev)) { |
527 | pr_err("%s: invalid dev pointer\n", __func__); | 526 | pr_err("%s: invalid dev pointer\n", __func__); |
@@ -529,20 +528,20 @@ static irqreturn_t altera_isr(int irq, void *dev_id) | |||
529 | } | 528 | } |
530 | priv = netdev_priv(dev); | 529 | priv = netdev_priv(dev); |
531 | 530 | ||
532 | /* turn off desc irqs and enable napi rx */ | 531 | spin_lock(&priv->rxdma_irq_lock); |
533 | spin_lock_irqsave(&priv->rxdma_irq_lock, flags); | 532 | /* reset IRQs */ |
533 | priv->dmaops->clear_rxirq(priv); | ||
534 | priv->dmaops->clear_txirq(priv); | ||
535 | spin_unlock(&priv->rxdma_irq_lock); | ||
534 | 536 | ||
535 | if (likely(napi_schedule_prep(&priv->napi))) { | 537 | if (likely(napi_schedule_prep(&priv->napi))) { |
538 | spin_lock(&priv->rxdma_irq_lock); | ||
536 | priv->dmaops->disable_rxirq(priv); | 539 | priv->dmaops->disable_rxirq(priv); |
537 | priv->dmaops->disable_txirq(priv); | 540 | priv->dmaops->disable_txirq(priv); |
541 | spin_unlock(&priv->rxdma_irq_lock); | ||
538 | __napi_schedule(&priv->napi); | 542 | __napi_schedule(&priv->napi); |
539 | } | 543 | } |
540 | 544 | ||
541 | /* reset IRQs */ | ||
542 | priv->dmaops->clear_rxirq(priv); | ||
543 | priv->dmaops->clear_txirq(priv); | ||
544 | |||
545 | spin_unlock_irqrestore(&priv->rxdma_irq_lock, flags); | ||
546 | 545 | ||
547 | return IRQ_HANDLED; | 546 | return IRQ_HANDLED; |
548 | } | 547 | } |
@@ -1399,7 +1398,7 @@ static int altera_tse_probe(struct platform_device *pdev) | |||
1399 | } | 1398 | } |
1400 | 1399 | ||
1401 | if (of_property_read_u32(pdev->dev.of_node, "tx-fifo-depth", | 1400 | if (of_property_read_u32(pdev->dev.of_node, "tx-fifo-depth", |
1402 | &priv->rx_fifo_depth)) { | 1401 | &priv->tx_fifo_depth)) { |
1403 | dev_err(&pdev->dev, "cannot obtain tx-fifo-depth\n"); | 1402 | dev_err(&pdev->dev, "cannot obtain tx-fifo-depth\n"); |
1404 | ret = -ENXIO; | 1403 | ret = -ENXIO; |
1405 | goto err_free_netdev; | 1404 | goto err_free_netdev; |