From nobody Sat Sep 26 14:39:45 2026 Received: from relay1-d.mail.gandi.net (relay1-d.mail.gandi.net [217.70.183.193]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8E5E643991A; Mon, 31 Aug 2026 13:58:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.193 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788184686; cv=none; b=ptBAQ7r29QZebI5crDGZ5A4JYs9PrKWF625qtdcjCybAIvsIJM7RaGCkkR5frbBIxkAC7qIaQkIbZYq9dxQaLmNV5+kbprxDVot3Os1e5HVY1eoe1f7eTy9kLIKmVKvqmZS8FbYCc87frUaMKYteVu2CwNY/Zvjr8U+Q6IvStfg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788184686; c=relaxed/simple; bh=5x6eyZL3KeacQRtY502kcsA7e2/9nrjI9oWpDKZdl6c=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=O0P39WG+34/N+M+hwzeo6Dx/42oJ/VGj9NFWEMxAjvNjCRM811r+EiPTH/44xArSoTCxbmgwNAgWSft4nAeOf6xYo8fE+oCkECxM41vZk0OwKyi6BT2p2aRs4bHsNggbApMuBXRoF6kORZzE5CVOEdLySAcHl3wLchR9Pwt0uFg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=marmottus.net; spf=pass smtp.mailfrom=marmottus.net; dkim=pass (2048-bit key) header.d=marmottus.net header.i=@marmottus.net header.b=nUXYRNfK; arc=none smtp.client-ip=217.70.183.193 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=marmottus.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=marmottus.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=marmottus.net header.i=@marmottus.net header.b="nUXYRNfK" Received: by mail.gandi.net (Postfix) with ESMTPSA id 4EC503ECDF; Mon, 31 Aug 2026 13:57:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marmottus.net; s=gm1; t=1788184676; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=/Zgk3FVA8ow3sKZEteLhLW287twMeuC706ojFG3zILk=; b=nUXYRNfKkZIkLf7A0jNKijEZXmd9jBJ3ySBQt4rTVV2qavYanvw3HiD/GON3/RuWXAQhDW SDzb+oT/uHPqj77vRe3innkK3RjCWJf8fxsMcfCwIKgNwhCELtKN0UnKRxaBhzHVfTrieB xi7Ojl0pfs8qLKbD0w0MqzAbUnqJfUzZzrBR8N7ns6xyUvg+hIsX2ACGcniB4qmzTNewXG /VcEOOPIsgoxAurzUyhR65bT2/PmmmnQmastx50x3JheNScaKyuf8vTh1vgIZpgT9KXler FhB928qszbycQzv3uTINLyQnK/mEa4CfSICWbB/U91aA247tPf6nsfo3xq193Q== From: Arthur Crepin Leblond Date: Mon, 31 Aug 2026 15:57:22 +0200 Subject: [PATCH v4 1/2] usb: gadget: f_hid: allow setting different interval for each speed Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260831-usb_hid_interval-v4-1-609394103dcb@marmottus.net> References: <20260831-usb_hid_interval-v4-0-609394103dcb@marmottus.net> In-Reply-To: <20260831-usb_hid_interval-v4-0-609394103dcb@marmottus.net> To: linux-usb@vger.kernel.org Cc: Krishna Kurapati , Ben Hoff , Greg Kroah-Hartman , linux-kernel@vger.kernel.org, Arthur Crepin Leblond X-Mailer: b4 0.15.2 X-GND-Sasl: arthur@marmottus.net X-GND-State: clean X-GND-Score: -100 X-GND-Cause: dmFkZTFGg+hKjD0JXmpjNOBP/ePK88mvn/SjcjXCDdSuo/VAARZow+WKvzvMMsroPir72nQUJgR7IJU2IpUAhDasXpZJfdGK/zcy/WaEC3Iw4CQ0nCkvh59/vx1orKJHBiDXmX3qhyaaj/CnGz1csKmSpgXJO/yEswl0sVaDkJGiu6My6IWdR699q+WvsZSFTgpKbcafv6/BXWjDcMFihRJnkPBt759SGKSvjS/pI3p7e847jEE5v2COUyVjQQzeu8EPz1WnTsHg9fDLFNjLfBjrRRUaYb61dUiA5bhQgQcFx6diV/mnRgDbzmAneZE0xvu6zarqL1LED2VfJaPuWMO2svwsDeHLbcdGTCRawpi7TsJOiONfDE8qYQcY8petoJfpUHDaFth8CDqnp/I7IFRMtrVHWlAFNoRZNEj5V3KABDJSGWRB0VDuEDJHS0Ji8yFhbDMsxknRagPCFlP4rQqIh7BfuUuGTKkwFGid0E6BMXxJqQpSKz9p0sZL2qMVZCau/e/P9tLykbqAT09yBfQ21YUwQ5hO7ekNy8BDTLX7ePL0b9ZgLQgQqv9UUD94aUNUMdw6tL/9gL728Dnnlk9hHw5/XRCWayZEKlVKbdiiGcVSZUyPBWjSBtZwLgR/NcKdk9tZ24RGRVUHQJ52qxnDedRGBHHK+W5/czpih8LPwGxH5A The HID polling interval unit depends on the USB speed: - Full speed: the units are in milliseconds - High/Super speed: the units are in micro-frames of 0.125ms Exposing directly the bInterval means that the user needs to know which speed is currently in use and has to convert it accordingly. The solution is to expose the interval for each speed: - interval_fs: bInterval for full-speed - interval_hs: bInterval for high-speed - interval_ss: bInterval for super-speed - interval: legacy attribute that takes precedence over the per-speed attributes and sets the same bInterval for each speed to keep backward compatibility. Signed-off-by: Arthur Crepin Leblond --- drivers/usb/gadget/function/f_hid.c | 194 ++++++++++++++++++++++----------= ---- drivers/usb/gadget/function/u_hid.h | 9 +- 2 files changed, 125 insertions(+), 78 deletions(-) diff --git a/drivers/usb/gadget/function/f_hid.c b/drivers/usb/gadget/funct= ion/f_hid.c index 3c6b43d06a6d..689253f5b0c0 100644 --- a/drivers/usb/gadget/function/f_hid.c +++ b/drivers/usb/gadget/function/f_hid.c @@ -30,6 +30,11 @@ */ #define GET_REPORT_TIMEOUT_MS 2500 =20 +/* Default bInterval values */ +#define HIDG_DEFAULT_FS_BINTERVAL 10 +#define HIDG_DEFAULT_HS_BINTERVAL 4 +#define HIDG_DEFAULT_SS_BINTERVAL 4 + static int major, minors; =20 static const struct class hidg_class =3D { @@ -63,7 +68,9 @@ struct f_hidg { char *report_desc; unsigned short report_length; unsigned char interval; - bool interval_user_set; + struct f_hid_opt_interval interval_fs; + struct f_hid_opt_interval interval_hs; + struct f_hid_opt_interval interval_ss; =20 /* * use_out_ep - if true, the OUT Endpoint (interrupt out method) @@ -1204,16 +1211,24 @@ static int hidg_bind(struct usb_configuration *c, s= truct usb_function *f) hidg_fs_in_ep_desc.wMaxPacketSize =3D cpu_to_le16(hidg->report_length); hidg_ss_out_ep_desc.wMaxPacketSize =3D cpu_to_le16(hidg->report_length); =20 - /* IN endpoints: FS default=3D10ms, HS default=3D4=C2=B5-frame; user over= ride if set */ - if (!hidg->interval_user_set) { - hidg_fs_in_ep_desc.bInterval =3D 10; - hidg_hs_in_ep_desc.bInterval =3D 4; - hidg_ss_in_ep_desc.bInterval =3D 4; - } else { - hidg_fs_in_ep_desc.bInterval =3D hidg->interval; - hidg_hs_in_ep_desc.bInterval =3D hidg->interval; - hidg_ss_in_ep_desc.bInterval =3D hidg->interval; - } + /* IN endpoints: set defaults unless user set */ + if (hidg->interval_fs.user_set) + hidg_fs_in_ep_desc.bInterval =3D hidg->interval_fs.value; + else + hidg_fs_in_ep_desc.bInterval =3D + HIDG_DEFAULT_FS_BINTERVAL; + + if (hidg->interval_hs.user_set) + hidg_hs_in_ep_desc.bInterval =3D hidg->interval_hs.value; + else + hidg_hs_in_ep_desc.bInterval =3D + HIDG_DEFAULT_HS_BINTERVAL; + + if (hidg->interval_ss.user_set) + hidg_ss_in_ep_desc.bInterval =3D hidg->interval_ss.value; + else + hidg_ss_in_ep_desc.bInterval =3D + HIDG_DEFAULT_SS_BINTERVAL; =20 hidg_ss_out_comp_desc.wBytesPerInterval =3D cpu_to_le16(hidg->report_length); @@ -1238,16 +1253,28 @@ static int hidg_bind(struct usb_configuration *c, s= truct usb_function *f) hidg_fs_out_ep_desc.bEndpointAddress; =20 if (hidg->use_out_ep) { - /* OUT endpoints: same defaults (FS=3D10, HS=3D4) unless user set */ - if (!hidg->interval_user_set) { - hidg_fs_out_ep_desc.bInterval =3D 10; - hidg_hs_out_ep_desc.bInterval =3D 4; - hidg_ss_out_ep_desc.bInterval =3D 4; - } else { - hidg_fs_out_ep_desc.bInterval =3D hidg->interval; - hidg_hs_out_ep_desc.bInterval =3D hidg->interval; - hidg_ss_out_ep_desc.bInterval =3D hidg->interval; - } + /* OUT endpoints: set defaults unless user set */ + if (hidg->interval_fs.user_set) + hidg_fs_out_ep_desc.bInterval =3D + hidg->interval_fs.value; + else + hidg_fs_out_ep_desc.bInterval =3D + HIDG_DEFAULT_FS_BINTERVAL; + + if (hidg->interval_hs.user_set) + hidg_hs_out_ep_desc.bInterval =3D + hidg->interval_hs.value; + else + hidg_hs_out_ep_desc.bInterval =3D + HIDG_DEFAULT_HS_BINTERVAL; + + if (hidg->interval_ss.user_set) + hidg_ss_out_ep_desc.bInterval =3D + hidg->interval_ss.value; + else + hidg_ss_out_ep_desc.bInterval =3D + HIDG_DEFAULT_SS_BINTERVAL; + status =3D usb_assign_descriptors(f, hidg_fs_descriptors_intout, hidg_hs_descriptors_intout, @@ -1334,14 +1361,17 @@ static const struct configfs_item_operations hidg_i= tem_ops =3D { .release =3D hid_attr_release, }; =20 -#define F_HID_OPT(name, prec, limit) \ -static ssize_t f_hid_opts_##name##_show(struct config_item *item, char *pa= ge)\ +#define F_HID_OPT_U(name, prec, limit) \ +static ssize_t f_hid_opts_##name##_show(struct config_item *item, \ + char *page) \ { \ struct f_hid_opts *opts =3D to_f_hid_opts(item); \ int result; \ + u##prec value; \ \ mutex_lock(&opts->lock); \ - result =3D sprintf(page, "%d\n", opts->name); \ + value =3D get_hid_opt_##name(opts); \ + result =3D sysfs_emit(page, "%d\n", value); \ mutex_unlock(&opts->lock); \ \ return result; \ @@ -1368,7 +1398,7 @@ static ssize_t f_hid_opts_##name##_store(struct confi= g_item *item, \ ret =3D -EINVAL; \ goto end; \ } \ - opts->name =3D num; \ + set_hid_opt_##name(opts, num); \ ret =3D len; \ \ end: \ @@ -1378,11 +1408,54 @@ end: \ \ CONFIGFS_ATTR(f_hid_opts_, name) =20 +#define F_HID_OPT(name, prec, limit) \ +static void set_hid_opt_##name(struct f_hid_opts *opts, u##prec val) \ +{ \ + opts->name =3D val; \ +} \ +static u##prec get_hid_opt_##name(struct f_hid_opts *opts) \ +{ \ + return opts->name; \ +} \ +F_HID_OPT_U(name, prec, limit) + +#define F_HID_OPT_INTERVAL(name) \ +static void set_hid_opt_##name(struct f_hid_opts *opts, u8 val) \ +{ \ + opts->name.value =3D val; \ + opts->name.user_set =3D true; \ +} \ +static u8 get_hid_opt_##name(struct f_hid_opts *opts) \ +{ \ + return opts->name.value; \ +} \ +F_HID_OPT_U(name, 8, 255) + F_HID_OPT(subclass, 8, 255); F_HID_OPT(protocol, 8, 255); F_HID_OPT(no_out_endpoint, 8, 1); F_HID_OPT(report_length, 16, 65535); =20 +F_HID_OPT_INTERVAL(interval_fs); +F_HID_OPT_INTERVAL(interval_hs); +F_HID_OPT_INTERVAL(interval_ss); + +static void set_hid_opt_interval(struct f_hid_opts *opts, u8 val) +{ + set_hid_opt_interval_fs(opts, val); + set_hid_opt_interval_hs(opts, val); + set_hid_opt_interval_ss(opts, val); + + opts->interval =3D val; +} + +static u8 get_hid_opt_interval(struct f_hid_opts *opts) +{ + return opts->interval; +} + +F_HID_OPT_U(interval, 8, 255); + static ssize_t f_hid_opts_report_desc_show(struct config_item *item, char = *page) { struct f_hid_opts *opts =3D to_f_hid_opts(item); @@ -1428,58 +1501,11 @@ static ssize_t f_hid_opts_report_desc_store(struct = config_item *item, =20 CONFIGFS_ATTR(f_hid_opts_, report_desc); =20 -static ssize_t f_hid_opts_interval_show(struct config_item *item, char *pa= ge) -{ - struct f_hid_opts *opts =3D to_f_hid_opts(item); - int result; - - mutex_lock(&opts->lock); - result =3D sprintf(page, "%d\n", opts->interval); - mutex_unlock(&opts->lock); - - return result; -} - -static ssize_t f_hid_opts_interval_store(struct config_item *item, - const char *page, size_t len) -{ - struct f_hid_opts *opts =3D to_f_hid_opts(item); - int ret; - unsigned int tmp; - - mutex_lock(&opts->lock); - if (opts->refcnt) { - ret =3D -EBUSY; - goto end; - } - - /* parse into a wider type first */ - ret =3D kstrtouint(page, 0, &tmp); - if (ret) - goto end; - - /* range-check against unsigned char max */ - if (tmp > 255) { - ret =3D -EINVAL; - goto end; - } - - opts->interval =3D (unsigned char)tmp; - opts->interval_user_set =3D true; - ret =3D len; - -end: - mutex_unlock(&opts->lock); - return ret; -} - -CONFIGFS_ATTR(f_hid_opts_, interval); - static ssize_t f_hid_opts_dev_show(struct config_item *item, char *page) { struct f_hid_opts *opts =3D to_f_hid_opts(item); =20 - return sprintf(page, "%d:%d\n", major, opts->minor); + return sysfs_emit(page, "%d:%d\n", major, opts->minor); } =20 CONFIGFS_ATTR_RO(f_hid_opts_, dev); @@ -1490,6 +1516,9 @@ static struct configfs_attribute *hid_attrs[] =3D { &f_hid_opts_attr_no_out_endpoint, &f_hid_opts_attr_report_length, &f_hid_opts_attr_interval, + &f_hid_opts_attr_interval_hs, + &f_hid_opts_attr_interval_fs, + &f_hid_opts_attr_interval_ss, &f_hid_opts_attr_report_desc, &f_hid_opts_attr_dev, NULL, @@ -1537,8 +1566,13 @@ static struct usb_function_instance *hidg_alloc_inst= (void) return ERR_PTR(-ENOMEM); mutex_init(&opts->lock); =20 - opts->interval =3D 4; - opts->interval_user_set =3D false; + opts->interval =3D HIDG_DEFAULT_HS_BINTERVAL; + opts->interval_fs.value =3D HIDG_DEFAULT_FS_BINTERVAL; + opts->interval_fs.user_set =3D false; + opts->interval_hs.value =3D HIDG_DEFAULT_HS_BINTERVAL; + opts->interval_hs.user_set =3D false; + opts->interval_ss.value =3D HIDG_DEFAULT_SS_BINTERVAL; + opts->interval_ss.user_set =3D false; =20 opts->func_inst.free_func_inst =3D hidg_free_inst; ret =3D &opts->func_inst; @@ -1628,8 +1662,14 @@ static struct usb_function *hidg_alloc(struct usb_fu= nction_instance *fi) hidg->bInterfaceProtocol =3D opts->protocol; hidg->report_length =3D opts->report_length; hidg->report_desc_length =3D opts->report_desc_length; - hidg->interval =3D opts->interval; - hidg->interval_user_set =3D opts->interval_user_set; + + hidg->interval_fs.value =3D opts->interval_fs.value; + hidg->interval_fs.user_set =3D opts->interval_fs.user_set; + hidg->interval_hs.value =3D opts->interval_hs.value; + hidg->interval_hs.user_set =3D opts->interval_hs.user_set; + hidg->interval_ss.value =3D opts->interval_ss.value; + hidg->interval_ss.user_set =3D opts->interval_ss.user_set; + if (opts->report_desc) { hidg->report_desc =3D kmemdup(opts->report_desc, opts->report_desc_length, diff --git a/drivers/usb/gadget/function/u_hid.h b/drivers/usb/gadget/funct= ion/u_hid.h index a9ed9720caee..e666cd9968eb 100644 --- a/drivers/usb/gadget/function/u_hid.h +++ b/drivers/usb/gadget/function/u_hid.h @@ -15,6 +15,11 @@ =20 #include =20 +struct f_hid_opt_interval { + unsigned char value; + bool user_set; +}; + struct f_hid_opts { struct usb_function_instance func_inst; int minor; @@ -26,7 +31,9 @@ struct f_hid_opts { unsigned char *report_desc; bool report_desc_alloc; unsigned char interval; - bool interval_user_set; + struct f_hid_opt_interval interval_fs; + struct f_hid_opt_interval interval_hs; + struct f_hid_opt_interval interval_ss; =20 /* * Protect the data form concurrent access by read/write --=20 2.55.0 From nobody Sat Sep 26 14:39:45 2026 Received: from relay1-d.mail.gandi.net (relay1-d.mail.gandi.net [217.70.183.193]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 88899430314; Mon, 31 Aug 2026 13:58:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.193 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788184687; cv=none; b=M9VIByl+d9cBjzQc5QtTeF6+atkbci9Qn6yiDSRiGGCISIpvHveIA2B4EwNbLAgXTjHRAtD49i7S4tgG/y4dseahkrUgEN5U6N0fF73R3Gqhp30PCkRErC5TQVF5t+SGV5uwSqS4Wj1YhU3zcm5WmLhA+8V63YOuigOUsrKKVVo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788184687; c=relaxed/simple; bh=uwNRHe9oEdd+Az66CwMiY13D7DzYIBVF+4Bk6egNFm8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ZLyDvjeU2vidIrnXggzyy1NtZFu5ps5R8icGfFp+NJKc+O+8+ItUqW7ah7SQmbKeVAV67ac3rFlFLOlv5/KOxxDi5Vfcpuio/7eqkW8E3szNiVa0b9fu5kQW3Zv4WyJkvYI1raKwkiCc+uzqhZMSKqp2m9O4lJncneD8DL7vZi0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=marmottus.net; spf=pass smtp.mailfrom=marmottus.net; dkim=pass (2048-bit key) header.d=marmottus.net header.i=@marmottus.net header.b=QYahQhw+; arc=none smtp.client-ip=217.70.183.193 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=marmottus.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=marmottus.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=marmottus.net header.i=@marmottus.net header.b="QYahQhw+" Received: by mail.gandi.net (Postfix) with ESMTPSA id 50DAE3EC13; Mon, 31 Aug 2026 13:57:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marmottus.net; s=gm1; t=1788184677; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=qwQ77NLJdaDzor+bfxnMka8nUJ89yrwzWWtXG8TTC3c=; b=QYahQhw+8EwR3D6iqj1IGM5giLPVBLJIiY6QUZ3pZdkWHVSvvKp3iGuusMnQlmOJGWUSWQ E+0b+4eNU4KaNQNiMhTOTbxZwAmv8mOV/TnY3yioDbeNWE3HWnfVxFr+0hd4YVENPvIF4F J31lA+IH7kzSwVwc8JADDHl3lH2lnsOFfmE3MIT2mkGGtKyIxJfpB26Dh8FYdV6iBC+rVH CoJHUkJO+XB5yWEw4Pj65ORSiPYwWZwbxJqyrXVnwOB1gAM3p6WbaU1WR77GjIwGQYHurP KXDPh64VwJEEHRS8YvA9QBU5XwhmWvUS2yg+2NDnSdW7OfP4t3ZFd9vz91bbow== From: Arthur Crepin Leblond Date: Mon, 31 Aug 2026 15:57:23 +0200 Subject: [PATCH v4 2/2] docs: ABI: testing: document hid interval attributes Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260831-usb_hid_interval-v4-2-609394103dcb@marmottus.net> References: <20260831-usb_hid_interval-v4-0-609394103dcb@marmottus.net> In-Reply-To: <20260831-usb_hid_interval-v4-0-609394103dcb@marmottus.net> To: linux-usb@vger.kernel.org Cc: Krishna Kurapati , Ben Hoff , Greg Kroah-Hartman , linux-kernel@vger.kernel.org, Arthur Crepin Leblond X-Mailer: b4 0.15.2 X-GND-Sasl: arthur@marmottus.net X-GND-State: clean X-GND-Score: -100 X-GND-Cause: dmFkZTFsjoR8r0nNKrYTLPTkgNDX8KDWXiJDogWGk5/G/nb/gAHu3UKChiJzoPGLsw0cHPBeTRLWMQgv30rpEFRw4if01usPYSWO0+bapokZwe7E+siZGpMCnQkInBCDnU3wEQcFXw7laomBHhUj3+GiYQxSU34Yfh5zhOlBCo8m7Y9H+buN2Woh2OlqX4UPBNIWzocLpdMk9pVQeH7NQMrsHX2iCq5en+/yUyx2H7h7FQnYNIpGj9HsBR73Z3Mpwg3BlXj+PBzWy7D9vhFyi/G3TFOEwzAzRl4qaSkLy1hpzWa3nceIaURZ3kDgUgUklSfU/6gyazj9HYUjzL43DSd/wGLwg1Qd9ncYQGh8hVJ/GIbDI/dT3uuWMBOZzLJt3O9cA09RNqfN8+X9IGTrAdCy4ynOeEY6QkgDJjrYGhR+MObtIuyc0ljQBHXYRNI3KzBRFMABwubKkbIdcC8++5JwnC+b8BlO1M5uQiYDaasy0aW1wEyceHM1TjEdQrUNcuRTMasBGBWnK/pKWBNrozzpDrKRYGIifhv1sK9vVjB1plHfZM48HeLN2ioH37d8GVQ9Fpig02Bvvu39785rc0ucwsW7vSYNyI8n2KS5dKMgTuyk/KIoHHY5xwez2ZTTjdtz24aPpgXBhreXghn9sPZhB+axg2tBDjiS8tii1yVH9rj91Q Add usb gadget hid function interval attributes documentation - interval - interval_fs - interval_hs - interval_ss Signed-off-by: Arthur Crepin Leblond --- Documentation/ABI/testing/configfs-usb-gadget-hid | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Documentation/ABI/testing/configfs-usb-gadget-hid b/Documentat= ion/ABI/testing/configfs-usb-gadget-hid index 748705c4cb58..a889cae15a69 100644 --- a/Documentation/ABI/testing/configfs-usb-gadget-hid +++ b/Documentation/ABI/testing/configfs-usb-gadget-hid @@ -11,3 +11,21 @@ Description: report_length HID report length subclass HID device subclass to use =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D + +What: /config/usb-gadget/gadget/functions/hid.name +Date: Aug 2026 +KernelVersion: 7.4 +Description: + The attributes: + + =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D + interval HID endpoint bInterval for all speeds; if + set, it takes precedence over the per-speed + attributes below + interval_fs HID endpoint bInterval for full-speed + (in milliseconds, default: 10) + interval_hs HID endpoint bInterval for high-speed + (in 125 us units, default: 4) + interval_ss HID endpoint bInterval for super-speed + (in 125 us units, default: 4) + =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D --=20 2.55.0