From nobody Sat Jul 25 05:35:00 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 F0D3B3EC695; Fri, 17 Jul 2026 10:26:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784284016; cv=none; b=KvRSggrMwHSyzJpAs7C6RhNs/zdnTFDjSrNUG0Bzf8okNdbLYOhlL96aqqMJi85C9qn942cAv+bHOsJrRyi/A5ewEw/MCtiJSn4b4v6EG2eG4o333SyLfDD/pPjSrvxC851kk0XjWn3/DS86slzRM5kSj2jwzdGn8HIFLXUzSjk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784284016; c=relaxed/simple; bh=2E3lXG0JBurWSULQ9IkGxRiHJCDCZek6DbzpIugD9j8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RMc9BScLFGJbqFiT7fF0VWeKC5yaeMopK/tq7s1GRvxmbqVf+JZLIRJ7BK+nPu30AUnTm2jQ2m5cIjI0J0kFGX9J8alcjZrrxZwaaBjwYnHJQ0ocu8m9tlZJTMkdaTZG3pglKa/RUApTmlL3p+xyVtNpb7BYizA8oaqtTHFC+EY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=dsT3Qbo+; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="dsT3Qbo+" Received: by smtp.kernel.org (Postfix) with ESMTPS id E9770C2BCB8; Fri, 17 Jul 2026 10:26:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1784284013; bh=2E3lXG0JBurWSULQ9IkGxRiHJCDCZek6DbzpIugD9j8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=dsT3Qbo+BvLg44PmOyj4lcopjszxCpdRUakp0h8MrQsfULV83HoIsYBVulKi75jKp IVvq3xENYFBUC0Ne3vZTeI0ZYaW8tEnboQUL/RlPW32w+4oCcLn1V438OfYkeSQ4Sx vgmJAlWhs/Ol8FAakZmLYN/bEgGk4ukm+K/nSxSKzc09XvCi4g7cushIHlhShn9Gre 0HeRU7HkG5YTEM/kX1prYMVI5myqHn1woNIcaPN+7kdxJPPpRFA5gZbrd6YNsnIbQk 7mHlW8cVPl/LW//uWsLDDjjEJRcXnt5Uurj5xlTogZELbDYNZXHH/tEXu/2iIR1Q0F J5LY3s+uCRX/g== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id CA0ECC44516; Fri, 17 Jul 2026 10:26:53 +0000 (UTC) From: Pawel Laszczak via B4 Relay Date: Fri, 17 Jul 2026 12:44:14 +0200 Subject: [PATCH 1/3] usb: xhci: Add support for eUSB2v2 1024-byte bulk packet size 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: <20260717-eusb2v2-packet-size-v1-1-67c611bd0c5b@cadence.com> References: <20260717-eusb2v2-packet-size-v1-0-67c611bd0c5b@cadence.com> In-Reply-To: <20260717-eusb2v2-packet-size-v1-0-67c611bd0c5b@cadence.com> To: Greg Kroah-Hartman , Mathias Nyman Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Pawel Laszczak X-Mailer: b4 0.15.1 X-Developer-Signature: v=1; a=ed25519-sha256; t=1784285103; l=6736; i=pawell@cadence.com; h=from:subject:message-id; bh=LTCb4q5/7G6iDHpjLaDdbnS+2jBj5GhRLQszRhvaYEM=; b=iAH3Jy139QeSVFElmQBIxMpji2Sddf36QJL6n89+FneRj355jg3TzP9sIpFR2f/MtOObKYH0E Qzg+8D9qt0kCFq+8C6I0WuC+xDwHvxofgh5TIt+xwA87PMoGpdYJTXW X-Developer-Key: i=pawell@cadence.com; a=ed25519; pk=EUPBvLO9CDg7j6defeDl2iqi+z5Ivqu4Z46aiqe7dYc= X-Endpoint-Received: by B4 Relay for pawell@cadence.com/default with auth_id=707 X-Original-From: Pawel Laszczak Reply-To: pawell@cadence.com From: Pawel Laszczak The eUSB2 v2 specification (bcdUSB 0x0230) introduces support for 1024-byte maximum packet sizes for Bulk endpoints in High-Speed mode. However, an eUSB2v2 peripheral will revert its internal maximum packet size back to 512 bytes after events like a bus reset, disconnect, or deconfiguration. To support 1024-byte bulk transfers on capable hosts, add a new is_eusb2v2 flag to the usb_bus structure, populated via the HCCPARAMS2 E2V2C capability bit in the xHCI driver. When an eUSB2v2 host configures an eUSB2v2 device, issue a specific SET_FEATURE (USB_DEVICE_BULK_MAX_PACKET_UPDATE) request during device configuration to switch the peripheral to 1024-byte packet mode, and allow the xHCI endpoint initialization to accept up to 1024 bytes for HS bulk endpoints. Signed-off-by: Pawel Laszczak --- drivers/usb/core/config.c | 4 ++- drivers/usb/core/message.c | 65 +++++++++++++++++++++++++++++++++++++++++= +++- drivers/usb/host/xhci-mem.c | 18 ++++++++++--- drivers/usb/host/xhci.c | 3 +++ include/linux/usb.h | 4 +++ 5 files changed, 89 insertions(+), 5 deletions(-) diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c index 45e20c6d76c0..0c7ab3f44cd9 100644 --- a/drivers/usb/core/config.c +++ b/drivers/usb/core/config.c @@ -491,7 +491,9 @@ static int usb_parse_endpoint(struct device *ddev, int = cfgno, * be able to handle that particular bug, so let's warn... */ if (udev->speed =3D=3D USB_SPEED_HIGH && usb_endpoint_xfer_bulk(d)) { - if (maxp !=3D 512) + struct usb_hcd *hcd =3D bus_to_hcd(udev->bus); + + if (maxp !=3D 512 && (bcdUSB !=3D 0x230 || !hcd->self.is_eusb2v2)) dev_notice(ddev, "config %d interface %d altsetting %d " "bulk endpoint 0x%X has invalid maxpacket %d\n", cfgno, inum, asnum, d->bEndpointAddress, diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index 75e2bfd744a9..3b4f7aedd381 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c @@ -2007,6 +2007,65 @@ int usb_set_wireless_status(struct usb_interface *if= ace, } EXPORT_SYMBOL_GPL(usb_set_wireless_status); =20 +/* + * eusb_update_max_packet - set or restore max packet size + * @udev: target device + * @cp: if NULL restore MPS to 512 else set 1024 + * + * This request is specific to eUSB2v2. + * An eUSB2v2 peripheral will revert the maximum packet size to 512 + * for bulk endpoints after bus reset, disconnect and deconfiguration. + * This function allows updating the max packet size for BULK endpoints + * to 1024 after above events. + */ +static void eusb_update_max_packet(struct usb_device *udev, struct usb_hos= t_config *cp) +{ + struct usb_host_config *config =3D cp ? cp : udev->actconfig; + struct usb_hcd *hcd =3D bus_to_hcd(udev->bus); + struct usb_interface_cache *intfc; + struct usb_host_interface *alt; + struct usb_host_endpoint *ep; + u16 mps =3D 512; + int i, j, a; + int ret; + + if (le16_to_cpu(udev->descriptor.bcdUSB) !=3D 0x0230 || + !hcd->self.is_eusb2v2) + return; + + if (cp) { + ret =3D usb_control_msg(udev, usb_sndctrlpipe(udev, 0), + USB_REQ_SET_FEATURE, USB_RECIP_DEVICE, + USB_DEVICE_BULK_MAX_PACKET_UPDATE, 0, NULL, 0, + USB_CTRL_SET_TIMEOUT); + if (ret < 0) { + dev_warn(&udev->dev, "eUSB2v2 1KB update failed: %d\n", ret); + return; + } + + mps =3D 1024; + } else if (!udev->actconfig) + return; + + for (i =3D 0; i < config->desc.bNumInterfaces; i++) { + intfc =3D config->intf_cache[i]; + + if (!intfc) + continue; + + for (a =3D 0; a < intfc->num_altsetting; a++) { + alt =3D &intfc->altsetting[a]; + + for (j =3D 0; j < alt->desc.bNumEndpoints; j++) { + ep =3D &alt->endpoint[j]; + + if (usb_endpoint_xfer_bulk(&ep->desc)) + ep->desc.wMaxPacketSize =3D cpu_to_le16(mps); + } + } + } +} + /* * usb_set_configuration - Makes a particular device setting be current * @dev: the device whose configuration is being updated @@ -2120,8 +2179,12 @@ int usb_set_configuration(struct usb_device *dev, in= t configuration) /* if it's already configured, clear out old state first. * getting rid of old interfaces means unbinding their drivers. */ - if (dev->state !=3D USB_STATE_ADDRESS) + if (dev->state !=3D USB_STATE_ADDRESS) { + eusb_update_max_packet(dev, NULL); usb_disable_device(dev, 1); /* Skip ep0 */ + } + + eusb_update_max_packet(dev, cp); =20 /* Get rid of pending async Set-Config requests for this device */ cancel_async_set_config(dev); diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index 997fe90f54e5..a4d3e03f9e14 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c @@ -1479,10 +1479,22 @@ int xhci_endpoint_init(struct xhci_hcd *xhci, /* Allow 3 retries for everything but isoc, set CErr =3D 3 */ if (!usb_endpoint_xfer_isoc(&ep->desc)) err_count =3D 3; - /* HS bulk max packet should be 512, FS bulk supports 8, 16, 32 or 64 */ + + /* + * HS bulk max packet should be 512 (or 1024 for eUSB2v2), + * FS bulk supports 8, 16, 32 or 64. + */ if (usb_endpoint_xfer_bulk(&ep->desc)) { - if (udev->speed =3D=3D USB_SPEED_HIGH) - max_packet =3D 512; + if (udev->speed =3D=3D USB_SPEED_HIGH) { + if (le16_to_cpu(udev->descriptor.bcdUSB) =3D=3D 0x0230 && + xhci->hcc_params2 & HCC2_E2V2C) { + max_packet =3D rounddown_pow_of_two(max_packet); + max_packet =3D clamp_val(max_packet, 512, 1024); + } else { + max_packet =3D 512; + } + } + if (udev->speed =3D=3D USB_SPEED_FULL) { max_packet =3D rounddown_pow_of_two(max_packet); max_packet =3D clamp_val(max_packet, 8, 64); diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index a54f5b57f205..254638dc1e18 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c @@ -5548,6 +5548,9 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quir= ks_t get_quirks) else xhci_hcd_init_usb2_data(xhci, hcd); =20 + if (xhci->hcc_params2 & HCC2_E2V2C) + hcd->self.is_eusb2v2 =3D 1; + xhci_info(xhci, "hcc params 0x%08x hci version 0x%x quirks 0x%016llx\n", xhci->hcc_params, xhci->hci_version, xhci->quirks); =20 diff --git a/include/linux/usb.h b/include/linux/usb.h index 25a203ac7a7e..790c2295aec6 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h @@ -464,6 +464,10 @@ struct usb_bus { * the ep queue on a short transfer * with the URB_SHORT_NOT_OK flag set. */ + unsigned is_eusb2v2:1; /* + * true when HC controller supports + * eusb2v2 + */ unsigned no_sg_constraint:1; /* no sg constraint */ unsigned sg_tablesize; /* 0 or largest number of sg list entries */ =20 --=20 2.43.0 From nobody Sat Jul 25 05:35:00 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 343663ECBC4; Fri, 17 Jul 2026 10:26:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784284016; cv=none; b=NVDL8ccDAI7qpbu57n6bQO94/weiGBUDatceeK+G/CFQxFeUVpl+dbrdK40+CD1PKo3aOHabyGYNUrsCMtt8iEzu+lU0qLwhUVpQCrGHFl4xi4Fv7A3oN/J2UwnOnXdDBBTa06Y5/7PYPJHfbVR6L+IW7cNyugv1daGLCFxxbDw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784284016; c=relaxed/simple; bh=ruGA/S07N+ySzaerz9AV3uF9UjUXHVPnaqN609WVLgE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Zq3ztRJdOd4XDc2vhbaUf6Tthmy/P0tps7cYe7Ia+23P65cQJArnjgCSvzYCTeQlyswQog9cJral1f0+7KKLeNnaWpfYGUIZTcdu2HPx4puScQd2HKhnUxOfKS6M7JSqW8tBhrBvrQLnzZJ8TU21wQ7OZSBmur8OLTrxcK0fbTA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=kKNjjqRP; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="kKNjjqRP" Received: by smtp.kernel.org (Postfix) with ESMTPS id 01FAEC2BCF4; Fri, 17 Jul 2026 10:26:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1784284014; bh=ruGA/S07N+ySzaerz9AV3uF9UjUXHVPnaqN609WVLgE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=kKNjjqRPvLds9QF1NYY+mROjWyPepsHYM6OT54LNMVb6KgskGP1i59kujGR5vvv0Y Q+qKFkcsVzgJFhIDzP+fhqbLcluUT4j/7xIKyIKf3WkwS+0YSgBe0msftjnXkc+8AO hfoQblxyQdXZfV0Hh+Y3UFXbp3vNYm8Od6b60p12y717qr8612DKbTrcjhK6+p8Lwd OoycvwiOkCMo68fXp57K+TcTshMBJp5rCkGR4Dx63ALrfu9s/ln1VnpP1ZXbTQTLjO Kcptocwc5unhq4RJtPLw4v9XM6hSdzHzW1dfcYlJ0V4c5S7L6BHOi5ghXRe0QTWLj0 m0yvUObO8eqHQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id D688CC44507; Fri, 17 Jul 2026 10:26:53 +0000 (UTC) From: Pawel Laszczak via B4 Relay Date: Fri, 17 Jul 2026 12:44:15 +0200 Subject: [PATCH 2/3] usb: gadget: composite: Support eUSB2v2 bulk MPS update request 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: <20260717-eusb2v2-packet-size-v1-2-67c611bd0c5b@cadence.com> References: <20260717-eusb2v2-packet-size-v1-0-67c611bd0c5b@cadence.com> In-Reply-To: <20260717-eusb2v2-packet-size-v1-0-67c611bd0c5b@cadence.com> To: Greg Kroah-Hartman , Mathias Nyman Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Pawel Laszczak X-Mailer: b4 0.15.1 X-Developer-Signature: v=1; a=ed25519-sha256; t=1784285103; l=4930; i=pawell@cadence.com; h=from:subject:message-id; bh=BinsopW6J/BJzPhINKchDQl5qlxVOPT1dCsHQoufo9s=; b=oRplN9glS7CnNkMYW7suoV3GQopKgyXSB/iq9eO1ojSik5QaZ9d/OiPelyBkpH4lVH2LTyj/S qvtbOUejU3/C599lzN7feIVEe5jgGZkEy1ietqklrbsV5AhcSjUH1Du X-Developer-Key: i=pawell@cadence.com; a=ed25519; pk=EUPBvLO9CDg7j6defeDl2iqi+z5Ivqu4Z46aiqe7dYc= X-Endpoint-Received: by B4 Relay for pawell@cadence.com/default with auth_id=707 X-Original-From: Pawel Laszczak Reply-To: pawell@cadence.com From: Pawel Laszczak Add support for eUSB2v2 1024-byte Bulk MPS negotiation to the Gadget Composite framework. If 'gadget->is_eusb2v2' is set, force bcdUSB to 0x0230 and bMaxPacketSize0 to 64 bytes. Handle the USB_DEVICE_BULK_MAX_PACKET_UPDATE feature request by introducing eusb2_update_mps_bulk(), which dynamically updates the wMaxPacketSize of all HS Bulk endpoint descriptors to 1024 bytes before the device is configured. Signed-off-by: Pawel Laszczak --- drivers/usb/gadget/composite.c | 67 ++++++++++++++++++++++++++++++++++++++= ---- include/linux/usb/gadget.h | 2 ++ 2 files changed, 63 insertions(+), 6 deletions(-) diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c index dc3664374596..e009f8c4281c 100644 --- a/drivers/usb/gadget/composite.c +++ b/drivers/usb/gadget/composite.c @@ -924,6 +924,48 @@ static void device_qual(struct usb_composite_dev *cdev) } =20 /*------------------------------------------------------------------------= -*/ +static void eusb2_update_ep_mps(struct usb_descriptor_header *header, __le= 16 mps) +{ + struct usb_endpoint_descriptor *epd; + + if (header->bDescriptorType !=3D USB_DT_ENDPOINT) + return; + + epd =3D (void *)header; + if (usb_endpoint_xfer_bulk(epd)) + epd->wMaxPacketSize =3D mps; +} + +static int eusb2_update_mps_bulk(struct usb_composite_dev *cdev, bool set) +{ + __le16 mps =3D cpu_to_le16(set ? 1024 : 512); + struct usb_gadget *gadget =3D cdev->gadget; + struct usb_configuration *config; + struct usb_function *f; + + if (!gadget->is_eusb2v2) + return -EINVAL; + + if (set && gadget->state >=3D USB_STATE_CONFIGURED) + return -EINVAL; + + list_for_each_entry(config, &cdev->configs, list) { + if (!config->highspeed) + continue; + + list_for_each_entry(f, &config->functions, list) { + struct usb_descriptor_header **desc =3D f->hs_descriptors; + + if (!desc) + continue; + + for (; *desc; desc++) + eusb2_update_ep_mps(*desc, mps); + } + } + + return 0; +} =20 static void reset_config(struct usb_composite_dev *cdev) { @@ -971,8 +1013,10 @@ static int set_config(struct usb_composite_dev *cdev, if (result < 0) goto done; } else { /* Zero configuration value - need to reset the config */ - if (cdev->config) + if (cdev->config) { reset_config(cdev); + eusb2_update_mps_bulk(cdev, false); + } result =3D 0; } =20 @@ -1807,7 +1851,11 @@ composite_setup(struct usb_gadget *gadget, const str= uct usb_ctrlrequest *ctrl) count_configs(cdev, USB_DT_DEVICE); cdev->desc.bMaxPacketSize0 =3D cdev->gadget->ep0->maxpacket; - if (gadget_is_superspeed(gadget)) { + + if (gadget->is_eusb2v2) { + cdev->desc.bcdUSB =3D cpu_to_le16(0x0230); + cdev->desc.bMaxPacketSize0 =3D 64; + } else if (gadget_is_superspeed(gadget)) { if (gadget->speed >=3D USB_SPEED_SUPER) { cdev->desc.bcdUSB =3D cpu_to_le16(0x0320); cdev->desc.bMaxPacketSize0 =3D 9; @@ -2005,12 +2053,18 @@ composite_setup(struct usb_gadget *gadget, const st= ruct usb_ctrlrequest *ctrl) */ case USB_REQ_CLEAR_FEATURE: case USB_REQ_SET_FEATURE: - if (!gadget_is_superspeed(gadget)) - goto unknown; - if (ctrl->bRequestType !=3D (USB_DIR_OUT | USB_RECIP_INTERFACE)) - goto unknown; switch (w_value) { + case USB_DEVICE_BULK_MAX_PACKET_UPDATE: + if (ctrl->bRequestType !=3D (USB_DIR_OUT | USB_RECIP_DEVICE)) + goto unknown; + + value =3D eusb2_update_mps_bulk(cdev, true); + break; case USB_INTRF_FUNC_SUSPEND: + if (!gadget_is_superspeed(gadget)) + goto unknown; + if (ctrl->bRequestType !=3D (USB_DIR_OUT | USB_RECIP_INTERFACE)) + goto unknown; if (!cdev->config || intf >=3D MAX_CONFIG_INTERFACES) break; f =3D cdev->config->interface[intf]; @@ -2303,6 +2357,7 @@ static void __composite_disconnect(struct usb_gadget = *gadget) =20 void composite_disconnect(struct usb_gadget *gadget) { + eusb2_update_mps_bulk(get_gadget_data(gadget), false); usb_gadget_vbus_draw(gadget, 0); __composite_disconnect(gadget); } diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h index 8285b19a25e0..3c554fe95f87 100644 --- a/include/linux/usb/gadget.h +++ b/include/linux/usb/gadget.h @@ -420,6 +420,7 @@ struct usb_gadget_ops { * @wakeup_armed: True if gadget is armed by the host for remote wakeup. * @irq: the interrupt number for device controller. * @id_number: a unique ID number for ensuring that gadget names are disti= nct + * @is_eusb2v2: True if controller is Embedded usb2. * * Gadgets have a mostly-portable "gadget driver" implementing device * functions, handling all usb configurations and interfaces. Gadget @@ -483,6 +484,7 @@ struct usb_gadget { unsigned lpm_capable:1; unsigned wakeup_capable:1; unsigned wakeup_armed:1; + unsigned is_eusb2v2:1; int irq; int id_number; }; --=20 2.43.0 From nobody Sat Jul 25 05:35:00 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 F381F3EC699; Fri, 17 Jul 2026 10:26:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784284016; cv=none; b=lC+4ZngO9x3rWNqZHZfnd9BMf+mBAyjigwMYIWrBTQ6qdUdGX829YnybTcs0HXoc9A2p87Ie9/3iAWhvhFIPpp5N7YsdriiDXLB6QQ6phafv+VYn9uy2wL7AmZYOKv4zzW+kae8BxwlB+ehNwI/8TcvNiG0PCfQTp8Kh/d5ylPk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784284016; c=relaxed/simple; bh=rLEkL3EcByR228mYan/o1Uzk5w8n5u6hAly7AYf2xsA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=N1SfistYkJDQ1ja5V8LvbCYr+esUIbKTVEOiVbzYl8T8TtcsXd3DO9LftXAPClgmOS6kREx77jnbxooueggPU24tWiuncV5DJIfkbwA1S7bykRjIZe+Bm26S/D/HkRGfrcvUgG+I6wlJG0/hwfJy6z6PgOcKXrTqzF9twKcGHaE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=hSIfz5Ty; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="hSIfz5Ty" Received: by smtp.kernel.org (Postfix) with ESMTPS id 076F2C2BCF5; Fri, 17 Jul 2026 10:26:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1784284014; bh=rLEkL3EcByR228mYan/o1Uzk5w8n5u6hAly7AYf2xsA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=hSIfz5Ty3LJ59j85GjIZMD5H/NXAMGJF4jBL7eVp1YdAYdIPTPkAY1J52gBvACJCD 1QNd6SpBP29BOW6N5yrpCUt+a+G2v0a3NX1UgA71SUf3W75KPW6qLIdzp6zlODiQZx Af89/d76uD/85wLCDaW3gqNMitUy7DkQoMKKflrZisj8jjc/7JnqyD+PCSCWls8xvm hVrr8tlgrGZ88792IrM3f6vnuJrEu/TAwDeu/yFD/Da4CSlZ3rXZfXcBWwvzJDrePz tUsvRNQNTUS/gSpY1CLPFz2trCz0EhdsHPgqn6e4aT6CYIPDDgGVZJlZ7tiCoZgiCM OcvmuV3bPzt/w== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id E2188C4451C; Fri, 17 Jul 2026 10:26:53 +0000 (UTC) From: Pawel Laszczak via B4 Relay Date: Fri, 17 Jul 2026 12:44:16 +0200 Subject: [PATCH 3/3] usb: cdns3: cdnsp: Enable eUSB2v2 1KB bulk packet capability 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: <20260717-eusb2v2-packet-size-v1-3-67c611bd0c5b@cadence.com> References: <20260717-eusb2v2-packet-size-v1-0-67c611bd0c5b@cadence.com> In-Reply-To: <20260717-eusb2v2-packet-size-v1-0-67c611bd0c5b@cadence.com> To: Greg Kroah-Hartman , Mathias Nyman Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Pawel Laszczak X-Mailer: b4 0.15.1 X-Developer-Signature: v=1; a=ed25519-sha256; t=1784285103; l=4516; i=pawell@cadence.com; h=from:subject:message-id; bh=/nqvh7s4hA7WGTq4/MDkceuMr0OxBcKZnhuFXpnPw1k=; b=8CRIH2rocJ7CrYtr2uTT6D1ZlYCkgb6OO2jludSh85R9iU79rTwEuwxuwWvf2MMT73ezlqIaR 5E8FTKcTJiEDRVcFTlUilAfW/NppPIAKqfBvelQRsG7ia9AAiXLQYPa X-Developer-Key: i=pawell@cadence.com; a=ed25519; pk=EUPBvLO9CDg7j6defeDl2iqi+z5Ivqu4Z46aiqe7dYc= X-Endpoint-Received: by B4 Relay for pawell@cadence.com/default with auth_id=707 X-Original-From: Pawel Laszczak Reply-To: pawell@cadence.com From: Pawel Laszczak Implement peripheral-side changes in the Cadence (cdnsp) driver to support eUSB2v2 1024-byte Bulk MaxPacketSize. Check the HCC2_E2V2C bit in HCCPARAMS2 during setup and set 'pdev->gadget.is_eusb2v2 =3D 1' if supported. Update cdnsp_endpoint_init() to allow internal max_packet size allocation up to 1024 bytes for HS Bulk endpoints, and delegate the incoming update setup request from ep0 to the composite layer. Signed-off-by: Pawel Laszczak --- drivers/usb/cdns3/cdnsp-ep0.c | 2 ++ drivers/usb/cdns3/cdnsp-gadget.c | 4 ++++ drivers/usb/cdns3/cdnsp-gadget.h | 8 ++++++++ drivers/usb/cdns3/cdnsp-mem.c | 11 +++++++++-- drivers/usb/common/debug.c | 2 ++ 5 files changed, 25 insertions(+), 2 deletions(-) diff --git a/drivers/usb/cdns3/cdnsp-ep0.c b/drivers/usb/cdns3/cdnsp-ep0.c index 5cd9b898ce97..090d20b307ee 100644 --- a/drivers/usb/cdns3/cdnsp-ep0.c +++ b/drivers/usb/cdns3/cdnsp-ep0.c @@ -253,6 +253,8 @@ static int cdnsp_ep0_handle_feature_device(struct cdnsp= _device *pdev, */ cdnsp_enter_test_mode(pdev); break; + case USB_DEVICE_BULK_MAX_PACKET_UPDATE: + return cdnsp_ep0_delegate_req(pdev, ctrl); default: return -EINVAL; } diff --git a/drivers/usb/cdns3/cdnsp-gadget.c b/drivers/usb/cdns3/cdnsp-gad= get.c index a5275c2fb43b..ac1dde43ce1d 100644 --- a/drivers/usb/cdns3/cdnsp-gadget.c +++ b/drivers/usb/cdns3/cdnsp-gadget.c @@ -1853,6 +1853,10 @@ static int cdnsp_gen_setup(struct cdnsp_device *pdev) pdev->hcc_params =3D readl(&pdev->cap_regs->hc_capbase); pdev->hci_version =3D HC_VERSION(pdev->hcc_params); pdev->hcc_params =3D readl(&pdev->cap_regs->hcc_params); + pdev->hcc_params2 =3D readl(&pdev->cap_regs->hcc_params2); + + if (pdev->hcc_params2 & HCC2_E2V2C) + pdev->gadget.is_eusb2v2 =3D 1; =20 /* * Override the APB timeout value to give the controller more time for diff --git a/drivers/usb/cdns3/cdnsp-gadget.h b/drivers/usb/cdns3/cdnsp-gad= get.h index c44bca348a41..75bc3f15bde5 100644 --- a/drivers/usb/cdns3/cdnsp-gadget.h +++ b/drivers/usb/cdns3/cdnsp-gadget.h @@ -89,6 +89,12 @@ struct cdnsp_cap_regs { =20 #define CTX_SIZE(_hcc) (HCC_64BYTE_CONTEXT(_hcc) ? 64 : 32) =20 +/* HCCPARAMS2 - hcc_params2 - bitmasks */ +/* bit 11 - DC support Double BW on a eUSB2 HS ISOC EP */ +#define HCC2_EUSB2_DIC BIT(11) +/* bit 12 - DC support eUSB2V2 capability */ +#define HCC2_E2V2C BIT(12) + /* db_off bitmask - bits 0:1 reserved. */ #define DBOFF_MASK GENMASK(31, 2) =20 @@ -1370,6 +1376,7 @@ struct cdnsp_port { * @rev_cap: Controller Capabilities Registers. * @hcs_params1: Cached register copies of read-only HCSPARAMS1 * @hcc_params: Cached register copies of read-only HCCPARAMS1 + * @hcc_params2: Cached register copies of read-only HCCPARAMS2 * @rtl_revision: Cached controller rtl revision. * @setup: Temporary buffer for setup packet. * @ep0_preq: Internal allocated request used during enumeration. @@ -1425,6 +1432,7 @@ struct cdnsp_device { __u32 hcs_params1; __u32 hcs_params3; __u32 hcc_params; + __u32 hcc_params2; #define RTL_REVISION_NEW_LPM 0x2700 __u32 rtl_revision; /* Lock used in interrupt thread context. */ diff --git a/drivers/usb/cdns3/cdnsp-mem.c b/drivers/usb/cdns3/cdnsp-mem.c index 5d8cdc91927d..62e496e5225e 100644 --- a/drivers/usb/cdns3/cdnsp-mem.c +++ b/drivers/usb/cdns3/cdnsp-mem.c @@ -978,8 +978,15 @@ int cdnsp_endpoint_init(struct cdnsp_device *pdev, if (!usb_endpoint_xfer_isoc(pep->endpoint.desc)) err_count =3D 3; if (usb_endpoint_xfer_bulk(pep->endpoint.desc) && - pdev->gadget.speed =3D=3D USB_SPEED_HIGH) - max_packet =3D 512; + pdev->gadget.speed =3D=3D USB_SPEED_HIGH) { + if (!pdev->gadget.is_eusb2v2) { + max_packet =3D 512; + } else { + max_packet =3D rounddown_pow_of_two(max_packet); + max_packet =3D clamp_val(max_packet, 512, 1024); + } + } + /* Controller spec indicates that ctrl ep avg TRB Length should be 8. */ if (usb_endpoint_xfer_control(pep->endpoint.desc)) avg_trb_len =3D 8; diff --git a/drivers/usb/common/debug.c b/drivers/usb/common/debug.c index f204cec8d380..b9696fae7ef5 100644 --- a/drivers/usb/common/debug.c +++ b/drivers/usb/common/debug.c @@ -46,6 +46,8 @@ static const char *usb_decode_device_feature(u16 wValue) return "U2 Enable"; case USB_DEVICE_LTM_ENABLE: return "LTM Enable"; + case USB_DEVICE_BULK_MAX_PACKET_UPDATE: + return "Bulk mps update"; default: return "UNKNOWN"; } --=20 2.43.0