linux/drivers/hid/hid-logitech-dj.c
<<
>>
Prefs
   1/*
   2 *  HID driver for Logitech Unifying receivers
   3 *
   4 *  Copyright (c) 2011 Logitech
   5 */
   6
   7/*
   8 * This program is free software; you can redistribute it and/or modify
   9 * it under the terms of the GNU General Public License version 2 as
  10 * published by the Free Software Foundation.
  11
  12 *
  13 * This program is distributed in the hope that it will be useful,
  14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16 * GNU General Public License for more details.
  17 *
  18 * You should have received a copy of the GNU General Public License
  19 * along with this program; if not, write to the Free Software
  20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  21 *
  22 */
  23
  24
  25#include <linux/device.h>
  26#include <linux/hid.h>
  27#include <linux/module.h>
  28#include <linux/usb.h>
  29#include <asm/unaligned.h>
  30#include "usbhid/usbhid.h"
  31#include "hid-ids.h"
  32#include "hid-logitech-dj.h"
  33
  34/* Keyboard descriptor (1) */
  35static const char kbd_descriptor[] = {
  36        0x05, 0x01,             /* USAGE_PAGE (generic Desktop)     */
  37        0x09, 0x06,             /* USAGE (Keyboard)         */
  38        0xA1, 0x01,             /* COLLECTION (Application)     */
  39        0x85, 0x01,             /* REPORT_ID (1)            */
  40        0x95, 0x08,             /*   REPORT_COUNT (8)           */
  41        0x75, 0x01,             /*   REPORT_SIZE (1)            */
  42        0x15, 0x00,             /*   LOGICAL_MINIMUM (0)        */
  43        0x25, 0x01,             /*   LOGICAL_MAXIMUM (1)        */
  44        0x05, 0x07,             /*   USAGE_PAGE (Keyboard)      */
  45        0x19, 0xE0,             /*   USAGE_MINIMUM (Left Control)   */
  46        0x29, 0xE7,             /*   USAGE_MAXIMUM (Right GUI)      */
  47        0x81, 0x02,             /*   INPUT (Data,Var,Abs)       */
  48        0x95, 0x05,             /*   REPORT COUNT (5)           */
  49        0x05, 0x08,             /*   USAGE PAGE (LED page)      */
  50        0x19, 0x01,             /*   USAGE MINIMUM (1)          */
  51        0x29, 0x05,             /*   USAGE MAXIMUM (5)          */
  52        0x91, 0x02,             /*   OUTPUT (Data, Variable, Absolute)  */
  53        0x95, 0x01,             /*   REPORT COUNT (1)           */
  54        0x75, 0x03,             /*   REPORT SIZE (3)            */
  55        0x91, 0x01,             /*   OUTPUT (Constant)          */
  56        0x95, 0x06,             /*   REPORT_COUNT (6)           */
  57        0x75, 0x08,             /*   REPORT_SIZE (8)            */
  58        0x15, 0x00,             /*   LOGICAL_MINIMUM (0)        */
  59        0x26, 0xFF, 0x00,       /*   LOGICAL_MAXIMUM (255)      */
  60        0x05, 0x07,             /*   USAGE_PAGE (Keyboard)      */
  61        0x19, 0x00,             /*   USAGE_MINIMUM (no event)       */
  62        0x2A, 0xFF, 0x00,       /*   USAGE_MAXIMUM (reserved)       */
  63        0x81, 0x00,             /*   INPUT (Data,Ary,Abs)       */
  64        0xC0
  65};
  66
  67/* Mouse descriptor (2)     */
  68static const char mse_descriptor[] = {
  69        0x05, 0x01,             /*  USAGE_PAGE (Generic Desktop)        */
  70        0x09, 0x02,             /*  USAGE (Mouse)                       */
  71        0xA1, 0x01,             /*  COLLECTION (Application)            */
  72        0x85, 0x02,             /*    REPORT_ID = 2                     */
  73        0x09, 0x01,             /*    USAGE (pointer)                   */
  74        0xA1, 0x00,             /*    COLLECTION (physical)             */
  75        0x05, 0x09,             /*      USAGE_PAGE (buttons)            */
  76        0x19, 0x01,             /*      USAGE_MIN (1)                   */
  77        0x29, 0x10,             /*      USAGE_MAX (16)                  */
  78        0x15, 0x00,             /*      LOGICAL_MIN (0)                 */
  79        0x25, 0x01,             /*      LOGICAL_MAX (1)                 */
  80        0x95, 0x10,             /*      REPORT_COUNT (16)               */
  81        0x75, 0x01,             /*      REPORT_SIZE (1)                 */
  82        0x81, 0x02,             /*      INPUT (data var abs)            */
  83        0x05, 0x01,             /*      USAGE_PAGE (generic desktop)    */
  84        0x16, 0x01, 0xF8,       /*      LOGICAL_MIN (-2047)             */
  85        0x26, 0xFF, 0x07,       /*      LOGICAL_MAX (2047)              */
  86        0x75, 0x0C,             /*      REPORT_SIZE (12)                */
  87        0x95, 0x02,             /*      REPORT_COUNT (2)                */
  88        0x09, 0x30,             /*      USAGE (X)                       */
  89        0x09, 0x31,             /*      USAGE (Y)                       */
  90        0x81, 0x06,             /*      INPUT                           */
  91        0x15, 0x81,             /*      LOGICAL_MIN (-127)              */
  92        0x25, 0x7F,             /*      LOGICAL_MAX (127)               */
  93        0x75, 0x08,             /*      REPORT_SIZE (8)                 */
  94        0x95, 0x01,             /*      REPORT_COUNT (1)                */
  95        0x09, 0x38,             /*      USAGE (wheel)                   */
  96        0x81, 0x06,             /*      INPUT                           */
  97        0x05, 0x0C,             /*      USAGE_PAGE(consumer)            */
  98        0x0A, 0x38, 0x02,       /*      USAGE(AC Pan)                   */
  99        0x95, 0x01,             /*      REPORT_COUNT (1)                */
 100        0x81, 0x06,             /*      INPUT                           */
 101        0xC0,                   /*    END_COLLECTION                    */
 102        0xC0,                   /*  END_COLLECTION                      */
 103};
 104
 105/* Consumer Control descriptor (3) */
 106static const char consumer_descriptor[] = {
 107        0x05, 0x0C,             /* USAGE_PAGE (Consumer Devices)       */
 108        0x09, 0x01,             /* USAGE (Consumer Control)            */
 109        0xA1, 0x01,             /* COLLECTION (Application)            */
 110        0x85, 0x03,             /* REPORT_ID = 3                       */
 111        0x75, 0x10,             /* REPORT_SIZE (16)                    */
 112        0x95, 0x02,             /* REPORT_COUNT (2)                    */
 113        0x15, 0x01,             /* LOGICAL_MIN (1)                     */
 114        0x26, 0x8C, 0x02,       /* LOGICAL_MAX (652)                   */
 115        0x19, 0x01,             /* USAGE_MIN (1)                       */
 116        0x2A, 0x8C, 0x02,       /* USAGE_MAX (652)                     */
 117        0x81, 0x00,             /* INPUT (Data Ary Abs)                */
 118        0xC0,                   /* END_COLLECTION                      */
 119};                              /*                                     */
 120
 121/* System control descriptor (4) */
 122static const char syscontrol_descriptor[] = {
 123        0x05, 0x01,             /*   USAGE_PAGE (Generic Desktop)      */
 124        0x09, 0x80,             /*   USAGE (System Control)            */
 125        0xA1, 0x01,             /*   COLLECTION (Application)          */
 126        0x85, 0x04,             /*   REPORT_ID = 4                     */
 127        0x75, 0x02,             /*   REPORT_SIZE (2)                   */
 128        0x95, 0x01,             /*   REPORT_COUNT (1)                  */
 129        0x15, 0x01,             /*   LOGICAL_MIN (1)                   */
 130        0x25, 0x03,             /*   LOGICAL_MAX (3)                   */
 131        0x09, 0x82,             /*   USAGE (System Sleep)              */
 132        0x09, 0x81,             /*   USAGE (System Power Down)         */
 133        0x09, 0x83,             /*   USAGE (System Wake Up)            */
 134        0x81, 0x60,             /*   INPUT (Data Ary Abs NPrf Null)    */
 135        0x75, 0x06,             /*   REPORT_SIZE (6)                   */
 136        0x81, 0x03,             /*   INPUT (Cnst Var Abs)              */
 137        0xC0,                   /*   END_COLLECTION                    */
 138};
 139
 140/* Media descriptor (8) */
 141static const char media_descriptor[] = {
 142        0x06, 0xbc, 0xff,       /* Usage Page 0xffbc                   */
 143        0x09, 0x88,             /* Usage 0x0088                        */
 144        0xa1, 0x01,             /* BeginCollection                     */
 145        0x85, 0x08,             /*   Report ID 8                       */
 146        0x19, 0x01,             /*   Usage Min 0x0001                  */
 147        0x29, 0xff,             /*   Usage Max 0x00ff                  */
 148        0x15, 0x01,             /*   Logical Min 1                     */
 149        0x26, 0xff, 0x00,       /*   Logical Max 255                   */
 150        0x75, 0x08,             /*   Report Size 8                     */
 151        0x95, 0x01,             /*   Report Count 1                    */
 152        0x81, 0x00,             /*   Input                             */
 153        0xc0,                   /* EndCollection                       */
 154};                              /*                                     */
 155
 156/* Maximum size of all defined hid reports in bytes (including report id) */
 157#define MAX_REPORT_SIZE 8
 158
 159/* Make sure all descriptors are present here */
 160#define MAX_RDESC_SIZE                          \
 161        (sizeof(kbd_descriptor) +               \
 162         sizeof(mse_descriptor) +               \
 163         sizeof(consumer_descriptor) +          \
 164         sizeof(syscontrol_descriptor) +        \
 165         sizeof(media_descriptor))
 166
 167/* Number of possible hid report types that can be created by this driver.
 168 *
 169 * Right now, RF report types have the same report types (or report id's)
 170 * than the hid report created from those RF reports. In the future
 171 * this doesnt have to be true.
 172 *
 173 * For instance, RF report type 0x01 which has a size of 8 bytes, corresponds
 174 * to hid report id 0x01, this is standard keyboard. Same thing applies to mice
 175 * reports and consumer control, etc. If a new RF report is created, it doesn't
 176 * has to have the same report id as its corresponding hid report, so an
 177 * translation may have to take place for future report types.
 178 */
 179#define NUMBER_OF_HID_REPORTS 32
 180static const u8 hid_reportid_size_map[NUMBER_OF_HID_REPORTS] = {
 181        [1] = 8,                /* Standard keyboard */
 182        [2] = 8,                /* Standard mouse */
 183        [3] = 5,                /* Consumer control */
 184        [4] = 2,                /* System control */
 185        [8] = 2,                /* Media Center */
 186};
 187
 188
 189#define LOGITECH_DJ_INTERFACE_NUMBER 0x02
 190
 191static struct hid_ll_driver logi_dj_ll_driver;
 192
 193static int logi_dj_output_hidraw_report(struct hid_device *hid, u8 * buf,
 194                                        size_t count,
 195                                        unsigned char report_type);
 196static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev);
 197
 198static void logi_dj_recv_destroy_djhid_device(struct dj_receiver_dev *djrcv_dev,
 199                                                struct dj_report *dj_report)
 200{
 201        /* Called in delayed work context */
 202        struct dj_device *dj_dev;
 203        unsigned long flags;
 204
 205        spin_lock_irqsave(&djrcv_dev->lock, flags);
 206        dj_dev = djrcv_dev->paired_dj_devices[dj_report->device_index];
 207        djrcv_dev->paired_dj_devices[dj_report->device_index] = NULL;
 208        spin_unlock_irqrestore(&djrcv_dev->lock, flags);
 209
 210        if (dj_dev != NULL) {
 211                hid_destroy_device(dj_dev->hdev);
 212                kfree(dj_dev);
 213        } else {
 214                dev_err(&djrcv_dev->hdev->dev, "%s: can't destroy a NULL device\n",
 215                        __func__);
 216        }
 217}
 218
 219static void logi_dj_recv_add_djhid_device(struct dj_receiver_dev *djrcv_dev,
 220                                          struct dj_report *dj_report)
 221{
 222        /* Called in delayed work context */
 223        struct hid_device *djrcv_hdev = djrcv_dev->hdev;
 224        struct usb_interface *intf = to_usb_interface(djrcv_hdev->dev.parent);
 225        struct usb_device *usbdev = interface_to_usbdev(intf);
 226        struct hid_device *dj_hiddev;
 227        struct dj_device *dj_dev;
 228
 229        /* Device index goes from 1 to 6, we need 3 bytes to store the
 230         * semicolon, the index, and a null terminator
 231         */
 232        unsigned char tmpstr[3];
 233
 234        if (dj_report->report_params[DEVICE_PAIRED_PARAM_SPFUNCTION] &
 235            SPFUNCTION_DEVICE_LIST_EMPTY) {
 236                dbg_hid("%s: device list is empty\n", __func__);
 237                djrcv_dev->querying_devices = false;
 238                return;
 239        }
 240
 241        if ((dj_report->device_index < DJ_DEVICE_INDEX_MIN) ||
 242            (dj_report->device_index > DJ_DEVICE_INDEX_MAX)) {
 243                dev_err(&djrcv_hdev->dev, "%s: invalid device index:%d\n",
 244                        __func__, dj_report->device_index);
 245                return;
 246        }
 247
 248        if (djrcv_dev->paired_dj_devices[dj_report->device_index]) {
 249                /* The device is already known. No need to reallocate it. */
 250                dbg_hid("%s: device is already known\n", __func__);
 251                return;
 252        }
 253
 254        dj_hiddev = hid_allocate_device();
 255        if (IS_ERR(dj_hiddev)) {
 256                dev_err(&djrcv_hdev->dev, "%s: hid_allocate_device failed\n",
 257                        __func__);
 258                return;
 259        }
 260
 261        dj_hiddev->ll_driver = &logi_dj_ll_driver;
 262        dj_hiddev->hid_output_raw_report = logi_dj_output_hidraw_report;
 263
 264        dj_hiddev->dev.parent = &djrcv_hdev->dev;
 265        dj_hiddev->bus = BUS_USB;
 266        dj_hiddev->vendor = le16_to_cpu(usbdev->descriptor.idVendor);
 267        dj_hiddev->product = le16_to_cpu(usbdev->descriptor.idProduct);
 268        snprintf(dj_hiddev->name, sizeof(dj_hiddev->name),
 269                "Logitech Unifying Device. Wireless PID:%02x%02x",
 270                dj_report->report_params[DEVICE_PAIRED_PARAM_EQUAD_ID_MSB],
 271                dj_report->report_params[DEVICE_PAIRED_PARAM_EQUAD_ID_LSB]);
 272
 273        usb_make_path(usbdev, dj_hiddev->phys, sizeof(dj_hiddev->phys));
 274        snprintf(tmpstr, sizeof(tmpstr), ":%d", dj_report->device_index);
 275        strlcat(dj_hiddev->phys, tmpstr, sizeof(dj_hiddev->phys));
 276
 277        dj_dev = kzalloc(sizeof(struct dj_device), GFP_KERNEL);
 278
 279        if (!dj_dev) {
 280                dev_err(&djrcv_hdev->dev, "%s: failed allocating dj_device\n",
 281                        __func__);
 282                goto dj_device_allocate_fail;
 283        }
 284
 285        dj_dev->reports_supported = get_unaligned_le32(
 286                dj_report->report_params + DEVICE_PAIRED_RF_REPORT_TYPE);
 287        dj_dev->hdev = dj_hiddev;
 288        dj_dev->dj_receiver_dev = djrcv_dev;
 289        dj_dev->device_index = dj_report->device_index;
 290        dj_hiddev->driver_data = dj_dev;
 291
 292        djrcv_dev->paired_dj_devices[dj_report->device_index] = dj_dev;
 293
 294        if (hid_add_device(dj_hiddev)) {
 295                dev_err(&djrcv_hdev->dev, "%s: failed adding dj_device\n",
 296                        __func__);
 297                goto hid_add_device_fail;
 298        }
 299
 300        return;
 301
 302hid_add_device_fail:
 303        djrcv_dev->paired_dj_devices[dj_report->device_index] = NULL;
 304        kfree(dj_dev);
 305dj_device_allocate_fail:
 306        hid_destroy_device(dj_hiddev);
 307}
 308
 309static void delayedwork_callback(struct work_struct *work)
 310{
 311        struct dj_receiver_dev *djrcv_dev =
 312                container_of(work, struct dj_receiver_dev, work);
 313
 314        struct dj_report dj_report;
 315        unsigned long flags;
 316        int count;
 317        int retval;
 318
 319        dbg_hid("%s\n", __func__);
 320
 321        spin_lock_irqsave(&djrcv_dev->lock, flags);
 322
 323        count = kfifo_out(&djrcv_dev->notif_fifo, &dj_report,
 324                                sizeof(struct dj_report));
 325
 326        if (count != sizeof(struct dj_report)) {
 327                dev_err(&djrcv_dev->hdev->dev, "%s: workitem triggered without "
 328                        "notifications available\n", __func__);
 329                spin_unlock_irqrestore(&djrcv_dev->lock, flags);
 330                return;
 331        }
 332
 333        if (!kfifo_is_empty(&djrcv_dev->notif_fifo)) {
 334                if (schedule_work(&djrcv_dev->work) == 0) {
 335                        dbg_hid("%s: did not schedule the work item, was "
 336                                "already queued\n", __func__);
 337                }
 338        }
 339
 340        spin_unlock_irqrestore(&djrcv_dev->lock, flags);
 341
 342        switch (dj_report.report_type) {
 343        case REPORT_TYPE_NOTIF_DEVICE_PAIRED:
 344                logi_dj_recv_add_djhid_device(djrcv_dev, &dj_report);
 345                break;
 346        case REPORT_TYPE_NOTIF_DEVICE_UNPAIRED:
 347                logi_dj_recv_destroy_djhid_device(djrcv_dev, &dj_report);
 348                break;
 349        default:
 350        /* A normal report (i. e. not belonging to a pair/unpair notification)
 351         * arriving here, means that the report arrived but we did not have a
 352         * paired dj_device associated to the report's device_index, this
 353         * means that the original "device paired" notification corresponding
 354         * to this dj_device never arrived to this driver. The reason is that
 355         * hid-core discards all packets coming from a device while probe() is
 356         * executing. */
 357        if (!djrcv_dev->paired_dj_devices[dj_report.device_index]) {
 358                /* ok, we don't know the device, just re-ask the
 359                 * receiver for the list of connected devices. */
 360                retval = logi_dj_recv_query_paired_devices(djrcv_dev);
 361                if (!retval) {
 362                        /* everything went fine, so just leave */
 363                        break;
 364                }
 365                dev_err(&djrcv_dev->hdev->dev,
 366                        "%s:logi_dj_recv_query_paired_devices "
 367                        "error:%d\n", __func__, retval);
 368                }
 369                dbg_hid("%s: unexpected report type\n", __func__);
 370        }
 371}
 372
 373static void logi_dj_recv_queue_notification(struct dj_receiver_dev *djrcv_dev,
 374                                           struct dj_report *dj_report)
 375{
 376        /* We are called from atomic context (tasklet && djrcv->lock held) */
 377
 378        kfifo_in(&djrcv_dev->notif_fifo, dj_report, sizeof(struct dj_report));
 379
 380        if (schedule_work(&djrcv_dev->work) == 0) {
 381                dbg_hid("%s: did not schedule the work item, was already "
 382                        "queued\n", __func__);
 383        }
 384}
 385
 386static void logi_dj_recv_forward_null_report(struct dj_receiver_dev *djrcv_dev,
 387                                             struct dj_report *dj_report)
 388{
 389        /* We are called from atomic context (tasklet && djrcv->lock held) */
 390        unsigned int i;
 391        u8 reportbuffer[MAX_REPORT_SIZE];
 392        struct dj_device *djdev;
 393
 394        djdev = djrcv_dev->paired_dj_devices[dj_report->device_index];
 395
 396        if (!djdev) {
 397                dbg_hid("djrcv_dev->paired_dj_devices[dj_report->device_index]"
 398                        " is NULL, index %d\n", dj_report->device_index);
 399                kfifo_in(&djrcv_dev->notif_fifo, dj_report, sizeof(struct dj_report));
 400
 401                if (schedule_work(&djrcv_dev->work) == 0) {
 402                        dbg_hid("%s: did not schedule the work item, was already "
 403                        "queued\n", __func__);
 404                }
 405                return;
 406        }
 407
 408        memset(reportbuffer, 0, sizeof(reportbuffer));
 409
 410        for (i = 0; i < NUMBER_OF_HID_REPORTS; i++) {
 411                if (djdev->reports_supported & (1 << i)) {
 412                        reportbuffer[0] = i;
 413                        if (hid_input_report(djdev->hdev,
 414                                             HID_INPUT_REPORT,
 415                                             reportbuffer,
 416                                             hid_reportid_size_map[i], 1)) {
 417                                dbg_hid("hid_input_report error sending null "
 418                                        "report\n");
 419                        }
 420                }
 421        }
 422}
 423
 424static void logi_dj_recv_forward_report(struct dj_receiver_dev *djrcv_dev,
 425                                        struct dj_report *dj_report)
 426{
 427        /* We are called from atomic context (tasklet && djrcv->lock held) */
 428        struct dj_device *dj_device;
 429
 430        dj_device = djrcv_dev->paired_dj_devices[dj_report->device_index];
 431
 432        if (dj_device == NULL) {
 433                dbg_hid("djrcv_dev->paired_dj_devices[dj_report->device_index]"
 434                        " is NULL, index %d\n", dj_report->device_index);
 435                kfifo_in(&djrcv_dev->notif_fifo, dj_report, sizeof(struct dj_report));
 436
 437                if (schedule_work(&djrcv_dev->work) == 0) {
 438                        dbg_hid("%s: did not schedule the work item, was already "
 439                        "queued\n", __func__);
 440                }
 441                return;
 442        }
 443
 444        if ((dj_report->report_type > ARRAY_SIZE(hid_reportid_size_map) - 1) ||
 445            (hid_reportid_size_map[dj_report->report_type] == 0)) {
 446                dbg_hid("invalid report type:%x\n", dj_report->report_type);
 447                return;
 448        }
 449
 450        if (hid_input_report(dj_device->hdev,
 451                        HID_INPUT_REPORT, &dj_report->report_type,
 452                        hid_reportid_size_map[dj_report->report_type], 1)) {
 453                dbg_hid("hid_input_report error\n");
 454        }
 455}
 456
 457
 458static int logi_dj_recv_send_report(struct dj_receiver_dev *djrcv_dev,
 459                                    struct dj_report *dj_report)
 460{
 461        struct hid_device *hdev = djrcv_dev->hdev;
 462        int sent_bytes;
 463
 464        if (!hdev->hid_output_raw_report) {
 465                dev_err(&hdev->dev, "%s:"
 466                        "hid_output_raw_report is null\n", __func__);
 467                return -ENODEV;
 468        }
 469
 470        sent_bytes = hdev->hid_output_raw_report(hdev, (u8 *) dj_report,
 471                                                 sizeof(struct dj_report),
 472                                                 HID_OUTPUT_REPORT);
 473
 474        return (sent_bytes < 0) ? sent_bytes : 0;
 475}
 476
 477static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev)
 478{
 479        struct dj_report *dj_report;
 480        int retval;
 481
 482        /* no need to protect djrcv_dev->querying_devices */
 483        if (djrcv_dev->querying_devices)
 484                return 0;
 485
 486        dj_report = kzalloc(sizeof(struct dj_report), GFP_KERNEL);
 487        if (!dj_report)
 488                return -ENOMEM;
 489        dj_report->report_id = REPORT_ID_DJ_SHORT;
 490        dj_report->device_index = 0xFF;
 491        dj_report->report_type = REPORT_TYPE_CMD_GET_PAIRED_DEVICES;
 492        retval = logi_dj_recv_send_report(djrcv_dev, dj_report);
 493        kfree(dj_report);
 494        return retval;
 49
 396   4ech-dech-dj.c#L479" id96" id="L4 name="L39">REPORT_ID_DJ_SHORT;
         458       4                logi_dj_recv_send_rewdj_r_tocv_smgi_a href="+code=djrcv_dev" claswdj_r_tocv_smgi_lass="sref">dj_receiver_dev *djrcv_dev)
 472       4        kfifo_iiiiiiiiiiiiiiiiiiiiiiiiiii;
)
 488<5a>
 461<5a>       5        if (hid_device *dj_report;
 480<5a>       5                sent_bytes;
 49
<5a>       5                 474<5a>       5        }
kzalloc(sizeof(struct dj_report), GFP_KERNEL);
 474<5a5       5 ers/hid/hid-logitech-dj5drive5s/hid/hid-logij_report)
 488<5a>       5}
"hid_outputNOMEM;
 489<5a>
kzalleport_id = REPORT_ID_DJ_SHORT;
 490<5a>       5memset(device_index = 0xFF;
 491<5a>
dj_report->report_id = REPORT_TYPE_SWITCHICES;
 490<5a>       5for (dj_report->device_index =CMD_GETparam="drivers/hid/hiCMD_GETparam=srefport->:
 491<5a>       5        if (dj_report->report_type = ->;
dj)dev)
 491<5a>       5                retval = logi_dj_recv_send_report(djrcv_dev, dj_report);
 491<5a>       5                if (kfree(dj_report);
 494<5a>       5                        5     51ass="sref">retval;
 49
<5a>       5                        5     51 id96" id="L4 name="L396"> 396   4ech-dech-5a>       5                        5     51D_DJ_SHORT;
       5                        5a hre51L458" id="L458" class="line" name="L458"> 458<5a>       5                        5     51end_report" class="sref">logi_dj_recv_sll_opeon(struct dj_receiver_devref="+code=hdev" class="sref">hdev =  488<5a>       5                }
 461<5a>       5        }
dj_report->"%s: did not schedule the work item, was already lreadyss="sref">__func__, retval);
paired_dj_devihy="+code=dj_reporthy=#L494" id="L494" class="line" name="L494"> 494<5a>       5}
 485<5a>}
 373<5a>
 396   4ech-dech-5a>static 5oid  396   4ech-dech-5a>       5                        5     5 strucrd_report" class="sref">logi_dj_recll_clos_a href="+code=djrcv_devll_clos_lass="sref">dj_receiver_devref="+code=hdev" class="sref">hdev =  488<5a>{
 427<5a>       5/*5We ar527d-logitech-dort = "%s: did not schedule the work item, was already lreadyss="sref">__func__, retval);
paired_dj_devihy="+code=dj_reporthy=#L494" id="L494" class="line" name="L427"> 427<5a>       5struct  396   4ech-dech-5a>       5="drivers/hid/hid-logite5h-dj.5#L430" id="L430" class="line" name="L430"> 430<5a>       5logi_dj_recv_sass="sr" nt((dj_receiver_devref="+code=hdev" class="sref">hdev = );
dj_ra>);
 472<5a>
);
);
 472<5a>}
;
,
 472<5a>
 427<5a>       5                " ijrcv_dev->querying_devC djrcvby h="+caw 483<5a>       5         = "%s: did not schedule the work item, was alreadyss="sref">__func__);
 467<5a>
 437<5a>       5        if ( 485<5a>       5                 396   4ech-dech-5a>       5                 430<5a>       5        }
logrdcahref="+code=hdevrdcahot sccharp* ;
"%s:atass="/a;
);
 472<5a>       5        return;
 427<5a>       5}
retval = "%s:atass="/a>);
 485<5a>
kfree( logi_d"sreref="+code=hdev"sre#L44" id="L485" class="line" name="L485"> 485<5a>       5if (( 385<5a>       5    ( 486<5a>       5        logi_dj_recv_sll_pars_a href="+code=djrcv_devll_pars_lass="sref">dj_receiver_devref="+code=hdev" class="sref">hdev =  488<5a>       5        return;
 427<5a>       5}
dj_device *dj_device;
djrcv_dev->paired_dj_dev class_fatag">"%s:class_fata#L44" id="L485" class="line" name="L485"> 485<5a>       5="drivers/hid/hid-logite5h-dj.54"sref">dj_rep;
);
 485<5a>       5if ( 485<5a>       5                ;
 49
<5a>       5                 373<5a>       5        kfree("%s: did not schedule the work item, was alreadyss="sref">__func__);
 467<5a>       5}
 396   4ech-dech-5a>}
 = hdev,
(struct  467<5a>       5="drivers/hid/hid-logite5h-dj.55"sref">dj_report = hdev,
 485<5a>       5="drivers/hid/hid-logite5h-dj.5#L458" id="L458" class="line" name="L458"> 458<5a>static 5nt memset((sizeof(strucm (sizeof(strud-logDESChref="drivers/hid/hid-logDESChref=ss="/a>);
 474<5a>       5                        5   st5uct  488<5a>{
 489<5a>       5struct  482<5a>       5int dj_device == reports_supported & (1 << i<">reports_suppoSTDch-YBOARIRED:
 465<5a>
dbg_hid("hid_input_report error\n");
dj_re id="L465" class="line" name="L465"> 465<5a>       5if (!hdevdbg_hid(retval);
reports_supported & (1 <<  474<5a>       5        dev_err(&->reportbuffer))kbd_deshriptorref="+code=dj_rebd_deshriptorss="36" id="L436" class="line" name="L436"> 436<5a>       5                "hi" id="L385" class="line" name="L385"> 385<5a>       5        return - 458<5a>       5}
reports_supported & (1 << i<">reports_suppoSTDcMOUS="drivers/hid/hiSTDcMOUS=ss=""5" id="L465" class="line" name="L465"> 465<5a>       5="drivers/hid/hid-logite5h-dj.56 class="sref">kfifo_in(&"hid_input_report error\n");
 466<5a>       5kfifo_inror\n");
dj_report->retval);
reports_supported & (1 <<  474<5a>       5                        5     5          sizeof(struc/a>(&->reportbuffer))mse_deshriptorref="+code=dj_rmse_deshriptorss="36" id="L436" class="line" name="L436"> 436<5a>       5                        5     57ech-dj.c#L443" id="L443" class="line" name="L443"> 443<5a>
 474<5a>       5return (reports_supported & (1 << i<">reports_suppoMULTIMEDIA"drivers/hid/hidULTIMEDIAss=""5" id="L465" class="line" name="L465"> 465<5a>}
dev_err(&"hid_input_report error\n");
dj_re id="L465" class="line" name="L465"> 465<5a>
"hid_output_raw_report->retval);
reports_supported & (1 <<  474<5a>       5nt E/a>(&->reportbuffer))consumsref"shriptorref="+code=dj_rconsumsref"shriptorss="36" id="L436" class="line" name="L436"> 436<5a>       5f="drivers/hid/hid-logit5ch-dj57ech-dj.c#L469" id="L469" class="line" name="L469"> 469<5a>       5struct  430<5a>       5int hid_input_reporee=reports_supported" class="sref">reports_supported & (1 << i<">reports_suppoPOWERch-YVICES;
 465<5a>
"hid_input_report error\n");
dj_re id="L465" class="line" name="L465"> 465<5a>       5/*5no ne58id_reportid_size_map" class="sref">hid_repor"+code=retval" class="sref">retval);
reports_supported & (1 <<  474<5a>       5if (dbg_hid(->reportbuffer))sysld) rolef"shriptorref="+code=dj_rsysld) rolef"shriptorss="36" id="L436" class="line" name="L436"> 436<5a>       5        return 0;
 469<5a>
 486<5a>       5dj_repref">hid_input_reporee=reports_supported" class="sref">reports_supported & (1 << i<">reports_suppoMEDIA_CENTER"drivers/hid/hidEDIA_CENTERss=""5" id="L465" class="line" name="L465"> 465<5a>       5if (!E/a>(&"hid_input_report error\n");
dj_re id="L465" class="line" name="L465"> 465<5a>       5        return -E class="sref">hid_repor"+code=retval" class="sref">retval);
reports_supported & (1 <<  474<5a>       5kfifo_in(&->reportbuffer))media_deshriptorref="+code=dj_rmedia_deshriptorss="36" id="L436" class="line" name="L436"> 436<5a>       5dj_rep" id="L469" class="line" name="L469"> 469<5a>       5 482<5a>       5dj_device == reports_supported & (1 << i<">reports_suppoKBD_LEDVICES;
 465<5a>       5dbg_hid("hid_input_report error\n");
dj_re id="L465" class="line" name="L465"> 465<5a>       5return hdevdbg_hid(retval);
reports_supported & (1 <<  474<5 href="dr5vers/hid/hid-logitech-dj5c#L47595sref">dj_rep" id="L469" class="line" name="L469"> 469<5a>       5id96" id="L4 name="L39">5EPORT5ID_DJ_SHORT;
logi_dref"pars_a>(((sizeof(strudde=REPORT_ID_DJ_Shlass="/a>);
 474<5 >       5                memset(dj_report);
 474<5 >       5         430<6a>
dj_reptval;
 49
<6a>       6        if ( 469<6a>       6                 373<6a>       6                logi_dj_recv_sll_driverevenhref="+code=hdevj_recv_sll_driverevenhj_rep>dj_device *;
"%s:";
);
 452<6a>       6        }
hdevdbg_hid<<<<<<<<<<<;
);
);
 488<6a5       6 ers/hid/hid-logitech-dj6drive6s/hid/" id="L465" class="line" name="L465"> 465<6a>       6}
"hijrcv_dev->querying_devSyinvby the drive layer /sphandle leds+and Force F */backdj.c#L483" id="L483" class="line" name="L483"> 483<6a>
dj_receiver_devref="+code=hdev" class="sref">hdev = logi_ddrivergeerervfatag">"%sdrivergeerervfataj_report);
"%s:" 474<6a>       6dj_device *dj_device;
logi_dv_sreff="+code=djrcv_dev" creff="t" c"sref">paired_dj_dev class_fatag">"%s:class_fata#L44" id="L485" class="line" name="L485"> 485<6a>
 430<6a>       6for (dj_rep"sref">dj_receiver_dev *djrcv_dev)
 430<6a>       6        if (rgeerervfatag">"%sf">rgeerervfataj_report);
paired_dj_dev ">"%s:"paired_dj_devparenhref="+code=hdevparenh; 474<6a>       6                retvaldj_receiver_devref="+code=hdev" class="sref">hdev = logi_dv_ef="+code=hdev" class="sref">hdev;
 462<6a>       6                if (kfree("sref">dj_receiver_devref=gitech-enum=hdev" class="sref"gitech-enum/a> =  462<6a>       6                        6     61forwa id="L4 name="L396"> 396   4ech-dech-6a>       6                        6     615">kfree("sref">dj_receiver_devref=fiele=REPORT_ID_DJ_Shla=fiele/a> =  462<6a>       6                        6     616">kfree("sref">dj_receiver_devref=gitech=hdev" class="sref"gitech/a> =  480<6a>       6                        6a hre617d-logitech-d;
,
fatag">"%s:atass="[8]" id="L480" class="line" name="L480"> 480<6a>       6                        6     61ech-dj.c#L469_ref>);
 480<6a>
 430<6a>       6        }
dj_report->"%s: did not schedule the work item, was already  rt" cs, j.c# lreadd | t;dj_re id="L465" class="line" name="L465"> 465<6a>       6}
retval);
"%s:"paired_dj_devihy="+code=dj_reporthy=#L49/a>);
);
);
 480<6a>}
 373<6a>
