Comment 58 for bug 279102

Revision history for this message
Jean-Louis Dupond (dupondje) wrote :

I modified the driver to:

static int b44_poll(struct napi_struct *napi, int budget)
{
        struct b44 *bp = container_of(napi, struct b44, napi);
        int work_done;

        spin_lock_irq(&bp->lock);

        if (bp->istat & (ISTAT_TX | ISTAT_TO)) {
                /* spin_lock(&bp->tx_lock); */
                b44_tx(bp);
                /* spin_unlock(&bp->tx_lock); */
        }
        spin_unlock_irq(&bp->lock);

        work_done = 0;
        if (bp->istat & ISTAT_RX)
                work_done += b44_rx(bp, budget);

        if (bp->istat & ISTAT_ERRORS) {
                unsigned long flags;

                spin_lock_irqsave(&bp->lock, flags);

                printk(KERN_INFO PFX "DUP: b44_poll\n");

                if (bp->istat & ISTAT_DSCE)
                {
                        printk(KERN_INFO PFX "DUP: ISTAT_DSCE\n");
                }
                if (bp->istat & ISTAT_DATAE)
                {
                        printk(KERN_INFO PFX "DUP: ISTAT_DATAE\n");
                }
                if (bp->istat & ISTAT_DPE)
                {
                        printk(KERN_INFO PFX "DUP: ISTAT_DPE\n");
                }
                if (bp->istat & ISTAT_RDU)
                {
                        printk(KERN_INFO PFX "DUP: ISTAT_RDU\n");
                }
                if (bp->istat & ISTAT_RFO)
                {
                        printk(KERN_INFO PFX "DUP: ISTAT_RFO\n");
                }
                if (bp->istat & ISTAT_TFU)
                {
                        printk(KERN_INFO PFX "DUP: ISTAT_TFU\n");
                }

                b44_halt(bp);
                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 (work_done < budget) {
                napi_complete(napi);
                b44_enable_ints(bp);
        }

        return work_done;
}

And when it goes down I see:

[25656.573416] b44: DUP: b44_poll
[25656.573424] b44: DUP: ISTAT_RFO
[25656.573627] b44: eth0: powering down PHY
[25656.816096] b44: eth0: Link is down.
[25659.816225] b44: eth0: Link is up at 100 Mbps, full duplex.
[25659.816231] b44: eth0: Flow control is off for TX and off for RX.