Index: sys/arm/samsung/exynos/chrome_kb.c =================================================================== --- sys/arm/samsung/exynos/chrome_kb.c +++ sys/arm/samsung/exynos/chrome_kb.c @@ -514,17 +514,8 @@ if (!KBD_HAS_DEVICE(kbd)) { return (0); } - if (((int *)arg)[1] < 0) { - return (EINVAL); - } - if (((int *)arg)[0] < 0) { - return (EINVAL); - } - if (((int *)arg)[0] < 200) /* fastest possible value */ - kbd->kb_delay1 = 200; - else - kbd->kb_delay1 = ((int *)arg)[0]; - kbd->kb_delay2 = ((int *)arg)[1]; + kbd->kb_delay1 = keyboard_repeat_get(arg,0); + kbd->kb_delay2 = keyboard_repeat_get(arg,1); return (0); case KDSETRAD: /* set keyboard repeat rate (old Index: sys/arm/versatile/pl050.c =================================================================== --- sys/arm/versatile/pl050.c +++ sys/arm/versatile/pl050.c @@ -418,17 +418,8 @@ if (!KBD_HAS_DEVICE(kbd)) { return (0); } - if (((int *)arg)[1] < 0) { - return (EINVAL); - } - if (((int *)arg)[0] < 0) { - return (EINVAL); - } - if (((int *)arg)[0] < 200) /* fastest possible value */ - kbd->kb_delay1 = 200; - else - kbd->kb_delay1 = ((int *)arg)[0]; - kbd->kb_delay2 = ((int *)arg)[1]; + kbd->kb_delay1 = keyboard_repeat_get(arg,0); + kbd->kb_delay2 = keyboard_repeat_get(arg,1); return (0); #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \ Index: sys/dev/adb/adb_kbd.c =================================================================== --- sys/dev/adb/adb_kbd.c +++ sys/dev/adb/adb_kbd.c @@ -780,16 +780,8 @@ case KDSETREPEAT: if (!KBD_HAS_DEVICE(kbd)) return 0; - if (((int *)data)[1] < 0) - return EINVAL; - if (((int *)data)[0] < 0) - return EINVAL; - else if (((int *)data)[0] == 0) /* fastest possible value */ - kbd->kb_delay1 = 200; - else - kbd->kb_delay1 = ((int *)data)[0]; - kbd->kb_delay2 = ((int *)data)[1]; - + kbd->kb_delay1 = keyboard_repeat_get(data,0); + kbd->kb_delay2 = keyboard_repeat_get(data,1); break; case KDSETRAD: Index: sys/dev/gpio/gpiokeys.c =================================================================== --- sys/dev/gpio/gpiokeys.c +++ sys/dev/gpio/gpiokeys.c @@ -822,17 +822,8 @@ if (!KBD_HAS_DEVICE(kbd)) { return (0); } - if (((int *)arg)[1] < 0) { - return (EINVAL); - } - if (((int *)arg)[0] < 0) { - return (EINVAL); - } - if (((int *)arg)[0] < 200) /* fastest possible value */ - kbd->kb_delay1 = 200; - else - kbd->kb_delay1 = ((int *)arg)[0]; - kbd->kb_delay2 = ((int *)arg)[1]; + kbd->kb_delay1 = keyboard_repeat_get(arg,0); + kbd->kb_delay2 = keyboard_repeat_get(arg,1); return (0); #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \ Index: sys/dev/usb/input/ukbd.c =================================================================== --- sys/dev/usb/input/ukbd.c +++ sys/dev/usb/input/ukbd.c @@ -1950,14 +1950,8 @@ if (!KBD_HAS_DEVICE(kbd)) { return (0); } - /* - * Convert negative, zero and tiny args to the same limits - * as atkbd. We could support delays of 1 msec, but - * anything much shorter than the shortest atkbd value - * of 250.34 is almost unusable as well as incompatible. - */ - kbd->kb_delay1 = imax(((int *)arg)[0], 250); - kbd->kb_delay2 = imax(((int *)arg)[1], 34); + kbd->kb_delay1 = keyboard_repeat_get(arg,0); + kbd->kb_delay2 = keyboard_repeat_get(arg,1); #ifdef EVDEV_SUPPORT if (sc->sc_evdev != NULL) evdev_push_repeats(sc->sc_evdev, kbd); Index: sys/sys/kbio.h =================================================================== --- sys/sys/kbio.h +++ sys/sys/kbio.h @@ -87,6 +87,38 @@ int kb_repeat[2]; }; typedef struct keyboard_repeat keyboard_repeat_t; + +/* + * Helper function to get range checked keyboard repeat values in + * milliseconds: + */ +static inline int +keyboard_repeat_get(const struct keyboard_repeat *ptr, const int index) +{ + int retval; + + switch (index) { + case 0: + retval = ptr->kb_repeat[0]; + if (retval < 200) + retval = 200; + else if (retval > 1000) + retval = 1000; + break; + case 1: + retval = ptr->kb_repeat[1]; + if (retval < 34) + retval = 34; + else if (retval > 504) + retval = 504; + break; + default: + retval = 0; + break; + } + return (retval); +} + #define KDSETREPEAT _IOW('K', 102, keyboard_repeat_t) #define KDGETREPEAT _IOR('K', 103, keyboard_repeat_t)