static int bgmac_poll(struct napi_struct *napi, int weight) { struct bgmac *bgmac = container_of(napi, struct bgmac, napi); struct bgmac_dma_ring *ring; int handled = 0; if (bgmac->int_status & BGMAC_IS_TX0) { ring = &bgmac->tx_ring[0]; bgmac_dma_tx_free(bgmac, ring); bgmac->int_status &= ~BGMAC_IS_TX0; } if (bgmac->int_status & BGMAC_IS_RX) { ring = &bgmac->rx_ring[0]; handled += bgmac_dma_rx_read(bgmac, ring, weight); bgmac->int_status &= ~BGMAC_IS_RX; } if (bgmac->int_status) { bgmac_err(bgmac, "Unknown IRQs: 0x%08X\n", bgmac->int_status); bgmac->int_status = 0; } if (handled < weight) napi_complete(napi); bgmac_chip_intrs_on(bgmac); return handled; }
static int bgmac_poll(struct napi_struct *napi, int weight) { struct bgmac *bgmac = container_of(napi, struct bgmac, napi); int handled = 0; /* Ack */ bgmac_write(bgmac, BGMAC_INT_STATUS, ~0); bgmac_dma_tx_free(bgmac, &bgmac->tx_ring[0]); handled += bgmac_dma_rx_read(bgmac, &bgmac->rx_ring[0], weight); /* Poll again if more events arrived in the meantime */ if (bgmac_read(bgmac, BGMAC_INT_STATUS) & (BGMAC_IS_TX0 | BGMAC_IS_RX)) return weight; if (handled < weight) { napi_complete(napi); bgmac_chip_intrs_on(bgmac); } return handled; }