Linux Audio

Check our new training course

Linux BSP development engineering services

Need help to port Linux and bootloaders to your hardware?
Loading...
v5.4
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 *  HID driver for Logitech Unifying 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			6
  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			6
  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, 0x06,		/*      INPUT                           */
 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 Unifying Device. Wireless 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 unhandeled 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		/* fall-through */
 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
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 869static void logi_hidpp_dev_conn_notif_equad(struct hid_device *hdev,
 870					    struct hidpp_event *hidpp_report,
 871					    struct dj_workitem *workitem)
 872{
 873	struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
 
 874
 875	workitem->type = WORKITEM_TYPE_PAIRED;
 876	workitem->device_type = hidpp_report->params[HIDPP_PARAM_DEVICE_INFO] &
 877				HIDPP_DEVICE_TYPE_MASK;
 878	workitem->quad_id_msb = hidpp_report->params[HIDPP_PARAM_EQUAD_MSB];
 879	workitem->quad_id_lsb = hidpp_report->params[HIDPP_PARAM_EQUAD_LSB];
 880	switch (workitem->device_type) {
 881	case REPORT_TYPE_KEYBOARD:
 882		workitem->reports_supported |= STD_KEYBOARD | MULTIMEDIA |
 883					       POWER_KEYS | MEDIA_CENTER |
 884					       HIDPP;
 
 
 
 
 
 
 
 
 
 
 885		break;
 886	case REPORT_TYPE_MOUSE:
 887		workitem->reports_supported |= STD_MOUSE | HIDPP;
 888		if (djrcv_dev->type == recvr_type_mouse_only)
 889			workitem->reports_supported |= MULTIMEDIA;
 890		break;
 891	}
 892}
 893
 894static void logi_hidpp_dev_conn_notif_27mhz(struct hid_device *hdev,
 895					    struct hidpp_event *hidpp_report,
 896					    struct dj_workitem *workitem)
 897{
 898	workitem->type = WORKITEM_TYPE_PAIRED;
 899	workitem->quad_id_lsb = hidpp_report->params[HIDPP_PARAM_27MHZ_DEVID];
 900	switch (hidpp_report->device_index) {
 901	case 1: /* Index 1 is always a mouse */
 902	case 2: /* Index 2 is always a mouse */
 903		workitem->device_type = HIDPP_DEVICE_TYPE_MOUSE;
 904		workitem->reports_supported |= STD_MOUSE | HIDPP;
 905		break;
 906	case 3: /* Index 3 is always the keyboard */
 
 
 
 
 
 
 
 907	case 4: /* Index 4 is used for an optional separate numpad */
 908		workitem->device_type = HIDPP_DEVICE_TYPE_KEYBOARD;
 909		workitem->reports_supported |= STD_KEYBOARD | MULTIMEDIA |
 910					       POWER_KEYS | HIDPP;
 911		break;
 912	default:
 913		hid_warn(hdev, "%s: unexpected device-index %d", __func__,
 914			 hidpp_report->device_index);
 915	}
 916}
 917
 918static void logi_hidpp_recv_queue_notif(struct hid_device *hdev,
 919					struct hidpp_event *hidpp_report)
 920{
 921	/* We are called from atomic context (tasklet && djrcv->lock held) */
 922	struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
 923	const char *device_type = "UNKNOWN";
 924	struct dj_workitem workitem = {
 925		.type = WORKITEM_TYPE_EMPTY,
 926		.device_index = hidpp_report->device_index,
 927	};
 928
 929	switch (hidpp_report->params[HIDPP_PARAM_PROTO_TYPE]) {
 930	case 0x01:
 931		device_type = "Bluetooth";
 932		/* Bluetooth connect packet contents is the same as (e)QUAD */
 933		logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report, &workitem);
 934		if (!(hidpp_report->params[HIDPP_PARAM_DEVICE_INFO] &
 935						HIDPP_MANUFACTURER_MASK)) {
 936			hid_info(hdev, "Non Logitech device connected on slot %d\n",
 937				 hidpp_report->device_index);
 938			workitem.reports_supported &= ~HIDPP;
 939		}
 940		break;
 941	case 0x02:
 942		device_type = "27 Mhz";
 943		logi_hidpp_dev_conn_notif_27mhz(hdev, hidpp_report, &workitem);
 944		break;
 945	case 0x03:
 946		device_type = "QUAD or eQUAD";
 947		logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report, &workitem);
 948		break;
 949	case 0x04:
 950		device_type = "eQUAD step 4 DJ";
 951		logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report, &workitem);
 952		break;
 953	case 0x05:
 954		device_type = "DFU Lite";
 955		break;
 956	case 0x06:
 957		device_type = "eQUAD step 4 Lite";
 958		logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report, &workitem);
 959		break;
 960	case 0x07:
 961		device_type = "eQUAD step 4 Gaming";
 962		logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report, &workitem);
 
 963		break;
 964	case 0x08:
 965		device_type = "eQUAD step 4 for gamepads";
 966		break;
 967	case 0x0a:
 968		device_type = "eQUAD nano Lite";
 969		logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report, &workitem);
 970		break;
 971	case 0x0c:
 972		device_type = "eQUAD Lightspeed 1";
 973		logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report, &workitem);
 974		workitem.reports_supported |= STD_KEYBOARD;
 975		break;
 976	case 0x0d:
 977		device_type = "eQUAD Lightspeed 1_1";
 
 
 
 
 
 
 978		logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report, &workitem);
 979		workitem.reports_supported |= STD_KEYBOARD;
 980		break;
 981	}
 982
 
 
 
 
 
 983	if (workitem.type == WORKITEM_TYPE_EMPTY) {
 984		hid_warn(hdev,
 985			 "unusable device of type %s (0x%02x) connected on slot %d",
 986			 device_type,
 987			 hidpp_report->params[HIDPP_PARAM_PROTO_TYPE],
 988			 hidpp_report->device_index);
 989		return;
 990	}
 991
 992	hid_info(hdev, "device of type %s (0x%02x) connected on slot %d",
 993		 device_type, hidpp_report->params[HIDPP_PARAM_PROTO_TYPE],
 994		 hidpp_report->device_index);
 995
 996	kfifo_in(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem));
 997	schedule_work(&djrcv_dev->work);
 998}
 999
1000static void logi_dj_recv_forward_null_report(struct dj_receiver_dev *djrcv_dev,
1001					     struct dj_report *dj_report)
1002{
1003	/* We are called from atomic context (tasklet && djrcv->lock held) */
1004	unsigned int i;
1005	u8 reportbuffer[MAX_REPORT_SIZE];
1006	struct dj_device *djdev;
1007
1008	djdev = djrcv_dev->paired_dj_devices[dj_report->device_index];
1009
1010	memset(reportbuffer, 0, sizeof(reportbuffer));
1011
1012	for (i = 0; i < NUMBER_OF_HID_REPORTS; i++) {
1013		if (djdev->reports_supported & (1 << i)) {
1014			reportbuffer[0] = i;
1015			if (hid_input_report(djdev->hdev,
1016					     HID_INPUT_REPORT,
1017					     reportbuffer,
1018					     hid_reportid_size_map[i], 1)) {
1019				dbg_hid("hid_input_report error sending null "
1020					"report\n");
1021			}
1022		}
1023	}
1024}
1025
1026static void logi_dj_recv_forward_dj(struct dj_receiver_dev *djrcv_dev,
1027				    struct dj_report *dj_report)
1028{
1029	/* We are called from atomic context (tasklet && djrcv->lock held) */
1030	struct dj_device *dj_device;
1031
1032	dj_device = djrcv_dev->paired_dj_devices[dj_report->device_index];
1033
1034	if ((dj_report->report_type > ARRAY_SIZE(hid_reportid_size_map) - 1) ||
1035	    (hid_reportid_size_map[dj_report->report_type] == 0)) {
1036		dbg_hid("invalid report type:%x\n", dj_report->report_type);
1037		return;
1038	}
1039
1040	if (hid_input_report(dj_device->hdev,
1041			HID_INPUT_REPORT, &dj_report->report_type,
1042			hid_reportid_size_map[dj_report->report_type], 1)) {
1043		dbg_hid("hid_input_report error\n");
1044	}
1045}
1046
1047static void logi_dj_recv_forward_report(struct dj_device *dj_dev, u8 *data,
1048					int size)
1049{
1050	/* We are called from atomic context (tasklet && djrcv->lock held) */
1051	if (hid_input_report(dj_dev->hdev, HID_INPUT_REPORT, data, size, 1))
1052		dbg_hid("hid_input_report error\n");
1053}
1054
1055static void logi_dj_recv_forward_input_report(struct hid_device *hdev,
1056					      u8 *data, int size)
1057{
1058	struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
1059	struct dj_device *dj_dev;
1060	unsigned long flags;
1061	u8 report = data[0];
1062	int i;
1063
1064	if (report > REPORT_TYPE_RFREPORT_LAST) {
1065		hid_err(hdev, "Unexpected input report number %d\n", report);
1066		return;
1067	}
1068
1069	spin_lock_irqsave(&djrcv_dev->lock, flags);
1070	for (i = 0; i < (DJ_MAX_PAIRED_DEVICES + DJ_DEVICE_INDEX_MIN); i++) {
1071		dj_dev = djrcv_dev->paired_dj_devices[i];
1072		if (dj_dev && (dj_dev->reports_supported & BIT(report))) {
1073			logi_dj_recv_forward_report(dj_dev, data, size);
1074			spin_unlock_irqrestore(&djrcv_dev->lock, flags);
1075			return;
1076		}
1077	}
1078
1079	logi_dj_recv_queue_unknown_work(djrcv_dev);
1080	spin_unlock_irqrestore(&djrcv_dev->lock, flags);
1081
1082	dbg_hid("No dj-devs handling input report number %d\n", report);
1083}
1084
1085static int logi_dj_recv_send_report(struct dj_receiver_dev *djrcv_dev,
1086				    struct dj_report *dj_report)
1087{
1088	struct hid_device *hdev = djrcv_dev->hidpp;
1089	struct hid_report *report;
1090	struct hid_report_enum *output_report_enum;
1091	u8 *data = (u8 *)(&dj_report->device_index);
1092	unsigned int i;
1093
1094	output_report_enum = &hdev->report_enum[HID_OUTPUT_REPORT];
1095	report = output_report_enum->report_id_hash[REPORT_ID_DJ_SHORT];
1096
1097	if (!report) {
1098		hid_err(hdev, "%s: unable to find dj report\n", __func__);
1099		return -ENODEV;
1100	}
1101
1102	for (i = 0; i < DJREPORT_SHORT_LENGTH - 1; i++)
1103		report->field[0]->value[i] = data[i];
1104
1105	hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
1106
1107	return 0;
1108}
1109
1110static int logi_dj_recv_query_hidpp_devices(struct dj_receiver_dev *djrcv_dev)
1111{
1112	static const u8 template[] = {
1113		REPORT_ID_HIDPP_SHORT,
1114		HIDPP_RECEIVER_INDEX,
1115		HIDPP_SET_REGISTER,
1116		HIDPP_REG_CONNECTION_STATE,
1117		HIDPP_FAKE_DEVICE_ARRIVAL,
1118		0x00, 0x00
1119	};
1120	u8 *hidpp_report;
1121	int retval;
1122
1123	hidpp_report = kmemdup(template, sizeof(template), GFP_KERNEL);
1124	if (!hidpp_report)
1125		return -ENOMEM;
1126
1127	retval = hid_hw_raw_request(djrcv_dev->hidpp,
1128				    REPORT_ID_HIDPP_SHORT,
1129				    hidpp_report, sizeof(template),
1130				    HID_OUTPUT_REPORT,
1131				    HID_REQ_SET_REPORT);
1132
1133	kfree(hidpp_report);
1134	return (retval < 0) ? retval : 0;
1135}
1136
1137static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev)
1138{
1139	struct dj_report *dj_report;
1140	int retval;
1141
1142	djrcv_dev->last_query = jiffies;
1143
1144	if (djrcv_dev->type != recvr_type_dj)
1145		return logi_dj_recv_query_hidpp_devices(djrcv_dev);
1146
1147	dj_report = kzalloc(sizeof(struct dj_report), GFP_KERNEL);
1148	if (!dj_report)
1149		return -ENOMEM;
1150	dj_report->report_id = REPORT_ID_DJ_SHORT;
1151	dj_report->device_index = 0xFF;
1152	dj_report->report_type = REPORT_TYPE_CMD_GET_PAIRED_DEVICES;
1153	retval = logi_dj_recv_send_report(djrcv_dev, dj_report);
1154	kfree(dj_report);
1155	return retval;
1156}
1157
1158
1159static int logi_dj_recv_switch_to_dj_mode(struct dj_receiver_dev *djrcv_dev,
1160					  unsigned timeout)
1161{
1162	struct hid_device *hdev = djrcv_dev->hidpp;
1163	struct dj_report *dj_report;
1164	u8 *buf;
1165	int retval = 0;
1166
1167	dj_report = kzalloc(sizeof(struct dj_report), GFP_KERNEL);
1168	if (!dj_report)
1169		return -ENOMEM;
1170
1171	if (djrcv_dev->type == recvr_type_dj) {
1172		dj_report->report_id = REPORT_ID_DJ_SHORT;
1173		dj_report->device_index = 0xFF;
1174		dj_report->report_type = REPORT_TYPE_CMD_SWITCH;
1175		dj_report->report_params[CMD_SWITCH_PARAM_DEVBITFIELD] = 0x3F;
1176		dj_report->report_params[CMD_SWITCH_PARAM_TIMEOUT_SECONDS] =
1177								(u8)timeout;
1178
1179		retval = logi_dj_recv_send_report(djrcv_dev, dj_report);
1180
1181		/*
1182		 * Ugly sleep to work around a USB 3.0 bug when the receiver is
1183		 * still processing the "switch-to-dj" command while we send an
1184		 * other command.
1185		 * 50 msec should gives enough time to the receiver to be ready.
1186		 */
1187		msleep(50);
1188	}
1189
1190	/*
1191	 * Magical bits to set up hidpp notifications when the dj devices
1192	 * are connected/disconnected.
1193	 *
1194	 * We can reuse dj_report because HIDPP_REPORT_SHORT_LENGTH is smaller
1195	 * than DJREPORT_SHORT_LENGTH.
1196	 */
1197	buf = (u8 *)dj_report;
1198
1199	memset(buf, 0, HIDPP_REPORT_SHORT_LENGTH);
1200
1201	buf[0] = REPORT_ID_HIDPP_SHORT;
1202	buf[1] = 0xFF;
1203	buf[2] = 0x80;
1204	buf[3] = 0x00;
1205	buf[4] = 0x00;
1206	buf[5] = 0x09;
1207	buf[6] = 0x00;
1208
1209	hid_hw_raw_request(hdev, REPORT_ID_HIDPP_SHORT, buf,
1210			HIDPP_REPORT_SHORT_LENGTH, HID_OUTPUT_REPORT,
1211			HID_REQ_SET_REPORT);
1212
1213	kfree(dj_report);
1214	return retval;
1215}
1216
1217
1218static int logi_dj_ll_open(struct hid_device *hid)
1219{
1220	dbg_hid("%s: %s\n", __func__, hid->phys);
1221	return 0;
1222
1223}
1224
1225static void logi_dj_ll_close(struct hid_device *hid)
1226{
1227	dbg_hid("%s: %s\n", __func__, hid->phys);
1228}
1229
1230/*
1231 * Register 0xB5 is "pairing information". It is solely intended for the
1232 * receiver, so do not overwrite the device index.
1233 */
1234static u8 unifying_pairing_query[]  = { REPORT_ID_HIDPP_SHORT,
1235					HIDPP_RECEIVER_INDEX,
1236					HIDPP_GET_LONG_REGISTER,
1237					HIDPP_REG_PAIRING_INFORMATION };
1238static u8 unifying_pairing_answer[] = { REPORT_ID_HIDPP_LONG,
1239					HIDPP_RECEIVER_INDEX,
1240					HIDPP_GET_LONG_REGISTER,
1241					HIDPP_REG_PAIRING_INFORMATION };
1242
1243static int logi_dj_ll_raw_request(struct hid_device *hid,
1244				  unsigned char reportnum, __u8 *buf,
1245				  size_t count, unsigned char report_type,
1246				  int reqtype)
1247{
1248	struct dj_device *djdev = hid->driver_data;
1249	struct dj_receiver_dev *djrcv_dev = djdev->dj_receiver_dev;
1250	u8 *out_buf;
1251	int ret;
1252
1253	if ((buf[0] == REPORT_ID_HIDPP_SHORT) ||
1254	    (buf[0] == REPORT_ID_HIDPP_LONG) ||
1255	    (buf[0] == REPORT_ID_HIDPP_VERY_LONG)) {
1256		if (count < 2)
1257			return -EINVAL;
1258
1259		/* special case where we should not overwrite
1260		 * the device_index */
1261		if (count == 7 && !memcmp(buf, unifying_pairing_query,
1262					  sizeof(unifying_pairing_query)))
1263			buf[4] = (buf[4] & 0xf0) | (djdev->device_index - 1);
1264		else
1265			buf[1] = djdev->device_index;
1266		return hid_hw_raw_request(djrcv_dev->hidpp, reportnum, buf,
1267				count, report_type, reqtype);
1268	}
1269
1270	if (buf[0] != REPORT_TYPE_LEDS)
1271		return -EINVAL;
1272
1273	if (djrcv_dev->type != recvr_type_dj && count >= 2) {
1274		if (!djrcv_dev->keyboard) {
1275			hid_warn(hid, "Received REPORT_TYPE_LEDS request before the keyboard interface was enumerated\n");
1276			return 0;
1277		}
1278		/* usbhid overrides the report ID and ignores the first byte */
1279		return hid_hw_raw_request(djrcv_dev->keyboard, 0, buf, count,
1280					  report_type, reqtype);
1281	}
1282
1283	out_buf = kzalloc(DJREPORT_SHORT_LENGTH, GFP_ATOMIC);
1284	if (!out_buf)
1285		return -ENOMEM;
1286
1287	if (count > DJREPORT_SHORT_LENGTH - 2)
1288		count = DJREPORT_SHORT_LENGTH - 2;
1289
1290	out_buf[0] = REPORT_ID_DJ_SHORT;
1291	out_buf[1] = djdev->device_index;
1292	memcpy(out_buf + 2, buf, count);
1293
1294	ret = hid_hw_raw_request(djrcv_dev->hidpp, out_buf[0], out_buf,
1295		DJREPORT_SHORT_LENGTH, report_type, reqtype);
1296
1297	kfree(out_buf);
1298	return ret;
1299}
1300
1301static void rdcat(char *rdesc, unsigned int *rsize, const char *data, unsigned int size)
1302{
1303	memcpy(rdesc + *rsize, data, size);
1304	*rsize += size;
1305}
1306
1307static int logi_dj_ll_parse(struct hid_device *hid)
1308{
1309	struct dj_device *djdev = hid->driver_data;
1310	unsigned int rsize = 0;
1311	char *rdesc;
1312	int retval;
1313
1314	dbg_hid("%s\n", __func__);
1315
1316	djdev->hdev->version = 0x0111;
1317	djdev->hdev->country = 0x00;
1318
1319	rdesc = kmalloc(MAX_RDESC_SIZE, GFP_KERNEL);
1320	if (!rdesc)
1321		return -ENOMEM;
1322
1323	if (djdev->reports_supported & STD_KEYBOARD) {
1324		dbg_hid("%s: sending a kbd descriptor, reports_supported: %llx\n",
1325			__func__, djdev->reports_supported);
1326		rdcat(rdesc, &rsize, kbd_descriptor, sizeof(kbd_descriptor));
1327	}
1328
1329	if (djdev->reports_supported & STD_MOUSE) {
1330		dbg_hid("%s: sending a mouse descriptor, reports_supported: %llx\n",
1331			__func__, djdev->reports_supported);
1332		if (djdev->dj_receiver_dev->type == recvr_type_gaming_hidpp ||
1333		    djdev->dj_receiver_dev->type == recvr_type_mouse_only)
1334			rdcat(rdesc, &rsize, mse_high_res_descriptor,
1335			      sizeof(mse_high_res_descriptor));
1336		else if (djdev->dj_receiver_dev->type == recvr_type_27mhz)
1337			rdcat(rdesc, &rsize, mse_27mhz_descriptor,
1338			      sizeof(mse_27mhz_descriptor));
1339		else if (djdev->dj_receiver_dev->type == recvr_type_bluetooth)
1340			rdcat(rdesc, &rsize, mse_bluetooth_descriptor,
1341			      sizeof(mse_bluetooth_descriptor));
1342		else
1343			rdcat(rdesc, &rsize, mse_descriptor,
1344			      sizeof(mse_descriptor));
1345	}
1346
 
 
 
 
 
 
 
1347	if (djdev->reports_supported & MULTIMEDIA) {
1348		dbg_hid("%s: sending a multimedia report descriptor: %llx\n",
1349			__func__, djdev->reports_supported);
1350		rdcat(rdesc, &rsize, consumer_descriptor, sizeof(consumer_descriptor));
1351	}
1352
1353	if (djdev->reports_supported & POWER_KEYS) {
1354		dbg_hid("%s: sending a power keys report descriptor: %llx\n",
1355			__func__, djdev->reports_supported);
1356		rdcat(rdesc, &rsize, syscontrol_descriptor, sizeof(syscontrol_descriptor));
1357	}
1358
1359	if (djdev->reports_supported & MEDIA_CENTER) {
1360		dbg_hid("%s: sending a media center report descriptor: %llx\n",
1361			__func__, djdev->reports_supported);
1362		rdcat(rdesc, &rsize, media_descriptor, sizeof(media_descriptor));
1363	}
1364
1365	if (djdev->reports_supported & KBD_LEDS) {
1366		dbg_hid("%s: need to send kbd leds report descriptor: %llx\n",
1367			__func__, djdev->reports_supported);
1368	}
1369
1370	if (djdev->reports_supported & HIDPP) {
 
 
1371		rdcat(rdesc, &rsize, hidpp_descriptor,
1372		      sizeof(hidpp_descriptor));
1373	}
1374
1375	retval = hid_parse_report(hid, rdesc, rsize);
1376	kfree(rdesc);
1377
1378	return retval;
1379}
1380
1381static int logi_dj_ll_start(struct hid_device *hid)
1382{
1383	dbg_hid("%s\n", __func__);
1384	return 0;
1385}
1386
1387static void logi_dj_ll_stop(struct hid_device *hid)
1388{
1389	dbg_hid("%s\n", __func__);
1390}
1391
 
 
 
 
 
 
 
