/** @file
  EFI Bluetooth IO Service Binding Protocol as defined in UEFI 2.5.
  EFI Bluetooth IO Protocol as defined in UEFI 2.5.
  The EFI Bluetooth IO Service Binding Protocol is used to locate EFI Bluetooth IO Protocol drivers to
  create and destroy child of the driver to communicate with other Bluetooth device by using Bluetooth IO protocol.

  Copyright (c) 2015 - 2017, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

  @par Revision Reference:
  This Protocol is introduced in UEFI Specification 2.5

**/

#ifndef __EFI_BLUETOOTH_IO_PROTOCOL_H__
#define __EFI_BLUETOOTH_IO_PROTOCOL_H__

#include <IndustryStandard/Bluetooth.h>

#define EFI_BLUETOOTH_IO_SERVICE_BINDING_PROTOCOL_GUID \
  { \
    0x388278d3, 0x7b85, 0x42f0, { 0xab, 0xa9, 0xfb, 0x4b, 0xfd, 0x69, 0xf5, 0xab } \
  }

#define EFI_BLUETOOTH_IO_PROTOCOL_GUID \
  { \
    0x467313de, 0x4e30, 0x43f1, { 0x94, 0x3e, 0x32, 0x3f, 0x89, 0x84, 0x5d, 0xb5 } \
  }

typedef struct _EFI_BLUETOOTH_IO_PROTOCOL EFI_BLUETOOTH_IO_PROTOCOL;

///
/// EFI_BLUETOOTH_DEVICE_INFO
///
typedef struct {
  ///
  /// The version of the structure
  ///
  UINT32                       Version;
  ///
  /// 48bit Bluetooth device address.
  ///
  BLUETOOTH_ADDRESS            BD_ADDR;
  ///
  /// Bluetooth PageScanRepetitionMode. See Bluetooth specification for detail.
  ///
  UINT8                        PageScanRepetitionMode;
  ///
  /// Bluetooth ClassOfDevice. See Bluetooth specification for detail.
  ///
  BLUETOOTH_CLASS_OF_DEVICE    ClassOfDevice;
  ///
  /// Bluetooth CloseOffset. See Bluetooth specification for detail.
  ///
  UINT16                       ClockOffset;
  ///
  /// Bluetooth RSSI. See Bluetooth specification for detail.
  ///
  UINT8                        RSSI;
  ///
  /// Bluetooth ExtendedInquiryResponse. See Bluetooth specification for detail.
  ///
  UINT8                        ExtendedInquiryResponse[240];
} EFI_BLUETOOTH_DEVICE_INFO;

