ref: 8f44d1f6e8a47395c2ebd9b6899f1b8dc94a9b3f
parent: 65cabd2dae3bee17a92f656f3c5248b188c2465b
author: Arne <cgnarne@netcologne.de>
date: Sun Nov 16 14:53:48 EST 2025
nusb/disk: mode switching for Realtek RTL8153 nics
--- a/sys/src/cmd/nusb/disk/disk.c
+++ b/sys/src/cmd/nusb/disk/disk.c
@@ -1037,6 +1037,30 @@
static void
notreallyums(Dev *dev)
{+ static uchar RealtekMagic[] = { 0x55, 0x53,+ 0x42, 0x43,
+ 0x08, 0x60,
+ 0xd9, 0xa9,
+ 0xc0, 0x00,
+ 0x00, 0x00,
+ 0x80, 0x00,
+ 0x06, 0xe0,
+ 0x00, 0x00,
+ 0x00, 0x00,
+ 0x00, 0x00,
+ 0x00, 0x00,
+ 0x00, 0x00,
+ 0x00, 0x00,
+ 0x00, 0x00,
+ 0x00,
+ };
+
+ /* Realtek RTL8153 */
+ if(dev->usb->vid == 0x0bda && dev->usb->did == 0x8151){+ write(ums->epout->dfd, RealtekMagic, sizeof(RealtekMagic));
+ exits("mode switch");+ }
+
/* HUAWEI E220 */
if(dev->usb->vid == 0x12d1 && dev->usb->did == 0x1003){usbcmd(dev, Rh2d|Rstd|Rdev, Rsetfeature, Fdevremotewakeup, 0x02, nil, 0);
@@ -1078,12 +1102,13 @@
dev = getdev(*argv);
if(dev == nil)
sysfatal("getdev: %r");- notreallyums(dev);
ums = dev->aux = emallocz(sizeof(Ums), 1);
ums->maxlun = -1;
if(findendpoints(ums, Protobulk) < 0
&& findendpoints(ums, Protouas) < 0)
sysfatal("findendpoints: %r");+
+ notreallyums(dev);
/*
* SanDISK 512M gets residues wrong.
--
⑨