From nobody Mon Jun 22 13:37:02 2026 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4gkTl35mFWz6hCsM for ; Mon, 22 Jun 2026 13:37:03 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "YR1" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4gkTl30kRdz3w6V for ; Mon, 22 Jun 2026 13:37:03 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1782135423; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=ApRywFIRxGiGvjlEreRHXGQOJlZm0cQrauQUxcDX2uk=; b=OSkyYeNEdzgEUPGDt3WCTOu2poQ3SGTOgAVbhB1QNQIgl4XjIUj1zTljxiFVgopIDkhEkz HgXT8+0lhlY3DLzdNmtR03YhdqLU1mORWyMOk1HYaZcXOAa/h411ftKRoynkYZzWcqH2i+ YMKqGwbE2hbGcVDfaH8x4OoZNddY7B6lGZ9MkPAW8CYCUjXBz1tDaHlOeWzSn5nRlBPebq SIMJlSRZVPaG/8b5gWwCXEP16rz7dHZnzhCZh8b2Llei+bK5/kKZ07p8CePRxG1l57t5cB WR3I1YJRYnR7CBG3ymEsMRfnUYrZOelefoynAsotsApaQn9Syk73J5KhSw8G0Q== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1782135423; a=rsa-sha256; cv=none; b=e2dM/VaqEn3bLbsQnx5DHzEJUjFHMCQYisTIaPQD/QA+arIVLzgMI9PdJpS0A6Oad+5yOk Ihw+vByuWL7N3ipL27AmP4ynwDj6kMEUOvpZhDJbRHgK3z03JhDMytJJqveCfuSN3pZyhK BzzuDmUUyBcoe+TpZ1G5zuv6S7F0AsSVoSl/xAyaLTL8CLxkI4kl8dowqYiUxhrp/r+quN feTAWGww7yAjAzDb+VyhgDcQhW7cmxal2Ahpc45o0aoCrmtwW/7A8cjc7kakhBf1He27Ze li5szt7vchAPK9UpDgYfidut1QlQsDK4AdM715QQ7mMlhpSeGMjZaNQFgA1eOw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1782135423; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=ApRywFIRxGiGvjlEreRHXGQOJlZm0cQrauQUxcDX2uk=; b=JLt5C6bCycsYLM5POSPj++AeqaFS6Tkpx0a+ON3cZQsA15zVv2guoCUNbLkH/D/DlC+XVk ru24WnVWgMvGp0O6LHsT2bg6G7gynO62twyRZj4ESuX2Z6H/L9tEfBhX4XaOwxtVSLAS7A 6PZDF53cuGx5OmYxVl5kEN1A1GBO7UOJznKq5lcRzIBT6m0r3fcT//54YYTQgiVveWKVLZ NtEJWfr/dfFxygNTmLQLE6KVDXtg/wpnPLQWZSsk8gpjSSjuOBvt+o6qbybT1xJa1T7F1W yGPX1502SWj4TMv4RqI5U/qI+HxWX91VGwbUs0qJpM881fsGl/xb2OpRI8wtaQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gkTl26c09zqRx for ; Mon, 22 Jun 2026 13:37:02 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 388fd by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Mon, 22 Jun 2026 13:37:02 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: ShengYi Hung Subject: git: d84b639a684e - main - libusb: implement zlp flag in libusb transfer List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: aokblast X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: d84b639a684e7e0640e7c24a1a6dbc09da4bc3d4 Auto-Submitted: auto-generated Date: Mon, 22 Jun 2026 13:37:02 +0000 Message-Id: <6a393a7e.388fd.67e4c71b@gitrepo.freebsd.org> The branch main has been updated by aokblast: URL: https://cgit.FreeBSD.org/src/commit/?id=d84b639a684e7e0640e7c24a1a6dbc09da4bc3d4 commit d84b639a684e7e0640e7c24a1a6dbc09da4bc3d4 Author: ShengYi Hung AuthorDate: 2025-08-06 12:48:05 +0000 Commit: ShengYi Hung CommitDate: 2026-06-22 13:36:48 +0000 libusb: implement zlp flag in libusb transfer The USB protocol defines a Zero-Length Packet (ZLP) to signal the end of a transfer when the data size is an exact multiple of the Maximum Packet Size (MPS). Without a ZLP in such cases, the device may not be able to determine that the transfer has completed. This flag is added to libusb to allow the user send a ZLP in the end of libusb_xfer. Reviewed by: adrian Sponsored by: The FreeBSD Foundataion Differential Revision: https://reviews.freebsd.org/D51759 --- lib/libusb/libusb.h | 1 + lib/libusb/libusb10.c | 29 ++++++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/lib/libusb/libusb.h b/lib/libusb/libusb.h index b6853879412c..95f7faf900f8 100644 --- a/lib/libusb/libusb.h +++ b/lib/libusb/libusb.h @@ -264,6 +264,7 @@ enum libusb_transfer_flags { LIBUSB_TRANSFER_SHORT_NOT_OK = 1 << 0, LIBUSB_TRANSFER_FREE_BUFFER = 1 << 1, LIBUSB_TRANSFER_FREE_TRANSFER = 1 << 2, + LIBUSB_TRANSFER_ADD_ZERO_PACKET = 1 << 3, }; enum libusb_log_level { diff --git a/lib/libusb/libusb10.c b/lib/libusb/libusb10.c index ab92c219409a..bd3c25c0f052 100644 --- a/lib/libusb/libusb10.c +++ b/lib/libusb/libusb10.c @@ -1419,6 +1419,7 @@ libusb10_bulk_intr_proxy(struct libusb20_transfer *pxfer) uint32_t actlen; uint8_t status; uint8_t flags; + uint8_t tr_flags; status = libusb20_tr_get_status(pxfer); sxfer = libusb20_tr_get_priv_sc1(pxfer); @@ -1471,6 +1472,20 @@ libusb10_bulk_intr_proxy(struct libusb20_transfer *pxfer) sxfer->curr_data += max_bulk; sxfer->rem_len -= max_bulk; + /* + * When a zero length packet (ZLP) is requested, ask the + * kernel to terminate the last frame of the transfer with + * a short packet. This appends a ZLP when the data length + * is an exact multiple of the maximum packet size. + */ + tr_flags = libusb20_tr_get_flags(pxfer); + if (sxfer->rem_len == 0 && + (flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET)) + tr_flags |= LIBUSB20_TRANSFER_FORCE_SHORT; + else + tr_flags &= ~LIBUSB20_TRANSFER_FORCE_SHORT; + libusb20_tr_set_flags(pxfer, tr_flags); + libusb20_tr_submit(pxfer); /* check if we can fork another USB transfer */ @@ -1710,7 +1725,7 @@ libusb_submit_transfer(struct libusb_transfer *uxfer) struct libusb_super_transfer *sxfer; struct libusb_device *dev; uint8_t endpoint; - int err; + int err, mps; if (uxfer == NULL) return (LIBUSB_ERROR_INVALID_PARAM); @@ -1731,6 +1746,18 @@ libusb_submit_transfer(struct libusb_transfer *uxfer) pxfer0 = libusb10_get_transfer(uxfer->dev_handle, endpoint, 0); pxfer1 = libusb10_get_transfer(uxfer->dev_handle, endpoint, 1); + mps = libusb_get_max_packet_size(dev, endpoint); + + /* + * The ADD_ZERO_PACKET flag only has an effect on host-to-device + * (OUT) transfers whose length is an exact multiple of the maximum + * packet size. Clear it otherwise so the kernel is not asked to + * terminate the transfer with a short packet, see + * libusb10_bulk_intr_proxy(). + */ + if ((uxfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET) && + ((endpoint & LIBUSB_ENDPOINT_IN) || uxfer->length % mps != 0)) + uxfer->flags &= ~LIBUSB_TRANSFER_ADD_ZERO_PACKET; if (pxfer0 == NULL || pxfer1 == NULL) { err = LIBUSB_ERROR_OTHER;