// Copyright 2016 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/protocol/usb/request.h>
#include <zircon/listnode.h>

#include "xhci-trb.h"

// this struct contains state needed for a virtual root hub device
typedef struct {
    uint8_t num_ports;

    // port status for each of our ports
    usb_port_status_t*  port_status;

    // maps our virtual port index to actual root hub port index
    uint8_t* port_map;

    // interrupt requests we have pending from hub driver
    list_node_t pending_intr_reqs;

    const usb_device_descriptor_t* device_desc;
    const usb_configuration_descriptor_t* config_desc;
    usb_speed_t speed;
} xhci_root_hub_t;

zx_status_t xhci_root_hub_init(xhci_t* xhci, int rh_index);
void xhci_root_hub_free(xhci_root_hub_t* rh);
zx_status_t xhci_start_root_hubs(xhci_t* xhci);
void xhci_stop_root_hubs(xhci_t* xhci);
zx_status_t xhci_rh_usb_request_queue(xhci_t* xhci, usb_request_t* req, int rh_index);
void xhci_handle_root_hub_change(xhci_t* xhci);
