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

Commit 4636187d authored by Amitkumar Karwar's avatar Amitkumar Karwar Committed by Kalle Valo
Browse files

mwifiex: add wakeup timer based recovery mechanism



If host fails to wakeup the firmware, we will trigger card reset
after 3 second timeout.

Signed-off-by: default avatarCathy Luo <cluo@marvell.com>
Signed-off-by: default avatarAmitkumar Karwar <akarwar@marvell.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent b4f1b177
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -52,6 +52,18 @@ static int mwifiex_add_bss_prio_tbl(struct mwifiex_private *priv)
	return 0;
}

static void wakeup_timer_fn(unsigned long data)
{
	struct mwifiex_adapter *adapter = (struct mwifiex_adapter *)data;

	dev_err(adapter->dev, "Firmware wakeup failed\n");
	adapter->hw_status = MWIFIEX_HW_STATUS_RESET;
	mwifiex_cancel_all_pending_cmd(adapter);

	if (adapter->if_ops.card_reset)
		adapter->if_ops.card_reset(adapter);
}

/*
 * This function initializes the private structure and sets default
 * values to the members.
@@ -285,6 +297,9 @@ static void mwifiex_init_adapter(struct mwifiex_adapter *adapter)
	adapter->ext_scan = true;
	adapter->key_api_major_ver = 0;
	adapter->key_api_minor_ver = 0;

	setup_timer(&adapter->wakeup_timer, wakeup_timer_fn,
		    (unsigned long)adapter);
}

/*
@@ -391,6 +406,7 @@ mwifiex_adapter_cleanup(struct mwifiex_adapter *adapter)
		return;
	}

	del_timer(&adapter->wakeup_timer);
	mwifiex_cancel_all_pending_cmd(adapter);

	/* Free lock variables */
+2 −0
Original line number Diff line number Diff line
@@ -237,6 +237,7 @@ int mwifiex_main_process(struct mwifiex_adapter *adapter)
		    (is_command_pending(adapter) ||
		     !mwifiex_wmm_lists_empty(adapter))) {
			adapter->pm_wakeup_fw_try = true;
			mod_timer(&adapter->wakeup_timer, jiffies + (HZ*3));
			adapter->if_ops.wakeup(adapter);
			continue;
		}
@@ -244,6 +245,7 @@ int mwifiex_main_process(struct mwifiex_adapter *adapter)
		if (IS_CARD_RX_RCVD(adapter)) {
			adapter->data_received = false;
			adapter->pm_wakeup_fw_try = false;
			del_timer_sync(&adapter->wakeup_timer);
			if (adapter->ps_state == PS_STATE_SLEEP)
				adapter->ps_state = PS_STATE_AWAKE;
		} else {
+1 −0
Original line number Diff line number Diff line
@@ -830,6 +830,7 @@ struct mwifiex_adapter {
	u16 gen_null_pkt;
	u16 pps_uapsd_mode;
	u32 pm_wakeup_fw_try;
	struct timer_list wakeup_timer;
	u8 is_hs_configured;
	struct mwifiex_hs_config_param hs_cfg;
	u8 hs_activated;
+1 −0
Original line number Diff line number Diff line
@@ -2064,6 +2064,7 @@ static void mwifiex_interrupt_status(struct mwifiex_adapter *adapter)
				 * state until cookie is set */
				adapter->ps_state = PS_STATE_AWAKE;
				adapter->pm_wakeup_fw_try = false;
				del_timer(&adapter->wakeup_timer);
		}
	}
}
+3 −0
Original line number Diff line number Diff line
@@ -312,6 +312,8 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv)
					adapter->ps_state = PS_STATE_AWAKE;
					adapter->pm_wakeup_card_req = false;
					adapter->pm_wakeup_fw_try = false;
					mod_timer(&adapter->wakeup_timer,
						  jiffies + (HZ*3));
					break;
				}
				if (!mwifiex_send_null_packet
@@ -326,6 +328,7 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv)
		adapter->ps_state = PS_STATE_AWAKE;
		adapter->pm_wakeup_card_req = false;
		adapter->pm_wakeup_fw_try = false;
		del_timer_sync(&adapter->wakeup_timer);

		break;

Loading