@@ -80,6 +80,27 @@ struct hid_device_ {
8080
8181static __u32 kernel_version = 0 ;
8282
83+ static __u32 detect_kernel_version (void )
84+ {
85+ struct utsname name ;
86+ int major , minor , release ;
87+ int ret ;
88+
89+ uname (& name );
90+ ret = sscanf (name .release , "%d.%d.%d" , & major , & minor , & release );
91+ if (ret == 3 ) {
92+ return KERNEL_VERSION (major , minor , release );
93+ }
94+
95+ ret = sscanf (name .release , "%d.%d" , & major , & minor );
96+ if (ret == 2 ) {
97+ return KERNEL_VERSION (major , minor , 0 );
98+ }
99+
100+ printf ("Couldn't determine kernel version from version string \"%s\"\n" , name .release );
101+ return 0 ;
102+ }
103+
83104static hid_device * new_hid_device (void )
84105{
85106 hid_device * dev = calloc (1 , sizeof (hid_device ));
@@ -345,6 +366,8 @@ int HID_API_EXPORT hid_init(void)
345366 if (!locale )
346367 setlocale (LC_CTYPE , "" );
347368
369+ kernel_version = detect_kernel_version ();
370+
348371 return 0 ;
349372}
350373
@@ -600,21 +623,6 @@ hid_device * HID_API_EXPORT hid_open_path(const char *path)
600623
601624 dev = new_hid_device ();
602625
603- if (kernel_version == 0 ) {
604- struct utsname name ;
605- int major , minor , release ;
606- int ret ;
607- uname (& name );
608- ret = sscanf (name .release , "%d.%d.%d" , & major , & minor , & release );
609- if (ret == 3 ) {
610- kernel_version = major << 16 | minor << 8 | release ;
611- //printf("Kernel Version: %d\n", kernel_version);
612- }
613- else {
614- printf ("Couldn't sscanf() version string %s\n" , name .release );
615- }
616- }
617-
618626 /* OPEN HERE */
619627 dev -> device_handle = open (path , O_RDWR );
620628
@@ -700,6 +708,7 @@ int HID_API_EXPORT hid_read_timeout(hid_device *dev, unsigned char *data, size_t
700708 bytes_read = 0 ;
701709
702710 if (bytes_read >= 0 &&
711+ kernel_version != 0 &&
703712 kernel_version < KERNEL_VERSION (2 ,6 ,34 ) &&
704713 dev -> uses_numbered_reports ) {
705714 /* Work around a kernel bug. Chop off the first byte. */
0 commit comments