root/drivers/net/wireless/intel/iwlwifi/fw/api/time-event.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /******************************************************************************
   2  *
   3  * This file is provided under a dual BSD/GPLv2 license.  When using or
   4  * redistributing this file, you may do so under either license.
   5  *
   6  * GPL LICENSE SUMMARY
   7  *
   8  * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
   9  * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
  10  * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
  11  * Copyright(c) 2018        Intel Corporation
  12  *
  13  * This program is free software; you can redistribute it and/or modify
  14  * it under the terms of version 2 of the GNU General Public License as
  15  * published by the Free Software Foundation.
  16  *
  17  * This program is distributed in the hope that it will be useful, but
  18  * WITHOUT ANY WARRANTY; without even the implied warranty of
  19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  20  * General Public License for more details.
  21  *
  22  * The full GNU General Public License is included in this distribution
  23  * in the file called COPYING.
  24  *
  25  * Contact Information:
  26  *  Intel Linux Wireless <linuxwifi@intel.com>
  27  * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
  28  *
  29  * BSD LICENSE
  30  *
  31  * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
  32  * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
  33  * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
  34  * Copyright(c) 2018        Intel Corporation
  35  * All rights reserved.
  36  *
  37  * Redistribution and use in source and binary forms, with or without
  38  * modification, are permitted provided that the following conditions
  39  * are met:
  40  *
  41  *  * Redistributions of source code must retain the above copyright
  42  *    notice, this list of conditions and the following disclaimer.
  43  *  * Redistributions in binary form must reproduce the above copyright
  44  *    notice, this list of conditions and the following disclaimer in
  45  *    the documentation and/or other materials provided with the
  46  *    distribution.
  47  *  * Neither the name Intel Corporation nor the names of its
  48  *    contributors may be used to endorse or promote products derived
  49  *    from this software without specific prior written permission.
  50  *
  51  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  52  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  53  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  54  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  55  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  56  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  57  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  58  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  59  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  60  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  61  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  62  *
  63  *****************************************************************************/
  64 
  65 #ifndef __iwl_fw_api_time_event_h__
  66 #define __iwl_fw_api_time_event_h__
  67 
  68 #include "fw/api/phy-ctxt.h"
  69 
  70 /* Time Event types, according to MAC type */
  71 enum iwl_time_event_type {
  72         /* BSS Station Events */
  73         TE_BSS_STA_AGGRESSIVE_ASSOC,
  74         TE_BSS_STA_ASSOC,
  75         TE_BSS_EAP_DHCP_PROT,
  76         TE_BSS_QUIET_PERIOD,
  77 
  78         /* P2P Device Events */
  79         TE_P2P_DEVICE_DISCOVERABLE,
  80         TE_P2P_DEVICE_LISTEN,
  81         TE_P2P_DEVICE_ACTION_SCAN,
  82         TE_P2P_DEVICE_FULL_SCAN,
  83 
  84         /* P2P Client Events */
  85         TE_P2P_CLIENT_AGGRESSIVE_ASSOC,
  86         TE_P2P_CLIENT_ASSOC,
  87         TE_P2P_CLIENT_QUIET_PERIOD,
  88 
  89         /* P2P GO Events */
  90         TE_P2P_GO_ASSOC_PROT,
  91         TE_P2P_GO_REPETITIVET_NOA,
  92         TE_P2P_GO_CT_WINDOW,
  93 
  94         /* WiDi Sync Events */
  95         TE_WIDI_TX_SYNC,
  96 
  97         /* Channel Switch NoA */
  98         TE_CHANNEL_SWITCH_PERIOD,
  99 
 100         TE_MAX
 101 }; /* MAC_EVENT_TYPE_API_E_VER_1 */
 102 
 103 /* Time event - defines for command API v1 */
 104 
 105 /*
 106  * @TE_V1_FRAG_NONE: fragmentation of the time event is NOT allowed.
 107  * @TE_V1_FRAG_SINGLE: fragmentation of the time event is allowed, but only
 108  *      the first fragment is scheduled.
 109  * @TE_V1_FRAG_DUAL: fragmentation of the time event is allowed, but only
 110  *      the first 2 fragments are scheduled.
 111  * @TE_V1_FRAG_ENDLESS: fragmentation of the time event is allowed, and any
 112  *      number of fragments are valid.
 113  *
 114  * Other than the constant defined above, specifying a fragmentation value 'x'
 115  * means that the event can be fragmented but only the first 'x' will be
 116  * scheduled.
 117  */
 118 enum {
 119         TE_V1_FRAG_NONE = 0,
 120         TE_V1_FRAG_SINGLE = 1,
 121         TE_V1_FRAG_DUAL = 2,
 122         TE_V1_FRAG_ENDLESS = 0xffffffff
 123 };
 124 
 125 /* If a Time Event can be fragmented, this is the max number of fragments */
 126 #define TE_V1_FRAG_MAX_MSK      0x0fffffff
 127 /* Repeat the time event endlessly (until removed) */
 128 #define TE_V1_REPEAT_ENDLESS    0xffffffff
 129 /* If a Time Event has bounded repetitions, this is the maximal value */
 130 #define TE_V1_REPEAT_MAX_MSK_V1 0x0fffffff
 131 
 132 /* Time Event dependencies: none, on another TE, or in a specific time */
 133 enum {
 134         TE_V1_INDEPENDENT               = 0,
 135         TE_V1_DEP_OTHER                 = BIT(0),
 136         TE_V1_DEP_TSF                   = BIT(1),
 137         TE_V1_EVENT_SOCIOPATHIC         = BIT(2),
 138 }; /* MAC_EVENT_DEPENDENCY_POLICY_API_E_VER_2 */
 139 
 140 /*
 141  * @TE_V1_NOTIF_NONE: no notifications
 142  * @TE_V1_NOTIF_HOST_EVENT_START: request/receive notification on event start
 143  * @TE_V1_NOTIF_HOST_EVENT_END:request/receive notification on event end
 144  * @TE_V1_NOTIF_INTERNAL_EVENT_START: internal FW use
 145  * @TE_V1_NOTIF_INTERNAL_EVENT_END: internal FW use.
 146  * @TE_V1_NOTIF_HOST_FRAG_START: request/receive notification on frag start
 147  * @TE_V1_NOTIF_HOST_FRAG_END:request/receive notification on frag end
 148  * @TE_V1_NOTIF_INTERNAL_FRAG_START: internal FW use.
 149  * @TE_V1_NOTIF_INTERNAL_FRAG_END: internal FW use.
 150  *
 151  * Supported Time event notifications configuration.
 152  * A notification (both event and fragment) includes a status indicating weather
 153  * the FW was able to schedule the event or not. For fragment start/end
 154  * notification the status is always success. There is no start/end fragment
 155  * notification for monolithic events.
 156  */
 157 enum {
 158         TE_V1_NOTIF_NONE = 0,
 159         TE_V1_NOTIF_HOST_EVENT_START = BIT(0),
 160         TE_V1_NOTIF_HOST_EVENT_END = BIT(1),
 161         TE_V1_NOTIF_INTERNAL_EVENT_START = BIT(2),
 162         TE_V1_NOTIF_INTERNAL_EVENT_END = BIT(3),
 163         TE_V1_NOTIF_HOST_FRAG_START = BIT(4),
 164         TE_V1_NOTIF_HOST_FRAG_END = BIT(5),
 165         TE_V1_NOTIF_INTERNAL_FRAG_START = BIT(6),
 166         TE_V1_NOTIF_INTERNAL_FRAG_END = BIT(7),
 167 }; /* MAC_EVENT_ACTION_API_E_VER_2 */
 168 
 169 /* Time event - defines for command API */
 170 
 171 /*
 172  * @TE_V2_FRAG_NONE: fragmentation of the time event is NOT allowed.
 173  * @TE_V2_FRAG_SINGLE: fragmentation of the time event is allowed, but only
 174  *  the first fragment is scheduled.
 175  * @TE_V2_FRAG_DUAL: fragmentation of the time event is allowed, but only
 176  *  the first 2 fragments are scheduled.
 177  * @TE_V2_FRAG_ENDLESS: fragmentation of the time event is allowed, and any
 178  *  number of fragments are valid.
 179  *
 180  * Other than the constant defined above, specifying a fragmentation value 'x'
 181  * means that the event can be fragmented but only the first 'x' will be
 182  * scheduled.
 183  */
 184 enum {
 185         TE_V2_FRAG_NONE = 0,
 186         TE_V2_FRAG_SINGLE = 1,
 187         TE_V2_FRAG_DUAL = 2,
 188         TE_V2_FRAG_MAX = 0xfe,
 189         TE_V2_FRAG_ENDLESS = 0xff
 190 };
 191 
 192 /* Repeat the time event endlessly (until removed) */
 193 #define TE_V2_REPEAT_ENDLESS    0xff
 194 /* If a Time Event has bounded repetitions, this is the maximal value */
 195 #define TE_V2_REPEAT_MAX        0xfe
 196 
 197 #define TE_V2_PLACEMENT_POS     12
 198 #define TE_V2_ABSENCE_POS       15
 199 
 200 /**
 201  * enum iwl_time_event_policy - Time event policy values
 202  * A notification (both event and fragment) includes a status indicating weather
 203  * the FW was able to schedule the event or not. For fragment start/end
 204  * notification the status is always success. There is no start/end fragment
 205  * notification for monolithic events.
 206  *
 207  * @TE_V2_DEFAULT_POLICY: independent, social, present, unoticable
 208  * @TE_V2_NOTIF_HOST_EVENT_START: request/receive notification on event start
 209  * @TE_V2_NOTIF_HOST_EVENT_END:request/receive notification on event end
 210  * @TE_V2_NOTIF_INTERNAL_EVENT_START: internal FW use
 211  * @TE_V2_NOTIF_INTERNAL_EVENT_END: internal FW use.
 212  * @TE_V2_NOTIF_HOST_FRAG_START: request/receive notification on frag start
 213  * @TE_V2_NOTIF_HOST_FRAG_END:request/receive notification on frag end
 214  * @TE_V2_NOTIF_INTERNAL_FRAG_START: internal FW use.
 215  * @TE_V2_NOTIF_INTERNAL_FRAG_END: internal FW use.
 216  * @TE_V2_START_IMMEDIATELY: start time event immediately
 217  * @TE_V2_DEP_OTHER: depends on another time event
 218  * @TE_V2_DEP_TSF: depends on a specific time
 219  * @TE_V2_EVENT_SOCIOPATHIC: can't co-exist with other events of tha same MAC
 220  * @TE_V2_ABSENCE: are we present or absent during the Time Event.
 221  */
 222 enum iwl_time_event_policy {
 223         TE_V2_DEFAULT_POLICY = 0x0,
 224 
 225         /* notifications (event start/stop, fragment start/stop) */
 226         TE_V2_NOTIF_HOST_EVENT_START = BIT(0),
 227         TE_V2_NOTIF_HOST_EVENT_END = BIT(1),
 228         TE_V2_NOTIF_INTERNAL_EVENT_START = BIT(2),
 229         TE_V2_NOTIF_INTERNAL_EVENT_END = BIT(3),
 230 
 231         TE_V2_NOTIF_HOST_FRAG_START = BIT(4),
 232         TE_V2_NOTIF_HOST_FRAG_END = BIT(5),
 233         TE_V2_NOTIF_INTERNAL_FRAG_START = BIT(6),
 234         TE_V2_NOTIF_INTERNAL_FRAG_END = BIT(7),
 235         TE_V2_START_IMMEDIATELY = BIT(11),
 236 
 237         /* placement characteristics */
 238         TE_V2_DEP_OTHER = BIT(TE_V2_PLACEMENT_POS),
 239         TE_V2_DEP_TSF = BIT(TE_V2_PLACEMENT_POS + 1),
 240         TE_V2_EVENT_SOCIOPATHIC = BIT(TE_V2_PLACEMENT_POS + 2),
 241 
 242         /* are we present or absent during the Time Event. */
 243         TE_V2_ABSENCE = BIT(TE_V2_ABSENCE_POS),
 244 };
 245 
 246 /**
 247  * struct iwl_time_event_cmd - configuring Time Events
 248  * with struct MAC_TIME_EVENT_DATA_API_S_VER_2 (see also
 249  * with version 1. determined by IWL_UCODE_TLV_FLAGS)
 250  * ( TIME_EVENT_CMD = 0x29 )
 251  * @id_and_color: ID and color of the relevant MAC,
 252  *      &enum iwl_ctxt_id_and_color
 253  * @action: action to perform, one of &enum iwl_ctxt_action
 254  * @id: this field has two meanings, depending on the action:
 255  *      If the action is ADD, then it means the type of event to add.
 256  *      For all other actions it is the unique event ID assigned when the
 257  *      event was added by the FW.
 258  * @apply_time: When to start the Time Event (in GP2)
 259  * @max_delay: maximum delay to event's start (apply time), in TU
 260  * @depends_on: the unique ID of the event we depend on (if any)
 261  * @interval: interval between repetitions, in TU
 262  * @duration: duration of event in TU
 263  * @repeat: how many repetitions to do, can be TE_REPEAT_ENDLESS
 264  * @max_frags: maximal number of fragments the Time Event can be divided to
 265  * @policy: defines whether uCode shall notify the host or other uCode modules
 266  *      on event and/or fragment start and/or end
 267  *      using one of TE_INDEPENDENT, TE_DEP_OTHER, TE_DEP_TSF
 268  *      TE_EVENT_SOCIOPATHIC
 269  *      using TE_ABSENCE and using TE_NOTIF_*,
 270  *      &enum iwl_time_event_policy
 271  */
 272 struct iwl_time_event_cmd {
 273         /* COMMON_INDEX_HDR_API_S_VER_1 */
 274         __le32 id_and_color;
 275         __le32 action;
 276         __le32 id;
 277         /* MAC_TIME_EVENT_DATA_API_S_VER_2 */
 278         __le32 apply_time;
 279         __le32 max_delay;
 280         __le32 depends_on;
 281         __le32 interval;
 282         __le32 duration;
 283         u8 repeat;
 284         u8 max_frags;
 285         __le16 policy;
 286 } __packed; /* MAC_TIME_EVENT_CMD_API_S_VER_2 */
 287 
 288 /**
 289  * struct iwl_time_event_resp - response structure to iwl_time_event_cmd
 290  * @status: bit 0 indicates success, all others specify errors
 291  * @id: the Time Event type
 292  * @unique_id: the unique ID assigned (in ADD) or given (others) to the TE
 293  * @id_and_color: ID and color of the relevant MAC,
 294  *      &enum iwl_ctxt_id_and_color
 295  */
 296 struct iwl_time_event_resp {
 297         __le32 status;
 298         __le32 id;
 299         __le32 unique_id;
 300         __le32 id_and_color;
 301 } __packed; /* MAC_TIME_EVENT_RSP_API_S_VER_1 */
 302 
 303 /**
 304  * struct iwl_time_event_notif - notifications of time event start/stop
 305  * ( TIME_EVENT_NOTIFICATION = 0x2a )
 306  * @timestamp: action timestamp in GP2
 307  * @session_id: session's unique id
 308  * @unique_id: unique id of the Time Event itself
 309  * @id_and_color: ID and color of the relevant MAC
 310  * @action: &enum iwl_time_event_policy
 311  * @status: true if scheduled, false otherwise (not executed)
 312  */
 313 struct iwl_time_event_notif {
 314         __le32 timestamp;
 315         __le32 session_id;
 316         __le32 unique_id;
 317         __le32 id_and_color;
 318         __le32 action;
 319         __le32 status;
 320 } __packed; /* MAC_TIME_EVENT_NTFY_API_S_VER_1 */
 321 
 322 /*
 323  * struct iwl_hs20_roc_req_tail - tail of iwl_hs20_roc_req
 324  *
 325  * @node_addr: Our MAC Address
 326  * @reserved: reserved for alignment
 327  * @apply_time: GP2 value to start (should always be the current GP2 value)
 328  * @apply_time_max_delay: Maximum apply time delay value in TU. Defines max
 329  *      time by which start of the event is allowed to be postponed.
 330  * @duration: event duration in TU To calculate event duration:
 331  *      timeEventDuration = min(duration, remainingQuota)
 332  */
 333 struct iwl_hs20_roc_req_tail {
 334         u8 node_addr[ETH_ALEN];
 335         __le16 reserved;
 336         __le32 apply_time;
 337         __le32 apply_time_max_delay;
 338         __le32 duration;
 339 } __packed;
 340 
 341 /*
 342  * Aux ROC command
 343  *
 344  * Command requests the firmware to create a time event for a certain duration
 345  * and remain on the given channel. This is done by using the Aux framework in
 346  * the FW.
 347  * The command was first used for Hot Spot issues - but can be used regardless
 348  * to Hot Spot.
 349  *
 350  * ( HOT_SPOT_CMD 0x53 )
 351  *
 352  * @id_and_color: ID and color of the MAC
 353  * @action: action to perform, one of FW_CTXT_ACTION_*
 354  * @event_unique_id: If the action FW_CTXT_ACTION_REMOVE then the
 355  *      event_unique_id should be the id of the time event assigned by ucode.
 356  *      Otherwise ignore the event_unique_id.
 357  * @sta_id_and_color: station id and color, resumed during "Remain On Channel"
 358  *      activity.
 359  * @channel_info: channel info
 360  */
 361 struct iwl_hs20_roc_req {
 362         /* COMMON_INDEX_HDR_API_S_VER_1 hdr */
 363         __le32 id_and_color;
 364         __le32 action;
 365         __le32 event_unique_id;
 366         __le32 sta_id_and_color;
 367         struct iwl_fw_channel_info channel_info;
 368         struct iwl_hs20_roc_req_tail tail;
 369 } __packed; /* HOT_SPOT_CMD_API_S_VER_1 */
 370 
 371 /*
 372  * values for AUX ROC result values
 373  */
 374 enum iwl_mvm_hot_spot {
 375         HOT_SPOT_RSP_STATUS_OK,
 376         HOT_SPOT_RSP_STATUS_TOO_MANY_EVENTS,
 377         HOT_SPOT_MAX_NUM_OF_SESSIONS,
 378 };
 379 
 380 /*
 381  * Aux ROC command response
 382  *
 383  * In response to iwl_hs20_roc_req the FW sends this command to notify the
 384  * driver the uid of the timevent.
 385  *
 386  * ( HOT_SPOT_CMD 0x53 )
 387  *
 388  * @event_unique_id: Unique ID of time event assigned by ucode
 389  * @status: Return status 0 is success, all the rest used for specific errors
 390  */
 391 struct iwl_hs20_roc_res {
 392         __le32 event_unique_id;
 393         __le32 status;
 394 } __packed; /* HOT_SPOT_RSP_API_S_VER_1 */
 395 
 396 #endif /* __iwl_fw_api_time_event_h__ */

/* [<][>][^][v][top][bottom][index][help] */