Re: "Set SEL for device-initiated U1 failed." errors

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

 



On Thu, Aug 29, 2013 at 10:06:16AM -0700, Greg Kroah-Hartman wrote:
> Hi Sarah,
> 
> I'm getting the following warnings from the 3.10.9 kernel all the time
> when I unplug a USB 3 storage device from my laptop:
> 	[203282.987687] usb 4-1: USB disconnect, device number 21
> 	[203282.992904] usb 4-1: Set SEL for device-initiated U1 failed.
> 	[203282.992909] usb 4-1: Set SEL for device-initiated U2 failed.
> 
> What can a "normal" user do with these "failed" messages?  If nothing,
> shouldn't we just turn them into debug messages instead?

Yes, those messages should probably be toned down to debug level instead
of warning level.  If a device doesn't respond to the Set SEL request
when USB 3.0 LPM is enabled, the user has a buggy device.  Of course, I
doubt anyone is going to return a drive based on those messages.

That error message happens because the USB core is attempting to disable
LPM for a disconnected device.  The control transfer to set SEL fails,
resulting in those messages.  The xHCI driver still needs to disable the
U1 and U2 timeouts for the port, so the core still needs to call into
usb_set_lpm_timeout.  However, we could skip the control transfer to the
device.

The problem is that the USB core doesn't mark the device as DISCONNECTED
until after it attempts to disable LPM.  The device is still marked as
being in the configured state, because we don't return early in this
function:

static int usb_set_device_initiated_lpm(struct usb_device *udev,
                enum usb3_link_state state, bool enable)
{
        int ret;
        int feature;

        switch (state) {
        case USB3_LPM_U1:
                feature = USB_DEVICE_U1_ENABLE;
                break;
        case USB3_LPM_U2:
                feature = USB_DEVICE_U2_ENABLE;
                break;
        default:
                dev_warn(&udev->dev, "%s: Can't %s non-U1 or U2 state.\n",
                                __func__, enable ? "enable" : "disable");
                return -EINVAL;
        }
        
        if (udev->state != USB_STATE_CONFIGURED) {
                dev_dbg(&udev->dev, "%s: Can't %s %s state "
                                "for unconfigured device.\n",
                                __func__, enable ? "enable" : "disable",
                                usb3_lpm_names[state]);
                return 0;
        }

        if (enable) {
                /*
                 * Now send the control transfer to enable device-initiated LPM
                 * for either U1 or U2.
                 */
                ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
                                USB_REQ_SET_FEATURE,
                                USB_RECIP_DEVICE,
                                feature,
                                0, NULL, 0,
                                USB_CTRL_SET_TIMEOUT);
        } else {
                ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
                                USB_REQ_CLEAR_FEATURE,
                                USB_RECIP_DEVICE,
                                feature,
                                0, NULL, 0,
                                USB_CTRL_SET_TIMEOUT);
        }
        if (ret < 0) {
                dev_warn(&udev->dev, "%s of device-initiated %s failed.\n",
                                enable ? "Enable" : "Disable",
                                usb3_lpm_names[state]);
                return -EBUSY;
        }
        return 0;
}

So I don't know how the LPM code can know the device is disconnected, and thus
it should skip the control transfer.  Do we get an -ENODEV in that case?

The least we could do is change that dev_warn to dev_dbg instead.

> Or is this an indication of another problem somewhere else?
> 
> This doesn't happen when unplugging a USB 2 device from the same port.

Set SEL is a USB 3.0 specific transfer, and is only used for devices
that support USB 3.0 Link PM (and don't have the U1/U2 device exit
latencies set to all zeros).

Sarah Sharp
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux