mirror of https://gitee.com/openkylin/linux.git
mwifiex: resolve suspend() race with async FW init failure
Signed-off-by: Brian Norris <briannorris@chromium.org> Tested-by: Xinming Hu <huxm@marvell.com> Signed-off-by: Amitkumar Karwar <akarwar@marvell.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
This commit is contained in:
parent
7ccdf72f91
commit
b42dbb27e3
|
@ -118,12 +118,20 @@ static int mwifiex_pcie_suspend(struct device *dev)
|
|||
struct pci_dev *pdev = to_pci_dev(dev);
|
||||
|
||||
card = pci_get_drvdata(pdev);
|
||||
if (!card || !card->adapter) {
|
||||
pr_err("Card or adapter structure is not valid\n");
|
||||
if (!card) {
|
||||
dev_err(dev, "card structure is not valid\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Might still be loading firmware */
|
||||
wait_for_completion(&card->fw_done);
|
||||
|
||||
adapter = card->adapter;
|
||||
if (!adapter) {
|
||||
dev_err(dev, "adapter is not valid\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
mwifiex_enable_wake(adapter);
|
||||
|
||||
/* Enable the Host Sleep */
|
||||
|
|
|
@ -283,8 +283,8 @@ static int mwifiex_sdio_suspend(struct device *dev)
|
|||
}
|
||||
|
||||
card = sdio_get_drvdata(func);
|
||||
if (!card || !card->adapter) {
|
||||
pr_err("suspend: invalid card or adapter\n");
|
||||
if (!card) {
|
||||
dev_err(dev, "suspend: invalid card\n");
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
|
@ -292,7 +292,15 @@ static int mwifiex_sdio_suspend(struct device *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* Might still be loading firmware */
|
||||
wait_for_completion(&card->fw_done);
|
||||
|
||||
adapter = card->adapter;
|
||||
if (!adapter) {
|
||||
dev_err(dev, "adapter is not valid\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
mwifiex_enable_wake(adapter);
|
||||
|
||||
/* Enable the Host Sleep */
|
||||
|
|
|
@ -503,11 +503,19 @@ static int mwifiex_usb_suspend(struct usb_interface *intf, pm_message_t message)
|
|||
struct usb_tx_data_port *port;
|
||||
int i, j;
|
||||
|
||||
if (!card || !card->adapter) {
|
||||
pr_err("%s: card or card->adapter is NULL\n", __func__);
|
||||
if (!card) {
|
||||
dev_err(&intf->dev, "%s: card is NULL\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Might still be loading firmware */
|
||||
wait_for_completion(&card->fw_done);
|
||||
|
||||
adapter = card->adapter;
|
||||
if (!adapter) {
|
||||
dev_err(&intf->dev, "card is not valid\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (unlikely(adapter->is_suspended))
|
||||
mwifiex_dbg(adapter, WARN,
|
||||
|
|
Loading…
Reference in New Issue