From nobody Fri Dec 19 19:07:45 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id BD035FA373F for ; Mon, 24 Oct 2022 16:07:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233349AbiJXQHk (ORCPT ); Mon, 24 Oct 2022 12:07:40 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33192 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233171AbiJXQES (ORCPT ); Mon, 24 Oct 2022 12:04:18 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 156D31C93C; Mon, 24 Oct 2022 07:56:35 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 64A2AB81202; Mon, 24 Oct 2022 12:24:19 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id B82B1C433B5; Mon, 24 Oct 2022 12:24:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1666614258; bh=NRSfbYdbXRVMYB9NY6/edprAupDWT9LhGIIB9kC9TEk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=FMTi2A0pNtDg8N7GHr5SgVOvPv7zk9jA9kCh3mTMs5vbihZOUtQLkuzz9lISXQ0lV mWIYk7fzUcOrncfGo1U0evmaAJzAVFep440cY6+Shh6CmTgDnlM7MpBnt7DJ2u2jX6 XIhAUvMmCRmBQcyl+dxkYgdemQIpKst87BK0FMZI= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Chunfeng Yun , Sasha Levin Subject: [PATCH 5.10 193/390] usb: common: add function to get interval expressed in us unit Date: Mon, 24 Oct 2022 13:29:50 +0200 Message-Id: <20221024113030.992402303@linuxfoundation.org> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20221024113022.510008560@linuxfoundation.org> References: <20221024113022.510008560@linuxfoundation.org> User-Agent: quilt/0.67 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Chunfeng Yun [ Upstream commit fb95c7cf5600b7b74412f27dfb39a1e13fd8a90d ] Add a new function to convert bInterval into the time expressed in 1us unit. Signed-off-by: Chunfeng Yun Link: https://lore.kernel.org/r/25c8a09b055f716c1e5bf11fea72c3418f844482.16= 15170625.git.chunfeng.yun@mediatek.com Signed-off-by: Greg Kroah-Hartman Stable-dep-of: b6155eaf6b05 ("usb: common: debug: Check non-standard contro= l requests") Signed-off-by: Sasha Levin --- drivers/usb/common/common.c | 41 +++++++++++++++++++++++++++++++++++++ drivers/usb/core/devices.c | 21 ++++--------------- drivers/usb/core/endpoint.c | 35 ++++--------------------------- include/linux/usb/ch9.h | 3 +++ 4 files changed, 52 insertions(+), 48 deletions(-) diff --git a/drivers/usb/common/common.c b/drivers/usb/common/common.c index fc21cf2d36f6..675e8a4e683a 100644 --- a/drivers/usb/common/common.c +++ b/drivers/usb/common/common.c @@ -165,6 +165,47 @@ enum usb_dr_mode usb_get_dr_mode(struct device *dev) } EXPORT_SYMBOL_GPL(usb_get_dr_mode); =20 +/** + * usb_decode_interval - Decode bInterval into the time expressed in 1us u= nit + * @epd: The descriptor of the endpoint + * @speed: The speed that the endpoint works as + * + * Function returns the interval expressed in 1us unit for servicing + * endpoint for data transfers. + */ +unsigned int usb_decode_interval(const struct usb_endpoint_descriptor *epd, + enum usb_device_speed speed) +{ + unsigned int interval =3D 0; + + switch (usb_endpoint_type(epd)) { + case USB_ENDPOINT_XFER_CONTROL: + /* uframes per NAK */ + if (speed =3D=3D USB_SPEED_HIGH) + interval =3D epd->bInterval; + break; + case USB_ENDPOINT_XFER_ISOC: + interval =3D 1 << (epd->bInterval - 1); + break; + case USB_ENDPOINT_XFER_BULK: + /* uframes per NAK */ + if (speed =3D=3D USB_SPEED_HIGH && usb_endpoint_dir_out(epd)) + interval =3D epd->bInterval; + break; + case USB_ENDPOINT_XFER_INT: + if (speed >=3D USB_SPEED_HIGH) + interval =3D 1 << (epd->bInterval - 1); + else + interval =3D epd->bInterval; + break; + } + + interval *=3D (speed >=3D USB_SPEED_HIGH) ? 125 : 1000; + + return interval; +} +EXPORT_SYMBOL_GPL(usb_decode_interval); + #ifdef CONFIG_OF /** * of_usb_get_dr_mode_by_phy - Get dual role mode for the controller device diff --git a/drivers/usb/core/devices.c b/drivers/usb/core/devices.c index 1ef2de6e375a..d8b0041de612 100644 --- a/drivers/usb/core/devices.c +++ b/drivers/usb/core/devices.c @@ -157,38 +157,25 @@ static char *usb_dump_endpoint_descriptor(int speed, = char *start, char *end, switch (usb_endpoint_type(desc)) { case USB_ENDPOINT_XFER_CONTROL: type =3D "Ctrl"; - if (speed =3D=3D USB_SPEED_HIGH) /* uframes per NAK */ - interval =3D desc->bInterval; - else - interval =3D 0; dir =3D 'B'; /* ctrl is bidirectional */ break; case USB_ENDPOINT_XFER_ISOC: type =3D "Isoc"; - interval =3D 1 << (desc->bInterval - 1); break; case USB_ENDPOINT_XFER_BULK: type =3D "Bulk"; - if (speed =3D=3D USB_SPEED_HIGH && dir =3D=3D 'O') /* uframes per NAK */ - interval =3D desc->bInterval; - else - interval =3D 0; break; case USB_ENDPOINT_XFER_INT: type =3D "Int."; - if (speed =3D=3D USB_SPEED_HIGH || speed >=3D USB_SPEED_SUPER) - interval =3D 1 << (desc->bInterval - 1); - else - interval =3D desc->bInterval; break; default: /* "can't happen" */ return start; } - interval *=3D (speed =3D=3D USB_SPEED_HIGH || - speed >=3D USB_SPEED_SUPER) ? 125 : 1000; - if (interval % 1000) + + interval =3D usb_decode_interval(desc, speed); + if (interval % 1000) { unit =3D 'u'; - else { + } else { unit =3D 'm'; interval /=3D 1000; } diff --git a/drivers/usb/core/endpoint.c b/drivers/usb/core/endpoint.c index 1c2c04079676..fc3341f2bb61 100644 --- a/drivers/usb/core/endpoint.c +++ b/drivers/usb/core/endpoint.c @@ -84,40 +84,13 @@ static ssize_t interval_show(struct device *dev, struct= device_attribute *attr, char *buf) { struct ep_device *ep =3D to_ep_device(dev); + unsigned int interval; char unit; - unsigned interval =3D 0; - unsigned in; =20 - in =3D (ep->desc->bEndpointAddress & USB_DIR_IN); - - switch (usb_endpoint_type(ep->desc)) { - case USB_ENDPOINT_XFER_CONTROL: - if (ep->udev->speed =3D=3D USB_SPEED_HIGH) - /* uframes per NAK */ - interval =3D ep->desc->bInterval; - break; - - case USB_ENDPOINT_XFER_ISOC: - interval =3D 1 << (ep->desc->bInterval - 1); - break; - - case USB_ENDPOINT_XFER_BULK: - if (ep->udev->speed =3D=3D USB_SPEED_HIGH && !in) - /* uframes per NAK */ - interval =3D ep->desc->bInterval; - break; - - case USB_ENDPOINT_XFER_INT: - if (ep->udev->speed =3D=3D USB_SPEED_HIGH) - interval =3D 1 << (ep->desc->bInterval - 1); - else - interval =3D ep->desc->bInterval; - break; - } - interval *=3D (ep->udev->speed =3D=3D USB_SPEED_HIGH) ? 125 : 1000; - if (interval % 1000) + interval =3D usb_decode_interval(ep->desc, ep->udev->speed); + if (interval % 1000) { unit =3D 'u'; - else { + } else { unit =3D 'm'; interval /=3D 1000; } diff --git a/include/linux/usb/ch9.h b/include/linux/usb/ch9.h index abdd310c77f0..74debc824645 100644 --- a/include/linux/usb/ch9.h +++ b/include/linux/usb/ch9.h @@ -90,6 +90,9 @@ extern enum usb_ssp_rate usb_get_maximum_ssp_rate(struct = device *dev); */ extern const char *usb_state_string(enum usb_device_state state); =20 +unsigned int usb_decode_interval(const struct usb_endpoint_descriptor *epd, + enum usb_device_speed speed); + #ifdef CONFIG_TRACING /** * usb_decode_ctrl - Returns human readable representation of control requ= est. --=20 2.35.1