On Fri,  5 Feb 2021 20:11:58 +0100
Pali Rohár <p...@kernel.org> wrote:

> Function next_urb() selects the last urb data buffer from linked list
> to which next data from usbtty puts should be appended.
> 
> But to check if TX data still exists it is needed to look at the
> first urb data buffer from linked list. So check for endpoint->tx_urb
> (first from the linked list) instead of current_urb (the last from
> the linked list).
> 
> Successful call to udc_endpoint_write() may invalidate active urb and
> allocate new in queue which invalidate pointer returned by next_urb()
> function.
> 
> So call next_urb() prior putting data into urb buffer and call it
> every time after using udc_endpoint_write() function to prevent
> sending data from usbtty puts in incorrect order.
> 
> This patch fixes issue that usbtty code does not transmit data when
> they are waiting in the tx queue.

Reviewed-by: Lukasz Majewski <lu...@denx.de>

> 
> Signed-off-by: Pali Rohár <p...@kernel.org>
> ---
>  drivers/serial/usbtty.c | 12 +++---------
>  1 file changed, 3 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/serial/usbtty.c b/drivers/serial/usbtty.c
> index 02f8edf200..4f4eb02de0 100644
> --- a/drivers/serial/usbtty.c
> +++ b/drivers/serial/usbtty.c
> @@ -849,17 +849,9 @@ static int write_buffer (circbuf_t * buf)
>                       &endpoint_instance[tx_endpoint];
>       struct urb *current_urb = NULL;
>  
> -     current_urb = next_urb (device_instance, endpoint);
> -
> -     if (!current_urb) {
> -             TTYERR ("current_urb is NULL, buf->size %d\n",
> -             buf->size);
> -             return 0;
> -     }
> -
>       /* TX data still exists - send it now
>        */
> -     if(endpoint->sent < current_urb->actual_length){
> +     if(endpoint->sent < endpoint->tx_urb->actual_length){
>               if(udc_endpoint_write (endpoint)){
>                       /* Write pre-empted by RX */
>                       return -1;
> @@ -878,6 +870,8 @@ static int write_buffer (circbuf_t * buf)
>                */
>               while (buf->size > 0) {
>  
> +                     current_urb = next_urb (device_instance,
> endpoint); +
>                       dest = (char*)current_urb->buffer +
>                               current_urb->actual_length;
>  




Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lu...@denx.de

Attachment: pgpWTS27MBAgK.pgp
Description: OpenPGP digital signature

Reply via email to