diff options
| author | Xu Yang <[email protected]> | 2024-09-23 08:12:01 +0000 |
|---|---|---|
| committer | Greg Kroah-Hartman <[email protected]> | 2024-10-04 13:13:58 +0000 |
| commit | ec841b8d73cff37f8960e209017efe1eb2fb21f2 (patch) | |
| tree | 59f2145cefd2c5cb8eda2a871604dd8863076950 /drivers/usb/chipidea/core.c | |
| parent | dt-bindings: usb: cypress,cypd4226: Drop Tegra specific GPIO defines (diff) | |
| download | kernel-ec841b8d73cff37f8960e209017efe1eb2fb21f2.tar.gz kernel-ec841b8d73cff37f8960e209017efe1eb2fb21f2.zip | |
usb: chipidea: add CI_HDRC_HAS_SHORT_PKT_LIMIT flag
Currently, the imx deivice controller has below limitations:
1. can't generate short packet interrupt if IOC not set in dTD. So if one
request span more than one dTDs and only the last dTD set IOC, the usb
request will pending there if no more data comes.
2. the controller can't accurately deliver data to differtent usb requests
in some cases due to short packet. For example: one usb request span 3
dTDs, then if the controller received a short packet the next packet
will go to 2nd dTD of current request rather than the first dTD of next
request.
3. can't build a bus packet use multiple dTDs. For example: controller
needs to send one packet of 512 bytes use dTD1 (200 bytes) + dTD2
(312 bytes), actually the host side will see 200 bytes short packet.
Based on these limits, add CI_HDRC_HAS_SHORT_PKT_LIMIT flag and use it on
imx platforms.
Signed-off-by: Xu Yang <[email protected]>
Acked-by: Peter Chen <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Greg Kroah-Hartman <[email protected]>
Diffstat (limited to 'drivers/usb/chipidea/core.c')
| -rw-r--r-- | drivers/usb/chipidea/core.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c index 36143b2ae482..2d01af746ff8 100644 --- a/drivers/usb/chipidea/core.c +++ b/drivers/usb/chipidea/core.c @@ -1076,6 +1076,8 @@ static int ci_hdrc_probe(struct platform_device *pdev) CI_HDRC_SUPPORTS_RUNTIME_PM); ci->has_portsc_pec_bug = !!(ci->platdata->flags & CI_HDRC_HAS_PORTSC_PEC_MISSED); + ci->has_short_pkt_limit = !!(ci->platdata->flags & + CI_HDRC_HAS_SHORT_PKT_LIMIT); platform_set_drvdata(pdev, ci); ret = hw_device_init(ci, base); |
