mirror of
https://github.com/CTCaer/hekate
synced 2024-12-22 11:21:23 +00:00
usb: add more timeout control for ep1 read/write finish
This commit is contained in:
parent
70a06a6cae
commit
4914ce1d49
4 changed files with 16 additions and 16 deletions
|
@ -4,7 +4,7 @@
|
||||||
* Copyright (c) 2003-2008 Alan Stern
|
* Copyright (c) 2003-2008 Alan Stern
|
||||||
* Copyright (c) 2009 Samsung Electronics
|
* Copyright (c) 2009 Samsung Electronics
|
||||||
* Author: Michal Nazarewicz <m.nazarewicz@samsung.com>
|
* Author: Michal Nazarewicz <m.nazarewicz@samsung.com>
|
||||||
* Copyright (c) 2019-2020 CTCaer
|
* Copyright (c) 2019-2021 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
@ -109,7 +109,7 @@
|
||||||
#define SS_WRITE_ERROR 0x30C02
|
#define SS_WRITE_ERROR 0x30C02
|
||||||
#define SS_WRITE_PROTECTED 0x72700
|
#define SS_WRITE_PROTECTED 0x72700
|
||||||
|
|
||||||
#define SK(x) ((u8) ((x) >> 16)) /* Sense Key byte, etc. */
|
#define SK(x) ((u8) ((x) >> 16)) // Sense Key byte, etc.
|
||||||
#define ASC(x) ((u8) ((x) >> 8))
|
#define ASC(x) ((u8) ((x) >> 8))
|
||||||
#define ASCQ(x) ((u8) (x))
|
#define ASCQ(x) ((u8) (x))
|
||||||
|
|
||||||
|
@ -368,12 +368,12 @@ static void _ums_transfer_out_big_read(usbd_gadget_ums_t *ums, bulk_ctxt_t *bulk
|
||||||
bulk_ctxt->bulk_out_buf_state = BUF_STATE_FULL;
|
bulk_ctxt->bulk_out_buf_state = BUF_STATE_FULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _ums_transfer_finish(usbd_gadget_ums_t *ums, bulk_ctxt_t *bulk_ctxt, u32 ep)
|
static void _ums_transfer_finish(usbd_gadget_ums_t *ums, bulk_ctxt_t *bulk_ctxt, u32 ep, u32 sync_timeout)
|
||||||
{
|
{
|
||||||
if (ep == bulk_ctxt->bulk_in)
|
if (ep == bulk_ctxt->bulk_in)
|
||||||
{
|
{
|
||||||
bulk_ctxt->bulk_in_status = usb_ops.usb_device_ep1_in_writing_finish(
|
bulk_ctxt->bulk_in_status = usb_ops.usb_device_ep1_in_writing_finish(
|
||||||
&bulk_ctxt->bulk_in_length_actual);
|
&bulk_ctxt->bulk_in_length_actual, sync_timeout);
|
||||||
|
|
||||||
if (bulk_ctxt->bulk_in_status == USB_ERROR_XFER_ERROR)
|
if (bulk_ctxt->bulk_in_status == USB_ERROR_XFER_ERROR)
|
||||||
{
|
{
|
||||||
|
@ -386,7 +386,7 @@ static void _ums_transfer_finish(usbd_gadget_ums_t *ums, bulk_ctxt_t *bulk_ctxt,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
bulk_ctxt->bulk_out_status = usb_ops.usb_device_ep1_out_reading_finish(
|
bulk_ctxt->bulk_out_status = usb_ops.usb_device_ep1_out_reading_finish(
|
||||||
&bulk_ctxt->bulk_out_length_actual);
|
&bulk_ctxt->bulk_out_length_actual, sync_timeout);
|
||||||
|
|
||||||
if (bulk_ctxt->bulk_out_status == USB_ERROR_XFER_ERROR)
|
if (bulk_ctxt->bulk_out_status == USB_ERROR_XFER_ERROR)
|
||||||
{
|
{
|
||||||
|
@ -497,7 +497,7 @@ static int _scsi_read(usbd_gadget_ums_t *ums, bulk_ctxt_t *bulk_ctxt)
|
||||||
|
|
||||||
// Wait for the async USB transfer to finish.
|
// Wait for the async USB transfer to finish.
|
||||||
if (!first_read)
|
if (!first_read)
|
||||||
_ums_transfer_finish(ums, bulk_ctxt, bulk_ctxt->bulk_in);
|
_ums_transfer_finish(ums, bulk_ctxt, bulk_ctxt->bulk_in, USB_XFER_SYNCED);
|
||||||
|
|
||||||
lba_offset += amount;
|
lba_offset += amount;
|
||||||
amount_left -= amount;
|
amount_left -= amount;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Enhanced USB Device (EDCI) driver for Tegra X1
|
* Enhanced USB Device (EDCI) driver for Tegra X1
|
||||||
*
|
*
|
||||||
* Copyright (c) 2019-2020 CTCaer
|
* Copyright (c) 2019-2021 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
@ -1455,7 +1455,7 @@ static int _usbd_get_ep1_out_bytes_read()
|
||||||
return (usbdaemon->ep_bytes_requested[USB_EP_BULK_OUT] - (usbdaemon->qhs[USB_EP_BULK_OUT].token >> 16));
|
return (usbdaemon->ep_bytes_requested[USB_EP_BULK_OUT] - (usbdaemon->qhs[USB_EP_BULK_OUT].token >> 16));
|
||||||
}
|
}
|
||||||
|
|
||||||
int usb_device_ep1_out_reading_finish(u32 *pending_bytes)
|
int usb_device_ep1_out_reading_finish(u32 *pending_bytes, u32 sync_timeout)
|
||||||
{
|
{
|
||||||
usb_ep_status_t ep_status;
|
usb_ep_status_t ep_status;
|
||||||
do
|
do
|
||||||
|
@ -1504,7 +1504,7 @@ static int _usbd_get_ep1_in_bytes_written()
|
||||||
return (usbdaemon->ep_bytes_requested[USB_EP_BULK_IN] - (usbdaemon->qhs[USB_EP_BULK_IN].token >> 16));
|
return (usbdaemon->ep_bytes_requested[USB_EP_BULK_IN] - (usbdaemon->qhs[USB_EP_BULK_IN].token >> 16));
|
||||||
}
|
}
|
||||||
|
|
||||||
int usb_device_ep1_in_writing_finish(u32 *pending_bytes)
|
int usb_device_ep1_in_writing_finish(u32 *pending_bytes, u32 sync_timeout)
|
||||||
{
|
{
|
||||||
usb_ep_status_t ep_status;
|
usb_ep_status_t ep_status;
|
||||||
do
|
do
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Enhanced & eXtensible USB Device (EDCI & XDCI) driver for Tegra X1
|
* Enhanced & eXtensible USB Device (EDCI & XDCI) driver for Tegra X1
|
||||||
*
|
*
|
||||||
* Copyright (c) 2019 CTCaer
|
* Copyright (c) 2019-2021 CTCaer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
@ -175,9 +175,9 @@ typedef struct _usb_ops_t
|
||||||
|
|
||||||
int (*usb_device_ep1_out_read)(u8 *, u32, u32 *, u32);
|
int (*usb_device_ep1_out_read)(u8 *, u32, u32 *, u32);
|
||||||
int (*usb_device_ep1_out_read_big)(u8 *, u32, u32 *);
|
int (*usb_device_ep1_out_read_big)(u8 *, u32, u32 *);
|
||||||
int (*usb_device_ep1_out_reading_finish)(u32 *);
|
int (*usb_device_ep1_out_reading_finish)(u32 *, u32);
|
||||||
int (*usb_device_ep1_in_write)(u8 *, u32, u32 *, u32);
|
int (*usb_device_ep1_in_write)(u8 *, u32, u32 *, u32);
|
||||||
int (*usb_device_ep1_in_writing_finish)(u32 *);
|
int (*usb_device_ep1_in_writing_finish)(u32 *, u32);
|
||||||
bool (*usb_device_get_suspended)();
|
bool (*usb_device_get_suspended)();
|
||||||
bool (*usb_device_get_port_in_sleep)();
|
bool (*usb_device_get_port_in_sleep)();
|
||||||
} usb_ops_t;
|
} usb_ops_t;
|
||||||
|
|
|
@ -1898,11 +1898,11 @@ int xusb_device_ep1_out_read_big(u8 *buf, u32 len, u32 *bytes_read)
|
||||||
return USB_RES_OK;
|
return USB_RES_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int xusb_device_ep1_out_reading_finish(u32 *pending_bytes)
|
int xusb_device_ep1_out_reading_finish(u32 *pending_bytes, u32 sync_tries)
|
||||||
{
|
{
|
||||||
int res = USB_RES_OK;
|
int res = USB_RES_OK;
|
||||||
while (!res && usbd_xotg->tx_count[USB_DIR_OUT])
|
while (!res && usbd_xotg->tx_count[USB_DIR_OUT])
|
||||||
res = _xusb_ep_operation(USB_XFER_SYNCED); // Infinite retries.
|
res = _xusb_ep_operation(sync_tries); // Infinite retries.
|
||||||
|
|
||||||
if (pending_bytes)
|
if (pending_bytes)
|
||||||
*pending_bytes = res ? 0 : usbd_xotg->bytes_remaining[USB_DIR_OUT];
|
*pending_bytes = res ? 0 : usbd_xotg->bytes_remaining[USB_DIR_OUT];
|
||||||
|
@ -1947,11 +1947,11 @@ int xusb_device_ep1_in_write(u8 *buf, u32 len, u32 *bytes_written, u32 sync_trie
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
int xusb_device_ep1_in_writing_finish(u32 *pending_bytes)
|
int xusb_device_ep1_in_writing_finish(u32 *pending_bytes, u32 sync_tries)
|
||||||
{
|
{
|
||||||
int res = USB_RES_OK;
|
int res = USB_RES_OK;
|
||||||
while (!res && usbd_xotg->tx_count[USB_DIR_IN])
|
while (!res && usbd_xotg->tx_count[USB_DIR_IN])
|
||||||
res = _xusb_ep_operation(USB_XFER_SYNCED); // Infinite retries.
|
res = _xusb_ep_operation(sync_tries); // Infinite retries.
|
||||||
|
|
||||||
if (pending_bytes)
|
if (pending_bytes)
|
||||||
*pending_bytes = res ? 0 : usbd_xotg->bytes_remaining[USB_DIR_IN];
|
*pending_bytes = res ? 0 : usbd_xotg->bytes_remaining[USB_DIR_IN];
|
||||||
|
|
Loading…
Reference in a new issue