Looks good to me. Greg, please apply. Matt
Signed-off-by: Matthew Dharm <[EMAIL PROTECTED]>
On Wed, May 24, 2006 at 04:57:28PM +0200, Franck Bui-Huu wrote:
>
> This patch uses completion timeout instead of a timer to implement
> a timeout when submitting an URB.
>
> It also put the task in interruptible state instead of an
> uninterruptible one while waiting for the completion.
>
> Signed-off-by: Franck Bui-Huu <[EMAIL PROTECTED]>
>
>
> ---
>
> drivers/usb/storage/transport.c | 38 ++++++++++----------------------------
> 1 files changed, 10 insertions(+), 28 deletions(-)
>
> 5d53ca36e71b3854ac8c86165ea0543c218c1c54
> diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c
> index 7ca896a..038f458 100644
> --- a/drivers/usb/storage/transport.c
> +++ b/drivers/usb/storage/transport.c
> @@ -115,19 +115,6 @@ static void usb_stor_blocking_completion
>
> complete(urb_done_ptr);
> }
> -
> -/* This is the timeout handler which will cancel an URB when its timeout
> - * expires.
> - */
> -static void timeout_handler(unsigned long us_)
> -{
> - struct us_data *us = (struct us_data *) us_;
> -
> - if (test_and_clear_bit(US_FLIDX_URB_ACTIVE, &us->flags)) {
> - US_DEBUGP("Timeout -- cancelling URB\n");
> - usb_unlink_urb(us->current_urb);
> - }
> -}
>
> /* This is the common part of the URB message submission code
> *
> @@ -138,7 +125,7 @@ static void timeout_handler(unsigned lon
> static int usb_stor_msg_common(struct us_data *us, int timeout)
> {
> struct completion urb_done;
> - struct timer_list to_timer;
> + long timeleft;
> int status;
>
> /* don't submit URBs during abort/disconnect processing */
> @@ -185,22 +172,17 @@ static int usb_stor_msg_common(struct us
> }
> }
>
> - /* submit the timeout timer, if a timeout was requested */
> - if (timeout > 0) {
> - init_timer(&to_timer);
> - to_timer.expires = jiffies + timeout;
> - to_timer.function = timeout_handler;
> - to_timer.data = (unsigned long) us;
> - add_timer(&to_timer);
> - }
> -
> /* wait for the completion of the URB */
> - wait_for_completion(&urb_done);
> - clear_bit(US_FLIDX_URB_ACTIVE, &us->flags);
> + timeleft = wait_for_completion_interruptible_timeout(
> + &urb_done, timeout ? : MAX_SCHEDULE_TIMEOUT);
>
> - /* clean up the timeout timer */
> - if (timeout > 0)
> - del_timer_sync(&to_timer);
> + clear_bit(US_FLIDX_URB_ACTIVE, &us->flags);
> +
> + if (timeleft <= 0) {
> + US_DEBUGP("%s -- cancelling URB\n",
> + timeleft == 0 ? "Timeout" : "Signal");
> + usb_unlink_urb(us->current_urb);
> + }
>
> /* return the URB status */
> return us->current_urb->status;
> --
> 1.3.3.g8701
--
Matthew Dharm Home: [EMAIL PROTECTED]
Maintainer, Linux USB Mass Storage Driver
You were using cheat codes too. You guys suck.
-- Greg to General Studebaker
User Friendly, 12/16/1997
pgpwKo4vI2rtu.pgp
Description: PGP signature
