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 std::collections::HashMap; 6 use std::mem; 7 use std::sync::Arc; 8 use std::sync::RwLock; 9 10 use base::debug; 11 use base::error; 12 use base::AsRawDescriptor; 13 use base::RawDescriptor; 14 use sync::Mutex; 15 use usb_util::ConfigDescriptorTree; 16 use usb_util::DescriptorHeader; 17 use usb_util::Device; 18 use usb_util::DeviceDescriptorTree; 19 use usb_util::DeviceSpeed; 20 use usb_util::InterfaceDescriptor; 21 use usb_util::Transfer; 22 use usb_util::TransferBuffer; 23 use usb_util::TransferHandle; 24 use usb_util::TransferStatus; 25 use usb_util::UsbRequestSetup; 26 use zerocopy::AsBytes; 27 28 use crate::usb::backend::device::BackendDevice; 29 use crate::usb::backend::device::DeviceState; 30 use crate::usb::backend::endpoint::ControlEndpointState; 31 use crate::usb::backend::endpoint::UsbEndpoint; 32 use crate::usb::backend::error::Error; 33 use crate::usb::backend::error::Result; 34 use crate::usb::backend::transfer::BackendTransfer; 35 use crate::usb::backend::transfer::BackendTransferHandle; 36 use crate::usb::backend::transfer::BackendTransferType; 37 use crate::usb::backend::transfer::ControlTransferState; 38 use crate::usb::backend::transfer::GenericTransferHandle; 39 use crate::usb::xhci::scatter_gather_buffer::ScatterGatherBuffer; 40 use crate::usb::xhci::xhci_backend_device::BackendType; 41 use crate::usb::xhci::xhci_backend_device::UsbDeviceAddress; 42 use crate::usb::xhci::xhci_backend_device::XhciBackendDevice; 43 use crate::utils::EventLoop; 44 45 /// Host device is a device connected to host. 46 pub struct HostDevice { 47 pub device: Arc<Mutex<Device>>, 48 alt_settings: HashMap<u8, u8>, 49 claimed_interfaces: Vec<u8>, 50 state: Arc<RwLock<DeviceState>>, 51 control_transfer_state: Arc<RwLock<ControlTransferState>>, 52 } 53 54 impl HostDevice { 55 /// Create a new host device. new(device: Arc<Mutex<Device>>, state: DeviceState) -> Result<HostDevice>56 pub fn new(device: Arc<Mutex<Device>>, state: DeviceState) -> Result<HostDevice> { 57 let control_transfer_state = ControlTransferState { 58 ctl_ep_state: ControlEndpointState::SetupStage, 59 control_request_setup: UsbRequestSetup::new(0, 0, 0, 0, 0), 60 executed: false, 61 }; 62 let mut host_device = HostDevice { 63 device, 64 alt_settings: HashMap::new(), 65 claimed_interfaces: vec![], 66 state: Arc::new(RwLock::new(state)), 67 control_transfer_state: Arc::new(RwLock::new(control_transfer_state)), 68 }; 69 70 let config_descriptor = host_device.get_active_config_descriptor()?; 71 host_device.claim_interfaces(&config_descriptor); 72 73 Ok(host_device) 74 } 75 76 // Execute a Get Descriptor control request with type Configuration. 77 // This function is used to return a filtered version of the host device's configuration 78 // descriptor that only includes the interfaces in `self.claimed_interfaces`. get_config_descriptor_filtered( &mut self, buffer: &ScatterGatherBuffer, descriptor_index: u8, ) -> Result<(TransferStatus, u32)>79 pub fn get_config_descriptor_filtered( 80 &mut self, 81 buffer: &ScatterGatherBuffer, 82 descriptor_index: u8, 83 ) -> Result<(TransferStatus, u32)> { 84 let _trace = cros_tracing::trace_event!( 85 USB, 86 "host_device get_config_descriptor_filtered", 87 descriptor_index 88 ); 89 90 let config_descriptor = self.get_config_descriptor_by_index(descriptor_index)?; 91 92 let device_descriptor = self.get_device_descriptor_tree()?; 93 let config_start = config_descriptor.offset(); 94 let config_end = config_start + config_descriptor.wTotalLength as usize; 95 let mut descriptor_data = device_descriptor.raw()[config_start..config_end].to_vec(); 96 97 if config_descriptor.bConfigurationValue == self.get_active_configuration()? { 98 for i in 0..config_descriptor.bNumInterfaces { 99 if !self.claimed_interfaces.contains(&i) { 100 // Rewrite descriptors for unclaimed interfaces to vendor-specific class. 101 // This prevents them from being recognized by the guest drivers. 102 let alt_setting = self.alt_settings.get(&i).unwrap_or(&0); 103 let interface = config_descriptor 104 .get_interface_descriptor(i, *alt_setting) 105 .ok_or(Error::GetInterfaceDescriptor(i, *alt_setting))?; 106 let mut interface_data: InterfaceDescriptor = **interface; 107 interface_data.bInterfaceClass = 0xFF; 108 interface_data.bInterfaceSubClass = 0xFF; 109 interface_data.bInterfaceProtocol = 0xFF; 110 111 let interface_start = 112 interface.offset() + mem::size_of::<DescriptorHeader>() - config_start; 113 let interface_end = interface_start + mem::size_of::<InterfaceDescriptor>(); 114 descriptor_data[interface_start..interface_end] 115 .copy_from_slice(interface_data.as_bytes()); 116 } 117 } 118 } 119 120 let bytes_transferred = buffer.write(&descriptor_data).map_err(Error::WriteBuffer)?; 121 Ok((TransferStatus::Completed, bytes_transferred as u32)) 122 } 123 set_interface(&mut self, interface: u8, alt_setting: u8) -> Result<TransferStatus>124 pub fn set_interface(&mut self, interface: u8, alt_setting: u8) -> Result<TransferStatus> { 125 let _trace = cros_tracing::trace_event!(USB, "host_device set_interface"); 126 // It's a standard, set_interface, interface request. 127 self.device 128 .lock() 129 .set_interface_alt_setting(interface, alt_setting) 130 .map_err(Error::SetInterfaceAltSetting)?; 131 self.alt_settings.insert(interface, alt_setting); 132 let config = self.get_active_configuration()?; 133 let config_descriptor = self.get_config_descriptor(config)?; 134 self.create_endpoints(&config_descriptor)?; 135 Ok(TransferStatus::Completed) 136 } 137 claim_interfaces(&mut self, config_descriptor: &ConfigDescriptorTree)138 pub fn claim_interfaces(&mut self, config_descriptor: &ConfigDescriptorTree) { 139 for i in 0..config_descriptor.num_interfaces() { 140 match self.device.lock().claim_interface(i) { 141 Ok(()) => { 142 debug!("usb: claimed interface {}", i); 143 self.claimed_interfaces.push(i); 144 } 145 Err(e) => { 146 error!("unable to claim interface {}: {:?}", i, e); 147 } 148 } 149 } 150 } 151 release_interfaces(&mut self)152 pub fn release_interfaces(&mut self) { 153 let device_locked = self.device.lock(); 154 for i in &self.claimed_interfaces { 155 if let Err(e) = device_locked.release_interface(*i) { 156 error!("could not release interface: {:?}", e); 157 } 158 } 159 self.claimed_interfaces = Vec::new(); 160 } 161 } 162 163 impl Drop for HostDevice { drop(&mut self)164 fn drop(&mut self) { 165 self.release_interfaces(); 166 } 167 } 168 169 impl AsRawDescriptor for HostDevice { as_raw_descriptor(&self) -> RawDescriptor170 fn as_raw_descriptor(&self) -> RawDescriptor { 171 self.device.lock().as_raw_descriptor() 172 } 173 } 174 175 impl GenericTransferHandle for TransferHandle { cancel(&self) -> Result<()>176 fn cancel(&self) -> Result<()> { 177 TransferHandle::cancel(self).map_err(Error::TransferHandle) 178 } 179 } 180 181 impl BackendDevice for HostDevice { submit_backend_transfer( &mut self, transfer: BackendTransferType, ) -> Result<BackendTransferHandle>182 fn submit_backend_transfer( 183 &mut self, 184 transfer: BackendTransferType, 185 ) -> Result<BackendTransferHandle> { 186 match transfer { 187 BackendTransferType::HostDevice(transfer) => self 188 .device 189 .lock() 190 .submit_transfer(transfer) 191 .map_err(Error::CreateTransfer) 192 .map(BackendTransferHandle::new), 193 _ => Err(Error::MalformedBackendTransfer), 194 } 195 } 196 detach_event_handler(&self, event_loop: &Arc<EventLoop>) -> Result<()>197 fn detach_event_handler(&self, event_loop: &Arc<EventLoop>) -> Result<()> { 198 event_loop 199 .remove_event_for_descriptor(self) 200 .map_err(Error::RemoveFromEventLoop) 201 } 202 request_transfer_buffer(&mut self, size: usize) -> TransferBuffer203 fn request_transfer_buffer(&mut self, size: usize) -> TransferBuffer { 204 match self.device.lock().reserve_dma_buffer(size) { 205 Ok(dmabuf) => TransferBuffer::Dma(dmabuf), 206 Err(_) => TransferBuffer::Vector(vec![0u8; size]), 207 } 208 } 209 build_bulk_transfer( &mut self, ep_addr: u8, transfer_buffer: TransferBuffer, stream_id: Option<u16>, ) -> Result<BackendTransferType>210 fn build_bulk_transfer( 211 &mut self, 212 ep_addr: u8, 213 transfer_buffer: TransferBuffer, 214 stream_id: Option<u16>, 215 ) -> Result<BackendTransferType> { 216 Ok(BackendTransferType::HostDevice( 217 Transfer::new_bulk(ep_addr, transfer_buffer, stream_id) 218 .map_err(Error::CreateTransfer)?, 219 )) 220 } 221 build_interrupt_transfer( &mut self, ep_addr: u8, transfer_buffer: TransferBuffer, ) -> Result<BackendTransferType>222 fn build_interrupt_transfer( 223 &mut self, 224 ep_addr: u8, 225 transfer_buffer: TransferBuffer, 226 ) -> Result<BackendTransferType> { 227 Ok(BackendTransferType::HostDevice( 228 Transfer::new_interrupt(ep_addr, transfer_buffer).map_err(Error::CreateTransfer)?, 229 )) 230 } 231 get_control_transfer_state(&mut self) -> Arc<RwLock<ControlTransferState>>232 fn get_control_transfer_state(&mut self) -> Arc<RwLock<ControlTransferState>> { 233 self.control_transfer_state.clone() 234 } 235 get_device_state(&mut self) -> Arc<RwLock<DeviceState>>236 fn get_device_state(&mut self) -> Arc<RwLock<DeviceState>> { 237 self.state.clone() 238 } 239 get_active_config_descriptor(&mut self) -> Result<ConfigDescriptorTree>240 fn get_active_config_descriptor(&mut self) -> Result<ConfigDescriptorTree> { 241 let cur_config = self.get_active_configuration()?; 242 self.get_config_descriptor(cur_config) 243 } 244 get_config_descriptor(&mut self, config: u8) -> Result<ConfigDescriptorTree>245 fn get_config_descriptor(&mut self, config: u8) -> Result<ConfigDescriptorTree> { 246 self.device 247 .lock() 248 .get_config_descriptor(config) 249 .map_err(Error::GetActiveConfig) 250 } 251 get_config_descriptor_by_index(&mut self, config_index: u8) -> Result<ConfigDescriptorTree>252 fn get_config_descriptor_by_index(&mut self, config_index: u8) -> Result<ConfigDescriptorTree> { 253 self.device 254 .lock() 255 .get_config_descriptor_by_index(config_index) 256 .map_err(Error::GetConfigDescriptor) 257 } 258 get_device_descriptor_tree(&mut self) -> Result<DeviceDescriptorTree>259 fn get_device_descriptor_tree(&mut self) -> Result<DeviceDescriptorTree> { 260 Ok(self.device.lock().get_device_descriptor_tree().clone()) 261 } 262 get_active_configuration(&mut self) -> Result<u8>263 fn get_active_configuration(&mut self) -> Result<u8> { 264 self.device 265 .lock() 266 .get_active_configuration() 267 .map_err(Error::GetActiveConfig) 268 } 269 set_active_configuration(&mut self, config: u8) -> Result<()>270 fn set_active_configuration(&mut self, config: u8) -> Result<()> { 271 self.device 272 .lock() 273 .set_active_configuration(config) 274 .map_err(Error::SetActiveConfig) 275 } 276 clear_feature(&mut self, value: u16, index: u16) -> Result<TransferStatus>277 fn clear_feature(&mut self, value: u16, index: u16) -> Result<TransferStatus> { 278 // It's a standard, clear_feature, endpoint request. 279 const STD_FEATURE_ENDPOINT_HALT: u16 = 0; 280 if value == STD_FEATURE_ENDPOINT_HALT { 281 self.device 282 .lock() 283 .clear_halt(index as u8) 284 .map_err(Error::ClearHalt)?; 285 } 286 Ok(TransferStatus::Completed) 287 } 288 create_endpoints(&mut self, config_descriptor: &ConfigDescriptorTree) -> Result<()>289 fn create_endpoints(&mut self, config_descriptor: &ConfigDescriptorTree) -> Result<()> { 290 let mut endpoints = Vec::new(); 291 let device_state = self.get_device_state(); 292 for i in &self.claimed_interfaces { 293 let alt_setting = self.alt_settings.get(i).unwrap_or(&0); 294 let interface = config_descriptor 295 .get_interface_descriptor(*i, *alt_setting) 296 .ok_or(Error::GetInterfaceDescriptor(*i, *alt_setting))?; 297 for ep_idx in 0..interface.bNumEndpoints { 298 let ep_dp = interface 299 .get_endpoint_descriptor(ep_idx) 300 .ok_or(Error::GetEndpointDescriptor(ep_idx))?; 301 let ep_num = ep_dp.get_endpoint_number(); 302 if ep_num == 0 { 303 continue; 304 } 305 let direction = ep_dp.get_direction(); 306 let ty = ep_dp.get_endpoint_type().ok_or(Error::GetEndpointType)?; 307 endpoints.push(UsbEndpoint::new( 308 device_state.read().unwrap().fail_handle.clone(), 309 device_state.read().unwrap().job_queue.clone(), 310 ep_num, 311 direction, 312 ty, 313 )); 314 } 315 } 316 device_state.write().unwrap().endpoints = endpoints; 317 Ok(()) 318 } 319 } 320 321 impl XhciBackendDevice for HostDevice { get_backend_type(&self) -> BackendType322 fn get_backend_type(&self) -> BackendType { 323 let d = match self.device.lock().get_device_descriptor() { 324 Ok(d) => d, 325 Err(_) => return BackendType::Usb2, 326 }; 327 328 // See definition of bcdUsb. 329 const USB3_MASK: u16 = 0x0300; 330 match d.bcdUSB & USB3_MASK { 331 USB3_MASK => BackendType::Usb3, 332 _ => BackendType::Usb2, 333 } 334 } 335 get_vid(&self) -> u16336 fn get_vid(&self) -> u16 { 337 match self.device.lock().get_device_descriptor() { 338 Ok(d) => d.idVendor, 339 Err(e) => { 340 error!("cannot get device descriptor: {:?}", e); 341 0 342 } 343 } 344 } 345 get_pid(&self) -> u16346 fn get_pid(&self) -> u16 { 347 match self.device.lock().get_device_descriptor() { 348 Ok(d) => d.idProduct, 349 Err(e) => { 350 error!("cannot get device descriptor: {:?}", e); 351 0 352 } 353 } 354 } 355 set_address(&mut self, _address: UsbDeviceAddress)356 fn set_address(&mut self, _address: UsbDeviceAddress) { 357 // It's a standard, set_address, device request. We do nothing here. As described in XHCI 358 // spec. See set address command ring trb. 359 debug!( 360 "usb set address control transfer is received with address: {}", 361 _address 362 ); 363 } 364 reset(&mut self) -> Result<()>365 fn reset(&mut self) -> Result<()> { 366 self.device.lock().reset().map_err(Error::Reset) 367 } 368 get_speed(&self) -> Option<DeviceSpeed>369 fn get_speed(&self) -> Option<DeviceSpeed> { 370 self.device.lock().get_speed().unwrap_or(None) 371 } 372 alloc_streams(&self, ep: u8, num_streams: u16) -> Result<()>373 fn alloc_streams(&self, ep: u8, num_streams: u16) -> Result<()> { 374 self.device 375 .lock() 376 .alloc_streams(ep, num_streams) 377 .map_err(Error::AllocStreams) 378 } 379 free_streams(&self, ep: u8) -> Result<()>380 fn free_streams(&self, ep: u8) -> Result<()> { 381 self.device 382 .lock() 383 .free_streams(ep) 384 .map_err(Error::FreeStreams) 385 } 386 stop(&mut self)387 fn stop(&mut self) { 388 // NOOP, nothing to do 389 } 390 } 391 392 impl BackendTransfer for Transfer { status(&self) -> TransferStatus393 fn status(&self) -> TransferStatus { 394 Transfer::status(self) 395 } 396 actual_length(&self) -> usize397 fn actual_length(&self) -> usize { 398 Transfer::actual_length(self) 399 } 400 buffer(&self) -> &TransferBuffer401 fn buffer(&self) -> &TransferBuffer { 402 &self.buffer 403 } 404 set_callback<C: 'static + Fn(BackendTransferType) + Send + Sync>(&mut self, cb: C)405 fn set_callback<C: 'static + Fn(BackendTransferType) + Send + Sync>(&mut self, cb: C) { 406 Transfer::set_callback(self, move |t| cb(BackendTransferType::HostDevice(t))); 407 } 408 } 409