|
@@ -76,14 +76,12 @@
|
|
|
#define TU_TO_JIFFIES(_tu) (usecs_to_jiffies((_tu) * 1024))
|
|
|
#define MSEC_TO_TU(_msec) (_msec*1000/1024)
|
|
|
|
|
|
-/* For ROC use a TE type which has priority high enough to be scheduled when
|
|
|
- * there is a concurrent BSS or GO/AP. Currently, use a TE type that has
|
|
|
- * priority similar to the TE priority used for action scans by the FW.
|
|
|
- * TODO: This needs to be changed, based on the reason for the ROC, i.e., use
|
|
|
- * TE_P2P_DEVICE_DISCOVERABLE for remain on channel without mgmt skb, and use
|
|
|
- * TE_P2P_DEVICE_ACTION_SCAN
|
|
|
+/*
|
|
|
+ * For the high priority TE use a time event type that has similar priority to
|
|
|
+ * the FW's action scan priority.
|
|
|
*/
|
|
|
-#define IWL_MVM_ROC_TE_TYPE TE_P2P_DEVICE_ACTION_SCAN
|
|
|
+#define IWL_MVM_ROC_TE_TYPE_NORMAL TE_P2P_DEVICE_DISCOVERABLE
|
|
|
+#define IWL_MVM_ROC_TE_TYPE_MGMT_TX TE_P2P_CLIENT_ASSOC
|
|
|
|
|
|
void iwl_mvm_te_clear_data(struct iwl_mvm *mvm,
|
|
|
struct iwl_mvm_time_event_data *te_data)
|
|
@@ -438,7 +436,7 @@ void iwl_mvm_stop_session_protection(struct iwl_mvm *mvm,
|
|
|
}
|
|
|
|
|
|
int iwl_mvm_start_p2p_roc(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
|
|
- int duration)
|
|
|
+ int duration, enum ieee80211_roc_type type)
|
|
|
{
|
|
|
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
|
|
|
struct iwl_mvm_time_event_data *te_data = &mvmvif->time_event_data;
|
|
@@ -459,21 +457,29 @@ int iwl_mvm_start_p2p_roc(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
|
|
time_cmd.action = cpu_to_le32(FW_CTXT_ACTION_ADD);
|
|
|
time_cmd.id_and_color =
|
|
|
cpu_to_le32(FW_CMD_ID_AND_COLOR(mvmvif->id, mvmvif->color));
|
|
|
- time_cmd.id = cpu_to_le32(IWL_MVM_ROC_TE_TYPE);
|
|
|
+
|
|
|
+ switch (type) {
|
|
|
+ case IEEE80211_ROC_TYPE_NORMAL:
|
|
|
+ time_cmd.id = cpu_to_le32(IWL_MVM_ROC_TE_TYPE_NORMAL);
|
|
|
+ break;
|
|
|
+ case IEEE80211_ROC_TYPE_MGMT_TX:
|
|
|
+ time_cmd.id = cpu_to_le32(IWL_MVM_ROC_TE_TYPE_MGMT_TX);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ WARN_ONCE(1, "Got an invalid ROC type\n");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
|
|
|
time_cmd.apply_time = cpu_to_le32(0);
|
|
|
time_cmd.dep_policy = cpu_to_le32(TE_INDEPENDENT);
|
|
|
time_cmd.is_present = cpu_to_le32(1);
|
|
|
-
|
|
|
time_cmd.interval = cpu_to_le32(1);
|
|
|
|
|
|
/*
|
|
|
- * IWL_MVM_ROC_TE_TYPE can have lower priority than other events
|
|
|
+ * The P2P Device TEs can have lower priority than other events
|
|
|
* that are being scheduled by the driver/fw, and thus it might not be
|
|
|
- * scheduled. To improve the chances of it being scheduled, allow it to
|
|
|
- * be fragmented.
|
|
|
- * In addition, for the same reasons, allow to delay the scheduling of
|
|
|
- * the time event.
|
|
|
+ * scheduled. To improve the chances of it being scheduled, allow them
|
|
|
+ * to be fragmented, and in addition allow them to be delayed.
|
|
|
*/
|
|
|
time_cmd.max_frags = cpu_to_le32(MSEC_TO_TU(duration)/20);
|
|
|
time_cmd.max_delay = cpu_to_le32(MSEC_TO_TU(duration/2));
|