linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
To: linux-wireless@vger.kernel.org
Cc: Matti Gottlieb <matti.gottlieb@intel.com>,
	Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Subject: [PATCH 40/41] iwlwifi: mvm: ROC: Extend the ROC max delay duration & limit ROC duration
Date: Tue,  1 Dec 2015 11:59:06 +0200	[thread overview]
Message-ID: <1448963947-24302-40-git-send-email-emmanuel.grumbach@intel.com> (raw)
In-Reply-To: <0BA3FCBA62E2DC44AF3030971E174FB32E905B07@hasmsx107.ger.corp.intel.com>

From: Matti Gottlieb <matti.gottlieb@intel.com>

When associated to an AP and a ROC event with a long duration is scheduled
the FW may have a hard time scheduling a consecutive time event, since it
has to remain on the connection channel to hear the AP's DTIM.
In addition, when associated and a ROC is requested with a duration
greater than the DTIM interval, the FW will not be able to schedule
the ROC event, since it needs to wake up for the DTIM.

Increasing the "max delay" duration to the DTIM period will allow the FW to
wait until after the DTIM and then schedule the ROC time event.
Limiting the ROC to be less than the DTIM interval will assure that the
time event will be scheduled for at least part of the time (instead of
automatically failing)

Extend the ROC max delay duration to min(dtim_interval * 3, 600TU),
and limit the duration to be less than the DTIM interval.

Signed-off-by: Matti Gottlieb <matti.gottlieb@intel.com>
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
---
 drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 42 ++++++++++++++++++++---
 1 file changed, 38 insertions(+), 4 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
index 327703d..a90f1ee 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
@@ -2707,7 +2707,11 @@ static bool iwl_mvm_rx_aux_roc(struct iwl_notif_wait_data *notif_wait,
 	return true;
 }
 
-#define AUX_ROC_MAX_DELAY_ON_CHANNEL 200
+#define AUX_ROC_MIN_DURATION MSEC_TO_TU(100)
+#define AUX_ROC_MIN_DELAY MSEC_TO_TU(200)
+#define AUX_ROC_MAX_DELAY MSEC_TO_TU(600)
+#define AUX_ROC_SAFETY_BUFFER MSEC_TO_TU(20)
+#define AUX_ROC_MIN_SAFETY_BUFFER MSEC_TO_TU(10)
 static int iwl_mvm_send_aux_roc_cmd(struct iwl_mvm *mvm,
 				    struct ieee80211_channel *channel,
 				    struct ieee80211_vif *vif,
@@ -2718,6 +2722,9 @@ static int iwl_mvm_send_aux_roc_cmd(struct iwl_mvm *mvm,
 	struct iwl_mvm_time_event_data *te_data = &mvmvif->hs_time_event_data;
 	static const u16 time_event_response[] = { HOT_SPOT_CMD };
 	struct iwl_notification_wait wait_time_event;
+	u32 dtim_interval = vif->bss_conf.dtim_period *
+		vif->bss_conf.beacon_int;
+	u32 req_dur, delay;
 	struct iwl_hs20_roc_req aux_roc_req = {
 		.action = cpu_to_le32(FW_CTXT_ACTION_ADD),
 		.id_and_color =
@@ -2730,11 +2737,38 @@ static int iwl_mvm_send_aux_roc_cmd(struct iwl_mvm *mvm,
 		.channel_info.width = PHY_VHT_CHANNEL_MODE20,
 		/* Set the time and duration */
 		.apply_time = cpu_to_le32(iwl_read_prph(mvm->trans, time_reg)),
-		.apply_time_max_delay =
-			cpu_to_le32(MSEC_TO_TU(AUX_ROC_MAX_DELAY_ON_CHANNEL)),
-		.duration = cpu_to_le32(MSEC_TO_TU(duration)),
 	 };
 
+	delay = AUX_ROC_MIN_DELAY;
+	req_dur = MSEC_TO_TU(duration);
+
+	/*
+	 * If we are associated we want the delay time to be at least one
+	 * dtim interval so that the FW can wait until after the DTIM and
+	 * then start the time event, this will potentially allow us to
+	 * remain off-channel for the max duration.
+	 * Since we want to use almost a whole dtim interval we would also
+	 * like the delay to be for 2-3 dtim intervals, in case there are
+	 * other time events with higher priority.
+	 */
+	if (vif->bss_conf.assoc) {
+		delay = min_t(u32, dtim_interval * 3, AUX_ROC_MAX_DELAY);
+		/* We cannot remain off-channel longer than the DTIM interval */
+		if (dtim_interval <= req_dur) {
+			req_dur = dtim_interval - AUX_ROC_SAFETY_BUFFER;
+			if (req_dur <= AUX_ROC_MIN_DURATION)
+				req_dur = dtim_interval -
+					AUX_ROC_MIN_SAFETY_BUFFER;
+		}
+	}
+
+	aux_roc_req.duration = cpu_to_le32(req_dur);
+	aux_roc_req.apply_time_max_delay = cpu_to_le32(delay);
+
+	IWL_DEBUG_TE(mvm,
+		     "ROC: Requesting to remain on channel %u for %ums (requested = %ums, max_delay = %ums, dtim_interval = %ums)\n",
+		     channel->hw_value, req_dur, duration, delay,
+		     dtim_interval);
 	/* Set the node address */
 	memcpy(aux_roc_req.node_addr, vif->addr, ETH_ALEN);
 
-- 
2.5.0


  parent reply	other threads:[~2015-12-01 10:00 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-01  9:56 pull request: iwlwifi-next 2015-12-01 Grumbach, Emmanuel
2015-12-01  9:58 ` [PATCH 01/41] iwlwifi: nvm: fix up phy section when reading it Emmanuel Grumbach
2015-12-01  9:58 ` [PATCH 02/41] iwlwifi: add support for 12K Receive Buffers Emmanuel Grumbach
2015-12-01  9:58 ` [PATCH 03/41] iwlwifi: dvm: remove Kconfig default Emmanuel Grumbach
2015-12-01  9:58 ` [PATCH 04/41] iwlwifi: trans: make various conversion macros inlines Emmanuel Grumbach
2015-12-01  9:58 ` [PATCH 05/41] iwlwifi: mvm: Configure fragmented scan for scheduled scan Emmanuel Grumbach
2015-12-01  9:58 ` [PATCH 06/41] iwlwifi: dvm: remove stray debug code Emmanuel Grumbach
2015-12-01  9:58 ` [PATCH 07/41] iwlwifi: mvm: Enable MPLUT only on supported hw Emmanuel Grumbach
2015-12-01  9:58 ` [PATCH 08/41] iwlwifi: mvm: ignore LMAC scan notifications when running UMAC scans Emmanuel Grumbach
2015-12-01  9:58 ` [PATCH 09/41] iwlwifi: mvm: check FW's response for nvm access write cmd Emmanuel Grumbach
2015-12-01  9:58 ` [PATCH 10/41] iwlwifi: pcie: remove ICT allocation message Emmanuel Grumbach
2015-12-01  9:58 ` [PATCH 11/41] iwlwifi: generalize d0i3_entry_timeout module parameter Emmanuel Grumbach
2015-12-01  9:58 ` [PATCH 12/41] iwlwifi: mvm: change name of iwl_mvm_d3_update_gtk Emmanuel Grumbach
2015-12-01  9:58 ` [PATCH 13/41] iwlwifi: mvm: use build-time assertion for fw trigger ID Emmanuel Grumbach
2015-12-01  9:58 ` [PATCH 14/41] iwlwifi: mvm: add trigger for firmware dump upon TDLS events Emmanuel Grumbach
2015-12-01  9:58 ` [PATCH 15/41] iwlwifi: mvm: remove redundant d0i3 flag from the config struct Emmanuel Grumbach
2015-12-01  9:58 ` [PATCH 16/41] iwlwifi: mvm: add bt settings to debugfs Emmanuel Grumbach
2015-12-01  9:58 ` [PATCH 17/41] iwlwifi: mvm: add bt rrc and ttc " Emmanuel Grumbach
2015-12-01  9:58 ` [PATCH 18/41] iwlwifi: mvm: remove stray nd_config element Emmanuel Grumbach
2015-12-01  9:58 ` [PATCH 19/41] iwlwifi: mvm: drop low_latency_agg_frame_cnt_limit Emmanuel Grumbach
2015-12-01  9:58 ` [PATCH 20/41] iwlwifi: export the _no_grab version of PRPH IO functions Emmanuel Grumbach
2015-12-01  9:58 ` [PATCH 21/41] iwlwifi: dump prph registers in a common place for all transports Emmanuel Grumbach
2015-12-01  9:58 ` [PATCH 22/41] iwlwifi: mvm: flush all used TX queues before suspending Emmanuel Grumbach
2015-12-01  9:58 ` [PATCH 23/41] iwlwifi: mvm: remove unnecessary check in iwl_mvm_is_d0i3_supported() Emmanuel Grumbach
2015-12-01  9:58 ` [PATCH 24/41] iwlwifi: mvm: move fw-dbg code to separate file Emmanuel Grumbach
2015-12-01 18:52   ` Kalle Valo
2015-12-01 19:14     ` Grumbach, Emmanuel
2015-12-01 19:26       ` Emmanuel Grumbach
2015-12-01 19:29         ` Kalle Valo
2015-12-03 15:32         ` Kalle Valo
2015-12-01  9:58 ` [PATCH 25/41] iwlwifi: mvm: Support setting continuous recording debug mode Emmanuel Grumbach
2015-12-01  9:58 ` [PATCH 26/41] iwlwifi: clean up transport debugfs handling Emmanuel Grumbach
2015-12-01  9:58 ` [PATCH 27/41] iwlwifi: pcie: remove pointer from debug message Emmanuel Grumbach
2015-12-01  9:58 ` [PATCH 28/41] iwlwifi: mvm: fix incorrect fallthrough in iwl_mvm_check_running_scans() Emmanuel Grumbach
2015-12-01  9:58 ` [PATCH 29/41] iwlwifi: mvm: use firmware station lookup, combine code Emmanuel Grumbach
2015-12-01  9:58 ` [PATCH 30/41] iwlwifi: mvm: refactor d3 key update functions Emmanuel Grumbach
2015-12-01  9:58 ` [PATCH 31/41] iwlwifi: Add new PCI IDs for 9260 and 5165 series Emmanuel Grumbach
2015-12-01  9:58 ` [PATCH 32/41] iwlwifi: Add PCI IDs for the new 3168 series Emmanuel Grumbach
2015-12-01  9:58 ` [PATCH 33/41] iwlwifi: Add PCI IDs for the new series 8165 Emmanuel Grumbach
2015-12-01  9:59 ` [PATCH 34/41] iwlwifi: mvm: Align bt-coex priority with requirements Emmanuel Grumbach
2015-12-01  9:59 ` [PATCH 35/41] iwlwifi: change the Intel Wireless email address Emmanuel Grumbach
2015-12-01  9:59 ` [PATCH 36/41] iwlwifi: print index in api/capa flags parsing message Emmanuel Grumbach
2015-12-01  9:59 ` [PATCH 37/41] iwlwifi: mvm: rs: fix a warning message Emmanuel Grumbach
2015-12-01  9:59 ` [PATCH 38/41] iwlwifi: mvm: report wakeup for wowlan Emmanuel Grumbach
2015-12-01  9:59 ` [PATCH 39/41] iwlwifi: mvm: add 9000-series RX API Emmanuel Grumbach
2015-12-01  9:59 ` Emmanuel Grumbach [this message]
2015-12-01  9:59 ` [PATCH 41/41] iwlwifi: remove IWL_DL_LED Emmanuel Grumbach
2015-12-03 15:28 ` pull request: iwlwifi-next 2015-12-01 Kalle Valo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1448963947-24302-40-git-send-email-emmanuel.grumbach@intel.com \
    --to=emmanuel.grumbach@intel.com \
    --cc=linux-wireless@vger.kernel.org \
    --cc=matti.gottlieb@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).