Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 186282 | Differences between
and this patch

Collapse All | Expand All

(-)a/drivers/net/sky2.c (-18 / +17 lines)
Lines 2477-2484 static void sky2_err_intr(struct sky2_hw *hw, u32 status) Link Here
2477
static int sky2_poll(struct net_device *dev0, int *budget)
2477
static 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))
Lines 2490-2514 static int sky2_poll(struct net_device *dev0, int *budget) Link Here
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
2514
static irqreturn_t sky2_intr(int irq, void *dev_id)
2513
static irqreturn_t sky2_intr(int irq, void *dev_id)

Return to bug 186282