Re: [PATCH v2 1/3] usb: chipidea: add CI_HDRC_HAS_SHORT_PKT_LIMIT flag

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 24-09-23 16:12:01, Xu Yang wrote:
> 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 <xu.yang_2@xxxxxxx>

Acked-by: Peter Chen <peter.chen@xxxxxxxxxx>
> 
> ---
> Changes in v2:
>  - new patch
> ---
>  drivers/usb/chipidea/ci.h          | 1 +
>  drivers/usb/chipidea/ci_hdrc_imx.c | 1 +
>  drivers/usb/chipidea/core.c        | 2 ++
>  include/linux/usb/chipidea.h       | 1 +
>  4 files changed, 5 insertions(+)
> 
> diff --git a/drivers/usb/chipidea/ci.h b/drivers/usb/chipidea/ci.h
> index 2a38e1eb6546..e4b003d060c2 100644
> --- a/drivers/usb/chipidea/ci.h
> +++ b/drivers/usb/chipidea/ci.h
> @@ -260,6 +260,7 @@ struct ci_hdrc {
>  	bool				b_sess_valid_event;
>  	bool				imx28_write_fix;
>  	bool				has_portsc_pec_bug;
> +	bool				has_short_pkt_limit;
>  	bool				supports_runtime_pm;
>  	bool				in_lpm;
>  	bool				wakeup_int;
> diff --git a/drivers/usb/chipidea/ci_hdrc_imx.c b/drivers/usb/chipidea/ci_hdrc_imx.c
> index c64ab0e07ea0..17b3ac2ac8a1 100644
> --- a/drivers/usb/chipidea/ci_hdrc_imx.c
> +++ b/drivers/usb/chipidea/ci_hdrc_imx.c
> @@ -342,6 +342,7 @@ static int ci_hdrc_imx_probe(struct platform_device *pdev)
>  	struct ci_hdrc_platform_data pdata = {
>  		.name		= dev_name(&pdev->dev),
>  		.capoffset	= DEF_CAPOFFSET,
> +		.flags		= CI_HDRC_HAS_SHORT_PKT_LIMIT,
>  		.notify_event	= ci_hdrc_imx_notify_event,
>  	};
>  	int ret;
> diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c
> index 835bf2428dc6..5aa16dbfc289 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);
> diff --git a/include/linux/usb/chipidea.h b/include/linux/usb/chipidea.h
> index 5a7f96684ea2..ebdfef124b2b 100644
> --- a/include/linux/usb/chipidea.h
> +++ b/include/linux/usb/chipidea.h
> @@ -65,6 +65,7 @@ struct ci_hdrc_platform_data {
>  #define CI_HDRC_PHY_VBUS_CONTROL	BIT(16)
>  #define CI_HDRC_HAS_PORTSC_PEC_MISSED	BIT(17)
>  #define CI_HDRC_FORCE_VBUS_ACTIVE_ALWAYS	BIT(18)
> +#define	CI_HDRC_HAS_SHORT_PKT_LIMIT	BIT(19)
>  	enum usb_dr_mode	dr_mode;
>  #define CI_HDRC_CONTROLLER_RESET_EVENT		0
>  #define CI_HDRC_CONTROLLER_STOPPED_EVENT	1
> -- 
> 2.34.1
> 




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux