|
@@ -142,31 +142,19 @@ static int tweak_set_interface_cmd(struct urb *urb)
|
|
|
|
|
|
static int tweak_set_configuration_cmd(struct urb *urb)
|
|
static int tweak_set_configuration_cmd(struct urb *urb)
|
|
{
|
|
{
|
|
|
|
+ struct stub_priv *priv = (struct stub_priv *) urb->context;
|
|
|
|
+ struct stub_device *sdev = priv->sdev;
|
|
struct usb_ctrlrequest *req;
|
|
struct usb_ctrlrequest *req;
|
|
__u16 config;
|
|
__u16 config;
|
|
|
|
+ int err;
|
|
|
|
|
|
req = (struct usb_ctrlrequest *) urb->setup_packet;
|
|
req = (struct usb_ctrlrequest *) urb->setup_packet;
|
|
config = le16_to_cpu(req->wValue);
|
|
config = le16_to_cpu(req->wValue);
|
|
|
|
|
|
- /*
|
|
|
|
- * I have never seen a multi-config device. Very rare.
|
|
|
|
- * For most devices, this will be called to choose a default
|
|
|
|
- * configuration only once in an initialization phase.
|
|
|
|
- *
|
|
|
|
- * set_configuration may change a device configuration and its device
|
|
|
|
- * drivers will be unbound and assigned for a new device configuration.
|
|
|
|
- * This means this usbip driver will be also unbound when called, then
|
|
|
|
- * eventually reassigned to the device as far as driver matching
|
|
|
|
- * condition is kept.
|
|
|
|
- *
|
|
|
|
- * Unfortunately, an existing usbip connection will be dropped
|
|
|
|
- * due to this driver unbinding. So, skip here.
|
|
|
|
- * A user may need to set a special configuration value before
|
|
|
|
- * exporting the device.
|
|
|
|
- */
|
|
|
|
- dev_info(&urb->dev->dev, "usb_set_configuration %d to %s... skip!\n",
|
|
|
|
- config, dev_name(&urb->dev->dev));
|
|
|
|
-
|
|
|
|
|
|
+ err = usb_set_configuration(sdev->udev, config);
|
|
|
|
+ if (err && err != -ENODEV)
|
|
|
|
+ dev_err(&sdev->udev->dev, "can't set config #%d, error %d\n",
|
|
|
|
+ config, err);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|