blob: a1b5732c33bbd7114913b098157a64a761a4228e [file] [log] [blame]
// 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.
#ifndef SRC_DEVICES_USB_DRIVERS_XHCI_XHCI_TRANSFER_COMMON_H_
#define SRC_DEVICES_USB_DRIVERS_XHCI_XHCI_TRANSFER_COMMON_H_
#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
#endif // SRC_DEVICES_USB_DRIVERS_XHCI_XHCI_TRANSFER_COMMON_H_