// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

library fuchsia.hardware.bt.vendor;

using zx;

/// The maximum buffer length an encoded command might require.
/// Update when adding new commands that might require a larger buffer.
const uint16 BT_VENDOR_MAX_COMMAND_BUFFER_LEN = 16;

/// Bitmask of features supported by the vendor.
enum BtVendorFeatures : uint32 {
    SET_ACL_PRIORITY_COMMAND = 0x1;
    // Bits 1-31 reserved.
};

enum BtVendorAclPriority : uint8 {
    NORMAL = 0;
    HIGH = 1;
};

enum BtVendorAclDirection : uint8 {
    SOURCE = 0;
    SINK = 1;
};

struct BtVendorSetAclPriorityParams {
    uint16 connection_handle;
    BtVendorAclPriority priority;
    /// The direction data should be prioritized in. May not be supported by all
    /// vendors. Ignored when priority is normal.
    BtVendorAclDirection direction;
};

union BtVendorParams {
    1: BtVendorSetAclPriorityParams set_acl_priority;
};

enum BtVendorCommand {
    /// Marks a connection as normal or high priority.
    /// Parameters: `BtVendorSetAclPriorityParams`
    SET_ACL_PRIORITY = 0;
};

/// The BtVendor protocol may be implemented by vendor drivers to support feature interrogation
/// and vendor command encoding.
[Transport = "Banjo", BanjoLayout = "ddk-protocol"]
protocol BtVendor {
    /// Returns bitmask of the features the vendor supports.
    GetFeatures() -> (BtVendorFeatures features);

    /// Encodes the vendor HCI command `command` using `params` and returns the encoded command as
    /// a buffer. `params` must contain the parameter struct for the specified command, as
    /// documented in `BtVendorCommand`.
    /// Returns an error status if the command is not supported or the paramaters are invalid.
    EncodeCommand(BtVendorCommand command, BtVendorParams params)
        -> (zx.status status, [Buffer] vector<uint8>:BT_VENDOR_MAX_COMMAND_BUFFER_LEN encoded);
};
