blob: 1a787ef05ea33c96c3e3f2bc66fd213f2e6963f7 [file] [log] [blame]
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __WIFI_HAL_TWT_H__
#define __WIFI_HAL_TWT_H__
#include "wifi_hal.h"
/**
* New HAL interface to Target Wake Time (TWT).
*/
/* TWT capabilities supported */
typedef struct {
u8 is_twt_requester_supported; // 0 for not supporting twt requester
u8 is_twt_responder_supported; // 0 for not supporting twt responder
u8 is_broadcast_twt_supported; // 0 for not supporting broadcast twt
u8 is_flexible_twt_supported; // 0 for not supporting flexible twt schedules
u32 min_wake_duration_micros; // minimum twt wake duration capable in microseconds
u32 max_wake_duration_micros; // maximum twt wake duration capable in microseconds
u32 min_wake_interval_micros; // minimum twt wake interval capable in microseconds
u32 max_wake_interval_micros; // maximum twt wake interval capable in microseconds
} wifi_twt_capabilities;
/* TWT request parameters to setup or update a TWT session */
typedef struct {
s8 mlo_link_id; // MLO Link id in case TWT is requesting for MLO connection.
// Otherwise UNSPECIFIED.
u32 min_wake_duration_micros; // minimum twt wake duration in microseconds
u32 max_wake_duration_micros; // maximum twt wake duration in microseconds
u32 min_wake_interval_micros; // minimum twt wake interval in microseconds
u32 max_wake_interval_micros; // maximum twt wake interval in microseconds
} wifi_twt_request;
/* TWT negotiation types */
typedef enum {
WIFI_TWT_NEGO_TYPE_INDIVIDUAL,
WIFI_TWT_NEGO_TYPE_BROADCAST,
} wifi_twt_negotiation_type;
/* TWT session */
typedef struct {
u32 session_id; // a unique identifier for the session
s8 mlo_link_id; // link id in case of MLO connection. Otherwise UNSPECIFIED.
u32 wake_duration_micros; // TWT service period in microseconds
u32 wake_interval_micros; // TWT wake interval for this session in microseconds
wifi_twt_negotiation_type negotiation_type; // TWT negotiation type
u8 is_trigger_enabled; // 0 if this TWT session is not trigger enabled
u8 is_announced; // 0 if this TWT session is not announced
u8 is_implicit; // 0 if this TWT session is not implicit
u8 is_protected; // 0 if this TWT session is not protected
u8 is_updatable; // 0 if this TWT session is not updatable
u8 is_suspendable; // 0 if this TWT session can not be suspended and resumed
u8 is_responder_pm_mode_enabled; // 0 if TWT responder does not intend to go to doze mode
// outside of TWT service periods
} wifi_twt_session;
/* TWT session stats */
typedef struct {
u32 avg_pkt_num_tx; // Average number of Tx packets in each wake duration.
u32 avg_pkt_num_rx; // Average number of Rx packets in each wake duration.
u32 avg_tx_pkt_size; // Average bytes per Rx packet in each wake duration.
u32 avg_rx_pkt_size; // Average bytes per Rx packet in each wake duration.
u32 avg_eosp_dur_us; // Average duration of early terminated SP
u32 eosp_count; // Count of early terminations
} wifi_twt_session_stats;
/* TWT error codes */
typedef enum {
WIFI_TWT_ERROR_CODE_FAILURE_UNKNOWN, // unknown failure
WIFI_TWT_ERROR_CODE_ALREADY_RESUMED, // TWT session is already resumed
WIFI_TWT_ERROR_CODE_ALREADY_SUSPENDED, // TWT session is already suspended
WIFI_TWT_ERROR_CODE_INVALID_PARAMS, // invalid parameters
WIFI_TWT_ERROR_CODE_MAX_SESSION_REACHED,// maximum number of sessions reached
WIFI_TWT_ERROR_CODE_NOT_AVAILABLE, // requested operation is not available
WIFI_TWT_ERROR_CODE_NOT_SUPPORTED, // requested operation is not supported
WIFI_TWT_ERROR_CODE_PEER_NOT_SUPPORTED, // requested operation is not supported by the
// peer
WIFI_TWT_ERROR_CODE_PEER_REJECTED, // requested operation is rejected by the peer
WIFI_TWT_ERROR_CODE_TIMEOUT, // requested operation is timed out
} wifi_twt_error_code;
/* TWT teardown reason codes */
typedef enum {
WIFI_TWT_TEARDOWN_REASON_CODE_UNKNOWN, // unknown reason
WIFI_TWT_TEARDOWN_REASON_CODE_LOCALLY_REQUESTED, // teardown requested by the framework
WIFI_TWT_TEARDOWN_REASON_CODE_INTERNALLY_INITIATED, // teardown initiated internally by the
// firmware or driver.
WIFI_TWT_TEARDOWN_REASON_CODE_PEER_INITIATED, // teardown initiated by the peer
} wifi_twt_teardown_reason_code;
/**
* TWT events
*
* Each of the events has a wifi_request_id to match the command responsible for the event. If the
* id is 0, the event is an unsolicited.
*/
typedef struct {
/**
* Called to indicate a TWT failure.
*
* @param id Id used to identify the command. The value 0 indicates no associated command.
* @param error_code TWT error code.
*/
void (*on_twt_failure)(wifi_request_id id, wifi_twt_error_code error_code);
/**
* Called when a Target Wake Time session is created. See wifi_twt_session_setup.
*
* @param id Id used to identify the command.
* @param session TWT session created.
*/
void (*on_twt_session_create)(wifi_request_id id, wifi_twt_session session);
/**
* Called when a Target Wake Time session is updated. See wifi_twt_session_update.
*
* @param id Id used to identify the command. The value 0 indicates no associated command.
* @param twtSession TWT session.
*/
void (*on_twt_session_update)(wifi_request_id id, wifi_twt_session session);
/**
* Called when the Target Wake Time session is torn down. See wifi_twt_session_teardown.
*
* @param id Id used to identify the command. The value 0 indicates no associated command.
* @param session_id TWT session id.
* @param reason Teardown reason code.
*/
void (*on_twt_session_teardown)(wifi_request_id id, int session_id,
wifi_twt_teardown_reason_code reason);
/**
* Called when TWT session stats available. See wifi_twt_session_get_stats.
*
* @param id Id used to identify the command.
* @param session_id TWT session id.
* @param stats TWT session stats.
*/
void (*on_twt_session_stats)(wifi_request_id id, int session_id, wifi_twt_session_stats stats);
/**
* Called when the Target Wake Time session is suspended. See wifi_twt_session_suspend.
*
* @param id Id used to identify the command.
* @param session_id TWT session id.
*/
void (*on_twt_session_suspend)(wifi_request_id id, int session_id);
/**
* Called when the Target Wake Time session is resumed. See wifi_twt_session_resume.
*
* @param id Id used to identify the command.
* @param session_id TWT session id.
*/
void (*on_twt_session_resume)(wifi_request_id id, int session_id);
} wifi_twt_events;
/**
* Important note: Following legacy HAL TWT interface is deprecated. It will be removed in future.
* Please use the new interface listed above.
*/
typedef struct {
u8 requester_supported; // 0 for not supporting requester
u8 responder_supported; // 0 for not supporting responder
u8 broadcast_twt_supported; // 0 for not supporting broadcast TWT
u8 flexibile_twt_supported; // 0 for not supporting flexible TWT
} TwtCapability;
typedef struct {
TwtCapability device_capability;
TwtCapability peer_capability;
} TwtCapabilitySet;
// For all optional fields below, if no value specify -1
typedef struct {
u8 config_id; // An unique ID for an individual TWT request
u8 negotiation_type; // 0 for individual TWT, 1 for broadcast TWT
u8 trigger_type; // 0 for non-triggered TWT, 1 for triggered TWT
s32 wake_dur_us; // Proposed wake duration in us
s32 wake_int_us; // Average wake interval in us
s32 wake_int_min_us; // Min wake interval in us. Optional.
s32 wake_int_max_us; // Max wake interval in us. Optional.
s32 wake_dur_min_us; // Min wake duration in us. Optional.
s32 wake_dur_max_us; // Max wake duration in us. Optional.
s32 avg_pkt_size; // Average bytes of each packet to send in each wake
// duration. Optional.
s32 avg_pkt_num; // Average number of packets to send in each wake
// duration. Optional.
s32 wake_time_off_us; // First wake duration time offset in us. Optional.
} TwtSetupRequest;
typedef enum {
TWT_SETUP_SUCCESS = 0, // TWT setup is accepted.
TWT_SETUP_REJECT = 1, // TWT setup is rejected by AP.
TWT_SETUP_TIMEOUT = 2, // TWT setup response from AP times out.
TWT_SETUP_IE = 3, // AP sent TWT Setup IE parsing failure.
TWT_SETUP_PARAMS = 4, // AP sent TWT Setup IE Parameters invalid.
TWT_SETUP_ERROR = 255, // Generic error
} TwtSetupReasonCode;
typedef struct {
u8 config_id; // An unique ID for an individual TWT request
u8 status; // 0 for success, non-zero for failure
TwtSetupReasonCode reason_code;
u8 negotiation_type; // 0 for individual TWT, 1 for broadcast TWT
u8 trigger_type; // 0 for non-triggered TWT, 1 for triggered TWT
s32 wake_dur_us; // Proposed wake duration in us
s32 wake_int_us; // Average wake interval in us
s32 wake_time_off_us; // First wake duration time offset in us.
} TwtSetupResponse;
typedef struct {
u8 config_id; // An unique ID for an individual TWT request
u8 all_twt; // 0 for individual setp request, 1 for all TWT
u8 negotiation_type; // 0 for individual TWT, 1 for broadcast TWT
} TwtTeardownRequest;
typedef enum {
TWT_TD_RC_HOST = 0, // Teardown triggered by Host
TWT_TD_RC_PEER = 1, // Peer initiated teardown
TWT_TD_RC_MCHAN = 2, // Teardown due to MCHAN Active
TWT_TD_RC_MCNX = 3, // Teardown due to MultiConnection
TWT_TD_RC_CSA = 4, // Teardown due to CSA
TWT_TD_RC_BTCX = 5, // Teardown due to BT Coex
TWT_TD_RC_SETUP_FAIL = 6, // Setup fails midway. Teardown all connections
TWT_TD_RC_SCHED = 7, // Teardown by TWT Scheduler
TWT_TD_RC_ERROR = 255, // Generic error cases
} TwtTeardownReason;
typedef struct {
u8 config_id; // An unique ID for an individual TWT request
u8 all_twt; // 0 for individual setp request, 1 for all TWT
u8 status; // 0 for success, non-zero for failure
TwtTeardownReason reason;
} TwtTeardownCompletion;
typedef struct {
u8 config_id; // An unique ID for an individual TWT request
u8 all_twt; // 0 for individual setup request, 1 for all TWT
s32 resume_time_us; // If -1, TWT is suspended for indefinite time.
// Otherwise, TWT is suspended for resume_time_us
} TwtInfoFrameRequest;
typedef enum {
TWT_INFO_RC_HOST = 0, // Host initiated TWT Info frame */
TWT_INFO_RC_PEER = 1, // Peer initiated TWT Info frame
TWT_INFO_RC_ERROR = 2, // Generic error conditions */
} TwtInfoFrameReason;
// TWT Info frame triggered externally.
// Device should not send TwtInfoFrameReceived to Host for internally
// triggered TWT Info frame during SCAN, MCHAN operations.
typedef struct {
u8 config_id; // An unique ID for an individual TWT request
u8 all_twt; // 0 for individual setup request, 1 for all TWT
u8 status; // 0 for success, non-zero for failure
TwtInfoFrameReason reason;
u8 twt_resumed; // 1 - TWT resumed, 0 - TWT suspended
} TwtInfoFrameReceived;
typedef struct {
u8 config_id;
u32 avg_pkt_num_tx; // Average number of Tx packets in each wake duration.
u32 avg_pkt_num_rx; // Average number of Rx packets in each wake duration.
u32 avg_tx_pkt_size; // Average bytes per Rx packet in each wake duration.
u32 avg_rx_pkt_size; // Average bytes per Rx packet in each wake duration.
u32 avg_eosp_dur_us; // Average duration of early terminated SP
u32 eosp_count; // Count of early terminations
u32 num_sp; // Count of service period (SP), also known as wake duration.
} TwtStats;
// Asynchronous notification from the device.
// For example, TWT was torn down by the device and later when the device is
// ready, it can send this async notification.
// This can be expandable in future.
typedef enum {
TWT_NOTIF_ALLOW_TWT = 1, // Device ready to process TWT Setup request
} TwtNotification;
typedef struct {
TwtNotification notification;
} TwtDeviceNotify;
// Callbacks for various TWT responses and events
typedef struct {
// Callback for TWT setup response
void (*EventTwtSetupResponse)(TwtSetupResponse *event);
// Callback for TWT teardown completion
void (*EventTwtTeardownCompletion)(TwtTeardownCompletion* event);
// Callback for TWT info frame received event
void (*EventTwtInfoFrameReceived)(TwtInfoFrameReceived* event);
// Callback for TWT notification from the device
void (*EventTwtDeviceNotify)(TwtDeviceNotify* event);
} TwtCallbackHandler;
#endif /* __WIFI_HAL_TWT_H__ */