tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Reboot resistant USB bug



In article <20181016122719.GI16483%homeworld.netbsd.org@localhost>,
Emmanuel Dreyfus  <manu%netbsd.org@localhost> wrote:
>On Thu, Oct 11, 2018 at 02:11:22PM +0000, Emmanuel Dreyfus wrote:
>> On both netbsd-8 and -current, I have a problem with USB devices that
>> get stuck in a non-functionning state even after a reboot.
>
>I investigated a lot: in my example, the pn533 chip seems to corrupts
>its USB config, interface and endpoint descriptors. They contain 
>garbage, and on reboot the kernel cannot figure enough  about the 
>device, and disable the USB port.
>
>But if I detect the condition in usbd_get_desc() and inject
>fake descriptors (see below), the device is correctly attached
>on reboot, and it works again. Is it an acceptable workaround?
>
>usbd_status
>usbd_get_desc(struct usbd_device *dev, int type, int index, int len, void *desc)
>{
>        usb_device_request_t req;
>        usbd_status err;
>
>        USBHIST_FUNC(); USBHIST_CALLED(usbdebug);
>
>        DPRINTFN(3,"type=%jd, index=%jd, len=%jd", type, index, len, 0);
>
>        req.bmRequestType = UT_READ_DEVICE;
>        req.bRequest = UR_GET_DESCRIPTOR;
>        USETW2(req.wValue, type, index);
>        USETW(req.wIndex, 0);
>        USETW(req.wLength, len);
>        err = usbd_do_request(dev, &req, desc);
>
>        /*
>         * Attempt to fake the descriptor if it fails sanity check
>         */
>        if (err == USBD_NORMAL_COMPLETION) {
>                usb_descriptor_t *d = desc;
>
>                if (d->bDescriptorType != type || d->bLength > len)
>                        err = usbd_get_desc_fake(dev, type, index, len, desc);
>        }
>
>        return err;
>}

Isn't there a way to reset it?

christos



Home | Main Index | Thread Index | Old Index