/**
  Get Bluetooth device information.

  @param[in]   This               Pointer to the EFI_BLUETOOTH_IO_PROTOCOL instance.
  @param[out]  DeviceInfoSize     A pointer to the size, in bytes, of the DeviceInfo buffer.
  @param[out]  DeviceInfo         A pointer to a callee allocated buffer that returns Bluetooth device information.

  @retval EFI_SUCCESS             The Bluetooth device information is returned successfully.
  @retval EFI_DEVICE_ERROR        A hardware error occurred trying to retrieve the Bluetooth device information.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_IO_GET_DEVICE_INFO)(
  IN EFI_BLUETOOTH_IO_PROTOCOL    *This,
  OUT UINTN                       *DeviceInfoSize,
  OUT VOID                        **DeviceInfo
  );

/**
  Get Bluetooth SDP information.

  @param[in]  This                Pointer to the EFI_BLUETOOTH_IO_PROTOCOL instance.
  @param[out] SdpInfoSize         A pointer to the size, in bytes, of the SdpInfo buffer.
  @param[out] SdpInfo             A pointer to a callee allocated buffer that returns Bluetooth SDP information.

  @retval EFI_SUCCESS             The Bluetooth device information is returned successfully.
  @retval EFI_DEVICE_ERROR        A hardware error occurred trying to retrieve the Bluetooth SDP information.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_IO_GET_SDP_INFO)(
  IN EFI_BLUETOOTH_IO_PROTOCOL    *This,
  OUT UINTN                       *SdpInfoSize,
  OUT VOID                        **SdpInfo
  );

/**
  Send L2CAP message (including L2CAP header).

  @param[in]      This            Pointer to the EFI_BLUETOOTH_IO_PROTOCOL instance.
  @param[in, out] BufferSize      On input, indicates the size, in bytes, of the data buffer specified by Buffer.
                                  On output, indicates the amount of data actually transferred.
  @param[in]      Buffer          A pointer to the buffer of data that will be transmitted to Bluetooth L2CAP layer.
  @param[in]      Timeout         Indicating the transfer should be completed within this time frame. The units are in
                                  milliseconds. If Timeout is 0, then the caller must wait for the function to be completed
                                  until EFI_SUCCESS or EFI_DEVICE_ERROR is returned.

  @retval EFI_SUCCESS             The L2CAP message is sent successfully.
  @retval EFI_INVALID_PARAMETER   One or more of the following conditions is TRUE:
                                  - BufferSize is NULL.
                                  - *BufferSize is 0.
                                  - Buffer is NULL.
  @retval EFI_TIMEOUT             Sending L2CAP message fail due to timeout.
  @retval EFI_DEVICE_ERROR        Sending L2CAP message fail due to host controller or device error.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_IO_L2CAP_RAW_SEND)(
  IN EFI_BLUETOOTH_IO_PROTOCOL      *This,
  IN OUT UINTN                      *BufferSize,
  IN VOID                           *Buffer,
  IN UINTN                          Timeout
  );

/**
  Receive L2CAP message (including L2CAP header).

  @param[in]  This                Pointer to the EFI_BLUETOOTH_IO_PROTOCOL instance.
  @param[in]  BufferSize          On input, indicates the size, in bytes, of the data buffer specified by Buffer.
                                  On output, indicates the amount of data actually transferred.
  @param[out] Buffer              A pointer to the buffer of data that will be received from Bluetooth L2CAP layer.
  @param[in]  Timeout             Indicating the transfer should be completed within this time frame. The units are in
                                  milliseconds. If Timeout is 0, then the caller must wait for the function to be completed
                                  until EFI_SUCCESS or EFI_DEVICE_ERROR is returned.

  @retval EFI_SUCCESS             The L2CAP message is received successfully.
  @retval EFI_INVALID_PARAMETER   One or more of the following conditions is TRUE:
                                  - BufferSize is NULL.
                                  - *BufferSize is 0.
                                  - Buffer is NULL.
  @retval EFI_TIMEOUT             Receiving L2CAP message fail due to timeout.
  @retval EFI_DEVICE_ERROR        Receiving L2CAP message fail due to host controller or device error.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_IO_L2CAP_RAW_RECEIVE)(
  IN EFI_BLUETOOTH_IO_PROTOCOL  *This,
  IN OUT UINTN                  *BufferSize,
  OUT VOID                      *Buffer,
  IN UINTN                      Timeout
  );

/**
  Callback function, it is called when asynchronous transfer is completed.

  @param[in]  ChannelID         Bluetooth L2CAP message channel ID.
  @param[in]  Data              Data received via asynchronous transfer.
  @param[in]  DataLength        The length of Data in bytes, received via asynchronous transfer.
  @param[in]  Context           Context passed from asynchronous transfer request.

  @retval EFI_SUCCESS           The callback function complete successfully.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_IO_ASYNC_FUNC_CALLBACK)(
  IN UINT16                     ChannelID,
  IN VOID                       *Data,
  IN UINTN                      DataLength,
  IN VOID                       *Context
  );

/**
  Receive L2CAP message (including L2CAP header) in non-blocking way.

  @param[in]  This                Pointer to the EFI_BLUETOOTH_IO_PROTOCOL instance.
  @param[in]  IsNewTransfer       If TRUE, a new transfer will be submitted. If FALSE, the request is deleted.
  @param[in]  PollingInterval     Indicates the periodic rate, in milliseconds, that the transfer is to be executed.
  @param[in]  DataLength          Specifies the length, in bytes, of the data to be received.
  @param[in]  Callback            The callback function. This function is called if the asynchronous transfer is
                                  completed.
  @param[in]  Context             Data passed into Callback function. This is optional parameter and may be NULL.

  @retval EFI_SUCCESS             The L2CAP asynchronous receive request is submitted successfully.
  @retval EFI_INVALID_PARAMETER   One or more of the following conditions is TRUE:
                                  - DataLength is 0.
                                  - If IsNewTransfer is TRUE, and an asynchronous receive request already exists.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_IO_L2CAP_RAW_ASYNC_RECEIVE)(
  IN EFI_BLUETOOTH_IO_PROTOCOL              *This,
  IN BOOLEAN                                IsNewTransfer,
  IN UINTN                                  PollingInterval,
  IN UINTN                                  DataLength,
  IN EFI_BLUETOOTH_IO_ASYNC_FUNC_CALLBACK   Callback,
  IN VOID                                   *Context
  );

/**
  Send L2CAP message (excluding L2CAP header) to a specific channel.

  @param[in]      This            Pointer to the EFI_BLUETOOTH_IO_PROTOCOL instance.
  @param[in]      Handle          A handle created by EFI_BLUETOOTH_IO_PROTOCOL.L2CapConnect indicates which channel to send.
  @param[in, out] BufferSize      On input, indicates the size, in bytes, of the data buffer specified by Buffer.
                                  On output, indicates the amount of data actually transferred.
  @param[in]      Buffer          A pointer to the buffer of data that will be transmitted to Bluetooth L2CAP layer.
  @param[in]      Timeout         Indicating the transfer should be completed within this time frame. The units are in
                                  milliseconds. If Timeout is 0, then the caller must wait for the function to be completed
                                  until EFI_SUCCESS or EFI_DEVICE_ERROR is returned.

  @retval EFI_SUCCESS             The L2CAP message is sent successfully.
  @retval EFI_NOT_FOUND           Handle is invalid or not found.
  @retval EFI_INVALID_PARAMETER   One or more of the following conditions is TRUE:
                                  - BufferSize is NULL.
                                  - *BufferSize is 0.
                                  - Buffer is NULL.
  @retval EFI_TIMEOUT             Sending L2CAP message fail due to timeout.
  @retval EFI_DEVICE_ERROR        Sending L2CAP message fail due to host controller or device error.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_IO_L2CAP_SEND)(
  IN EFI_BLUETOOTH_IO_PROTOCOL      *This,
  IN EFI_HANDLE                     Handle,
  IN OUT UINTN                      *BufferSize,
  IN VOID                           *Buffer,
  IN UINTN                          Timeout
  );

/**
  Receive L2CAP message (excluding L2CAP header) from a specific channel.

  @param[in]  This                Pointer to the EFI_BLUETOOTH_IO_PROTOCOL instance.
  @param[in]  Handle              A handle created by EFI_BLUETOOTH_IO_PROTOCOL.L2CapConnect indicates which channel to receive.
  @param[out] BufferSize          Indicates the size, in bytes, of the data buffer specified by Buffer.
  @param[out] Buffer              A pointer to the buffer of data that will be received from Bluetooth L2CAP layer.
  @param[in]  Timeout             Indicating the transfer should be completed within this time frame. The units are in
                                  milliseconds. If Timeout is 0, then the caller must wait for the function to be completed
                                  until EFI_SUCCESS or EFI_DEVICE_ERROR is returned.

  @retval EFI_SUCCESS             The L2CAP message is received successfully.
  @retval EFI_NOT_FOUND           Handle is invalid or not found.
  @retval EFI_INVALID_PARAMETER   One or more of the following conditions is TRUE:
                                  - BufferSize is NULL.
                                  - *BufferSize is 0.
                                  - Buffer is NULL.
  @retval EFI_TIMEOUT             Receiving L2CAP message fail due to timeout.
  @retval EFI_DEVICE_ERROR        Receiving L2CAP message fail due to host controller or device error.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_IO_L2CAP_RECEIVE)(
  IN EFI_BLUETOOTH_IO_PROTOCOL    *This,
  IN EFI_HANDLE                   Handle,
  OUT UINTN                       *BufferSize,
  OUT VOID                        **Buffer,
  IN UINTN                        Timeout
  );

/**
  Callback function, it is called when asynchronous transfer is completed.

  @param[in]  Data                Data received via asynchronous transfer.
  @param[in]  DataLength          The length of Data in bytes, received via asynchronous transfer.
  @param[in]  Context             Context passed from asynchronous transfer request.

  @retval EFI_SUCCESS       The callback function complete successfully.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_IO_CHANNEL_SERVICE_CALLBACK)(
  IN VOID                         *Data,
  IN UINTN                        DataLength,
  IN VOID                         *Context
  );

/**
  Receive L2CAP message (excluding L2CAP header) in non-blocking way from a specific channel.

  @param[in]  This                Pointer to the EFI_BLUETOOTH_IO_PROTOCOL instance.
  @param[in]  Handel              A handle created by EFI_BLUETOOTH_IO_PROTOCOL.L2CapConnect indicates which channel
                                  to receive.
  @param[in]  Callback            The callback function. This function is called if the asynchronous transfer is
                                  completed.
  @param[in]  Context             Data passed into Callback function. This is optional parameter and may be NULL.

  @retval EFI_SUCCESS             The L2CAP asynchronous receive request is submitted successfully.
  @retval EFI_NOT_FOUND           Handle is invalid or not found.
  @retval EFI_INVALID_PARAMETER   One or more of the following conditions is TRUE:
                                  - DataLength is 0.
                                  - If an asynchronous receive request already exists on same Handle.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_IO_L2CAP_ASYNC_RECEIVE)(
  IN  EFI_BLUETOOTH_IO_PROTOCOL                   *This,
  IN  EFI_HANDLE                                  Handle,
  IN  EFI_BLUETOOTH_IO_CHANNEL_SERVICE_CALLBACK   Callback,
  IN  VOID *Context
  );

/**
  Do L2CAP connection.

  @param[in]  This                Pointer to the EFI_BLUETOOTH_IO_PROTOCOL instance.
  @param[out] Handel              A handle to indicate this L2CAP connection.
  @param[in]  Psm                 Bluetooth PSM. See Bluetooth specification for detail.
  @param[in]  Mtu                 Bluetooth MTU. See Bluetooth specification for detail.
  @param[in]  Callback            The callback function. This function is called whenever there is message received
                                  in this channel.
  @param[in]  Context             Data passed into Callback function. This is optional parameter and may be NULL.

  @retval EFI_SUCCESS             The Bluetooth L2CAP layer connection is created successfully.
  @retval EFI_INVALID_PARAMETER   One or more of the following conditions is TRUE:
                                  - Handle is NULL.
  @retval EFI_DEVICE_ERROR        A hardware error occurred trying to do Bluetooth L2CAP connection.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_IO_L2CAP_CONNECT)(
  IN EFI_BLUETOOTH_IO_PROTOCOL                    *This,
  OUT EFI_HANDLE                                  *Handle,
  IN UINT16                                       Psm,
  IN UINT16                                       Mtu,
  IN EFI_BLUETOOTH_IO_CHANNEL_SERVICE_CALLBACK    Callback,
  IN VOID                                         *Context
  );

/**
  Do L2CAP disconnection.

  @param[in]  This                Pointer to the EFI_BLUETOOTH_IO_PROTOCOL instance.
  @param[in]  Handel              A handle to indicate this L2CAP connection.

  @retval EFI_SUCCESS             The Bluetooth L2CAP layer is disconnected successfully.
  @retval EFI_NOT_FOUND           Handle is invalid or not found.
  @retval EFI_DEVICE_ERROR        A hardware error occurred trying to do Bluetooth L2CAP disconnection.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_IO_L2CAP_DISCONNECT)(
  IN EFI_BLUETOOTH_IO_PROTOCOL                    *This,
  IN EFI_HANDLE                                   Handle
  );

/**
  Register L2CAP callback function for special channel.

  @param[in]  This                Pointer to the EFI_BLUETOOTH_IO_PROTOCOL instance.
  @param[out] Handel              A handle to indicate this L2CAP connection.
  @param[in]  Psm                 Bluetooth PSM. See Bluetooth specification for detail.
  @param[in]  Mtu                 Bluetooth MTU. See Bluetooth specification for detail.
  @param[in]  Callback            The callback function. This function is called whenever there is message received
                                  in this channel. NULL means unregister.
  @param[in]  Context             Data passed into Callback function. This is optional parameter and may be NULL.

  @retval EFI_SUCCESS             The Bluetooth L2CAP callback function is registered successfully.
  @retval EFI_ALREADY_STARTED     The callback function already exists when register.
  @retval EFI_NOT_FOUND           The callback function does not exist when unregister.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_BLUETOOTH_IO_L2CAP_REGISTER_SERVICE)(
  IN EFI_BLUETOOTH_IO_PROTOCOL                    *This,
  OUT EFI_HANDLE                                  *Handle,
  IN UINT16                                       Psm,
  IN UINT16                                       Mtu,
  IN EFI_BLUETOOTH_IO_CHANNEL_SERVICE_CALLBACK    Callback,
  IN VOID                                         *Context
  );

///
/// This protocol provides service for Bluetooth L2CAP (Logical Link Control and Adaptation Protocol)
/// and SDP (Service Discovery Protocol).
///
struct _EFI_BLUETOOTH_IO_PROTOCOL {
  EFI_BLUETOOTH_IO_GET_DEVICE_INFO            GetDeviceInfo;
  EFI_BLUETOOTH_IO_GET_SDP_INFO               GetSdpInfo;
  EFI_BLUETOOTH_IO_L2CAP_RAW_SEND             L2CapRawSend;
  EFI_BLUETOOTH_IO_L2CAP_RAW_RECEIVE          L2CapRawReceive;
  EFI_BLUETOOTH_IO_L2CAP_RAW_ASYNC_RECEIVE    L2CapRawAsyncReceive;
  EFI_BLUETOOTH_IO_L2CAP_SEND                 L2CapSend;
  EFI_BLUETOOTH_IO_L2CAP_RECEIVE              L2CapReceive;
  EFI_BLUETOOTH_IO_L2CAP_ASYNC_RECEIVE        L2CapAsyncReceive;
  EFI_BLUETOOTH_IO_L2CAP_CONNECT              L2CapConnect;
  EFI_BLUETOOTH_IO_L2CAP_DISCONNECT           L2CapDisconnect;
  EFI_BLUETOOTH_IO_L2CAP_REGISTER_SERVICE     L2CapRegisterService;
};

extern EFI_GUID  gEfiBluetoothIoServiceBindingProtocolGuid;
extern EFI_GUID  gEfiBluetoothIoProtocolGuid;

#endif
