From nobody Mon Mar 09 14:35:48 2026 X-Original-To: dev-commits-src-main@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 4fV01J6jZWz6Vpkw for ; Mon, 09 Mar 2026 14:35:48 +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 4fV01J61dtz4Fh5 for ; Mon, 09 Mar 2026 14:35:48 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1773066948; 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=VFZyh9fzRy3sUTBbu1A054YCVCUpSbMgaJkEHMYSeeT4YR1MOiGXeC5nX5DTbQR3uYFheO SE5G98Ow3sWNFqhGs3PbrYFz5g+zPQiX9lyNNwqSljcDrb34tyItUuMM7Cd9GuR2Kns2rB SjvxG7mZD++hIdRw98XEKZ18L5A2rfBFWBUMGC1fAOEHEYP70IO39ghSoKBbZE9k6xsHTH RImxZjjMpWhkpoc4VpUTZ1bsOD6DXERGQ9/38fOPlU/4Hz0wtcIsr2IFccii1XQQ3/sZq4 EH6DPMrsF9VCrSQVi2GCVXxcE5WX3t0sxC1JTqQZNYPw6usXwx6ZkNbnS2eFkQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1773066948; a=rsa-sha256; cv=none; b=QcItw0+SbmTUMTEjtTNu94U9TuL2d6bBoS9VHdmcC9Tfbt6KY+soubMz8d5eMsZBBtWDoh 61SgY1GiK+YBhFvBDxac1eXw7nbpN8Czoh3x1sePuH+drhQTP+HDK5NI7f+VjfyxR/YMsl GAiGflvGUuyZVfDbRP2GbIAhmhMadfYaD6KiVR3GpHPlt9DvB8DNM5qk106pzGk0Dr7Z6E nl8tW3GjBsi2CuHuajt5OJz3IbpEdNbQrDjBt4mn+RvTcYAkMx0aC0FOkLxdGFblpKbyJp DBrA8g3xqyGd4iE+YRu5mMVEIyeTF89dS2zm4zq2NsqOCs5P8EYtnlbfcgs9uw== 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=1773066948; 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=i7u3T2yPjIdWtWqt7/8wF8wXvsiiWHBo0UioWP9OujOZvvCyykZMtXukTKt3QLFVzkNjZh 84urUoxSihxPiJPDY3eDMJqD2sJMMOiEbU6AV9ZD9e3WUjVriZO4/haN1cDVS92naWzsUB nZHPeoUGKhPSOWHntXC5Je6F/FHowZ9CMVw/tpF6RthDXfMN+NNamPK2QiatXahoo0TU5m +cukjhBKQijU4S4F1XxjhDSjkKebd+1/bIEV+YlQIsUtyLH0zTF82MLYagThc9LErT+EJ8 vWjBolRJgXP/7X9yPicm/fEfpjash+vIq9Va6+6A+KY9EaJ0RLjLRDez0NRHbA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4fV01J5RFhzD7f for ; Mon, 09 Mar 2026 14:35:48 +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 the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@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);