Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 31 May 2026 11:30:45 +0000
From:      Vladimir Kondratyev <wulf@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Cc:        Joshua Rogers <Joshua@Joshua.Hu>
Subject:   git: 8809ea46f105 - main - ukbd: fix SET_REPORT wValue always using report ID 0 for LED output
Message-ID:  <6a1c1be5.43061.2dada001@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch main has been updated by wulf:

URL: https://cgit.FreeBSD.org/src/commit/?id=8809ea46f105b71e87e17c46bce133860f2bf643

commit 8809ea46f105b71e87e17c46bce133860f2bf643
Author:     Joshua Rogers <Joshua@Joshua.Hu>
AuthorDate: 2026-05-31 11:29:15 +0000
Commit:     Vladimir Kondratyev <wulf@FreeBSD.org>
CommitDate: 2026-05-31 11:29:15 +0000

    ukbd: fix SET_REPORT wValue always using report ID 0 for LED output
    
    ukbd_set_leds_callback() built the SET_REPORT control request with
    USETW2(req.wValue, UHID_OUTPUT_REPORT, 0) before the loop that
    determines the actual HID report ID from sc_id_numlock,
    sc_id_scrolllock, or sc_id_capslock.  The data payload was already
    correctly prefixed with the real report ID when id != 0, but the
    control request's wValue told the device to set report ID 0, which
    does not exist on devices that use non-zero report IDs for LED output.
    
    Apple Internal Keyboard / Trackpad (0x05ac:0x0274) uses report ID 1
    for LED output.  The mismatch caused the device to STALL every
    SET_REPORT request, so the capslock LED could never be updated.
    
    Move the USETW2 call to after the LED-detection loop so that wValue
    carries the correct report ID.
    
    Signed-off-by:  Joshua Rogers <Joshua@Joshua.Hu>
    Reviewed by:    wulf
    MFC after:      1 week
    Pull Request:   https://github.com/freebsd/freebsd-src/pull/2210
---
 sys/dev/usb/input/ukbd.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/sys/dev/usb/input/ukbd.c b/sys/dev/usb/input/ukbd.c
index 104e51c082c3..d012af99fee4 100644
--- a/sys/dev/usb/input/ukbd.c
+++ b/sys/dev/usb/input/ukbd.c
@@ -957,13 +957,6 @@ ukbd_set_leds_callback(struct usb_xfer *xfer, usb_error_t error)
 			break;
 		sc->sc_flags &= ~UKBD_FLAG_SET_LEDS;
 
-		req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
-		req.bRequest = UR_SET_REPORT;
-		USETW2(req.wValue, UHID_OUTPUT_REPORT, 0);
-		req.wIndex[0] = sc->sc_iface_no;
-		req.wIndex[1] = 0;
-		req.wLength[1] = 0;
-
 		memset(sc->sc_buffer, 0, UKBD_BUFFER_SIZE);
 
 		id = 0;
@@ -1017,11 +1010,18 @@ ukbd_set_leds_callback(struct usb_xfer *xfer, usb_error_t error)
 		} else {
 			usbd_copy_in(pc, 0, sc->sc_buffer + 1, len);
 		}
-		req.wLength[0] = len;
 		usbd_xfer_set_frame_len(xfer, 1, len);
 
 		DPRINTF("len=%d, id=%d\n", len, id);
 
+		req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
+		req.bRequest = UR_SET_REPORT;
+		USETW2(req.wValue, UHID_OUTPUT_REPORT, id);
+		req.wIndex[0] = sc->sc_iface_no;
+		req.wIndex[1] = 0;
+		req.wLength[0] = len;
+		req.wLength[1] = 0;
+
 		/* setup control request last */
 		pc = usbd_xfer_get_frame(xfer, 0);
 		usbd_copy_in(pc, 0, &req, sizeof(req));


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6a1c1be5.43061.2dada001>