ping
Franck Bui-Huu wrote:
> When closing the device, the driver acquires/release twice the
> port lock before/after waiting for the data to be completely
> sent.
> It also uses the generic scheduler function for waiting for an
> event.
>
> Signed-off-by: Franck Bui-Huu <[EMAIL PROTECTED]>
>
>
> ---
>
> well I'm probably missing something with these macros but don't
> see what...
>
> drivers/usb/gadget/serial.c | 87
> ++++---------------------------------------
> 1 files changed, 9 insertions(+), 78 deletions(-)
>
> 51b89a6d3912a4bb1cba19ee1e0a3723b5fb2309
> diff --git a/drivers/usb/gadget/serial.c b/drivers/usb/gadget/serial.c
> index b992546..66285e3 100644
> --- a/drivers/usb/gadget/serial.c
> +++ b/drivers/usb/gadget/serial.c
> @@ -51,82 +51,10 @@ #include <linux/usb_gadget.h>
> #include "gadget_chips.h"
>
>
> -/* Wait Cond */
> -
> -#define __wait_cond_interruptible(wq, condition, lock, flags, ret) \
> -do { \
> - wait_queue_t __wait; \
> - init_waitqueue_entry(&__wait, current); \
> - \
> - add_wait_queue(&wq, &__wait); \
> - for (;;) { \
> - set_current_state(TASK_INTERRUPTIBLE); \
> - if (condition) \
> - break; \
> - if (!signal_pending(current)) { \
> - spin_unlock_irqrestore(lock, flags); \
> - schedule(); \
> - spin_lock_irqsave(lock, flags); \
> - continue; \
> - } \
> - ret = -ERESTARTSYS; \
> - break; \
> - } \
> - current->state = TASK_RUNNING; \
> - remove_wait_queue(&wq, &__wait); \
> -} while (0)
> -
> -#define wait_cond_interruptible(wq, condition, lock, flags) \
> -({ \
> - int __ret = 0; \
> - if (!(condition)) \
> - __wait_cond_interruptible(wq, condition, lock, flags, \
> - __ret); \
> - __ret; \
> -})
> -
> -#define __wait_cond_interruptible_timeout(wq, condition, lock, flags,
> \
> - timeout, ret) \
> -do { \
> - signed long __timeout = timeout; \
> - wait_queue_t __wait; \
> - init_waitqueue_entry(&__wait, current); \
> - \
> - add_wait_queue(&wq, &__wait); \
> - for (;;) { \
> - set_current_state(TASK_INTERRUPTIBLE); \
> - if (__timeout == 0) \
> - break; \
> - if (condition) \
> - break; \
> - if (!signal_pending(current)) { \
> - spin_unlock_irqrestore(lock, flags); \
> - __timeout = schedule_timeout(__timeout); \
> - spin_lock_irqsave(lock, flags); \
> - continue; \
> - } \
> - ret = -ERESTARTSYS; \
> - break; \
> - } \
> - current->state = TASK_RUNNING; \
> - remove_wait_queue(&wq, &__wait); \
> -} while (0)
> -
> -#define wait_cond_interruptible_timeout(wq, condition, lock, flags, \
> - timeout) \
> -({ \
> - int __ret = 0; \
> - if (!(condition)) \
> - __wait_cond_interruptible_timeout(wq, condition, lock, \
> - flags, timeout, __ret); \
> - __ret; \
> -})
> -
> -
> /* Defines */
>
> -#define GS_VERSION_STR "v2.0"
> -#define GS_VERSION_NUM 0x0200
> +#define GS_VERSION_STR "v2.1"
> +#define GS_VERSION_NUM 0x0201
>
> #define GS_LONG_NAME "Gadget Serial"
> #define GS_SHORT_NAME "g_serial"
> @@ -887,11 +815,14 @@ static void gs_close(struct tty_struct *
> /* wait for write buffer to drain, or */
> /* at most GS_CLOSE_TIMEOUT seconds */
> if (gs_buf_data_avail(port->port_write_buf) > 0) {
> +
> +#define GS_WRITE_FINISHED_EVENT \
> + (port->port_dev == NULL || gs_buf_data_avail(port->port_write_buf) == 0)
> +
> spin_unlock_irqrestore(&port->port_lock, flags);
> - wait_cond_interruptible_timeout(port->port_write_wait,
> - port->port_dev == NULL
> - || gs_buf_data_avail(port->port_write_buf) == 0,
> - &port->port_lock, flags, GS_CLOSE_TIMEOUT * HZ);
> + wait_event_interruptible_timeout(port->port_write_wait,
> + GS_WRITE_FINISHED_EVENT,
> + GS_CLOSE_TIMEOUT * HZ);
> spin_lock_irqsave(&port->port_lock, flags);
> }
>
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel