|
@@ -499,71 +499,199 @@ enum iwl_time_event_type {
|
|
|
TE_MAX
|
|
|
}; /* MAC_EVENT_TYPE_API_E_VER_1 */
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+/* Time event - defines for command API v1 */
|
|
|
+
|
|
|
+/*
|
|
|
+ * @TE_V1_FRAG_NONE: fragmentation of the time event is NOT allowed.
|
|
|
+ * @TE_V1_FRAG_SINGLE: fragmentation of the time event is allowed, but only
|
|
|
+ * the first fragment is scheduled.
|
|
|
+ * @TE_V1_FRAG_DUAL: fragmentation of the time event is allowed, but only
|
|
|
+ * the first 2 fragments are scheduled.
|
|
|
+ * @TE_V1_FRAG_ENDLESS: fragmentation of the time event is allowed, and any
|
|
|
+ * number of fragments are valid.
|
|
|
+ *
|
|
|
+ * Other than the constant defined above, specifying a fragmentation value 'x'
|
|
|
+ * means that the event can be fragmented but only the first 'x' will be
|
|
|
+ * scheduled.
|
|
|
+ */
|
|
|
+enum {
|
|
|
+ TE_V1_FRAG_NONE = 0,
|
|
|
+ TE_V1_FRAG_SINGLE = 1,
|
|
|
+ TE_V1_FRAG_DUAL = 2,
|
|
|
+ TE_V1_FRAG_ENDLESS = 0xffffffff
|
|
|
+};
|
|
|
+
|
|
|
+/* If a Time Event can be fragmented, this is the max number of fragments */
|
|
|
+#define TE_V1_FRAG_MAX_MSK 0x0fffffff
|
|
|
+/* Repeat the time event endlessly (until removed) */
|
|
|
+#define TE_V1_REPEAT_ENDLESS 0xffffffff
|
|
|
+/* If a Time Event has bounded repetitions, this is the maximal value */
|
|
|
+#define TE_V1_REPEAT_MAX_MSK_V1 0x0fffffff
|
|
|
+
|
|
|
/* Time Event dependencies: none, on another TE, or in a specific time */
|
|
|
enum {
|
|
|
- TE_INDEPENDENT = 0,
|
|
|
- TE_DEP_OTHER = 1,
|
|
|
- TE_DEP_TSF = 2,
|
|
|
- TE_EVENT_SOCIOPATHIC = 4,
|
|
|
+ TE_V1_INDEPENDENT = 0,
|
|
|
+ TE_V1_DEP_OTHER = BIT(0),
|
|
|
+ TE_V1_DEP_TSF = BIT(1),
|
|
|
+ TE_V1_EVENT_SOCIOPATHIC = BIT(2),
|
|
|
}; /* MAC_EVENT_DEPENDENCY_POLICY_API_E_VER_2 */
|
|
|
+
|
|
|
/*
|
|
|
+ * @TE_V1_NOTIF_NONE: no notifications
|
|
|
+ * @TE_V1_NOTIF_HOST_EVENT_START: request/receive notification on event start
|
|
|
+ * @TE_V1_NOTIF_HOST_EVENT_END:request/receive notification on event end
|
|
|
+ * @TE_V1_NOTIF_INTERNAL_EVENT_START: internal FW use
|
|
|
+ * @TE_V1_NOTIF_INTERNAL_EVENT_END: internal FW use.
|
|
|
+ * @TE_V1_NOTIF_HOST_FRAG_START: request/receive notification on frag start
|
|
|
+ * @TE_V1_NOTIF_HOST_FRAG_END:request/receive notification on frag end
|
|
|
+ * @TE_V1_NOTIF_INTERNAL_FRAG_START: internal FW use.
|
|
|
+ * @TE_V1_NOTIF_INTERNAL_FRAG_END: internal FW use.
|
|
|
+ *
|
|
|
* Supported Time event notifications configuration.
|
|
|
* A notification (both event and fragment) includes a status indicating weather
|
|
|
* the FW was able to schedule the event or not. For fragment start/end
|
|
|
* notification the status is always success. There is no start/end fragment
|
|
|
* notification for monolithic events.
|
|
|
- *
|
|
|
- * @TE_NOTIF_NONE: no notifications
|
|
|
- * @TE_NOTIF_HOST_EVENT_START: request/receive notification on event start
|
|
|
- * @TE_NOTIF_HOST_EVENT_END:request/receive notification on event end
|
|
|
- * @TE_NOTIF_INTERNAL_EVENT_START: internal FW use
|
|
|
- * @TE_NOTIF_INTERNAL_EVENT_END: internal FW use.
|
|
|
- * @TE_NOTIF_HOST_FRAG_START: request/receive notification on frag start
|
|
|
- * @TE_NOTIF_HOST_FRAG_END:request/receive notification on frag end
|
|
|
- * @TE_NOTIF_INTERNAL_FRAG_START: internal FW use.
|
|
|
- * @TE_NOTIF_INTERNAL_FRAG_END: internal FW use.
|
|
|
*/
|
|
|
enum {
|
|
|
- TE_NOTIF_NONE = 0,
|
|
|
- TE_NOTIF_HOST_EVENT_START = 0x1,
|
|
|
- TE_NOTIF_HOST_EVENT_END = 0x2,
|
|
|
- TE_NOTIF_INTERNAL_EVENT_START = 0x4,
|
|
|
- TE_NOTIF_INTERNAL_EVENT_END = 0x8,
|
|
|
- TE_NOTIF_HOST_FRAG_START = 0x10,
|
|
|
- TE_NOTIF_HOST_FRAG_END = 0x20,
|
|
|
- TE_NOTIF_INTERNAL_FRAG_START = 0x40,
|
|
|
- TE_NOTIF_INTERNAL_FRAG_END = 0x80
|
|
|
+ TE_V1_NOTIF_NONE = 0,
|
|
|
+ TE_V1_NOTIF_HOST_EVENT_START = BIT(0),
|
|
|
+ TE_V1_NOTIF_HOST_EVENT_END = BIT(1),
|
|
|
+ TE_V1_NOTIF_INTERNAL_EVENT_START = BIT(2),
|
|
|
+ TE_V1_NOTIF_INTERNAL_EVENT_END = BIT(3),
|
|
|
+ TE_V1_NOTIF_HOST_FRAG_START = BIT(4),
|
|
|
+ TE_V1_NOTIF_HOST_FRAG_END = BIT(5),
|
|
|
+ TE_V1_NOTIF_INTERNAL_FRAG_START = BIT(6),
|
|
|
+ TE_V1_NOTIF_INTERNAL_FRAG_END = BIT(7),
|
|
|
}; /* MAC_EVENT_ACTION_API_E_VER_2 */
|
|
|
|
|
|
+
|
|
|
+/**
|
|
|
+ * struct iwl_time_event_cmd_api_v1 - configuring Time Events
|
|
|
+ * with struct MAC_TIME_EVENT_DATA_API_S_VER_1 (see also
|
|
|
+ * with version 2. determined by IWL_UCODE_TLV_FLAGS)
|
|
|
+ * ( TIME_EVENT_CMD = 0x29 )
|
|
|
+ * @id_and_color: ID and color of the relevant MAC
|
|
|
+ * @action: action to perform, one of FW_CTXT_ACTION_*
|
|
|
+ * @id: this field has two meanings, depending on the action:
|
|
|
+ * If the action is ADD, then it means the type of event to add.
|
|
|
+ * For all other actions it is the unique event ID assigned when the
|
|
|
+ * event was added by the FW.
|
|
|
+ * @apply_time: When to start the Time Event (in GP2)
|
|
|
+ * @max_delay: maximum delay to event's start (apply time), in TU
|
|
|
+ * @depends_on: the unique ID of the event we depend on (if any)
|
|
|
+ * @interval: interval between repetitions, in TU
|
|
|
+ * @interval_reciprocal: 2^32 / interval
|
|
|
+ * @duration: duration of event in TU
|
|
|
+ * @repeat: how many repetitions to do, can be TE_REPEAT_ENDLESS
|
|
|
+ * @dep_policy: one of TE_V1_INDEPENDENT, TE_V1_DEP_OTHER, TE_V1_DEP_TSF
|
|
|
+ * and TE_V1_EVENT_SOCIOPATHIC
|
|
|
+ * @is_present: 0 or 1, are we present or absent during the Time Event
|
|
|
+ * @max_frags: maximal number of fragments the Time Event can be divided to
|
|
|
+ * @notify: notifications using TE_V1_NOTIF_* (whom to notify when)
|
|
|
+ */
|
|
|
+struct iwl_time_event_cmd_v1 {
|
|
|
+ /* COMMON_INDEX_HDR_API_S_VER_1 */
|
|
|
+ __le32 id_and_color;
|
|
|
+ __le32 action;
|
|
|
+ __le32 id;
|
|
|
+ /* MAC_TIME_EVENT_DATA_API_S_VER_1 */
|
|
|
+ __le32 apply_time;
|
|
|
+ __le32 max_delay;
|
|
|
+ __le32 dep_policy;
|
|
|
+ __le32 depends_on;
|
|
|
+ __le32 is_present;
|
|
|
+ __le32 max_frags;
|
|
|
+ __le32 interval;
|
|
|
+ __le32 interval_reciprocal;
|
|
|
+ __le32 duration;
|
|
|
+ __le32 repeat;
|
|
|
+ __le32 notify;
|
|
|
+} __packed; /* MAC_TIME_EVENT_CMD_API_S_VER_1 */
|
|
|
+
|
|
|
+
|
|
|
+/* Time event - defines for command API v2 */
|
|
|
+
|
|
|
/*
|
|
|
- * @TE_FRAG_NONE: fragmentation of the time event is NOT allowed.
|
|
|
- * @TE_FRAG_SINGLE: fragmentation of the time event is allowed, but only
|
|
|
+ * @TE_V2_FRAG_NONE: fragmentation of the time event is NOT allowed.
|
|
|
+ * @TE_V2_FRAG_SINGLE: fragmentation of the time event is allowed, but only
|
|
|
* the first fragment is scheduled.
|
|
|
- * @TE_FRAG_DUAL: fragmentation of the time event is allowed, but only
|
|
|
+ * @TE_V2_FRAG_DUAL: fragmentation of the time event is allowed, but only
|
|
|
* the first 2 fragments are scheduled.
|
|
|
- * @TE_FRAG_ENDLESS: fragmentation of the time event is allowed, and any number
|
|
|
- * of fragments are valid.
|
|
|
+ * @TE_V2_FRAG_ENDLESS: fragmentation of the time event is allowed, and any
|
|
|
+ * number of fragments are valid.
|
|
|
*
|
|
|
* Other than the constant defined above, specifying a fragmentation value 'x'
|
|
|
* means that the event can be fragmented but only the first 'x' will be
|
|
|
* scheduled.
|
|
|
*/
|
|
|
enum {
|
|
|
- TE_FRAG_NONE = 0,
|
|
|
- TE_FRAG_SINGLE = 1,
|
|
|
- TE_FRAG_DUAL = 2,
|
|
|
- TE_FRAG_ENDLESS = 0xffffffff
|
|
|
+ TE_V2_FRAG_NONE = 0,
|
|
|
+ TE_V2_FRAG_SINGLE = 1,
|
|
|
+ TE_V2_FRAG_DUAL = 2,
|
|
|
+ TE_V2_FRAG_MAX = 0xfe,
|
|
|
+ TE_V2_FRAG_ENDLESS = 0xff
|
|
|
};
|
|
|
|
|
|
/* Repeat the time event endlessly (until removed) */
|
|
|
-#define TE_REPEAT_ENDLESS (0xffffffff)
|
|
|
+#define TE_V2_REPEAT_ENDLESS 0xff
|
|
|
/* If a Time Event has bounded repetitions, this is the maximal value */
|
|
|
-#define TE_REPEAT_MAX_MSK (0x0fffffff)
|
|
|
-/* If a Time Event can be fragmented, this is the max number of fragments */
|
|
|
-#define TE_FRAG_MAX_MSK (0x0fffffff)
|
|
|
+#define TE_V2_REPEAT_MAX 0xfe
|
|
|
+
|
|
|
+#define TE_V2_PLACEMENT_POS 12
|
|
|
+#define TE_V2_ABSENCE_POS 15
|
|
|
+
|
|
|
+/* Time event policy values (for time event cmd api v2)
|
|
|
+ * A notification (both event and fragment) includes a status indicating weather
|
|
|
+ * the FW was able to schedule the event or not. For fragment start/end
|
|
|
+ * notification the status is always success. There is no start/end fragment
|
|
|
+ * notification for monolithic events.
|
|
|
+ *
|
|
|
+ * @TE_V2_DEFAULT_POLICY: independent, social, present, unoticable
|
|
|
+ * @TE_V2_NOTIF_HOST_EVENT_START: request/receive notification on event start
|
|
|
+ * @TE_V2_NOTIF_HOST_EVENT_END:request/receive notification on event end
|
|
|
+ * @TE_V2_NOTIF_INTERNAL_EVENT_START: internal FW use
|
|
|
+ * @TE_V2_NOTIF_INTERNAL_EVENT_END: internal FW use.
|
|
|
+ * @TE_V2_NOTIF_HOST_FRAG_START: request/receive notification on frag start
|
|
|
+ * @TE_V2_NOTIF_HOST_FRAG_END:request/receive notification on frag end
|
|
|
+ * @TE_V2_NOTIF_INTERNAL_FRAG_START: internal FW use.
|
|
|
+ * @TE_V2_NOTIF_INTERNAL_FRAG_END: internal FW use.
|
|
|
+ * @TE_V2_DEP_OTHER: depends on another time event
|
|
|
+ * @TE_V2_DEP_TSF: depends on a specific time
|
|
|
+ * @TE_V2_EVENT_SOCIOPATHIC: can't co-exist with other events of tha same MAC
|
|
|
+ * @TE_V2_ABSENCE: are we present or absent during the Time Event.
|
|
|
+ */
|
|
|
+enum {
|
|
|
+ TE_V2_DEFAULT_POLICY = 0x0,
|
|
|
+
|
|
|
+ /* notifications (event start/stop, fragment start/stop) */
|
|
|
+ TE_V2_NOTIF_HOST_EVENT_START = BIT(0),
|
|
|
+ TE_V2_NOTIF_HOST_EVENT_END = BIT(1),
|
|
|
+ TE_V2_NOTIF_INTERNAL_EVENT_START = BIT(2),
|
|
|
+ TE_V2_NOTIF_INTERNAL_EVENT_END = BIT(3),
|
|
|
+
|
|
|
+ TE_V2_NOTIF_HOST_FRAG_START = BIT(4),
|
|
|
+ TE_V2_NOTIF_HOST_FRAG_END = BIT(5),
|
|
|
+ TE_V2_NOTIF_INTERNAL_FRAG_START = BIT(6),
|
|
|
+ TE_V2_NOTIF_INTERNAL_FRAG_END = BIT(7),
|
|
|
+
|
|
|
+ TE_V2_NOTIF_MSK = 0xff,
|
|
|
+
|
|
|
+ /* placement characteristics */
|
|
|
+ TE_V2_DEP_OTHER = BIT(TE_V2_PLACEMENT_POS),
|
|
|
+ TE_V2_DEP_TSF = BIT(TE_V2_PLACEMENT_POS + 1),
|
|
|
+ TE_V2_EVENT_SOCIOPATHIC = BIT(TE_V2_PLACEMENT_POS + 2),
|
|
|
+
|
|
|
+ /* are we present or absent during the Time Event. */
|
|
|
+ TE_V2_ABSENCE = BIT(TE_V2_ABSENCE_POS),
|
|
|
+};
|
|
|
|
|
|
/**
|
|
|
- * struct iwl_time_event_cmd - configuring Time Events
|
|
|
+ * struct iwl_time_event_cmd_api_v2 - configuring Time Events
|
|
|
+ * with struct MAC_TIME_EVENT_DATA_API_S_VER_2 (see also
|
|
|
+ * with version 1. determined by IWL_UCODE_TLV_FLAGS)
|
|
|
* ( TIME_EVENT_CMD = 0x29 )
|
|
|
* @id_and_color: ID and color of the relevant MAC
|
|
|
* @action: action to perform, one of FW_CTXT_ACTION_*
|
|
@@ -575,32 +703,30 @@ enum {
|
|
|
* @max_delay: maximum delay to event's start (apply time), in TU
|
|
|
* @depends_on: the unique ID of the event we depend on (if any)
|
|
|
* @interval: interval between repetitions, in TU
|
|
|
- * @interval_reciprocal: 2^32 / interval
|
|
|
* @duration: duration of event in TU
|
|
|
* @repeat: how many repetitions to do, can be TE_REPEAT_ENDLESS
|
|
|
- * @dep_policy: one of TE_INDEPENDENT, TE_DEP_OTHER, TE_DEP_TSF
|
|
|
- * @is_present: 0 or 1, are we present or absent during the Time Event
|
|
|
* @max_frags: maximal number of fragments the Time Event can be divided to
|
|
|
- * @notify: notifications using TE_NOTIF_* (whom to notify when)
|
|
|
+ * @policy: defines whether uCode shall notify the host or other uCode modules
|
|
|
+ * on event and/or fragment start and/or end
|
|
|
+ * using one of TE_INDEPENDENT, TE_DEP_OTHER, TE_DEP_TSF
|
|
|
+ * TE_EVENT_SOCIOPATHIC
|
|
|
+ * using TE_ABSENCE and using TE_NOTIF_*
|
|
|
*/
|
|
|
-struct iwl_time_event_cmd {
|
|
|
+struct iwl_time_event_cmd_v2 {
|
|
|
/* COMMON_INDEX_HDR_API_S_VER_1 */
|
|
|
__le32 id_and_color;
|
|
|
__le32 action;
|
|
|
__le32 id;
|
|
|
- /* MAC_TIME_EVENT_DATA_API_S_VER_1 */
|
|
|
+ /* MAC_TIME_EVENT_DATA_API_S_VER_2 */
|
|
|
__le32 apply_time;
|
|
|
__le32 max_delay;
|
|
|
- __le32 dep_policy;
|
|
|
__le32 depends_on;
|
|
|
- __le32 is_present;
|
|
|
- __le32 max_frags;
|
|
|
__le32 interval;
|
|
|
- __le32 interval_reciprocal;
|
|
|
__le32 duration;
|
|
|
- __le32 repeat;
|
|
|
- __le32 notify;
|
|
|
-} __packed; /* MAC_TIME_EVENT_CMD_API_S_VER_1 */
|
|
|
+ u8 repeat;
|
|
|
+ u8 max_frags;
|
|
|
+ __le16 policy;
|
|
|
+} __packed; /* MAC_TIME_EVENT_CMD_API_S_VER_2 */
|
|
|
|
|
|
/**
|
|
|
* struct iwl_time_event_resp - response structure to iwl_time_event_cmd
|