Skip to content

Commit

Permalink
usb: gadget: renesas_usbhs: disable pipe on top of interrupt
Browse files Browse the repository at this point in the history
When data read interrupt happened, the pipe is BUF which means "enable".
then, next un-necessary interrupt/token might be
issued again when all data were popped from fifo.
It will cause un-understandable bug.
This patch decides pipe disable on top of read interrupt.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
  • Loading branch information
Kuninori Morimoto authored and Felipe Balbi committed Oct 13, 2011
1 parent 6e6db82 commit 6ff5d09
Showing 1 changed file with 14 additions and 9 deletions.
23 changes: 14 additions & 9 deletions drivers/usb/renesas_usbhs/fifo.c
Original file line number Diff line number Diff line change
Expand Up @@ -475,6 +475,20 @@ static int usbhsf_pio_try_pop(struct usbhs_pkt *pkt, int *is_done)
len = min(len, rcv_len);
total_len = len;

/*
* update actual length first here to decide disable pipe.
* if this pipe keeps BUF status and all data were popped,
* then, next interrupt/token will be issued again
*/
pkt->actual += total_len;

if ((pkt->actual == pkt->length) || /* receive all data */
(total_len < maxp)) { /* short packet */
*is_done = 1;
usbhsf_rx_irq_ctrl(pipe, 0);
usbhs_pipe_disable(pipe); /* disable pipe first */
}

/*
* Buffer clear if Zero-Length packet
*
Expand Down Expand Up @@ -505,16 +519,7 @@ static int usbhsf_pio_try_pop(struct usbhs_pkt *pkt, int *is_done)
buf[i] = (data >> ((i & 0x03) * 8)) & 0xff;
}

pkt->actual += total_len;

usbhs_fifo_read_end:
if ((pkt->actual == pkt->length) || /* receive all data */
(total_len < maxp)) { /* short packet */
*is_done = 1;
usbhsf_rx_irq_ctrl(pipe, 0);
usbhs_pipe_disable(pipe);
}

dev_dbg(dev, " recv %d (%d/ %d/ %d/ %d)\n",
usbhs_pipe_number(pipe),
pkt->length, pkt->actual, *is_done, pkt->zero);
Expand Down

0 comments on commit 6ff5d09

Please sign in to comment.