libpayload: usb: dwc2: fix short patket transfer
If short packet detected, stop this transfer and return the actual transferred size BUG=chrome-os-partner:42817 TEST=Netboot could run well BRANCH=None Change-Id: Icb4317f48aa04ac15bb1886b81d2e3c472d123d0 Signed-off-by: Yunzhi Li <lyz@rock-chips.com> Reviewed-on: https://chromium-review.googlesource.com/288215 Reviewed-by: Julius Werner <jwerner@chromium.org> Commit-Queue: Lin Huang <hl@rock-chips.com> Tested-by: Lin Huang <hl@rock-chips.com> (cherry picked from commit d372343b4e3d664ce2d76dbf55a5061b5d496bba) Reviewed-on: https://chromium-review.googlesource.com/291253 Reviewed-by: David Hendricks <dhendrix@chromium.org> Commit-Queue: David Hendricks <dhendrix@chromium.org> Tested-by: David Hendricks <dhendrix@chromium.org>
This commit is contained in:
parent
140f8f62d7
commit
0e468b1df5
1 changed files with 18 additions and 11 deletions
|
|
@ -174,8 +174,6 @@ wait_for_complete(endpoint_t *ep, uint32_t ch_num)
|
|||
return -HCSTAT_BABBLE;
|
||||
else if (hcint.stall)
|
||||
return -HCSTAT_STALL;
|
||||
else if (hcint.ack)
|
||||
return -HCSTAT_ACK;
|
||||
else if (hcint.nyet)
|
||||
return -HCSTAT_NYET;
|
||||
else
|
||||
|
|
@ -209,7 +207,7 @@ wait_for_complete(endpoint_t *ep, uint32_t ch_num)
|
|||
|
||||
static int
|
||||
dwc2_do_xfer(endpoint_t *ep, int size, int pid, ep_dir_t dir,
|
||||
uint32_t ch_num, u8 *data_buf)
|
||||
uint32_t ch_num, u8 *data_buf, int *short_pkt)
|
||||
{
|
||||
uint32_t do_copy;
|
||||
int ret;
|
||||
|
|
@ -276,6 +274,10 @@ dwc2_do_xfer(endpoint_t *ep, int size, int pid, ep_dir_t dir,
|
|||
|
||||
if (do_copy && (dir == EPDIR_IN))
|
||||
memcpy(data_buf, aligned_buf, transferred);
|
||||
|
||||
if ((short_pkt != NULL) && (dir == EPDIR_IN))
|
||||
*short_pkt = (ret > 0) ? 1 : 0;
|
||||
|
||||
}
|
||||
|
||||
/* Save data toggle */
|
||||
|
|
@ -291,7 +293,8 @@ dwc2_do_xfer(endpoint_t *ep, int size, int pid, ep_dir_t dir,
|
|||
|
||||
static int
|
||||
dwc2_split_transfer(endpoint_t *ep, int size, int pid, ep_dir_t dir,
|
||||
uint32_t ch_num, u8 *data_buf, split_info_t *split)
|
||||
uint32_t ch_num, u8 *data_buf, split_info_t *split,
|
||||
int *short_pkt)
|
||||
{
|
||||
dwc2_reg_t *reg = DWC2_REG(ep->dev->controller);
|
||||
hfnum_t hfnum;
|
||||
|
|
@ -310,7 +313,7 @@ dwc2_split_transfer(endpoint_t *ep, int size, int pid, ep_dir_t dir,
|
|||
|
||||
/* Handle Start-Split */
|
||||
ret = dwc2_do_xfer(ep, dir == EPDIR_IN ? 0 : size, pid, dir, ch_num,
|
||||
data_buf);
|
||||
data_buf, NULL);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
|
|
@ -325,7 +328,7 @@ dwc2_split_transfer(endpoint_t *ep, int size, int pid, ep_dir_t dir,
|
|||
/* Handle Complete-Split */
|
||||
do {
|
||||
ret = dwc2_do_xfer(ep, dir == EPDIR_OUT ? 0 : size, ep->toggle,
|
||||
dir, ch_num, data_buf);
|
||||
dir, ch_num, data_buf, short_pkt);
|
||||
} while (ret == -HCSTAT_NYET);
|
||||
|
||||
if (dir == EPDIR_IN)
|
||||
|
|
@ -359,15 +362,17 @@ dwc2_transfer(endpoint_t *ep, int size, int pid, ep_dir_t dir, uint32_t ch_num,
|
|||
u8 *src, uint8_t skip_nak)
|
||||
{
|
||||
split_info_t split;
|
||||
int ret, transferred = 0, timeout = 3000;
|
||||
int ret, short_pkt, transferred = 0, timeout = 3000;
|
||||
|
||||
ep->toggle = pid;
|
||||
|
||||
do {
|
||||
short_pkt = 0;
|
||||
if (dwc2_need_split(ep->dev, &split)) {
|
||||
nak_retry:
|
||||
ret = dwc2_split_transfer(ep, size, ep->toggle, dir, 0,
|
||||
src, &split);
|
||||
ret = dwc2_split_transfer(ep, MIN(ep->maxpacketsize,
|
||||
size), ep->toggle, dir, 0, src, &split,
|
||||
&short_pkt);
|
||||
|
||||
/*
|
||||
* dwc2_split_transfer() waits for the next FullSpeed
|
||||
|
|
@ -379,7 +384,8 @@ nak_retry:
|
|||
goto nak_retry;
|
||||
}
|
||||
} else {
|
||||
ret = dwc2_do_xfer(ep, size, pid, dir, 0, src);
|
||||
ret = dwc2_do_xfer(ep, MIN(DMA_SIZE, size), pid, dir, 0,
|
||||
src, &short_pkt);
|
||||
}
|
||||
|
||||
if (ret < 0)
|
||||
|
|
@ -388,7 +394,8 @@ nak_retry:
|
|||
size -= ret;
|
||||
src += ret;
|
||||
transferred += ret;
|
||||
} while (size > 0);
|
||||
|
||||
} while (size > 0 && !short_pkt);
|
||||
|
||||
return transferred;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue