Skip to content

Commit d3e3527

Browse files
sebancqzed
authored andcommitted
BACKPORT: wireless/mwifiex: Fix S0ix / suspend
(cherry-picked from commit 8dbbfa6)
1 parent 6941a12 commit d3e3527

File tree

2 files changed

+40
-50
lines changed

2 files changed

+40
-50
lines changed

drivers/net/wireless/marvell/mwifiex/pcie.c

Lines changed: 39 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -149,37 +149,39 @@ static bool mwifiex_pcie_ok_to_access_hw(struct mwifiex_adapter *adapter)
149149
*/
150150
static int mwifiex_pcie_suspend(struct device *dev)
151151
{
152-
struct mwifiex_adapter *adapter;
153-
struct pcie_service_card *card;
154152
struct pci_dev *pdev = to_pci_dev(dev);
153+
struct pcie_service_card *card = pci_get_drvdata(pdev);
154+
struct mwifiex_adapter *adapter;
155+
struct mwifiex_private *priv;
156+
const struct mwifiex_pcie_card_reg *reg;
157+
u32 fw_status;
158+
int ret;
155159

156-
card = pci_get_drvdata(pdev);
157160

158161
/* Might still be loading firmware */
159162
wait_for_completion(&card->fw_done);
160163

161164
adapter = card->adapter;
162-
if (!adapter) {
163-
dev_err(dev, "adapter is not valid\n");
165+
if (!adapter || !adapter->priv_num)
164166
return 0;
165-
}
166167

167-
mwifiex_enable_wake(adapter);
168+
reg = card->pcie.reg;
169+
if (reg)
170+
ret = mwifiex_read_reg(adapter, reg->fw_status, &fw_status);
171+
else
172+
fw_status = -1;
173+
174+
if (fw_status == FIRMWARE_READY_PCIE && !adapter->mfg_mode) {
175+
mwifiex_deauthenticate_all(adapter);
168176

169-
/* Enable the Host Sleep */
170-
if (!mwifiex_enable_hs(adapter)) {
171-
mwifiex_dbg(adapter, ERROR,
172-
"cmd: failed to suspend\n");
173-
clear_bit(MWIFIEX_IS_HS_ENABLING, &adapter->work_flags);
174-
mwifiex_disable_wake(adapter);
175-
return -EFAULT;
176-
}
177+
priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY);
177178

178-
flush_workqueue(adapter->workqueue);
179+
mwifiex_disable_auto_ds(priv);
180+
181+
mwifiex_init_shutdown_fw(priv, MWIFIEX_FUNC_SHUTDOWN);
182+
}
179183

180-
/* Indicate device suspended */
181-
set_bit(MWIFIEX_IS_SUSPENDED, &adapter->work_flags);
182-
clear_bit(MWIFIEX_IS_HS_ENABLING, &adapter->work_flags);
184+
mwifiex_remove_card(adapter);
183185

184186
return 0;
185187
}
@@ -194,30 +196,29 @@ static int mwifiex_pcie_suspend(struct device *dev)
194196
*/
195197
static int mwifiex_pcie_resume(struct device *dev)
196198
{
197-
struct mwifiex_adapter *adapter;
198-
struct pcie_service_card *card;
199199
struct pci_dev *pdev = to_pci_dev(dev);
200+
struct pcie_service_card *card = pci_get_drvdata(pdev);
201+
int ret;
200202

201-
card = pci_get_drvdata(pdev);
203+
pr_debug("info: vendor=0x%4.04X device=0x%4.04X rev=%d\n",
204+
pdev->vendor, pdev->device, pdev->revision);
202205

203-
if (!card->adapter) {
204-
dev_err(dev, "adapter structure is not valid\n");
205-
return 0;
206-
}
206+
init_completion(&card->fw_done);
207207

208-
adapter = card->adapter;
208+
card->dev = pdev;
209209

210-
if (!test_bit(MWIFIEX_IS_SUSPENDED, &adapter->work_flags)) {
211-
mwifiex_dbg(adapter, WARN,
212-
"Device already resumed\n");
213-
return 0;
210+
/* device tree node parsing and platform specific configuration */
211+
if (pdev->dev.of_node) {
212+
ret = mwifiex_pcie_probe_of(&pdev->dev);
213+
if (ret)
214+
return ret;
214215
}
215216

216-
clear_bit(MWIFIEX_IS_SUSPENDED, &adapter->work_flags);
217-
218-
mwifiex_cancel_hs(mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA),
219-
MWIFIEX_ASYNC_CMD);
220-
mwifiex_disable_wake(adapter);
217+
if (mwifiex_add_card(card, &card->fw_done, &pcie_ops,
218+
MWIFIEX_PCIE, &pdev->dev)) {
219+
pr_err("%s failed\n", __func__);
220+
return -1;
221+
}
221222

222223
return 0;
223224
}
@@ -271,6 +272,8 @@ static int mwifiex_pcie_probe(struct pci_dev *pdev,
271272
return -1;
272273
}
273274

275+
pdev->bus->self->bridge_d3 = false;
276+
274277
return 0;
275278
}
276279

drivers/net/wireless/marvell/mwifiex/sta_cmd.c

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2265,14 +2265,13 @@ int mwifiex_sta_prepare_cmd(struct mwifiex_private *priv, uint16_t cmd_no,
22652265
int mwifiex_sta_init_cmd(struct mwifiex_private *priv, u8 first_sta, bool init)
22662266
{
22672267
struct mwifiex_adapter *adapter = priv->adapter;
2268-
int ret;
22692268
struct mwifiex_ds_11n_amsdu_aggr_ctrl amsdu_aggr_ctrl;
2270-
struct mwifiex_ds_auto_ds auto_ds;
22712269
enum state_11d_t state_11d;
22722270
struct mwifiex_ds_11n_tx_cfg tx_cfg;
22732271
u8 sdio_sp_rx_aggr_enable;
22742272
u16 packet_aggr_enable;
22752273
int data;
2274+
int ret;
22762275

22772276
if (first_sta) {
22782277
if (priv->adapter->iface_type == MWIFIEX_PCIE) {
@@ -2395,18 +2394,6 @@ int mwifiex_sta_init_cmd(struct mwifiex_private *priv, u8 first_sta, bool init)
23952394
if (ret)
23962395
return -1;
23972396

2398-
if (!disable_auto_ds && first_sta &&
2399-
priv->bss_type != MWIFIEX_BSS_TYPE_UAP) {
2400-
/* Enable auto deep sleep */
2401-
auto_ds.auto_ds = DEEP_SLEEP_ON;
2402-
auto_ds.idle_time = DEEP_SLEEP_IDLE_TIME;
2403-
ret = mwifiex_send_cmd(priv, HostCmd_CMD_802_11_PS_MODE_ENH,
2404-
EN_AUTO_PS, BITMAP_AUTO_DS,
2405-
&auto_ds, true);
2406-
if (ret)
2407-
return -1;
2408-
}
2409-
24102397
if (priv->bss_type != MWIFIEX_BSS_TYPE_UAP) {
24112398
/* Send cmd to FW to enable/disable 11D function */
24122399
state_11d = ENABLE_11D;

0 commit comments

Comments
 (0)