|
@@ -889,16 +889,17 @@ static int ks8851_net_stop(struct net_device *dev)
|
|
|
netif_stop_queue(dev);
|
|
|
|
|
|
mutex_lock(&ks->lock);
|
|
|
+ /* turn off the IRQs and ack any outstanding */
|
|
|
+ ks8851_wrreg16(ks, KS_IER, 0x0000);
|
|
|
+ ks8851_wrreg16(ks, KS_ISR, 0xffff);
|
|
|
+ mutex_unlock(&ks->lock);
|
|
|
|
|
|
/* stop any outstanding work */
|
|
|
flush_work(&ks->irq_work);
|
|
|
flush_work(&ks->tx_work);
|
|
|
flush_work(&ks->rxctrl_work);
|
|
|
|
|
|
- /* turn off the IRQs and ack any outstanding */
|
|
|
- ks8851_wrreg16(ks, KS_IER, 0x0000);
|
|
|
- ks8851_wrreg16(ks, KS_ISR, 0xffff);
|
|
|
-
|
|
|
+ mutex_lock(&ks->lock);
|
|
|
/* shutdown RX process */
|
|
|
ks8851_wrreg16(ks, KS_RXCR1, 0x0000);
|
|
|
|
|
@@ -907,6 +908,7 @@ static int ks8851_net_stop(struct net_device *dev)
|
|
|
|
|
|
/* set powermode to soft power down to save power */
|
|
|
ks8851_set_powermode(ks, PMECR_PM_SOFTDOWN);
|
|
|
+ mutex_unlock(&ks->lock);
|
|
|
|
|
|
/* ensure any queued tx buffers are dumped */
|
|
|
while (!skb_queue_empty(&ks->txq)) {
|
|
@@ -918,7 +920,6 @@ static int ks8851_net_stop(struct net_device *dev)
|
|
|
dev_kfree_skb(txb);
|
|
|
}
|
|
|
|
|
|
- mutex_unlock(&ks->lock);
|
|
|
return 0;
|
|
|
}
|
|
|
|