djrcv_dev->logi_dEV_LEDvers/hid/hid-loEV_LEDss="" id="L488" class="line" name="L488"> 488<6a>static 6oid  467<6a>       6                        6     62L486" id="L486" class="line" name="L486"> 486<6a>{
dj_report = logi_drefdriverfinf=fiele=REPORT_ID_DJ_Shladriverfinf=fielej_report);
);
);
-> 480<6a>       6/*6We ar62L458" id="L458" class="line" name="L458"> 458<6a>       6struct  465<6a>       6="drivers/hid/hid-logite6h-dj.62 class="sref">kfifo_in(&rwaroot sca>->"%s:"paired_dj_devg">"%s:"
dj_r"" id="L480" class="line" name="L480"> 480<6a>       6 467<6a>
 469<6a>}
retval = );
 "f>);
 480<6a>
kfree(reports_supported->"%s:atass="[0]"" id="L480" class="line" name="L480"> 480<6a>static 6                 396   4ech-dech-6a>       6         = ->report_type =  480<6a>
dj_report = logi_dass="sreitech-enum=hdev" class="sass="sreitech-enumL462eport_id =  480<6a>       6        if ();
device_index = 0xFF;
 480<6a>       6                memset();
;
 480<6a>       6                dj_report->);
"%s:atass="[1]"" id="L480" class="line" name="L480"> 480<6a>       6        }
 480<6a>
dj_report-> 480<6a>       6}
 373<6a>
kfree(j.c#L485" id="L485" class="line" name="L485"> 485<6a>       6if (( 396   4ech-dech-6a>       6    ( 396   4ech-dech-6a>       6               6        return;
logi_dj_recv_sll_rd_ href="+code=hdevj_recv_sll_rd_ hj_rep>dj_device *hdev = "%shlass="" id="L488" class="line" name="L488"> 488<6a>       6}
 465<6a>       6="drivers/hid/hid-logite6h-dj.64"sref">dj_report->"%s: did not schedule the work item, was alreadyss="sref">__func__);
 467<6a>       6if (dj_reptval 485<6a>       6                 469<6a>       6                 373<6a>       6        logi_dj_recll_stopref="+code=hdevj_recv_sll_rdopj_rep>dj_device *hdev = "%shlass="" id="L488" class="line" name="L488"> 488<6a>       6}
 465<6a>}
 = "%s: did not schedule the work item, was alreadyss="sref">__func__);
 467<6a>       6="drivers/hid/hid-logite6h-dj.65"sref" id="L469" class="line" name="L469"> 469<6a>       6="drivers/hid/hid-logite6h-dj.6#L458" id="L458" class="line" name="L458"> 458<6a>static 6nt m id="L458" class="line" name="L458"> 458<6a>       6                        6   st6uct dj_device *logi_dj_recll_ class=hdev" class="si_dj_recll_ classL480las" id="L465" class="line" name="L465"> 465<6a>{
paired_dj_devpars_a href="+code=dpars_lasslass="sref">logi_dj_recv_sll_pars_a href="+code=djrcv_devll_pars_lasse id="L465" class="line" name="L465"> 465<6a>       6struct paired_dj_devrd_ href="+code=hdevrd_ hj_relass="sref">logi_dj_recv_sll_rd_ href="+code=hdevj_recv_sll_rd_ hj_ree id="L465" class="line" name="L465"> 465<6a>       6int dj.">paired_dj_devrdopref="+code=hdevrdopj_relass="sref">logi_dj_recv_sll_rdopref="+code=hdevj_recv_sll_rdopj_ree id="L465" class="line" name="L465"> 465<6a>       6="drivers/hid/hid-logite6h-dj.66class="sref">.">paired_dj_devopeon(struct logi_dj_recv_sll_opeon(struct  465<6a>       6if (!hdevpaired_dj_devclos_a href="+code=dclos_lasslass="sref">logi_dj_recv_sll_clos_a href="+code=djrcv_devll_clos_lasse id="L465" class="line" name="L465"> 465<6a>}
.">paired_dj_devhladriverdriverevenhref="+code=hdevhladriverdriverevenhlasslass="sref">logi_dj_recv_sll_driverevenhref="+code=hdevj_recv_sll_driverevenhj_ree id="L465" class="line" name="L465"> 465<6a>       6                }" id="L467" class="line" name="L467"> 467<6a>       6        return - 458<6a>       6}
m id="L458" class="line" name="L458"> 458<6a>       6="drivers/hid/hid-logite6h-dj.66ct logi_dj_recv_stdj_device *hdev =  465<6a>       6kfifo_iiiiii"sref">dj_receiver_devref=gitech=hdev" class="sref"gitech/a> = dj_rort;
"%s:atass="e id="L465" class="line" name="L465"> 465<6a>       6                        6     6          sizeof(strucccccccccccccchref>);
 472<6a>       6                        6     67ech-d" id="L465" class="line" name="L465"> 465<6a>
kfree("sref">dj_receiver_dev *djrcv_dev)
"%sref=geerervfataj_report);
 467<6a>       6return (dj_receiver_dev rivers/hid/hid-logitech-dj.c#L49= "%s:atass="" id="L467" class="line" name="L467"> 467<6a>}
;
;
 467<6a>       6="drivers/hid/hid-logite6h-dj.67"sref">dj_report = logCMD_GETprocess(1 <<  467<6a>       6nt  458<6a>       6f="drivers/hid/hid-logit6ch-dj67ef">memset("%s: did not schedule the work item, was already/aef"> lreaddass="sref">dj_rec/a>(&retval);
 485<6a>       6struct  430<6a>       6int  483<6a>
 483<6a>       6/*6no ne68id_rejrcv_dev->querying_ccccccccc* 1) Datadshouldacontinue its normal processid-li.e. dataddoes notc#L483" id="L483" class="line" name="L483"> 483<6a>
 483<6a>       6        return 0;
 483<6a>}
hdev<)c#L483" id="L483" class="line" name="L483"> 483<6a>       6 483<6a>       6if (! 483<6a>       6        return -hparal 483<6a>       6 483<6a>       6 483<6a>       6 483<6a>       6 483<6a>
 483<6a>       6return  483<6 href="dr6vers/hid/hid-logitech-dj6c#L4769L486"jrcv_dev->querying_ccccccccc* h-deat 483<6 >       6id96" id="L4 name="L39">6EPORT69"srefjrcv_dev->querying_ccccccccc* further processid-lis+coquir 483<6a>       6         483<6a>       6                 483<6a>       6         483<7a>
hdev 483<7a1
 483<7a>       7                 483<7a>       7                 474<7a>       7        }
hdev);
->hdev;
);
 485<7a5       7 ers/hid/hid-logitech-dj7drive70class="sref">_device ==  rivers/hid/hid-logitech-dj.c#L49eport_id = dj_receiver_dev_SHORT;
 465<7a>       7}
"hiiiiiiiiiswitch vice ==  rivers/hid/hid-logitech-dj.c#L49eport_id =  465<7a7       7}       Ecase dj_receiver_dev_SHORT 465<7a8       7}               Ecase dj_receiver_dev_SHORT 465<7a9       7}       kfifo_i">hdev);
);
hdev);
 rivers/hid/hid-logitech-dj.c#L497" id="L485" class="line" name="L485"> 485<7a>       7for ( 485<7a1
Ecase dj_receiver_dev_SHORT;
 465<7a>       7                ->;
 465<7a>       7                if (dbg_hidhdev);
 465<7a>       7                        7     71"sref">hdevdbg_hid<<<<<<<<<>);
 rivers/hid/hid-logij_recv_steef"forward_nulla> rivej_report);
hdev);
 rivers/hid/hid-logitech-dj.c#L497" id="L485" class="line" name="L485"> 485<7a5       7                        7     715">kfree(((((((((((((((((" id="L469" class="line" name="L469"> 469<7a>       7                        7     71ing">"hiiiiiiiiiiiiiiiiibreak" id="L485" class="line" name="L485"> 485<7a7       7                        7a hre71NODEV" class="sref">Edefault: id="L465" class="line" name="L465"> 465<7a8       7                        7     71NOMEM" class="sref">E class="sref">hid_reporj_recv_steef"forward_> rivers/hid/hid-logij_recv_steef"forward_> rivej_report);
hdev);
 rivers/hid/hid-logitech-dj.c#L497" id="L485" class="line" name="L485"> 485<7a9       7                }
kfifo_i" id="L469" class="line" name="L469"> 469<7a>       7        }
logCMD_GETprocess(1 <<  467<7a>       7}
 469<7a>}
retval = ->hdev;
);
 485<7a>
 474<7a>static 7oid  485<7a5       7                        7     72 id96" id="L4 name="L396"> 396   4ech-dech-7a>{
       7/*7We ar72/hid/rd_nullclass="sref">logi_dj_recv_sprob_a href="+code=djrcv_devprob_j_rep>dj_device *hdev =  465<7a>       7struct E class="dqunstpsdj_device * =  488<7a>       7="drivers/hid/hid-logite7h-dj.72 clas" id="L465" class="line" name="L465"> 465<7a>       7dj_rep"sref">dj_receiver_devusb_hreerfaceport" class="sresb_hreerface/a> = paired_dj_dev ">"%s:"paired_dj_devparenhref="+code=hdevparenh; 474<7a>
dj_receiver_dev *djrcv_dev)
 474<7a>}
retvallogi_dvers/hid/hid-logitech-dj.c#L495" id="L495" class="line" name="L495"> 49
<7a>
 474<7a>static 7                dj_dev)ort);
paired_dj_dev r="srefatag">"%s:class_fata#L44)" id="L488" class="line" name="L488"> 488<7a>       7        kfree(((((((((NOMEMpaired_dj_devENODEVg">"%sENODEVL495" id="L495" class="line" name="L495"> 49
<7a>{
T class="line" navers/hid/hid-loj.rivers/hid/hid-logitech-dj.c#L467" id=sll_rd_ href="+code=hdev1">paired_dj_devrd_ href="+code=hdevrd_ hj_relabll"line" ifnum val" class="sref">retval);
T claclass="sra href="+codref"seh=fiel7=REPO73a> *paired_dj_devparenhrefne" name="L474"> 74<5 >  " id="L487" clasbI.c#L462"Numb465" class="line"bI.c#L462"Numb46a>
->       6int  48carrylineions/, do5" cr"-co7a>       7                dj_repor7->       7                reports_suppusb_hreerfaceport" class="slass_fata#L44)" id="cur_altsettode=reerfaceport" cur_altsettodes.">paired_dj_devparenhrefne" name="L474"> 74<5 >  " id="L487" clasbI.c#L462"Numb465" class="line"bI.c#L462"Numb46a>
< !    7                if (I465I465       7                        7     71"sref"id="L4 na7e="L396"> 396   4ech7dech-74="drj_recv_steef"forwj.c#L467" id=sll_rd_ href="+code=hdev1">paired_dj_devrd_ href="+code=hdevrd_ hj_re: ignmeame="fnum val" class="sref">retval);
T cl id="L4 n7me="L396"> 396   4ec7-dech74line" name="L469"> 469<7a>   f">reports_suppusb_hreerfaceport" class="slass_fata#L44)" id="cur_altsettode=reerfaceport" cur_altsettodes.">paired_dj_devparenhrefne" name="L474"> 74<5 >  " id="L487" clasbI.c#L462"Numb465" class="line"bI.c#L462"Numb46a>
 49
<7a>{
logi_dj_recv_sl7_rd_ 74id-logitech-da hr7f="drivers/hid/hid-logit7ch-dj72D_DJ_S id="L4657 class="line" name="L4657> 46574>       6="drivers/hid/hid-logite6h-dj.66ct dj_repor7->&q7ot;Ms: did not scdqueid-lfrom iface 2/athTr"-c"j.c#L462" 283<7a>       7                dj_reptv7l
"%sref=geerervfataj_rkzblloe" name="L474"> kzblloes="sredj_rme_dev" class="sref">djrcv_dev)

"%s      7                        7     71"sref"d_nullrt"7class="sref">logi_dj_rec7l_sto75uot;hid_input_report error\n"hdev;
"%s:"paired_dj_devparenhref="+code=hdevparenh;T cl id="L4657 class="line" name="L4657> 46575de=retval" class="sref">retvaldevrd_ href="+code=hdevrd_ hj_re:fail"liblloeatode id/hid-logitechd-logitech-dj.c#L467" id="L467" class="line" name="L467"> 467<6a>       6="drivers/hid/hid-logite6h-dj.65"sref7="sref"or7 = &q7ot;KEVg">"%sENODEVL495" id="L495" class="lMEM" name="L495"> 49
MEM>{
 462<6a>   ref=geerervfataj_ree" name="L462"> 462<6a>       6                if (kf7id="L458"7class="line" name="L458"7 458<75;s: did not schedule the worINIT_WORKname="L462"> 46INIT_WORK="sref">hdev;
);
 4"+code=hdevparenh#L483line_abll"> 4a>       6="drivers/hid/hid-logite6h-dj.65"sref7=dj_repor7device *hdev;
);
reports_suppkfifo_blloe" name="L474"> kfifo_blloe="sref">hdev;
);
T clitech-d."7paired_dj_devrd_ href="+7ode=h76f="dr"sreref="+code=hdev"sre#MAX_NUMBlaine" nICA="li class="line" na5">MAX_NUMBlaine" nICA="li 2"sref edj_rme_dev" class="sref">djrcv_dess="line" name="L485"> 485<7a9   d5" id="L495" class="line" name="L495">T clid="L373"7paired_dj_devrdopref="+c7de=hd76rea> rivers/hid/hid-logitech-l);
."7paired_dj_devopeon(s7ruct 76uot;hid_input_report error\n"hdev;
"%s:"paired_dj_devparenhref="+code=hdevparenh;T cl>hdevretvaldevrd_ href="+code=hdevrd_ hj_re:fail"liblloeatode " cla_fifod-logitech-dj.c#L467" id="L467" class="line" name="L467"> 467<6a>       6="drivers/hid/hid-logite6h-dj.65"sref7"sref">."7paired_dj_devhladriverdr7verev76EVg">"%sENODf">reports_suppkfrehid/hid-logitechkfrehf">hdev);
 rivers/hid/hid-logitech-dj     6="drivers/hid/hid-logite6h-dj.65"sref7"id="L4697" class="line" name="L467"> 4676ass="line" name="L485EVL495" id="L495" class="lMEM" name="L495"> 49
MEM>{
);
>);
 467<6a>  .c#L497" id="L485" a href=> rivers/hid/hid-logitech-dj     6="drivers/hid/hid-logite6h-dj.65"sref7"dj_repor7s="sref">logi_dj_recv_st7/aeve76>       6int kfifo_iiiiii"sref"7dj_re77ss="s all datadqueid-lfrom iface 2/athCc#L4" naeff="+" nafe-dj.me="HID 74<5riptors of"j.c#L462" 2883<6a>       6        return 0;
       6        return 0;
."7ef">dj_receiver_dev 7dj_receiver_dev 7ivers77="+code=hdev"pin_lock_irqsav="line" name="L495"> 49
<7a>
 467<6a>       6="drivers/hid/hid-logite6h-dj.65"sref7"sref">;
;
 49
<7a>
dj_repor7 = hdev;
"%s:"paired_dj_devparenhref="+code=hdevparenh;T clid="L458"7class="line" name="L458"7 458<77ine" name="L465"> 465f">retvaldevrd_ href="+code=hdevrd_ hj_re:65<6aaof"j.c#L462" 28fail"ld-logitech-dj.c#L467" id="L467" class="line" name="L467"> 467<6a>       6="drivers/hid/hid-logite6h-dj.65"sref7mset(7a href="+code"string">&q7ot;Ma> *{

       6        return 0;
 49
<7a>
 467<6a>  .c#L497" id="L485ame= class=_DEFAUL" class="line" name= class=_DEFAUL"a>       6="drivers/hid/hid-logite6h-dj.65"sref7rcv_dev-&7t;querying_ccccccccc* tv7l 49
<7a>
"%sENODf">reports_suppsev_er65" class="line"sev_er6="sref">hdev;
"%s:"paired_dj_devparenhref="+code=hdevparenh;T clrcv_dev-&7t;querying_ccccccccc*c#L783" i78ass="line" name="L485"> 485<7ldevrd_ href="+code=hdevrd_ hj_re:eporhw465" c5EVL495ed er6ord-logitech-dj.c#L467" id="L467" class="line" name="L467"> 467<6a>       6="drivers/hid/hid-logite6h-dj.65"sref7rcv_dev-&7t;querying_ccccccccc* 2)7Datad78ine" name="L465"> 465go na=geerervfataj_reporhw465" c_faillass="line" nameporhw465" c_fail>{
       6int  49
<7a>
hdev);
 rivers/hid/hid-logitech-dj, 0     6="drivers/hid/hid-logite6h-dj.65"sref7rcv_dev-&7t;querying_ccccccccc*c#L783" i791vice" clasis_f="+code=j_repp>dj="line" name="L495"> 49
<7a>
 rivers/hid/hid-lf">reports_suppsev_er65" class="line"sev_er6="sref">hdev;
"%s:"paired_dj_devparenhref="+code=hdevparenh;T clrcv_dev-&7t;querying_ccccccccc* if7the c79STATUV_LINKLOSVICES;
retv5" id="L495" class="line" name="L495">T clrcv_dev-&7t;querying_ccccccccc* to7the u79de=retval" class="sref">retval);
 49
<7a>
"%sENODgo na=geerervfataj_rech-dj_to"+comoie_faillass="line" namech-dj_to"+comoie_fail>{
       6f="drivers/hid/hid-logit6ch-dj67ef">m7rcv_dev-&7t;querying_ccccccccc* 4)7Datad79_ID_DJ_Shla=sedqueid-lfrom iface 2/athTame=me=enablode eys+pollode urb on eys+IN=endpo95" 3<7a>       7                 49
<7a>
"%s:"paired_dj_devparenhr" id="L465" class="line" 65"> 465<6a>paired_dj_devparenhrecv_sll_opeon(struct  467<6a>       6="drivers/hid/hid-logite6h-dj.65"sref8rcv_dev-&8t;querying_ccccccccc* >h8evreports_supp="line" name="L495"> 49
<7a>
reports_suppsev_er65" class="line"sev_er6="sref">hdev;
"%s:"paired_dj_devparenhref="+code=hdevparenh; 465pairetruc5EVL495ed ss="sref">ret   7                        7     71"sref8r2v_dev-&8t;querying_ccccccccc* 3)8483" 80rea> rivers/hid/hid-logitech-ldevrd_ href="+code=hdevrd_er6ortval" class="sref">retval);
 49
<7a>
{
hdev)8
_d8vice ==  riv8rs/hi8/hid-l hr7f="drivers/hid/hid-logit7ch-dj72D_DJ_8"6ref">_d8v;querying_ccccccccc* fu8a hre8> rivers/hid/h class="sre( 49
<7a>
 _ef="+code=hdquery_the colass=""ef">hdev);
 rivers/hid/hid-logitech-dj     6="drivers/hid/hid-logite6h-dj.65"sref8 class="s8ef">Ecase dj_receiver_de8_SHOR8reports_supp="line" name="L495"> 49
<7a>
reports_suppsev_er65" class="line"sev_er6="sref">hdev;
"%s:"paired_dj_devparenhref="+code=hdevparenh;ret   7                        7     71"sref8r9lass="s8e;querying_ccccccccc* a 8"drj_8ecv_steef"queue_notificationrefdevrd_ href="+code=hdevrd_er6ortval" class="sref">retval);
 49
<7a>
kfifo_ibreak" id="8485" 8lass="line" name="L485go na=geerervfataj_rlef="+code=hdquery_the colass=""e_fail"l5" class="line" ef="+code=hdquery_the colass=""e_fail"l>{
Ecase dj_receiver_de8_SHOR81"> 469<7a>}
r8ortid_siz8_map" class="_device8==        6        db8_hidhdev);
 485<6a>   class="sre( 49
<7a>
)8ref">dbg_hid<<<<<<<<<>);8       6    ({
<    7                        7     71NOMEM8quot;hiii8iiiiiiiiiiiiibreak" id="8485" 81 rivers/hid/h class="sre("%s:"paired_dj_devparenhr" id="L465" class="line" 65"> 465<6a>paired_dj_devparenhr_recv_sll_clos_a href="+code=="L467" class="line" name="L467"> 467<6a>       6="drivers/hid/hid-logite6h-dj.65"sref8 class="s8ef">Edefault: id="L465" 8lass=81>       6f="drivers/hid/hid-logit6ch-dj67ef">m8 class="s8ef">E class="sref">hid_r8porj_8ecv_st=geerervfataj_rlltruc_fail"l5" class="line" 6truc_fail"l>{
<    7                        7     71NOMEM8q9lass="s8ifo_i" id="L469" class="8ine" 8ame="L=geerervfataj_rech-dj_to"+comoie_faillass="line" namech-dj_to"+comoie_fail>{
<    7                        7     71NOMEM8itech-dj.8#L441lass="sref">logCMD_8ETpro820"+code=hdev" class="sre( 467<6a>       6="drivers/hid/hid-logite6h-dj.65"sref8   size" 8d="L469" class="line" na8e="L489"> 46   6="drivers/hid/hid-logite6h-dj.65"sref8 rtid_siz8 {
<    7                        7     71NOMEM8isref">db8class="line" name="L474"8 474<8a>stat=geerervfataj_repor65" c_faillass="line" namepor65" c_fail>{
<    7                        7     71NOMEM8ihdev)8l;
hdev;
);
(((8me="L396"> 396   4ec8-dech825"+code=hdev"pin_lock_irqsavkfrehid/hid-logitechkfrehf">hdev);
 rivers/hid/hid-logitech-dj     6="drivers/hid/hid-logite6h-dj.65"sref8HORT;8 467<6a>  .c#L497" id="L485NULLhref="drivers/hNULLh-dj     6="drivers/hid/hid-logite6h-dj.65"sref8Hclass="s8s="sref">logi_dj_recv_sp8ob_a 82vers/NOTIF_DE5<6a>   class="sre( 49
<7a>
E class="dqunstpsdj_8evice82>       6="drivers/hid/hid-logite6h-dj.66ct r8>dj_rep"s8ef">dj_receiver_devusb_h8eerfa83>
dj_receiver_dev 8 CONFIG_PM
logi_dvers/hid8hid-l8gitech+code=hdevj_recv_stdjesdj.jesumele=REPORT_ID_DJ_ef="+codesdj.jesume" id=ef">hdev =  465<7a>       7        kf8id="L474"8class="line" name="L474"8 474<8a>stat    7                        7     71"sref8ss="sre_d8vice ==  49
<7a>
(((8(((((NOMEMpaired_dj8devEN8DEVg">"&#_dev" class="sref">djrcv_dev)
"%sref=geerervfataj_report);
 467<6a>       6return (;8id-logitech-dj.c#L467" i8="L468DEVL495" id="L495" class="line" name="L495">T c8ass="line8 navers/hid/hid-loj.rive8s/hid8hid-logitech-dj.c#L467" id=sl="line" name="L495"> 49
<7a>
hdev);
 rivers/hid/hid-logitech-dj, 0     6="drivers/hid/hid-logite6h-dj.65"sref8aclass="s8a href="+codref"seh=fiel8=REPO83a> *reports_supp="line" name="L495"> 49
<7a>
reports_suppsev_er65" class="line"sev_er6="sref">hdev;
"%s:"paired_dj_devparenhref="+code=hdevparenh; 485<7ldevrd_ href="+code=hdevrd_ hj_re:_ef="+code=hdech-dj_to"+comoie5EVL495ed er6ortval" class="sref">retv5" id="L495" class="line" name="L495">T c8>dj_repor8-> 49
<7a>
r8ee(j.8#L485" id="L485" class="8ine" 84>static 7                 396   4ech8dech-84s(1 << (((8me="L396"> 396   4ec8-dech84a>{
logi_dj_recv_sl8_rd_ 84>       6f="drivers/hid/hid-logit6ch-dj67ef">m8 id="L4658 class="line" name="L4658> 46584>    +code=hvoidf=geerervfataj_r_ef="+codemo href="+codf_ef="_ef="+codemo h" id=ef">hdev =  465<7a>       7        kf8>dj_repor8->&q8ot;Ta>       7dj_reptv8ldj_receiver_devref=geerervfatag">"%sref=geerervfataj_report);
 467<6a>       6return (djrcv_ode=rhid/hid-logitech-dj.c#L462"sreflass="sref">djrcv_odeid/hid-logitech-dj.c#>

(j.8class="sref">logi_dj_rec8l_sto85>static 7                paired_dj_devrd_ href="+code=hdevrd_ hj_red-logitech-dj.c#L467" id="L467" class="line" name="L467"> 467<6a>       6="drivers/hid/hid-logite6h-dj.65"sref8="sref"or8 = &q8ot;Uhid-l hr7f="drivers/hid/hid-logit7ch-dj72D_DJ_8 id="L4698 class="line" name="L4698> 46985 rivers/hid/h class="sre( cancel_line_syne="sref">hdev;
);
       6f="drivers/hid/hid-logit6ch-dj67ef">m8id="L458"8class="line" name="L458"8 458<85;s: did not schedule the wore>"%s:"paired_dj_devparenhr" id="L465" class="line" 65"> 465<6a>paired_dj_devparenhr_recv_sll_clos_a href="+code=="L467" class="line" name="L467"> 467<6a>       6="drivers/hid/hid-logite6h-dj.65"sref8=dj_repor8device * 467<6a>       6="drivers/hid/hid-logite6h-dj.65"sref8itech-d."8paired_dj_devpars_a href8"+cod86>
ret   7                        7     71"sref8id="L373"8paired_dj_devrdopref="+c8de=hd86ouldacontinue its normal processid-li.eys+hdee=hdd evenh name=t   ad> 48eys+line    menh guarantee+" nef">ret   7                        7     71"sref8ie(j.8paired_dj_devopeon(s8ruct 86nge means rf odek loss/athen we mustpshave finish"libnd no mme="raw_483"> abll"> 4s shoullibr     aft65<6">ret   7                        7     71"sref8iid="L4658paired_dj_devclos_a href8"+cod86er layer /spdiscard poeentially press(1a nhimo h abll"> 4 w 48erigge corso no g=sssibre e="Laround 1a <6">ret   7                        7     71"sref8i"sref"or8paired_dj_devhladriverdr8verev86oreasslby the drive layer. Rval 4686ass="line" nane" ef">reports_suppuid/hid-logitechi>

reports_supp5">MAX_465<7ae="L465 class="line" na5">MAX_465<7ae="L465 >
="L465"INDEX_MINclass="line" na5">="L465"INDEX_MINa>     id="L495" classiid/hid-logitechi>
 465lass="sref">djrcv_odeid/hid-logitech-dj.c#>
);
 the coladj.c#L46eal;

 =odeid/hid-logitech-dj.c#>
logi_dj_recv_st8/aeve86cv_steef"queue_notificationref="+code=hdevj_-dj.c#"+coycode=rhid/hid-logitech-dj.c#"+coycode=rhf">hdev);
<=odeid/hid-logitech-dj.c#>
 462<6a>        6="drivers/hid/hid-logite6h-dj.65"sref8itech-dj.8#L441>kfifo_iiiiii"sref"8dj_re87ass="line" name="L485"> 485<7lin_lock_irqsavkfrehid/hid-logitechkfrehf">hdev);
<=odeid/hid-logitech-dj.c#>
)8
 the coladj.c#L46eal;

."8ef">dj_receiver_dev 8 48a hr7f="drivers/hid/hid-logit7ch-dj72D_DJ_8 id="L4658ef">dj_receiver_dev 8ivers87>       6    (;
;
hdev;
);
dj_repor8 = hdev);
 rivers/hid/hid-logitech-dj     6="drivers/hid/hid-logite6h-dj.65"sref8id="L458"8class="line" name="L458"8 458<87id-logitech-dj.c#L467" id=sle);
>);
 467<6a>  .c#L497" id="L485NULLhref="drivers/hNULLh-dj     6="drivers/hid/hid-logite6h-dj.65"sref8mset(8a href="+code"string">&q8ot;Wa> *       6int  " id=ef">hdev =  465<7a>   v5" id="L495" class="line" name="L495">T c8rcv_dev-&8t;querying_ccccccccc*c#L883" i88f="dr"sreref="+code=hdev"sre#lt;  488<7a>       7="drivers/hid/hid-logite7h-dj.72 clas8rcv_dev-&8t;querying_ccccccccc* 1)8Datad8houlda    7                        7     71"sref8rcv_dev-&8t;querying_ccccccccc* qu8elfro88="+code=hdev"_5" id="L495" class="l" name="L495"> 49
h-dj    6="drivers/hid/hid-logite6h-dj.65"sref8rcv_dev-&8t;querying_ccccccccc* tv8ldjrcv_ode=rhid/hid-logitech-dj.c#L462"sreflass="sref">djrcv_odeid/hid-logitech-dj.c#>
"%s:"paired_dj_devparenhrers/hiclass="line" name="L488"> 488<7a>      6="drivers/hid/hid-logite6h-dj.65"sref8rsref"> *);
<=odeid/hid-logitech-dj.c#>
 465EVL495" id="L495" class="line" name="L495"> 49
<7a>{
       6="drivers/hid/hid-logite6h-dj.66ct  49
h-djref=geerervfataj_repor65" class="line" namepor65" c" id="L467" class="line" name="L467"> 467<6a>       6="drivers/hid/hid-logite6h-dj.65"sref8rcv_dev-&8t;querying_ccccccccc* to8h="-c89dpars_lasslas"sre!evusbhla=submis="l" name="L495"> 49
h-dj    7="drivers/hid/hid-logite7h-dj.72 clas8rcv_dev-&8t;querying_ccccccccc*c#L883" i89f="dr"sreref="+code=hf">reports_supp="l" name="L495"> 49
h-djref=geerervfataj_reporhw465" class="line" nameporhw465" c" id="L467" class="line" name="L467"> 467<6a>  .c#L497" id="L485ame= class=_DEFAUL" class="line" name= class=_DEFAUL"a>       6="drivers/hid/hid-logite6h-dj.65"sref8rcv_dev-&8t;querying_ccccccccc* 3)8Datad89>       6         485<6a>   class="sre( 49
h-dj    6="drivers/hid/hid-logite6h-dj.65"sref8rcv_dev-&8t;querying_ccccccccc* to8the u89de=rea hr7f="drivers/hid/hid-logit7ch-dj72D_DJ_8rcv_dev-&8t;querying_ccccccccc* h-8eat =  _ef="+code=-logieal="L465" id="L467" class="lUSB>VENDOR_me=LOGITECH class="line" nUSB>VENDOR_me=LOGITECH>   v5" id="L495" class="line" name="L495">T c8rcv_dev-&8t;querying_ccccccccc* 4)8Datad89vers/NOTIF_DEVICE_UNPf">reports_suppUSB>="L465_me=LOGITECH_UNIFYING_RECEIVlass="line" name=USB>="L465_me=LOGITECH_UNIFYING_RECEIVlaa>   }v5" id="L495" class="line" name="L495">T c8rd="L430"8t;querying_ccccccccc* a 8air="L465" id="L467" class="lUSB>VENDOR_me=LOGITECH class="line" nUSB>VENDOR_me=LOGITECH>   v5" id="L495" class="line" name="L495">T c9rcv_dev-&9t;querying_ccccccccc* >h9evreports_suppUSB>="L465_me=LOGITECH_UNIFYING_RECEIVla_2ss="line" name=USB>="L465_me=LOGITECH_UNIFYING_RECEIVla_2a>   }v5" id="L495" class="line" name="L495">T c9rcv_dev-&9t;querying_ccccccccc*aan9thid-90f="dr"sreref={a hr7f="drivers/hid/hid-logit7ch-dj72D_DJ_9r2v_dev-&9t;querying_ccccccccc* 3)9483" 90rea> }    6="drivers/hid/hid-logite6h-dj.65"sref9id="L474"9class="line" name="L474"9 474<90>static 7                hdev)9
reports_suppMODULE>="L465_TABL5 class="line" nMODULE>="L465_TABL5" id="L467" class="lide=de <<   .c#L497" id="L485_ef="+coded-logie" name="L485"> _ef="+code=-logieal_d9vice ==  riv9rs/hi9/hid-l hr7f="drivers/hid/hid-logit7ch-dj72D_DJ_9"6ref">_d9v;querying_ccccccccc* fu9a hre906d-lo+code=hhrref="+codeode/a> = Ecase dj_receiver_de9_SHOR9retv5" id="L495" class="line" name="L495">T c9r8lass="s9e;querying_ccccccccc* 4)9_SHOR9 _ef="+code=-logiealT c9r9lass="s9e;querying_ccccccccc* a 9"drj_9ecv_steef"queu" id="L487" clas * *T c9itech-dj.9#L441>kfifo_ibreak" id="9485" 9lass="line" na" id="L487" clasdemo href="+codf_ef="demo h" idref=geerervfataj_r_ef="+codemo href="+codf_ef="_ef="+codemo h" idv5" id="L495" class="line" name="L495">T c9icv_dev-&9sf">Ecase dj_receiver_de9_SHOR91"> 469<7a>}
<" id="L487" clasdaw_483">ref="+codf_ef="daw_483">" idref=geerervfataj_r_ef="+codaw_483">ref="+codf_ef="_ef="+codaw_483">" idv5" id="L495" class="line" name="L495">T c9i2v_dev-&9_map" class="_device9==     #ifdef  class="sre( CONFIG_PM
db9_hidhdev);
 48" id="L487" clasdesdj.jesumele=REPORT_ID_DJdesdj.jesume" idref=geerervfataj_r_ef="+codesdj.jesumele=REPORT_ID_DJ_ef="+codesdj.jesume" idv5" id="L495" class="line" name="L495">T c9ihdev)9ref">dbg_hid<<<<<<<<<>);9    #endif hr7f="drivers/hid/hid-logit7ch-dj72D_DJ_9ee(((9(((((((((((((" id="L469"9class9"line"}    6="drivers/hid/hid-logite6h-dj.65"sref9quot;hiii9iiiiiiiiiiiiibreak" id="9485" 91EVL495" id="L495" class="line" name="L495">T c9 class="s9ef">Edefault: id="L465" 9lass=91>       6f="drivers/hid/hid-logit6ch-dj67ef">m9 class="s9ef">E class="sref">hid_r9porj_91>    +code=ht;  _ef="+co.c#L46eal="L465" id="L467" class="lUSB>VENDOR_me=LOGITECH class="line" nUSB>VENDOR_me=LOGITECH>   v5" id="L495" class="line" name="L495">T c9itech-dj.9#L441lass="sref">logCMD_9ETpro92ass="line" name="L485f">reports_suppUSB>="L465_me=LOGITECH_UNIFYING_RECEIVlass="line" name=USB>="L465_me=LOGITECH_UNIFYING_RECEIVlaa>   }v5" id="L495" class="line" name="L495">T c9   size" 9d="L469" class="line" na9e="L4921s: did not s{#L497" id="L485ame=USB>="L465 class="line" name=USB>="L465" id="L467" class="lUSB>VENDOR_me=LOGITECH class="line" nUSB>VENDOR_me=LOGITECH>   v5" id="L495" class="line" name="L495">T c9i2v_dev-&9  rivers/hid/hid-lf">reports_suppUSB>="L465_me=LOGITECH_UNIFYING_RECEIVla_2ss="line" name=USB>="L465_me=LOGITECH_UNIFYING_RECEIVla_2a>   }v5" id="L495" class="line" name="L495">T c9isref">db9class="line" name="L474"9 474<92me="L485"> 48{a hr7f="drivers/hid/hid-logit7ch-dj72D_DJ_9ihdev)9l;
(((9me="L396"> 396   4ec9-dech92hid-l hr7f="drivers/hid/hid-logit7ch-dj72D_DJ_9HORT;9 = logi_dj_recv_sp9ob_a 92vers/NOTIF_DE" id="L487" clasiverlockref="+code="ame" idref=devrd_ href="+code=hdevrd_  7     71"ass=""ss="sref">retv5" id="L495" class="line" name="L495">T c9 class="s9ef">E class="dqunstpsdj_9evice92vers/NOTIF_DE" id="L487" clas hrtabl * _ef="+co.c#L46ealT c9 9lass="s9 class="line" name="L4659> 46592cv_steef"queu" id="L487" clas * *T c9>dj_rep"s9ef">dj_receiver_devusb_h9eerfa93>
dj_receiver_dev 9 46   6="drivers/hid/hid-logite6h-dj.65"sref9 rtid_siz9ss="sref">logi_dvers/hid9hid-l93>       6        stat+code=hdevj_recv_st == (((9(((((NOMEMpaired_dj9devEN9DEVg">"&#_5" id="L495" class="line" name="L495"> 49
<7a>
;9id-logitech-dj.c#L467" i9="L469DEVL495" id="L495" class="line" name="L495">T c9ass="line9 navers/hid/hid-loj.rive9s/hid9hid-logitech-dj.c#L467" id=sll_rd_ href="+code=hdev1">paired_dj_devrd_ href="+code=hdevrd_Lame="L49DJ: hj_red-logitech-dj.c#L467" id="L467" class="line" name="L467"> 467<6a>       6="drivers/hid/hid-logite6h-dj.65"sref9aclass="s9a href="+codref"seh=fiel9=REPO93>       6="drivers/hid/hid-logite6h-dj.66ct  49
<7a>
hdev;
reports_supp="line" name="L495"> 49
<7a>
 49
<7a>
       6        (j.9#L485" id="L485" class="9ine" 94="+code=hdev" class="sre( 49
<7a>
hdev;
 396   4ech9dech-94s(1 << "sref">reports_supp="line" name="L495"> 49
<7a>
 396   4ec9-dech94EVg">"%sENODf">reports_suppe=hrunregistgite="L465" class="line"e=hrunregistgite="L46ed_djf">hdev;
;9T c9Hss="line9s="sref">logi_dj_recv_sl9_rd_ 94vers/NOTIF_DE5<6a>   class="sre( 49
<7a>
dj_repor9->&q9ot;^a>   a hr7f="drivers/hid/hid-logit7ch-dj72ef">r9>dj_reptv9l
(j.9class="sref">logi_dj_rec9l_sto95="+code=hdev" class="sre(paired_dj_devrd_ href="+code=hdevrd_Lame="L49DJ: hj_red-logitech-dj.c#L467" id="L467" class="line" name="L467"> 467<6a>       6="drivers/hid/hid-logite6h-dj.65"sref9 id="L4659 class="line" name="L4659> 46595>       6    ( = &q9ot;λ"+code=hdev"pin_lock_irqsave=hrunregistgite="L465" class="line"e=hrunregistgite="L46ed_djf">hdev;
hdev;
       6f="drivers/hid/hid-logit6ch-dj67ef">m9id="L458"9class="line" name="L458"9 458<95a> *
;
;
LICENS5ed_dj_devrd_ href="+code=hdevrd_GPLlogitech-dj.c     6="drivers/hid/hid-logite6h-dj.65"sref9ie(j.9paired_dj_devopeon(s9ruct 96>stat=geerervfataj_rMODULE>AUTHOass="line" name=MODULE>AUTHOaed_dj_devrd_ href="+code=hdevrd_Lame="L4logitech-dj.c     6="drivers/hid/hid-logite6h-dj.65"sref9iid="L4659paired_dj_devclos_a href9"+cod96="+cof">reports_suppMODULE>AUTHOass="line" name=MODULE>AUTHOaed_dj_devrd_ href="+code=hdevrd_Nestor Lopez Casadologitech-dj.c     6="drivers/hid/hid-logite6h-dj.65"sref9i"sref"or9paired_dj_devhladriverdr9verev96line"=geerervfataj_rMODULE>AUTHOass="line" name=MODULE>AUTHOaed_dj_devrd_ href="+code=hdevrd_n6truzcasad@te6h-dj..comlogitech-dj.c     6="drivers/hid/hid-logite6h-dj.65"sref9iid="L4699" class="line" name="L469"> 4696ass="


Tys+original LXR softwbre by(1a n 6="drivhttp://sourceforge.net/projects/lxi">LXR e launivya> .cname=experiayeral /hidion by( 6="drivmailto:lxi@ne"ux.no="_xi@ne"ux.noa> .
_xi.ne"ux.no kindly hostgd by( 6="drivhttp://www.redpill-ne"pro.no="Redpill Le"pro ASa> .cprovider of Le"uxht;