diff --git a/drivers/net/b44.c b/drivers/net/b44.c index 69d9f3d..72537c1 100644 --- a/drivers/net/b44.c +++ b/drivers/net/b44.c @@ -852,12 +852,46 @@ static int b44_poll(struct napi_struct *napi, int budget) /* spin_unlock(&bp->tx_lock); */ } spin_unlock_irqrestore(&bp->lock, flags); + if (bp->istat & ISTAT_DSCE) + { + printk(KERN_INFO "b44_poll: ISTAT_DSCE\n"); + } + if (bp->istat & ISTAT_DATAE) + { + printk(KERN_INFO "b44_poll: ISTAT_DATAE\n"); + } + if (bp->istat & ISTAT_DPE) + { + printk(KERN_INFO "b44_poll: ISTAT_DPE\n"); + } + if (bp->istat & ISTAT_RDU) + { + printk(KERN_INFO "b44_poll: ISTAT_RDU\n"); + } + if (bp->istat & ISTAT_RFO) + { + printk(KERN_INFO "b44_poll: ISTAT_RFO\n"); + spin_lock_irqsave(&bp->lock, flags); + b44_disable_ints(bp); + /* This resets the ISTAT_RFO flag */ + ssb_device_enable(bp->sdev, 0); + b44_init_rings(bp); + b44_init_hw(bp, B44_FULL_RESET_SKIP_PHY); + netif_wake_queue(bp->dev); + spin_unlock_irqrestore(&bp->lock, flags); + work_done = 0; + } + if (bp->istat & ISTAT_TFU) + { + printk(KERN_INFO "b44_poll: ISTAT_TFU\n"); + } + work_done = 0; if (bp->istat & ISTAT_RX) work_done += b44_rx(bp, budget); - if (bp->istat & ISTAT_ERRORS) { + if ((bp->istat & ISTAT_ERRORS) && !(bp->istat & ISTAT_RFO)) { spin_lock_irqsave(&bp->lock, flags); b44_halt(bp); b44_init_rings(bp);