xref: /aosp_15_r20/external/crosvm/devices/src/usb/backend/error.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1 // Copyright 2019 The ChromiumOS Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 use base::TubeError;
6 use remain::sorted;
7 use thiserror::Error;
8 use usb_util::Error as UsbUtilError;
9 
10 use crate::usb::backend::fido_backend::error::Error as FidoError;
11 use crate::usb::xhci::scatter_gather_buffer::Error as BufferError;
12 use crate::usb::xhci::xhci_transfer::Error as XhciTransferError;
13 use crate::utils::Error as UtilsError;
14 
15 #[sorted]
16 #[derive(Error, Debug)]
17 pub enum Error {
18     #[error("failed to add to event loop: {0}")]
19     AddToEventLoop(UtilsError),
20     #[error("failed to alloc streams: {0}")]
21     AllocStreams(UsbUtilError),
22     #[error("backend provider is in a bad state")]
23     BadBackendProviderState,
24     #[error("xhci transfer is in a bad state")]
25     BadXhciTransferState,
26     #[error("failed to get buffer length: {0}")]
27     BufferLen(BufferError),
28     #[error("failed to clear halt: {0}")]
29     ClearHalt(UsbUtilError),
30     #[error("failed to create scatter gather buffer: {0}")]
31     CreateBuffer(XhciTransferError),
32     #[error("failed to create control tube: {0}")]
33     CreateControlTube(TubeError),
34     #[error("failed to create fido backend device: {0}")]
35     CreateFidoBackendDevice(FidoError),
36     #[error("failed to create host backend usb device: {0}")]
37     CreateHostUsbDevice(UsbUtilError),
38     #[error("failed to create libusb context: {0}")]
39     CreateLibUsbContext(UsbUtilError),
40     #[error("failed to create transfer: {0}")]
41     CreateTransfer(UsbUtilError),
42     #[error("failed to create USB request setup: {0}")]
43     CreateUsbRequestSetup(XhciTransferError),
44     #[error("failed to free streams: {0}")]
45     FreeStreams(UsbUtilError),
46     #[error("failed to get active config: {0}")]
47     GetActiveConfig(UsbUtilError),
48     #[error("failed to get config descriptor: {0}")]
49     GetConfigDescriptor(UsbUtilError),
50     #[error("failed to get device descriptor: {0}")]
51     GetDeviceDescriptor(UsbUtilError),
52     #[error("failed to get dma buffer")]
53     GetDmaBuffer,
54     #[error("failed to get endpoint descriptor for ep: {0}")]
55     GetEndpointDescriptor(u8),
56     #[error("failed to get endpoint type")]
57     GetEndpointType,
58     /// Cannot get interface descriptor for (interface, altsetting).
59     #[error("failed to get interface descriptor for interface {0}, alt setting {1}")]
60     GetInterfaceDescriptor(u8, u8),
61     #[error("failed to get xhci transfer type: {0}")]
62     GetXhciTransferType(XhciTransferError),
63     #[error("the backend received the wrong transfer request")]
64     MalformedBackendTransfer,
65     #[error("request missing required data buffer")]
66     MissingRequiredBuffer,
67     #[error("failed to queue async job: {0}")]
68     QueueAsyncJob(UtilsError),
69     #[error("failed to read buffer: {0}")]
70     ReadBuffer(BufferError),
71     #[error("failed to read control tube: {0}")]
72     ReadControlTube(TubeError),
73     #[error("failed to release dma buffer")]
74     ReleaseDmaBuffer,
75     #[error("failed to remove device from event loop: {0}")]
76     RemoveFromEventLoop(UtilsError),
77     #[error("failed to reset: {0}")]
78     Reset(UsbUtilError),
79     #[error("failed to set active config: {0}")]
80     SetActiveConfig(UsbUtilError),
81     #[error("failed to set interface alt setting: {0}")]
82     SetInterfaceAltSetting(UsbUtilError),
83     #[error("failed to setup control tube: {0}")]
84     SetupControlTube(TubeError),
85     #[error("failed to start async job queue: {0}")]
86     StartAsyncJobQueue(UtilsError),
87     #[error("xhci transfer completed: {0}")]
88     TransferComplete(XhciTransferError),
89     #[error("failed to cancel transfer: {0}")]
90     TransferHandle(UsbUtilError),
91     #[error("transfer has already completed when being cancelled")]
92     TransferHandleAlreadyComplete,
93     #[error("failed to write buffer: {0}")]
94     WriteBuffer(BufferError),
95     #[error("failed to write control tube: {0}")]
96     WriteControlTube(TubeError),
97 }
98 
99 pub type Result<T> = std::result::Result<T, Error>;
100