diff mbox

USB: change interface to usb_lock_device_for_reset()

Message ID 20090108235304.46ac523b@pedra.chehab.org (mailing list archive)
State RFC
Headers show

Commit Message

Mauro Carvalho Chehab Jan. 9, 2009, 1:53 a.m. UTC
Hi Mike,

There were an upstream change usb_lock_device_for_reset() that touched on
pvrusb2 driver. I didn't backport it yet, since I'm not sure if the change is
ok. Could you please check?

Thanks,
Mauro.

commit 011b15df465745474e3ec85482633685933ed5a7
Author: Alan Stern <stern@rowland.harvard.edu>
Date:   Tue Nov 4 11:29:27 2008 -0500

    USB: change interface to usb_lock_device_for_reset()
    
    This patch (as1161) changes the interface to
    usb_lock_device_for_reset().  The existing interface is apparently not
    very clear, judging from the fact that several of its callers don't
    use it correctly.  The new interface always returns 0 for success and
    it always requires the caller to unlock the device afterward.
    
    The new routine will not return immediately if it is called while the
    driver's probe method is running.  Instead it will wait until the
    probe is over and the device has been unlocked.  This shouldn't cause
    any problems; I don't know of any cases where drivers call
    usb_lock_device_for_reset() during probe.
    
    Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
    Cc: Pete Zaitcev <zaitcev@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

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

Comments

Mike Isely Jan. 9, 2009, 4:26 a.m. UTC | #1
On Thu, 8 Jan 2009, Mauro Carvalho Chehab wrote:

> Hi Mike,
> 
> There were an upstream change usb_lock_device_for_reset() that touched on
> pvrusb2 driver. I didn't backport it yet, since I'm not sure if the change is
> ok. Could you please check?
> 
> Thanks,
> Mauro.

Yes, the pvrusb2 part of this change looks fine (just change the 
treatment of the return code).

Acked-By: Mike Isely <isely@pobox.com>

I expect this weekend to be working through a backlog of pvrusb2 issues 
so you might hear more from me soon :-)

  -Mike


