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