1392
1393static struct hid_ll_driver logi_dj_ll_driver = {
1394	.parse = logi_dj_ll_parse,
1395	.start = logi_dj_ll_start,
1396	.stop = logi_dj_ll_stop,
1397	.open = logi_dj_ll_open,
1398	.close = logi_dj_ll_close,
1399	.raw_request = logi_dj_ll_raw_request,
 
1400};
1401
1402static int logi_dj_dj_event(struct hid_device *hdev,
1403			     struct hid_report *report, u8 *data,
1404			     int size)
1405{
1406	struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
1407	struct dj_report *dj_report = (struct dj_report *) data;
1408	unsigned long flags;
1409
1410	/*
1411	 * Here we receive all data coming from iface 2, there are 3 cases:
1412	 *
1413	 * 1) Data is intended for this driver i. e. data contains arrival,
1414	 * departure, etc notifications, in which case we queue them for delayed
1415	 * processing by the work queue. We return 1 to hid-core as no further
1416	 * processing is required from it.
1417	 *
1418	 * 2) Data informs a connection change, if the change means rf link
1419	 * loss, then we must send a null report to the upper layer to discard
1420	 * potentially pressed keys that may be repeated forever by the input
1421	 * layer. Return 1 to hid-core as no further processing is required.
1422	 *
1423	 * 3) Data is an actual input event from a paired DJ device in which
1424	 * case we forward it to the correct hid device (via hid_input_report()
1425	 * ) and return 1 so hid-core does not anything else with it.
1426	 */
1427
1428	if ((dj_report->device_index < DJ_DEVICE_INDEX_MIN) ||
1429	    (dj_report->device_index > DJ_DEVICE_INDEX_MAX)) {
1430		/*
1431		 * Device index is wrong, bail out.
1432		 * This driver can ignore safely the receiver notifications,
1433		 * so ignore those reports too.
1434		 */
1435		if (dj_report->device_index != DJ_RECEIVER_INDEX)
1436			hid_err(hdev, "%s: invalid device index:%d\n",
1437				__func__, dj_report->device_index);
1438		return false;
1439	}
1440
1441	spin_lock_irqsave(&djrcv_dev->lock, flags);
1442
1443	if (!djrcv_dev->paired_dj_devices[dj_report->device_index]) {
1444		/* received an event for an unknown device, bail out */
1445		logi_dj_recv_queue_notification(djrcv_dev, dj_report);
1446		goto out;
1447	}
1448
1449	switch (dj_report->report_type) {
1450	case REPORT_TYPE_NOTIF_DEVICE_PAIRED:
1451		/* pairing notifications are handled above the switch */
1452		break;
1453	case REPORT_TYPE_NOTIF_DEVICE_UNPAIRED:
1454		logi_dj_recv_queue_notification(djrcv_dev, dj_report);
1455		break;
1456	case REPORT_TYPE_NOTIF_CONNECTION_STATUS:
1457		if (dj_report->report_params[CONNECTION_STATUS_PARAM_STATUS] ==
1458		    STATUS_LINKLOSS) {
1459			logi_dj_recv_forward_null_report(djrcv_dev, dj_report);
1460		}
1461		break;
1462	default:
1463		logi_dj_recv_forward_dj(djrcv_dev, dj_report);
1464	}
1465
1466out:
1467	spin_unlock_irqrestore(&djrcv_dev->lock, flags);
1468
1469	return true;
1470}
1471
1472static int logi_dj_hidpp_event(struct hid_device *hdev,
1473			     struct hid_report *report, u8 *data,
1474			     int size)
1475{
1476	struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
1477	struct hidpp_event *hidpp_report = (struct hidpp_event *) data;
1478	struct dj_device *dj_dev;
1479	unsigned long flags;
1480	u8 device_index = hidpp_report->device_index;
1481
1482	if (device_index == HIDPP_RECEIVER_INDEX) {
1483		/* special case were the device wants to know its unifying
1484		 * name */
1485		if (size == HIDPP_REPORT_LONG_LENGTH &&
1486		    !memcmp(data, unifying_pairing_answer,
1487			    sizeof(unifying_pairing_answer)))
1488			device_index = (data[4] & 0x0F) + 1;
1489		else
1490			return false;
1491	}
1492
1493	/*
1494	 * Data is from the HID++ collection, in this case, we forward the
1495	 * data to the corresponding child dj device and return 0 to hid-core
1496	 * so he data also goes to the hidraw device of the receiver. This
1497	 * allows a user space application to implement the full HID++ routing
1498	 * via the receiver.
1499	 */
1500
1501	if ((device_index < DJ_DEVICE_INDEX_MIN) ||
1502	    (device_index > DJ_DEVICE_INDEX_MAX)) {
1503		/*
1504		 * Device index is wrong, bail out.
1505		 * This driver can ignore safely the receiver notifications,
1506		 * so ignore those reports too.
1507		 */
1508		hid_err(hdev, "%s: invalid device index:%d\n", __func__,
1509			hidpp_report->device_index);
1510		return false;
1511	}
1512
1513	spin_lock_irqsave(&djrcv_dev->lock, flags);
1514
1515	dj_dev = djrcv_dev->paired_dj_devices[device_index];
1516
1517	/*
1518	 * With 27 MHz receivers, we do not get an explicit unpair event,
1519	 * remove the old device if the user has paired a *different* device.
1520	 */
1521	if (djrcv_dev->type == recvr_type_27mhz && dj_dev &&
1522	    hidpp_report->sub_id == REPORT_TYPE_NOTIF_DEVICE_CONNECTED &&
1523	    hidpp_report->params[HIDPP_PARAM_PROTO_TYPE] == 0x02 &&
1524	    hidpp_report->params[HIDPP_PARAM_27MHZ_DEVID] !=
1525						dj_dev->hdev->product) {
1526		struct dj_workitem workitem = {
1527			.device_index = hidpp_report->device_index,
1528			.type = WORKITEM_TYPE_UNPAIRED,
1529		};
1530		kfifo_in(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem));
1531		/* logi_hidpp_recv_queue_notif will queue the work */
1532		dj_dev = NULL;
1533	}
1534
1535	if (dj_dev) {
1536		logi_dj_recv_forward_report(dj_dev, data, size);
1537	} else {
1538		if (hidpp_report->sub_id == REPORT_TYPE_NOTIF_DEVICE_CONNECTED)
1539			logi_hidpp_recv_queue_notif(hdev, hidpp_report);
1540		else
1541			logi_dj_recv_queue_unknown_work(djrcv_dev);
1542	}
1543
1544	spin_unlock_irqrestore(&djrcv_dev->lock, flags);
1545
1546	return false;
1547}
1548
1549static int logi_dj_raw_event(struct hid_device *hdev,
1550			     struct hid_report *report, u8 *data,
1551			     int size)
1552{
1553	struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
1554	dbg_hid("%s, size:%d\n", __func__, size);
1555
1556	if (!djrcv_dev)
1557		return 0;
1558
1559	if (!hdev->report_enum[HID_INPUT_REPORT].numbered) {
1560
1561		if (djrcv_dev->unnumbered_application == HID_GD_KEYBOARD) {
1562			/*
1563			 * For the keyboard, we can reuse the same report by
1564			 * using the second byte which is constant in the USB
1565			 * HID report descriptor.
1566			 */
1567			data[1] = data[0];
1568			data[0] = REPORT_TYPE_KEYBOARD;
1569
1570			logi_dj_recv_forward_input_report(hdev, data, size);
1571
1572			/* restore previous state */
1573			data[0] = data[1];
1574			data[1] = 0;
1575		}
1576		/*
1577		 * Mouse-only receivers send unnumbered mouse data. The 27 MHz
1578		 * receiver uses 6 byte packets, the nano receiver 8 bytes.
1579		 */
1580		if (djrcv_dev->unnumbered_application == HID_GD_MOUSE &&
1581		    size <= 8) {
1582			u8 mouse_report[9];
1583
1584			/* Prepend report id */
1585			mouse_report[0] = REPORT_TYPE_MOUSE;
1586			memcpy(mouse_report + 1, data, size);
1587			logi_dj_recv_forward_input_report(hdev, mouse_report,
1588							  size + 1);
1589		}
1590
1591		return false;
1592	}
1593
1594	switch (data[0]) {
1595	case REPORT_ID_DJ_SHORT:
1596		if (size != DJREPORT_SHORT_LENGTH) {
1597			hid_err(hdev, "Short DJ report bad size (%d)", size);
1598			return false;
1599		}
1600		return logi_dj_dj_event(hdev, report, data, size);
1601	case REPORT_ID_DJ_LONG:
1602		if (size != DJREPORT_LONG_LENGTH) {
1603			hid_err(hdev, "Long DJ report bad size (%d)", size);
1604			return false;
1605		}
1606		return logi_dj_dj_event(hdev, report, data, size);
1607	case REPORT_ID_HIDPP_SHORT:
1608		if (size != HIDPP_REPORT_SHORT_LENGTH) {
1609			hid_err(hdev, "Short HID++ report bad size (%d)", size);
1610			return false;
1611		}
1612		return logi_dj_hidpp_event(hdev, report, data, size);
1613	case REPORT_ID_HIDPP_LONG:
1614		if (size != HIDPP_REPORT_LONG_LENGTH) {
1615			hid_err(hdev, "Long HID++ report bad size (%d)", size);
1616			return false;
1617		}
1618		return logi_dj_hidpp_event(hdev, report, data, size);
1619	}
1620
1621	logi_dj_recv_forward_input_report(hdev, data, size);
1622
1623	return false;
1624}
1625
1626static int logi_dj_probe(struct hid_device *hdev,
1627			 const struct hid_device_id *id)
1628{
1629	struct hid_report_enum *rep_enum;
1630	struct hid_report *rep;
1631	struct dj_receiver_dev *djrcv_dev;
1632	struct usb_interface *intf;
1633	unsigned int no_dj_interfaces = 0;
1634	bool has_hidpp = false;
1635	unsigned long flags;
1636	int retval;
1637
1638	/*
1639	 * Call to usbhid to fetch the HID descriptors of the current
1640	 * interface subsequently call to the hid/hid-core to parse the
1641	 * fetched descriptors.
1642	 */
1643	retval = hid_parse(hdev);
1644	if (retval) {
1645		hid_err(hdev, "%s: parse failed\n", __func__);
1646		return retval;
1647	}
1648
1649	/*
1650	 * Some KVMs add an extra interface for e.g. mouse emulation. If we
1651	 * treat these as logitech-dj interfaces then this causes input events
1652	 * reported through this extra interface to not be reported correctly.
1653	 * To avoid this, we treat these as generic-hid devices.
1654	 */
1655	switch (id->driver_data) {
1656	case recvr_type_dj:		no_dj_interfaces = 3; break;
1657	case recvr_type_hidpp:		no_dj_interfaces = 2; break;
1658	case recvr_type_gaming_hidpp:	no_dj_interfaces = 3; break;
1659	case recvr_type_mouse_only:	no_dj_interfaces = 2; break;
1660	case recvr_type_27mhz:		no_dj_interfaces = 2; break;
1661	case recvr_type_bluetooth:	no_dj_interfaces = 2; break;
 
1662	}
1663	if (hid_is_using_ll_driver(hdev, &usb_hid_driver)) {
1664		intf = to_usb_interface(hdev->dev.parent);
1665		if (intf && intf->altsetting->desc.bInterfaceNumber >=
1666							no_dj_interfaces) {
1667			hdev->quirks |= HID_QUIRK_INPUT_PER_APP;
1668			return hid_hw_start(hdev, HID_CONNECT_DEFAULT);
1669		}
1670	}
1671
1672	rep_enum = &hdev->report_enum[HID_INPUT_REPORT];
1673
1674	/* no input reports, bail out */
1675	if (list_empty(&rep_enum->report_list))
1676		return -ENODEV;
1677
1678	/*
1679	 * Check for the HID++ application.
1680	 * Note: we should theoretically check for HID++ and DJ
1681	 * collections, but this will do.
1682	 */
1683	list_for_each_entry(rep, &rep_enum->report_list, list) {
1684		if (rep->application == 0xff000001)
1685			has_hidpp = true;
1686	}
1687
1688	/*
1689	 * Ignore interfaces without DJ/HID++ collection, they will not carry
1690	 * any data, dont create any hid_device for them.
1691	 */
1692	if (!has_hidpp && id->driver_data == recvr_type_dj)
1693		return -ENODEV;
1694
1695	/* get the current application attached to the node */
1696	rep = list_first_entry(&rep_enum->report_list, struct hid_report, list);
1697	djrcv_dev = dj_get_receiver_dev(hdev, id->driver_data,
1698					rep->application, has_hidpp);
1699	if (!djrcv_dev) {
1700		hid_err(hdev, "%s: dj_get_receiver_dev failed\n", __func__);
1701		return -ENOMEM;
1702	}
1703
1704	if (!rep_enum->numbered)
1705		djrcv_dev->unnumbered_application = rep->application;
1706
1707	/* Starts the usb device and connects to upper interfaces hiddev and
1708	 * hidraw */
1709	retval = hid_hw_start(hdev, HID_CONNECT_HIDRAW|HID_CONNECT_HIDDEV);
1710	if (retval) {
1711		hid_err(hdev, "%s: hid_hw_start returned error\n", __func__);
1712		goto hid_hw_start_fail;
1713	}
1714
1715	if (has_hidpp) {
1716		retval = logi_dj_recv_switch_to_dj_mode(djrcv_dev, 0);
1717		if (retval < 0) {
1718			hid_err(hdev, "%s: logi_dj_recv_switch_to_dj_mode returned error:%d\n",
1719				__func__, retval);
1720			goto switch_to_dj_mode_fail;
1721		}
1722	}
1723
1724	/* This is enabling the polling urb on the IN endpoint */
1725	retval = hid_hw_open(hdev);
1726	if (retval < 0) {
1727		hid_err(hdev, "%s: hid_hw_open returned error:%d\n",
1728			__func__, retval);
1729		goto llopen_failed;
1730	}
1731
1732	/* Allow incoming packets to arrive: */
1733	hid_device_io_start(hdev);
1734
1735	if (has_hidpp) {
1736		spin_lock_irqsave(&djrcv_dev->lock, flags);
1737		djrcv_dev->ready = true;
1738		spin_unlock_irqrestore(&djrcv_dev->lock, flags);
1739		retval = logi_dj_recv_query_paired_devices(djrcv_dev);
1740		if (retval < 0) {
1741			hid_err(hdev, "%s: logi_dj_recv_query_paired_devices error:%d\n",
1742				__func__, retval);
1743			/*
1744			 * This can happen with a KVM, let the probe succeed,
1745			 * logi_dj_recv_queue_unknown_work will retry later.
1746			 */
1747		}
1748	}
1749
1750	return 0;
1751
1752llopen_failed:
1753switch_to_dj_mode_fail:
1754	hid_hw_stop(hdev);
1755
1756hid_hw_start_fail:
1757	dj_put_receiver_dev(hdev);
1758	return retval;
1759}
1760
1761#ifdef CONFIG_PM
1762static int logi_dj_reset_resume(struct hid_device *hdev)
1763{
1764	int retval;
1765	struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
1766
1767	if (!djrcv_dev || djrcv_dev->hidpp != hdev)
1768		return 0;
1769
1770	retval = logi_dj_recv_switch_to_dj_mode(djrcv_dev, 0);
1771	if (retval < 0) {
1772		hid_err(hdev, "%s: logi_dj_recv_switch_to_dj_mode returned error:%d\n",
1773			__func__, retval);
1774	}
1775
1776	return 0;
1777}
1778#endif
1779
1780static void logi_dj_remove(struct hid_device *hdev)
1781{
1782	struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
1783	struct dj_device *dj_dev;
1784	unsigned long flags;
1785	int i;
1786
1787	dbg_hid("%s\n", __func__);
1788
1789	if (!djrcv_dev)
1790		return hid_hw_stop(hdev);
1791
1792	/*
1793	 * This ensures that if the work gets requeued from another
1794	 * interface of the same receiver it will be a no-op.
1795	 */
1796	spin_lock_irqsave(&djrcv_dev->lock, flags);
1797	djrcv_dev->ready = false;
1798	spin_unlock_irqrestore(&djrcv_dev->lock, flags);
1799
1800	cancel_work_sync(&djrcv_dev->work);
1801
1802	hid_hw_close(hdev);
1803	hid_hw_stop(hdev);
1804
1805	/*
1806	 * For proper operation we need access to all interfaces, so we destroy
1807	 * the paired devices when we're unbound from any interface.
1808	 *
1809	 * Note we may still be bound to other interfaces, sharing the same
1810	 * djrcv_dev, so we need locking here.
1811	 */
1812	for (i = 0; i < (DJ_MAX_PAIRED_DEVICES + DJ_DEVICE_INDEX_MIN); i++) {
1813		spin_lock_irqsave(&djrcv_dev->lock, flags);
1814		dj_dev = djrcv_dev->paired_dj_devices[i];
1815		djrcv_dev->paired_dj_devices[i] = NULL;
1816		spin_unlock_irqrestore(&djrcv_dev->lock, flags);
1817		if (dj_dev != NULL) {
1818			hid_destroy_device(dj_dev->hdev);
1819			kfree(dj_dev);
1820		}
1821	}
1822
1823	dj_put_receiver_dev(hdev);
1824}
1825
1826static const struct hid_device_id logi_dj_receivers[] = {
1827	{HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
 
1828		USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER),
1829	 .driver_data = recvr_type_dj},
1830	{HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
 
1831		USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER_2),
1832	 .driver_data = recvr_type_dj},
1833	{ /* Logitech Nano mouse only receiver */
 
1834	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1835			 USB_DEVICE_ID_LOGITECH_NANO_RECEIVER),
1836	 .driver_data = recvr_type_mouse_only},
1837	{ /* Logitech Nano (non DJ) receiver */
1838	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1839			 USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_2),
1840	 .driver_data = recvr_type_hidpp},
 
