From nobody Sun Apr 30 06:58:09 2023 X-Original-To: dev-commits-src-branches@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 4Q8HH54fk7z48sMQ; Sun, 30 Apr 2023 06:58:09 +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 "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Q8HH51h1Lz3NTR; Sun, 30 Apr 2023 06:58:09 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1682837889; 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=rOz8NHIOk6xK5jo5zF9WOUNZ7pucYq0ay2z6hXO5bAE=; b=lW4ZOui1MTT7wa7TLQlUGswkhJPS3C4sTJoJ3GCvDVUK6ubA6bD86OaGWRPZvsykwuYnP8 zLxY30aqTzUG/jLAyiuroz+KWe7HF68BW5tPM/Hd+r7RLD6gylER95G9TxSnNzRuqwChZz ysQdwKzIxTgvM+i3pHnsDBxRQTXAUtK6iqSmmXmWLpMMmHDfTOG6LT+sYLZJ4Jbmo9MEhP l2dRc80D8hrUYjs0NRYBQHyaKFTnTk5XNDrFMyTSVakndHwkGynOt8YTVN8n97ICk9UOFP NXFhvy42Q13STySW0kAnz7BPuDzT1d9U3oaM7civsY4ZrrSUBjo2CiOkluyMSA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1682837889; 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=rOz8NHIOk6xK5jo5zF9WOUNZ7pucYq0ay2z6hXO5bAE=; b=pzbZHudiGy1AdwJXuxBjO7FgQ65OzVa4gu8wqBsu85uJ4vzm4qOcheCmQzxvTG3GRYTj0b 6yv4ivRog2tvpEgDxe5f2MD+fbqAuponAkeJ0hCOQnoOvaeYbEl2t61c5iYJklUDknv37+ rLdPkEzb5yadLJcWVxUeNhamjZZDiS8TF3JzMpsCwOKnG/54uil8JFczJq+3ziak6W0gVV FfWO3Rj0ZYYMcFcXOWaOzQytgmqqvsbf5VPAyKgBCOba6r33iV1O0ibU/pKDE/edD6qPXS DbnLorq9tRZImVjCiJksP6IlHXMeoequUSUj3Mn1dOaPGg2iU8ugy9TrLob0wg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1682837889; a=rsa-sha256; cv=none; b=mBvI1QLXg1EopD1K/KcgqmmzzKYC16zK6B5SgabCmuD3B6M1SDttmVDLJv1U8yq4I0FFZZ uomH8/ZsvdyG9uArXWB2r+2vZH8+P/IPNd8dP5W8LvYy992fDLOJHYflLZtAPxnKkZbjVV ughUAoYnKLJb06MFuqh7XvK5o5lr9gtuKKDvLuRQNUm9IzfJWwbcDs+ZV7uvTZ75rf+kMm KP+UpN737MhuzQDihhmyvnwjY/w4Oqc4iqBqfsZYD6omJ/WNu051Ha7p9Hn4uA3GEJovfD w1TKydPG/T9KqBUooAwavRMOynnjYzboqOMupeVBw2F1XUE3hoyL+pPNaS44AA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (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 did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4Q8HH50mkqzDhT; Sun, 30 Apr 2023 06:58:09 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 33U6w9b6071828; Sun, 30 Apr 2023 06:58:09 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 33U6w9Qn071827; Sun, 30 Apr 2023 06:58:09 GMT (envelope-from git) Date: Sun, 30 Apr 2023 06:58:09 GMT Message-Id: <202304300658.33U6w9Qn071827@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Hans Petter Selasky Subject: git: fbedcad985b5 - stable/13 - Implement an API for sending a zero-length-packet. The purpose of such a USB packet is to toggle the binary packet counter for USB 1.0/2.0 protocols, without sending any data, so that the first packet sent after opening a USB BULK endpoint doesn't get lost. This is for devices not supporting the USB standard defined clear-stall handling. List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-branches@freebsd.org X-BeenThere: dev-commits-src-branches@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: hselasky X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: fbedcad985b52481991636a26409d6f55660a3f0 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by hselasky: URL: https://cgit.FreeBSD.org/src/commit/?id=fbedcad985b52481991636a26409d6f55660a3f0 commit fbedcad985b52481991636a26409d6f55660a3f0 Author: Hans Petter Selasky AuthorDate: 2021-07-06 10:29:57 +0000 Commit: Hans Petter Selasky CommitDate: 2023-04-30 06:56:18 +0000 Implement an API for sending a zero-length-packet. The purpose of such a USB packet is to toggle the binary packet counter for USB 1.0/2.0 protocols, without sending any data, so that the first packet sent after opening a USB BULK endpoint doesn't get lost. This is for devices not supporting the USB standard defined clear-stall handling. Tested by: jmg Sponsored by: NVIDIA Networking (cherry picked from commit f83f5d58394db57576bbed6dc7531997cabeb102) (cherry picked from commit ec97e9ca1fa543a4a803e84706564d41cd492065) --- sys/dev/usb/usb_transfer.c | 59 +++++++++++++++++++++++++++++++++++++++++++--- sys/dev/usb/usbdi.h | 3 +++ 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/sys/dev/usb/usb_transfer.c b/sys/dev/usb/usb_transfer.c index 455b23e2c306..20ed2c897aac 100644 --- a/sys/dev/usb/usb_transfer.c +++ b/sys/dev/usb/usb_transfer.c @@ -2,7 +2,7 @@ /*- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD * - * Copyright (c) 2008 Hans Petter Selasky. All rights reserved. + * Copyright (c) 2008-2021 Hans Petter Selasky. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -2689,6 +2689,61 @@ usbd_transfer_start_cb(void *arg) } } +/*------------------------------------------------------------------------* + * usbd_xfer_set_zlp + * + * This function sets the USB transfers ZLP flag. + *------------------------------------------------------------------------*/ +void +usbd_xfer_set_zlp(struct usb_xfer *xfer) +{ + if (xfer == NULL) { + /* tearing down */ + return; + } + USB_XFER_LOCK_ASSERT(xfer, MA_OWNED); + + /* avoid any races by locking the USB mutex */ + USB_BUS_LOCK(xfer->xroot->bus); + xfer->flags.send_zlp = 1; + USB_BUS_UNLOCK(xfer->xroot->bus); +} + +/*------------------------------------------------------------------------* + * usbd_xfer_get_and_clr_zlp + * + * This function gets and clears the USB transfers ZLP flag and + * queues a zero-length USB transfer if the flag was set. + *------------------------------------------------------------------------*/ +uint8_t +usbd_xfer_get_and_clr_zlp(struct usb_xfer *xfer) +{ + uint8_t retval; + + if (xfer == NULL) { + /* tearing down */ + return (0); + } + USB_XFER_LOCK_ASSERT(xfer, MA_OWNED); + + retval = xfer->flags.send_zlp; + + if (retval != 0) { + DPRINTFN(1, "Sending zero-length packet.\n"); + + /* avoid any races by locking the USB mutex */ + USB_BUS_LOCK(xfer->xroot->bus); + xfer->flags.send_zlp = 0; + USB_BUS_UNLOCK(xfer->xroot->bus); + + /* queue up a zero-length packet */ + usbd_xfer_set_frame_len(xfer, 0, 0); + usbd_xfer_set_frames(xfer, 1); + usbd_transfer_submit(xfer); + } + return (retval); +} + /*------------------------------------------------------------------------* * usbd_xfer_set_stall * @@ -2733,9 +2788,7 @@ usbd_transfer_clear_stall(struct usb_xfer *xfer) /* avoid any races by locking the USB mutex */ USB_BUS_LOCK(xfer->xroot->bus); - xfer->flags.stall_pipe = 0; - USB_BUS_UNLOCK(xfer->xroot->bus); } diff --git a/sys/dev/usb/usbdi.h b/sys/dev/usb/usbdi.h index 1b3b4af5f717..287e40d59364 100644 --- a/sys/dev/usb/usbdi.h +++ b/sys/dev/usb/usbdi.h @@ -218,6 +218,7 @@ struct usb_xfer_flags { * option only has effect for * ISOCHRONOUS transfers. */ + uint8_t send_zlp:1; /* send a zero length packet first */ }; /* @@ -655,6 +656,8 @@ void usbd_xfer_set_frame_len(struct usb_xfer *xfer, usb_frcount_t frindex, usb_frlength_t len); void usbd_xfer_set_timeout(struct usb_xfer *xfer, int timeout); void usbd_xfer_set_frames(struct usb_xfer *xfer, usb_frcount_t n); +void usbd_xfer_set_zlp(struct usb_xfer *xfer); +uint8_t usbd_xfer_get_and_clr_zlp(struct usb_xfer *xfer); void usbd_xfer_set_stall(struct usb_xfer *xfer); int usbd_xfer_is_stalled(struct usb_xfer *xfer); void usbd_xfer_set_flag(struct usb_xfer *xfer, int flag);