// Copyright 2022 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.fastboot;

using zx;

/// USB Fastboot implementation protocol. Fastboot is a single-channel and fully synchronous
/// protocol for communication between host and device.
closed protocol FastbootImpl {
    /// Sends fastboot data via USB fastboot device.
    ///
    /// This FIDL protocol blocks until all USB requests needed to send the data are completed. It
    /// can only serve one request at a time.
    ///
    /// Returns ZX_ERR_UNAVAILABLE if another call is made while a previous one is being processed,
    /// or the FIDL is called too early during boot when the driver has not become ready.
    strict Send(resource struct {
        data zx.Handle:VMO;
    }) -> () error zx.Status;

    /// Receives at least `requested` bytes of data from the USB fastboot device.
    ///
    /// Upon success, a vmo is allocated and returned by the driver which contains the data and the
    /// actual received data size (via vmo::get_prop_content_size()). Because USB transmission is
    /// in the unit of packet (512bytes), the actual received size can be at most 512 bytes more
    /// than the requested size.
    ///
    /// If `requested` is 0, the driver returns as soon as a USB packet with data is received. This
    /// should be the value used when expecting fastboot command which is guaranteed to be within a
    /// single USB packet (a fastboot command is no more than 64 bytes as per protocol). When
    /// expecting larger amount of data during image download, it should be set to a larger value
    /// to avoid the overhead of calling this FIDL too many times, as it can be very expensive
    /// comparing to actual data transfer.
    ///
    /// This FIDL protocol is blocking and can only serve one request at a time (Send() is not
    /// affected. Receive() and Send() are individually synchronous).
    ///
    /// Returns ZX_ERR_UNAVAILABLE if another call is made while a previous one is being processed,
    /// or the FIDL is called too early during boot when the driver has not become ready.
    strict Receive(struct {
        requested uint64;
    }) -> (resource struct {
        data zx.Handle:VMO;
    }) error zx.Status;
};
