From nobody Sat Mar 14 23:48:23 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 4fYJ2m1bFDz6VcTR for ; Sat, 14 Mar 2026 23:48:32 +0000 (UTC) (envelope-from oliver.pntr@gmail.com) Received: from mail-yx1-xb12f.google.com (mail-yx1-xb12f.google.com [IPv6:2607:f8b0:4864:20::b12f]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "smtp.gmail.com", Issuer "WR4" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4fYJ2l2KnWz3cFr for ; Sat, 14 Mar 2026 23:48:31 +0000 (UTC) (envelope-from oliver.pntr@gmail.com) Authentication-Results: mx1.freebsd.org; dkim=pass header.d=gmail.com header.s=20230601 header.b=V5vMCCMw; dmarc=pass (policy=none) header.from=gmail.com; arc=pass ("google.com:s=arc-20240605:i=1"); spf=pass (mx1.freebsd.org: domain of oliver.pntr@gmail.com designates 2607:f8b0:4864:20::b12f as permitted sender) smtp.mailfrom=oliver.pntr@gmail.com Received: by mail-yx1-xb12f.google.com with SMTP id 956f58d0204a3-64ad46a44easo3240141d50.0 for ; Sat, 14 Mar 2026 16:48:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1773532105; cv=none; d=google.com; s=arc-20240605; b=dVD0dt1ubcXsW9yFAJCLofhZvMKHmAZfq+3Q7wA+B7A7F2t3NVQgl97D0F8y22lu5h lG39i59046b5rSCEEEQ8XVEzNftp/D54k6C4TtOSEz2S5w+z4XRogHGgMDvOtvp/1B9N oJAMycEkk0fCvUWDKO1zb6XRaEKne1AY/DQ0Ov2Nd3ngf5DGwfPt6K+ozi05zKv7gH8q G8wkDXESbkes4ysWrLQtIko2hroLW15UjA3nTt92fi3ZGl25j85FgNbM00aYE4aqOXu1 D38N2a2qzRdoPH9IW3/7beg/PcXZYvqFcegKQZ499w+d6SEkFALVfGavGBRq1KNmH3az hmRA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:references:in-reply-to :mime-version:dkim-signature; bh=2jQKHg20Oz0gWPFgmpx8zqie3oof4nY+6Ym1hiACesc=; fh=I8mxRwiBw31MoF/d4qVUa+gaFaW/sG/1zLZfI8Yup9g=; b=NA+BoJ6EX7qsfNWQqa7ezEU8vh5mPXHif5oKqkm1ohZk6Guys6S+OJ/aYhDpm+zfA3 wJRWQqGxWCtcJnYLYVYfrnkLfprxTvqFsPHS8uuQpJlyXAYdlnOJWHh4k8nNg/rizm0v GNPyoOWMY8aDftr7uts/K3w9vzuJnsjH7PndvsISE42QLBH4ICqQWg5qqiqPciek7zIN KsQO5ypX4ROlJuM6kA9djf5AZVp/JKBm2lvS8+mgJFueayEsMCNlPLr2fNdi/GkpLt5i VU86Ow3oF3JfM/Lz41jcgUF3WYEtWmPnDO1SmdMaYtJvhBjy80Q0QhdxO29WmVt2Q8/v Vz7A==; darn=freebsd.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773532105; x=1774136905; darn=freebsd.org; h=cc:to:subject:message-id:date:from:references:in-reply-to :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=2jQKHg20Oz0gWPFgmpx8zqie3oof4nY+6Ym1hiACesc=; b=V5vMCCMwvZfIvFMNi9EE0DY2N8m8yOmJ2QkPHDkx7ghOGEmTUynAe9L0M+NH4pWtEb 4vHSNXKbxbDe9AV7Jf0XtbFUJTBGp9+ugpJxbO3dJ3js9Ayp8/SSwM0nToSiAyxRI9lK 2SPwbBNzbSMyOWhVVdLEtRu2KCv7k3U/Q4+0mWxTYq2l+qv583g4d6okyphYkyRaqCwC ZkCfSNKx5mzIQToEJ9JSP59nIEfqux66HTwvcdWJBe3ddt3gbrgxEL+SiZ6yCmFEzUvq DCVX7QC2lPDxOJpkyeFVY9vsE4grAdVl7/Lx3bxKrsGXSeHBKc8jDMARnVpyU1Y3u5Al Qapw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773532105; x=1774136905; h=cc:to:subject:message-id:date:from:references:in-reply-to :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=2jQKHg20Oz0gWPFgmpx8zqie3oof4nY+6Ym1hiACesc=; b=SrgNf8k4caLYAD/DXMDsA5RUEDuZKd/xsLTMXXSLVAypoW7eMbv3jFxXG6tnLRb4Nc cUQ9q/tPvnqErX17chY9lBaDkA3c89CDIGtBfMwdOLZHvc8jMQ/56KnaV9iXQ7VZ4asH rtNwlED29e8Zm45BxsoVXKvISnkHsN1gfGoprxUj4Q/fqCQbccN2WfDIf/EyOFmVF7iH 8lGPLOf3F5Ilezd83rDe6SI7Tv+2SdCsfWFFE2IynuAjonchPvodHtdLfQmMrWYyQMr0 kK7yOv3H86zKZOSeg98VTp9x3QCSD1YLH3Ij35q26K1unvN4eL0TL/+WXWH2nsCyJqTq D9ZA== X-Forwarded-Encrypted: i=1; AJvYcCXtA3xaDG58Spw36M8pLwnATmRmwchIETPfs2P+0S5padRacsKYJgAyczd3+Pwu1KzBV2C3n8HaFeAv/TjvmLzdYoOz@freebsd.org X-Gm-Message-State: AOJu0Yxv14qPYyIEAE4E3glAaeHlovL+npyePSrrJWFuNA97ZUebLh3v kh6d7Hj9d7Sq55/yJ2IikGA5Cic64zF/d4OjNF+lXF1s2VzFlde5lsZ0d36lHZPVM25yaeI/fxx 0O2ISD0qcerXDE1OGGlPZQMgSVpnIW1k= X-Gm-Gg: ATEYQzyp8+VBjgvQT+oJOSVRns99vC/Ov/7eIi3SiY5NVlj2lx8Q1ed087vmTkwjI2r 74uAVGxIYlH5AkWgXw8fNXvymdyUS4WFURX2YjY2hfdhQfVmVmffNIA6y9C0rsNQDFd23q4Cv6A 9XjiFAbZdXMxo5Ci1C3cSh07uNOqtsBd2vAzAF1wnswokvHYgzDGQO8GIgEKvA3ooerOrVTkuQt AZ0DSNDAJ+Pb7txFMUnYrWltee1OwBZhNAkKg/7scGdjNODqdPN2dnR0eZiAkNee1rLakJDKX/z 2enYEmYk3YXMlfIbSzoAy2xyWHOil4PB6aiTqFsgKA== X-Received: by 2002:a53:ecd7:0:b0:649:ef06:15f3 with SMTP id 956f58d0204a3-64e62f033d0mr6909714d50.10.1773532105219; Sat, 14 Mar 2026 16:48:25 -0700 (PDT) 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 Received: by 2002:a05:7011:3113:b0:50c:2f00:153f with HTTP; Sat, 14 Mar 2026 16:48:23 -0700 (PDT) In-Reply-To: <69aedac4.33ef1.717b7bd3@gitrepo.freebsd.org> References: <69aedac4.33ef1.717b7bd3@gitrepo.freebsd.org> From: Oliver Pinter Date: Sun, 15 Mar 2026 00:48:23 +0100 X-Gm-Features: AaiRm53bPcPzcyaSIsXebaR0Jvwf2SqkEfp-JaW7P5g9suIpI3jFjcYmX-N3-K0 Message-ID: Subject: Re: git: b4daeded66b5 - main - usb: umass: add SCSIEJECT quirk and fix RTW8821CU_CD (USB mode switch) To: "Bjoern A. Zeeb" Cc: "src-committers@freebsd.org" , "dev-commits-src-all@freebsd.org" , "dev-commits-src-main@freebsd.org" Content-Type: multipart/alternative; boundary="000000000000212429064d049fcb" X-Spamd-Result: default: False [-4.89 / 15.00]; ARC_ALLOW(-1.00)[google.com:s=arc-20240605:i=1]; NEURAL_HAM_LONG(-1.00)[-1.000]; NEURAL_HAM_MEDIUM(-1.00)[-0.996]; NEURAL_HAM_SHORT(-0.90)[-0.898]; DMARC_POLICY_ALLOW(-0.50)[gmail.com,none]; R_SPF_ALLOW(-0.20)[+ip6:2607:f8b0:4000::/36:c]; R_DKIM_ALLOW(-0.20)[gmail.com:s=20230601]; MIME_GOOD(-0.10)[multipart/alternative,text/plain]; TAGGED_FROM(0.00)[]; RCVD_TLS_LAST(0.00)[]; FROM_HAS_DN(0.00)[]; MIME_TRACE(0.00)[0:+,1:+,2:~]; FREEMAIL_ENVFROM(0.00)[gmail.com]; TO_DN_EQ_ADDR_SOME(0.00)[]; FREEMAIL_FROM(0.00)[gmail.com]; TO_DN_SOME(0.00)[]; DKIM_TRACE(0.00)[gmail.com:+]; MISSING_XM_UA(0.00)[]; RCVD_IN_DNSWL_NONE(0.00)[2607:f8b0:4864:20::b12f:from]; TO_MATCH_ENVRCPT_SOME(0.00)[]; RCVD_COUNT_TWO(0.00)[2]; FROM_EQ_ENVFROM(0.00)[]; RCPT_COUNT_THREE(0.00)[4]; PREVIOUSLY_DELIVERED(0.00)[dev-commits-src-all@freebsd.org]; MLMMJ_DEST(0.00)[dev-commits-src-all@freebsd.org]; MID_RHS_MATCH_FROMTLD(0.00)[]; ASN(0.00)[asn:15169, ipnet:2607:f8b0::/32, country:US]; DWL_DNSWL_NONE(0.00)[gmail.com:dkim] X-Rspamd-Queue-Id: 4fYJ2l2KnWz3cFr X-Spamd-Bar: ---- --000000000000212429064d049fcb Content-Type: text/plain; charset="UTF-8" On Monday, March 9, 2026, Bjoern A. Zeeb wrote: > 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. Hi! Wouldn't be better to initiate these kind of ejects from devd rather than from kernel? > > 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); > > --000000000000212429064d049fcb Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable

On Monday, March 9, 2026, Bjoern A. Zeeb <bz@freebsd.org> wrote:
The branch main has been updated by bz:

URL: https://cgit.FreeBSD.org/src/commit/?id=3Db4daeded66b5e950ed8e618d66915b863c2414b1

commit b4daeded66b5e950ed8e618d66915b863c2414b1
Author:=C2=A0 =C2=A0 =C2=A0Bjoern A. Zeeb <bz@FreeBSD.org>
AuthorDate: 2026-01-26 13:19:37 +0000
Commit:=C2=A0 =C2=A0 =C2=A0Bjoern A. Zeeb <bz@FreeBSD.org>
CommitDate: 2026-03-09 14:35:31 +0000

=C2=A0 =C2=A0 usb: umass: add SCSIEJECT quirk and fix RTW8821CU_CD (USB mod= e switch)

=C2=A0 =C2=A0 Several Realtek (and lots other) USB dongles present themselv= es as
=C2=A0 =C2=A0 CDROM device first.=C2=A0 Upon eject they do a mode switch an= d suddenly
=C2=A0 =C2=A0 are a different kind of device (sometimes even with different= IDs),
=C2=A0 =C2=A0 e.g., a wireless dongle.

=C2=A0 =C2=A0 In order to avoid the CDROM stage and rather than adding the = quirk
=C2=A0 =C2=A0 handling to more drivers, add support to umass and if enabled=
=C2=A0 =C2=A0 automatically eject the "CDROM" to make it the real= device.

=C2=A0 =C2=A0 Longer-term some other drivers could stop using their hand-ro= lled
=C2=A0 =C2=A0 support for this.=C2=A0 It is unclear as-to how much we need = the list of
=C2=A0 =C2=A0 (eject) quirks from u3g here, or if these are very specific t= o that
=C2=A0 =C2=A0 kind of devices.

Hi!

Wouldn't be better to initiate these kind of ejects fr= om devd rather than from kernel?
=C2=A0

=C2=A0 =C2=A0 Sponsored by:=C2=A0 =C2=A0The FreeBSD Foundation
=C2=A0 =C2=A0 Fixes:=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 b3b6a959c85a, 9c0cce= 328363
=C2=A0 =C2=A0 Reviewed by:=C2=A0 =C2=A0 imp
=C2=A0 =C2=A0 Differential Revision: https://reviews.freebsd.org/D54901
---
=C2=A0sys/dev/usb/quirk/usb_quirk.c |=C2=A0 2 +-
=C2=A0sys/dev/usb/storage/umass.c=C2=A0 =C2=A0| 57 ++++++++++++++++++++++++= ++++++++++++++++++-
=C2=A02 files changed, 57 insertions(+), 2 deletions(-)

diff --git a/sys/dev/usb/quirk/usb_quirk.c b/sys/dev/usb/quirk/usb_qui= rk.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] =3D {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 UQ_MSC_NO_INQUIRY, UQ_CFG_INDEX_0= ),
=C2=A0 =C2=A0 =C2=A0 =C2=A0 USB_QUIRK(SMART2, G2MEMKEY, UQ_MSC_NO_INQUIRY),=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 USB_QUIRK_REV(RALINK, RT_STOR, 0x0001, 0x0001, = UQ_MSC_IGNORE),
-=C2=A0 =C2=A0 =C2=A0 =C2=A0USB_QUIRK(REALTEK, RTW8821CU_CD, UQ_MSC_IGNORE)= ,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0USB_QUIRK(REALTEK, RTW8821CU_CD, UQ_MSC_EJECT_S= CSIEJECT),
=C2=A0 =C2=A0 =C2=A0 =C2=A0 /* Non-standard USB MIDI devices */
=C2=A0 =C2=A0 =C2=A0 =C2=A0 USB_QUIRK(ROLAND, UM1, UQ_AU_VENDOR_CLASS),
=C2=A0 =C2=A0 =C2=A0 =C2=A0 USB_QUIRK(ROLAND, SC8850, UQ_AU_VENDOR_CLASS),<= br> 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 @@
=C2=A0#include <sys/sx.h>
=C2=A0#include <sys/unistd.h>
=C2=A0#include <sys/callout.h>
+#include <sys/eventhandler.h>
=C2=A0#include <sys/malloc.h>
=C2=A0#include <sys/priv.h>

