Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 440c411d authored by Eliad Peller's avatar Eliad Peller Committed by Emmanuel Grumbach
Browse files

iwlwifi: add D0i3 references boiler plate



D0i3 is bus power saving feature. It involves the
firmware - the driver needs to send a list of commands
to the firmware before entering this state. Wake up from
d0i3 also requires a few commands to the firmware.

The trigger to enter D0i3 is an idle timeout that will be
implemented later and will most probably rely on RUNTIME_PM
infrastructure.

In order to prevent entrance to D0i3 in critical flows, we
implement here a reference infrastructure. When a ref is
taken, we can't enter D0i3.

PCIe does't support D0i3.

Signed-off-by: default avatarEliad Peller <eliad@wizery.com>
Signed-off-by: default avatarArik Nemtsov <arik@wizery.com>
Signed-off-by: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
parent 8e0dc206
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -227,6 +227,7 @@ struct iwl_pwr_tx_backoff {
 * @high_temp: Is this NIC is designated to be in high temperature.
 * @host_interrupt_operation_mode: device needs host interrupt operation
 *	mode set
 * @d0i3: device uses d0i3 instead of d3
 * @nvm_hw_section_num: the ID of the HW NVM section
 * @pwr_tx_backoffs: translation table between power limits and backoffs
 *
@@ -259,6 +260,7 @@ struct iwl_cfg {
	const bool internal_wimax_coex;
	const bool host_interrupt_operation_mode;
	bool high_temp;
	bool d0i3;
	u8   nvm_hw_section_num;
	const struct iwl_pwr_tx_backoff *pwr_tx_backoffs;
};
+19 −0
Original line number Diff line number Diff line
@@ -443,6 +443,11 @@ struct iwl_trans;
 * @release_nic_access: let the NIC go to sleep. The "flags" parameter
 *	must be the same one that was sent before to the grab_nic_access.
 * @set_bits_mask - set SRAM register according to value and mask.
 * @ref: grab a reference to the transport/FW layers, disallowing
 *	certain low power states
 * @unref: release a reference previously taken with @ref. Note that
 *	initially the reference count is 1, making an initial @unref
 *	necessary to allow low power states.
 */
struct iwl_trans_ops {

@@ -489,6 +494,8 @@ struct iwl_trans_ops {
				   unsigned long *flags);
	void (*set_bits_mask)(struct iwl_trans *trans, u32 reg, u32 mask,
			      u32 value);
	void (*ref)(struct iwl_trans *trans);
	void (*unref)(struct iwl_trans *trans);
};

/**
@@ -630,6 +637,18 @@ static inline int iwl_trans_d3_resume(struct iwl_trans *trans,
	return trans->ops->d3_resume(trans, status, test);
}

static inline void iwl_trans_ref(struct iwl_trans *trans)
{
	if (trans->ops->ref)
		trans->ops->ref(trans);
}

static inline void iwl_trans_unref(struct iwl_trans *trans)
{
	if (trans->ops->unref)
		trans->ops->unref(trans);
}

static inline int iwl_trans_send_cmd(struct iwl_trans *trans,
				     struct iwl_host_cmd *cmd)
{