diff options
author | Johannes Berg <johannes.berg@intel.com> | 2013-01-08 05:25:44 -0500 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2013-01-16 08:19:54 -0500 |
commit | ddaf5a5b300b8f9d3591b509fd8bedab1c9887be (patch) | |
tree | c78ebe39d33bf334e120d08c3206a5b048f8fcea /drivers/net/wireless/iwlwifi/iwl-trans.h | |
parent | 22dc3c9561825a7c2cd18d01b01358c2141a8e16 (diff) |
iwlwifi: enable communication with WoWLAN firmware
On resuming, the opmode may have to be able to talk
to the WoWLAN/D3 firmware in order to query it about
its status and wakeup reasons. To do that, the opmode
has to call the new d3_resume() transport API which
will set up the device for command communcation.
Reviewed-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-trans.h')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-trans.h | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-trans.h b/drivers/net/wireless/iwlwifi/iwl-trans.h index 55a140ade5a7..0f85eb305878 100644 --- a/drivers/net/wireless/iwlwifi/iwl-trans.h +++ b/drivers/net/wireless/iwlwifi/iwl-trans.h | |||
@@ -308,6 +308,16 @@ static inline struct page *rxb_steal_page(struct iwl_rx_cmd_buffer *r) | |||
308 | #define IWL_FRAME_LIMIT 64 | 308 | #define IWL_FRAME_LIMIT 64 |
309 | 309 | ||
310 | /** | 310 | /** |
311 | * enum iwl_wowlan_status - WoWLAN image/device status | ||
312 | * @IWL_D3_STATUS_ALIVE: firmware is still running after resume | ||
313 | * @IWL_D3_STATUS_RESET: device was reset while suspended | ||
314 | */ | ||
315 | enum iwl_d3_status { | ||
316 | IWL_D3_STATUS_ALIVE, | ||
317 | IWL_D3_STATUS_RESET, | ||
318 | }; | ||
319 | |||
320 | /** | ||
311 | * struct iwl_trans_config - transport configuration | 321 | * struct iwl_trans_config - transport configuration |
312 | * | 322 | * |
313 | * @op_mode: pointer to the upper layer. | 323 | * @op_mode: pointer to the upper layer. |
@@ -363,9 +373,12 @@ struct iwl_trans; | |||
363 | * May sleep | 373 | * May sleep |
364 | * @stop_device:stops the whole device (embedded CPU put to reset) | 374 | * @stop_device:stops the whole device (embedded CPU put to reset) |
365 | * May sleep | 375 | * May sleep |
366 | * @wowlan_suspend: put the device into the correct mode for WoWLAN during | 376 | * @d3_suspend: put the device into the correct mode for WoWLAN during |
367 | * suspend. This is optional, if not implemented WoWLAN will not be | 377 | * suspend. This is optional, if not implemented WoWLAN will not be |
368 | * supported. This callback may sleep. | 378 | * supported. This callback may sleep. |
379 | * @d3_resume: resume the device after WoWLAN, enabling the opmode to | ||
380 | * talk to the WoWLAN image to get its status. This is optional, if not | ||
381 | * implemented WoWLAN will not be supported. This callback may sleep. | ||
369 | * @send_cmd:send a host command. Must return -ERFKILL if RFkill is asserted. | 382 | * @send_cmd:send a host command. Must return -ERFKILL if RFkill is asserted. |
370 | * If RFkill is asserted in the middle of a SYNC host command, it must | 383 | * If RFkill is asserted in the middle of a SYNC host command, it must |
371 | * return -ERFKILL straight away. | 384 | * return -ERFKILL straight away. |
@@ -409,7 +422,8 @@ struct iwl_trans_ops { | |||
409 | void (*fw_alive)(struct iwl_trans *trans, u32 scd_addr); | 422 | void (*fw_alive)(struct iwl_trans *trans, u32 scd_addr); |
410 | void (*stop_device)(struct iwl_trans *trans); | 423 | void (*stop_device)(struct iwl_trans *trans); |
411 | 424 | ||
412 | void (*wowlan_suspend)(struct iwl_trans *trans); | 425 | void (*d3_suspend)(struct iwl_trans *trans); |
426 | int (*d3_resume)(struct iwl_trans *trans, enum iwl_d3_status *status); | ||
413 | 427 | ||
414 | int (*send_cmd)(struct iwl_trans *trans, struct iwl_host_cmd *cmd); | 428 | int (*send_cmd)(struct iwl_trans *trans, struct iwl_host_cmd *cmd); |
415 | 429 | ||
@@ -562,10 +576,17 @@ static inline void iwl_trans_stop_device(struct iwl_trans *trans) | |||
562 | trans->state = IWL_TRANS_NO_FW; | 576 | trans->state = IWL_TRANS_NO_FW; |
563 | } | 577 | } |
564 | 578 | ||
565 | static inline void iwl_trans_wowlan_suspend(struct iwl_trans *trans) | 579 | static inline void iwl_trans_d3_suspend(struct iwl_trans *trans) |
580 | { | ||
581 | might_sleep(); | ||
582 | trans->ops->d3_suspend(trans); | ||
583 | } | ||
584 | |||
585 | static inline int iwl_trans_d3_resume(struct iwl_trans *trans, | ||
586 | enum iwl_d3_status *status) | ||
566 | { | 587 | { |
567 | might_sleep(); | 588 | might_sleep(); |
568 | trans->ops->wowlan_suspend(trans); | 589 | return trans->ops->d3_resume(trans, status); |
569 | } | 590 | } |
570 | 591 | ||
571 | static inline int iwl_trans_send_cmd(struct iwl_trans *trans, | 592 | static inline int iwl_trans_send_cmd(struct iwl_trans *trans, |