Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- static void enc28j60_irq_work_handler(struct work_struct *work)
- {
- struct enc28j60_net *priv =
- container_of(work, struct enc28j60_net, irq_work);
- struct net_device *ndev = priv->netdev;
- int intflags, loop;
- if (netif_msg_intr(priv))
- printk(KERN_DEBUG DRV_NAME ": %s() enter\n", __func__);
- /* disable further interrupts */
- locked_reg_bfclr(priv, EIE, EIE_INTIE);
- do {
- loop = 0;
- intflags = locked_regb_read(priv, EIR);
- /* DMA interrupt handler (not currently used) */
- if ((intflags & EIR_DMAIF) != 0) {
- loop++;
- if (netif_msg_intr(priv))
- printk(KERN_DEBUG DRV_NAME
- ": intDMA(%d)\n", loop);
- locked_reg_bfclr(priv, EIR, EIR_DMAIF);
- }
- /* LINK changed handler */
- if ((intflags & EIR_LINKIF) != 0) {
- loop++;
- if (netif_msg_intr(priv))
- printk(KERN_DEBUG DRV_NAME
- ": intLINK(%d)\n", loop);
- enc28j60_check_link_status(ndev);
- /* read PHIR to clear the flag */
- enc28j60_phy_read(priv, PHIR);
- }
- /* TX complete handler */
- if ((intflags & EIR_TXIF) != 0) {
- bool err = false;
- loop++;
- if (netif_msg_intr(priv))
- printk(KERN_DEBUG DRV_NAME
- ": intTX(%d)\n", loop);
- priv->tx_retry_count = 0;
- if (locked_regb_read(priv, ESTAT) & ESTAT_TXABRT) {
- if (netif_msg_tx_err(priv))
- dev_err(&ndev->dev,
- "Tx Error (aborted)\n");
- err = true;
- }
- if (netif_msg_tx_done(priv)) {
- u8 tsv[TSV_SIZE];
- enc28j60_read_tsv(priv, tsv);
- enc28j60_dump_tsv(priv, "Tx Done", tsv);
- }
- enc28j60_tx_clear(ndev, err);
- locked_reg_bfclr(priv, EIR, EIR_TXIF);
- }
- /* TX Error handler */
- if ((intflags & EIR_TXERIF) != 0) {
- u8 tsv[TSV_SIZE];
- loop++;
- if (netif_msg_intr(priv))
- printk(KERN_DEBUG DRV_NAME
- ": intTXErr(%d)\n", loop);
- locked_reg_bfclr(priv, ECON1, ECON1_TXRTS);
- enc28j60_read_tsv(priv, tsv);
- if (netif_msg_tx_err(priv))
- enc28j60_dump_tsv(priv, "Tx Error", tsv);
- /* Reset TX logic */
- mutex_lock(&priv->lock);
- nolock_reg_bfset(priv, ECON1, ECON1_TXRST);
- nolock_reg_bfclr(priv, ECON1, ECON1_TXRST);
- nolock_txfifo_init(priv, TXSTART_INIT, TXEND_INIT);
- mutex_unlock(&priv->lock);
- /* Transmit Late collision check for retransmit */
- if (TSV_GETBIT(tsv, TSV_TXLATECOLLISION)) {
- if (netif_msg_tx_err(priv))
- printk(KERN_DEBUG DRV_NAME
- ": LateCollision TXErr (%d)\n",
- priv->tx_retry_count);
- if (priv->tx_retry_count++ < MAX_TX_RETRYCOUNT)
- locked_reg_bfset(priv, ECON1,
- ECON1_TXRTS);
- else
- enc28j60_tx_clear(ndev, true);
- } else
- enc28j60_tx_clear(ndev, true);
- locked_reg_bfclr(priv, EIR, EIR_TXERIF);
- }
- /* RX Error handler */
- if ((intflags & EIR_RXERIF) != 0) {
- loop++;
- if (netif_msg_intr(priv))
- printk(KERN_DEBUG DRV_NAME
- ": intRXErr(%d)\n", loop);
- /* Check free FIFO space to flag RX overrun */
- if (enc28j60_get_free_rxfifo(priv) <= 0) {
- if (netif_msg_rx_err(priv))
- printk(KERN_DEBUG DRV_NAME
- ": RX Overrun\n");
- ndev->stats.rx_dropped++;
- }
- locked_reg_bfclr(priv, EIR, EIR_RXERIF);
- }
- /* RX handler */
- if (enc28j60_rx_interrupt(ndev))
- loop++;
- } while (loop);
- /* re-enable interrupts */
- locked_reg_bfset(priv, EIE, EIE_INTIE);
- if (netif_msg_intr(priv))
- printk(KERN_DEBUG DRV_NAME ": %s() exit\n", __func__);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement