/** @file
  EFI Bluetooth LE Config Protocol as defined in UEFI 2.7.
  This protocol abstracts user interface configuration for BluetoothLe device.

  Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

  @par Revision Reference:
  This Protocol is introduced in UEFI Specification 2.7

**/

#ifndef __EFI_BLUETOOTH_LE_CONFIG_H__
#define __EFI_BLUETOOTH_LE_CONFIG_H__

#include <Protocol/BluetoothConfig.h>
#include <Protocol/BluetoothAttribute.h>

#define EFI_BLUETOOTH_LE_CONFIG_PROTOCOL_GUID \
  { \
    0x8f76da58, 0x1f99, 0x4275, { 0xa4, 0xec, 0x47, 0x56, 0x51, 0x5b, 0x1c, 0xe8 } \
  }

typedef struct _EFI_BLUETOOTH_LE_CONFIG_PROTOCOL EFI_BLUETOOTH_LE_CONFIG_PROTOCOL;

/**
  Initialize BluetoothLE host controller and local device.

  The Init() function initializes BluetoothLE host controller and local device.

  @param[in]  This              Pointer to the EFI_BLUETOOTH_LE_CONFIG_PROTOCOL instance.

  @retval EFI_SUCCESS           The BluetoothLE host controller and local device is initialized successfully.
  @retval EFI_DEVICE_ERROR      A hardware error occurred trying to initialize the BluetoothLE host controller
                                and local device.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_LE_CONFIG_INIT)(
  IN EFI_BLUETOOTH_LE_CONFIG_PROTOCOL  *This
  );

typedef struct {
  ///
  /// The version of the structure. A value of zero represents the EFI_BLUETOOTH_LE_CONFIG_SCAN_PARAMETER
  /// structure as defined here. Future version of this specification may extend this data structure in a
  /// backward compatible way and increase the value of Version.
  ///
  UINT32    Version;
  ///
  /// Passive scanning or active scanning. See Bluetooth specification.
  ///
  UINT8     ScanType;
  ///
  /// Recommended scan interval to be used while performing scan.
  ///
  UINT16    ScanInterval;
  ///
  /// Recommended scan window to be used while performing a scan.
  ///
  UINT16    ScanWindow;
  ///
  /// Recommended scanning filter policy to be used while performing a scan.
  ///
  UINT8     ScanningFilterPolicy;
  ///
  /// This is one byte flag to serve as a filter to remove unneeded scan
  /// result. For example, set BIT0 means scan in LE Limited Discoverable
  /// Mode. Set BIT1 means scan in LE General Discoverable Mode.
  ///
  UINT8     AdvertisementFlagFilter;
} EFI_BLUETOOTH_LE_CONFIG_SCAN_PARAMETER;

typedef struct {
  BLUETOOTH_LE_ADDRESS    BDAddr;
  BLUETOOTH_LE_ADDRESS    DirectAddress;
  UINT8                   RemoteDeviceState;
  INT8                    RSSI;
  UINTN                   AdvertisementDataSize;
  VOID                    *AdvertisementData;
} EFI_BLUETOOTH_LE_SCAN_CALLBACK_INFORMATION;

/**
  Callback function, it is called if a BluetoothLE device is found during scan process.

  @param[in]  This            Pointer to the EFI_BLUETOOTH_LE_CONFIG_PROTOCOL instance.
  @param[in]  Context         Context passed from scan request.
  @param[in]  CallbackInfo    Data related to scan result. NULL CallbackInfo means scan complete.

  @retval EFI_SUCCESS         The callback function complete successfully.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_LE_CONFIG_SCAN_CALLBACK_FUNCTION)(
  IN EFI_BLUETOOTH_LE_CONFIG_PROTOCOL             *This,
  IN VOID                                         *Context,
  IN EFI_BLUETOOTH_LE_SCAN_CALLBACK_INFORMATION   *CallbackInfo
  );

/**
  Scan BluetoothLE device.

  The Scan() function scans BluetoothLE device. When this function is returned, it just means scan
  request is submitted. It does not mean scan process is started or finished. Whenever there is a
  BluetoothLE device is found, the Callback function will be called. Callback function might be
  called before this function returns or after this function returns

  @param[in]  This              Pointer to the EFI_BLUETOOTH_LE_CONFIG_PROTOCOL instance.
  @param[in]  ReScan            If TRUE, a new scan request is submitted no matter there is scan result before.
                                If FALSE and there is scan result, the previous scan result is returned and no scan request
                                is submitted.
  @param[in]  Timeout           Duration in milliseconds for which to scan.
  @param[in]  ScanParameter     If it is not NULL, the ScanParameter is used to perform a scan by the BluetoothLE bus driver.
                                If it is NULL, the default parameter is used.
  @param[in]  Callback          The callback function. This function is called if a BluetoothLE device is found during
                                scan process.
  @param[in]  Context           Data passed into Callback function. This is optional parameter and may be NULL.

  @retval EFI_SUCCESS           The Bluetooth scan request is submitted.
  @retval EFI_DEVICE_ERROR      A hardware error occurred trying to scan the BluetoothLE device.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_LE_CONFIG_SCAN)(
  IN EFI_BLUETOOTH_LE_CONFIG_PROTOCOL                *This,
  IN BOOLEAN                                         ReScan,
  IN UINT32                                          Timeout,
  IN EFI_BLUETOOTH_LE_CONFIG_SCAN_PARAMETER          *ScanParameter  OPTIONAL,
  IN EFI_BLUETOOTH_LE_CONFIG_SCAN_CALLBACK_FUNCTION  Callback,
  IN VOID                                            *Context
  );

typedef struct {
  ///
  /// The version of the structure. A value of zero represents the
  /// EFI_BLUETOOTH_LE_CONFIG_CONNECT_PARAMETER
  /// structure as defined here. Future version of this specification may
  /// extend this data structure in a backward compatible way and
  /// increase the value of Version.
  ///
  UINT32    Version;
  ///
  /// Recommended scan interval to be used while performing scan before connect.
  ///
  UINT16    ScanInterval;
  ///
  /// Recommended scan window to be used while performing a connection
  ///
  UINT16    ScanWindow;
  ///
  /// Minimum allowed connection interval. Shall be less than or equal to ConnIntervalMax.
  ///
  UINT16    ConnIntervalMin;
  ///
  /// Maximum allowed connection interval. Shall be greater than or equal to ConnIntervalMin.
  ///
  UINT16    ConnIntervalMax;
  ///
  /// Slave latency for the connection in number of connection events.
  ///
  UINT16    ConnLatency;
  ///
  /// Link supervision timeout for the connection.
  ///
  UINT16    SupervisionTimeout;
} EFI_BLUETOOTH_LE_CONFIG_CONNECT_PARAMETER;

/**
  Connect a BluetoothLE device.

  The Connect() function connects a Bluetooth device. When this function is returned successfully,
  a new EFI_BLUETOOTH_IO_PROTOCOL is created.

  @param[in]  This              Pointer to the EFI_BLUETOOTH_LE_CONFIG_PROTOCOL instance.
  @param[in]  AutoReconnect     If TRUE, the BluetoothLE host controller needs to do an auto
                                reconnect. If FALSE, the BluetoothLE host controller does not do
                                an auto reconnect.
  @param[in]  DoBonding         If TRUE, the BluetoothLE host controller needs to do a bonding.
                                If FALSE, the BluetoothLE host controller does not do a bonding.
  @param[in]  ConnectParameter  If it is not NULL, the ConnectParameter is used to perform a
                                scan by the BluetoothLE bus driver. If it is NULL, the default
                                parameter is used.
  @param[in]  BD_ADDR           The address of the BluetoothLE device to be connected.

  @retval EFI_SUCCESS           The BluetoothLE device is connected successfully.
  @retval EFI_ALREADY_STARTED   The BluetoothLE device is already connected.
  @retval EFI_NOT_FOUND         The BluetoothLE device is not found.
  @retval EFI_DEVICE_ERROR      A hardware error occurred trying to connect the BluetoothLE device.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_LE_CONFIG_CONNECT)(
  IN  EFI_BLUETOOTH_LE_CONFIG_PROTOCOL            *This,
  IN  BOOLEAN                                     AutoReconnect,
  IN  BOOLEAN                                     DoBonding,
  IN  EFI_BLUETOOTH_LE_CONFIG_CONNECT_PARAMETER   *ConnectParameter  OPTIONAL,
  IN  BLUETOOTH_LE_ADDRESS                        *BD_ADDR
  );

/**
  Disconnect a BluetoothLE device.

  The Disconnect() function disconnects a BluetoothLE device. When this function is returned
  successfully, the EFI_BLUETOOTH_ATTRIBUTE_PROTOCOL associated with this device is
  destroyed and all services associated are stopped.

  @param[in]  This          Pointer to the EFI_BLUETOOTH_LE_CONFIG_PROTOCOL instance.
  @param[in]  BD_ADDR       The address of BluetoothLE device to be connected.
  @param[in]  Reason        Bluetooth disconnect reason. See Bluetooth specification for detail.

  @retval EFI_SUCCESS           The BluetoothLE device is disconnected successfully.
  @retval EFI_NOT_STARTED       The BluetoothLE device is not connected.
  @retval EFI_NOT_FOUND         The BluetoothLE device is not found.
  @retval EFI_DEVICE_ERROR      A hardware error occurred trying to disconnect the BluetoothLE device.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_LE_CONFIG_DISCONNECT)(
  IN EFI_BLUETOOTH_LE_CONFIG_PROTOCOL  *This,
  IN BLUETOOTH_LE_ADDRESS              *BD_ADDR,
  IN UINT8                             Reason
  );

/**
  Get BluetoothLE configuration data.

  The GetData() function returns BluetoothLE configuration data. For remote BluetoothLE device
  configuration data, please use GetRemoteData() function with valid BD_ADDR.

  @param[in]       This         Pointer to the EFI_BLUETOOTH_LE_CONFIG_PROTOCOL instance.
  @param[in]       DataType     Configuration data type.
  @param[in, out]  DataSize     On input, indicates the size, in bytes, of the data buffer specified by Data.
                                On output, indicates the amount of data actually returned.
  @param[in, out]  Data         A pointer to the buffer of data that will be returned.

  @retval EFI_SUCCESS           The BluetoothLE configuration data is returned successfully.
  @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:
                                - DataSize is NULL.
                                - *DataSize is 0.
                                - Data is NULL.
  @retval EFI_UNSUPPORTED       The DataType is unsupported.
  @retval EFI_NOT_FOUND         The DataType is not found.
  @retval EFI_BUFFER_TOO_SMALL  The buffer is too small to hold the buffer.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_LE_CONFIG_GET_DATA)(
  IN EFI_BLUETOOTH_LE_CONFIG_PROTOCOL       *This,
  IN EFI_BLUETOOTH_CONFIG_DATA_TYPE      DataType,
  IN OUT UINTN                           *DataSize,
  IN OUT VOID                            *Data OPTIONAL
  );

/**
  Set BluetoothLE configuration data.

  The SetData() function sets local BluetoothLE device configuration data. Not all DataType can be
  set.

  @param[in]  This              Pointer to the EFI_BLUETOOTH_LE_CONFIG_PROTOCOL instance.
  @param[in]  DataType          Configuration data type.
  @param[in]  DataSize          Indicates the size, in bytes, of the data buffer specified by Data.
  @param[in]  Data              A pointer to the buffer of data that will be set.

  @retval EFI_SUCCESS           The BluetoothLE configuration data is set successfully.
  @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:
                                - DataSize is 0.
                                - Data is NULL.
  @retval EFI_UNSUPPORTED       The DataType is unsupported.
  @retval EFI_WRITE_PROTECTED   Cannot set configuration data.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_LE_CONFIG_SET_DATA)(
  IN EFI_BLUETOOTH_LE_CONFIG_PROTOCOL       *This,
  IN EFI_BLUETOOTH_CONFIG_DATA_TYPE         DataType,
  IN UINTN                                  DataSize,
  IN VOID                                   *Data
  );

/**
  Get remove BluetoothLE device configuration data.

  The GetRemoteData() function returns remote BluetoothLE device configuration data.

  @param[in]  This              Pointer to the EFI_BLUETOOTH_LE_CONFIG_PROTOCOL instance.
  @param[in]  DataType          Configuration data type.
  @param[in]  BDAddr            Remote BluetoothLE device address.
  @param[in, out] DataSize      On input, indicates the size, in bytes, of the data buffer specified by Data.
                                On output, indicates the amount of data actually returned.
  @param[in, out] Data          A pointer to the buffer of data that will be returned.

  @retval EFI_SUCCESS           The remote BluetoothLE device configuration data is returned successfully.
  @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:
                                - DataSize is NULL.
                                - *DataSize is 0.
                                - Data is NULL.
  @retval EFI_UNSUPPORTED       The DataType is unsupported.
  @retval EFI_NOT_FOUND         The DataType is not found.
  @retval EFI_BUFFER_TOO_SMALL  The buffer is too small to hold the buffer.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_LE_CONFIG_GET_REMOTE_DATA)(
  IN EFI_BLUETOOTH_LE_CONFIG_PROTOCOL       *This,
  IN EFI_BLUETOOTH_CONFIG_DATA_TYPE         DataType,
  IN BLUETOOTH_LE_ADDRESS                   *BDAddr,
  IN OUT UINTN                              *DataSize,
  IN OUT VOID                               *Data
  );

typedef enum {
  ///
  /// It indicates an authorization request. No data is associated with the callback
  /// input. In the output data, the application should return the authorization value.
  /// The data structure is BOOLEAN. TRUE means YES. FALSE means NO.
  ///
  EfiBluetoothSmpAuthorizationRequestEvent,
  ///
  /// It indicates that a passkey has been generated locally by the driver, and the same
  /// passkey should be entered at the remote device. The callback input data is the
  /// passkey of type UINT32, to be displayed by the application. No output data
  /// should be returned.
  ///
  EfiBluetoothSmpPasskeyReadyEvent,
  ///
  /// It indicates that the driver is requesting for the passkey has been generated at
  /// the remote device. No data is associated with the callback input. The output data
  /// is the passkey of type UINT32, to be entered by the user.
  ///
  EfiBluetoothSmpPasskeyRequestEvent,
  ///
  /// It indicates that the driver is requesting for the passkey that has been pre-shared
  /// out-of-band with the remote device. No data is associated with the callback
  /// input. The output data is the stored OOB data of type UINT8[16].
  ///
  EfiBluetoothSmpOOBDataRequestEvent,
  ///
  /// In indicates that a number have been generated locally by the bus driver, and
  /// also at the remote device, and the bus driver wants to know if the two numbers
  /// match. The callback input data is the number of type UINT32. The output data
  /// is confirmation value of type BOOLEAN. TRUE means comparison pass. FALSE
  /// means comparison fail.
  ///
  EfiBluetoothSmpNumericComparisonEvent,
} EFI_BLUETOOTH_LE_SMP_EVENT_DATA_TYPE;

/**
  The callback function for SMP.

  @param[in]  This                Pointer to the EFI_BLUETOOTH_LE_CONFIG_PROTOCOL instance.
  @param[in]  Context             Data passed into callback function. This is optional parameter
                                  and may be NULL.
  @param[in]  BDAddr              Remote BluetoothLE device address.
  @param[in]  EventDataType       Event data type in EFI_BLUETOOTH_LE_SMP_EVENT_DATA_TYPE.
  @param[in]  DataSize            Indicates the size, in bytes, of the data buffer specified by Data.
  @param[in]  Data                A pointer to the buffer of data.

  @retval EFI_SUCCESS   The callback function complete successfully.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_LE_SMP_CALLBACK)(
  IN EFI_BLUETOOTH_LE_CONFIG_PROTOCOL       *This,
  IN VOID                                   *Context,
  IN BLUETOOTH_LE_ADDRESS                   *BDAddr,
  IN EFI_BLUETOOTH_LE_SMP_EVENT_DATA_TYPE   EventDataType,
  IN UINTN                                  DataSize,
  IN VOID                                   *Data
  );

/**
  Register Security Manager Protocol callback function for user authentication/authorization.

  The RegisterSmpAuthCallback() function register Security Manager Protocol callback
  function for user authentication/authorization.

  @param[in]  This            Pointer to the EFI_BLUETOOTH_LE_CONFIG_PROTOCOL instance.
  @param[in]  Callback        Callback function for user authentication/authorization.
  @param[in]  Context         Data passed into Callback function. This is optional parameter and may be NULL.

  @retval EFI_SUCCESS         The SMP callback function is registered successfully.
  @retval EFI_ALREADY_STARTED A callback function is already registered on the same attribute
                              opcode and attribute handle, when the Callback is not NULL.
  @retval EFI_NOT_STARTED     A callback function is not registered on the same attribute opcode
                              and attribute handle, when the Callback is NULL.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_LE_REGISTER_SMP_AUTH_CALLBACK)(
  IN EFI_BLUETOOTH_LE_CONFIG_PROTOCOL  *This,
  IN EFI_BLUETOOTH_LE_SMP_CALLBACK     Callback,
  IN VOID                              *Context
  );

/**
  Send user authentication/authorization to remote device.

  The SendSmpAuthData() function sends user authentication/authorization to remote device. It
  should be used to send these information after the caller gets the request data from the callback
  function by RegisterSmpAuthCallback().

  @param[in]  This            Pointer to the EFI_BLUETOOTH_LE_CONFIG_PROTOCOL instance.
  @param[in]  BDAddr          Remote BluetoothLE device address.
  @param[in]  EventDataType   Event data type in EFI_BLUETOOTH_LE_SMP_EVENT_DATA_TYPE.
  @param[in]  DataSize        The size of Data in bytes, of the data buffer specified by Data.
  @param[in]  Data            A pointer to the buffer of data that will be sent. The data format
                              depends on the type of SMP event data being responded to.

  @retval EFI_SUCCESS         The SMP authorization data is sent successfully.
  @retval EFI_NOT_READY       SMP is not in the correct state to receive the auth data.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_LE_SEND_SMP_AUTH_DATA)(
  IN EFI_BLUETOOTH_LE_CONFIG_PROTOCOL       *This,
  IN BLUETOOTH_LE_ADDRESS                   *BDAddr,
  IN EFI_BLUETOOTH_LE_SMP_EVENT_DATA_TYPE   EventDataType,
  IN UINTN                                  DataSize,
  IN VOID                                   *Data
  );

typedef enum {
  // For local device only
  EfiBluetoothSmpLocalIR,  /* If Key hierarchy is supported */
  EfiBluetoothSmpLocalER,  /* If Key hierarchy is supported */
  EfiBluetoothSmpLocalDHK, /* If Key hierarchy is supported. OPTIONAL */
  // For peer specific
  EfiBluetoothSmpKeysDistributed = 0x1000,
  EfiBluetoothSmpKeySize,
  EfiBluetoothSmpKeyType,
  EfiBluetoothSmpPeerLTK,
  EfiBluetoothSmpPeerIRK,
  EfiBluetoothSmpPeerCSRK,
  EfiBluetoothSmpPeerRand,
  EfiBluetoothSmpPeerEDIV,
  EfiBluetoothSmpPeerSignCounter,
  EfiBluetoothSmpLocalLTK,  /* If Key hierarchy not supported */
  EfiBluetoothSmpLocalIRK,  /* If Key hierarchy not supported */
  EfiBluetoothSmpLocalCSRK, /* If Key hierarchy not supported */
  EfiBluetoothSmpLocalSignCounter,
  EfiBluetoothSmpLocalDIV,
  EfiBluetoothSmpPeerAddressList,
  EfiBluetoothSmpMax,
} EFI_BLUETOOTH_LE_SMP_DATA_TYPE;

/**
  The callback function to get SMP data.

  @param[in]      This            Pointer to the EFI_BLUETOOTH_LE_CONFIG_PROTOCOL instance.
  @param[in]      Context         Data passed into callback function. This is optional parameter
                                  and may be NULL.
  @param[in]      BDAddr          Remote BluetoothLE device address. For Local device setting, it
                                  should be NULL.
  @param[in]      DataType        Data type in EFI_BLUETOOTH_LE_SMP_DATA_TYPE.
  @param[in, out] DataSize        On input, indicates the size, in bytes, of the data buffer specified
                                  by Data. On output, indicates the amount of data actually returned.
  @param[out]     Data            A pointer to the buffer of data that will be returned.

  @retval EFI_SUCCESS   The callback function complete successfully.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_LE_CONFIG_SMP_GET_DATA_CALLBACK)(
  IN EFI_BLUETOOTH_LE_CONFIG_PROTOCOL  *This,
  IN VOID                              *Context,
  IN BLUETOOTH_LE_ADDRESS              *BDAddr,
  IN EFI_BLUETOOTH_LE_SMP_DATA_TYPE    DataType,
  IN OUT UINTN                         *DataSize,
  OUT VOID                             *Data
  );

/**
  Register a callback function to get SMP related data.

  The RegisterSmpGetDataCallback() function registers a callback function to get SMP related data.

  @param[in]  This            Pointer to the EFI_BLUETOOTH_LE_CONFIG_PROTOCOL instance.
  @param[in]  Callback        Callback function for SMP get data.
  @param[in]  Context         Data passed into Callback function. This is optional parameter and may be NULL.

  @retval EFI_SUCCESS         The SMP get data callback function is registered successfully.
  @retval EFI_ALREADY_STARTED A callback function is already registered on the same attribute
                              opcode and attribute handle, when the Callback is not NULL.
  @retval EFI_NOT_STARTED     A callback function is not registered on the same attribute opcode
                              and attribute handle, when the Callback is NULL
**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_LE_CONFIG_REGISTER_SMP_GET_DATA_CALLBACK)(
  IN EFI_BLUETOOTH_LE_CONFIG_PROTOCOL              *This,
  IN EFI_BLUETOOTH_LE_CONFIG_SMP_GET_DATA_CALLBACK Callback,
  IN VOID                                          *Context
  );

/**
  The callback function to set SMP data.

  @param[in]  This                Pointer to the EFI_BLUETOOTH_LE_CONFIG_PROTOCOL instance.
  @param[in]  Context             Data passed into callback function. This is optional parameter
                                  and may be NULL.
  @param[in]  BDAddr              Remote BluetoothLE device address.
  @param[in]  DataType            Data type in EFI_BLUETOOTH_LE_SMP_DATA_TYPE.
  @param[in]  DataSize            Indicates the size, in bytes, of the data buffer specified by Data.
  @param[in]  Data                A pointer to the buffer of data.

  @retval EFI_SUCCESS   The callback function complete successfully.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_LE_CONFIG_SMP_SET_DATA_CALLBACK)(
  IN EFI_BLUETOOTH_LE_CONFIG_PROTOCOL  *This,
  IN VOID                              *Context,
  IN BLUETOOTH_LE_ADDRESS              *BDAddr,
  IN EFI_BLUETOOTH_LE_SMP_DATA_TYPE    Type,
  IN UINTN                             DataSize,
  IN VOID                              *Data
  );

/**
  Register a callback function to set SMP related data.

  The RegisterSmpSetDataCallback() function registers a callback function to set SMP related data.

  @param[in]  This            Pointer to the EFI_BLUETOOTH_LE_CONFIG_PROTOCOL instance.
  @param[in]  Callback        Callback function for SMP set data.
  @param[in]  Context         Data passed into Callback function. This is optional parameter and may be NULL.

  @retval EFI_SUCCESS         The SMP set data callback function is registered successfully.
  @retval EFI_ALREADY_STARTED A callback function is already registered on the same attribute
                              opcode and attribute handle, when the Callback is not NULL.
  @retval EFI_NOT_STARTED     A callback function is not registered on the same attribute opcode
                              and attribute handle, when the Callback is NULL
**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_LE_CONFIG_REGISTER_SMP_SET_DATA_CALLBACK)(
  IN EFI_BLUETOOTH_LE_CONFIG_PROTOCOL              *This,
  IN EFI_BLUETOOTH_LE_CONFIG_SMP_SET_DATA_CALLBACK Callback,
  IN VOID                                          *Context
  );

/**
  The callback function to hook connect complete event.

  @param[in]  This                Pointer to the EFI_BLUETOOTH_LE_CONFIG_PROTOCOL instance.
  @param[in]  Context             Data passed into callback function. This is optional parameter
                                  and may be NULL.
  @param[in]  CallbackType        The value defined in EFI_BLUETOOTH_CONNECT_COMPLETE_CALLBACK_TYPE.
  @param[in]  BDAddr              Remote BluetoothLE device address.
  @param[in]  InputBuffer         A pointer to the buffer of data that is input from callback caller.
  @param[in]  InputBufferSize     Indicates the size, in bytes, of the data buffer specified by InputBuffer.

  @retval EFI_SUCCESS   The callback function complete successfully.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_LE_CONFIG_CONNECT_COMPLETE_CALLBACK)(
  IN  EFI_BLUETOOTH_LE_CONFIG_PROTOCOL                 *This,
  IN  VOID                                             *Context,
  IN  EFI_BLUETOOTH_CONNECT_COMPLETE_CALLBACK_TYPE     CallbackType,
  IN  BLUETOOTH_LE_ADDRESS                             *BDAddr,
  IN  VOID                                             *InputBuffer,
  IN  UINTN                                            InputBufferSize
  );

/**
  Register link connect complete callback function.

  The RegisterLinkConnectCompleteCallback() function registers Bluetooth link connect
  complete callback function. The Bluetooth Configuration driver may call
  RegisterLinkConnectCompleteCallback() to register a callback function. During pairing,
  Bluetooth bus driver must trigger this callback function to report device state, if it is registered.
  Then Bluetooth Configuration driver will get information on device connection, according to
  CallbackType defined by EFI_BLUETOOTH_CONNECT_COMPLETE_CALLBACK_TYPE

  @param[in]  This            Pointer to the EFI_BLUETOOTH_LE_CONFIG_PROTOCOL instance.
  @param[in]  Callback        The callback function. NULL means unregister.
  @param[in]  Context         Data passed into Callback function. This is optional parameter and may be NULL.

  @retval EFI_SUCCESS         The link connect complete callback function is registered successfully.
  @retval EFI_ALREADY_STARTED A callback function is already registered on the same attribute
                              opcode and attribute handle, when the Callback is not NULL.
  @retval EFI_NOT_STARTED     A callback function is not registered on the same attribute opcode
                              and attribute handle, when the Callback is NULL
**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_LE_CONFIG_REGISTER_CONNECT_COMPLETE_CALLBACK)(
  IN EFI_BLUETOOTH_LE_CONFIG_PROTOCOL                        *This,
  IN EFI_BLUETOOTH_LE_CONFIG_CONNECT_COMPLETE_CALLBACK       Callback,
  IN VOID                                                    *Context
  );

///
/// This protocol abstracts user interface configuration for BluetoothLe device.
///
struct _EFI_BLUETOOTH_LE_CONFIG_PROTOCOL {
  EFI_BLUETOOTH_LE_CONFIG_INIT                                  Init;
  EFI_BLUETOOTH_LE_CONFIG_SCAN                                  Scan;
  EFI_BLUETOOTH_LE_CONFIG_CONNECT                               Connect;
  EFI_BLUETOOTH_LE_CONFIG_DISCONNECT                            Disconnect;
  EFI_BLUETOOTH_LE_CONFIG_GET_DATA                              GetData;
  EFI_BLUETOOTH_LE_CONFIG_SET_DATA                              SetData;
  EFI_BLUETOOTH_LE_CONFIG_GET_REMOTE_DATA                       GetRemoteData;
  EFI_BLUETOOTH_LE_REGISTER_SMP_AUTH_CALLBACK                   RegisterSmpAuthCallback;
  EFI_BLUETOOTH_LE_SEND_SMP_AUTH_DATA                           SendSmpAuthData;
  EFI_BLUETOOTH_LE_CONFIG_REGISTER_SMP_GET_DATA_CALLBACK        RegisterSmpGetDataCallback;
  EFI_BLUETOOTH_LE_CONFIG_REGISTER_SMP_SET_DATA_CALLBACK        RegisterSmpSetDataCallback;
  EFI_BLUETOOTH_LE_CONFIG_REGISTER_CONNECT_COMPLETE_CALLBACK    RegisterLinkConnectCompleteCallback;
};

extern EFI_GUID  gEfiBluetoothLeConfigProtocolGuid;

#endif
