// Copyright 2019 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.

#ifndef SRC_DEVICES_USB_DRIVERS_XHCI_XHCI_CONTEXT_H_
#define SRC_DEVICES_USB_DRIVERS_XHCI_XHCI_CONTEXT_H_

#include <lib/fit/function.h>
#include <lib/fpromise/bridge.h>
#include <lib/synchronous-executor/executor.h>

#include <memory>

#include <fbl/intrusive_double_list.h>
#include <fbl/ref_counted.h>
#include <fbl/slab_allocator.h>
#include <usb/request-cpp.h>

#include "lib/fpromise/promise.h"
#include "src/devices/usb/drivers/xhci/registers.h"
#include "src/devices/usb/drivers/xhci/xhci-hub.h"
#include "src/devices/usb/lib/usb-endpoint/include/usb-endpoint/usb-endpoint-server.h"

namespace usb_xhci {
struct TRBContext;

using Request = usb::BorrowedRequest<void>;
using OwnedRequest = usb::Request<void>;

using TRBPromise = fpromise::promise<TRB*, zx_status_t>;
using AllocatorTraits = fbl::InstancedSlabAllocatorTraits<std::unique_ptr<TRBContext>, 4096U>;
using AllocatorType = fbl::SlabAllocator<AllocatorTraits>;
struct TRBContext : fbl::DoublyLinkedListable<std::unique_ptr<TRBContext>>,
                    fbl::SlabAllocated<AllocatorTraits> {
  // Root hub port number
  uint8_t port_number = 0;
  std::optional<HubInfo> hub_info;
  std::optional<usb_endpoint::RequestVariant> request;
  std::optional<fpromise::completer<TRB*, zx_status_t>> completer;
  uint64_t token;

  // The last TRB in the TD, i.e. the TRB with IOC (interrupt on completion) set to true. This is
  // the TRB that will pointed to by a transfer event on completion.
  TRB* trb = nullptr;

  // The first TRB in the TD.
  TRB* first_trb = nullptr;

  // When the TD includes a short TRB, this will be set to the actual length of data transferred.
  std::optional<size_t> short_transfer_len;
};

}  // namespace usb_xhci

// Specializations of some fpromise methods to make code more ergnomic.
namespace fpromise {
inline promise_impl<::fpromise::internal::result_continuation<usb_xhci::TRB*, zx_status_t>>
make_error_promise(zx_status_t error) {
  return make_result_promise<usb_xhci::TRB*, zx_status_t>(fpromise::error(error));
}

inline promise_impl<::fpromise::internal::result_continuation<usb_xhci::TRB*, zx_status_t>>
make_ok_promise(usb_xhci::TRB* trb) {
  return make_result_promise<usb_xhci::TRB*, zx_status_t>(fpromise::ok(trb));
}
}  // namespace fpromise

#endif  // SRC_DEVICES_USB_DRIVERS_XHCI_XHCI_CONTEXT_H_