1841	{ /* Logitech G700(s) receiver (0xc531) */
1842	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1843		0xc531),
 
 
 
 
1844	 .driver_data = recvr_type_gaming_hidpp},
1845	{ /* Logitech lightspeed receiver (0xc539) */
1846	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1847		USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_LIGHTSPEED_1),
1848	 .driver_data = recvr_type_gaming_hidpp},
 
 
 
 
1849	{ /* Logitech lightspeed receiver (0xc53f) */
1850	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1851		USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_LIGHTSPEED_1_1),
1852	 .driver_data = recvr_type_gaming_hidpp},
 
1853	{ /* Logitech 27 MHz HID++ 1.0 receiver (0xc513) */
1854	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER),
1855	 .driver_data = recvr_type_27mhz},
1856	{ /* Logitech powerplay receiver (0xc53a) */
1857	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1858		USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_POWERPLAY),
1859	 .driver_data = recvr_type_gaming_hidpp},
1860	{ /* Logitech 27 MHz HID++ 1.0 receiver (0xc517) */
1861	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1862		USB_DEVICE_ID_S510_RECEIVER_2),
1863	 .driver_data = recvr_type_27mhz},
1864	{ /* Logitech 27 MHz HID++ 1.0 mouse-only receiver (0xc51b) */
1865	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1866		USB_DEVICE_ID_LOGITECH_27MHZ_MOUSE_RECEIVER),
1867	 .driver_data = recvr_type_27mhz},
1868	{ /* Logitech MX5000 HID++ / bluetooth receiver keyboard intf. */
 
1869	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1870		0xc70e),
1871	 .driver_data = recvr_type_bluetooth},
1872	{ /* Logitech MX5000 HID++ / bluetooth receiver mouse intf. */
1873	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1874		0xc70a),
1875	 .driver_data = recvr_type_bluetooth},
1876	{ /* Logitech MX5500 HID++ / bluetooth receiver keyboard intf. */
1877	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1878		0xc71b),
1879	 .driver_data = recvr_type_bluetooth},
1880	{ /* Logitech MX5500 HID++ / bluetooth receiver mouse intf. */
1881	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1882		0xc71c),
1883	 .driver_data = recvr_type_bluetooth},
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1884	{}
1885};
1886
1887MODULE_DEVICE_TABLE(hid, logi_dj_receivers);
1888
1889static struct hid_driver logi_djreceiver_driver = {
1890	.name = "logitech-djreceiver",
1891	.id_table = logi_dj_receivers,
1892	.probe = logi_dj_probe,
1893	.remove = logi_dj_remove,
1894	.raw_event = logi_dj_raw_event,
1895#ifdef CONFIG_PM
1896	.reset_resume = logi_dj_reset_resume,
1897#endif
1898};
1899
1900module_hid_driver(logi_djreceiver_driver);
1901
1902MODULE_LICENSE("GPL");
1903MODULE_AUTHOR("Logitech");
1904MODULE_AUTHOR("Nestor Lopez Casado");
1905MODULE_AUTHOR("nlopezcasad@logitech.com");
v6.2
   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 KBD_MOUSE				BIT(5)
  88#define MEDIA_CENTER				BIT(8)
  89#define KBD_LEDS				BIT(14)
  90/* Fake (bitnr > NUMBER_OF_HID_REPORTS) bit to track HID++ capability */
  91#define HIDPP					BIT_ULL(63)
  92
  93/* HID++ Device Connected Notification */
  94#define REPORT_TYPE_NOTIF_DEVICE_CONNECTED	0x41
  95#define HIDPP_PARAM_PROTO_TYPE			0x00
  96#define HIDPP_PARAM_DEVICE_INFO			0x01
  97#define HIDPP_PARAM_EQUAD_LSB			0x02
  98#define HIDPP_PARAM_EQUAD_MSB			0x03
  99#define HIDPP_PARAM_27MHZ_DEVID			0x03
 100#define HIDPP_DEVICE_TYPE_MASK			GENMASK(3, 0)
 101#define HIDPP_LINK_STATUS_MASK			BIT(6)
 102#define HIDPP_MANUFACTURER_MASK			BIT(7)
 103#define HIDPP_27MHZ_SECURE_MASK			BIT(7)
 104
 105#define HIDPP_DEVICE_TYPE_KEYBOARD		1
 106#define HIDPP_DEVICE_TYPE_MOUSE			2
 107
 108#define HIDPP_SET_REGISTER			0x80
 109#define HIDPP_GET_LONG_REGISTER			0x83
 110#define HIDPP_REG_CONNECTION_STATE		0x02
 111#define HIDPP_REG_PAIRING_INFORMATION		0xB5
 112#define HIDPP_PAIRING_INFORMATION		0x20
 113#define HIDPP_FAKE_DEVICE_ARRIVAL		0x02
 114
 115enum recvr_type {
 116	recvr_type_dj,
 117	recvr_type_hidpp,
 118	recvr_type_gaming_hidpp,
 119	recvr_type_mouse_only,
 120	recvr_type_27mhz,
 121	recvr_type_bluetooth,
 122	recvr_type_dinovo,
 123};
 124
 125struct dj_report {
 126	u8 report_id;
 127	u8 device_index;
 128	u8 report_type;
 129	u8 report_params[DJREPORT_SHORT_LENGTH - 3];
 130};
 131
 132struct hidpp_event {
 133	u8 report_id;
 134	u8 device_index;
 135	u8 sub_id;
 136	u8 params[HIDPP_REPORT_LONG_LENGTH - 3U];
 137} __packed;
 138
 139struct dj_receiver_dev {
 140	struct hid_device *mouse;
 141	struct hid_device *keyboard;
 142	struct hid_device *hidpp;
 143	struct dj_device *paired_dj_devices[DJ_MAX_PAIRED_DEVICES +
 144					    DJ_DEVICE_INDEX_MIN];
 145	struct list_head list;
 146	struct kref kref;
 147	struct work_struct work;
 148	struct kfifo notif_fifo;
 149	unsigned long last_query; /* in jiffies */
 150	bool ready;
 151	enum recvr_type type;
 152	unsigned int unnumbered_application;
 153	spinlock_t lock;
 154};
 155
 156struct dj_device {
 157	struct hid_device *hdev;
 158	struct dj_receiver_dev *dj_receiver_dev;
 159	u64 reports_supported;
 160	u8 device_index;
 161};
 162
 163#define WORKITEM_TYPE_EMPTY	0
 164#define WORKITEM_TYPE_PAIRED	1
 165#define WORKITEM_TYPE_UNPAIRED	2
 166#define WORKITEM_TYPE_UNKNOWN	255
 167
 168struct dj_workitem {
 169	u8 type;		/* WORKITEM_TYPE_* */
 170	u8 device_index;
 171	u8 device_type;
 172	u8 quad_id_msb;
 173	u8 quad_id_lsb;
 174	u64 reports_supported;
 175};
 176
 177/* Keyboard descriptor (1) */
 178static const char kbd_descriptor[] = {
 179	0x05, 0x01,		/* USAGE_PAGE (generic Desktop)     */
 180	0x09, 0x06,		/* USAGE (Keyboard)         */
 181	0xA1, 0x01,		/* COLLECTION (Application)     */
 182	0x85, 0x01,		/* REPORT_ID (1)            */
 183	0x95, 0x08,		/*   REPORT_COUNT (8)           */
 184	0x75, 0x01,		/*   REPORT_SIZE (1)            */
 185	0x15, 0x00,		/*   LOGICAL_MINIMUM (0)        */
 186	0x25, 0x01,		/*   LOGICAL_MAXIMUM (1)        */
 187	0x05, 0x07,		/*   USAGE_PAGE (Keyboard)      */
 188	0x19, 0xE0,		/*   USAGE_MINIMUM (Left Control)   */
 189	0x29, 0xE7,		/*   USAGE_MAXIMUM (Right GUI)      */
 190	0x81, 0x02,		/*   INPUT (Data,Var,Abs)       */
 191	0x95, 0x06,		/*   REPORT_COUNT (6)           */
 192	0x75, 0x08,		/*   REPORT_SIZE (8)            */
 193	0x15, 0x00,		/*   LOGICAL_MINIMUM (0)        */
 194	0x26, 0xFF, 0x00,	/*   LOGICAL_MAXIMUM (255)      */
 195	0x05, 0x07,		/*   USAGE_PAGE (Keyboard)      */
 196	0x19, 0x00,		/*   USAGE_MINIMUM (no event)       */
 197	0x2A, 0xFF, 0x00,	/*   USAGE_MAXIMUM (reserved)       */
 198	0x81, 0x00,		/*   INPUT (Data,Ary,Abs)       */
 199	0x85, 0x0e,		/* REPORT_ID (14)               */
 200	0x05, 0x08,		/*   USAGE PAGE (LED page)      */
 201	0x95, 0x05,		/*   REPORT COUNT (5)           */
 202	0x75, 0x01,		/*   REPORT SIZE (1)            */
 203	0x15, 0x00,		/*   LOGICAL_MINIMUM (0)        */
 204	0x25, 0x01,		/*   LOGICAL_MAXIMUM (1)        */
 205	0x19, 0x01,		/*   USAGE MINIMUM (1)          */
 206	0x29, 0x05,		/*   USAGE MAXIMUM (5)          */
 207	0x91, 0x02,		/*   OUTPUT (Data, Variable, Absolute)  */
 208	0x95, 0x01,		/*   REPORT COUNT (1)           */
 209	0x75, 0x03,		/*   REPORT SIZE (3)            */
 210	0x91, 0x01,		/*   OUTPUT (Constant)          */
 211	0xC0
 212};
 213
 214/* Mouse descriptor (2)     */
 215static const char mse_descriptor[] = {
 216	0x05, 0x01,		/*  USAGE_PAGE (Generic Desktop)        */
 217	0x09, 0x02,		/*  USAGE (Mouse)                       */
 218	0xA1, 0x01,		/*  COLLECTION (Application)            */
 219	0x85, 0x02,		/*    REPORT_ID = 2                     */
 220	0x09, 0x01,		/*    USAGE (pointer)                   */
 221	0xA1, 0x00,		/*    COLLECTION (physical)             */
 222	0x05, 0x09,		/*      USAGE_PAGE (buttons)            */
 223	0x19, 0x01,		/*      USAGE_MIN (1)                   */
 224	0x29, 0x10,		/*      USAGE_MAX (16)                  */
 225	0x15, 0x00,		/*      LOGICAL_MIN (0)                 */
 226	0x25, 0x01,		/*      LOGICAL_MAX (1)                 */
 227	0x95, 0x10,		/*      REPORT_COUNT (16)               */
 228	0x75, 0x01,		/*      REPORT_SIZE (1)                 */
 229	0x81, 0x02,		/*      INPUT (data var abs)            */
 230	0x05, 0x01,		/*      USAGE_PAGE (generic desktop)    */
 231	0x16, 0x01, 0xF8,	/*      LOGICAL_MIN (-2047)             */
 232	0x26, 0xFF, 0x07,	/*      LOGICAL_MAX (2047)              */
 233	0x75, 0x0C,		/*      REPORT_SIZE (12)                */
 234	0x95, 0x02,		/*      REPORT_COUNT (2)                */
 235	0x09, 0x30,		/*      USAGE (X)                       */
 236	0x09, 0x31,		/*      USAGE (Y)                       */
 237	0x81, 0x06,		/*      INPUT                           */
 238	0x15, 0x81,		/*      LOGICAL_MIN (-127)              */
 239	0x25, 0x7F,		/*      LOGICAL_MAX (127)               */
 240	0x75, 0x08,		/*      REPORT_SIZE (8)                 */
 241	0x95, 0x01,		/*      REPORT_COUNT (1)                */
 242	0x09, 0x38,		/*      USAGE (wheel)                   */
 243	0x81, 0x06,		/*      INPUT                           */
 244	0x05, 0x0C,		/*      USAGE_PAGE(consumer)            */
 245	0x0A, 0x38, 0x02,	/*      USAGE(AC Pan)                   */
 246	0x95, 0x01,		/*      REPORT_COUNT (1)                */
 247	0x81, 0x06,		/*      INPUT                           */
 248	0xC0,			/*    END_COLLECTION                    */
 249	0xC0,			/*  END_COLLECTION                      */
 250};
 251
 252/* Mouse descriptor (2) for 27 MHz receiver, only 8 buttons */
 253static const char mse_27mhz_descriptor[] = {
 254	0x05, 0x01,		/*  USAGE_PAGE (Generic Desktop)        */
 255	0x09, 0x02,		/*  USAGE (Mouse)                       */
 256	0xA1, 0x01,		/*  COLLECTION (Application)            */
 257	0x85, 0x02,		/*    REPORT_ID = 2                     */
 258	0x09, 0x01,		/*    USAGE (pointer)                   */
 259	0xA1, 0x00,		/*    COLLECTION (physical)             */
 260	0x05, 0x09,		/*      USAGE_PAGE (buttons)            */
 261	0x19, 0x01,		/*      USAGE_MIN (1)                   */
 262	0x29, 0x08,		/*      USAGE_MAX (8)                   */
 263	0x15, 0x00,		/*      LOGICAL_MIN (0)                 */
 264	0x25, 0x01,		/*      LOGICAL_MAX (1)                 */
 265	0x95, 0x08,		/*      REPORT_COUNT (8)                */
 266	0x75, 0x01,		/*      REPORT_SIZE (1)                 */
 267	0x81, 0x02,		/*      INPUT (data var abs)            */
 268	0x05, 0x01,		/*      USAGE_PAGE (generic desktop)    */
 269	0x16, 0x01, 0xF8,	/*      LOGICAL_MIN (-2047)             */
 270	0x26, 0xFF, 0x07,	/*      LOGICAL_MAX (2047)              */
 271	0x75, 0x0C,		/*      REPORT_SIZE (12)                */
 272	0x95, 0x02,		/*      REPORT_COUNT (2)                */
 273	0x09, 0x30,		/*      USAGE (X)                       */
 274	0x09, 0x31,		/*      USAGE (Y)                       */
 275	0x81, 0x06,		/*      INPUT                           */
 276	0x15, 0x81,		/*      LOGICAL_MIN (-127)              */
 277	0x25, 0x7F,		/*      LOGICAL_MAX (127)               */
 278	0x75, 0x08,		/*      REPORT_SIZE (8)                 */
 279	0x95, 0x01,		/*      REPORT_COUNT (1)                */
 280	0x09, 0x38,		/*      USAGE (wheel)                   */
 281	0x81, 0x06,		/*      INPUT                           */
 282	0x05, 0x0C,		/*      USAGE_PAGE(consumer)            */
 283	0x0A, 0x38, 0x02,	/*      USAGE(AC Pan)                   */
 284	0x95, 0x01,		/*      REPORT_COUNT (1)                */
 285	0x81, 0x06,		/*      INPUT                           */
 286	0xC0,			/*    END_COLLECTION                    */
 287	0xC0,			/*  END_COLLECTION                      */
 288};
 289
 290/* Mouse descriptor (2) for Bluetooth receiver, low-res hwheel, 12 buttons */
 291static const char mse_bluetooth_descriptor[] = {
 292	0x05, 0x01,		/*  USAGE_PAGE (Generic Desktop)        */
 293	0x09, 0x02,		/*  USAGE (Mouse)                       */
 294	0xA1, 0x01,		/*  COLLECTION (Application)            */
 295	0x85, 0x02,		/*    REPORT_ID = 2                     */
 296	0x09, 0x01,		/*    USAGE (pointer)                   */
 297	0xA1, 0x00,		/*    COLLECTION (physical)             */
 298	0x05, 0x09,		/*      USAGE_PAGE (buttons)            */
 299	0x19, 0x01,		/*      USAGE_MIN (1)                   */
 300	0x29, 0x08,		/*      USAGE_MAX (8)                   */
 301	0x15, 0x00,		/*      LOGICAL_MIN (0)                 */
 302	0x25, 0x01,		/*      LOGICAL_MAX (1)                 */
 303	0x95, 0x08,		/*      REPORT_COUNT (8)                */
 304	0x75, 0x01,		/*      REPORT_SIZE (1)                 */
 305	0x81, 0x02,		/*      INPUT (data var abs)            */
 306	0x05, 0x01,		/*      USAGE_PAGE (generic desktop)    */
 307	0x16, 0x01, 0xF8,	/*      LOGICAL_MIN (-2047)             */
 308	0x26, 0xFF, 0x07,	/*      LOGICAL_MAX (2047)              */
 309	0x75, 0x0C,		/*      REPORT_SIZE (12)                */
 310	0x95, 0x02,		/*      REPORT_COUNT (2)                */
 311	0x09, 0x30,		/*      USAGE (X)                       */
 312	0x09, 0x31,		/*      USAGE (Y)                       */
 313	0x81, 0x06,		/*      INPUT                           */
 314	0x15, 0x81,		/*      LOGICAL_MIN (-127)              */
 315	0x25, 0x7F,		/*      LOGICAL_MAX (127)               */
 316	0x75, 0x08,		/*      REPORT_SIZE (8)                 */
 317	0x95, 0x01,		/*      REPORT_COUNT (1)                */
 318	0x09, 0x38,		/*      USAGE (wheel)                   */
 319	0x81, 0x06,		/*      INPUT                           */
 320	0x05, 0x0C,		/*      USAGE_PAGE(consumer)            */
 321	0x0A, 0x38, 0x02,	/*      USAGE(AC Pan)                   */
 322	0x15, 0xF9,		/*      LOGICAL_MIN (-7)                */
 323	0x25, 0x07,		/*      LOGICAL_MAX (7)                 */
 324	0x75, 0x04,		/*      REPORT_SIZE (4)                 */
 325	0x95, 0x01,		/*      REPORT_COUNT (1)                */
 326	0x81, 0x06,		/*      INPUT                           */
 327	0x05, 0x09,		/*      USAGE_PAGE (buttons)            */
 328	0x19, 0x09,		/*      USAGE_MIN (9)                   */
 329	0x29, 0x0C,		/*      USAGE_MAX (12)                  */
 330	0x15, 0x00,		/*      LOGICAL_MIN (0)                 */
 331	0x25, 0x01,		/*      LOGICAL_MAX (1)                 */
 332	0x75, 0x01,		/*      REPORT_SIZE (1)                 */
 333	0x95, 0x04,		/*      REPORT_COUNT (4)                */
 334	0x81, 0x02,		/*      INPUT (Data,Var,Abs)            */
 335	0xC0,			/*    END_COLLECTION                    */
 336	0xC0,			/*  END_COLLECTION                      */
 337};
 338
 339/* Mouse descriptor (5) for Bluetooth receiver, normal-res hwheel, 8 buttons */
 340static const char mse5_bluetooth_descriptor[] = {
 341	0x05, 0x01,		/*  USAGE_PAGE (Generic Desktop)        */
 342	0x09, 0x02,		/*  Usage (Mouse)                       */
 343	0xa1, 0x01,		/*  Collection (Application)            */
 344	0x85, 0x05,		/*   Report ID (5)                      */
 345	0x09, 0x01,		/*   Usage (Pointer)                    */
 346	0xa1, 0x00,		/*   Collection (Physical)              */
 347	0x05, 0x09,		/*    Usage Page (Button)               */
 348	0x19, 0x01,		/*    Usage Minimum (1)                 */
 349	0x29, 0x08,		/*    Usage Maximum (8)                 */
 350	0x15, 0x00,		/*    Logical Minimum (0)               */
 351	0x25, 0x01,		/*    Logical Maximum (1)               */
 352	0x95, 0x08,		/*    Report Count (8)                  */
 353	0x75, 0x01,		/*    Report Size (1)                   */
 354	0x81, 0x02,		/*    Input (Data,Var,Abs)              */
 355	0x05, 0x01,		/*    Usage Page (Generic Desktop)      */
 356	0x16, 0x01, 0xf8,	/*    Logical Minimum (-2047)           */
 357	0x26, 0xff, 0x07,	/*    Logical Maximum (2047)            */
 358	0x75, 0x0c,		/*    Report Size (12)                  */
 359	0x95, 0x02,		/*    Report Count (2)                  */
 360	0x09, 0x30,		/*    Usage (X)                         */
 361	0x09, 0x31,		/*    Usage (Y)                         */
 362	0x81, 0x06,		/*    Input (Data,Var,Rel)              */
 363	0x15, 0x81,		/*    Logical Minimum (-127)            */
 364	0x25, 0x7f,		/*    Logical Maximum (127)             */
 365	0x75, 0x08,		/*    Report Size (8)                   */
 366	0x95, 0x01,		/*    Report Count (1)                  */
 367	0x09, 0x38,		/*    Usage (Wheel)                     */
 368	0x81, 0x06,		/*    Input (Data,Var,Rel)              */
 369	0x05, 0x0c,		/*    Usage Page (Consumer Devices)     */
 370	0x0a, 0x38, 0x02,	/*    Usage (AC Pan)                    */
 371	0x15, 0x81,		/*    Logical Minimum (-127)            */
 372	0x25, 0x7f,		/*    Logical Maximum (127)             */
 373	0x75, 0x08,		/*    Report Size (8)                   */
 374	0x95, 0x01,		/*    Report Count (1)                  */
 375	0x81, 0x06,		/*    Input (Data,Var,Rel)              */
 376	0xc0,			/*   End Collection                     */
 377	0xc0,			/*  End Collection                      */
 378};
 379
 380/* Gaming Mouse descriptor (2) */
 381static const char mse_high_res_descriptor[] = {
 382	0x05, 0x01,		/*  USAGE_PAGE (Generic Desktop)        */
 383	0x09, 0x02,		/*  USAGE (Mouse)                       */
 384	0xA1, 0x01,		/*  COLLECTION (Application)            */
 385	0x85, 0x02,		/*    REPORT_ID = 2                     */
 386	0x09, 0x01,		/*    USAGE (pointer)                   */
 387	0xA1, 0x00,		/*    COLLECTION (physical)             */
 388	0x05, 0x09,		/*      USAGE_PAGE (buttons)            */
 389	0x19, 0x01,		/*      USAGE_MIN (1)                   */
 390	0x29, 0x10,		/*      USAGE_MAX (16)                  */
 391	0x15, 0x00,		/*      LOGICAL_MIN (0)                 */
 392	0x25, 0x01,		/*      LOGICAL_MAX (1)                 */
 393	0x95, 0x10,		/*      REPORT_COUNT (16)               */
 394	0x75, 0x01,		/*      REPORT_SIZE (1)                 */
 395	0x81, 0x02,		/*      INPUT (data var abs)            */
 396	0x05, 0x01,		/*      USAGE_PAGE (generic desktop)    */
 397	0x16, 0x01, 0x80,	/*      LOGICAL_MIN (-32767)            */
 398	0x26, 0xFF, 0x7F,	/*      LOGICAL_MAX (32767)             */
 399	0x75, 0x10,		/*      REPORT_SIZE (16)                */
 400	0x95, 0x02,		/*      REPORT_COUNT (2)                */
 401	0x09, 0x30,		/*      USAGE (X)                       */
 402	0x09, 0x31,		/*      USAGE (Y)                       */
 403	0x81, 0x06,		/*      INPUT                           */
 404	0x15, 0x81,		/*      LOGICAL_MIN (-127)              */
 405	0x25, 0x7F,		/*      LOGICAL_MAX (127)               */
 406	0x75, 0x08,		/*      REPORT_SIZE (8)                 */
 407	0x95, 0x01,		/*      REPORT_COUNT (1)                */
 408	0x09, 0x38,		/*      USAGE (wheel)                   */
 409	0x81, 0x06,		/*      INPUT                           */
 410	0x05, 0x0C,		/*      USAGE_PAGE(consumer)            */
 411	0x0A, 0x38, 0x02,	/*      USAGE(AC Pan)                   */
 412	0x95, 0x01,		/*      REPORT_COUNT (1)                */
 413	0x81, 0x06,		/*      INPUT                           */
 414	0xC0,			/*    END_COLLECTION                    */
 415	0xC0,			/*  END_COLLECTION                      */
 416};
 417
 418/* Consumer Control descriptor (3) */
 419static const char consumer_descriptor[] = {
 420	0x05, 0x0C,		/* USAGE_PAGE (Consumer Devices)       */
 421	0x09, 0x01,		/* USAGE (Consumer Control)            */
 422	0xA1, 0x01,		/* COLLECTION (Application)            */
 423	0x85, 0x03,		/* REPORT_ID = 3                       */
 424	0x75, 0x10,		/* REPORT_SIZE (16)                    */
 425	0x95, 0x02,		/* REPORT_COUNT (2)                    */
 426	0x15, 0x01,		/* LOGICAL_MIN (1)                     */
 427	0x26, 0xFF, 0x02,	/* LOGICAL_MAX (767)                   */
 428	0x19, 0x01,		/* USAGE_MIN (1)                       */
 429	0x2A, 0xFF, 0x02,	/* USAGE_MAX (767)                     */
 430	0x81, 0x00,		/* INPUT (Data Ary Abs)                */
 431	0xC0,			/* END_COLLECTION                      */
 432};				/*                                     */
 433
 434/* System control descriptor (4) */
 435static const char syscontrol_descriptor[] = {
 436	0x05, 0x01,		/*   USAGE_PAGE (Generic Desktop)      */
 437	0x09, 0x80,		/*   USAGE (System Control)            */
 438	0xA1, 0x01,		/*   COLLECTION (Application)          */
 439	0x85, 0x04,		/*   REPORT_ID = 4                     */
 440	0x75, 0x02,		/*   REPORT_SIZE (2)                   */
 441	0x95, 0x01,		/*   REPORT_COUNT (1)                  */
 442	0x15, 0x01,		/*   LOGICAL_MIN (1)                   */
 443	0x25, 0x03,		/*   LOGICAL_MAX (3)                   */
 444	0x09, 0x82,		/*   USAGE (System Sleep)              */
 445	0x09, 0x81,		/*   USAGE (System Power Down)         */
 446	0x09, 0x83,		/*   USAGE (System Wake Up)            */
 447	0x81, 0x60,		/*   INPUT (Data Ary Abs NPrf Null)    */
 448	0x75, 0x06,		/*   REPORT_SIZE (6)                   */
 449	0x81, 0x03,		/*   INPUT (Cnst Var Abs)              */
 450	0xC0,			/*   END_COLLECTION                    */
 451};
 452
 453/* Media descriptor (8) */
 454static const char media_descriptor[] = {
 455	0x06, 0xbc, 0xff,	/* Usage Page 0xffbc                   */
 456	0x09, 0x88,		/* Usage 0x0088                        */
 457	0xa1, 0x01,		/* BeginCollection                     */
 458	0x85, 0x08,		/*   Report ID 8                       */
 459	0x19, 0x01,		/*   Usage Min 0x0001                  */
 460	0x29, 0xff,		/*   Usage Max 0x00ff                  */
 461	0x15, 0x01,		/*   Logical Min 1                     */
 462	0x26, 0xff, 0x00,	/*   Logical Max 255                   */
 463	0x75, 0x08,		/*   Report Size 8                     */
 464	0x95, 0x01,		/*   Report Count 1                    */
 465	0x81, 0x00,		/*   Input                             */
 466	0xc0,			/* EndCollection                       */
 467};				/*                                     */
 468
 469/* HIDPP descriptor */
 470static const char hidpp_descriptor[] = {
 471	0x06, 0x00, 0xff,	/* Usage Page (Vendor Defined Page 1)  */
 472	0x09, 0x01,		/* Usage (Vendor Usage 1)              */
 473	0xa1, 0x01,		/* Collection (Application)            */
 474	0x85, 0x10,		/*   Report ID (16)                    */
 475	0x75, 0x08,		/*   Report Size (8)                   */
 476	0x95, 0x06,		/*   Report Count (6)                  */
 477	0x15, 0x00,		/*   Logical Minimum (0)               */
 478	0x26, 0xff, 0x00,	/*   Logical Maximum (255)             */
 479	0x09, 0x01,		/*   Usage (Vendor Usage 1)            */
 480	0x81, 0x00,		/*   Input (Data,Arr,Abs)              */
 481	0x09, 0x01,		/*   Usage (Vendor Usage 1)            */
 482	0x91, 0x00,		/*   Output (Data,Arr,Abs)             */
 483	0xc0,			/* End Collection                      */
 484	0x06, 0x00, 0xff,	/* Usage Page (Vendor Defined Page 1)  */
 485	0x09, 0x02,		/* Usage (Vendor Usage 2)              */
 486	0xa1, 0x01,		/* Collection (Application)            */
 487	0x85, 0x11,		/*   Report ID (17)                    */
 488	0x75, 0x08,		/*   Report Size (8)                   */
 489	0x95, 0x13,		/*   Report Count (19)                 */
 490	0x15, 0x00,		/*   Logical Minimum (0)               */
 491	0x26, 0xff, 0x00,	/*   Logical Maximum (255)             */
 492	0x09, 0x02,		/*   Usage (Vendor Usage 2)            */
 493	0x81, 0x00,		/*   Input (Data,Arr,Abs)              */
 494	0x09, 0x02,		/*   Usage (Vendor Usage 2)            */
 495	0x91, 0x00,		/*   Output (Data,Arr,Abs)             */
 496	0xc0,			/* End Collection                      */
 497	0x06, 0x00, 0xff,	/* Usage Page (Vendor Defined Page 1)  */
 498	0x09, 0x04,		/* Usage (Vendor Usage 0x04)           */
 499	0xa1, 0x01,		/* Collection (Application)            */
 500	0x85, 0x20,		/*   Report ID (32)                    */
 501	0x75, 0x08,		/*   Report Size (8)                   */
 502	0x95, 0x0e,		/*   Report Count (14)                 */
 503	0x15, 0x00,		/*   Logical Minimum (0)               */
 504	0x26, 0xff, 0x00,	/*   Logical Maximum (255)             */
 505	0x09, 0x41,		/*   Usage (Vendor Usage 0x41)         */
 506	0x81, 0x00,		/*   Input (Data,Arr,Abs)              */
 507	0x09, 0x41,		/*   Usage (Vendor Usage 0x41)         */
 508	0x91, 0x00,		/*   Output (Data,Arr,Abs)             */
 509	0x85, 0x21,		/*   Report ID (33)                    */
 510	0x95, 0x1f,		/*   Report Count (31)                 */
 511	0x15, 0x00,		/*   Logical Minimum (0)               */
 512	0x26, 0xff, 0x00,	/*   Logical Maximum (255)             */
 513	0x09, 0x42,		/*   Usage (Vendor Usage 0x42)         */
 514	0x81, 0x00,		/*   Input (Data,Arr,Abs)              */
 515	0x09, 0x42,		/*   Usage (Vendor Usage 0x42)         */
 516	0x91, 0x00,		/*   Output (Data,Arr,Abs)             */
 517	0xc0,			/* End Collection                      */
 518};
 519
 520/* Maximum size of all defined hid reports in bytes (including report id) */
 521#define MAX_REPORT_SIZE 8
 522
 523/* Make sure all descriptors are present here */
 524#define MAX_RDESC_SIZE				\
 525	(sizeof(kbd_descriptor) +		\
 526	 sizeof(mse_bluetooth_descriptor) +	\
 527	 sizeof(mse5_bluetooth_descriptor) +	\
 528	 sizeof(consumer_descriptor) +		\
 529	 sizeof(syscontrol_descriptor) +	\
 530	 sizeof(media_descriptor) +	\
 531	 sizeof(hidpp_descriptor))
 532
 533/* Number of possible hid report types that can be created by this driver.
 534 *
 535 * Right now, RF report types have the same report types (or report id's)
 536 * than the hid report created from those RF reports. In the future
 537 * this doesnt have to be true.
 538 *
 539 * For instance, RF report type 0x01 which has a size of 8 bytes, corresponds
 540 * to hid report id 0x01, this is standard keyboard. Same thing applies to mice
 541 * reports and consumer control, etc. If a new RF report is created, it doesn't
 542 * has to have the same report id as its corresponding hid report, so an
 543 * translation may have to take place for future report types.
 544 */
 545#define NUMBER_OF_HID_REPORTS 32
 546static const u8 hid_reportid_size_map[NUMBER_OF_HID_REPORTS] = {
 547	[1] = 8,		/* Standard keyboard */
 548	[2] = 8,		/* Standard mouse */
 549	[3] = 5,		/* Consumer control */
 550	[4] = 2,		/* System control */
 551	[8] = 2,		/* Media Center */
 552};
 553
 554
 555#define LOGITECH_DJ_INTERFACE_NUMBER 0x02
 556
 557static struct hid_ll_driver logi_dj_ll_driver;
 558
 559static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev);
 560static void delayedwork_callback(struct work_struct *work);
 561
 562static LIST_HEAD(dj_hdev_list);
 563static DEFINE_MUTEX(dj_hdev_list_lock);
 564
 565static bool recvr_type_is_bluetooth(enum recvr_type type)
 566{
 567	return type == recvr_type_bluetooth || type == recvr_type_dinovo;
 568}
 569
 570/*
 571 * dj/HID++ receivers are really a single logical entity, but for BIOS/Windows
 572 * compatibility they have multiple USB interfaces. On HID++ receivers we need
 573 * to listen for input reports on both interfaces. The functions below are used
 574 * to create a single struct dj_receiver_dev for all interfaces belonging to
 575 * a single USB-device / receiver.
 576 */
 577static struct dj_receiver_dev *dj_find_receiver_dev(struct hid_device *hdev,
 578						    enum recvr_type type)
 579{
 580	struct dj_receiver_dev *djrcv_dev;
 581	char sep;
 582
 583	/*
 584	 * The bluetooth receiver contains a built-in hub and has separate
 585	 * USB-devices for the keyboard and mouse interfaces.
 586	 */
 587	sep = recvr_type_is_bluetooth(type) ? '.' : '/';
 588
 589	/* Try to find an already-probed interface from the same device */
 590	list_for_each_entry(djrcv_dev, &dj_hdev_list, list) {
 591		if (djrcv_dev->mouse &&
 592		    hid_compare_device_paths(hdev, djrcv_dev->mouse, sep)) {
 593			kref_get(&djrcv_dev->kref);
 594			return djrcv_dev;
 595		}
 596		if (djrcv_dev->keyboard &&
 597		    hid_compare_device_paths(hdev, djrcv_dev->keyboard, sep)) {
 598			kref_get(&djrcv_dev->kref);
 599			return djrcv_dev;
 600		}
 601		if (djrcv_dev->hidpp &&
 602		    hid_compare_device_paths(hdev, djrcv_dev->hidpp, sep)) {
 603			kref_get(&djrcv_dev->kref);
 604			return djrcv_dev;
 605		}
 606	}
 607
 608	return NULL;
 609}
 610
 611static void dj_release_receiver_dev(struct kref *kref)
 612{
 613	struct dj_receiver_dev *djrcv_dev = container_of(kref, struct dj_receiver_dev, kref);
 614
 615	list_del(&djrcv_dev->list);
 616	kfifo_free(&djrcv_dev->notif_fifo);
 617	kfree(djrcv_dev);
 618}
 619
 620static void dj_put_receiver_dev(struct hid_device *hdev)
 621{
 622	struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
 623
 624	mutex_lock(&dj_hdev_list_lock);
 625
 626	if (djrcv_dev->mouse == hdev)
 627		djrcv_dev->mouse = NULL;
 628	if (djrcv_dev->keyboard == hdev)
 629		djrcv_dev->keyboard = NULL;
 630	if (djrcv_dev->hidpp == hdev)
 631		djrcv_dev->hidpp = NULL;
 632
 633	kref_put(&djrcv_dev->kref, dj_release_receiver_dev);
 634
 635	mutex_unlock(&dj_hdev_list_lock);
 636}
 637
 638static struct dj_receiver_dev *dj_get_receiver_dev(struct hid_device *hdev,
 639						   enum recvr_type type,
 640						   unsigned int application,
 641						   bool is_hidpp)
 642{
 643	struct dj_receiver_dev *djrcv_dev;
 644
 645	mutex_lock(&dj_hdev_list_lock);
 646
 647	djrcv_dev = dj_find_receiver_dev(hdev, type);
 648	if (!djrcv_dev) {
 649		djrcv_dev = kzalloc(sizeof(*djrcv_dev), GFP_KERNEL);
 650		if (!djrcv_dev)
 651			goto out;
 652
 653		INIT_WORK(&djrcv_dev->work, delayedwork_callback);
 654		spin_lock_init(&djrcv_dev->lock);
 655		if (kfifo_alloc(&djrcv_dev->notif_fifo,
 656			    DJ_MAX_NUMBER_NOTIFS * sizeof(struct dj_workitem),
 657			    GFP_KERNEL)) {
 658			kfree(djrcv_dev);
 659			djrcv_dev = NULL;
 660			goto out;
 661		}
 662		kref_init(&djrcv_dev->kref);
 663		list_add_tail(&djrcv_dev->list, &dj_hdev_list);
 664		djrcv_dev->last_query = jiffies;
 665		djrcv_dev->type = type;
 666	}
 667
 668	if (application == HID_GD_KEYBOARD)
 669		djrcv_dev->keyboard = hdev;
 670	if (application == HID_GD_MOUSE)
 671		djrcv_dev->mouse = hdev;
 672	if (is_hidpp)
 673		djrcv_dev->hidpp = hdev;
 674
 675	hid_set_drvdata(hdev, djrcv_dev);
 676out:
 677	mutex_unlock(&dj_hdev_list_lock);
 678	return djrcv_dev;
 679}
 680
 681static void logi_dj_recv_destroy_djhid_device(struct dj_receiver_dev *djrcv_dev,
 682					      struct dj_workitem *workitem)
 683{
 684	/* Called in delayed work context */
 685	struct dj_device *dj_dev;
 686	unsigned long flags;
 687
 688	spin_lock_irqsave(&djrcv_dev->lock, flags);
 689	dj_dev = djrcv_dev->paired_dj_devices[workitem->device_index];
 690	djrcv_dev->paired_dj_devices[workitem->device_index] = NULL;
 691	spin_unlock_irqrestore(&djrcv_dev->lock, flags);
 692
 693	if (dj_dev != NULL) {
 694		hid_destroy_device(dj_dev->hdev);
 695		kfree(dj_dev);
 696	} else {
 697		hid_err(djrcv_dev->hidpp, "%s: can't destroy a NULL device\n",
 698			__func__);
 699	}
 700}
 701
 702static void logi_dj_recv_add_djhid_device(struct dj_receiver_dev *djrcv_dev,
 703					  struct dj_workitem *workitem)
 704{
 705	/* Called in delayed work context */
 706	struct hid_device *djrcv_hdev = djrcv_dev->hidpp;
 707	struct hid_device *dj_hiddev;
 708	struct dj_device *dj_dev;
 709	u8 device_index = workitem->device_index;
 710	unsigned long flags;
 711
 712	/* Device index goes from 1 to 6, we need 3 bytes to store the
 713	 * semicolon, the index, and a null terminator
 714	 */
 715	unsigned char tmpstr[3];
 716
 717	/* We are the only one ever adding a device, no need to lock */
 718	if (djrcv_dev->paired_dj_devices[device_index]) {
 719		/* The device is already known. No need to reallocate it. */
 720		dbg_hid("%s: device is already known\n", __func__);
 721		return;
 722	}
 723
 724	dj_hiddev = hid_allocate_device();
 725	if (IS_ERR(dj_hiddev)) {
 726		hid_err(djrcv_hdev, "%s: hid_allocate_dev failed\n", __func__);
 727		return;
 728	}
 729
 730	dj_hiddev->ll_driver = &logi_dj_ll_driver;
 731
 732	dj_hiddev->dev.parent = &djrcv_hdev->dev;
 733	dj_hiddev->bus = BUS_USB;
 734	dj_hiddev->vendor = djrcv_hdev->vendor;
 735	dj_hiddev->product = (workitem->quad_id_msb << 8) |
 736			      workitem->quad_id_lsb;
 737	if (workitem->device_type) {
 738		const char *type_str = "Device";
 739
 740		switch (workitem->device_type) {
 741		case 0x01: type_str = "Keyboard";	break;
 742		case 0x02: type_str = "Mouse";		break;
 743		case 0x03: type_str = "Numpad";		break;
 744		case 0x04: type_str = "Presenter";	break;
 745		case 0x07: type_str = "Remote Control";	break;
 746		case 0x08: type_str = "Trackball";	break;
 747		case 0x09: type_str = "Touchpad";	break;
 748		}
 749		snprintf(dj_hiddev->name, sizeof(dj_hiddev->name),
 750			"Logitech Wireless %s PID:%04x",
 751			type_str, dj_hiddev->product);
 752	} else {
 753		snprintf(dj_hiddev->name, sizeof(dj_hiddev->name),
 754			"Logitech Wireless Device PID:%04x",
 755			dj_hiddev->product);
 756	}
 757
 758	if (djrcv_dev->type == recvr_type_27mhz)
 759		dj_hiddev->group = HID_GROUP_LOGITECH_27MHZ_DEVICE;
 760	else
 761		dj_hiddev->group = HID_GROUP_LOGITECH_DJ_DEVICE;
 762
 763	memcpy(dj_hiddev->phys, djrcv_hdev->phys, sizeof(djrcv_hdev->phys));
 764	snprintf(tmpstr, sizeof(tmpstr), ":%d", device_index);
 765	strlcat(dj_hiddev->phys, tmpstr, sizeof(dj_hiddev->phys));
 766
 767	dj_dev = kzalloc(sizeof(struct dj_device), GFP_KERNEL);
 768
 769	if (!dj_dev) {
 770		hid_err(djrcv_hdev, "%s: failed allocating dj_dev\n", __func__);
 771		goto dj_device_allocate_fail;
 772	}
 773
 774	dj_dev->reports_supported = workitem->reports_supported;
 775	dj_dev->hdev = dj_hiddev;
 776	dj_dev->dj_receiver_dev = djrcv_dev;
 777	dj_dev->device_index = device_index;
 778	dj_hiddev->driver_data = dj_dev;
 779
 780	spin_lock_irqsave(&djrcv_dev->lock, flags);
 781	djrcv_dev->paired_dj_devices[device_index] = dj_dev;
 782	spin_unlock_irqrestore(&djrcv_dev->lock, flags);
 783
 784	if (hid_add_device(dj_hiddev)) {
 785		hid_err(djrcv_hdev, "%s: failed adding dj_device\n", __func__);
 786		goto hid_add_device_fail;
 787	}
 788
 789	return;
 790
 791hid_add_device_fail:
 792	spin_lock_irqsave(&djrcv_dev->lock, flags);
 793	djrcv_dev->paired_dj_devices[device_index] = NULL;
 794	spin_unlock_irqrestore(&djrcv_dev->lock, flags);
 795	kfree(dj_dev);
 796dj_device_allocate_fail:
 797	hid_destroy_device(dj_hiddev);
 798}
 799
 800static void delayedwork_callback(struct work_struct *work)
 801{
 802	struct dj_receiver_dev *djrcv_dev =
 803		container_of(work, struct dj_receiver_dev, work);
 804
 805	struct dj_workitem workitem;
 806	unsigned long flags;
 807	int count;
 808	int retval;
 809
 810	dbg_hid("%s\n", __func__);
 811
 812	spin_lock_irqsave(&djrcv_dev->lock, flags);
 813
 814	/*
 815	 * Since we attach to multiple interfaces, we may get scheduled before
 816	 * we are bound to the HID++ interface, catch this.
 817	 */
 818	if (!djrcv_dev->ready) {
 819		pr_warn("%s: delayedwork queued before hidpp interface was enumerated\n",
 820			__func__);
 821		spin_unlock_irqrestore(&djrcv_dev->lock, flags);
 822		return;
 823	}
 824
 825	count = kfifo_out(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem));
 826
 827	if (count != sizeof(workitem)) {
 828		spin_unlock_irqrestore(&djrcv_dev->lock, flags);
 829		return;
 830	}
 831
 832	if (!kfifo_is_empty(&djrcv_dev->notif_fifo))
 833		schedule_work(&djrcv_dev->work);
 834
 835	spin_unlock_irqrestore(&djrcv_dev->lock, flags);
 836
 837	switch (workitem.type) {
 838	case WORKITEM_TYPE_PAIRED:
 839		logi_dj_recv_add_djhid_device(djrcv_dev, &workitem);
 840		break;
 841	case WORKITEM_TYPE_UNPAIRED:
 842		logi_dj_recv_destroy_djhid_device(djrcv_dev, &workitem);
 843		break;
 844	case WORKITEM_TYPE_UNKNOWN:
 845		retval = logi_dj_recv_query_paired_devices(djrcv_dev);
 846		if (retval) {
 847			hid_err(djrcv_dev->hidpp, "%s: logi_dj_recv_query_paired_devices error: %d\n",
 848				__func__, retval);
 849		}
 850		break;
 851	case WORKITEM_TYPE_EMPTY:
 852		dbg_hid("%s: device list is empty\n", __func__);
 853		break;
 854	}
 855}
 856
 857/*
 858 * Sometimes we receive reports for which we do not have a paired dj_device
 859 * associated with the device_index or report-type to forward the report to.
 860 * This means that the original "device paired" notification corresponding
 861 * to the dj_device never arrived to this driver. Possible reasons for this are:
 862 * 1) hid-core discards all packets coming from a device during probe().
 863 * 2) if the receiver is plugged into a KVM switch then the pairing reports
 864 * are only forwarded to it if the focus is on this PC.
 865 * This function deals with this by re-asking the receiver for the list of
 866 * connected devices in the delayed work callback.
 867 * This function MUST be called with djrcv->lock held.
 868 */
 869static void logi_dj_recv_queue_unknown_work(struct dj_receiver_dev *djrcv_dev)
 870{
 871	struct dj_workitem workitem = { .type = WORKITEM_TYPE_UNKNOWN };
 872
 873	/* Rate limit queries done because of unhandled reports to 2/sec */
 874	if (time_before(jiffies, djrcv_dev->last_query + HZ / 2))
 875		return;
 876
 877	kfifo_in(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem));
 878	schedule_work(&djrcv_dev->work);
 879}
 880
 881static void logi_dj_recv_queue_notification(struct dj_receiver_dev *djrcv_dev,
 882					   struct dj_report *dj_report)
 883{
 884	/* We are called from atomic context (tasklet && djrcv->lock held) */
 885	struct dj_workitem workitem = {
 886		.device_index = dj_report->device_index,
 887	};
 888
 889	switch (dj_report->report_type) {
 890	case REPORT_TYPE_NOTIF_DEVICE_PAIRED:
 891		workitem.type = WORKITEM_TYPE_PAIRED;
 892		if (dj_report->report_params[DEVICE_PAIRED_PARAM_SPFUNCTION] &
 893		    SPFUNCTION_DEVICE_LIST_EMPTY) {
 894			workitem.type = WORKITEM_TYPE_EMPTY;
 895			break;
 896		}
 897		fallthrough;
 898	case REPORT_TYPE_NOTIF_DEVICE_UNPAIRED:
 899		workitem.quad_id_msb =
 900			dj_report->report_params[DEVICE_PAIRED_PARAM_EQUAD_ID_MSB];
 901		workitem.quad_id_lsb =
 902			dj_report->report_params[DEVICE_PAIRED_PARAM_EQUAD_ID_LSB];
 903		workitem.reports_supported = get_unaligned_le32(
 904						dj_report->report_params +
 905						DEVICE_PAIRED_RF_REPORT_TYPE);
 906		workitem.reports_supported |= HIDPP;
 907		if (dj_report->report_type == REPORT_TYPE_NOTIF_DEVICE_UNPAIRED)
 908			workitem.type = WORKITEM_TYPE_UNPAIRED;
 909		break;
 910	default:
 911		logi_dj_recv_queue_unknown_work(djrcv_dev);
 912		return;
 913	}
 914
 915	kfifo_in(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem));
 916	schedule_work(&djrcv_dev->work);
 917}
 918
 919/*
 920 * Some quad/bluetooth keyboards have a builtin touchpad in this case we see
 921 * only 1 paired device with a device_type of REPORT_TYPE_KEYBOARD. For the
 922 * touchpad to work we must also forward mouse input reports to the dj_hiddev
 923 * created for the keyboard (instead of forwarding them to a second paired
 924 * device with a device_type of REPORT_TYPE_MOUSE as we normally would).
 925 *
 926 * On Dinovo receivers the keyboard's touchpad and an optional paired actual
 927 * mouse send separate input reports, INPUT(2) aka STD_MOUSE for the mouse
 928 * and INPUT(5) aka KBD_MOUSE for the keyboard's touchpad.
 929 *
 930 * On MX5x00 receivers (which can also be paired with a Dinovo keyboard)
 931 * INPUT(2) is used for both an optional paired actual mouse and for the
 932 * keyboard's touchpad.
 933 */
 934static const u16 kbd_builtin_touchpad_ids[] = {
 935	0xb309, /* Dinovo Edge */
 936	0xb30c, /* Dinovo Mini */
 937};
 938
 939static void logi_hidpp_dev_conn_notif_equad(struct hid_device *hdev,
 940					    struct hidpp_event *hidpp_report,
 941					    struct dj_workitem *workitem)
 942{
 943	struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
 944	int i, id;
 945
 946	workitem->type = WORKITEM_TYPE_PAIRED;
 947	workitem->device_type = hidpp_report->params[HIDPP_PARAM_DEVICE_INFO] &
 948				HIDPP_DEVICE_TYPE_MASK;
 949	workitem->quad_id_msb = hidpp_report->params[HIDPP_PARAM_EQUAD_MSB];
 950	workitem->quad_id_lsb = hidpp_report->params[HIDPP_PARAM_EQUAD_LSB];
 951	switch (workitem->device_type) {
 952	case REPORT_TYPE_KEYBOARD:
 953		workitem->reports_supported |= STD_KEYBOARD | MULTIMEDIA |
 954					       POWER_KEYS | MEDIA_CENTER |
 955					       HIDPP;
 956		id = (workitem->quad_id_msb << 8) | workitem->quad_id_lsb;
 957		for (i = 0; i < ARRAY_SIZE(kbd_builtin_touchpad_ids); i++) {
 958			if (id == kbd_builtin_touchpad_ids[i]) {
 959				if (djrcv_dev->type == recvr_type_dinovo)
 960					workitem->reports_supported |= KBD_MOUSE;
 961				else
 962					workitem->reports_supported |= STD_MOUSE;
 963				break;
 964			}
 965		}
 966		break;
 967	case REPORT_TYPE_MOUSE:
 968		workitem->reports_supported |= STD_MOUSE | HIDPP;
 969		if (djrcv_dev->type == recvr_type_mouse_only)
 970			workitem->reports_supported |= MULTIMEDIA;
 971		break;
 972	}
 973}
 974
 975static void logi_hidpp_dev_conn_notif_27mhz(struct hid_device *hdev,
 976					    struct hidpp_event *hidpp_report,
 977					    struct dj_workitem *workitem)
 978{
 979	workitem->type = WORKITEM_TYPE_PAIRED;
 980	workitem->quad_id_lsb = hidpp_report->params[HIDPP_PARAM_27MHZ_DEVID];
 981	switch (hidpp_report->device_index) {
 982	case 1: /* Index 1 is always a mouse */
 983	case 2: /* Index 2 is always a mouse */
 984		workitem->device_type = HIDPP_DEVICE_TYPE_MOUSE;
 985		workitem->reports_supported |= STD_MOUSE | HIDPP;
 986		break;
 987	case 3: /* Index 3 is always the keyboard */
 988		if (hidpp_report->params[HIDPP_PARAM_DEVICE_INFO] & HIDPP_27MHZ_SECURE_MASK) {
 989			hid_info(hdev, "Keyboard connection is encrypted\n");
 990		} else {
 991			hid_warn(hdev, "Keyboard events are send over the air in plain-text / unencrypted\n");
 992			hid_warn(hdev, "See: https://gitlab.freedesktop.org/jwrdegoede/logitech-27mhz-keyboard-encryption-setup/\n");
 993		}
 994		fallthrough;
 995	case 4: /* Index 4 is used for an optional separate numpad */
 996		workitem->device_type = HIDPP_DEVICE_TYPE_KEYBOARD;
 997		workitem->reports_supported |= STD_KEYBOARD | MULTIMEDIA |
 998					       POWER_KEYS | HIDPP;
 999		break;
1000	default:
1001		hid_warn(hdev, "%s: unexpected device-index %d", __func__,
1002			 hidpp_report->device_index);
1003	}
1004}
1005
1006static void logi_hidpp_recv_queue_notif(struct hid_device *hdev,
1007					struct hidpp_event *hidpp_report)
1008{
1009	/* We are called from atomic context (tasklet && djrcv->lock held) */
1010	struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
1011	const char *device_type = "UNKNOWN";
1012	struct dj_workitem workitem = {
1013		.type = WORKITEM_TYPE_EMPTY,
1014		.device_index = hidpp_report->device_index,
1015	};
1016
1017	switch (hidpp_report->params[HIDPP_PARAM_PROTO_TYPE]) {
1018	case 0x01:
1019		device_type = "Bluetooth";
1020		/* Bluetooth connect packet contents is the same as (e)QUAD */
1021		logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report, &workitem);
1022		if (!(hidpp_report->params[HIDPP_PARAM_DEVICE_INFO] &
1023						HIDPP_MANUFACTURER_MASK)) {
1024			hid_info(hdev, "Non Logitech device connected on slot %d\n",
1025				 hidpp_report->device_index);
1026			workitem.reports_supported &= ~HIDPP;
1027		}
1028		break;
1029	case 0x02:
1030		device_type = "27 Mhz";
1031		logi_hidpp_dev_conn_notif_27mhz(hdev, hidpp_report, &workitem);
1032		break;
1033	case 0x03:
1034		device_type = "QUAD or eQUAD";
1035		logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report, &workitem);
1036		break;
1037	case 0x04:
1038		device_type = "eQUAD step 4 DJ";
1039		logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report, &workitem);
1040		break;
1041	case 0x05:
1042		device_type = "DFU Lite";
1043		break;
1044	case 0x06:
1045		device_type = "eQUAD step 4 Lite";
1046		logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report, &workitem);
1047		break;
1048	case 0x07:
1049		device_type = "eQUAD step 4 Gaming";
1050		logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report, &workitem);
1051		workitem.reports_supported |= STD_KEYBOARD;
1052		break;
1053	case 0x08:
1054		device_type = "eQUAD step 4 for gamepads";
1055		break;
1056	case 0x0a:
1057		device_type = "eQUAD nano Lite";
1058		logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report, &workitem);
1059		break;
1060	case 0x0c:
1061		device_type = "eQUAD Lightspeed 1";
1062		logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report, &workitem);
1063		workitem.reports_supported |= STD_KEYBOARD;
1064		break;
1065	case 0x0d:
1066		device_type = "eQUAD Lightspeed 1.1";
1067		logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report, &workitem);
1068		workitem.reports_supported |= STD_KEYBOARD;
1069		break;
1070	case 0x0f:
1071	case 0x11:
1072		device_type = "eQUAD Lightspeed 1.2";
1073		logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report, &workitem);
1074		workitem.reports_supported |= STD_KEYBOARD;
1075		break;
1076	}
1077
1078	/* custom receiver device (eg. powerplay) */
1079	if (hidpp_report->device_index == 7) {
1080		workitem.reports_supported |= HIDPP;
1081	}
1082
1083	if (workitem.type == WORKITEM_TYPE_EMPTY) {
1084		hid_warn(hdev,
1085			 "unusable device of type %s (0x%02x) connected on slot %d",
1086			 device_type,
1087			 hidpp_report->params[HIDPP_PARAM_PROTO_TYPE],
1088			 hidpp_report->device_index);
1089		return;
1090	}
1091
1092	hid_info(hdev, "device of type %s (0x%02x) connected on slot %d",
1093		 device_type, hidpp_report->params[HIDPP_PARAM_PROTO_TYPE],
1094		 hidpp_report->device_index);
1095
1096	kfifo_in(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem));
1097	schedule_work(&djrcv_dev->work);
1098}
1099
1100static void logi_dj_recv_forward_null_report(struct dj_receiver_dev *djrcv_dev,
1101					     struct dj_report *dj_report)
1102{
1103	/* We are called from atomic context (tasklet && djrcv->lock held) */
1104	unsigned int i;
1105	u8 reportbuffer[MAX_REPORT_SIZE];
1106	struct dj_device *djdev;
1107
1108	djdev = djrcv_dev->paired_dj_devices[dj_report->device_index];
1109
1110	memset(reportbuffer, 0, sizeof(reportbuffer));
1111
1112	for (i = 0; i < NUMBER_OF_HID_REPORTS; i++) {
1113		if (djdev->reports_supported & (1 << i)) {
1114			reportbuffer[0] = i;
1115			if (hid_input_report(djdev->hdev,
1116					     HID_INPUT_REPORT,
1117					     reportbuffer,
1118					     hid_reportid_size_map[i], 1)) {
1119				dbg_hid("hid_input_report error sending null "
1120					"report\n");
1121			}
1122		}
1123	}
1124}
1125
1126static void logi_dj_recv_forward_dj(struct dj_receiver_dev *djrcv_dev,
1127				    struct dj_report *dj_report)
1128{
1129	/* We are called from atomic context (tasklet && djrcv->lock held) */
1130	struct dj_device *dj_device;
1131
1132	dj_device = djrcv_dev->paired_dj_devices[dj_report->device_index];
1133
1134	if ((dj_report->report_type > ARRAY_SIZE(hid_reportid_size_map) - 1) ||
1135	    (hid_reportid_size_map[dj_report->report_type] == 0)) {
1136		dbg_hid("invalid report type:%x\n", dj_report->report_type);
1137		return;
1138	}
1139
1140	if (hid_input_report(dj_device->hdev,
1141			HID_INPUT_REPORT, &dj_report->report_type,
1142			hid_reportid_size_map[dj_report->report_type], 1)) {
1143		dbg_hid("hid_input_report error\n");
1144	}
1145}
1146
1147static void logi_dj_recv_forward_report(struct dj_device *dj_dev, u8 *data,
1148					int size)
1149{
1150	/* We are called from atomic context (tasklet && djrcv->lock held) */
1151	if (hid_input_report(dj_dev->hdev, HID_INPUT_REPORT, data, size, 1))
1152		dbg_hid("hid_input_report error\n");
1153}
1154
1155static void logi_dj_recv_forward_input_report(struct hid_device *hdev,
1156					      u8 *data, int size)
1157{
1158	struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
1159	struct dj_device *dj_dev;
1160	unsigned long flags;
1161	u8 report = data[0];
1162	int i;
1163
1164	if (report > REPORT_TYPE_RFREPORT_LAST) {
1165		hid_err(hdev, "Unexpected input report number %d\n", report);
1166		return;
1167	}
1168
1169	spin_lock_irqsave(&djrcv_dev->lock, flags);
1170	for (i = 0; i < (DJ_MAX_PAIRED_DEVICES + DJ_DEVICE_INDEX_MIN); i++) {
1171		dj_dev = djrcv_dev->paired_dj_devices[i];
1172		if (dj_dev && (dj_dev->reports_supported & BIT(report))) {
1173			logi_dj_recv_forward_report(dj_dev, data, size);
1174			spin_unlock_irqrestore(&djrcv_dev->lock, flags);
1175			return;
1176		}
1177	}
1178
1179	logi_dj_recv_queue_unknown_work(djrcv_dev);
1180	spin_unlock_irqrestore(&djrcv_dev->lock, flags);
1181
1182	dbg_hid("No dj-devs handling input report number %d\n", report);
1183}
1184
1185static int logi_dj_recv_send_report(struct dj_receiver_dev *djrcv_dev,
1186				    struct dj_report *dj_report)
1187{
1188	struct hid_device *hdev = djrcv_dev->hidpp;
1189	struct hid_report *report;
1190	struct hid_report_enum *output_report_enum;
1191	u8 *data = (u8 *)(&dj_report->device_index);
1192	unsigned int i;
1193
1194	output_report_enum = &hdev->report_enum[HID_OUTPUT_REPORT];
1195	report = output_report_enum->report_id_hash[REPORT_ID_DJ_SHORT];
1196
1197	if (!report) {
1198		hid_err(hdev, "%s: unable to find dj report\n", __func__);
1199		return -ENODEV;
1200	}
1201
1202	for (i = 0; i < DJREPORT_SHORT_LENGTH - 1; i++)
1203		report->field[0]->value[i] = data[i];
1204
1205	hid_hw_request(hdev, report, HID_REQ_SET_REPORT);
1206
1207	return 0;
1208}
1209
1210static int logi_dj_recv_query_hidpp_devices(struct dj_receiver_dev *djrcv_dev)
1211{
1212	static const u8 template[] = {
1213		REPORT_ID_HIDPP_SHORT,
1214		HIDPP_RECEIVER_INDEX,
1215		HIDPP_SET_REGISTER,
1216		HIDPP_REG_CONNECTION_STATE,
1217		HIDPP_FAKE_DEVICE_ARRIVAL,
1218		0x00, 0x00
1219	};
1220	u8 *hidpp_report;
1221	int retval;
1222
1223	hidpp_report = kmemdup(template, sizeof(template), GFP_KERNEL);
1224	if (!hidpp_report)
1225		return -ENOMEM;
1226
1227	retval = hid_hw_raw_request(djrcv_dev->hidpp,
1228				    REPORT_ID_HIDPP_SHORT,
1229				    hidpp_report, sizeof(template),
1230				    HID_OUTPUT_REPORT,
1231				    HID_REQ_SET_REPORT);
1232
1233	kfree(hidpp_report);
1234	return (retval < 0) ? retval : 0;
1235}
1236
1237static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev)
1238{
1239	struct dj_report *dj_report;
1240	int retval;
1241
1242	djrcv_dev->last_query = jiffies;
1243
1244	if (djrcv_dev->type != recvr_type_dj)
1245		return logi_dj_recv_query_hidpp_devices(djrcv_dev);
1246
1247	dj_report = kzalloc(sizeof(struct dj_report), GFP_KERNEL);
1248	if (!dj_report)
1249		return -ENOMEM;
1250	dj_report->report_id = REPORT_ID_DJ_SHORT;
1251	dj_report->device_index = HIDPP_RECEIVER_INDEX;
1252	dj_report->report_type = REPORT_TYPE_CMD_GET_PAIRED_DEVICES;
1253	retval = logi_dj_recv_send_report(djrcv_dev, dj_report);
1254	kfree(dj_report);
1255	return retval;
1256}
1257
1258
1259static int logi_dj_recv_switch_to_dj_mode(struct dj_receiver_dev *djrcv_dev,
1260					  unsigned timeout)
1261{
1262	struct hid_device *hdev = djrcv_dev->hidpp;
1263	struct dj_report *dj_report;
1264	u8 *buf;
1265	int retval = 0;
1266
1267	dj_report = kzalloc(sizeof(struct dj_report), GFP_KERNEL);
1268	if (!dj_report)
1269		return -ENOMEM;
1270
1271	if (djrcv_dev->type == recvr_type_dj) {
1272		dj_report->report_id = REPORT_ID_DJ_SHORT;
1273		dj_report->device_index = HIDPP_RECEIVER_INDEX;
1274		dj_report->report_type = REPORT_TYPE_CMD_SWITCH;
1275		dj_report->report_params[CMD_SWITCH_PARAM_DEVBITFIELD] = 0x3F;
1276		dj_report->report_params[CMD_SWITCH_PARAM_TIMEOUT_SECONDS] =
1277								(u8)timeout;
1278
1279		retval = logi_dj_recv_send_report(djrcv_dev, dj_report);
1280
1281		/*
1282		 * Ugly sleep to work around a USB 3.0 bug when the receiver is
1283		 * still processing the "switch-to-dj" command while we send an
1284		 * other command.
1285		 * 50 msec should gives enough time to the receiver to be ready.
1286		 */
1287		msleep(50);
1288	}
1289
1290	/*
1291	 * Magical bits to set up hidpp notifications when the dj devices
1292	 * are connected/disconnected.
1293	 *
1294	 * We can reuse dj_report because HIDPP_REPORT_SHORT_LENGTH is smaller
1295	 * than DJREPORT_SHORT_LENGTH.
1296	 */
1297	buf = (u8 *)dj_report;
1298
1299	memset(buf, 0, HIDPP_REPORT_SHORT_LENGTH);
1300
1301	buf[0] = REPORT_ID_HIDPP_SHORT;
1302	buf[1] = HIDPP_RECEIVER_INDEX;
1303	buf[2] = 0x80;
1304	buf[3] = 0x00;
1305	buf[4] = 0x00;
1306	buf[5] = 0x09;
1307	buf[6] = 0x00;
1308
1309	hid_hw_raw_request(hdev, REPORT_ID_HIDPP_SHORT, buf,
1310			HIDPP_REPORT_SHORT_LENGTH, HID_OUTPUT_REPORT,
1311			HID_REQ_SET_REPORT);
1312
1313	kfree(dj_report);
1314	return retval;
1315}
1316
1317
1318static int logi_dj_ll_open(struct hid_device *hid)
1319{
1320	dbg_hid("%s: %s\n", __func__, hid->phys);
1321	return 0;
1322
1323}
1324
1325static void logi_dj_ll_close(struct hid_device *hid)
1326{
1327	dbg_hid("%s: %s\n", __func__, hid->phys);
1328}
1329
1330/*
1331 * Register 0xB5 is "pairing information". It is solely intended for the
1332 * receiver, so do not overwrite the device index.
1333 */
1334static u8 unifying_pairing_query[]  = { REPORT_ID_HIDPP_SHORT,
1335					HIDPP_RECEIVER_INDEX,
1336					HIDPP_GET_LONG_REGISTER,
1337					HIDPP_REG_PAIRING_INFORMATION };
1338static u8 unifying_pairing_answer[] = { REPORT_ID_HIDPP_LONG,
1339					HIDPP_RECEIVER_INDEX,
1340					HIDPP_GET_LONG_REGISTER,
1341					HIDPP_REG_PAIRING_INFORMATION };
1342
1343static int logi_dj_ll_raw_request(struct hid_device *hid,
1344				  unsigned char reportnum, __u8 *buf,
1345				  size_t count, unsigned char report_type,
1346				  int reqtype)
1347{
1348	struct dj_device *djdev = hid->driver_data;
1349	struct dj_receiver_dev *djrcv_dev = djdev->dj_receiver_dev;
1350	u8 *out_buf;
1351	int ret;
1352
1353	if ((buf[0] == REPORT_ID_HIDPP_SHORT) ||
1354	    (buf[0] == REPORT_ID_HIDPP_LONG) ||
1355	    (buf[0] == REPORT_ID_HIDPP_VERY_LONG)) {
1356		if (count < 2)
1357			return -EINVAL;
1358
1359		/* special case where we should not overwrite
1360		 * the device_index */
1361		if (count == 7 && !memcmp(buf, unifying_pairing_query,
1362					  sizeof(unifying_pairing_query)))
1363			buf[4] = (buf[4] & 0xf0) | (djdev->device_index - 1);
1364		else
1365			buf[1] = djdev->device_index;
1366		return hid_hw_raw_request(djrcv_dev->hidpp, reportnum, buf,
1367				count, report_type, reqtype);
1368	}
1369
1370	if (buf[0] != REPORT_TYPE_LEDS)
1371		return -EINVAL;
1372
1373	if (djrcv_dev->type != recvr_type_dj && count >= 2) {
1374		if (!djrcv_dev->keyboard) {
1375			hid_warn(hid, "Received REPORT_TYPE_LEDS request before the keyboard interface was enumerated\n");
1376			return 0;
1377		}
1378		/* usbhid overrides the report ID and ignores the first byte */
1379		return hid_hw_raw_request(djrcv_dev->keyboard, 0, buf, count,
1380					  report_type, reqtype);
1381	}
1382
1383	out_buf = kzalloc(DJREPORT_SHORT_LENGTH, GFP_ATOMIC);
1384	if (!out_buf)
1385		return -ENOMEM;
1386
1387	if (count > DJREPORT_SHORT_LENGTH - 2)
1388		count = DJREPORT_SHORT_LENGTH - 2;
1389
1390	out_buf[0] = REPORT_ID_DJ_SHORT;
1391	out_buf[1] = djdev->device_index;
1392	memcpy(out_buf + 2, buf, count);
1393
1394	ret = hid_hw_raw_request(djrcv_dev->hidpp, out_buf[0], out_buf,
1395		DJREPORT_SHORT_LENGTH, report_type, reqtype);
1396
1397	kfree(out_buf);
1398	return ret;
1399}
1400
1401static void rdcat(char *rdesc, unsigned int *rsize, const char *data, unsigned int size)
1402{
1403	memcpy(rdesc + *rsize, data, size);
1404	*rsize += size;
1405}
1406
1407static int logi_dj_ll_parse(struct hid_device *hid)
1408{
1409	struct dj_device *djdev = hid->driver_data;
1410	unsigned int rsize = 0;
1411	char *rdesc;
1412	int retval;
1413
1414	dbg_hid("%s\n", __func__);
1415
1416	djdev->hdev->version = 0x0111;
1417	djdev->hdev->country = 0x00;
1418
1419	rdesc = kmalloc(MAX_RDESC_SIZE, GFP_KERNEL);
1420	if (!rdesc)
1421		return -ENOMEM;
1422
1423	if (djdev->reports_supported & STD_KEYBOARD) {
1424		dbg_hid("%s: sending a kbd descriptor, reports_supported: %llx\n",
1425			__func__, djdev->reports_supported);
1426		rdcat(rdesc, &rsize, kbd_descriptor, sizeof(kbd_descriptor));
1427	}
1428
1429	if (djdev->reports_supported & STD_MOUSE) {
1430		dbg_hid("%s: sending a mouse descriptor, reports_supported: %llx\n",
1431			__func__, djdev->reports_supported);
1432		if (djdev->dj_receiver_dev->type == recvr_type_gaming_hidpp ||
1433		    djdev->dj_receiver_dev->type == recvr_type_mouse_only)
1434			rdcat(rdesc, &rsize, mse_high_res_descriptor,
1435			      sizeof(mse_high_res_descriptor));
1436		else if (djdev->dj_receiver_dev->type == recvr_type_27mhz)
1437			rdcat(rdesc, &rsize, mse_27mhz_descriptor,
1438			      sizeof(mse_27mhz_descriptor));
1439		else if (recvr_type_is_bluetooth(djdev->dj_receiver_dev->type))
1440			rdcat(rdesc, &rsize, mse_bluetooth_descriptor,
1441			      sizeof(mse_bluetooth_descriptor));
1442		else
1443			rdcat(rdesc, &rsize, mse_descriptor,
1444			      sizeof(mse_descriptor));
1445	}
1446
1447	if (djdev->reports_supported & KBD_MOUSE) {
1448		dbg_hid("%s: sending a kbd-mouse descriptor, reports_supported: %llx\n",
1449			__func__, djdev->reports_supported);
1450		rdcat(rdesc, &rsize, mse5_bluetooth_descriptor,
1451		      sizeof(mse5_bluetooth_descriptor));
1452	}
1453
1454	if (djdev->reports_supported & MULTIMEDIA) {
1455		dbg_hid("%s: sending a multimedia report descriptor: %llx\n",
1456			__func__, djdev->reports_supported);
1457		rdcat(rdesc, &rsize, consumer_descriptor, sizeof(consumer_descriptor));
1458	}
1459
1460	if (djdev->reports_supported & POWER_KEYS) {
1461		dbg_hid("%s: sending a power keys report descriptor: %llx\n",
1462			__func__, djdev->reports_supported);
1463		rdcat(rdesc, &rsize, syscontrol_descriptor, sizeof(syscontrol_descriptor));
1464	}
1465
1466	if (djdev->reports_supported & MEDIA_CENTER) {
1467		dbg_hid("%s: sending a media center report descriptor: %llx\n",
1468			__func__, djdev->reports_supported);
1469		rdcat(rdesc, &rsize, media_descriptor, sizeof(media_descriptor));
1470	}
1471
1472	if (djdev->reports_supported & KBD_LEDS) {
1473		dbg_hid("%s: need to send kbd leds report descriptor: %llx\n",
1474			__func__, djdev->reports_supported);
1475	}
1476
1477	if (djdev->reports_supported & HIDPP) {
1478		dbg_hid("%s: sending a HID++ descriptor, reports_supported: %llx\n",
1479			__func__, djdev->reports_supported);
1480		rdcat(rdesc, &rsize, hidpp_descriptor,
1481		      sizeof(hidpp_descriptor));
1482	}
1483
1484	retval = hid_parse_report(hid, rdesc, rsize);
1485	kfree(rdesc);
1486
1487	return retval;
1488}
1489
1490static int logi_dj_ll_start(struct hid_device *hid)
1491{
1492	dbg_hid("%s\n", __func__);
1493	return 0;
1494}
1495
1496static void logi_dj_ll_stop(struct hid_device *hid)
1497{
1498	dbg_hid("%s\n", __func__);
1499}
1500
1501static bool logi_dj_ll_may_wakeup(struct hid_device *hid)
1502{
1503	struct dj_device *djdev = hid->driver_data;
1504	struct dj_receiver_dev *djrcv_dev = djdev->dj_receiver_dev;
1505
1506	return hid_hw_may_wakeup(djrcv_dev->hidpp);
1507}
1508
1509static struct hid_ll_driver logi_dj_ll_driver = {
1510	.parse = logi_dj_ll_parse,
1511	.start = logi_dj_ll_start,
1512	.stop = logi_dj_ll_stop,
1513	.open = logi_dj_ll_open,
1514	.close = logi_dj_ll_close,
1515	.raw_request = logi_dj_ll_raw_request,
1516	.may_wakeup = logi_dj_ll_may_wakeup,
1517};
1518
1519static int logi_dj_dj_event(struct hid_device *hdev,
1520			     struct hid_report *report, u8 *data,
1521			     int size)
1522{
1523	struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
1524	struct dj_report *dj_report = (struct dj_report *) data;
1525	unsigned long flags;
1526
1527	/*
1528	 * Here we receive all data coming from iface 2, there are 3 cases:
1529	 *
1530	 * 1) Data is intended for this driver i. e. data contains arrival,
1531	 * departure, etc notifications, in which case we queue them for delayed
1532	 * processing by the work queue. We return 1 to hid-core as no further
1533	 * processing is required from it.
1534	 *
1535	 * 2) Data informs a connection change, if the change means rf link
1536	 * loss, then we must send a null report to the upper layer to discard
1537	 * potentially pressed keys that may be repeated forever by the input
1538	 * layer. Return 1 to hid-core as no further processing is required.
1539	 *
1540	 * 3) Data is an actual input event from a paired DJ device in which
1541	 * case we forward it to the correct hid device (via hid_input_report()
1542	 * ) and return 1 so hid-core does not anything else with it.
1543	 */
1544
1545	if ((dj_report->device_index < DJ_DEVICE_INDEX_MIN) ||
1546	    (dj_report->device_index > DJ_DEVICE_INDEX_MAX)) {
1547		/*
1548		 * Device index is wrong, bail out.
1549		 * This driver can ignore safely the receiver notifications,
1550		 * so ignore those reports too.
1551		 */
1552		if (dj_report->device_index != DJ_RECEIVER_INDEX)
1553			hid_err(hdev, "%s: invalid device index:%d\n",
1554				__func__, dj_report->device_index);
1555		return false;
1556	}
1557
1558	spin_lock_irqsave(&djrcv_dev->lock, flags);
1559
1560	if (!djrcv_dev->paired_dj_devices[dj_report->device_index]) {
1561		/* received an event for an unknown device, bail out */
1562		logi_dj_recv_queue_notification(djrcv_dev, dj_report);
1563		goto out;
1564	}
1565
1566	switch (dj_report->report_type) {
1567	case REPORT_TYPE_NOTIF_DEVICE_PAIRED:
1568		/* pairing notifications are handled above the switch */
1569		break;
1570	case REPORT_TYPE_NOTIF_DEVICE_UNPAIRED:
1571		logi_dj_recv_queue_notification(djrcv_dev, dj_report);
1572		break;
1573	case REPORT_TYPE_NOTIF_CONNECTION_STATUS:
1574		if (dj_report->report_params[CONNECTION_STATUS_PARAM_STATUS] ==
1575		    STATUS_LINKLOSS) {
1576			logi_dj_recv_forward_null_report(djrcv_dev, dj_report);
1577		}
1578		break;
1579	default:
1580		logi_dj_recv_forward_dj(djrcv_dev, dj_report);
1581	}
1582
1583out:
1584	spin_unlock_irqrestore(&djrcv_dev->lock, flags);
1585
1586	return true;
1587}
1588
1589static int logi_dj_hidpp_event(struct hid_device *hdev,
1590			     struct hid_report *report, u8 *data,
1591			     int size)
1592{
1593	struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
1594	struct hidpp_event *hidpp_report = (struct hidpp_event *) data;
1595	struct dj_device *dj_dev;
1596	unsigned long flags;
1597	u8 device_index = hidpp_report->device_index;
1598
1599	if (device_index == HIDPP_RECEIVER_INDEX) {
1600		/* special case were the device wants to know its unifying
1601		 * name */
1602		if (size == HIDPP_REPORT_LONG_LENGTH &&
1603		    !memcmp(data, unifying_pairing_answer,
1604			    sizeof(unifying_pairing_answer)))
1605			device_index = (data[4] & 0x0F) + 1;
1606		else
1607			return false;
1608	}
1609
1610	/*
1611	 * Data is from the HID++ collection, in this case, we forward the
1612	 * data to the corresponding child dj device and return 0 to hid-core
1613	 * so he data also goes to the hidraw device of the receiver. This
1614	 * allows a user space application to implement the full HID++ routing
1615	 * via the receiver.
1616	 */
1617
1618	if ((device_index < DJ_DEVICE_INDEX_MIN) ||
1619	    (device_index > DJ_DEVICE_INDEX_MAX)) {
1620		/*
1621		 * Device index is wrong, bail out.
1622		 * This driver can ignore safely the receiver notifications,
1623		 * so ignore those reports too.
1624		 */
1625		hid_err(hdev, "%s: invalid device index:%d\n", __func__,
1626			hidpp_report->device_index);
1627		return false;
1628	}
1629
1630	spin_lock_irqsave(&djrcv_dev->lock, flags);
1631
1632	dj_dev = djrcv_dev->paired_dj_devices[device_index];
1633
1634	/*
1635	 * With 27 MHz receivers, we do not get an explicit unpair event,
1636	 * remove the old device if the user has paired a *different* device.
1637	 */
1638	if (djrcv_dev->type == recvr_type_27mhz && dj_dev &&
1639	    hidpp_report->sub_id == REPORT_TYPE_NOTIF_DEVICE_CONNECTED &&
1640	    hidpp_report->params[HIDPP_PARAM_PROTO_TYPE] == 0x02 &&
1641	    hidpp_report->params[HIDPP_PARAM_27MHZ_DEVID] !=
1642						dj_dev->hdev->product) {
1643		struct dj_workitem workitem = {
1644			.device_index = hidpp_report->device_index,
1645			.type = WORKITEM_TYPE_UNPAIRED,
1646		};
1647		kfifo_in(&djrcv_dev->notif_fifo, &workitem, sizeof(workitem));
1648		/* logi_hidpp_recv_queue_notif will queue the work */
1649		dj_dev = NULL;
1650	}
1651
1652	if (dj_dev) {
1653		logi_dj_recv_forward_report(dj_dev, data, size);
1654	} else {
1655		if (hidpp_report->sub_id == REPORT_TYPE_NOTIF_DEVICE_CONNECTED)
1656			logi_hidpp_recv_queue_notif(hdev, hidpp_report);
1657		else
1658			logi_dj_recv_queue_unknown_work(djrcv_dev);
1659	}
1660
1661	spin_unlock_irqrestore(&djrcv_dev->lock, flags);
1662
1663	return false;
1664}
1665
1666static int logi_dj_raw_event(struct hid_device *hdev,
1667			     struct hid_report *report, u8 *data,
1668			     int size)
1669{
1670	struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
1671	dbg_hid("%s, size:%d\n", __func__, size);
1672
1673	if (!djrcv_dev)
1674		return 0;
1675
1676	if (!hdev->report_enum[HID_INPUT_REPORT].numbered) {
1677
1678		if (djrcv_dev->unnumbered_application == HID_GD_KEYBOARD) {
1679			/*
1680			 * For the keyboard, we can reuse the same report by
1681			 * using the second byte which is constant in the USB
1682			 * HID report descriptor.
1683			 */
1684			data[1] = data[0];
1685			data[0] = REPORT_TYPE_KEYBOARD;
1686
1687			logi_dj_recv_forward_input_report(hdev, data, size);
1688
1689			/* restore previous state */
1690			data[0] = data[1];
1691			data[1] = 0;
1692		}
1693		/*
1694		 * Mouse-only receivers send unnumbered mouse data. The 27 MHz
1695		 * receiver uses 6 byte packets, the nano receiver 8 bytes.
1696		 */
1697		if (djrcv_dev->unnumbered_application == HID_GD_MOUSE &&
1698		    size <= 8) {
1699			u8 mouse_report[9];
1700
1701			/* Prepend report id */
1702			mouse_report[0] = REPORT_TYPE_MOUSE;
1703			memcpy(mouse_report + 1, data, size);
1704			logi_dj_recv_forward_input_report(hdev, mouse_report,
1705							  size + 1);
1706		}
1707
1708		return false;
1709	}
1710
1711	switch (data[0]) {
1712	case REPORT_ID_DJ_SHORT:
1713		if (size != DJREPORT_SHORT_LENGTH) {
1714			hid_err(hdev, "Short DJ report bad size (%d)", size);
1715			return false;
1716		}
1717		return logi_dj_dj_event(hdev, report, data, size);
1718	case REPORT_ID_DJ_LONG:
1719		if (size != DJREPORT_LONG_LENGTH) {
1720			hid_err(hdev, "Long DJ report bad size (%d)", size);
1721			return false;
1722		}
1723		return logi_dj_dj_event(hdev, report, data, size);
1724	case REPORT_ID_HIDPP_SHORT:
1725		if (size != HIDPP_REPORT_SHORT_LENGTH) {
1726			hid_err(hdev, "Short HID++ report bad size (%d)", size);
1727			return false;
1728		}
1729		return logi_dj_hidpp_event(hdev, report, data, size);
1730	case REPORT_ID_HIDPP_LONG:
1731		if (size != HIDPP_REPORT_LONG_LENGTH) {
1732			hid_err(hdev, "Long HID++ report bad size (%d)", size);
1733			return false;
1734		}
1735		return logi_dj_hidpp_event(hdev, report, data, size);
1736	}
1737
1738	logi_dj_recv_forward_input_report(hdev, data, size);
1739
1740	return false;
1741}
1742
1743static int logi_dj_probe(struct hid_device *hdev,
1744			 const struct hid_device_id *id)
1745{
1746	struct hid_report_enum *rep_enum;
1747	struct hid_report *rep;
1748	struct dj_receiver_dev *djrcv_dev;
1749	struct usb_interface *intf;
1750	unsigned int no_dj_interfaces = 0;
1751	bool has_hidpp = false;
1752	unsigned long flags;
1753	int retval;
1754
1755	/*
1756	 * Call to usbhid to fetch the HID descriptors of the current
1757	 * interface subsequently call to the hid/hid-core to parse the
1758	 * fetched descriptors.
1759	 */
1760	retval = hid_parse(hdev);
1761	if (retval) {
1762		hid_err(hdev, "%s: parse failed\n", __func__);
1763		return retval;
1764	}
1765
1766	/*
1767	 * Some KVMs add an extra interface for e.g. mouse emulation. If we
1768	 * treat these as logitech-dj interfaces then this causes input events
1769	 * reported through this extra interface to not be reported correctly.
1770	 * To avoid this, we treat these as generic-hid devices.
1771	 */
1772	switch (id->driver_data) {
1773	case recvr_type_dj:		no_dj_interfaces = 3; break;
1774	case recvr_type_hidpp:		no_dj_interfaces = 2; break;
1775	case recvr_type_gaming_hidpp:	no_dj_interfaces = 3; break;
1776	case recvr_type_mouse_only:	no_dj_interfaces = 2; break;
1777	case recvr_type_27mhz:		no_dj_interfaces = 2; break;
1778	case recvr_type_bluetooth:	no_dj_interfaces = 2; break;
1779	case recvr_type_dinovo:		no_dj_interfaces = 2; break;
1780	}
1781	if (hid_is_usb(hdev)) {
1782		intf = to_usb_interface(hdev->dev.parent);
1783		if (intf && intf->altsetting->desc.bInterfaceNumber >=
1784							no_dj_interfaces) {
1785			hdev->quirks |= HID_QUIRK_INPUT_PER_APP;
1786			return hid_hw_start(hdev, HID_CONNECT_DEFAULT);
1787		}
1788	}
1789
1790	rep_enum = &hdev->report_enum[HID_INPUT_REPORT];
1791
1792	/* no input reports, bail out */
1793	if (list_empty(&rep_enum->report_list))
1794		return -ENODEV;
1795
1796	/*
1797	 * Check for the HID++ application.
1798	 * Note: we should theoretically check for HID++ and DJ
1799	 * collections, but this will do.
1800	 */
1801	list_for_each_entry(rep, &rep_enum->report_list, list) {
1802		if (rep->application == 0xff000001)
1803			has_hidpp = true;
1804	}
1805
1806	/*
1807	 * Ignore interfaces without DJ/HID++ collection, they will not carry
1808	 * any data, dont create any hid_device for them.
1809	 */
1810	if (!has_hidpp && id->driver_data == recvr_type_dj)
1811		return -ENODEV;
1812
1813	/* get the current application attached to the node */
1814	rep = list_first_entry(&rep_enum->report_list, struct hid_report, list);
1815	djrcv_dev = dj_get_receiver_dev(hdev, id->driver_data,
1816					rep->application, has_hidpp);
1817	if (!djrcv_dev) {
1818		hid_err(hdev, "%s: dj_get_receiver_dev failed\n", __func__);
1819		return -ENOMEM;
1820	}
1821
1822	if (!rep_enum->numbered)
1823		djrcv_dev->unnumbered_application = rep->application;
1824
1825	/* Starts the usb device and connects to upper interfaces hiddev and
1826	 * hidraw */
1827	retval = hid_hw_start(hdev, HID_CONNECT_HIDRAW|HID_CONNECT_HIDDEV);
1828	if (retval) {
1829		hid_err(hdev, "%s: hid_hw_start returned error\n", __func__);
1830		goto hid_hw_start_fail;
1831	}
1832
1833	if (has_hidpp) {
1834		retval = logi_dj_recv_switch_to_dj_mode(djrcv_dev, 0);
1835		if (retval < 0) {
1836			hid_err(hdev, "%s: logi_dj_recv_switch_to_dj_mode returned error:%d\n",
1837				__func__, retval);
1838			goto switch_to_dj_mode_fail;
1839		}
1840	}
1841
1842	/* This is enabling the polling urb on the IN endpoint */
1843	retval = hid_hw_open(hdev);
1844	if (retval < 0) {
1845		hid_err(hdev, "%s: hid_hw_open returned error:%d\n",
1846			__func__, retval);
1847		goto llopen_failed;
1848	}
1849
1850	/* Allow incoming packets to arrive: */
1851	hid_device_io_start(hdev);
1852
1853	if (has_hidpp) {
1854		spin_lock_irqsave(&djrcv_dev->lock, flags);
1855		djrcv_dev->ready = true;
1856		spin_unlock_irqrestore(&djrcv_dev->lock, flags);
1857		retval = logi_dj_recv_query_paired_devices(djrcv_dev);
1858		if (retval < 0) {
1859			hid_err(hdev, "%s: logi_dj_recv_query_paired_devices error:%d\n",
1860				__func__, retval);
1861			/*
1862			 * This can happen with a KVM, let the probe succeed,
1863			 * logi_dj_recv_queue_unknown_work will retry later.
1864			 */
1865		}
1866	}
1867
1868	return 0;
1869
1870llopen_failed:
1871switch_to_dj_mode_fail:
1872	hid_hw_stop(hdev);
1873
1874hid_hw_start_fail:
1875	dj_put_receiver_dev(hdev);
1876	return retval;
1877}
1878
1879#ifdef CONFIG_PM
1880static int logi_dj_reset_resume(struct hid_device *hdev)
1881{
1882	int retval;
1883	struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
1884
1885	if (!djrcv_dev || djrcv_dev->hidpp != hdev)
1886		return 0;
1887
1888	retval = logi_dj_recv_switch_to_dj_mode(djrcv_dev, 0);
1889	if (retval < 0) {
1890		hid_err(hdev, "%s: logi_dj_recv_switch_to_dj_mode returned error:%d\n",
1891			__func__, retval);
1892	}
1893
1894	return 0;
1895}
1896#endif
1897
1898static void logi_dj_remove(struct hid_device *hdev)
1899{
1900	struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
1901	struct dj_device *dj_dev;
1902	unsigned long flags;
1903	int i;
1904
1905	dbg_hid("%s\n", __func__);
1906
1907	if (!djrcv_dev)
1908		return hid_hw_stop(hdev);
1909
1910	/*
1911	 * This ensures that if the work gets requeued from another
1912	 * interface of the same receiver it will be a no-op.
1913	 */
1914	spin_lock_irqsave(&djrcv_dev->lock, flags);
1915	djrcv_dev->ready = false;
1916	spin_unlock_irqrestore(&djrcv_dev->lock, flags);
1917
1918	cancel_work_sync(&djrcv_dev->work);
1919
1920	hid_hw_close(hdev);
1921	hid_hw_stop(hdev);
1922
1923	/*
1924	 * For proper operation we need access to all interfaces, so we destroy
1925	 * the paired devices when we're unbound from any interface.
1926	 *
1927	 * Note we may still be bound to other interfaces, sharing the same
1928	 * djrcv_dev, so we need locking here.
1929	 */
1930	for (i = 0; i < (DJ_MAX_PAIRED_DEVICES + DJ_DEVICE_INDEX_MIN); i++) {
1931		spin_lock_irqsave(&djrcv_dev->lock, flags);
1932		dj_dev = djrcv_dev->paired_dj_devices[i];
1933		djrcv_dev->paired_dj_devices[i] = NULL;
1934		spin_unlock_irqrestore(&djrcv_dev->lock, flags);
1935		if (dj_dev != NULL) {
1936			hid_destroy_device(dj_dev->hdev);
1937			kfree(dj_dev);
1938		}
1939	}
1940
1941	dj_put_receiver_dev(hdev);
1942}
1943
1944static const struct hid_device_id logi_dj_receivers[] = {
1945	{ /* Logitech unifying receiver (0xc52b) */
1946	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1947		USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER),
1948	 .driver_data = recvr_type_dj},
1949	{ /* Logitech unifying receiver (0xc532) */
1950	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1951		USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER_2),
1952	 .driver_data = recvr_type_dj},
1953
1954	{ /* Logitech Nano mouse only receiver (0xc52f) */
1955	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1956			 USB_DEVICE_ID_LOGITECH_NANO_RECEIVER),
1957	 .driver_data = recvr_type_mouse_only},
1958	{ /* Logitech Nano (non DJ) receiver (0xc534) */
1959	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1960			 USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_2),
1961	 .driver_data = recvr_type_hidpp},
1962
1963	{ /* Logitech G700(s) receiver (0xc531) */
1964	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1965			 USB_DEVICE_ID_LOGITECH_G700_RECEIVER),
1966	 .driver_data = recvr_type_gaming_hidpp},
1967	{ /* Logitech G602 receiver (0xc537) */
1968	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1969		0xc537),
1970	 .driver_data = recvr_type_gaming_hidpp},
1971	{ /* Logitech lightspeed receiver (0xc539) */
1972	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1973		USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_LIGHTSPEED_1),
1974	 .driver_data = recvr_type_gaming_hidpp},
1975	{ /* Logitech powerplay receiver (0xc53a) */
1976	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1977		USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_POWERPLAY),
1978	 .driver_data = recvr_type_gaming_hidpp},
1979	{ /* Logitech lightspeed receiver (0xc53f) */
1980	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1981		USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_LIGHTSPEED_1_1),
1982	 .driver_data = recvr_type_gaming_hidpp},
1983
1984	{ /* Logitech 27 MHz HID++ 1.0 receiver (0xc513) */
1985	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER),
1986	 .driver_data = recvr_type_27mhz},
 
 
 
 
1987	{ /* Logitech 27 MHz HID++ 1.0 receiver (0xc517) */
1988	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1989		USB_DEVICE_ID_S510_RECEIVER_2),
1990	 .driver_data = recvr_type_27mhz},
1991	{ /* Logitech 27 MHz HID++ 1.0 mouse-only receiver (0xc51b) */
1992	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1993		USB_DEVICE_ID_LOGITECH_27MHZ_MOUSE_RECEIVER),
1994	 .driver_data = recvr_type_27mhz},
1995
1996	{ /* Logitech MX5000 HID++ / bluetooth receiver keyboard intf. (0xc70e) */
1997	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
1998		USB_DEVICE_ID_MX5000_RECEIVER_KBD_DEV),
1999	 .driver_data = recvr_type_bluetooth},
2000	{ /* Logitech MX5000 HID++ / bluetooth receiver mouse intf. (0xc70a) */
2001	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
2002		USB_DEVICE_ID_MX5000_RECEIVER_MOUSE_DEV),
2003	 .driver_data = recvr_type_bluetooth},
2004	{ /* Logitech MX5500 HID++ / bluetooth receiver keyboard intf. (0xc71b) */
2005	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
2006		USB_DEVICE_ID_MX5500_RECEIVER_KBD_DEV),
2007	 .driver_data = recvr_type_bluetooth},
2008	{ /* Logitech MX5500 HID++ / bluetooth receiver mouse intf. (0xc71c) */
2009	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
2010		USB_DEVICE_ID_MX5500_RECEIVER_MOUSE_DEV),
2011	 .driver_data = recvr_type_bluetooth},
2012
2013	{ /* Logitech Dinovo Edge HID++ / bluetooth receiver keyboard intf. (0xc713) */
2014	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
2015		USB_DEVICE_ID_DINOVO_EDGE_RECEIVER_KBD_DEV),
2016	 .driver_data = recvr_type_dinovo},
2017	{ /* Logitech Dinovo Edge HID++ / bluetooth receiver mouse intf. (0xc714) */
2018	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
2019		USB_DEVICE_ID_DINOVO_EDGE_RECEIVER_MOUSE_DEV),
2020	 .driver_data = recvr_type_dinovo},
2021	{ /* Logitech DiNovo Mini HID++ / bluetooth receiver mouse intf. (0xc71e) */
2022	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
2023		USB_DEVICE_ID_DINOVO_MINI_RECEIVER_KBD_DEV),
2024	 .driver_data = recvr_type_dinovo},
2025	{ /* Logitech DiNovo Mini HID++ / bluetooth receiver keyboard intf. (0xc71f) */
2026	  HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
2027		USB_DEVICE_ID_DINOVO_MINI_RECEIVER_MOUSE_DEV),
2028	 .driver_data = recvr_type_dinovo},
2029	{}
2030};
2031
2032MODULE_DEVICE_TABLE(hid, logi_dj_receivers);
2033
2034static struct hid_driver logi_djreceiver_driver = {
2035	.name = "logitech-djreceiver",
2036	.id_table = logi_dj_receivers,
2037	.probe = logi_dj_probe,
2038	.remove = logi_dj_remove,
2039	.raw_event = logi_dj_raw_event,
2040#ifdef CONFIG_PM
2041	.reset_resume = logi_dj_reset_resume,
2042#endif
2043};
2044
2045module_hid_driver(logi_djreceiver_driver);
2046
2047MODULE_LICENSE("GPL");
2048MODULE_AUTHOR("Logitech");
2049MODULE_AUTHOR("Nestor Lopez Casado");
2050MODULE_AUTHOR("nlopezcasad@logitech.com");