@@ -149,39 +149,37 @@ static bool mwifiex_pcie_ok_to_access_hw(struct mwifiex_adapter *adapter)
149149 */
150150static int mwifiex_pcie_suspend (struct device * dev )
151151{
152- struct pci_dev * pdev = to_pci_dev (dev );
153- struct pcie_service_card * card = pci_get_drvdata (pdev );
154152 struct mwifiex_adapter * adapter ;
155- struct mwifiex_private * priv ;
156- const struct mwifiex_pcie_card_reg * reg ;
157- u32 fw_status ;
158- int ret ;
153+ struct pcie_service_card * card ;
154+ struct pci_dev * pdev = to_pci_dev (dev );
159155
156+ card = pci_get_drvdata (pdev );
160157
161158 /* Might still be loading firmware */
162159 wait_for_completion (& card -> fw_done );
163160
164161 adapter = card -> adapter ;
165- if (!adapter || !adapter -> priv_num )
162+ if (!adapter ) {
163+ dev_err (dev , "adapter is not valid\n" );
166164 return 0 ;
165+ }
167166
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 );
176-
177- priv = mwifiex_get_priv (adapter , MWIFIEX_BSS_ROLE_ANY );
178-
179- mwifiex_disable_auto_ds (priv );
167+ mwifiex_enable_wake (adapter );
180168
181- mwifiex_init_shutdown_fw (priv , MWIFIEX_FUNC_SHUTDOWN );
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 ;
182176 }
183177
184- mwifiex_remove_card (adapter );
178+ flush_workqueue (adapter -> workqueue );
179+
180+ /* Indicate device suspended */
181+ set_bit (MWIFIEX_IS_SUSPENDED , & adapter -> work_flags );
182+ clear_bit (MWIFIEX_IS_HS_ENABLING , & adapter -> work_flags );
185183
186184 return 0 ;
187185}
@@ -196,29 +194,30 @@ static int mwifiex_pcie_suspend(struct device *dev)
196194 */
197195static int mwifiex_pcie_resume (struct device * dev )
198196{
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 ;
202200
203- pr_debug ("info: vendor=0x%4.04X device=0x%4.04X rev=%d\n" ,
204- pdev -> vendor , pdev -> device , pdev -> revision );
201+ card = pci_get_drvdata (pdev );
205202
206- init_completion (& card -> fw_done );
203+ if (!card -> adapter ) {
204+ dev_err (dev , "adapter structure is not valid\n" );
205+ return 0 ;
206+ }
207207
208- card -> dev = pdev ;
208+ adapter = card -> adapter ;
209209
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 ;
210+ if (!test_bit (MWIFIEX_IS_SUSPENDED , & adapter -> work_flags )) {
211+ mwifiex_dbg (adapter , WARN ,
212+ "Device already resumed\n" );
213+ return 0 ;
215214 }
216215
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- }
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 );
222221
223222 return 0 ;
224223}
@@ -272,8 +271,6 @@ static int mwifiex_pcie_probe(struct pci_dev *pdev,
272271 return -1 ;
273272 }
274273
275- pdev -> bus -> self -> bridge_d3 = false;
276-
277274 return 0 ;
278275}
279276
0 commit comments