hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/hid/hid-logitech-dj.c
....@@ -1,40 +1,26 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
2
- * HID driver for Logitech Unifying receivers
3
+ * HID driver for Logitech receivers
34 *
45 * Copyright (c) 2011 Logitech
56 */
67
7
-/*
8
- * This program is free software; you can redistribute it and/or modify
9
- * it under the terms of the GNU General Public License version 2 as
10
- * published by the Free Software Foundation.
11
-
12
- *
13
- * This program is distributed in the hope that it will be useful,
14
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
- * GNU General Public License for more details.
17
- *
18
- * You should have received a copy of the GNU General Public License
19
- * along with this program; if not, write to the Free Software
20
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21
- *
22
- */
238
249
2510 #include <linux/device.h>
2611 #include <linux/hid.h>
2712 #include <linux/module.h>
28
-#include <linux/usb.h>
2913 #include <linux/kfifo.h>
14
+#include <linux/delay.h>
15
+#include <linux/usb.h> /* For to_usb_interface for kvm extra intf check */
3016 #include <asm/unaligned.h>
3117 #include "hid-ids.h"
3218
33
-#define DJ_MAX_PAIRED_DEVICES 6
34
-#define DJ_MAX_NUMBER_NOTIFICATIONS 8
19
+#define DJ_MAX_PAIRED_DEVICES 7
20
+#define DJ_MAX_NUMBER_NOTIFS 8
3521 #define DJ_RECEIVER_INDEX 0
3622 #define DJ_DEVICE_INDEX_MIN 1
37
-#define DJ_DEVICE_INDEX_MAX 6
23
+#define DJ_DEVICE_INDEX_MAX 7
3824
3925 #define DJREPORT_SHORT_LENGTH 15
4026 #define DJREPORT_LONG_LENGTH 32
....@@ -44,6 +30,7 @@
4430
4531 #define REPORT_ID_HIDPP_SHORT 0x10
4632 #define REPORT_ID_HIDPP_LONG 0x11
33
+#define REPORT_ID_HIDPP_VERY_LONG 0x12
4734
4835 #define HIDPP_REPORT_SHORT_LENGTH 7
4936 #define HIDPP_REPORT_LONG_LENGTH 20
....@@ -74,7 +61,6 @@
7461 /* Device Un-Paired Notification */
7562 #define REPORT_TYPE_NOTIF_DEVICE_UNPAIRED 0x40
7663
77
-
7864 /* Connection Status Notification */
7965 #define REPORT_TYPE_NOTIF_CONNECTION_STATUS 0x42
8066 #define CONNECTION_STATUS_PARAM_STATUS 0x00
....@@ -94,12 +80,44 @@
9480 #define REPORT_TYPE_LEDS 0x0E
9581
9682 /* RF Report types bitfield */
97
-#define STD_KEYBOARD 0x00000002
98
-#define STD_MOUSE 0x00000004
99
-#define MULTIMEDIA 0x00000008
100
-#define POWER_KEYS 0x00000010
101
-#define MEDIA_CENTER 0x00000100
102
-#define KBD_LEDS 0x00004000
83
+#define STD_KEYBOARD BIT(1)
84
+#define STD_MOUSE BIT(2)
85
+#define MULTIMEDIA BIT(3)
86
+#define POWER_KEYS BIT(4)
87
+#define MEDIA_CENTER BIT(8)
88
+#define KBD_LEDS BIT(14)
89
+/* Fake (bitnr > NUMBER_OF_HID_REPORTS) bit to track HID++ capability */
90
+#define HIDPP BIT_ULL(63)
91
+
92
+/* HID++ Device Connected Notification */
93
+#define REPORT_TYPE_NOTIF_DEVICE_CONNECTED 0x41
94
+#define HIDPP_PARAM_PROTO_TYPE 0x00
95
+#define HIDPP_PARAM_DEVICE_INFO 0x01
96
+#define HIDPP_PARAM_EQUAD_LSB 0x02
97
+#define HIDPP_PARAM_EQUAD_MSB 0x03
98
+#define HIDPP_PARAM_27MHZ_DEVID 0x03
99
+#define HIDPP_DEVICE_TYPE_MASK GENMASK(3, 0)
100
+#define HIDPP_LINK_STATUS_MASK BIT(6)
101
+#define HIDPP_MANUFACTURER_MASK BIT(7)
102
+
103
+#define HIDPP_DEVICE_TYPE_KEYBOARD 1
104
+#define HIDPP_DEVICE_TYPE_MOUSE 2
105
+
106
+#define HIDPP_SET_REGISTER 0x80
107
+#define HIDPP_GET_LONG_REGISTER 0x83
108
+#define HIDPP_REG_CONNECTION_STATE 0x02
109
+#define HIDPP_REG_PAIRING_INFORMATION 0xB5
110
+#define HIDPP_PAIRING_INFORMATION 0x20
111
+#define HIDPP_FAKE_DEVICE_ARRIVAL 0x02
112
+
113
+enum recvr_type {
114
+ recvr_type_dj,
115
+ recvr_type_hidpp,
116
+ recvr_type_gaming_hidpp,
117
+ recvr_type_mouse_only,
118
+ recvr_type_27mhz,
119
+ recvr_type_bluetooth,
120
+};
103121
104122 struct dj_report {
105123 u8 report_id;
....@@ -108,21 +126,49 @@
108126 u8 report_params[DJREPORT_SHORT_LENGTH - 3];
109127 };
110128
129
+struct hidpp_event {
130
+ u8 report_id;
131
+ u8 device_index;
132
+ u8 sub_id;
133
+ u8 params[HIDPP_REPORT_LONG_LENGTH - 3U];
134
+} __packed;
135
+
111136 struct dj_receiver_dev {
112
- struct hid_device *hdev;
137
+ struct hid_device *mouse;
138
+ struct hid_device *keyboard;
139
+ struct hid_device *hidpp;
113140 struct dj_device *paired_dj_devices[DJ_MAX_PAIRED_DEVICES +
114141 DJ_DEVICE_INDEX_MIN];
142
+ struct list_head list;
143
+ struct kref kref;
115144 struct work_struct work;
116145 struct kfifo notif_fifo;
146
+ unsigned long last_query; /* in jiffies */
147
+ bool ready;
148
+ enum recvr_type type;
149
+ unsigned int unnumbered_application;
117150 spinlock_t lock;
118
- bool querying_devices;
119151 };
120152
121153 struct dj_device {
122154 struct hid_device *hdev;
123155 struct dj_receiver_dev *dj_receiver_dev;
124
- u32 reports_supported;
156
+ u64 reports_supported;
125157 u8 device_index;
158
+};
159
+
160
+#define WORKITEM_TYPE_EMPTY 0
161
+#define WORKITEM_TYPE_PAIRED 1
162
+#define WORKITEM_TYPE_UNPAIRED 2
163
+#define WORKITEM_TYPE_UNKNOWN 255
164
+
165
+struct dj_workitem {
166
+ u8 type; /* WORKITEM_TYPE_* */
167
+ u8 device_index;
168
+ u8 device_type;
169
+ u8 quad_id_msb;
170
+ u8 quad_id_lsb;
171
+ u64 reports_supported;
126172 };
127173
128174 /* Keyboard descriptor (1) */
....@@ -200,6 +246,131 @@
200246 0xC0, /* END_COLLECTION */
201247 };
202248
249
+/* Mouse descriptor (2) for 27 MHz receiver, only 8 buttons */
250
+static const char mse_27mhz_descriptor[] = {
251
+ 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */
252
+ 0x09, 0x02, /* USAGE (Mouse) */
253
+ 0xA1, 0x01, /* COLLECTION (Application) */
254
+ 0x85, 0x02, /* REPORT_ID = 2 */
255
+ 0x09, 0x01, /* USAGE (pointer) */
256
+ 0xA1, 0x00, /* COLLECTION (physical) */
257
+ 0x05, 0x09, /* USAGE_PAGE (buttons) */
258
+ 0x19, 0x01, /* USAGE_MIN (1) */
259
+ 0x29, 0x08, /* USAGE_MAX (8) */
260
+ 0x15, 0x00, /* LOGICAL_MIN (0) */
261
+ 0x25, 0x01, /* LOGICAL_MAX (1) */
262
+ 0x95, 0x08, /* REPORT_COUNT (8) */
263
+ 0x75, 0x01, /* REPORT_SIZE (1) */
264
+ 0x81, 0x02, /* INPUT (data var abs) */
265
+ 0x05, 0x01, /* USAGE_PAGE (generic desktop) */
266
+ 0x16, 0x01, 0xF8, /* LOGICAL_MIN (-2047) */
267
+ 0x26, 0xFF, 0x07, /* LOGICAL_MAX (2047) */
268
+ 0x75, 0x0C, /* REPORT_SIZE (12) */
269
+ 0x95, 0x02, /* REPORT_COUNT (2) */
270
+ 0x09, 0x30, /* USAGE (X) */
271
+ 0x09, 0x31, /* USAGE (Y) */
272
+ 0x81, 0x06, /* INPUT */
273
+ 0x15, 0x81, /* LOGICAL_MIN (-127) */
274
+ 0x25, 0x7F, /* LOGICAL_MAX (127) */
275
+ 0x75, 0x08, /* REPORT_SIZE (8) */
276
+ 0x95, 0x01, /* REPORT_COUNT (1) */
277
+ 0x09, 0x38, /* USAGE (wheel) */
278
+ 0x81, 0x06, /* INPUT */
279
+ 0x05, 0x0C, /* USAGE_PAGE(consumer) */
280
+ 0x0A, 0x38, 0x02, /* USAGE(AC Pan) */
281
+ 0x95, 0x01, /* REPORT_COUNT (1) */
282
+ 0x81, 0x06, /* INPUT */
283
+ 0xC0, /* END_COLLECTION */
284
+ 0xC0, /* END_COLLECTION */
285
+};
286
+
287
+/* Mouse descriptor (2) for Bluetooth receiver, low-res hwheel, 12 buttons */
288
+static const char mse_bluetooth_descriptor[] = {
289
+ 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */
290
+ 0x09, 0x02, /* USAGE (Mouse) */
291
+ 0xA1, 0x01, /* COLLECTION (Application) */
292
+ 0x85, 0x02, /* REPORT_ID = 2 */
293
+ 0x09, 0x01, /* USAGE (pointer) */
294
+ 0xA1, 0x00, /* COLLECTION (physical) */
295
+ 0x05, 0x09, /* USAGE_PAGE (buttons) */
296
+ 0x19, 0x01, /* USAGE_MIN (1) */
297
+ 0x29, 0x08, /* USAGE_MAX (8) */
298
+ 0x15, 0x00, /* LOGICAL_MIN (0) */
299
+ 0x25, 0x01, /* LOGICAL_MAX (1) */
300
+ 0x95, 0x08, /* REPORT_COUNT (8) */
301
+ 0x75, 0x01, /* REPORT_SIZE (1) */
302
+ 0x81, 0x02, /* INPUT (data var abs) */
303
+ 0x05, 0x01, /* USAGE_PAGE (generic desktop) */
304
+ 0x16, 0x01, 0xF8, /* LOGICAL_MIN (-2047) */
305
+ 0x26, 0xFF, 0x07, /* LOGICAL_MAX (2047) */
306
+ 0x75, 0x0C, /* REPORT_SIZE (12) */
307
+ 0x95, 0x02, /* REPORT_COUNT (2) */
308
+ 0x09, 0x30, /* USAGE (X) */
309
+ 0x09, 0x31, /* USAGE (Y) */
310
+ 0x81, 0x06, /* INPUT */
311
+ 0x15, 0x81, /* LOGICAL_MIN (-127) */
312
+ 0x25, 0x7F, /* LOGICAL_MAX (127) */
313
+ 0x75, 0x08, /* REPORT_SIZE (8) */
314
+ 0x95, 0x01, /* REPORT_COUNT (1) */
315
+ 0x09, 0x38, /* USAGE (wheel) */
316
+ 0x81, 0x06, /* INPUT */
317
+ 0x05, 0x0C, /* USAGE_PAGE(consumer) */
318
+ 0x0A, 0x38, 0x02, /* USAGE(AC Pan) */
319
+ 0x15, 0xF9, /* LOGICAL_MIN (-7) */
320
+ 0x25, 0x07, /* LOGICAL_MAX (7) */
321
+ 0x75, 0x04, /* REPORT_SIZE (4) */
322
+ 0x95, 0x01, /* REPORT_COUNT (1) */
323
+ 0x81, 0x06, /* INPUT */
324
+ 0x05, 0x09, /* USAGE_PAGE (buttons) */
325
+ 0x19, 0x09, /* USAGE_MIN (9) */
326
+ 0x29, 0x0C, /* USAGE_MAX (12) */
327
+ 0x15, 0x00, /* LOGICAL_MIN (0) */
328
+ 0x25, 0x01, /* LOGICAL_MAX (1) */
329
+ 0x75, 0x01, /* REPORT_SIZE (1) */
330
+ 0x95, 0x04, /* REPORT_COUNT (4) */
331
+ 0x81, 0x02, /* INPUT (Data,Var,Abs) */
332
+ 0xC0, /* END_COLLECTION */
333
+ 0xC0, /* END_COLLECTION */
334
+};
335
+
336
+/* Gaming Mouse descriptor (2) */
337
+static const char mse_high_res_descriptor[] = {
338
+ 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */
339
+ 0x09, 0x02, /* USAGE (Mouse) */
340
+ 0xA1, 0x01, /* COLLECTION (Application) */
341
+ 0x85, 0x02, /* REPORT_ID = 2 */
342
+ 0x09, 0x01, /* USAGE (pointer) */
343
+ 0xA1, 0x00, /* COLLECTION (physical) */
344
+ 0x05, 0x09, /* USAGE_PAGE (buttons) */
345
+ 0x19, 0x01, /* USAGE_MIN (1) */
346
+ 0x29, 0x10, /* USAGE_MAX (16) */
347
+ 0x15, 0x00, /* LOGICAL_MIN (0) */
348
+ 0x25, 0x01, /* LOGICAL_MAX (1) */
349
+ 0x95, 0x10, /* REPORT_COUNT (16) */
350
+ 0x75, 0x01, /* REPORT_SIZE (1) */
351
+ 0x81, 0x02, /* INPUT (data var abs) */
352
+ 0x05, 0x01, /* USAGE_PAGE (generic desktop) */
353
+ 0x16, 0x01, 0x80, /* LOGICAL_MIN (-32767) */
354
+ 0x26, 0xFF, 0x7F, /* LOGICAL_MAX (32767) */
355
+ 0x75, 0x10, /* REPORT_SIZE (16) */
356
+ 0x95, 0x02, /* REPORT_COUNT (2) */
357
+ 0x09, 0x30, /* USAGE (X) */
358
+ 0x09, 0x31, /* USAGE (Y) */
359
+ 0x81, 0x06, /* INPUT */
360
+ 0x15, 0x81, /* LOGICAL_MIN (-127) */
361
+ 0x25, 0x7F, /* LOGICAL_MAX (127) */
362
+ 0x75, 0x08, /* REPORT_SIZE (8) */
363
+ 0x95, 0x01, /* REPORT_COUNT (1) */
364
+ 0x09, 0x38, /* USAGE (wheel) */
365
+ 0x81, 0x06, /* INPUT */
366
+ 0x05, 0x0C, /* USAGE_PAGE(consumer) */
367
+ 0x0A, 0x38, 0x02, /* USAGE(AC Pan) */
368
+ 0x95, 0x01, /* REPORT_COUNT (1) */
369
+ 0x81, 0x06, /* INPUT */
370
+ 0xC0, /* END_COLLECTION */
371
+ 0xC0, /* END_COLLECTION */
372
+};
373
+
203374 /* Consumer Control descriptor (3) */
204375 static const char consumer_descriptor[] = {
205376 0x05, 0x0C, /* USAGE_PAGE (Consumer Devices) */
....@@ -209,9 +380,9 @@
209380 0x75, 0x10, /* REPORT_SIZE (16) */
210381 0x95, 0x02, /* REPORT_COUNT (2) */
211382 0x15, 0x01, /* LOGICAL_MIN (1) */
212
- 0x26, 0x8C, 0x02, /* LOGICAL_MAX (652) */
383
+ 0x26, 0xFF, 0x02, /* LOGICAL_MAX (767) */
213384 0x19, 0x01, /* USAGE_MIN (1) */
214
- 0x2A, 0x8C, 0x02, /* USAGE_MAX (652) */
385
+ 0x2A, 0xFF, 0x02, /* USAGE_MAX (767) */
215386 0x81, 0x00, /* INPUT (Data Ary Abs) */
216387 0xC0, /* END_COLLECTION */
217388 }; /* */
....@@ -308,7 +479,7 @@
308479 /* Make sure all descriptors are present here */
309480 #define MAX_RDESC_SIZE \
310481 (sizeof(kbd_descriptor) + \
311
- sizeof(mse_descriptor) + \
482
+ sizeof(mse_bluetooth_descriptor) + \
312483 sizeof(consumer_descriptor) + \
313484 sizeof(syscontrol_descriptor) + \
314485 sizeof(media_descriptor) + \
....@@ -341,51 +512,160 @@
341512 static struct hid_ll_driver logi_dj_ll_driver;
342513
343514 static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev);
515
+static void delayedwork_callback(struct work_struct *work);
516
+
517
+static LIST_HEAD(dj_hdev_list);
518
+static DEFINE_MUTEX(dj_hdev_list_lock);
519
+
520
+/*
521
+ * dj/HID++ receivers are really a single logical entity, but for BIOS/Windows
522
+ * compatibility they have multiple USB interfaces. On HID++ receivers we need
523
+ * to listen for input reports on both interfaces. The functions below are used
524
+ * to create a single struct dj_receiver_dev for all interfaces belonging to
525
+ * a single USB-device / receiver.
526
+ */
527
+static struct dj_receiver_dev *dj_find_receiver_dev(struct hid_device *hdev,
528
+ enum recvr_type type)
529
+{
530
+ struct dj_receiver_dev *djrcv_dev;
531
+ char sep;
532
+
533
+ /*
534
+ * The bluetooth receiver contains a built-in hub and has separate
535
+ * USB-devices for the keyboard and mouse interfaces.
536
+ */
537
+ sep = (type == recvr_type_bluetooth) ? '.' : '/';
538
+
539
+ /* Try to find an already-probed interface from the same device */
540
+ list_for_each_entry(djrcv_dev, &dj_hdev_list, list) {
541
+ if (djrcv_dev->mouse &&
542
+ hid_compare_device_paths(hdev, djrcv_dev->mouse, sep)) {
543
+ kref_get(&djrcv_dev->kref);
544
+ return djrcv_dev;
545
+ }
546
+ if (djrcv_dev->keyboard &&
547
+ hid_compare_device_paths(hdev, djrcv_dev->keyboard, sep)) {
548
+ kref_get(&djrcv_dev->kref);
549
+ return djrcv_dev;
550
+ }
551
+ if (djrcv_dev->hidpp &&
552
+ hid_compare_device_paths(hdev, djrcv_dev->hidpp, sep)) {
553
+ kref_get(&djrcv_dev->kref);
554
+ return djrcv_dev;
555
+ }
556
+ }
557
+
558
+ return NULL;
559
+}
560
+
561
+static void dj_release_receiver_dev(struct kref *kref)
562
+{
563
+ struct dj_receiver_dev *djrcv_dev = container_of(kref, struct dj_receiver_dev, kref);
564
+
565
+ list_del(&djrcv_dev->list);
566
+ kfifo_free(&djrcv_dev->notif_fifo);
567
+ kfree(djrcv_dev);
568
+}
569
+
570
+static void dj_put_receiver_dev(struct hid_device *hdev)
571
+{
572
+ struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
573
+
574
+ mutex_lock(&dj_hdev_list_lock);
575
+
576
+ if (djrcv_dev->mouse == hdev)
577
+ djrcv_dev->mouse = NULL;
578
+ if (djrcv_dev->keyboard == hdev)
579
+ djrcv_dev->keyboard = NULL;
580
+ if (djrcv_dev->hidpp == hdev)
581
+ djrcv_dev->hidpp = NULL;
582
+
583
+ kref_put(&djrcv_dev->kref, dj_release_receiver_dev);
584
+
585
+ mutex_unlock(&dj_hdev_list_lock);
586
+}
587
+
588
+static struct dj_receiver_dev *dj_get_receiver_dev(struct hid_device *hdev,
589
+ enum recvr_type type,
590
+ unsigned int application,
591
+ bool is_hidpp)
592
+{
593
+ struct dj_receiver_dev *djrcv_dev;
594
+
595
+ mutex_lock(&dj_hdev_list_lock);
596
+
597
+ djrcv_dev = dj_find_receiver_dev(hdev, type);
598
+ if (!djrcv_dev) {
599
+ djrcv_dev = kzalloc(sizeof(*djrcv_dev), GFP_KERNEL);
600
+ if (!djrcv_dev)
601
+ goto out;
602
+
603
+ INIT_WORK(&djrcv_dev->work, delayedwork_callback);
604
+ spin_lock_init(&djrcv_dev->lock);
605
+ if (kfifo_alloc(&djrcv_dev->notif_fifo,
606
+ DJ_MAX_NUMBER_NOTIFS * sizeof(struct dj_workitem),
607
+ GFP_KERNEL)) {
608
+ kfree(djrcv_dev);
609
+ djrcv_dev = NULL;
610
+ goto out;
611
+ }
612
+ kref_init(&djrcv_dev->kref);
613
+ list_add_tail(&djrcv_dev->list, &dj_hdev_list);
614
+ djrcv_dev->last_query = jiffies;
615
+ djrcv_dev->type = type;
616
+ }
617
+
618
+ if (application == HID_GD_KEYBOARD)
619
+ djrcv_dev->keyboard = hdev;
620
+ if (application == HID_GD_MOUSE)
621
+ djrcv_dev->mouse = hdev;
622
+ if (is_hidpp)
623
+ djrcv_dev->hidpp = hdev;
624
+
625
+ hid_set_drvdata(hdev, djrcv_dev);
626
+out:
627
+ mutex_unlock(&dj_hdev_list_lock);
628
+ return djrcv_dev;
629
+}
344630
345631 static void logi_dj_recv_destroy_djhid_device(struct dj_receiver_dev *djrcv_dev,
346
- struct dj_report *dj_report)
632
+ struct dj_workitem *workitem)
347633 {
348634 /* Called in delayed work context */
349635 struct dj_device *dj_dev;
350636 unsigned long flags;
351637
352638 spin_lock_irqsave(&djrcv_dev->lock, flags);
353
- dj_dev = djrcv_dev->paired_dj_devices[dj_report->device_index];
354
- djrcv_dev->paired_dj_devices[dj_report->device_index] = NULL;
639
+ dj_dev = djrcv_dev->paired_dj_devices[workitem->device_index];
640
+ djrcv_dev->paired_dj_devices[workitem->device_index] = NULL;
355641 spin_unlock_irqrestore(&djrcv_dev->lock, flags);
356642
357643 if (dj_dev != NULL) {
358644 hid_destroy_device(dj_dev->hdev);
359645 kfree(dj_dev);
360646 } else {
361
- dev_err(&djrcv_dev->hdev->dev, "%s: can't destroy a NULL device\n",
647
+ hid_err(djrcv_dev->hidpp, "%s: can't destroy a NULL device\n",
362648 __func__);
363649 }
364650 }
365651
366652 static void logi_dj_recv_add_djhid_device(struct dj_receiver_dev *djrcv_dev,
367
- struct dj_report *dj_report)
653
+ struct dj_workitem *workitem)
368654 {
369655 /* Called in delayed work context */
370
- struct hid_device *djrcv_hdev = djrcv_dev->hdev;
371
- struct usb_interface *intf = to_usb_interface(djrcv_hdev->dev.parent);
372
- struct usb_device *usbdev = interface_to_usbdev(intf);
656
+ struct hid_device *djrcv_hdev = djrcv_dev->hidpp;
373657 struct hid_device *dj_hiddev;
374658 struct dj_device *dj_dev;
659
+ u8 device_index = workitem->device_index;
660
+ unsigned long flags;
375661
376662 /* Device index goes from 1 to 6, we need 3 bytes to store the
377663 * semicolon, the index, and a null terminator
378664 */
379665 unsigned char tmpstr[3];
380666
381
- if (dj_report->report_params[DEVICE_PAIRED_PARAM_SPFUNCTION] &
382
- SPFUNCTION_DEVICE_LIST_EMPTY) {
383
- dbg_hid("%s: device list is empty\n", __func__);
384
- djrcv_dev->querying_devices = false;
385
- return;
386
- }
387
-
388
- if (djrcv_dev->paired_dj_devices[dj_report->device_index]) {
667
+ /* We are the only one ever adding a device, no need to lock */
668
+ if (djrcv_dev->paired_dj_devices[device_index]) {
389669 /* The device is already known. No need to reallocate it. */
390670 dbg_hid("%s: device is already known\n", __func__);
391671 return;
....@@ -393,8 +673,7 @@
393673
394674 dj_hiddev = hid_allocate_device();
395675 if (IS_ERR(dj_hiddev)) {
396
- dev_err(&djrcv_hdev->dev, "%s: hid_allocate_device failed\n",
397
- __func__);
676
+ hid_err(djrcv_hdev, "%s: hid_allocate_dev failed\n", __func__);
398677 return;
399678 }
400679
....@@ -402,48 +681,67 @@
402681
403682 dj_hiddev->dev.parent = &djrcv_hdev->dev;
404683 dj_hiddev->bus = BUS_USB;
405
- dj_hiddev->vendor = le16_to_cpu(usbdev->descriptor.idVendor);
406
- dj_hiddev->product =
407
- (dj_report->report_params[DEVICE_PAIRED_PARAM_EQUAD_ID_MSB]
408
- << 8) |
409
- dj_report->report_params[DEVICE_PAIRED_PARAM_EQUAD_ID_LSB];
410
- snprintf(dj_hiddev->name, sizeof(dj_hiddev->name),
411
- "Logitech Unifying Device. Wireless PID:%04x",
412
- dj_hiddev->product);
684
+ dj_hiddev->vendor = djrcv_hdev->vendor;
685
+ dj_hiddev->product = (workitem->quad_id_msb << 8) |
686
+ workitem->quad_id_lsb;
687
+ if (workitem->device_type) {
688
+ const char *type_str = "Device";
413689
414
- dj_hiddev->group = HID_GROUP_LOGITECH_DJ_DEVICE;
690
+ switch (workitem->device_type) {
691
+ case 0x01: type_str = "Keyboard"; break;
692
+ case 0x02: type_str = "Mouse"; break;
693
+ case 0x03: type_str = "Numpad"; break;
694
+ case 0x04: type_str = "Presenter"; break;
695
+ case 0x07: type_str = "Remote Control"; break;
696
+ case 0x08: type_str = "Trackball"; break;
697
+ case 0x09: type_str = "Touchpad"; break;
698
+ }
699
+ snprintf(dj_hiddev->name, sizeof(dj_hiddev->name),
700
+ "Logitech Wireless %s PID:%04x",
701
+ type_str, dj_hiddev->product);
702
+ } else {
703
+ snprintf(dj_hiddev->name, sizeof(dj_hiddev->name),
704
+ "Logitech Wireless Device PID:%04x",
705
+ dj_hiddev->product);
706
+ }
415707
416
- usb_make_path(usbdev, dj_hiddev->phys, sizeof(dj_hiddev->phys));
417
- snprintf(tmpstr, sizeof(tmpstr), ":%d", dj_report->device_index);
708
+ if (djrcv_dev->type == recvr_type_27mhz)
709
+ dj_hiddev->group = HID_GROUP_LOGITECH_27MHZ_DEVICE;
710
+ else
711
+ dj_hiddev->group = HID_GROUP_LOGITECH_DJ_DEVICE;
712
+
713
+ memcpy(dj_hiddev->phys, djrcv_hdev->phys, sizeof(djrcv_hdev->phys));
714
+ snprintf(tmpstr, sizeof(tmpstr), ":%d", device_index);
418715 strlcat(dj_hiddev->phys, tmpstr, sizeof(dj_hiddev->phys));
419716
420717 dj_dev = kzalloc(sizeof(struct dj_device), GFP_KERNEL);
421718
422719 if (!dj_dev) {
423
- dev_err(&djrcv_hdev->dev, "%s: failed allocating dj_device\n",
424
- __func__);
720
+ hid_err(djrcv_hdev, "%s: failed allocating dj_dev\n", __func__);
425721 goto dj_device_allocate_fail;
426722 }
427723
428
- dj_dev->reports_supported = get_unaligned_le32(
429
- dj_report->report_params + DEVICE_PAIRED_RF_REPORT_TYPE);
724
+ dj_dev->reports_supported = workitem->reports_supported;
430725 dj_dev->hdev = dj_hiddev;
431726 dj_dev->dj_receiver_dev = djrcv_dev;
432
- dj_dev->device_index = dj_report->device_index;
727
+ dj_dev->device_index = device_index;
433728 dj_hiddev->driver_data = dj_dev;
434729
435
- djrcv_dev->paired_dj_devices[dj_report->device_index] = dj_dev;
730
+ spin_lock_irqsave(&djrcv_dev->lock, flags);
731
+ djrcv_dev->paired_dj_devices[device_index] = dj_dev;
732
+ spin_unlock_irqrestore(&djrcv_dev->lock, flags);
436733
437734 if (hid_add_device(dj_hiddev)) {
438
- dev_err(&djrcv_hdev->dev, "%s: failed adding dj_device\n",
439
- __func__);
735
+ hid_err(djrcv_hdev, "%s: failed adding dj_device\n", __func__);
440736 goto hid_add_device_fail;
441737 }
442738
443739 return;
444740
445741 hid_add_device_fail:
446
- djrcv_dev->paired_dj_devices[dj_report->device_index] = NULL;
742
+ spin_lock_irqsave(&djrcv_dev->lock, flags);
743
+ djrcv_dev->paired_dj_devices[device_index] = NULL;
744
+ spin_unlock_irqrestore(&djrcv_dev->lock, flags);
447745 kfree(dj_dev);
448746 dj_device_allocate_fail:
449747 hid_destroy_device(dj_hiddev);
....@@ -454,7 +752,7 @@
454752 struct dj_receiver_dev *djrcv_dev =
455753 container_of(work, struct dj_receiver_dev, work);
456754
457
- struct dj_report dj_report;
755
+ struct dj_workitem workitem;
458756 unsigned long flags;
459757 int count;
460758 int retval;
....@@ -463,67 +761,272 @@
463761
464762 spin_lock_irqsave(&djrcv_dev->lock, flags);
465763
466
- count = kfifo_out(&djrcv_dev->notif_fifo, &dj_report,
467
- sizeof(struct dj_report));
468
-
469
- if (count != sizeof(struct dj_report)) {
470
- dev_err(&djrcv_dev->hdev->dev, "%s: workitem triggered without "
471
- "notifications available\n", __func__);
764
+ /*
765
+ * Since we attach to multiple interfaces, we may get scheduled before
766
+ * we are bound to the HID++ interface, catch this.
767
+ */
768
+ if (!djrcv_dev->ready) {
769
+ pr_warn("%s: delayedwork queued before hidpp interface was enumerated\n",
770
+ __func__);
472771 spin_unlock_irqrestore(&djrcv_dev->lock, flags);
473772 return;
474773 }
475774
476
- if (!kfifo_is_empty(&djrcv_dev->notif_fifo)) {
477
- if (schedule_work(&djrcv_dev->work) == 0) {
478
- dbg_hid("%s: did not schedule the work item, was "
479
- "already queued\n", __func__);
480
- }
775
+ count = kfifo_out(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem));
776
+
777
+ if (count != sizeof(workitem)) {
778
+ spin_unlock_irqrestore(&djrcv_dev->lock, flags);
779
+ return;
481780 }
781
+
782
+ if (!kfifo_is_empty(&djrcv_dev->notif_fifo))
783
+ schedule_work(&djrcv_dev->work);
482784
483785 spin_unlock_irqrestore(&djrcv_dev->lock, flags);
484786
485
- switch (dj_report.report_type) {
486
- case REPORT_TYPE_NOTIF_DEVICE_PAIRED:
487
- logi_dj_recv_add_djhid_device(djrcv_dev, &dj_report);
787
+ switch (workitem.type) {
788
+ case WORKITEM_TYPE_PAIRED:
789
+ logi_dj_recv_add_djhid_device(djrcv_dev, &workitem);
488790 break;
489
- case REPORT_TYPE_NOTIF_DEVICE_UNPAIRED:
490
- logi_dj_recv_destroy_djhid_device(djrcv_dev, &dj_report);
791
+ case WORKITEM_TYPE_UNPAIRED:
792
+ logi_dj_recv_destroy_djhid_device(djrcv_dev, &workitem);
491793 break;
492
- default:
493
- /* A normal report (i. e. not belonging to a pair/unpair notification)
494
- * arriving here, means that the report arrived but we did not have a
495
- * paired dj_device associated to the report's device_index, this
496
- * means that the original "device paired" notification corresponding
497
- * to this dj_device never arrived to this driver. The reason is that
498
- * hid-core discards all packets coming from a device while probe() is
499
- * executing. */
500
- if (!djrcv_dev->paired_dj_devices[dj_report.device_index]) {
501
- /* ok, we don't know the device, just re-ask the
502
- * receiver for the list of connected devices. */
794
+ case WORKITEM_TYPE_UNKNOWN:
503795 retval = logi_dj_recv_query_paired_devices(djrcv_dev);
504
- if (!retval) {
505
- /* everything went fine, so just leave */
506
- break;
796
+ if (retval) {
797
+ hid_err(djrcv_dev->hidpp, "%s: logi_dj_recv_query_paired_devices error: %d\n",
798
+ __func__, retval);
507799 }
508
- dev_err(&djrcv_dev->hdev->dev,
509
- "%s:logi_dj_recv_query_paired_devices "
510
- "error:%d\n", __func__, retval);
511
- }
512
- dbg_hid("%s: unexpected report type\n", __func__);
800
+ break;
801
+ case WORKITEM_TYPE_EMPTY:
802
+ dbg_hid("%s: device list is empty\n", __func__);
803
+ break;
513804 }
805
+}
806
+
807
+/*
808
+ * Sometimes we receive reports for which we do not have a paired dj_device
809
+ * associated with the device_index or report-type to forward the report to.
810
+ * This means that the original "device paired" notification corresponding
811
+ * to the dj_device never arrived to this driver. Possible reasons for this are:
812
+ * 1) hid-core discards all packets coming from a device during probe().
813
+ * 2) if the receiver is plugged into a KVM switch then the pairing reports
814
+ * are only forwarded to it if the focus is on this PC.
815
+ * This function deals with this by re-asking the receiver for the list of
816
+ * connected devices in the delayed work callback.
817
+ * This function MUST be called with djrcv->lock held.
818
+ */
819
+static void logi_dj_recv_queue_unknown_work(struct dj_receiver_dev *djrcv_dev)
820
+{
821
+ struct dj_workitem workitem = { .type = WORKITEM_TYPE_UNKNOWN };
822
+
823
+ /* Rate limit queries done because of unhandled reports to 2/sec */
824
+ if (time_before(jiffies, djrcv_dev->last_query + HZ / 2))
825
+ return;
826
+
827
+ kfifo_in(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem));
828
+ schedule_work(&djrcv_dev->work);
514829 }
515830
516831 static void logi_dj_recv_queue_notification(struct dj_receiver_dev *djrcv_dev,
517832 struct dj_report *dj_report)
518833 {
519834 /* We are called from atomic context (tasklet && djrcv->lock held) */
835
+ struct dj_workitem workitem = {
836
+ .device_index = dj_report->device_index,
837
+ };
520838
521
- kfifo_in(&djrcv_dev->notif_fifo, dj_report, sizeof(struct dj_report));
522
-
523
- if (schedule_work(&djrcv_dev->work) == 0) {
524
- dbg_hid("%s: did not schedule the work item, was already "
525
- "queued\n", __func__);
839
+ switch (dj_report->report_type) {
840
+ case REPORT_TYPE_NOTIF_DEVICE_PAIRED:
841
+ workitem.type = WORKITEM_TYPE_PAIRED;
842
+ if (dj_report->report_params[DEVICE_PAIRED_PARAM_SPFUNCTION] &
843
+ SPFUNCTION_DEVICE_LIST_EMPTY) {
844
+ workitem.type = WORKITEM_TYPE_EMPTY;
845
+ break;
846
+ }
847
+ fallthrough;
848
+ case REPORT_TYPE_NOTIF_DEVICE_UNPAIRED:
849
+ workitem.quad_id_msb =
850
+ dj_report->report_params[DEVICE_PAIRED_PARAM_EQUAD_ID_MSB];
851
+ workitem.quad_id_lsb =
852
+ dj_report->report_params[DEVICE_PAIRED_PARAM_EQUAD_ID_LSB];
853
+ workitem.reports_supported = get_unaligned_le32(
854
+ dj_report->report_params +
855
+ DEVICE_PAIRED_RF_REPORT_TYPE);
856
+ workitem.reports_supported |= HIDPP;
857
+ if (dj_report->report_type == REPORT_TYPE_NOTIF_DEVICE_UNPAIRED)
858
+ workitem.type = WORKITEM_TYPE_UNPAIRED;
859
+ break;
860
+ default:
861
+ logi_dj_recv_queue_unknown_work(djrcv_dev);
862
+ return;
526863 }
864
+
865
+ kfifo_in(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem));
866
+ schedule_work(&djrcv_dev->work);
867
+}
868
+
869
+/*
870
+ * Some quad/bluetooth keyboards have a builtin touchpad in this case we see
871
+ * only 1 paired device with a device_type of REPORT_TYPE_KEYBOARD. For the
872
+ * touchpad to work we must also forward mouse input reports to the dj_hiddev
873
+ * created for the keyboard (instead of forwarding them to a second paired
874
+ * device with a device_type of REPORT_TYPE_MOUSE as we normally would).
875
+ */
876
+static const u16 kbd_builtin_touchpad_ids[] = {
877
+ 0xb309, /* Dinovo Edge */
878
+ 0xb30c, /* Dinovo Mini */
879
+};
880
+
881
+static void logi_hidpp_dev_conn_notif_equad(struct hid_device *hdev,
882
+ struct hidpp_event *hidpp_report,
883
+ struct dj_workitem *workitem)
884
+{
885
+ struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
886
+ int i, id;
887
+
888
+ workitem->type = WORKITEM_TYPE_PAIRED;
889
+ workitem->device_type = hidpp_report->params[HIDPP_PARAM_DEVICE_INFO] &
890
+ HIDPP_DEVICE_TYPE_MASK;
891
+ workitem->quad_id_msb = hidpp_report->params[HIDPP_PARAM_EQUAD_MSB];
892
+ workitem->quad_id_lsb = hidpp_report->params[HIDPP_PARAM_EQUAD_LSB];
893
+ switch (workitem->device_type) {
894
+ case REPORT_TYPE_KEYBOARD:
895
+ workitem->reports_supported |= STD_KEYBOARD | MULTIMEDIA |
896
+ POWER_KEYS | MEDIA_CENTER |
897
+ HIDPP;
898
+ id = (workitem->quad_id_msb << 8) | workitem->quad_id_lsb;
899
+ for (i = 0; i < ARRAY_SIZE(kbd_builtin_touchpad_ids); i++) {
900
+ if (id == kbd_builtin_touchpad_ids[i]) {
901
+ workitem->reports_supported |= STD_MOUSE;
902
+ break;
903
+ }
904
+ }
905
+ break;
906
+ case REPORT_TYPE_MOUSE:
907
+ workitem->reports_supported |= STD_MOUSE | HIDPP;
908
+ if (djrcv_dev->type == recvr_type_mouse_only)
909
+ workitem->reports_supported |= MULTIMEDIA;
910
+ break;
911
+ }
912
+}
913
+
914
+static void logi_hidpp_dev_conn_notif_27mhz(struct hid_device *hdev,
915
+ struct hidpp_event *hidpp_report,
916
+ struct dj_workitem *workitem)
917
+{
918
+ workitem->type = WORKITEM_TYPE_PAIRED;
919
+ workitem->quad_id_lsb = hidpp_report->params[HIDPP_PARAM_27MHZ_DEVID];
920
+ switch (hidpp_report->device_index) {
921
+ case 1: /* Index 1 is always a mouse */
922
+ case 2: /* Index 2 is always a mouse */
923
+ workitem->device_type = HIDPP_DEVICE_TYPE_MOUSE;
924
+ workitem->reports_supported |= STD_MOUSE | HIDPP;
925
+ break;
926
+ case 3: /* Index 3 is always the keyboard */
927
+ case 4: /* Index 4 is used for an optional separate numpad */
928
+ workitem->device_type = HIDPP_DEVICE_TYPE_KEYBOARD;
929
+ workitem->reports_supported |= STD_KEYBOARD | MULTIMEDIA |
930
+ POWER_KEYS | HIDPP;
931
+ break;
932
+ default:
933
+ hid_warn(hdev, "%s: unexpected device-index %d", __func__,
934
+ hidpp_report->device_index);
935
+ }
936
+}
937
+
938
+static void logi_hidpp_recv_queue_notif(struct hid_device *hdev,
939
+ struct hidpp_event *hidpp_report)
940
+{
941
+ /* We are called from atomic context (tasklet && djrcv->lock held) */
942
+ struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
943
+ const char *device_type = "UNKNOWN";
944
+ struct dj_workitem workitem = {
945
+ .type = WORKITEM_TYPE_EMPTY,
946
+ .device_index = hidpp_report->device_index,
947
+ };
948
+
949
+ switch (hidpp_report->params[HIDPP_PARAM_PROTO_TYPE]) {
950
+ case 0x01:
951
+ device_type = "Bluetooth";
952
+ /* Bluetooth connect packet contents is the same as (e)QUAD */
953
+ logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report, &workitem);
954
+ if (!(hidpp_report->params[HIDPP_PARAM_DEVICE_INFO] &
955
+ HIDPP_MANUFACTURER_MASK)) {
956
+ hid_info(hdev, "Non Logitech device connected on slot %d\n",
957
+ hidpp_report->device_index);
958
+ workitem.reports_supported &= ~HIDPP;
959
+ }
960
+ break;
961
+ case 0x02:
962
+ device_type = "27 Mhz";
963
+ logi_hidpp_dev_conn_notif_27mhz(hdev, hidpp_report, &workitem);
964
+ break;
965
+ case 0x03:
966
+ device_type = "QUAD or eQUAD";
967
+ logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report, &workitem);
968
+ break;
969
+ case 0x04:
970
+ device_type = "eQUAD step 4 DJ";
971
+ logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report, &workitem);
972
+ break;
973
+ case 0x05:
974
+ device_type = "DFU Lite";
975
+ break;
976
+ case 0x06:
977
+ device_type = "eQUAD step 4 Lite";
978
+ logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report, &workitem);
979
+ break;
980
+ case 0x07:
981
+ device_type = "eQUAD step 4 Gaming";
982
+ logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report, &workitem);
983
+ workitem.reports_supported |= STD_KEYBOARD;
984
+ break;
985
+ case 0x08:
986
+ device_type = "eQUAD step 4 for gamepads";
987
+ break;
988
+ case 0x0a:
989
+ device_type = "eQUAD nano Lite";
990
+ logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report, &workitem);
991
+ break;
992
+ case 0x0c:
993
+ device_type = "eQUAD Lightspeed 1";
994
+ logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report, &workitem);
995
+ workitem.reports_supported |= STD_KEYBOARD;
996
+ break;
997
+ case 0x0d:
998
+ device_type = "eQUAD Lightspeed 1.1";
999
+ logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report, &workitem);
1000
+ workitem.reports_supported |= STD_KEYBOARD;
1001
+ break;
1002
+ case 0x0f:
1003
+ case 0x11:
1004
+ device_type = "eQUAD Lightspeed 1.2";
1005
+ logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report, &workitem);
1006
+ workitem.reports_supported |= STD_KEYBOARD;
1007
+ break;
1008
+ }
1009
+
1010
+ /* custom receiver device (eg. powerplay) */
1011
+ if (hidpp_report->device_index == 7) {
1012
+ workitem.reports_supported |= HIDPP;
1013
+ }
1014
+
1015
+ if (workitem.type == WORKITEM_TYPE_EMPTY) {
1016
+ hid_warn(hdev,
1017
+ "unusable device of type %s (0x%02x) connected on slot %d",
1018
+ device_type,
1019
+ hidpp_report->params[HIDPP_PARAM_PROTO_TYPE],
1020
+ hidpp_report->device_index);
1021
+ return;
1022
+ }
1023
+
1024
+ hid_info(hdev, "device of type %s (0x%02x) connected on slot %d",
1025
+ device_type, hidpp_report->params[HIDPP_PARAM_PROTO_TYPE],
1026
+ hidpp_report->device_index);
1027
+
1028
+ kfifo_in(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem));
1029
+ schedule_work(&djrcv_dev->work);
5271030 }
5281031
5291032 static void logi_dj_recv_forward_null_report(struct dj_receiver_dev *djrcv_dev,
....@@ -552,8 +1055,8 @@
5521055 }
5531056 }
5541057
555
-static void logi_dj_recv_forward_report(struct dj_receiver_dev *djrcv_dev,
556
- struct dj_report *dj_report)
1058
+static void logi_dj_recv_forward_dj(struct dj_receiver_dev *djrcv_dev,
1059
+ struct dj_report *dj_report)
5571060 {
5581061 /* We are called from atomic context (tasklet && djrcv->lock held) */
5591062 struct dj_device *dj_device;
....@@ -573,18 +1076,48 @@
5731076 }
5741077 }
5751078
576
-static void logi_dj_recv_forward_hidpp(struct dj_device *dj_dev, u8 *data,
577
- int size)
1079
+static void logi_dj_recv_forward_report(struct dj_device *dj_dev, u8 *data,
1080
+ int size)
5781081 {
5791082 /* We are called from atomic context (tasklet && djrcv->lock held) */
5801083 if (hid_input_report(dj_dev->hdev, HID_INPUT_REPORT, data, size, 1))
5811084 dbg_hid("hid_input_report error\n");
5821085 }
5831086
1087
+static void logi_dj_recv_forward_input_report(struct hid_device *hdev,
1088
+ u8 *data, int size)
1089
+{
1090
+ struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
1091
+ struct dj_device *dj_dev;
1092
+ unsigned long flags;
1093
+ u8 report = data[0];
1094
+ int i;
1095
+
1096
+ if (report > REPORT_TYPE_RFREPORT_LAST) {
1097
+ hid_err(hdev, "Unexpected input report number %d\n", report);
1098
+ return;
1099
+ }
1100
+
1101
+ spin_lock_irqsave(&djrcv_dev->lock, flags);
1102
+ for (i = 0; i < (DJ_MAX_PAIRED_DEVICES + DJ_DEVICE_INDEX_MIN); i++) {
1103
+ dj_dev = djrcv_dev->paired_dj_devices[i];
1104
+ if (dj_dev && (dj_dev->reports_supported & BIT(report))) {
1105
+ logi_dj_recv_forward_report(dj_dev, data, size);
1106
+ spin_unlock_irqrestore(&djrcv_dev->lock, flags);
1107
+ return;
1108
+ }
1109
+ }
1110
+
1111
+ logi_dj_recv_queue_unknown_work(djrcv_dev);
1112
+ spin_unlock_irqrestore(&djrcv_dev->lock, flags);
1113
+
1114
+ dbg_hid("No dj-devs handling input report number %d\n", report);
1115
+}
1116
+
5841117 static int logi_dj_recv_send_report(struct dj_receiver_dev *djrcv_dev,
5851118 struct dj_report *dj_report)
5861119 {
587
- struct hid_device *hdev = djrcv_dev->hdev;
1120
+ struct hid_device *hdev = djrcv_dev->hidpp;
5881121 struct hid_report *report;
5891122 struct hid_report_enum *output_report_enum;
5901123 u8 *data = (u8 *)(&dj_report->device_index);
....@@ -594,7 +1127,7 @@
5941127 report = output_report_enum->report_id_hash[REPORT_ID_DJ_SHORT];
5951128
5961129 if (!report) {
597
- dev_err(&hdev->dev, "%s: unable to find dj report\n", __func__);
1130
+ hid_err(hdev, "%s: unable to find dj report\n", __func__);
5981131 return -ENODEV;
5991132 }
6001133
....@@ -606,20 +1139,48 @@
6061139 return 0;
6071140 }
6081141
1142
+static int logi_dj_recv_query_hidpp_devices(struct dj_receiver_dev *djrcv_dev)
1143
+{
1144
+ static const u8 template[] = {
1145
+ REPORT_ID_HIDPP_SHORT,
1146
+ HIDPP_RECEIVER_INDEX,
1147
+ HIDPP_SET_REGISTER,
1148
+ HIDPP_REG_CONNECTION_STATE,
1149
+ HIDPP_FAKE_DEVICE_ARRIVAL,
1150
+ 0x00, 0x00
1151
+ };
1152
+ u8 *hidpp_report;
1153
+ int retval;
1154
+
1155
+ hidpp_report = kmemdup(template, sizeof(template), GFP_KERNEL);
1156
+ if (!hidpp_report)
1157
+ return -ENOMEM;
1158
+
1159
+ retval = hid_hw_raw_request(djrcv_dev->hidpp,
1160
+ REPORT_ID_HIDPP_SHORT,
1161
+ hidpp_report, sizeof(template),
1162
+ HID_OUTPUT_REPORT,
1163
+ HID_REQ_SET_REPORT);
1164
+
1165
+ kfree(hidpp_report);
1166
+ return (retval < 0) ? retval : 0;
1167
+}
1168
+
6091169 static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev)
6101170 {
6111171 struct dj_report *dj_report;
6121172 int retval;
6131173
614
- /* no need to protect djrcv_dev->querying_devices */
615
- if (djrcv_dev->querying_devices)
616
- return 0;
1174
+ djrcv_dev->last_query = jiffies;
1175
+
1176
+ if (djrcv_dev->type != recvr_type_dj)
1177
+ return logi_dj_recv_query_hidpp_devices(djrcv_dev);
6171178
6181179 dj_report = kzalloc(sizeof(struct dj_report), GFP_KERNEL);
6191180 if (!dj_report)
6201181 return -ENOMEM;
6211182 dj_report->report_id = REPORT_ID_DJ_SHORT;
622
- dj_report->device_index = 0xFF;
1183
+ dj_report->device_index = HIDPP_RECEIVER_INDEX;
6231184 dj_report->report_type = REPORT_TYPE_CMD_GET_PAIRED_DEVICES;
6241185 retval = logi_dj_recv_send_report(djrcv_dev, dj_report);
6251186 kfree(dj_report);
....@@ -630,27 +1191,36 @@
6301191 static int logi_dj_recv_switch_to_dj_mode(struct dj_receiver_dev *djrcv_dev,
6311192 unsigned timeout)
6321193 {
633
- struct hid_device *hdev = djrcv_dev->hdev;
1194
+ struct hid_device *hdev = djrcv_dev->hidpp;
6341195 struct dj_report *dj_report;
6351196 u8 *buf;
636
- int retval;
1197
+ int retval = 0;
6371198
6381199 dj_report = kzalloc(sizeof(struct dj_report), GFP_KERNEL);
6391200 if (!dj_report)
6401201 return -ENOMEM;
641
- dj_report->report_id = REPORT_ID_DJ_SHORT;
642
- dj_report->device_index = 0xFF;
643
- dj_report->report_type = REPORT_TYPE_CMD_SWITCH;
644
- dj_report->report_params[CMD_SWITCH_PARAM_DEVBITFIELD] = 0x3F;
645
- dj_report->report_params[CMD_SWITCH_PARAM_TIMEOUT_SECONDS] = (u8)timeout;
646
- retval = logi_dj_recv_send_report(djrcv_dev, dj_report);
6471202
648
- /*
649
- * Ugly sleep to work around a USB 3.0 bug when the receiver is still
650
- * processing the "switch-to-dj" command while we send an other command.
651
- * 50 msec should gives enough time to the receiver to be ready.
652
- */
653
- msleep(50);
1203
+ if (djrcv_dev->type == recvr_type_dj) {
1204
+ dj_report->report_id = REPORT_ID_DJ_SHORT;
1205
+ dj_report->device_index = HIDPP_RECEIVER_INDEX;
1206
+ dj_report->report_type = REPORT_TYPE_CMD_SWITCH;
1207
+ dj_report->report_params[CMD_SWITCH_PARAM_DEVBITFIELD] = 0x3F;
1208
+ dj_report->report_params[CMD_SWITCH_PARAM_TIMEOUT_SECONDS] =
1209
+ (u8)timeout;
1210
+
1211
+ retval = logi_dj_recv_send_report(djrcv_dev, dj_report);
1212
+
1213
+ /*
1214
+ * Ugly sleep to work around a USB 3.0 bug when the receiver is
1215
+ * still processing the "switch-to-dj" command while we send an
1216
+ * other command.
1217
+ * 50 msec should gives enough time to the receiver to be ready.
1218
+ */
1219
+ msleep(50);
1220
+
1221
+ if (retval)
1222
+ return retval;
1223
+ }
6541224
6551225 /*
6561226 * Magical bits to set up hidpp notifications when the dj devices
....@@ -664,14 +1234,14 @@
6641234 memset(buf, 0, HIDPP_REPORT_SHORT_LENGTH);
6651235
6661236 buf[0] = REPORT_ID_HIDPP_SHORT;
667
- buf[1] = 0xFF;
1237
+ buf[1] = HIDPP_RECEIVER_INDEX;
6681238 buf[2] = 0x80;
6691239 buf[3] = 0x00;
6701240 buf[4] = 0x00;
6711241 buf[5] = 0x09;
6721242 buf[6] = 0x00;
6731243
674
- hid_hw_raw_request(hdev, REPORT_ID_HIDPP_SHORT, buf,
1244
+ retval = hid_hw_raw_request(hdev, REPORT_ID_HIDPP_SHORT, buf,
6751245 HIDPP_REPORT_SHORT_LENGTH, HID_OUTPUT_REPORT,
6761246 HID_REQ_SET_REPORT);
6771247
....@@ -682,22 +1252,28 @@
6821252
6831253 static int logi_dj_ll_open(struct hid_device *hid)
6841254 {
685
- dbg_hid("%s:%s\n", __func__, hid->phys);
1255
+ dbg_hid("%s: %s\n", __func__, hid->phys);
6861256 return 0;
6871257
6881258 }
6891259
6901260 static void logi_dj_ll_close(struct hid_device *hid)
6911261 {
692
- dbg_hid("%s:%s\n", __func__, hid->phys);
1262
+ dbg_hid("%s: %s\n", __func__, hid->phys);
6931263 }
6941264
6951265 /*
6961266 * Register 0xB5 is "pairing information". It is solely intended for the
6971267 * receiver, so do not overwrite the device index.
6981268 */
699
-static u8 unifying_pairing_query[] = {0x10, 0xff, 0x83, 0xb5};
700
-static u8 unifying_pairing_answer[] = {0x11, 0xff, 0x83, 0xb5};
1269
+static u8 unifying_pairing_query[] = { REPORT_ID_HIDPP_SHORT,
1270
+ HIDPP_RECEIVER_INDEX,
1271
+ HIDPP_GET_LONG_REGISTER,
1272
+ HIDPP_REG_PAIRING_INFORMATION };
1273
+static u8 unifying_pairing_answer[] = { REPORT_ID_HIDPP_LONG,
1274
+ HIDPP_RECEIVER_INDEX,
1275
+ HIDPP_GET_LONG_REGISTER,
1276
+ HIDPP_REG_PAIRING_INFORMATION };
7011277
7021278 static int logi_dj_ll_raw_request(struct hid_device *hid,
7031279 unsigned char reportnum, __u8 *buf,
....@@ -710,7 +1286,8 @@
7101286 int ret;
7111287
7121288 if ((buf[0] == REPORT_ID_HIDPP_SHORT) ||
713
- (buf[0] == REPORT_ID_HIDPP_LONG)) {
1289
+ (buf[0] == REPORT_ID_HIDPP_LONG) ||
1290
+ (buf[0] == REPORT_ID_HIDPP_VERY_LONG)) {
7141291 if (count < 2)
7151292 return -EINVAL;
7161293
....@@ -721,12 +1298,22 @@
7211298 buf[4] = (buf[4] & 0xf0) | (djdev->device_index - 1);
7221299 else
7231300 buf[1] = djdev->device_index;
724
- return hid_hw_raw_request(djrcv_dev->hdev, reportnum, buf,
1301
+ return hid_hw_raw_request(djrcv_dev->hidpp, reportnum, buf,
7251302 count, report_type, reqtype);
7261303 }
7271304
7281305 if (buf[0] != REPORT_TYPE_LEDS)
7291306 return -EINVAL;
1307
+
1308
+ if (djrcv_dev->type != recvr_type_dj && count >= 2) {
1309
+ if (!djrcv_dev->keyboard) {
1310
+ hid_warn(hid, "Received REPORT_TYPE_LEDS request before the keyboard interface was enumerated\n");
1311
+ return 0;
1312
+ }
1313
+ /* usbhid overrides the report ID and ignores the first byte */
1314
+ return hid_hw_raw_request(djrcv_dev->keyboard, 0, buf, count,
1315
+ report_type, reqtype);
1316
+ }
7301317
7311318 out_buf = kzalloc(DJREPORT_SHORT_LENGTH, GFP_ATOMIC);
7321319 if (!out_buf)
....@@ -739,7 +1326,7 @@
7391326 out_buf[1] = djdev->device_index;
7401327 memcpy(out_buf + 2, buf, count);
7411328
742
- ret = hid_hw_raw_request(djrcv_dev->hdev, out_buf[0], out_buf,
1329
+ ret = hid_hw_raw_request(djrcv_dev->hidpp, out_buf[0], out_buf,
7431330 DJREPORT_SHORT_LENGTH, report_type, reqtype);
7441331
7451332 kfree(out_buf);
....@@ -769,41 +1356,58 @@
7691356 return -ENOMEM;
7701357
7711358 if (djdev->reports_supported & STD_KEYBOARD) {
772
- dbg_hid("%s: sending a kbd descriptor, reports_supported: %x\n",
1359
+ dbg_hid("%s: sending a kbd descriptor, reports_supported: %llx\n",
7731360 __func__, djdev->reports_supported);
7741361 rdcat(rdesc, &rsize, kbd_descriptor, sizeof(kbd_descriptor));
7751362 }
7761363
7771364 if (djdev->reports_supported & STD_MOUSE) {
778
- dbg_hid("%s: sending a mouse descriptor, reports_supported: "
779
- "%x\n", __func__, djdev->reports_supported);
780
- rdcat(rdesc, &rsize, mse_descriptor, sizeof(mse_descriptor));
1365
+ dbg_hid("%s: sending a mouse descriptor, reports_supported: %llx\n",
1366
+ __func__, djdev->reports_supported);
1367
+ if (djdev->dj_receiver_dev->type == recvr_type_gaming_hidpp ||
1368
+ djdev->dj_receiver_dev->type == recvr_type_mouse_only)
1369
+ rdcat(rdesc, &rsize, mse_high_res_descriptor,
1370
+ sizeof(mse_high_res_descriptor));
1371
+ else if (djdev->dj_receiver_dev->type == recvr_type_27mhz)
1372
+ rdcat(rdesc, &rsize, mse_27mhz_descriptor,
1373
+ sizeof(mse_27mhz_descriptor));
1374
+ else if (djdev->dj_receiver_dev->type == recvr_type_bluetooth)
1375
+ rdcat(rdesc, &rsize, mse_bluetooth_descriptor,
1376
+ sizeof(mse_bluetooth_descriptor));
1377
+ else
1378
+ rdcat(rdesc, &rsize, mse_descriptor,
1379
+ sizeof(mse_descriptor));
7811380 }
7821381
7831382 if (djdev->reports_supported & MULTIMEDIA) {
784
- dbg_hid("%s: sending a multimedia report descriptor: %x\n",
1383
+ dbg_hid("%s: sending a multimedia report descriptor: %llx\n",
7851384 __func__, djdev->reports_supported);
7861385 rdcat(rdesc, &rsize, consumer_descriptor, sizeof(consumer_descriptor));
7871386 }
7881387
7891388 if (djdev->reports_supported & POWER_KEYS) {
790
- dbg_hid("%s: sending a power keys report descriptor: %x\n",
1389
+ dbg_hid("%s: sending a power keys report descriptor: %llx\n",
7911390 __func__, djdev->reports_supported);
7921391 rdcat(rdesc, &rsize, syscontrol_descriptor, sizeof(syscontrol_descriptor));
7931392 }
7941393
7951394 if (djdev->reports_supported & MEDIA_CENTER) {
796
- dbg_hid("%s: sending a media center report descriptor: %x\n",
1395
+ dbg_hid("%s: sending a media center report descriptor: %llx\n",
7971396 __func__, djdev->reports_supported);
7981397 rdcat(rdesc, &rsize, media_descriptor, sizeof(media_descriptor));
7991398 }
8001399
8011400 if (djdev->reports_supported & KBD_LEDS) {
802
- dbg_hid("%s: need to send kbd leds report descriptor: %x\n",
1401
+ dbg_hid("%s: need to send kbd leds report descriptor: %llx\n",
8031402 __func__, djdev->reports_supported);
8041403 }
8051404
806
- rdcat(rdesc, &rsize, hidpp_descriptor, sizeof(hidpp_descriptor));
1405
+ if (djdev->reports_supported & HIDPP) {
1406
+ dbg_hid("%s: sending a HID++ descriptor, reports_supported: %llx\n",
1407
+ __func__, djdev->reports_supported);
1408
+ rdcat(rdesc, &rsize, hidpp_descriptor,
1409
+ sizeof(hidpp_descriptor));
1410
+ }
8071411
8081412 retval = hid_parse_report(hid, rdesc, rsize);
8091413 kfree(rdesc);
....@@ -866,7 +1470,7 @@
8661470 * so ignore those reports too.
8671471 */
8681472 if (dj_report->device_index != DJ_RECEIVER_INDEX)
869
- dev_err(&hdev->dev, "%s: invalid device index:%d\n",
1473
+ hid_err(hdev, "%s: invalid device index:%d\n",
8701474 __func__, dj_report->device_index);
8711475 return false;
8721476 }
....@@ -893,7 +1497,7 @@
8931497 }
8941498 break;
8951499 default:
896
- logi_dj_recv_forward_report(djrcv_dev, dj_report);
1500
+ logi_dj_recv_forward_dj(djrcv_dev, dj_report);
8971501 }
8981502
8991503 out:
....@@ -907,9 +1511,10 @@
9071511 int size)
9081512 {
9091513 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
910
- struct dj_report *dj_report = (struct dj_report *) data;
1514
+ struct hidpp_event *hidpp_report = (struct hidpp_event *) data;
1515
+ struct dj_device *dj_dev;
9111516 unsigned long flags;
912
- u8 device_index = dj_report->device_index;
1517
+ u8 device_index = hidpp_report->device_index;
9131518
9141519 if (device_index == HIDPP_RECEIVER_INDEX) {
9151520 /* special case were the device wants to know its unifying
....@@ -937,21 +1542,42 @@
9371542 * This driver can ignore safely the receiver notifications,
9381543 * so ignore those reports too.
9391544 */
940
- dev_err(&hdev->dev, "%s: invalid device index:%d\n",
941
- __func__, dj_report->device_index);
1545
+ hid_err(hdev, "%s: invalid device index:%d\n", __func__,
1546
+ hidpp_report->device_index);
9421547 return false;
9431548 }
9441549
9451550 spin_lock_irqsave(&djrcv_dev->lock, flags);
9461551
947
- if (!djrcv_dev->paired_dj_devices[device_index])
948
- /* received an event for an unknown device, bail out */
949
- goto out;
1552
+ dj_dev = djrcv_dev->paired_dj_devices[device_index];
9501553
951
- logi_dj_recv_forward_hidpp(djrcv_dev->paired_dj_devices[device_index],
952
- data, size);
1554
+ /*
1555
+ * With 27 MHz receivers, we do not get an explicit unpair event,
1556
+ * remove the old device if the user has paired a *different* device.
1557
+ */
1558
+ if (djrcv_dev->type == recvr_type_27mhz && dj_dev &&
1559
+ hidpp_report->sub_id == REPORT_TYPE_NOTIF_DEVICE_CONNECTED &&
1560
+ hidpp_report->params[HIDPP_PARAM_PROTO_TYPE] == 0x02 &&
1561
+ hidpp_report->params[HIDPP_PARAM_27MHZ_DEVID] !=
1562
+ dj_dev->hdev->product) {
1563
+ struct dj_workitem workitem = {
1564
+ .device_index = hidpp_report->device_index,
1565
+ .type = WORKITEM_TYPE_UNPAIRED,
1566
+ };
1567
+ kfifo_in(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem));
1568
+ /* logi_hidpp_recv_queue_notif will queue the work */
1569
+ dj_dev = NULL;
1570
+ }
9531571
954
-out:
1572
+ if (dj_dev) {
1573
+ logi_dj_recv_forward_report(dj_dev, data, size);
1574
+ } else {
1575
+ if (hidpp_report->sub_id == REPORT_TYPE_NOTIF_DEVICE_CONNECTED)
1576
+ logi_hidpp_recv_queue_notif(hdev, hidpp_report);
1577
+ else
1578
+ logi_dj_recv_queue_unknown_work(djrcv_dev);
1579
+ }
1580
+
9551581 spin_unlock_irqrestore(&djrcv_dev->lock, flags);
9561582
9571583 return false;
....@@ -961,30 +1587,75 @@
9611587 struct hid_report *report, u8 *data,
9621588 int size)
9631589 {
1590
+ struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
9641591 dbg_hid("%s, size:%d\n", __func__, size);
1592
+
1593
+ if (!djrcv_dev)
1594
+ return 0;
1595
+
1596
+ if (!hdev->report_enum[HID_INPUT_REPORT].numbered) {
1597
+
1598
+ if (djrcv_dev->unnumbered_application == HID_GD_KEYBOARD) {
1599
+ /*
1600
+ * For the keyboard, we can reuse the same report by
1601
+ * using the second byte which is constant in the USB
1602
+ * HID report descriptor.
1603
+ */
1604
+ data[1] = data[0];
1605
+ data[0] = REPORT_TYPE_KEYBOARD;
1606
+
1607
+ logi_dj_recv_forward_input_report(hdev, data, size);
1608
+
1609
+ /* restore previous state */
1610
+ data[0] = data[1];
1611
+ data[1] = 0;
1612
+ }
1613
+ /*
1614
+ * Mouse-only receivers send unnumbered mouse data. The 27 MHz
1615
+ * receiver uses 6 byte packets, the nano receiver 8 bytes.
1616
+ */
1617
+ if (djrcv_dev->unnumbered_application == HID_GD_MOUSE &&
1618
+ size <= 8) {
1619
+ u8 mouse_report[9];
1620
+
1621
+ /* Prepend report id */
1622
+ mouse_report[0] = REPORT_TYPE_MOUSE;
1623
+ memcpy(mouse_report + 1, data, size);
1624
+ logi_dj_recv_forward_input_report(hdev, mouse_report,
1625
+ size + 1);
1626
+ }
1627
+
1628
+ return false;
1629
+ }
9651630
9661631 switch (data[0]) {
9671632 case REPORT_ID_DJ_SHORT:
9681633 if (size != DJREPORT_SHORT_LENGTH) {
969
- dev_err(&hdev->dev, "DJ report of bad size (%d)", size);
1634
+ hid_err(hdev, "Short DJ report bad size (%d)", size);
1635
+ return false;
1636
+ }
1637
+ return logi_dj_dj_event(hdev, report, data, size);
1638
+ case REPORT_ID_DJ_LONG:
1639
+ if (size != DJREPORT_LONG_LENGTH) {
1640
+ hid_err(hdev, "Long DJ report bad size (%d)", size);
9701641 return false;
9711642 }
9721643 return logi_dj_dj_event(hdev, report, data, size);
9731644 case REPORT_ID_HIDPP_SHORT:
9741645 if (size != HIDPP_REPORT_SHORT_LENGTH) {
975
- dev_err(&hdev->dev,
976
- "Short HID++ report of bad size (%d)", size);
1646
+ hid_err(hdev, "Short HID++ report bad size (%d)", size);
9771647 return false;
9781648 }
9791649 return logi_dj_hidpp_event(hdev, report, data, size);
9801650 case REPORT_ID_HIDPP_LONG:
9811651 if (size != HIDPP_REPORT_LONG_LENGTH) {
982
- dev_err(&hdev->dev,
983
- "Long HID++ report of bad size (%d)", size);
1652
+ hid_err(hdev, "Long HID++ report bad size (%d)", size);
9841653 return false;
9851654 }
9861655 return logi_dj_hidpp_event(hdev, report, data, size);
9871656 }
1657
+
1658
+ logi_dj_recv_forward_input_report(hdev, data, size);
9881659
9891660 return false;
9901661 }
....@@ -992,81 +1663,105 @@
9921663 static int logi_dj_probe(struct hid_device *hdev,
9931664 const struct hid_device_id *id)
9941665 {
995
- struct usb_interface *intf = to_usb_interface(hdev->dev.parent);
1666
+ struct hid_report_enum *rep_enum;
1667
+ struct hid_report *rep;
9961668 struct dj_receiver_dev *djrcv_dev;
1669
+ struct usb_interface *intf;
1670
+ unsigned int no_dj_interfaces = 0;
1671
+ bool has_hidpp = false;
1672
+ unsigned long flags;
9971673 int retval;
9981674
999
- dbg_hid("%s called for ifnum %d\n", __func__,
1000
- intf->cur_altsetting->desc.bInterfaceNumber);
1001
-
1002
- /* Ignore interfaces 0 and 1, they will not carry any data, dont create
1003
- * any hid_device for them */
1004
- if (intf->cur_altsetting->desc.bInterfaceNumber !=
1005
- LOGITECH_DJ_INTERFACE_NUMBER) {
1006
- dbg_hid("%s: ignoring ifnum %d\n", __func__,
1007
- intf->cur_altsetting->desc.bInterfaceNumber);
1008
- return -ENODEV;
1009
- }
1010
-
1011
- /* Treat interface 2 */
1012
-
1013
- djrcv_dev = kzalloc(sizeof(struct dj_receiver_dev), GFP_KERNEL);
1014
- if (!djrcv_dev) {
1015
- dev_err(&hdev->dev,
1016
- "%s:failed allocating dj_receiver_dev\n", __func__);
1017
- return -ENOMEM;
1018
- }
1019
- djrcv_dev->hdev = hdev;
1020
- INIT_WORK(&djrcv_dev->work, delayedwork_callback);
1021
- spin_lock_init(&djrcv_dev->lock);
1022
- if (kfifo_alloc(&djrcv_dev->notif_fifo,
1023
- DJ_MAX_NUMBER_NOTIFICATIONS * sizeof(struct dj_report),
1024
- GFP_KERNEL)) {
1025
- dev_err(&hdev->dev,
1026
- "%s:failed allocating notif_fifo\n", __func__);
1027
- kfree(djrcv_dev);
1028
- return -ENOMEM;
1029
- }
1030
- hid_set_drvdata(hdev, djrcv_dev);
1031
-
1032
- /* Call to usbhid to fetch the HID descriptors of interface 2 and
1033
- * subsequently call to the hid/hid-core to parse the fetched
1034
- * descriptors, this will in turn create the hidraw and hiddev nodes
1035
- * for interface 2 of the receiver */
1675
+ /*
1676
+ * Call to usbhid to fetch the HID descriptors of the current
1677
+ * interface subsequently call to the hid/hid-core to parse the
1678
+ * fetched descriptors.
1679
+ */
10361680 retval = hid_parse(hdev);
10371681 if (retval) {
1038
- dev_err(&hdev->dev,
1039
- "%s:parse of interface 2 failed\n", __func__);
1040
- goto hid_parse_fail;
1682
+ hid_err(hdev, "%s: parse failed\n", __func__);
1683
+ return retval;
10411684 }
10421685
1043
- if (!hid_validate_values(hdev, HID_OUTPUT_REPORT, REPORT_ID_DJ_SHORT,
1044
- 0, DJREPORT_SHORT_LENGTH - 1)) {
1045
- retval = -ENODEV;
1046
- goto hid_parse_fail;
1686
+ /*
1687
+ * Some KVMs add an extra interface for e.g. mouse emulation. If we
1688
+ * treat these as logitech-dj interfaces then this causes input events
1689
+ * reported through this extra interface to not be reported correctly.
1690
+ * To avoid this, we treat these as generic-hid devices.
1691
+ */
1692
+ switch (id->driver_data) {
1693
+ case recvr_type_dj: no_dj_interfaces = 3; break;
1694
+ case recvr_type_hidpp: no_dj_interfaces = 2; break;
1695
+ case recvr_type_gaming_hidpp: no_dj_interfaces = 3; break;
1696
+ case recvr_type_mouse_only: no_dj_interfaces = 2; break;
1697
+ case recvr_type_27mhz: no_dj_interfaces = 2; break;
1698
+ case recvr_type_bluetooth: no_dj_interfaces = 2; break;
10471699 }
1700
+ if (hid_is_usb(hdev)) {
1701
+ intf = to_usb_interface(hdev->dev.parent);
1702
+ if (intf && intf->altsetting->desc.bInterfaceNumber >=
1703
+ no_dj_interfaces) {
1704
+ hdev->quirks |= HID_QUIRK_INPUT_PER_APP;
1705
+ return hid_hw_start(hdev, HID_CONNECT_DEFAULT);
1706
+ }
1707
+ }
1708
+
1709
+ rep_enum = &hdev->report_enum[HID_INPUT_REPORT];
1710
+
1711
+ /* no input reports, bail out */
1712
+ if (list_empty(&rep_enum->report_list))
1713
+ return -ENODEV;
1714
+
1715
+ /*
1716
+ * Check for the HID++ application.
1717
+ * Note: we should theoretically check for HID++ and DJ
1718
+ * collections, but this will do.
1719
+ */
1720
+ list_for_each_entry(rep, &rep_enum->report_list, list) {
1721
+ if (rep->application == 0xff000001)
1722
+ has_hidpp = true;
1723
+ }
1724
+
1725
+ /*
1726
+ * Ignore interfaces without DJ/HID++ collection, they will not carry
1727
+ * any data, dont create any hid_device for them.
1728
+ */
1729
+ if (!has_hidpp && id->driver_data == recvr_type_dj)
1730
+ return -ENODEV;
1731
+
1732
+ /* get the current application attached to the node */
1733
+ rep = list_first_entry(&rep_enum->report_list, struct hid_report, list);
1734
+ djrcv_dev = dj_get_receiver_dev(hdev, id->driver_data,
1735
+ rep->application, has_hidpp);
1736
+ if (!djrcv_dev) {
1737
+ hid_err(hdev, "%s: dj_get_receiver_dev failed\n", __func__);
1738
+ return -ENOMEM;
1739
+ }
1740
+
1741
+ if (!rep_enum->numbered)
1742
+ djrcv_dev->unnumbered_application = rep->application;
10481743
10491744 /* Starts the usb device and connects to upper interfaces hiddev and
10501745 * hidraw */
1051
- retval = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
1746
+ retval = hid_hw_start(hdev, HID_CONNECT_HIDRAW|HID_CONNECT_HIDDEV);
10521747 if (retval) {
1053
- dev_err(&hdev->dev,
1054
- "%s:hid_hw_start returned error\n", __func__);
1748
+ hid_err(hdev, "%s: hid_hw_start returned error\n", __func__);
10551749 goto hid_hw_start_fail;
10561750 }
10571751
1058
- retval = logi_dj_recv_switch_to_dj_mode(djrcv_dev, 0);
1059
- if (retval < 0) {
1060
- dev_err(&hdev->dev,
1061
- "%s:logi_dj_recv_switch_to_dj_mode returned error:%d\n",
1062
- __func__, retval);
1063
- goto switch_to_dj_mode_fail;
1752
+ if (has_hidpp) {
1753
+ retval = logi_dj_recv_switch_to_dj_mode(djrcv_dev, 0);
1754
+ if (retval < 0) {
1755
+ hid_err(hdev, "%s: logi_dj_recv_switch_to_dj_mode returned error:%d\n",
1756
+ __func__, retval);
1757
+ goto switch_to_dj_mode_fail;
1758
+ }
10641759 }
10651760
10661761 /* This is enabling the polling urb on the IN endpoint */
10671762 retval = hid_hw_open(hdev);
10681763 if (retval < 0) {
1069
- dev_err(&hdev->dev, "%s:hid_hw_open returned error:%d\n",
1764
+ hid_err(hdev, "%s: hid_hw_open returned error:%d\n",
10701765 __func__, retval);
10711766 goto llopen_failed;
10721767 }
....@@ -1074,29 +1769,30 @@
10741769 /* Allow incoming packets to arrive: */
10751770 hid_device_io_start(hdev);
10761771
1077
- retval = logi_dj_recv_query_paired_devices(djrcv_dev);
1078
- if (retval < 0) {
1079
- dev_err(&hdev->dev, "%s:logi_dj_recv_query_paired_devices "
1080
- "error:%d\n", __func__, retval);
1081
- goto logi_dj_recv_query_paired_devices_failed;
1772
+ if (has_hidpp) {
1773
+ spin_lock_irqsave(&djrcv_dev->lock, flags);
1774
+ djrcv_dev->ready = true;
1775
+ spin_unlock_irqrestore(&djrcv_dev->lock, flags);
1776
+ retval = logi_dj_recv_query_paired_devices(djrcv_dev);
1777
+ if (retval < 0) {
1778
+ hid_err(hdev, "%s: logi_dj_recv_query_paired_devices error:%d\n",
1779
+ __func__, retval);
1780
+ /*
1781
+ * This can happen with a KVM, let the probe succeed,
1782
+ * logi_dj_recv_queue_unknown_work will retry later.
1783
+ */
1784
+ }
10821785 }
10831786
1084
- return retval;
1085
-
1086
-logi_dj_recv_query_paired_devices_failed:
1087
- hid_hw_close(hdev);
1787
+ return 0;
10881788
10891789 llopen_failed:
10901790 switch_to_dj_mode_fail:
10911791 hid_hw_stop(hdev);
10921792
10931793 hid_hw_start_fail:
1094
-hid_parse_fail:
1095
- kfifo_free(&djrcv_dev->notif_fifo);
1096
- kfree(djrcv_dev);
1097
- hid_set_drvdata(hdev, NULL);
1794
+ dj_put_receiver_dev(hdev);
10981795 return retval;
1099
-
11001796 }
11011797
11021798 #ifdef CONFIG_PM
....@@ -1105,10 +1801,12 @@
11051801 int retval;
11061802 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
11071803
1804
+ if (!djrcv_dev || djrcv_dev->hidpp != hdev)
1805
+ return 0;
1806
+
11081807 retval = logi_dj_recv_switch_to_dj_mode(djrcv_dev, 0);
11091808 if (retval < 0) {
1110
- dev_err(&hdev->dev,
1111
- "%s:logi_dj_recv_switch_to_dj_mode returned error:%d\n",
1809
+ hid_err(hdev, "%s: logi_dj_recv_switch_to_dj_mode returned error:%d\n",
11121810 __func__, retval);
11131811 }
11141812
....@@ -1120,39 +1818,110 @@
11201818 {
11211819 struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
11221820 struct dj_device *dj_dev;
1821
+ unsigned long flags;
11231822 int i;
11241823
11251824 dbg_hid("%s\n", __func__);
1825
+
1826
+ if (!djrcv_dev)
1827
+ return hid_hw_stop(hdev);
1828
+
1829
+ /*
1830
+ * This ensures that if the work gets requeued from another
1831
+ * interface of the same receiver it will be a no-op.
1832
+ */
1833
+ spin_lock_irqsave(&djrcv_dev->lock, flags);
1834
+ djrcv_dev->ready = false;
1835
+ spin_unlock_irqrestore(&djrcv_dev->lock, flags);
11261836
11271837 cancel_work_sync(&djrcv_dev->work);
11281838
11291839 hid_hw_close(hdev);
11301840 hid_hw_stop(hdev);
11311841
1132
- /* I suppose that at this point the only context that can access
1133
- * the djrecv_data is this thread as the work item is guaranteed to
1134
- * have finished and no more raw_event callbacks should arrive after
1135
- * the remove callback was triggered so no locks are put around the
1136
- * code below */
1842
+ /*
1843
+ * For proper operation we need access to all interfaces, so we destroy
1844
+ * the paired devices when we're unbound from any interface.
1845
+ *
1846
+ * Note we may still be bound to other interfaces, sharing the same
1847
+ * djrcv_dev, so we need locking here.
1848
+ */
11371849 for (i = 0; i < (DJ_MAX_PAIRED_DEVICES + DJ_DEVICE_INDEX_MIN); i++) {
1850
+ spin_lock_irqsave(&djrcv_dev->lock, flags);
11381851 dj_dev = djrcv_dev->paired_dj_devices[i];
1852
+ djrcv_dev->paired_dj_devices[i] = NULL;
1853
+ spin_unlock_irqrestore(&djrcv_dev->lock, flags);
11391854 if (dj_dev != NULL) {
11401855 hid_destroy_device(dj_dev->hdev);
11411856 kfree(dj_dev);
1142
- djrcv_dev->paired_dj_devices[i] = NULL;
11431857 }
11441858 }
11451859
1146
- kfifo_free(&djrcv_dev->notif_fifo);
1147
- kfree(djrcv_dev);
1148
- hid_set_drvdata(hdev, NULL);
1860
+ dj_put_receiver_dev(hdev);
11491861 }
11501862
11511863 static const struct hid_device_id logi_dj_receivers[] = {
11521864 {HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1153
- USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER)},
1865
+ USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER),
1866
+ .driver_data = recvr_type_dj},
11541867 {HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1155
- USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER_2)},
1868
+ USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER_2),
1869
+ .driver_data = recvr_type_dj},
1870
+ { /* Logitech Nano mouse only receiver */
1871
+ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1872
+ USB_DEVICE_ID_LOGITECH_NANO_RECEIVER),
1873
+ .driver_data = recvr_type_mouse_only},
1874
+ { /* Logitech Nano (non DJ) receiver */
1875
+ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1876
+ USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_2),
1877
+ .driver_data = recvr_type_hidpp},
1878
+ { /* Logitech G700(s) receiver (0xc531) */
1879
+ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1880
+ 0xc531),
1881
+ .driver_data = recvr_type_gaming_hidpp},
1882
+ { /* Logitech G602 receiver (0xc537) */
1883
+ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1884
+ 0xc537),
1885
+ .driver_data = recvr_type_gaming_hidpp},
1886
+ { /* Logitech lightspeed receiver (0xc539) */
1887
+ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1888
+ USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_LIGHTSPEED_1),
1889
+ .driver_data = recvr_type_gaming_hidpp},
1890
+ { /* Logitech lightspeed receiver (0xc53f) */
1891
+ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1892
+ USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_LIGHTSPEED_1_1),
1893
+ .driver_data = recvr_type_gaming_hidpp},
1894
+ { /* Logitech 27 MHz HID++ 1.0 receiver (0xc513) */
1895
+ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER),
1896
+ .driver_data = recvr_type_27mhz},
1897
+ { /* Logitech powerplay receiver (0xc53a) */
1898
+ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1899
+ USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_POWERPLAY),
1900
+ .driver_data = recvr_type_gaming_hidpp},
1901
+ { /* Logitech 27 MHz HID++ 1.0 receiver (0xc517) */
1902
+ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1903
+ USB_DEVICE_ID_S510_RECEIVER_2),
1904
+ .driver_data = recvr_type_27mhz},
1905
+ { /* Logitech 27 MHz HID++ 1.0 mouse-only receiver (0xc51b) */
1906
+ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1907
+ USB_DEVICE_ID_LOGITECH_27MHZ_MOUSE_RECEIVER),
1908
+ .driver_data = recvr_type_27mhz},
1909
+ { /* Logitech MX5000 HID++ / bluetooth receiver keyboard intf. */
1910
+ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1911
+ 0xc70e),
1912
+ .driver_data = recvr_type_bluetooth},
1913
+ { /* Logitech MX5000 HID++ / bluetooth receiver mouse intf. */
1914
+ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1915
+ 0xc70a),
1916
+ .driver_data = recvr_type_bluetooth},
1917
+ { /* Logitech MX5500 HID++ / bluetooth receiver keyboard intf. */
1918
+ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1919
+ 0xc71b),
1920
+ .driver_data = recvr_type_bluetooth},
1921
+ { /* Logitech MX5500 HID++ / bluetooth receiver mouse intf. */
1922
+ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1923
+ 0xc71c),
1924
+ .driver_data = recvr_type_bluetooth},
11561925 {}
11571926 };
11581927