Skip to contentSkip to conversation

failing to force-claim USB interface

DISCUSSION David Brownell 1 participant 1 message Jan 19, 2004

lore
Share & tools
lore
#0 lore raw
Quoted 2 lines

I am trying to make use of the usbfs USBDEVFS_DISCONNECT ioctl, and I am failing.

Appended, see a snippet of code which worked reliably way back on the original 2.4 patch. Maybe you tripped on the precondition? Or maybe this is just broken so far in 2.6.

A fair amount of usbfs code is at least slightly broken in 2.6; some usbcore driver model changes are still needed in the area of this particular ioctl. (Which got mangled more than most during its evolution.) Was this with a 2.6.1 kernel?

I'm thinking this kind of thing ought to be generically doable with sysfs, maybe with symlink/unlink syscalls between device and driver nodes.

- Dave

    if (ioctl (fd, USBDEVFS_CLAIMINTERFACE, &ifno) < 0) {
#ifdef  USBDEVFS_DISCONNECT
        int                             saved_errno = errno;
        struct usbdevfs_ioctl           command;
        int                             retval;

        /*
         * maybe we need to boot a kernel driver off before we
         * can bind to this.  a "polite" unbind might be nice;
         * for now we expect apps to adopt a reasonble policy,
         * checking if it's claimed already (when it matters).
         */
        if (saved_errno != EBUSY)
            return -errno;
        command.ifno = ifno;
        command.ioctl_code = USBDEVFS_DISCONNECT;
        command.data = 0;
        retval = ioctl (fd, USBDEVFS_IOCTL, &command);
        if (retval < 0)
            return -saved_errno;

        if (ioctl (fd, USBDEVFS_CLAIMINTERFACE, &ifno) < 0)
            return -errno;
#else
        return -errno;
#endif
    }
    return 0;