1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 *  HID driver for Logitech receivers
4 *
5 *  Copyright (c) 2011 Logitech
6 */
7
8
9
10#include <linux/device.h>
11#include <linux/hid.h>
12#include <linux/module.h>
13#include <linux/kfifo.h>
14#include <linux/delay.h>
15#include <linux/usb.h> /* For to_usb_interface for kvm extra intf check */
16#include <asm/unaligned.h>
17#include "hid-ids.h"
18
19#define DJ_MAX_PAIRED_DEVICES			7
20#define DJ_MAX_NUMBER_NOTIFS			8
21#define DJ_RECEIVER_INDEX			0
22#define DJ_DEVICE_INDEX_MIN			1
23#define DJ_DEVICE_INDEX_MAX			7
24
25#define DJREPORT_SHORT_LENGTH			15
26#define DJREPORT_LONG_LENGTH			32
27
28#define REPORT_ID_DJ_SHORT			0x20
29#define REPORT_ID_DJ_LONG			0x21
30
31#define REPORT_ID_HIDPP_SHORT			0x10
32#define REPORT_ID_HIDPP_LONG			0x11
33#define REPORT_ID_HIDPP_VERY_LONG		0x12
34
35#define HIDPP_REPORT_SHORT_LENGTH		7
36#define HIDPP_REPORT_LONG_LENGTH		20
37
38#define HIDPP_RECEIVER_INDEX			0xff
39
40#define REPORT_TYPE_RFREPORT_FIRST		0x01
41#define REPORT_TYPE_RFREPORT_LAST		0x1F
42
43/* Command Switch to DJ mode */
44#define REPORT_TYPE_CMD_SWITCH			0x80
45#define CMD_SWITCH_PARAM_DEVBITFIELD		0x00
46#define CMD_SWITCH_PARAM_TIMEOUT_SECONDS	0x01
47#define TIMEOUT_NO_KEEPALIVE			0x00
48
49/* Command to Get the list of Paired devices */
50#define REPORT_TYPE_CMD_GET_PAIRED_DEVICES	0x81
51
52/* Device Paired Notification */
53#define REPORT_TYPE_NOTIF_DEVICE_PAIRED		0x41
54#define SPFUNCTION_MORE_NOTIF_EXPECTED		0x01
55#define SPFUNCTION_DEVICE_LIST_EMPTY		0x02
56#define DEVICE_PAIRED_PARAM_SPFUNCTION		0x00
57#define DEVICE_PAIRED_PARAM_EQUAD_ID_LSB	0x01
58#define DEVICE_PAIRED_PARAM_EQUAD_ID_MSB	0x02
59#define DEVICE_PAIRED_RF_REPORT_TYPE		0x03
60
61/* Device Un-Paired Notification */
62#define REPORT_TYPE_NOTIF_DEVICE_UNPAIRED	0x40
63
64/* Connection Status Notification */
65#define REPORT_TYPE_NOTIF_CONNECTION_STATUS	0x42
66#define CONNECTION_STATUS_PARAM_STATUS		0x00
67#define STATUS_LINKLOSS				0x01
68
69/* Error Notification */
70#define REPORT_TYPE_NOTIF_ERROR			0x7F
71#define NOTIF_ERROR_PARAM_ETYPE			0x00
72#define ETYPE_KEEPALIVE_TIMEOUT			0x01
73
74/* supported DJ HID && RF report types */
75#define REPORT_TYPE_KEYBOARD			0x01
76#define REPORT_TYPE_MOUSE			0x02
77#define REPORT_TYPE_CONSUMER_CONTROL		0x03
78#define REPORT_TYPE_SYSTEM_CONTROL		0x04
79#define REPORT_TYPE_MEDIA_CENTER		0x08
80#define REPORT_TYPE_LEDS			0x0E
81
82/* RF Report types bitfield */
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
113enum 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};
121
122struct dj_report {
123	u8 report_id;
124	u8 device_index;
125	u8 report_type;
126	u8 report_params[DJREPORT_SHORT_LENGTH - 3];
127};
128
129struct 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
136struct dj_receiver_dev {
137	struct hid_device *mouse;
138	struct hid_device *keyboard;
139	struct hid_device *hidpp;
140	struct dj_device *paired_dj_devices[DJ_MAX_PAIRED_DEVICES +
141					    DJ_DEVICE_INDEX_MIN];
142	struct list_head list;
143	struct kref kref;
144	struct work_struct work;
145	struct kfifo notif_fifo;
146	unsigned long last_query; /* in jiffies */
147	bool ready;
148	enum recvr_type type;
149	unsigned int unnumbered_application;
150	spinlock_t lock;
151};
152
153struct dj_device {
154	struct hid_device *hdev;
155	struct dj_receiver_dev *dj_receiver_dev;
156	u64 reports_supported;
157	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
165struct 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;
172};
173
174/* Keyboard descriptor (1) */
175static const char kbd_descriptor[] = {
176	0x05, 0x01,		/* USAGE_PAGE (generic Desktop)     */
177	0x09, 0x06,		/* USAGE (Keyboard)         */
178	0xA1, 0x01,		/* COLLECTION (Application)     */
179	0x85, 0x01,		/* REPORT_ID (1)            */
180	0x95, 0x08,		/*   REPORT_COUNT (8)           */
181	0x75, 0x01,		/*   REPORT_SIZE (1)            */
182	0x15, 0x00,		/*   LOGICAL_MINIMUM (0)        */
183	0x25, 0x01,		/*   LOGICAL_MAXIMUM (1)        */
184	0x05, 0x07,		/*   USAGE_PAGE (Keyboard)      */
185	0x19, 0xE0,		/*   USAGE_MINIMUM (Left Control)   */
186	0x29, 0xE7,		/*   USAGE_MAXIMUM (Right GUI)      */
187	0x81, 0x02,		/*   INPUT (Data,Var,Abs)       */
188	0x95, 0x06,		/*   REPORT_COUNT (6)           */
189	0x75, 0x08,		/*   REPORT_SIZE (8)            */
190	0x15, 0x00,		/*   LOGICAL_MINIMUM (0)        */
191	0x26, 0xFF, 0x00,	/*   LOGICAL_MAXIMUM (255)      */
192	0x05, 0x07,		/*   USAGE_PAGE (Keyboard)      */
193	0x19, 0x00,		/*   USAGE_MINIMUM (no event)       */
194	0x2A, 0xFF, 0x00,	/*   USAGE_MAXIMUM (reserved)       */
195	0x81, 0x00,		/*   INPUT (Data,Ary,Abs)       */
196	0x85, 0x0e,		/* REPORT_ID (14)               */
197	0x05, 0x08,		/*   USAGE PAGE (LED page)      */
198	0x95, 0x05,		/*   REPORT COUNT (5)           */
199	0x75, 0x01,		/*   REPORT SIZE (1)            */
200	0x15, 0x00,		/*   LOGICAL_MINIMUM (0)        */
201	0x25, 0x01,		/*   LOGICAL_MAXIMUM (1)        */
202	0x19, 0x01,		/*   USAGE MINIMUM (1)          */
203	0x29, 0x05,		/*   USAGE MAXIMUM (5)          */
204	0x91, 0x02,		/*   OUTPUT (Data, Variable, Absolute)  */
205	0x95, 0x01,		/*   REPORT COUNT (1)           */
206	0x75, 0x03,		/*   REPORT SIZE (3)            */
207	0x91, 0x01,		/*   OUTPUT (Constant)          */
208	0xC0
209};
210
211/* Mouse descriptor (2)     */
212static const char mse_descriptor[] = {
213	0x05, 0x01,		/*  USAGE_PAGE (Generic Desktop)        */
214	0x09, 0x02,		/*  USAGE (Mouse)                       */
215	0xA1, 0x01,		/*  COLLECTION (Application)            */
216	0x85, 0x02,		/*    REPORT_ID = 2                     */
217	0x09, 0x01,		/*    USAGE (pointer)                   */
218	0xA1, 0x00,		/*    COLLECTION (physical)             */
219	0x05, 0x09,		/*      USAGE_PAGE (buttons)            */
220	0x19, 0x01,		/*      USAGE_MIN (1)                   */
221	0x29, 0x10,		/*      USAGE_MAX (16)                  */
222	0x15, 0x00,		/*      LOGICAL_MIN (0)                 */
223	0x25, 0x01,		/*      LOGICAL_MAX (1)                 */
224	0x95, 0x10,		/*      REPORT_COUNT (16)               */
225	0x75, 0x01,		/*      REPORT_SIZE (1)                 */
226	0x81, 0x02,		/*      INPUT (data var abs)            */
227	0x05, 0x01,		/*      USAGE_PAGE (generic desktop)    */
228	0x16, 0x01, 0xF8,	/*      LOGICAL_MIN (-2047)             */
229	0x26, 0xFF, 0x07,	/*      LOGICAL_MAX (2047)              */
230	0x75, 0x0C,		/*      REPORT_SIZE (12)                */
231	0x95, 0x02,		/*      REPORT_COUNT (2)                */
232	0x09, 0x30,		/*      USAGE (X)                       */
233	0x09, 0x31,		/*      USAGE (Y)                       */
234	0x81, 0x06,		/*      INPUT                           */
235	0x15, 0x81,		/*      LOGICAL_MIN (-127)              */
236	0x25, 0x7F,		/*      LOGICAL_MAX (127)               */
237	0x75, 0x08,		/*      REPORT_SIZE (8)                 */
238	0x95, 0x01,		/*      REPORT_COUNT (1)                */
239	0x09, 0x38,		/*      USAGE (wheel)                   */
240	0x81, 0x06,		/*      INPUT                           */
241	0x05, 0x0C,		/*      USAGE_PAGE(consumer)            */
242	0x0A, 0x38, 0x02,	/*      USAGE(AC Pan)                   */
243	0x95, 0x01,		/*      REPORT_COUNT (1)                */
244	0x81, 0x06,		/*      INPUT                           */
245	0xC0,			/*    END_COLLECTION                    */
246	0xC0,			/*  END_COLLECTION                      */
247};
248
249/* Mouse descriptor (2) for 27 MHz receiver, only 8 buttons */
250static 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 */
288static 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) */
337static 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
374/* Consumer Control descriptor (3) */
375static const char consumer_descriptor[] = {
376	0x05, 0x0C,		/* USAGE_PAGE (Consumer Devices)       */
377	0x09, 0x01,		/* USAGE (Consumer Control)            */
378	0xA1, 0x01,		/* COLLECTION (Application)            */
379	0x85, 0x03,		/* REPORT_ID = 3                       */
380	0x75, 0x10,		/* REPORT_SIZE (16)                    */
381	0x95, 0x02,		/* REPORT_COUNT (2)                    */
382	0x15, 0x01,		/* LOGICAL_MIN (1)                     */
383	0x26, 0xFF, 0x02,	/* LOGICAL_MAX (767)                   */
384	0x19, 0x01,		/* USAGE_MIN (1)                       */
385	0x2A, 0xFF, 0x02,	/* USAGE_MAX (767)                     */
386	0x81, 0x00,		/* INPUT (Data Ary Abs)                */
387	0xC0,			/* END_COLLECTION                      */
388};				/*                                     */
389
390/* System control descriptor (4) */
391static const char syscontrol_descriptor[] = {
392	0x05, 0x01,		/*   USAGE_PAGE (Generic Desktop)      */
393	0x09, 0x80,		/*   USAGE (System Control)            */
394	0xA1, 0x01,		/*   COLLECTION (Application)          */
395	0x85, 0x04,		/*   REPORT_ID = 4                     */
396	0x75, 0x02,		/*   REPORT_SIZE (2)                   */
397	0x95, 0x01,		/*   REPORT_COUNT (1)                  */
398	0x15, 0x01,		/*   LOGICAL_MIN (1)                   */
399	0x25, 0x03,		/*   LOGICAL_MAX (3)                   */
400	0x09, 0x82,		/*   USAGE (System Sleep)              */
401	0x09, 0x81,		/*   USAGE (System Power Down)         */
402	0x09, 0x83,		/*   USAGE (System Wake Up)            */
403	0x81, 0x60,		/*   INPUT (Data Ary Abs NPrf Null)    */
404	0x75, 0x06,		/*   REPORT_SIZE (6)                   */
405	0x81, 0x03,		/*   INPUT (Cnst Var Abs)              */
406	0xC0,			/*   END_COLLECTION                    */
407};
408
409/* Media descriptor (8) */
410static const char media_descriptor[] = {
411	0x06, 0xbc, 0xff,	/* Usage Page 0xffbc                   */
412	0x09, 0x88,		/* Usage 0x0088                        */
413	0xa1, 0x01,		/* BeginCollection                     */
414	0x85, 0x08,		/*   Report ID 8                       */
415	0x19, 0x01,		/*   Usage Min 0x0001                  */
416	0x29, 0xff,		/*   Usage Max 0x00ff                  */
417	0x15, 0x01,		/*   Logical Min 1                     */
418	0x26, 0xff, 0x00,	/*   Logical Max 255                   */
419	0x75, 0x08,		/*   Report Size 8                     */
420	0x95, 0x01,		/*   Report Count 1                    */
421	0x81, 0x00,		/*   Input                             */
422	0xc0,			/* EndCollection                       */
423};				/*                                     */
424
425/* HIDPP descriptor */
426static const char hidpp_descriptor[] = {
427	0x06, 0x00, 0xff,	/* Usage Page (Vendor Defined Page 1)  */
428	0x09, 0x01,		/* Usage (Vendor Usage 1)              */
429	0xa1, 0x01,		/* Collection (Application)            */
430	0x85, 0x10,		/*   Report ID (16)                    */
431	0x75, 0x08,		/*   Report Size (8)                   */
432	0x95, 0x06,		/*   Report Count (6)                  */
433	0x15, 0x00,		/*   Logical Minimum (0)               */
434	0x26, 0xff, 0x00,	/*   Logical Maximum (255)             */
435	0x09, 0x01,		/*   Usage (Vendor Usage 1)            */
436	0x81, 0x00,		/*   Input (Data,Arr,Abs)              */
437	0x09, 0x01,		/*   Usage (Vendor Usage 1)            */
438	0x91, 0x00,		/*   Output (Data,Arr,Abs)             */
439	0xc0,			/* End Collection                      */
440	0x06, 0x00, 0xff,	/* Usage Page (Vendor Defined Page 1)  */
441	0x09, 0x02,		/* Usage (Vendor Usage 2)              */
442	0xa1, 0x01,		/* Collection (Application)            */
443	0x85, 0x11,		/*   Report ID (17)                    */
444	0x75, 0x08,		/*   Report Size (8)                   */
445	0x95, 0x13,		/*   Report Count (19)                 */
446	0x15, 0x00,		/*   Logical Minimum (0)               */
447	0x26, 0xff, 0x00,	/*   Logical Maximum (255)             */
448	0x09, 0x02,		/*   Usage (Vendor Usage 2)            */
449	0x81, 0x00,		/*   Input (Data,Arr,Abs)              */
450	0x09, 0x02,		/*   Usage (Vendor Usage 2)            */
451	0x91, 0x00,		/*   Output (Data,Arr,Abs)             */
452	0xc0,			/* End Collection                      */
453	0x06, 0x00, 0xff,	/* Usage Page (Vendor Defined Page 1)  */
454	0x09, 0x04,		/* Usage (Vendor Usage 0x04)           */
455	0xa1, 0x01,		/* Collection (Application)            */
456	0x85, 0x20,		/*   Report ID (32)                    */
457	0x75, 0x08,		/*   Report Size (8)                   */
458	0x95, 0x0e,		/*   Report Count (14)                 */
459	0x15, 0x00,		/*   Logical Minimum (0)               */
460	0x26, 0xff, 0x00,	/*   Logical Maximum (255)             */
461	0x09, 0x41,		/*   Usage (Vendor Usage 0x41)         */
462	0x81, 0x00,		/*   Input (Data,Arr,Abs)              */
463	0x09, 0x41,		/*   Usage (Vendor Usage 0x41)         */
464	0x91, 0x00,		/*   Output (Data,Arr,Abs)             */
465	0x85, 0x21,		/*   Report ID (33)                    */
466	0x95, 0x1f,		/*   Report Count (31)                 */
467	0x15, 0x00,		/*   Logical Minimum (0)               */
468	0x26, 0xff, 0x00,	/*   Logical Maximum (255)             */
469	0x09, 0x42,		/*   Usage (Vendor Usage 0x42)         */
470	0x81, 0x00,		/*   Input (Data,Arr,Abs)              */
471	0x09, 0x42,		/*   Usage (Vendor Usage 0x42)         */
472	0x91, 0x00,		/*   Output (Data,Arr,Abs)             */
473	0xc0,			/* End Collection                      */
474};
475
476/* Maximum size of all defined hid reports in bytes (including report id) */
477#define MAX_REPORT_SIZE 8
478
479/* Make sure all descriptors are present here */
480#define MAX_RDESC_SIZE				\
481	(sizeof(kbd_descriptor) +		\
482	 sizeof(mse_bluetooth_descriptor) +	\
483	 sizeof(consumer_descriptor) +		\
484	 sizeof(syscontrol_descriptor) +	\
485	 sizeof(media_descriptor) +	\
486	 sizeof(hidpp_descriptor))
487
488/* Number of possible hid report types that can be created by this driver.
489 *
490 * Right now, RF report types have the same report types (or report id's)
491 * than the hid report created from those RF reports. In the future
492 * this doesnt have to be true.
493 *
494 * For instance, RF report type 0x01 which has a size of 8 bytes, corresponds
495 * to hid report id 0x01, this is standard keyboard. Same thing applies to mice
496 * reports and consumer control, etc. If a new RF report is created, it doesn't
497 * has to have the same report id as its corresponding hid report, so an
498 * translation may have to take place for future report types.
499 */
500#define NUMBER_OF_HID_REPORTS 32
501static const u8 hid_reportid_size_map[NUMBER_OF_HID_REPORTS] = {
502	[1] = 8,		/* Standard keyboard */
503	[2] = 8,		/* Standard mouse */
504	[3] = 5,		/* Consumer control */
505	[4] = 2,		/* System control */
506	[8] = 2,		/* Media Center */
507};
508
509
510#define LOGITECH_DJ_INTERFACE_NUMBER 0x02
511
512static struct hid_ll_driver logi_dj_ll_driver;
513
514static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev);
515static void delayedwork_callback(struct work_struct *work);
516
517static LIST_HEAD(dj_hdev_list);
518static 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 */
527static 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
561static 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
570static 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
588static 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);
626out:
627	mutex_unlock(&dj_hdev_list_lock);
628	return djrcv_dev;
629}
630
631static void logi_dj_recv_destroy_djhid_device(struct dj_receiver_dev *djrcv_dev,
632					      struct dj_workitem *workitem)
633{
634	/* Called in delayed work context */
635	struct dj_device *dj_dev;
636	unsigned long flags;
637
638	spin_lock_irqsave(&djrcv_dev->lock, flags);
639	dj_dev = djrcv_dev->paired_dj_devices[workitem->device_index];
640	djrcv_dev->paired_dj_devices[workitem->device_index] = NULL;
641	spin_unlock_irqrestore(&djrcv_dev->lock, flags);
642
643	if (dj_dev != NULL) {
644		hid_destroy_device(dj_dev->hdev);
645		kfree(dj_dev);
646	} else {
647		hid_err(djrcv_dev->hidpp, "%s: can't destroy a NULL device\n",
648			__func__);
649	}
650}
651
652static void logi_dj_recv_add_djhid_device(struct dj_receiver_dev *djrcv_dev,
653					  struct dj_workitem *workitem)
654{
655	/* Called in delayed work context */
656	struct hid_device *djrcv_hdev = djrcv_dev->hidpp;
657	struct hid_device *dj_hiddev;
658	struct dj_device *dj_dev;
659	u8 device_index = workitem->device_index;
660	unsigned long flags;
661
662	/* Device index goes from 1 to 6, we need 3 bytes to store the
663	 * semicolon, the index, and a null terminator
664	 */
665	unsigned char tmpstr[3];
666
667	/* We are the only one ever adding a device, no need to lock */
668	if (djrcv_dev->paired_dj_devices[device_index]) {
669		/* The device is already known. No need to reallocate it. */
670		dbg_hid("%s: device is already known\n", __func__);
671		return;
672	}
673
674	dj_hiddev = hid_allocate_device();
675	if (IS_ERR(dj_hiddev)) {
676		hid_err(djrcv_hdev, "%s: hid_allocate_dev failed\n", __func__);
677		return;
678	}
679
680	dj_hiddev->ll_driver = &logi_dj_ll_driver;
681
682	dj_hiddev->dev.parent = &djrcv_hdev->dev;
683	dj_hiddev->bus = BUS_USB;
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";
689
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	}
707
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);
715	strlcat(dj_hiddev->phys, tmpstr, sizeof(dj_hiddev->phys));
716
717	dj_dev = kzalloc(sizeof(struct dj_device), GFP_KERNEL);
718
719	if (!dj_dev) {
720		hid_err(djrcv_hdev, "%s: failed allocating dj_dev\n", __func__);
721		goto dj_device_allocate_fail;
722	}
723
724	dj_dev->reports_supported = workitem->reports_supported;
725	dj_dev->hdev = dj_hiddev;
726	dj_dev->dj_receiver_dev = djrcv_dev;
727	dj_dev->device_index = device_index;
728	dj_hiddev->driver_data = dj_dev;
729
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);
733
734	if (hid_add_device(dj_hiddev)) {
735		hid_err(djrcv_hdev, "%s: failed adding dj_device\n", __func__);
736		goto hid_add_device_fail;
737	}
738
739	return;
740
741hid_add_device_fail:
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);
745	kfree(dj_dev);
746dj_device_allocate_fail:
747	hid_destroy_device(dj_hiddev);
748}
749
750static void delayedwork_callback(struct work_struct *work)
751{
752	struct dj_receiver_dev *djrcv_dev =
753		container_of(work, struct dj_receiver_dev, work);
754
755	struct dj_workitem workitem;
756	unsigned long flags;
757	int count;
758	int retval;
759
760	dbg_hid("%s\n", __func__);
761
762	spin_lock_irqsave(&djrcv_dev->lock, flags);
763
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__);
771		spin_unlock_irqrestore(&djrcv_dev->lock, flags);
772		return;
773	}
774
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;
780	}
781
782	if (!kfifo_is_empty(&djrcv_dev->notif_fifo))
783		schedule_work(&djrcv_dev->work);
784
785	spin_unlock_irqrestore(&djrcv_dev->lock, flags);
786
787	switch (workitem.type) {
788	case WORKITEM_TYPE_PAIRED:
789		logi_dj_recv_add_djhid_device(djrcv_dev, &workitem);
790		break;
791	case WORKITEM_TYPE_UNPAIRED:
792		logi_dj_recv_destroy_djhid_device(djrcv_dev, &workitem);
793		break;
794	case WORKITEM_TYPE_UNKNOWN:
795		retval = logi_dj_recv_query_paired_devices(djrcv_dev);
796		if (retval) {
797			hid_err(djrcv_dev->hidpp, "%s: logi_dj_recv_query_paired_devices error: %d\n",
798				__func__, retval);
799		}
800		break;
801	case WORKITEM_TYPE_EMPTY:
802		dbg_hid("%s: device list is empty\n", __func__);
803		break;
804	}
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 */
819static 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);
829}
830
831static void logi_dj_recv_queue_notification(struct dj_receiver_dev *djrcv_dev,
832					   struct dj_report *dj_report)
833{
834	/* We are called from atomic context (tasklet && djrcv->lock held) */
835	struct dj_workitem workitem = {
836		.device_index = dj_report->device_index,
837	};
838
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;
863	}
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 */
876static const u16 kbd_builtin_touchpad_ids[] = {
877	0xb309, /* Dinovo Edge */
878	0xb30c, /* Dinovo Mini */
879};
880
881static 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
914static 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
938static 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);
1030}
1031
1032static void logi_dj_recv_forward_null_report(struct dj_receiver_dev *djrcv_dev,
1033					     struct dj_report *dj_report)
1034{
1035	/* We are called from atomic context (tasklet && djrcv->lock held) */
1036	unsigned int i;
1037	u8 reportbuffer[MAX_REPORT_SIZE];
1038	struct dj_device *djdev;
1039
1040	djdev = djrcv_dev->paired_dj_devices[dj_report->device_index];
1041
1042	memset(reportbuffer, 0, sizeof(reportbuffer));
1043
1044	for (i = 0; i < NUMBER_OF_HID_REPORTS; i++) {
1045		if (djdev->reports_supported & (1 << i)) {
1046			reportbuffer[0] = i;
1047			if (hid_input_report(djdev->hdev,
1048					     HID_INPUT_REPORT,
1049					     reportbuffer,
1050					     hid_reportid_size_map[i], 1)) {
1051				dbg_hid("hid_input_report error sending null "
1052					"report\n");
1053			}
1054		}
1055	}
1056}
1057
1058static void logi_dj_recv_forward_dj(struct dj_receiver_dev *djrcv_dev,
1059				    struct dj_report *dj_report)
1060{
1061	/* We are called from atomic context (tasklet && djrcv->lock held) */
1062	struct dj_device *dj_device;
1063
1064	dj_device = djrcv_dev->paired_dj_devices[dj_report->device_index];
1065
1066	if ((dj_report->report_type > ARRAY_SIZE(hid_reportid_size_map) - 1) ||
1067	    (hid_reportid_size_map[dj_report->report_type] == 0)) {
1068		dbg_hid("invalid report type:%x\n", dj_report->report_type);
1069		return;
1070	}
1071
1072	if (hid_input_report(dj_device->hdev,
1073			HID_INPUT_REPORT, &dj_report->report_type,
1074			hid_reportid_size_map[dj_report->report_type], 1)) {
1075		dbg_hid("hid_input_report error\n");
1076	}
1077}
1078
1079static void logi_dj_recv_forward_report(struct dj_device *dj_dev, u8 *data,
1080					int size)
1081{
1082	/* We are called from atomic context (tasklet && djrcv->lock held) */
1083	if (hid_input_report(dj_dev->hdev, HID_INPUT_REPORT, data, size, 1))
1084		dbg_hid("hid_input_report error\n");
1085}
1086
1087static 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
1117static int logi_dj_recv_send_report(struct dj_receiver_dev *djrcv_dev,
1118				    struct dj_report *dj_report)
1119{
1120	struct hid_device *hdev = djrcv_dev->hidpp;
1121	struct hid_report *report;
1122	struct hid_report_enum *output_report_enum;
1123	u8 *data = (u8 *)(&dj_report->device_index);
1124	unsigned int i;
1125
1126	output_report_enum = &hdev->report_enum[HID_OUTPUT_REPORT];
1127	report = output_report_enum->report_id_hash[REPORT_ID_DJ_SHORT];
1128
1129	if (!report) {
1130		hid_err(hdev, "%s: unable to find dj report\n", __func__);
1131		return -ENODEV;
1132	}
1133
1134	for (i = 0; i < DJREPORT_SHORT_LENGTH - 1; i++)
1135		report->field[0]->value[i] = data[i];
1136
1137	hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
1138
1139	return 0;
1140}
1141
1142static 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
1169static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev)
1170{
1171	struct dj_report *dj_report;
1172	int retval;
1173
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);
1178
1179	dj_report = kzalloc(sizeof(struct dj_report), GFP_KERNEL);
1180	if (!dj_report)
1181		return -ENOMEM;
1182	dj_report->report_id = REPORT_ID_DJ_SHORT;
1183	dj_report->device_index = HIDPP_RECEIVER_INDEX;
1184	dj_report->report_type = REPORT_TYPE_CMD_GET_PAIRED_DEVICES;
1185	retval = logi_dj_recv_send_report(djrcv_dev, dj_report);
1186	kfree(dj_report);
1187	return retval;
1188}
1189
1190
1191static int logi_dj_recv_switch_to_dj_mode(struct dj_receiver_dev *djrcv_dev,
1192					  unsigned timeout)
1193{
1194	struct hid_device *hdev = djrcv_dev->hidpp;
1195	struct dj_report *dj_report;
1196	u8 *buf;
1197	int retval = 0;
1198
1199	dj_report = kzalloc(sizeof(struct dj_report), GFP_KERNEL);
1200	if (!dj_report)
1201		return -ENOMEM;
1202
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			kfree(dj_report);
1223			return retval;
1224		}
1225	}
1226
1227	/*
1228	 * Magical bits to set up hidpp notifications when the dj devices
1229	 * are connected/disconnected.
1230	 *
1231	 * We can reuse dj_report because HIDPP_REPORT_SHORT_LENGTH is smaller
1232	 * than DJREPORT_SHORT_LENGTH.
1233	 */
1234	buf = (u8 *)dj_report;
1235
1236	memset(buf, 0, HIDPP_REPORT_SHORT_LENGTH);
1237
1238	buf[0] = REPORT_ID_HIDPP_SHORT;
1239	buf[1] = HIDPP_RECEIVER_INDEX;
1240	buf[2] = 0x80;
1241	buf[3] = 0x00;
1242	buf[4] = 0x00;
1243	buf[5] = 0x09;
1244	buf[6] = 0x00;
1245
1246	retval = hid_hw_raw_request(hdev, REPORT_ID_HIDPP_SHORT, buf,
1247			HIDPP_REPORT_SHORT_LENGTH, HID_OUTPUT_REPORT,
1248			HID_REQ_SET_REPORT);
1249
1250	kfree(dj_report);
1251	return retval;
1252}
1253
1254
1255static int logi_dj_ll_open(struct hid_device *hid)
1256{
1257	dbg_hid("%s: %s\n", __func__, hid->phys);
1258	return 0;
1259
1260}
1261
1262static void logi_dj_ll_close(struct hid_device *hid)
1263{
1264	dbg_hid("%s: %s\n", __func__, hid->phys);
1265}
1266
1267/*
1268 * Register 0xB5 is "pairing information". It is solely intended for the
1269 * receiver, so do not overwrite the device index.
1270 */
1271static u8 unifying_pairing_query[]  = { REPORT_ID_HIDPP_SHORT,
1272					HIDPP_RECEIVER_INDEX,
1273					HIDPP_GET_LONG_REGISTER,
1274					HIDPP_REG_PAIRING_INFORMATION };
1275static u8 unifying_pairing_answer[] = { REPORT_ID_HIDPP_LONG,
1276					HIDPP_RECEIVER_INDEX,
1277					HIDPP_GET_LONG_REGISTER,
1278					HIDPP_REG_PAIRING_INFORMATION };
1279
1280static int logi_dj_ll_raw_request(struct hid_device *hid,
1281				  unsigned char reportnum, __u8 *buf,
1282				  size_t count, unsigned char report_type,
1283				  int reqtype)
1284{
1285	struct dj_device *djdev = hid->driver_data;
1286	struct dj_receiver_dev *djrcv_dev = djdev->dj_receiver_dev;
1287	u8 *out_buf;
1288	int ret;
1289
1290	if ((buf[0] == REPORT_ID_HIDPP_SHORT) ||
1291	    (buf[0] == REPORT_ID_HIDPP_LONG) ||
1292	    (buf[0] == REPORT_ID_HIDPP_VERY_LONG)) {
1293		if (count < 2)
1294			return -EINVAL;
1295
1296		/* special case where we should not overwrite
1297		 * the device_index */
1298		if (count == 7 && !memcmp(buf, unifying_pairing_query,
1299					  sizeof(unifying_pairing_query)))
1300			buf[4] = (buf[4] & 0xf0) | (djdev->device_index - 1);
1301		else
1302			buf[1] = djdev->device_index;
1303		return hid_hw_raw_request(djrcv_dev->hidpp, reportnum, buf,
1304				count, report_type, reqtype);
1305	}
1306
1307	if (buf[0] != REPORT_TYPE_LEDS)
1308		return -EINVAL;
1309
1310	if (djrcv_dev->type != recvr_type_dj && count >= 2) {
1311		if (!djrcv_dev->keyboard) {
1312			hid_warn(hid, "Received REPORT_TYPE_LEDS request before the keyboard interface was enumerated\n");
1313			return 0;
1314		}
1315		/* usbhid overrides the report ID and ignores the first byte */
1316		return hid_hw_raw_request(djrcv_dev->keyboard, 0, buf, count,
1317					  report_type, reqtype);
1318	}
1319
1320	out_buf = kzalloc(DJREPORT_SHORT_LENGTH, GFP_ATOMIC);
1321	if (!out_buf)
1322		return -ENOMEM;
1323
1324	if (count > DJREPORT_SHORT_LENGTH - 2)
1325		count = DJREPORT_SHORT_LENGTH - 2;
1326
1327	out_buf[0] = REPORT_ID_DJ_SHORT;
1328	out_buf[1] = djdev->device_index;
1329	memcpy(out_buf + 2, buf, count);
1330
1331	ret = hid_hw_raw_request(djrcv_dev->hidpp, out_buf[0], out_buf,
1332		DJREPORT_SHORT_LENGTH, report_type, reqtype);
1333
1334	kfree(out_buf);
1335	return ret;
1336}
1337
1338static void rdcat(char *rdesc, unsigned int *rsize, const char *data, unsigned int size)
1339{
1340	memcpy(rdesc + *rsize, data, size);
1341	*rsize += size;
1342}
1343
1344static int logi_dj_ll_parse(struct hid_device *hid)
1345{
1346	struct dj_device *djdev = hid->driver_data;
1347	unsigned int rsize = 0;
1348	char *rdesc;
1349	int retval;
1350
1351	dbg_hid("%s\n", __func__);
1352
1353	djdev->hdev->version = 0x0111;
1354	djdev->hdev->country = 0x00;
1355
1356	rdesc = kmalloc(MAX_RDESC_SIZE, GFP_KERNEL);
1357	if (!rdesc)
1358		return -ENOMEM;
1359
1360	if (djdev->reports_supported & STD_KEYBOARD) {
1361		dbg_hid("%s: sending a kbd descriptor, reports_supported: %llx\n",
1362			__func__, djdev->reports_supported);
1363		rdcat(rdesc, &rsize, kbd_descriptor, sizeof(kbd_descriptor));
1364	}
1365
1366	if (djdev->reports_supported & STD_MOUSE) {
1367		dbg_hid("%s: sending a mouse descriptor, reports_supported: %llx\n",
1368			__func__, djdev->reports_supported);
1369		if (djdev->dj_receiver_dev->type == recvr_type_gaming_hidpp ||
1370		    djdev->dj_receiver_dev->type == recvr_type_mouse_only)
1371			rdcat(rdesc, &rsize, mse_high_res_descriptor,
1372			      sizeof(mse_high_res_descriptor));
1373		else if (djdev->dj_receiver_dev->type == recvr_type_27mhz)
1374			rdcat(rdesc, &rsize, mse_27mhz_descriptor,
1375			      sizeof(mse_27mhz_descriptor));
1376		else if (djdev->dj_receiver_dev->type == recvr_type_bluetooth)
1377			rdcat(rdesc, &rsize, mse_bluetooth_descriptor,
1378			      sizeof(mse_bluetooth_descriptor));
1379		else
1380			rdcat(rdesc, &rsize, mse_descriptor,
1381			      sizeof(mse_descriptor));
1382	}
1383
1384	if (djdev->reports_supported & MULTIMEDIA) {
1385		dbg_hid("%s: sending a multimedia report descriptor: %llx\n",
1386			__func__, djdev->reports_supported);
1387		rdcat(rdesc, &rsize, consumer_descriptor, sizeof(consumer_descriptor));
1388	}
1389
1390	if (djdev->reports_supported & POWER_KEYS) {
1391		dbg_hid("%s: sending a power keys report descriptor: %llx\n",
1392			__func__, djdev->reports_supported);
1393		rdcat(rdesc, &rsize, syscontrol_descriptor, sizeof(syscontrol_descriptor));
1394	}
1395
1396	if (djdev->reports_supported & MEDIA_CENTER) {
1397		dbg_hid("%s: sending a media center report descriptor: %llx\n",
1398			__func__, djdev->reports_supported);
1399		rdcat(rdesc, &rsize, media_descriptor, sizeof(media_descriptor));
1400	}
1401
1402	if (djdev->reports_supported & KBD_LEDS) {
1403		dbg_hid("%s: need to send kbd leds report descriptor: %llx\n",
1404			__func__, djdev->reports_supported);
1405	}
1406
1407	if (djdev->reports_supported & HIDPP) {
1408		dbg_hid("%s: sending a HID++ descriptor, reports_supported: %llx\n",
1409			__func__, djdev->reports_supported);
1410		rdcat(rdesc, &rsize, hidpp_descriptor,
1411		      sizeof(hidpp_descriptor));
1412	}
1413
1414	retval = hid_parse_report(hid, rdesc, rsize);
1415	kfree(rdesc);
1416
1417	return retval;
1418}
1419
1420static int logi_dj_ll_start(struct hid_device *hid)
1421{
1422	dbg_hid("%s\n", __func__);
1423	return 0;
1424}
1425
1426static void logi_dj_ll_stop(struct hid_device *hid)
1427{
1428	dbg_hid("%s\n", __func__);
1429}
1430
1431
1432static struct hid_ll_driver logi_dj_ll_driver = {
1433	.parse = logi_dj_ll_parse,
1434	.start = logi_dj_ll_start,
1435	.stop = logi_dj_ll_stop,
1436	.open = logi_dj_ll_open,
1437	.close = logi_dj_ll_close,
1438	.raw_request = logi_dj_ll_raw_request,
1439};
1440
1441static int logi_dj_dj_event(struct hid_device *hdev,
1442			     struct hid_report *report, u8 *data,
1443			     int size)
1444{
1445	struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
1446	struct dj_report *dj_report = (struct dj_report *) data;
1447	unsigned long flags;
1448
1449	/*
1450	 * Here we receive all data coming from iface 2, there are 3 cases:
1451	 *
1452	 * 1) Data is intended for this driver i. e. data contains arrival,
1453	 * departure, etc notifications, in which case we queue them for delayed
1454	 * processing by the work queue. We return 1 to hid-core as no further
1455	 * processing is required from it.
1456	 *
1457	 * 2) Data informs a connection change, if the change means rf link
1458	 * loss, then we must send a null report to the upper layer to discard
1459	 * potentially pressed keys that may be repeated forever by the input
1460	 * layer. Return 1 to hid-core as no further processing is required.
1461	 *
1462	 * 3) Data is an actual input event from a paired DJ device in which
1463	 * case we forward it to the correct hid device (via hid_input_report()
1464	 * ) and return 1 so hid-core does not anything else with it.
1465	 */
1466
1467	if ((dj_report->device_index < DJ_DEVICE_INDEX_MIN) ||
1468	    (dj_report->device_index > DJ_DEVICE_INDEX_MAX)) {
1469		/*
1470		 * Device index is wrong, bail out.
1471		 * This driver can ignore safely the receiver notifications,
1472		 * so ignore those reports too.
1473		 */
1474		if (dj_report->device_index != DJ_RECEIVER_INDEX)
1475			hid_err(hdev, "%s: invalid device index:%d\n",
1476				__func__, dj_report->device_index);
1477		return false;
1478	}
1479
1480	spin_lock_irqsave(&djrcv_dev->lock, flags);
1481
1482	if (!djrcv_dev->paired_dj_devices[dj_report->device_index]) {
1483		/* received an event for an unknown device, bail out */
1484		logi_dj_recv_queue_notification(djrcv_dev, dj_report);
1485		goto out;
1486	}
1487
1488	switch (dj_report->report_type) {
1489	case REPORT_TYPE_NOTIF_DEVICE_PAIRED:
1490		/* pairing notifications are handled above the switch */
1491		break;
1492	case REPORT_TYPE_NOTIF_DEVICE_UNPAIRED:
1493		logi_dj_recv_queue_notification(djrcv_dev, dj_report);
1494		break;
1495	case REPORT_TYPE_NOTIF_CONNECTION_STATUS:
1496		if (dj_report->report_params[CONNECTION_STATUS_PARAM_STATUS] ==
1497		    STATUS_LINKLOSS) {
1498			logi_dj_recv_forward_null_report(djrcv_dev, dj_report);
1499		}
1500		break;
1501	default:
1502		logi_dj_recv_forward_dj(djrcv_dev, dj_report);
1503	}
1504
1505out:
1506	spin_unlock_irqrestore(&djrcv_dev->lock, flags);
1507
1508	return true;
1509}
1510
1511static int logi_dj_hidpp_event(struct hid_device *hdev,
1512			     struct hid_report *report, u8 *data,
1513			     int size)
1514{
1515	struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
1516	struct hidpp_event *hidpp_report = (struct hidpp_event *) data;
1517	struct dj_device *dj_dev;
1518	unsigned long flags;
1519	u8 device_index = hidpp_report->device_index;
1520
1521	if (device_index == HIDPP_RECEIVER_INDEX) {
1522		/* special case were the device wants to know its unifying
1523		 * name */
1524		if (size == HIDPP_REPORT_LONG_LENGTH &&
1525		    !memcmp(data, unifying_pairing_answer,
1526			    sizeof(unifying_pairing_answer)))
1527			device_index = (data[4] & 0x0F) + 1;
1528		else
1529			return false;
1530	}
1531
1532	/*
1533	 * Data is from the HID++ collection, in this case, we forward the
1534	 * data to the corresponding child dj device and return 0 to hid-core
1535	 * so he data also goes to the hidraw device of the receiver. This
1536	 * allows a user space application to implement the full HID++ routing
1537	 * via the receiver.
1538	 */
1539
1540	if ((device_index < DJ_DEVICE_INDEX_MIN) ||
1541	    (device_index > DJ_DEVICE_INDEX_MAX)) {
1542		/*
1543		 * Device index is wrong, bail out.
1544		 * This driver can ignore safely the receiver notifications,
1545		 * so ignore those reports too.
1546		 */
1547		hid_err(hdev, "%s: invalid device index:%d\n", __func__,
1548			hidpp_report->device_index);
1549		return false;
1550	}
1551
1552	spin_lock_irqsave(&djrcv_dev->lock, flags);
1553
1554	dj_dev = djrcv_dev->paired_dj_devices[device_index];
1555
1556	/*
1557	 * With 27 MHz receivers, we do not get an explicit unpair event,
1558	 * remove the old device if the user has paired a *different* device.
1559	 */
1560	if (djrcv_dev->type == recvr_type_27mhz && dj_dev &&
1561	    hidpp_report->sub_id == REPORT_TYPE_NOTIF_DEVICE_CONNECTED &&
1562	    hidpp_report->params[HIDPP_PARAM_PROTO_TYPE] == 0x02 &&
1563	    hidpp_report->params[HIDPP_PARAM_27MHZ_DEVID] !=
1564						dj_dev->hdev->product) {
1565		struct dj_workitem workitem = {
1566			.device_index = hidpp_report->device_index,
1567			.type = WORKITEM_TYPE_UNPAIRED,
1568		};
1569		kfifo_in(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem));
1570		/* logi_hidpp_recv_queue_notif will queue the work */
1571		dj_dev = NULL;
1572	}
1573
1574	if (dj_dev) {
1575		logi_dj_recv_forward_report(dj_dev, data, size);
1576	} else {
1577		if (hidpp_report->sub_id == REPORT_TYPE_NOTIF_DEVICE_CONNECTED)
1578			logi_hidpp_recv_queue_notif(hdev, hidpp_report);
1579		else
1580			logi_dj_recv_queue_unknown_work(djrcv_dev);
1581	}
1582
1583	spin_unlock_irqrestore(&djrcv_dev->lock, flags);
1584
1585	return false;
1586}
1587
1588static int logi_dj_raw_event(struct hid_device *hdev,
1589			     struct hid_report *report, u8 *data,
1590			     int size)
1591{
1592	struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
1593	dbg_hid("%s, size:%d\n", __func__, size);
1594
1595	if (!djrcv_dev)
1596		return 0;
1597
1598	if (!hdev->report_enum[HID_INPUT_REPORT].numbered) {
1599
1600		if (djrcv_dev->unnumbered_application == HID_GD_KEYBOARD) {
1601			/*
1602			 * For the keyboard, we can reuse the same report by
1603			 * using the second byte which is constant in the USB
1604			 * HID report descriptor.
1605			 */
1606			data[1] = data[0];
1607			data[0] = REPORT_TYPE_KEYBOARD;
1608
1609			logi_dj_recv_forward_input_report(hdev, data, size);
1610
1611			/* restore previous state */
1612			data[0] = data[1];
1613			data[1] = 0;
1614		}
1615		/*
1616		 * Mouse-only receivers send unnumbered mouse data. The 27 MHz
1617		 * receiver uses 6 byte packets, the nano receiver 8 bytes.
1618		 */
1619		if (djrcv_dev->unnumbered_application == HID_GD_MOUSE &&
1620		    size <= 8) {
1621			u8 mouse_report[9];
1622
1623			/* Prepend report id */
1624			mouse_report[0] = REPORT_TYPE_MOUSE;
1625			memcpy(mouse_report + 1, data, size);
1626			logi_dj_recv_forward_input_report(hdev, mouse_report,
1627							  size + 1);
1628		}
1629
1630		return false;
1631	}
1632
1633	switch (data[0]) {
1634	case REPORT_ID_DJ_SHORT:
1635		if (size != DJREPORT_SHORT_LENGTH) {
1636			hid_err(hdev, "Short DJ report bad size (%d)", size);
1637			return false;
1638		}
1639		return logi_dj_dj_event(hdev, report, data, size);
1640	case REPORT_ID_DJ_LONG:
1641		if (size != DJREPORT_LONG_LENGTH) {
1642			hid_err(hdev, "Long DJ report bad size (%d)", size);
1643			return false;
1644		}
1645		return logi_dj_dj_event(hdev, report, data, size);
1646	case REPORT_ID_HIDPP_SHORT:
1647		if (size != HIDPP_REPORT_SHORT_LENGTH) {
1648			hid_err(hdev, "Short HID++ report bad size (%d)", size);
1649			return false;
1650		}
1651		return logi_dj_hidpp_event(hdev, report, data, size);
1652	case REPORT_ID_HIDPP_LONG:
1653		if (size != HIDPP_REPORT_LONG_LENGTH) {
1654			hid_err(hdev, "Long HID++ report bad size (%d)", size);
1655			return false;
1656		}
1657		return logi_dj_hidpp_event(hdev, report, data, size);
1658	}
1659
1660	logi_dj_recv_forward_input_report(hdev, data, size);
1661
1662	return false;
1663}
1664
1665static int logi_dj_probe(struct hid_device *hdev,
1666			 const struct hid_device_id *id)
1667{
1668	struct hid_report_enum *rep_enum;
1669	struct hid_report *rep;
1670	struct dj_receiver_dev *djrcv_dev;
1671	struct usb_interface *intf;
1672	unsigned int no_dj_interfaces = 0;
1673	bool has_hidpp = false;
1674	unsigned long flags;
1675	int retval;
1676
1677	/*
1678	 * Call to usbhid to fetch the HID descriptors of the current
1679	 * interface subsequently call to the hid/hid-core to parse the
1680	 * fetched descriptors.
1681	 */
1682	retval = hid_parse(hdev);
1683	if (retval) {
1684		hid_err(hdev, "%s: parse failed\n", __func__);
1685		return retval;
1686	}
1687
1688	/*
1689	 * Some KVMs add an extra interface for e.g. mouse emulation. If we
1690	 * treat these as logitech-dj interfaces then this causes input events
1691	 * reported through this extra interface to not be reported correctly.
1692	 * To avoid this, we treat these as generic-hid devices.
1693	 */
1694	switch (id->driver_data) {
1695	case recvr_type_dj:		no_dj_interfaces = 3; break;
1696	case recvr_type_hidpp:		no_dj_interfaces = 2; break;
1697	case recvr_type_gaming_hidpp:	no_dj_interfaces = 3; break;
1698	case recvr_type_mouse_only:	no_dj_interfaces = 2; break;
1699	case recvr_type_27mhz:		no_dj_interfaces = 2; break;
1700	case recvr_type_bluetooth:	no_dj_interfaces = 2; break;
1701	}
1702	if (hid_is_usb(hdev)) {
1703		intf = to_usb_interface(hdev->dev.parent);
1704		if (intf && intf->altsetting->desc.bInterfaceNumber >=
1705							no_dj_interfaces) {
1706			hdev->quirks |= HID_QUIRK_INPUT_PER_APP;
1707			return hid_hw_start(hdev, HID_CONNECT_DEFAULT);
1708		}
1709	}
1710
1711	rep_enum = &hdev->report_enum[HID_INPUT_REPORT];
1712
1713	/* no input reports, bail out */
1714	if (list_empty(&rep_enum->report_list))
1715		return -ENODEV;
1716
1717	/*
1718	 * Check for the HID++ application.
1719	 * Note: we should theoretically check for HID++ and DJ
1720	 * collections, but this will do.
1721	 */
1722	list_for_each_entry(rep, &rep_enum->report_list, list) {
1723		if (rep->application == 0xff000001)
1724			has_hidpp = true;
1725	}
1726
1727	/*
1728	 * Ignore interfaces without DJ/HID++ collection, they will not carry
1729	 * any data, dont create any hid_device for them.
1730	 */
1731	if (!has_hidpp && id->driver_data == recvr_type_dj)
1732		return -ENODEV;
1733
1734	/* get the current application attached to the node */
1735	rep = list_first_entry(&rep_enum->report_list, struct hid_report, list);
1736	djrcv_dev = dj_get_receiver_dev(hdev, id->driver_data,
1737					rep->application, has_hidpp);
1738	if (!djrcv_dev) {
1739		hid_err(hdev, "%s: dj_get_receiver_dev failed\n", __func__);
1740		return -ENOMEM;
1741	}
1742
1743	if (!rep_enum->numbered)
1744		djrcv_dev->unnumbered_application = rep->application;
1745
1746	/* Starts the usb device and connects to upper interfaces hiddev and
1747	 * hidraw */
1748	retval = hid_hw_start(hdev, HID_CONNECT_HIDRAW|HID_CONNECT_HIDDEV);
1749	if (retval) {
1750		hid_err(hdev, "%s: hid_hw_start returned error\n", __func__);
1751		goto hid_hw_start_fail;
1752	}
1753
1754	if (has_hidpp) {
1755		retval = logi_dj_recv_switch_to_dj_mode(djrcv_dev, 0);
1756		if (retval < 0) {
1757			hid_err(hdev, "%s: logi_dj_recv_switch_to_dj_mode returned error:%d\n",
1758				__func__, retval);
1759			goto switch_to_dj_mode_fail;
1760		}
1761	}
1762
1763	/* This is enabling the polling urb on the IN endpoint */
1764	retval = hid_hw_open(hdev);
1765	if (retval < 0) {
1766		hid_err(hdev, "%s: hid_hw_open returned error:%d\n",
1767			__func__, retval);
1768		goto llopen_failed;
1769	}
1770
1771	/* Allow incoming packets to arrive: */
1772	hid_device_io_start(hdev);
1773
1774	if (has_hidpp) {
1775		spin_lock_irqsave(&djrcv_dev->lock, flags);
1776		djrcv_dev->ready = true;
1777		spin_unlock_irqrestore(&djrcv_dev->lock, flags);
1778		retval = logi_dj_recv_query_paired_devices(djrcv_dev);
1779		if (retval < 0) {
1780			hid_err(hdev, "%s: logi_dj_recv_query_paired_devices error:%d\n",
1781				__func__, retval);
1782			/*
1783			 * This can happen with a KVM, let the probe succeed,
1784			 * logi_dj_recv_queue_unknown_work will retry later.
1785			 */
1786		}
1787	}
1788
1789	return 0;
1790
1791llopen_failed:
1792switch_to_dj_mode_fail:
1793	hid_hw_stop(hdev);
1794
1795hid_hw_start_fail:
1796	dj_put_receiver_dev(hdev);
1797	return retval;
1798}
1799
1800#ifdef CONFIG_PM
1801static int logi_dj_reset_resume(struct hid_device *hdev)
1802{
1803	int retval;
1804	struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
1805
1806	if (!djrcv_dev || djrcv_dev->hidpp != hdev)
1807		return 0;
1808
1809	retval = logi_dj_recv_switch_to_dj_mode(djrcv_dev, 0);
1810	if (retval < 0) {
1811		hid_err(hdev, "%s: logi_dj_recv_switch_to_dj_mode returned error:%d\n",
1812			__func__, retval);
1813	}
1814
1815	return 0;
1816}
1817#endif
1818
1819static void logi_dj_remove(struct hid_device *hdev)
1820{
1821	struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
1822	struct dj_device *dj_dev;
1823	unsigned long flags;
1824	int i;
1825
1826	dbg_hid("%s\n", __func__);
1827
1828	if (!djrcv_dev)
1829		return hid_hw_stop(hdev);
1830
1831	/*
1832	 * This ensures that if the work gets requeued from another
1833	 * interface of the same receiver it will be a no-op.
1834	 */
1835	spin_lock_irqsave(&djrcv_dev->lock, flags);
1836	djrcv_dev->ready = false;
1837	spin_unlock_irqrestore(&djrcv_dev->lock, flags);
1838
1839	cancel_work_sync(&djrcv_dev->work);
1840
1841	hid_hw_close(hdev);
1842	hid_hw_stop(hdev);
1843
1844	/*
1845	 * For proper operation we need access to all interfaces, so we destroy
1846	 * the paired devices when we're unbound from any interface.
1847	 *
1848	 * Note we may still be bound to other interfaces, sharing the same
1849	 * djrcv_dev, so we need locking here.
1850	 */
1851	for (i = 0; i < (DJ_MAX_PAIRED_DEVICES + DJ_DEVICE_INDEX_MIN); i++) {
1852		spin_lock_irqsave(&djrcv_dev->lock, flags);
1853		dj_dev = djrcv_dev->paired_dj_devices[i];
1854		djrcv_dev->paired_dj_devices[i] = NULL;
1855		spin_unlock_irqrestore(&djrcv_dev->lock, flags);
1856		if (dj_dev != NULL) {
1857			hid_destroy_device(dj_dev->hdev);
1858			kfree(dj_dev);
1859		}
1860	}
1861
1862	dj_put_receiver_dev(hdev);
1863}
1864
1865static const struct hid_device_id logi_dj_receivers[] = {
1866	{HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1867		USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER),
1868	 .driver_data = recvr_type_dj},
1869	{HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1870		USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER_2),
1871	 .driver_data = recvr_type_dj},
1872	{ /* Logitech Nano mouse only receiver */
1873	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1874			 USB_DEVICE_ID_LOGITECH_NANO_RECEIVER),
1875	 .driver_data = recvr_type_mouse_only},
1876	{ /* Logitech Nano (non DJ) receiver */
1877	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1878			 USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_2),
1879	 .driver_data = recvr_type_hidpp},
1880	{ /* Logitech G700(s) receiver (0xc531) */
1881	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1882		0xc531),
1883	 .driver_data = recvr_type_gaming_hidpp},
1884	{ /* Logitech G602 receiver (0xc537) */
1885	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1886		0xc537),
1887	 .driver_data = recvr_type_gaming_hidpp},
1888	{ /* Logitech lightspeed receiver (0xc539) */
1889	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1890		USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_LIGHTSPEED_1),
1891	 .driver_data = recvr_type_gaming_hidpp},
1892	{ /* Logitech lightspeed receiver (0xc53f) */
1893	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1894		USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_LIGHTSPEED_1_1),
1895	 .driver_data = recvr_type_gaming_hidpp},
1896	{ /* Logitech 27 MHz HID++ 1.0 receiver (0xc513) */
1897	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER),
1898	 .driver_data = recvr_type_27mhz},
1899	{ /* Logitech powerplay receiver (0xc53a) */
1900	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1901		USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_POWERPLAY),
1902	 .driver_data = recvr_type_gaming_hidpp},
1903	{ /* Logitech 27 MHz HID++ 1.0 receiver (0xc517) */
1904	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1905		USB_DEVICE_ID_S510_RECEIVER_2),
1906	 .driver_data = recvr_type_27mhz},
1907	{ /* Logitech 27 MHz HID++ 1.0 mouse-only receiver (0xc51b) */
1908	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1909		USB_DEVICE_ID_LOGITECH_27MHZ_MOUSE_RECEIVER),
1910	 .driver_data = recvr_type_27mhz},
1911	{ /* Logitech MX5000 HID++ / bluetooth receiver keyboard intf. */
1912	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1913		0xc70e),
1914	 .driver_data = recvr_type_bluetooth},
1915	{ /* Logitech MX5000 HID++ / bluetooth receiver mouse intf. */
1916	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1917		0xc70a),
1918	 .driver_data = recvr_type_bluetooth},
1919	{ /* Logitech MX5500 HID++ / bluetooth receiver keyboard intf. */
1920	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1921		0xc71b),
1922	 .driver_data = recvr_type_bluetooth},
1923	{ /* Logitech MX5500 HID++ / bluetooth receiver mouse intf. */
1924	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1925		0xc71c),
1926	 .driver_data = recvr_type_bluetooth},
1927	{}
1928};
1929
1930MODULE_DEVICE_TABLE(hid, logi_dj_receivers);
1931
1932static struct hid_driver logi_djreceiver_driver = {
1933	.name = "logitech-djreceiver",
1934	.id_table = logi_dj_receivers,
1935	.probe = logi_dj_probe,
1936	.remove = logi_dj_remove,
1937	.raw_event = logi_dj_raw_event,
1938#ifdef CONFIG_PM
1939	.reset_resume = logi_dj_reset_resume,
1940#endif
1941};
1942
1943module_hid_driver(logi_djreceiver_driver);
1944
1945MODULE_LICENSE("GPL");
1946MODULE_AUTHOR("Logitech");
1947MODULE_AUTHOR("Nestor Lopez Casado");
1948MODULE_AUTHOR("nlopezcasad@logitech.com");
1949