Index: chromeos/compat-wireless/drivers/net/b44.c |
diff --git a/chromeos/compat-wireless/drivers/net/b44.c b/chromeos/compat-wireless/drivers/net/b44.c |
index 739610967ca041b4a2642e2795d2b441e76e241e..86fb2855d724708d62a8a25460487e9a17099ffe 100644 |
--- a/chromeos/compat-wireless/drivers/net/b44.c |
+++ b/chromeos/compat-wireless/drivers/net/b44.c |
@@ -848,6 +848,15 @@ static int b44_poll(struct napi_struct *napi, int budget) |
b44_tx(bp); |
/* spin_unlock(&bp->tx_lock); */ |
} |
+ if (bp->istat & ISTAT_RFO) { /* fast recovery, in ~20msec */ |
+ bp->istat &= ~ISTAT_RFO; |
+ b44_disable_ints(bp); |
+ ssb_device_enable(bp->sdev, 0); /* resets ISTAT_RFO */ |
+ 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; |
@@ -2165,8 +2174,6 @@ static int __devinit b44_init_one(struct ssb_device *sdev, |
dev->irq = sdev->irq; |
SET_ETHTOOL_OPS(dev, &b44_ethtool_ops); |
- netif_carrier_off(dev); |
- |
err = ssb_bus_powerup(sdev->bus, 0); |
if (err) { |
dev_err(sdev->dev, |
@@ -2208,6 +2215,8 @@ static int __devinit b44_init_one(struct ssb_device *sdev, |
goto err_out_powerdown; |
} |
+ netif_carrier_off(dev); |
+ |
ssb_set_drvdata(sdev, dev); |
/* Chip reset provides power to the b44 MAC & PCI cores, which |