@@ -124,6 +125,7 @@
=C2=A0#include "usbdevs.h"

=C2=A0#include <dev/usb/quirk/usb_quirk.h>
+#include <dev/usb/usb_msctest.h>

=C2=A0#include <cam/cam.h>
=C2=A0#include <cam/cam_ccb.h>
@@ -705,6 +707,59 @@ static const uint8_t fake_inq_data[SHORT_INQUIRY_= LENGTH] =3D {
=C2=A0#define=C2=A0 =C2=A0 =C2=A0 =C2=A0 UFI_COMMAND_LENGTH=C2=A0 =C2=A0 = =C2=A0 12=C2=A0 =C2=A0 =C2=A0 /* UFI commands are always 12 bytes */
=C2=A0#define=C2=A0 =C2=A0 =C2=A0 =C2=A0 ATAPI_COMMAND_LENGTH=C2=A0 =C2=A0 = 12=C2=A0 =C2=A0 =C2=A0 /* ATAPI commands are always 12 bytes */

+static void
+umass_autoinst_eject_quirks(void *arg __unused, struct usb_device *ud= ev,
+=C2=A0 =C2=A0 struct usb_attach_arg *uaa)
+{
+=C2=A0 =C2=A0 =C2=A0 =C2=A0struct usb_interface *iface;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0struct usb_interface_descriptor *id;
+
+=C2=A0 =C2=A0 =C2=A0 =C2=A0if (uaa->dev_state !=3D UAA_DEV_READY)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return;
+
+=C2=A0 =C2=A0 =C2=A0 =C2=A0iface =3D usbd_get_iface(udev, 0);
+=C2=A0 =C2=A0 =C2=A0 =C2=A0if (iface =3D=3D NULL)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return;
+
+=C2=A0 =C2=A0 =C2=A0 =C2=A0id =3D iface->idesc;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0if (id =3D=3D NULL || id->bInterfaceClass != =3D UICLASS_MASS)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return;
+
+=C2=A0 =C2=A0 =C2=A0 =C2=A0if (usb_test_quirk(uaa, UQ_MSC_EJECT_SCSIEJECT)= ) {
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0int error;
+
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0error =3D usb_msc_e= ject(uaa->device, 0, MSC_EJECT_STOPUNIT);
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (error =3D=3D 0)=
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0uaa->dev_state =3D UAA_DEV_EJECTING;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0else
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0printf("UMASS failed to eject by SCSI eject STOPUNIT "<= br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0"command based on quirk: %d\n", error); +=C2=A0 =C2=A0 =C2=A0 =C2=A0}
+}
+
+static eventhandler_tag umass_drv_evh_tag;
+
+static int
+umass_driver_evh(struct module *mod, int what, void *arg)
+{
+
+=C2=A0 =C2=A0 =C2=A0 =C2=A0switch (what) {
+=C2=A0 =C2=A0 =C2=A0 =C2=A0case MOD_LOAD:
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0umass_drv_evh_tag = =3D EVENTHANDLER_REGISTER(usb_dev_configured,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0umass= _autoinst_eject_quirks, NULL, EVENTHANDLER_PRI_ANY);
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0break;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0case MOD_UNLOAD:
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (umass_drv_evh_t= ag !=3D NULL)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0EVENTHANDLER_DEREGISTER(usb_dev_configured,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0umass_drv_evh_tag);
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0break;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0default:
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return (EOPNOTSUPP)= ;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0}
+
+=C2=A0 =C2=A0 =C2=A0 =C2=A0return (0);
+}
+
=C2=A0static device_method_t umass_methods[] =3D {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 /* Device interface */
=C2=A0 =C2=A0 =C2=A0 =C2=A0 DEVMETHOD(device_probe, umass_probe),
@@ -725,7 +780,7 @@ static const STRUCT_USB_HOST_ID __used umass_devs[] =3D= {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 {USB_IFACE_CLASS(UICLASS_MASS),},
=C2=A0};

-DRIVER_MODULE(umass, uhub, umass_driver, NULL, NULL);
+DRIVER_MODULE(umass, uhub, umass_driver, umass_driver_evh, NULL);
=C2=A0MODULE_DEPEND(umass, usb, 1, 1, 1);
=C2=A0MODULE_DEPEND(umass, cam, 1, 1, 1);
=C2=A0MODULE_VERSION(umass, 1);

--000000000000212429064d049fcb--