git: 9front

Download patch

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.
--