void gelic_card_up(struct gelic_card *card) { pr_debug("%s: called\n", __func__); mutex_lock(&card->updown_lock); if (atomic_inc_return(&card->users) == 1) { pr_debug("%s: real do\n", __func__); /* enable irq */ gelic_card_set_irq_mask(card, card->irq_mask); /* start rx */ gelic_card_enable_rxdmac(card); napi_enable(&card->napi); } mutex_unlock(&card->updown_lock); pr_debug("%s: done\n", __func__); }
/** * gelic_card_interrupt - event handler for gelic_net */ static irqreturn_t gelic_card_interrupt(int irq, void *ptr) { unsigned long flags; struct gelic_card *card = ptr; u64 status; status = card->irq_status; if (!status) return IRQ_NONE; status &= card->irq_mask; if (card->rx_dma_restart_required) { card->rx_dma_restart_required = 0; gelic_card_enable_rxdmac(card); } if (status & GELIC_CARD_RXINT) { gelic_card_rx_irq_off(card); napi_schedule(&card->napi); } if (status & GELIC_CARD_TXINT) { spin_lock_irqsave(&card->tx_lock, flags); card->tx_dma_progress = 0; gelic_card_release_tx_chain(card, 0); /* kick outstanding tx descriptor if any */ gelic_card_kick_txdma(card, card->tx_chain.tail); spin_unlock_irqrestore(&card->tx_lock, flags); } /* ether port status changed */ if (status & GELIC_CARD_PORT_STATUS_CHANGED) gelic_card_get_ether_port_status(card, 1); #ifdef CONFIG_GELIC_WIRELESS if (status & (GELIC_CARD_WLAN_EVENT_RECEIVED | GELIC_CARD_WLAN_COMMAND_COMPLETED)) gelic_wl_interrupt(card->netdev[GELIC_PORT_WIRELESS], status); #endif return IRQ_HANDLED; }