mirror of https://gitee.com/openkylin/linux.git
iwlwifi: make sure device is reset when unloading driver
Add unconditional call to apm_ops.stop() to reset device to low power state when unloading driver. Some paths have existed to unload driver *without* resetting device, therefore some errors have persisted through multiple load/unload cycles, until the whole platform gets rebooted; this is an attempt to remedy some of those situations. Sorry, I can't seem to find a bughost.org bug that specifically has these symptoms, but I had it happen recently here. Note that this will *not* fix situations in which the PCI express bus has crashed (evidenced by register reads showing "0xffffffff"), e.g. bughost.org 1855 and 2096; device is unreachable from driver in those cases. Signed-off-by: Ben Cahill <ben.m.cahill@intel.com> Signed-off-by: Reinette Chatre <reinette.chatre@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
442464218d
commit
c166b25a5c
|
@ -3256,6 +3256,15 @@ static void __devexit iwl_pci_remove(struct pci_dev *pdev)
|
|||
iwl_down(priv);
|
||||
}
|
||||
|
||||
/*
|
||||
* Make sure device is reset to low power before unloading driver.
|
||||
* This may be redundant with iwl_down(), but there are paths to
|
||||
* run iwl_down() without calling apm_ops.stop(), and there are
|
||||
* paths to avoid running iwl_down() at all before leaving driver.
|
||||
* This (inexpensive) call *makes sure* device is reset.
|
||||
*/
|
||||
priv->cfg->ops->lib->apm_ops.stop(priv);
|
||||
|
||||
iwl_tt_exit(priv);
|
||||
|
||||
/* make sure we flush any pending irq or
|
||||
|
|
|
@ -4135,6 +4135,15 @@ static void __devexit iwl3945_pci_remove(struct pci_dev *pdev)
|
|||
iwl3945_down(priv);
|
||||
}
|
||||
|
||||
/*
|
||||
* Make sure device is reset to low power before unloading driver.
|
||||
* This may be redundant with iwl_down(), but there are paths to
|
||||
* run iwl_down() without calling apm_ops.stop(), and there are
|
||||
* paths to avoid running iwl_down() at all before leaving driver.
|
||||
* This (inexpensive) call *makes sure* device is reset.
|
||||
*/
|
||||
priv->cfg->ops->lib->apm_ops.stop(priv);
|
||||
|
||||
/* make sure we flush any pending irq or
|
||||
* tasklet for the driver
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue