diff --git a/src/platform/linux_usbfs/device.rs b/src/platform/linux_usbfs/device.rs index 36a33b1..726e469 100644 --- a/src/platform/linux_usbfs/device.rs +++ b/src/platform/linux_usbfs/device.rs @@ -238,7 +238,8 @@ impl LinuxDevice { self: &Arc, interface: u8, ) -> Result, Error> { - usbfs::detach_and_claim_interface(&self.fd, interface)?; + usbfs::detach_kernel_driver(&self.fd, interface)?; + usbfs::claim_interface(&self.fd, interface)?; debug!( "Claimed interface {interface} on device id {dev}", dev = self.events_id diff --git a/src/platform/linux_usbfs/usbfs.rs b/src/platform/linux_usbfs/usbfs.rs index eb7b515..b854dfc 100644 --- a/src/platform/linux_usbfs/usbfs.rs +++ b/src/platform/linux_usbfs/usbfs.rs @@ -31,35 +31,17 @@ pub fn claim_interface(fd: Fd, interface: u8) -> io::Result<()> { } } -#[repr(C)] -struct DetachAndClaimIface { - interface: c_uint, - flags: c_uint, - - // Note: USBDEVFS_MAXDRIVERNAME is 255, but we only use 5 bytes for the driver name. Using 5 - // here simplifies the implementation. - driver: [c_uchar; 5 + 1], -} - -pub fn detach_and_claim_interface(fd: Fd, interface: u8) -> io::Result<()> { - const USBDEVFS_DISCONNECT_CLAIM_EXCEPT_DRIVER: c_uint = 0x02; +pub fn release_interface(fd: Fd, interface: u8) -> io::Result<()> { unsafe { - let ctl = ioctl::Setter::< - ioctl::ReadOpcode, - DetachAndClaimIface, - >::new(DetachAndClaimIface { - interface: interface.into(), - flags: USBDEVFS_DISCONNECT_CLAIM_EXCEPT_DRIVER, - driver: *b"usbfs\0", - }); + let ctl = + ioctl::Setter::, c_uint>::new(interface.into()); ioctl::ioctl(fd, ctl) } } -pub fn release_interface(fd: Fd, interface: u8) -> io::Result<()> { +pub fn detach_kernel_driver(fd: Fd, interface: u8) -> io::Result<()> { unsafe { - let ctl = - ioctl::Setter::, c_uint>::new(interface.into()); + let ctl = ioctl::NoArg::, ()>::new(); ioctl::ioctl(fd, ctl) } }