@@ -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);