|
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) |