Почему диск U не может быть адресован при отключении динамика USB от порта USB 3.0? - PullRequest
0 голосов
/ 20 марта 2020

Моя плата имеет порт usb3.0 и порт usb2.0. Ошибка произошла в порту usb3.0. Версия ядра Linux - 3.10.65.

Сценарий, из-за которого возникает ошибка:

  1. подключите USB-динамик к порту usb3.0.
  2. непрерывно воспроизводите звук в динамике USB.
  3. отключите динамик USB, не останавливайте воспроизведение звука при отключении.
  4. подключите диск usb3.0 к тому же порту usb3.0.
  5. тогда хост-контроллер USB не может обратиться к диску U.

Системный отчет о следующем журнале:

# 
# 
# 
# ./test.sh 
[   68.036091] usb 3-1: USB disconnect, device number 2
[   68.041659] cannot submit urb (err = -19)
[   78.860028] xhci-hcd xhci-hcd.0.auto: Timeout while waiting for address device command
[   84.070030] xhci-hcd xhci-hcd.0.auto: Timeout while waiting for address device command
[   84.280026] usb 4-1: device not accepting address 2, error -62
[   89.460027] xhci-hcd xhci-hcd.0.auto: Timeout while waiting for address device command
[   94.670025] xhci-hcd xhci-hcd.0.auto: Timeout while waiting for address device command
[   94.880020] usb 4-1: device not accepting address 3, error -62
[  100.060036] xhci-hcd xhci-hcd.0.auto: Timeout while waiting for address device command
[  105.270044] xhci-hcd xhci-hcd.0.auto: Timeout while waiting for address device command
[  105.480024] usb 4-1: device not accepting address 4, error -62
[  110.660024] xhci-hcd xhci-hcd.0.auto: Timeout while waiting for address device command
[  115.870026] xhci-hcd xhci-hcd.0.auto: Timeout while waiting for address device command
[  116.080020] usb 4-1: device not accepting address 5, error -62
[  116.086478] hub 4-0:1.0: unable to enumerate USB device on port 1

После долгой отладки я найти, если я добавлю отладочную информацию, ошибка никогда не произойдет. Но я не знаю почему.

void usb_set_device_state(struct usb_device *udev,
        enum usb_device_state new_state)
{
    unsigned long flags;
    int wakeup = -1;

    spin_lock_irqsave(&device_state_lock, flags);
    if (udev->state == USB_STATE_NOTATTACHED)
        ;   /* do nothing */
    else if (new_state != USB_STATE_NOTATTACHED) {

        /* root hub wakeup capabilities are managed out-of-band
         * and may involve silicon errata ... ignore them here.
         */
        if (udev->parent) {
            if (udev->state == USB_STATE_SUSPENDED
                    || new_state == USB_STATE_SUSPENDED)
                ;   /* No change to wakeup settings */
            else if (new_state == USB_STATE_CONFIGURED)
                wakeup = (udev->quirks &
                    USB_QUIRK_IGNORE_REMOTE_WAKEUP) ? 0 :
                    udev->actconfig->desc.bmAttributes &
                    USB_CONFIG_ATT_WAKEUP;
            else
                wakeup = 0;
        }
        if (udev->state == USB_STATE_SUSPENDED &&
            new_state != USB_STATE_SUSPENDED)
            udev->active_duration -= jiffies;
        else if (new_state == USB_STATE_SUSPENDED &&
                udev->state != USB_STATE_SUSPENDED)
            udev->active_duration += jiffies;
        udev->state = new_state;
    } else
        recursively_mark_NOTATTACHED(udev);

    if (new_state == USB_STATE_NOTATTACHED) {   
        printk("[%s %d] .\n", __func__, __LINE__);
        printk("[%s %d] .\n", __func__, __LINE__);
        printk("[%s %d] .\n", __func__, __LINE__);
    }
    spin_unlock_irqrestore(&device_state_lock, flags);
    if (wakeup >= 0)
        device_set_wakeup_capable(&udev->dev, wakeup);
}

enter code here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...