> 
> commit 011b15df465745474e3ec85482633685933ed5a7
> Author: Alan Stern <stern@rowland.harvard.edu>
> Date:   Tue Nov 4 11:29:27 2008 -0500
> 
>     USB: change interface to usb_lock_device_for_reset()
>     
>     This patch (as1161) changes the interface to
>     usb_lock_device_for_reset().  The existing interface is apparently not
>     very clear, judging from the fact that several of its callers don't
>     use it correctly.  The new interface always returns 0 for success and
>     it always requires the caller to unlock the device afterward.
>     
>     The new routine will not return immediately if it is called while the
>     driver's probe method is running.  Instead it will wait until the
>     probe is over and the device has been unlocked.  This shouldn't cause
>     any problems; I don't know of any cases where drivers call
>     usb_lock_device_for_reset() during probe.
>     
>     Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
>     Cc: Pete Zaitcev <zaitcev@redhat.com>
>     Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
> 
> diff --git a/drivers/block/ub.c b/drivers/block/ub.c
> index 048d71d..12fb816 100644
> --- a/drivers/block/ub.c
> +++ b/drivers/block/ub.c
> @@ -1579,7 +1579,7 @@ static void ub_reset_task(struct work_struct *work)
>  	struct ub_dev *sc = container_of(work, struct ub_dev, reset_work);
>  	unsigned long flags;
>  	struct ub_lun *lun;
> -	int lkr, rc;
> +	int rc;
>  
>  	if (!sc->reset) {
>  		printk(KERN_WARNING "%s: Running reset unrequested\n",
> @@ -1597,10 +1597,11 @@ static void ub_reset_task(struct work_struct *work)
>  	} else if (sc->dev->actconfig->desc.bNumInterfaces != 1) {
>  		;
>  	} else {
> -		if ((lkr = usb_lock_device_for_reset(sc->dev, sc->intf)) < 0) {
> +		rc = usb_lock_device_for_reset(sc->dev, sc->intf);
> +		if (rc < 0) {
>  			printk(KERN_NOTICE
>  			    "%s: usb_lock_device_for_reset failed (%d)\n",
> -			    sc->name, lkr);
> +			    sc->name, rc);
>  		} else {
>  			rc = usb_reset_device(sc->dev);
>  			if (rc < 0) {
> @@ -1608,9 +1609,7 @@ static void ub_reset_task(struct work_struct *work)
>  				    "usb_lock_device_for_reset failed (%d)\n",
>  				    sc->name, rc);
>  			}
> -
> -			if (lkr)
> -				usb_unlock_device(sc->dev);
> +			usb_unlock_device(sc->dev);
>  		}
>  	}
>  
> diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
> index 03cb494..f0a0f72 100644
> --- a/drivers/hid/usbhid/hid-core.c
> +++ b/drivers/hid/usbhid/hid-core.c
> @@ -102,7 +102,7 @@ static void hid_reset(struct work_struct *work)
>  	struct usbhid_device *usbhid =
>  		container_of(work, struct usbhid_device, reset_work);
>  	struct hid_device *hid = usbhid->hid;
> -	int rc_lock, rc = 0;
> +	int rc = 0;
>  
>  	if (test_bit(HID_CLEAR_HALT, &usbhid->iofl)) {
>  		dev_dbg(&usbhid->intf->dev, "clear halt\n");
> @@ -113,11 +113,10 @@ static void hid_reset(struct work_struct *work)
>  
>  	else if (test_bit(HID_RESET_PENDING, &usbhid->iofl)) {
>  		dev_dbg(&usbhid->intf->dev, "resetting device\n");
> -		rc = rc_lock = usb_lock_device_for_reset(hid_to_usb_dev(hid), usbhid->intf);
> -		if (rc_lock >= 0) {
> +		rc = usb_lock_device_for_reset(hid_to_usb_dev(hid), usbhid->intf);
> +		if (rc == 0) {
>  			rc = usb_reset_device(hid_to_usb_dev(hid));
> -			if (rc_lock)
> -				usb_unlock_device(hid_to_usb_dev(hid));
> +			usb_unlock_device(hid_to_usb_dev(hid));
>  		}
>  		clear_bit(HID_RESET_PENDING, &usbhid->iofl);
>  	}
> diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw.c b/drivers/media/video/pvrusb2/pvrusb2-hdw.c
> index 8fb92ac..fa304e5 100644
> --- a/drivers/media/video/pvrusb2/pvrusb2-hdw.c
> +++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.c
> @@ -3655,7 +3655,7 @@ void pvr2_hdw_device_reset(struct pvr2_hdw *hdw)
>  	int ret;
>  	pvr2_trace(PVR2_TRACE_INIT,"Performing a device reset...");
>  	ret = usb_lock_device_for_reset(hdw->usb_dev,NULL);
> -	if (ret == 1) {
> +	if (ret == 0) {
>  		ret = usb_reset_device(hdw->usb_dev);
>  		usb_unlock_device(hdw->usb_dev);
>  	} else {
> diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
> index 399e15f..400fa4c 100644
> --- a/drivers/usb/core/usb.c
> +++ b/drivers/usb/core/usb.c
> @@ -513,10 +513,7 @@ EXPORT_SYMBOL_GPL(usb_put_intf);
>   * disconnect; in some drivers (such as usb-storage) the disconnect()
>   * or suspend() method will block waiting for a device reset to complete.
>   *
> - * Returns a negative error code for failure, otherwise 1 or 0 to indicate
> - * that the device will or will not have to be unlocked.  (0 can be
> - * returned when an interface is given and is BINDING, because in that
> - * case the driver already owns the device lock.)
> + * Returns a negative error code for failure, otherwise 0.
>   */
>  int usb_lock_device_for_reset(struct usb_device *udev,
>  			      const struct usb_interface *iface)
> @@ -527,16 +524,9 @@ int usb_lock_device_for_reset(struct usb_device *udev,
>  		return -ENODEV;
>  	if (udev->state == USB_STATE_SUSPENDED)
>  		return -EHOSTUNREACH;
> -	if (iface) {
> -		switch (iface->condition) {
> -		case USB_INTERFACE_BINDING:
> -			return 0;
> -		case USB_INTERFACE_BOUND:
> -			break;
> -		default:
> -			return -EINTR;
> -		}
> -	}
> +	if (iface && (iface->condition == USB_INTERFACE_UNBINDING ||
> +			iface->condition == USB_INTERFACE_UNBOUND))
> +		return -EINTR;
>  
>  	while (usb_trylock_device(udev) != 0) {
>  
> @@ -550,10 +540,11 @@ int usb_lock_device_for_reset(struct usb_device *udev,
>  			return -ENODEV;
>  		if (udev->state == USB_STATE_SUSPENDED)
>  			return -EHOSTUNREACH;
> -		if (iface && iface->condition != USB_INTERFACE_BOUND)
> +		if (iface && (iface->condition == USB_INTERFACE_UNBINDING ||
> +				iface->condition == USB_INTERFACE_UNBOUND))
>  			return -EINTR;
>  	}
> -	return 1;
> +	return 0;
>  }
>  EXPORT_SYMBOL_GPL(usb_lock_device_for_reset);
>  
> diff --git a/drivers/usb/image/microtek.c b/drivers/usb/image/microtek.c
> index 885867a..4541dfc 100644
> --- a/drivers/usb/image/microtek.c
> +++ b/drivers/usb/image/microtek.c
> @@ -350,17 +350,16 @@ static int mts_scsi_abort(struct scsi_cmnd *srb)
>  static int mts_scsi_host_reset(struct scsi_cmnd *srb)
>  {
>  	struct mts_desc* desc = (struct mts_desc*)(srb->device->host->hostdata[0]);
> -	int result, rc;
> +	int result;
>  
>  	MTS_DEBUG_GOT_HERE();
>  	mts_debug_dump(desc);
>  
> -	rc = usb_lock_device_for_reset(desc->usb_dev, desc->usb_intf);
> -	if (rc < 0)
> -		return FAILED;
> -	result = usb_reset_device(desc->usb_dev);
> -	if (rc)
> +	result = usb_lock_device_for_reset(desc->usb_dev, desc->usb_intf);
> +	if (result == 0) {
> +		result = usb_reset_device(desc->usb_dev);
>  		usb_unlock_device(desc->usb_dev);
> +	}
>  	return result ? FAILED : SUCCESS;
>  }
>  
> diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c
> index 79108d5..2058db4 100644
> --- a/drivers/usb/storage/transport.c
> +++ b/drivers/usb/storage/transport.c
> @@ -1173,10 +1173,9 @@ int usb_stor_Bulk_reset(struct us_data *us)
>   */
>  int usb_stor_port_reset(struct us_data *us)
>  {
> -	int result, rc_lock;
> +	int result;
>  
> -	result = rc_lock =
> -		usb_lock_device_for_reset(us->pusb_dev, us->pusb_intf);
> +	result = usb_lock_device_for_reset(us->pusb_dev, us->pusb_intf);
>  	if (result < 0)
>  		US_DEBUGP("unable to lock device for reset: %d\n", result);
>  	else {
> @@ -1189,8 +1188,7 @@ int usb_stor_port_reset(struct us_data *us)
>  			US_DEBUGP("usb_reset_device returns %d\n",
>  					result);
>  		}
> -		if (rc_lock)
> -			usb_unlock_device(us->pusb_dev);
> +		usb_unlock_device(us->pusb_dev);
>  	}
>  	return result;
>  }
>
Mike Isely Jan. 9, 2009, 4:28 a.m. UTC | #2
On Thu, 8 Jan 2009, Mike Isely wrote:

> 
> 
> On Thu, 8 Jan 2009, Mauro Carvalho Chehab wrote:
> 
> > Hi Mike,
> > 
> > There were an upstream change usb_lock_device_for_reset() that touched on
> > pvrusb2 driver. I didn't backport it yet, since I'm not sure if the change is
> > ok. Could you please check?
> > 
> > Thanks,
> > Mauro.
> 
> Yes, the pvrusb2 part of this change looks fine (just change the 
> treatment of the return code).

Before I cause any confusion, the above sentence has a critical typo.  
I was just pointing out that the pvrusb2 change in the patch below only 
adjusts the treatment of the return code, which makes perfect sense 
given the upstream change.  I wasn't asking you to change anything :-)  
The change is fine.

  -Mike

> 
> Acked-By: Mike Isely <isely@pobox.com>
> 
> I expect this weekend to be working through a backlog of pvrusb2 issues 
> so you might hear more from me soon :-)
> 
>   -Mike
> 
> 
> > 
> > commit 011b15df465745474e3ec85482633685933ed5a7
> > Author: Alan Stern <stern@rowland.harvard.edu>
> > Date:   Tue Nov 4 11:29:27 2008 -0500
> > 
> >     USB: change interface to usb_lock_device_for_reset()
> >     
> >     This patch (as1161) changes the interface to
> >     usb_lock_device_for_reset().  The existing interface is apparently not
> >     very clear, judging from the fact that several of its callers don't
> >     use it correctly.  The new interface always returns 0 for success and
> >     it always requires the caller to unlock the device afterward.
> >     
> >     The new routine will not return immediately if it is called while the
> >     driver's probe method is running.  Instead it will wait until the
> >     probe is over and the device has been unlocked.  This shouldn't cause
> >     any problems; I don't know of any cases where drivers call
> >     usb_lock_device_for_reset() during probe.
> >     
> >     Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
> >     Cc: Pete Zaitcev <zaitcev@redhat.com>
> >     Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
> > 
> > diff --git a/drivers/block/ub.c b/drivers/block/ub.c
> > index 048d71d..12fb816 100644
> > --- a/drivers/block/ub.c
> > +++ b/drivers/block/ub.c
> > @@ -1579,7 +1579,7 @@ static void ub_reset_task(struct work_struct *work)
> >  	struct ub_dev *sc = container_of(work, struct ub_dev, reset_work);
> >  	unsigned long flags;
> >  	struct ub_lun *lun;
> > -	int lkr, rc;
> > +	int rc;
> >  
> >  	if (!sc->reset) {
> >  		printk(KERN_WARNING "%s: Running reset unrequested\n",
> > @@ -1597,10 +1597,11 @@ static void ub_reset_task(struct work_struct *work)
> >  	} else if (sc->dev->actconfig->desc.bNumInterfaces != 1) {
> >  		;
> >  	} else {
> > -		if ((lkr = usb_lock_device_for_reset(sc->dev, sc->intf)) < 0) {
> > +		rc = usb_lock_device_for_reset(sc->dev, sc->intf);
> > +		if (rc < 0) {
> >  			printk(KERN_NOTICE
> >  			    "%s: usb_lock_device_for_reset failed (%d)\n",
> > -			    sc->name, lkr);
> > +			    sc->name, rc);
> >  		} else {
> >  			rc = usb_reset_device(sc->dev);
> >  			if (rc < 0) {
> > @@ -1608,9 +1609,7 @@ static void ub_reset_task(struct work_struct *work)
> >  				    "usb_lock_device_for_reset failed (%d)\n",
> >  				    sc->name, rc);
> >  			}
> > -
> > -			if (lkr)
> > -				usb_unlock_device(sc->dev);
> > +			usb_unlock_device(sc->dev);
> >  		}
> >  	}
> >  
> > diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
> > index 03cb494..f0a0f72 100644
> > --- a/drivers/hid/usbhid/hid-core.c
> > +++ b/drivers/hid/usbhid/hid-core.c
> > @@ -102,7 +102,7 @@ static void hid_reset(struct work_struct *work)
> >  	struct usbhid_device *usbhid =
> >  		container_of(work, struct usbhid_device, reset_work);
> >  	struct hid_device *hid = usbhid->hid;
> > -	int rc_lock, rc = 0;
> > +	int rc = 0;
> >  
> >  	if (test_bit(HID_CLEAR_HALT, &usbhid->iofl)) {
> >  		dev_dbg(&usbhid->intf->dev, "clear halt\n");
> > @@ -113,11 +113,10 @@ static void hid_reset(struct work_struct *work)
> >  
> >  	else if (test_bit(HID_RESET_PENDING, &usbhid->iofl)) {
> >  		dev_dbg(&usbhid->intf->dev, "resetting device\n");
> > -		rc = rc_lock = usb_lock_device_for_reset(hid_to_usb_dev(hid), usbhid->intf);
> > -		if (rc_lock >= 0) {
> > +		rc = usb_lock_device_for_reset(hid_to_usb_dev(hid), usbhid->intf);
> > +		if (rc == 0) {
> >  			rc = usb_reset_device(hid_to_usb_dev(hid));
> > -			if (rc_lock)
> > -				usb_unlock_device(hid_to_usb_dev(hid));
> > +			usb_unlock_device(hid_to_usb_dev(hid));
> >  		}
> >  		clear_bit(HID_RESET_PENDING, &usbhid->iofl);
> >  	}
> > diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw.c b/drivers/media/video/pvrusb2/pvrusb2-hdw.c
> > index 8fb92ac..fa304e5 100644
> > --- a/drivers/media/video/pvrusb2/pvrusb2-hdw.c
> > +++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.c
> > @@ -3655,7 +3655,7 @@ void pvr2_hdw_device_reset(struct pvr2_hdw *hdw)
> >  	int ret;
> >  	pvr2_trace(PVR2_TRACE_INIT,"Performing a device reset...");
> >  	ret = usb_lock_device_for_reset(hdw->usb_dev,NULL);
> > -	if (ret == 1) {
> > +	if (ret == 0) {
> >  		ret = usb_reset_device(hdw->usb_dev);
> >  		usb_unlock_device(hdw->usb_dev);
> >  	} else {
> > diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
> > index 399e15f..400fa4c 100644
> > --- a/drivers/usb/core/usb.c
> > +++ b/drivers/usb/core/usb.c
> > @@ -513,10 +513,7 @@ EXPORT_SYMBOL_GPL(usb_put_intf);
> >   * disconnect; in some drivers (such as usb-storage) the disconnect()
> >   * or suspend() method will block waiting for a device reset to complete.
> >   *
> > - * Returns a negative error code for failure, otherwise 1 or 0 to indicate
> > - * that the device will or will not have to be unlocked.  (0 can be
> > - * returned when an interface is given and is BINDING, because in that
> > - * case the driver already owns the device lock.)
> > + * Returns a negative error code for failure, otherwise 0.
> >   */
> >  int usb_lock_device_for_reset(struct usb_device *udev,
> >  			      const struct usb_interface *iface)
> > @@ -527,16 +524,9 @@ int usb_lock_device_for_reset(struct usb_device *udev,
> >  		return -ENODEV;
> >  	if (udev->state == USB_STATE_SUSPENDED)
> >  		return -EHOSTUNREACH;
> > -	if (iface) {
> > -		switch (iface->condition) {
> > -		case USB_INTERFACE_BINDING:
> > -			return 0;
> > -		case USB_INTERFACE_BOUND:
> > -			break;
> > -		default:
> > -			return -EINTR;
> > -		}
> > -	}
> > +	if (iface && (iface->condition == USB_INTERFACE_UNBINDING ||
> > +			iface->condition == USB_INTERFACE_UNBOUND))
> > +		return -EINTR;
> >  
> >  	while (usb_trylock_device(udev) != 0) {
> >  
> > @@ -550,10 +540,11 @@ int usb_lock_device_for_reset(struct usb_device *udev,
> >  			return -ENODEV;
> >  		if (udev->state == USB_STATE_SUSPENDED)
> >  			return -EHOSTUNREACH;
> > -		if (iface && iface->condition != USB_INTERFACE_BOUND)
> > +		if (iface && (iface->condition == USB_INTERFACE_UNBINDING ||
> > +				iface->condition == USB_INTERFACE_UNBOUND))
> >  			return -EINTR;
> >  	}
> > -	return 1;
> > +	return 0;
> >  }
> >  EXPORT_SYMBOL_GPL(usb_lock_device_for_reset);
> >  
> > diff --git a/drivers/usb/image/microtek.c b/drivers/usb/image/microtek.c
> > index 885867a..4541dfc 100644
> > --- a/drivers/usb/image/microtek.c
> > +++ b/drivers/usb/image/microtek.c
> > @@ -350,17 +350,16 @@ static int mts_scsi_abort(struct scsi_cmnd *srb)
> >  static int mts_scsi_host_reset(struct scsi_cmnd *srb)
> >  {
> >  	struct mts_desc* desc = (struct mts_desc*)(srb->device->host->hostdata[0]);
> > -	int result, rc;
> > +	int result;
> >  
> >  	MTS_DEBUG_GOT_HERE();
> >  	mts_debug_dump(desc);
> >  
> > -	rc = usb_lock_device_for_reset(desc->usb_dev, desc->usb_intf);
> > -	if (rc < 0)
> > -		return FAILED;
> > -	result = usb_reset_device(desc->usb_dev);
> > -	if (rc)
> > +	result = usb_lock_device_for_reset(desc->usb_dev, desc->usb_intf);
> > +	if (result == 0) {
> > +		result = usb_reset_device(desc->usb_dev);
> >  		usb_unlock_device(desc->usb_dev);
> > +	}
> >  	return result ? FAILED : SUCCESS;
> >  }
> >  
> > diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c
> > index 79108d5..2058db4 100644
> > --- a/drivers/usb/storage/transport.c
> > +++ b/drivers/usb/storage/transport.c
> > @@ -1173,10 +1173,9 @@ int usb_stor_Bulk_reset(struct us_data *us)
> >   */
> >  int usb_stor_port_reset(struct us_data *us)
> >  {
> > -	int result, rc_lock;
> > +	int result;
> >  
> > -	result = rc_lock =
> > -		usb_lock_device_for_reset(us->pusb_dev, us->pusb_intf);
> > +	result = usb_lock_device_for_reset(us->pusb_dev, us->pusb_intf);
> >  	if (result < 0)
> >  		US_DEBUGP("unable to lock device for reset: %d\n", result);
> >  	else {
> > @@ -1189,8 +1188,7 @@ int usb_stor_port_reset(struct us_data *us)
> >  			US_DEBUGP("usb_reset_device returns %d\n",
> >  					result);
> >  		}
> > -		if (rc_lock)
> > -			usb_unlock_device(us->pusb_dev);
> > +		usb_unlock_device(us->pusb_dev);
> >  	}
> >  	return result;
> >  }
> > 
> 
>
Mauro Carvalho Chehab Jan. 9, 2009, 4:38 a.m. UTC | #3
On Thu, 8 Jan 2009 22:28:18 -0600 (CST)
Mike Isely <isely@isely.net> wrote:

> On Thu, 8 Jan 2009, Mike Isely wrote:
> 
> > 
> > 
> > On Thu, 8 Jan 2009, Mauro Carvalho Chehab wrote:
> > 
> > > Hi Mike,
> > > 
> > > There were an upstream change usb_lock_device_for_reset() that touched on
> > > pvrusb2 driver. I didn't backport it yet, since I'm not sure if the change is
> > > ok. Could you please check?
> > > 
> > > Thanks,
> > > Mauro.
> > 
> > Yes, the pvrusb2 part of this change looks fine (just change the 
> > treatment of the return code).
> 
> Before I cause any confusion, the above sentence has a critical typo.  
> I was just pointing out that the pvrusb2 change in the patch below only 
> adjusts the treatment of the return code, which makes perfect sense 
> given the upstream change.  I wasn't asking you to change anything :-)  
> The change is fine.

Ok. The backport of this patch would be something interesting...

It will be something like this:

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29)
	if (ret == 0)
#else
	if (ret == 1)
#endif


Cheers,
Mauro
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Mike Isely Jan. 9, 2009, 4:42 a.m. UTC | #4
On Fri, 9 Jan 2009, Mauro Carvalho Chehab wrote:

> On Thu, 8 Jan 2009 22:28:18 -0600 (CST)
> Mike Isely <isely@isely.net> wrote:
> 
> > On Thu, 8 Jan 2009, Mike Isely wrote:
> > 
> > > 
> > > 
> > > On Thu, 8 Jan 2009, Mauro Carvalho Chehab wrote:
> > > 
> > > > Hi Mike,
> > > > 
> > > > There were an upstream change usb_lock_device_for_reset() that touched on
> > > > pvrusb2 driver. I didn't backport it yet, since I'm not sure if the change is
> > > > ok. Could you please check?
> > > > 
> > > > Thanks,
> > > > Mauro.
> > > 
> > > Yes, the pvrusb2 part of this change looks fine (just change the 
> > > treatment of the return code).
> > 
> > Before I cause any confusion, the above sentence has a critical typo.  
> > I was just pointing out that the pvrusb2 change in the patch below only 
> > adjusts the treatment of the return code, which makes perfect sense 
> > given the upstream change.  I wasn't asking you to change anything :-)  
> > The change is fine.
> 
> Ok. The backport of this patch would be something interesting...
> 
> It will be something like this:
> 
> #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29)
> 	if (ret == 0)
> #else
> 	if (ret == 1)
> #endif
> 

Yeah, I know.  It's part of the fun of staying in sync with multiple 
kernels and their ever-changing internal interfaces.  I have to support 
this in the standalone pvrusb2 driver too.  One more task this 
weekend...

  -Mike
diff mbox

Patch

diff --git a/drivers/block/ub.c b/drivers/block/ub.c
index 048d71d..12fb816 100644
--- a/drivers/block/ub.c
+++ b/drivers/block/ub.c
@@ -1579,7 +1579,7 @@  static void ub_reset_task(struct work_struct *work)
 	struct ub_dev *sc = container_of(work, struct ub_dev, reset_work);
 	unsigned long flags;
 	struct ub_lun *lun;
-	int lkr, rc;
+	int rc;
 
 	if (!sc->reset) {
 		printk(KERN_WARNING "%s: Running reset unrequested\n",
@@ -1597,10 +1597,11 @@  static void ub_reset_task(struct work_struct *work)
 	} else if (sc->dev->actconfig->desc.bNumInterfaces != 1) {
 		;
 	} else {
-		if ((lkr = usb_lock_device_for_reset(sc->dev, sc->intf)) < 0) {
+		rc = usb_lock_device_for_reset(sc->dev, sc->intf);
+		if (rc < 0) {
 			printk(KERN_NOTICE
 			    "%s: usb_lock_device_for_reset failed (%d)\n",
-			    sc->name, lkr);
+			    sc->name, rc);
 		} else {
 			rc = usb_reset_device(sc->dev);
 			if (rc < 0) {
@@ -1608,9 +1609,7 @@  static void ub_reset_task(struct work_struct *work)
 				    "usb_lock_device_for_reset failed (%d)\n",
 				    sc->name, rc);
 			}
-
-			if (lkr)
-				usb_unlock_device(sc->dev);
+			usb_unlock_device(sc->dev);
 		}
 	}
 
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
index 03cb494..f0a0f72 100644
--- a/drivers/hid/usbhid/hid-core.c
+++ b/drivers/hid/usbhid/hid-core.c
@@ -102,7 +102,7 @@  static void hid_reset(struct work_struct *work)
 	struct usbhid_device *usbhid =
 		container_of(work, struct usbhid_device, reset_work);
 	struct hid_device *hid = usbhid->hid;
-	int rc_lock, rc = 0;
+	int rc = 0;
 
 	if (test_bit(HID_CLEAR_HALT, &usbhid->iofl)) {
 		dev_dbg(&usbhid->intf->dev, "clear halt\n");
@@ -113,11 +113,10 @@  static void hid_reset(struct work_struct *work)
 
 	else if (test_bit(HID_RESET_PENDING, &usbhid->iofl)) {
 		dev_dbg(&usbhid->intf->dev, "resetting device\n");
-		rc = rc_lock = usb_lock_device_for_reset(hid_to_usb_dev(hid), usbhid->intf);
-		if (rc_lock >= 0) {
+		rc = usb_lock_device_for_reset(hid_to_usb_dev(hid), usbhid->intf);
+		if (rc == 0) {
 			rc = usb_reset_device(hid_to_usb_dev(hid));
-			if (rc_lock)
-				usb_unlock_device(hid_to_usb_dev(hid));
+			usb_unlock_device(hid_to_usb_dev(hid));
 		}
 		clear_bit(HID_RESET_PENDING, &usbhid->iofl);
 	}
diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw.c b/drivers/media/video/pvrusb2/pvrusb2-hdw.c
index 8fb92ac..fa304e5 100644
--- a/drivers/media/video/pvrusb2/pvrusb2-hdw.c
+++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.c
@@ -3655,7 +3655,7 @@  void pvr2_hdw_device_reset(struct pvr2_hdw *hdw)
 	int ret;
 	pvr2_trace(PVR2_TRACE_INIT,"Performing a device reset...");
 	ret = usb_lock_device_for_reset(hdw->usb_dev,NULL);
-	if (ret == 1) {
+	if (ret == 0) {
 		ret = usb_reset_device(hdw->usb_dev);
 		usb_unlock_device(hdw->usb_dev);
 	} else {
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
index 399e15f..400fa4c 100644
--- a/drivers/usb/core/usb.c
+++ b/drivers/usb/core/usb.c
@@ -513,10 +513,7 @@  EXPORT_SYMBOL_GPL(usb_put_intf);
  * disconnect; in some drivers (such as usb-storage) the disconnect()
  * or suspend() method will block waiting for a device reset to complete.
  *
- * Returns a negative error code for failure, otherwise 1 or 0 to indicate
- * that the device will or will not have to be unlocked.  (0 can be
- * returned when an interface is given and is BINDING, because in that
- * case the driver already owns the device lock.)
+ * Returns a negative error code for failure, otherwise 0.
  */
 int usb_lock_device_for_reset(struct usb_device *udev,
 			      const struct usb_interface *iface)
@@ -527,16 +524,9 @@  int usb_lock_device_for_reset(struct usb_device *udev,
 		return -ENODEV;
 	if (udev->state == USB_STATE_SUSPENDED)
 		return -EHOSTUNREACH;
-	if (iface) {
-		switch (iface->condition) {
-		case USB_INTERFACE_BINDING:
-			return 0;
-		case USB_INTERFACE_BOUND:
-			break;
-		default:
-			return -EINTR;
-		}
-	}
+	if (iface && (iface->condition == USB_INTERFACE_UNBINDING ||
+			iface->condition == USB_INTERFACE_UNBOUND))
+		return -EINTR;
 
 	while (usb_trylock_device(udev) != 0) {
 
@@ -550,10 +540,11 @@  int usb_lock_device_for_reset(struct usb_device *udev,
 			return -ENODEV;
 		if (udev->state == USB_STATE_SUSPENDED)
 			return -EHOSTUNREACH;
-		if (iface && iface->condition != USB_INTERFACE_BOUND)
+		if (iface && (iface->condition == USB_INTERFACE_UNBINDING ||
+				iface->condition == USB_INTERFACE_UNBOUND))
 			return -EINTR;
 	}
-	return 1;
+	return 0;
 }
 EXPORT_SYMBOL_GPL(usb_lock_device_for_reset);
 
diff --git a/drivers/usb/image/microtek.c b/drivers/usb/image/microtek.c
index 885867a..4541dfc 100644
--- a/drivers/usb/image/microtek.c
+++ b/drivers/usb/image/microtek.c
@@ -350,17 +350,16 @@  static int mts_scsi_abort(struct scsi_cmnd *srb)
 static int mts_scsi_host_reset(struct scsi_cmnd *srb)
 {
 	struct mts_desc* desc = (struct mts_desc*)(srb->device->host->hostdata[0]);
-	int result, rc;
+	int result;
 
 	MTS_DEBUG_GOT_HERE();
 	mts_debug_dump(desc);
 
-	rc = usb_lock_device_for_reset(desc->usb_dev, desc->usb_intf);
-	if (rc < 0)
-		return FAILED;
-	result = usb_reset_device(desc->usb_dev);
-	if (rc)
+	result = usb_lock_device_for_reset(desc->usb_dev, desc->usb_intf);
+	if (result == 0) {
+		result = usb_reset_device(desc->usb_dev);
 		usb_unlock_device(desc->usb_dev);
+	}
 	return result ? FAILED : SUCCESS;
 }
 
diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c
index 79108d5..2058db4 100644
--- a/drivers/usb/storage/transport.c
+++ b/drivers/usb/storage/transport.c
@@ -1173,10 +1173,9 @@  int usb_stor_Bulk_reset(struct us_data *us)
  */
 int usb_stor_port_reset(struct us_data *us)
 {
-	int result, rc_lock;
+	int result;
 
-	result = rc_lock =
-		usb_lock_device_for_reset(us->pusb_dev, us->pusb_intf);
+	result = usb_lock_device_for_reset(us->pusb_dev, us->pusb_intf);
 	if (result < 0)
 		US_DEBUGP("unable to lock device for reset: %d\n", result);
 	else {
@@ -1189,8 +1188,7 @@  int usb_stor_port_reset(struct us_data *us)
 			US_DEBUGP("usb_reset_device returns %d\n",
 					result);
 		}
-		if (rc_lock)
-			usb_unlock_device(us->pusb_dev);
+		usb_unlock_device(us->pusb_dev);
 	}
 	return result;
 }