summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormischief <mischief@offblast.org>2020-11-21 12:31:54 -0800
committermischief <mischief@offblast.org>2020-11-21 12:31:54 -0800
commitf8738fd7578af0ce3552bc9da65502397b9faad3 (patch)
tree003919e52e34c4ecb01e00f360b37c7b209d3c5a
parent2594b99629957d8ce380157e9af4a5feff86c5fe (diff)
downloadplan9front-f8738fd7578af0ce3552bc9da65502397b9faad3.tar.xz
nusb/kb, nusb/joy: dont try to set protocol on nonboot devices
the hid 1.11 specification says that for hid devices which arent in the boot subclass (subclass 1), it is only optional to support the set protocol command. for my devices, trying to set protocol results in a stall error and unusable devices. fixes my Tex Shinobi keyboard and Playstation 4 controller.
-rw-r--r--sys/src/cmd/nusb/joy/joy.c8
-rw-r--r--sys/src/cmd/nusb/kb/kb.c8
2 files changed, 16 insertions, 0 deletions
diff --git a/sys/src/cmd/nusb/joy/joy.c b/sys/src/cmd/nusb/joy/joy.c
index b04028507..0cb254eaf 100644
--- a/sys/src/cmd/nusb/joy/joy.c
+++ b/sys/src/cmd/nusb/joy/joy.c
@@ -222,6 +222,14 @@ setproto(KDev *f, int eid)
proto = Reportproto;
}else
kbfatal(f, "no report");
+
+ /*
+ * if a HID's subclass code is 1 (boot mode), it will support
+ * setproto, otherwise it is not guaranteed to.
+ */
+ if(Subclass(f->dev->usb->ep[eid]->iface->csp) != 1)
+ return 0;
+
return usbcmd(f->dev, Rh2d|Rclass|Riface, Setproto, proto, id, nil, 0);
}
diff --git a/sys/src/cmd/nusb/kb/kb.c b/sys/src/cmd/nusb/kb/kb.c
index 3e2913e34..7b9ed9f2c 100644
--- a/sys/src/cmd/nusb/kb/kb.c
+++ b/sys/src/cmd/nusb/kb/kb.c
@@ -368,6 +368,14 @@ setproto(Hiddev *f, int eid)
}
proto = Bootproto;
}
+
+ /*
+ * if a HID's subclass code is 1 (boot mode), it will support
+ * setproto, otherwise it is not guaranteed to.
+ */
+ if(Subclass(iface->csp) != 1)
+ return 0;
+
return usbcmd(f->dev, Rh2d|Rclass|Riface, Setproto, proto, iface->id, nil, 0);
}