ukbd(4): Push LED events in ioctl handler rather than in xfer callback
If LED state is set through evdev interface, than asynchronous nature of USB transfer callback can lead to change of order of events echoed back to userland as it causes LED events to be echoed with some lag. Fix that with echoing of LED events synchronously in ioctl handler. Reviewed by: hselasky Obtained from: sysutils/iichid MFC after: 1 month Differential Revision: https://reviews.freebsd.org/D27750
This commit is contained in:
parent
769935a4ed
commit
30f34a5193
@ -845,11 +845,6 @@ ukbd_set_leds_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
if (!any)
|
||||
break;
|
||||
|
||||
#ifdef EVDEV_SUPPORT
|
||||
if (sc->sc_evdev != NULL)
|
||||
evdev_push_leds(sc->sc_evdev, sc->sc_leds);
|
||||
#endif
|
||||
|
||||
/* range check output report length */
|
||||
len = sc->sc_led_size;
|
||||
if (len > (UKBD_BUFFER_SIZE - 1))
|
||||
@ -1973,6 +1968,11 @@ ukbd_set_leds(struct ukbd_softc *sc, uint8_t leds)
|
||||
UKBD_LOCK_ASSERT();
|
||||
DPRINTF("leds=0x%02x\n", leds);
|
||||
|
||||
#ifdef EVDEV_SUPPORT
|
||||
if (sc->sc_evdev != NULL)
|
||||
evdev_push_leds(sc->sc_evdev, leds);
|
||||
#endif
|
||||
|
||||
sc->sc_leds = leds;
|
||||
sc->sc_flags |= UKBD_FLAG_SET_LEDS;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user