aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/sky2.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/sky2.c')
-rw-r--r--drivers/net/sky2.c35
1 files changed, 17 insertions, 18 deletions
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c
index 90b1b9708178..c8e51cf5af71 100644
--- a/drivers/net/sky2.c
+++ b/drivers/net/sky2.c
@@ -2477,8 +2477,7 @@ static void sky2_err_intr(struct sky2_hw *hw, u32 status)
2477static int sky2_poll(struct net_device *dev0, int *budget) 2477static int sky2_poll(struct net_device *dev0, int *budget)
2478{ 2478{
2479 struct sky2_hw *hw = ((struct sky2_port *) netdev_priv(dev0))->hw; 2479 struct sky2_hw *hw = ((struct sky2_port *) netdev_priv(dev0))->hw;
2480 int work_limit = min(dev0->quota, *budget); 2480 int work_done;
2481 int work_done = 0;
2482 u32 status = sky2_read32(hw, B0_Y2_SP_EISR); 2481 u32 status = sky2_read32(hw, B0_Y2_SP_EISR);
2483 2482
2484 if (unlikely(status & Y2_IS_ERROR)) 2483 if (unlikely(status & Y2_IS_ERROR))
@@ -2490,25 +2489,25 @@ static int sky2_poll(struct net_device *dev0, int *budget)
2490 if (status & Y2_IS_IRQ_PHY2) 2489 if (status & Y2_IS_IRQ_PHY2)
2491 sky2_phy_intr(hw, 1); 2490 sky2_phy_intr(hw, 1);
2492 2491
2493 work_done = sky2_status_intr(hw, work_limit); 2492 work_done = sky2_status_intr(hw, min(dev0->quota, *budget));
2494 if (work_done < work_limit) { 2493 *budget -= work_done;
2495 /* Bug/Errata workaround? 2494 dev0->quota -= work_done;
2496 * Need to kick the TX irq moderation timer.
2497 */
2498 if (sky2_read8(hw, STAT_TX_TIMER_CTRL) == TIM_START) {
2499 sky2_write8(hw, STAT_TX_TIMER_CTRL, TIM_STOP);
2500 sky2_write8(hw, STAT_TX_TIMER_CTRL, TIM_START);
2501 }
2502 netif_rx_complete(dev0);
2503 2495
2504 /* end of interrupt, re-enables also acts as I/O synchronization */ 2496 /* More work? */
2505 sky2_read32(hw, B0_Y2_SP_LISR); 2497 if (hw->st_idx != sky2_read16(hw, STAT_PUT_IDX))
2506 return 0;
2507 } else {
2508 *budget -= work_done;
2509 dev0->quota -= work_done;
2510 return 1; 2498 return 1;
2499
2500 /* Bug/Errata workaround?
2501 * Need to kick the TX irq moderation timer.
2502 */
2503 if (sky2_read8(hw, STAT_TX_TIMER_CTRL) == TIM_START) {
2504 sky2_write8(hw, STAT_TX_TIMER_CTRL, TIM_STOP);
2505 sky2_write8(hw, STAT_TX_TIMER_CTRL, TIM_START);
2511 } 2506 }
2507 netif_rx_complete(dev0);
2508
2509 sky2_read32(hw, B0_Y2_SP_LISR);
2510 return 0;
2512} 2511}
2513 2512
2514static irqreturn_t sky2_intr(int irq, void *dev_id) 2513static irqreturn_t sky2_intr(int irq, void *dev_id)