From nobody Mon Mar 09 14:35:48 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 4fV01Q18gvz6Vpkx for ; Mon, 09 Mar 2026 14:35:54 +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 "R12" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4fV01P6Lcsz4G7v for ; Mon, 09 Mar 2026 14:35:53 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1773066953; 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=2Kn/vLr1pPPfIVV0JzVPOEOekTXsJ35WMyK7lABmcCQ=; b=qDvVGADb06ZzQrqpQ8C/uyUj5a1WEwCdA2zldq4DdxGCFyEXugA2fAkbsosJ7g9ITkODiJ Ibl/52hTpo3Kw1aJ3vPHywNeiurH7i07QWpt/mwniKEgSuPSoyNPOomoOCgibMgRhHqmwl SKF5Otr3w82SquOhFCdWE5FBm0NUaUgx/eTKzrh59gQyjqIbQNwWtwfufU+Odn5dUb68qo 4Zq4hblZ2bzftOw7uyp46PdfqwCm6Y127Vk0gN3XECQaadZ2BVC5P4ofL8bTm9GWIxfCIX 1t/NfXVbxX9LvlaD5978Z2hmzOpWbdcP9JTyZU/356huUlxCEE8NoNKKRyVhgA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1773066953; a=rsa-sha256; cv=none; b=AYGHzPagoDCZM2y4EivmDBwQXrDbSHq3HxNCOwt/vQS5hyqlnRZlsuneWpgz956KMi8mmU kyUxckK9jxRkastxbxXU1fxRymh1saqfQkALJXtgqWD9gCsqOYpzANdxFqoE1esVyu1Cbt AU5GPVm4bf9vZ3eNwXv30RfMbfvwY0R92a/O8Twit4NjLhrvvTtZNGTsdEkuMhQTP8KYBs TxW+hBmD+6qQtiuwMEfbxKFrxPbR6gUugiUPkVHKkDyYQ0GV4VHh4Z+/TTLG4Qj20US1+e zFNMTLfzyxwXwT6MDt8mF1C8zirkbw/MaX/Rs0snG0M561yf6VHHwColcV/O0A== 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=1773066953; 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=2Kn/vLr1pPPfIVV0JzVPOEOekTXsJ35WMyK7lABmcCQ=; b=HiShTu5RMsyZ+Tpuiap50pPYJ3XHbKP/DKsYsUowbgknzY0VpgJ0jYT1ZSLBTvF1oicFvv wfuiUunehjjsGf/NmH97EXfBALtBjiJU6Om6tm6BjXlM4UCcXtTOAEeMZ/Ac/jgQATNG6z 1Y/tcWARHIV1q8dGPHsMFMAzBhm+Q797L8XepxWNC7ObYLSbDkg7U5GoV1aPmsbQO+q/jE mlb/5TnS6fIFvNZu2wlwZz7qoicWKR7/sj18j44FRygcZ6npB1yFy75EaEc3JBtpybB9fa dBspPEAG59wAOZPGNJ7rWg7j28ufB9QUV38mafFscWBvZ2FXARs9F7qENu/FSA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4fV01P5cC4zD7g for ; Mon, 09 Mar 2026 14:35:53 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 33ef1 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Mon, 09 Mar 2026 14:35:48 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Bjoern A. Zeeb Subject: git: b4daeded66b5 - main - usb: umass: add SCSIEJECT quirk and fix RTW8821CU_CD (USB mode switch) 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 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: bz X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: b4daeded66b5e950ed8e618d66915b863c2414b1 Auto-Submitted: auto-generated Date: Mon, 09 Mar 2026 14:35:48 +0000 Message-Id: <69aedac4.33ef1.717b7bd3@gitrepo.freebsd.org> The branch main has been updated by bz: URL: https://cgit.FreeBSD.org/src/commit/?id=b4daeded66b5e950ed8e618d66915b863c2414b1 commit b4daeded66b5e950ed8e618d66915b863c2414b1 Author: Bjoern A. Zeeb AuthorDate: 2026-01-26 13:19:37 +0000 Commit: Bjoern A. Zeeb CommitDate: 2026-03-09 14:35:31 +0000 usb: umass: add SCSIEJECT quirk and fix RTW8821CU_CD (USB mode switch) Several Realtek (and lots other) USB dongles present themselves as CDROM device first. Upon eject they do a mode switch and suddenly are a different kind of device (sometimes even with different IDs), e.g., a wireless dongle. In order to avoid the CDROM stage and rather than adding the quirk handling to more drivers, add support to umass and if enabled automatically eject the "CDROM" to make it the real device. Longer-term some other drivers could stop using their hand-rolled support for this. It is unclear as-to how much we need the list of (eject) quirks from u3g here, or if these are very specific to that kind of devices. Sponsored by: The FreeBSD Foundation Fixes: b3b6a959c85a, 9c0cce328363 Reviewed by: imp Differential Revision: https://reviews.freebsd.org/D54901 --- sys/dev/usb/quirk/usb_quirk.c | 2 +- sys/dev/usb/storage/umass.c | 57 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/sys/dev/usb/quirk/usb_quirk.c b/sys/dev/usb/quirk/usb_quirk.c index 04441b2a344b..303f76f37fb0 100644 --- a/sys/dev/usb/quirk/usb_quirk.c +++ b/sys/dev/usb/quirk/usb_quirk.c @@ -532,7 +532,7 @@ static struct usb_quirk_entry usb_quirks[USB_DEV_QUIRKS_MAX] = { UQ_MSC_NO_INQUIRY, UQ_CFG_INDEX_0), USB_QUIRK(SMART2, G2MEMKEY, UQ_MSC_NO_INQUIRY), USB_QUIRK_REV(RALINK, RT_STOR, 0x0001, 0x0001, UQ_MSC_IGNORE), - USB_QUIRK(REALTEK, RTW8821CU_CD, UQ_MSC_IGNORE), + USB_QUIRK(REALTEK, RTW8821CU_CD, UQ_MSC_EJECT_SCSIEJECT), /* Non-standard USB MIDI devices */ USB_QUIRK(ROLAND, UM1, UQ_AU_VENDOR_CLASS), USB_QUIRK(ROLAND, SC8850, UQ_AU_VENDOR_CLASS), diff --git a/sys/dev/usb/storage/umass.c b/sys/dev/usb/storage/umass.c index cacf4ddf8f16..0ee6ea992fa7 100644 --- a/sys/dev/usb/storage/umass.c +++ b/sys/dev/usb/storage/umass.c @@ -115,6 +115,7 @@ #include #include #include +#include #include #include @@ -124,6 +125,7 @@ #include "usbdevs.h" #include +#include #include #include @@ -705,6 +707,59 @@ static const uint8_t fake_inq_data[SHORT_INQUIRY_LENGTH] = { #define UFI_COMMAND_LENGTH 12 /* UFI commands are always 12 bytes */ #define ATAPI_COMMAND_LENGTH 12 /* ATAPI commands are always 12 bytes */ +static void +umass_autoinst_eject_quirks(void *arg __unused, struct usb_device *udev, + struct usb_attach_arg *uaa) +{ + struct usb_interface *iface; + struct usb_interface_descriptor *id; + + if (uaa->dev_state != UAA_DEV_READY) + return; + + iface = usbd_get_iface(udev, 0); + if (iface == NULL) + return; + + id = iface->idesc; + if (id == NULL || id->bInterfaceClass != UICLASS_MASS) + return; + + if (usb_test_quirk(uaa, UQ_MSC_EJECT_SCSIEJECT)) { + int error; + + error = usb_msc_eject(uaa->device, 0, MSC_EJECT_STOPUNIT); + if (error == 0) + uaa->dev_state = UAA_DEV_EJECTING; + else + printf("UMASS failed to eject by SCSI eject STOPUNIT " + "command based on quirk: %d\n", error); + } +} + +static eventhandler_tag umass_drv_evh_tag; + +static int +umass_driver_evh(struct module *mod, int what, void *arg) +{ + + switch (what) { + case MOD_LOAD: + umass_drv_evh_tag = EVENTHANDLER_REGISTER(usb_dev_configured, + umass_autoinst_eject_quirks, NULL, EVENTHANDLER_PRI_ANY); + break; + case MOD_UNLOAD: + if (umass_drv_evh_tag != NULL) + EVENTHANDLER_DEREGISTER(usb_dev_configured, + umass_drv_evh_tag); + break; + default: + return (EOPNOTSUPP); + } + + return (0); +} + static device_method_t umass_methods[] = { /* Device interface */ DEVMETHOD(device_probe, umass_probe), @@ -725,7 +780,7 @@ static const STRUCT_USB_HOST_ID __used umass_devs[] = { {USB_IFACE_CLASS(UICLASS_MASS),}, }; -DRIVER_MODULE(umass, uhub, umass_driver, NULL, NULL); +DRIVER_MODULE(umass, uhub, umass_driver, umass_driver_evh, NULL); MODULE_DEPEND(umass, usb, 1, 1, 1); MODULE_DEPEND(umass, cam, 1, 1, 1); MODULE_VERSION(umass, 1);