@@ -80,6 +80,27 @@ struct hid_device_ {
80
80
81
81
static __u32 kernel_version = 0 ;
82
82
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
+
83
104
static hid_device * new_hid_device (void )
84
105
{
85
106
hid_device * dev = calloc (1 , sizeof (hid_device ));
@@ -345,6 +366,8 @@ int HID_API_EXPORT hid_init(void)
345
366
if (!locale )
346
367
setlocale (LC_CTYPE , "" );
347
368
369
+ kernel_version = detect_kernel_version ();
370
+
348
371
return 0 ;
349
372
}
350
373
@@ -600,21 +623,6 @@ hid_device * HID_API_EXPORT hid_open_path(const char *path)
600
623
601
624
dev = new_hid_device ();
602
625
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
-
618
626
/* OPEN HERE */
619
627
dev -> device_handle = open (path , O_RDWR );
620
628
@@ -700,6 +708,7 @@ int HID_API_EXPORT hid_read_timeout(hid_device *dev, unsigned char *data, size_t
700
708
bytes_read = 0 ;
701
709
702
710
if (bytes_read >= 0 &&
711
+ kernel_version != 0 &&
703
712
kernel_version < KERNEL_VERSION (2 ,6 ,34 ) &&
704
713
dev -> uses_numbered_reports ) {
705
714
/* Work around a kernel bug. Chop off the first byte. */
0 commit comments