|
@@ -1109,8 +1109,6 @@ static void bgmac_chip_reset(struct bgmac *bgmac)
|
|
bgmac_phy_init(bgmac);
|
|
bgmac_phy_init(bgmac);
|
|
|
|
|
|
netdev_reset_queue(bgmac->net_dev);
|
|
netdev_reset_queue(bgmac->net_dev);
|
|
-
|
|
|
|
- bgmac->int_status = 0;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
static void bgmac_chip_intrs_on(struct bgmac *bgmac)
|
|
static void bgmac_chip_intrs_on(struct bgmac *bgmac)
|
|
@@ -1225,14 +1223,13 @@ static irqreturn_t bgmac_interrupt(int irq, void *dev_id)
|
|
if (!int_status)
|
|
if (!int_status)
|
|
return IRQ_NONE;
|
|
return IRQ_NONE;
|
|
|
|
|
|
- /* Ack */
|
|
|
|
- bgmac_write(bgmac, BGMAC_INT_STATUS, int_status);
|
|
|
|
|
|
+ int_status &= ~(BGMAC_IS_TX0 | BGMAC_IS_RX);
|
|
|
|
+ if (int_status)
|
|
|
|
+ bgmac_err(bgmac, "Unknown IRQs: 0x%08X\n", int_status);
|
|
|
|
|
|
/* Disable new interrupts until handling existing ones */
|
|
/* Disable new interrupts until handling existing ones */
|
|
bgmac_chip_intrs_off(bgmac);
|
|
bgmac_chip_intrs_off(bgmac);
|
|
|
|
|
|
- bgmac->int_status = int_status;
|
|
|
|
-
|
|
|
|
napi_schedule(&bgmac->napi);
|
|
napi_schedule(&bgmac->napi);
|
|
|
|
|
|
return IRQ_HANDLED;
|
|
return IRQ_HANDLED;
|
|
@@ -1241,25 +1238,17 @@ static irqreturn_t bgmac_interrupt(int irq, void *dev_id)
|
|
static int bgmac_poll(struct napi_struct *napi, int weight)
|
|
static int bgmac_poll(struct napi_struct *napi, int weight)
|
|
{
|
|
{
|
|
struct bgmac *bgmac = container_of(napi, struct bgmac, napi);
|
|
struct bgmac *bgmac = container_of(napi, struct bgmac, napi);
|
|
- struct bgmac_dma_ring *ring;
|
|
|
|
int handled = 0;
|
|
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;
|
|
|
|
- }
|
|
|
|
|
|
+ /* Ack */
|
|
|
|
+ bgmac_write(bgmac, BGMAC_INT_STATUS, ~0);
|
|
|
|
|
|
- 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;
|
|
|
|
- }
|
|
|
|
|
|
+ bgmac_dma_tx_free(bgmac, &bgmac->tx_ring[0]);
|
|
|
|
+ handled += bgmac_dma_rx_read(bgmac, &bgmac->rx_ring[0], weight);
|
|
|
|
|
|
- if (bgmac->int_status) {
|
|
|
|
- bgmac_err(bgmac, "Unknown IRQs: 0x%08X\n", bgmac->int_status);
|
|
|
|
- bgmac->int_status = 0;
|
|
|
|
- }
|
|
|
|
|
|
+ /* Poll again if more events arrived in the meantime */
|
|
|
|
+ if (bgmac_read(bgmac, BGMAC_INT_STATUS) & (BGMAC_IS_TX0 | BGMAC_IS_RX))
|
|
|
|
+ return handled;
|
|
|
|
|
|
if (handled < weight) {
|
|
if (handled < weight) {
|
|
napi_complete(napi);
|
|
napi_complete(napi);
|