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

#pragma once

#include <ddk/phys-iter.h>
#include <ddk/protocol/usb/request.h>

#include "xhci-trb.h"

namespace usb_xhci {

// cache is coherent on x86
// state for endpoint's current transfer
struct xhci_transfer_state_t {
    phys_iter_t         phys_iter;
    uint32_t            packet_count;       // remaining packets to send
    uint8_t             direction;
    bool                needs_data_event;   // true if we still need to queue data event TRB
    bool                needs_status;       // true if we still need to queue status TRB
    bool                needs_transfer_trb; // true if we still need to queue transfer TRB
    bool                needs_zlp;          // true if we still need to queue a zero length packet
};

void xhci_print_trb(xhci_transfer_ring_t* ring, xhci_trb_t* trb);

// Before calling this, you should call usb_request_physmap.
void xhci_transfer_state_init(xhci_transfer_state_t* state, usb_request_t* req,
                              uint8_t ep_type, uint16_t ep_max_packet_size);

// Queues TRBs on the given transfer ring for the Data stage of a USB transfer.
// Whether TRBs will be queued depends on the given transfer state, and whether
// there is space available on the transfer ring.
//
// Returns ZX_OK if all necessary TRBs have been queued, or ZX_ERR_SHOULD_WAIT
// if the user should call this function again later.
zx_status_t xhci_queue_data_trbs(xhci_transfer_ring_t* ring, xhci_transfer_state_t* state,
                                 usb_request_t* req, int interrupter_target, bool isochronous);

} // namespace usb_xhci
