aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Tissoires <benjamin.tissoires@redhat.com>2014-08-22 16:16:06 -0400
committerJiri Kosina <jkosina@suse.cz>2014-08-27 17:04:21 -0400
commit368d4e59b002d0742fc7c25de8fd7b6ad37a434c (patch)
tree1d80639e58015de09975a598d6dc66636c0cbac3
parentff0c57ac70434bc936cb0110eaf033a0a1a62e52 (diff)
HID: logitech-dj: break out testing of validity of dj_device
We can do once the test of the validity of the dj_device, which removes some duplicated code in various functions. Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
-rw-r--r--drivers/hid/hid-logitech-dj.c35
1 files changed, 11 insertions, 24 deletions
diff --git a/drivers/hid/hid-logitech-dj.c b/drivers/hid/hid-logitech-dj.c
index 9bf8637747a5..71f569292cab 100644
--- a/drivers/hid/hid-logitech-dj.c
+++ b/drivers/hid/hid-logitech-dj.c
@@ -385,18 +385,6 @@ static void logi_dj_recv_forward_null_report(struct dj_receiver_dev *djrcv_dev,
385 385
386 djdev = djrcv_dev->paired_dj_devices[dj_report->device_index]; 386 djdev = djrcv_dev->paired_dj_devices[dj_report->device_index];
387 387
388 if (!djdev) {
389 dbg_hid("djrcv_dev->paired_dj_devices[dj_report->device_index]"
390 " is NULL, index %d\n", dj_report->device_index);
391 kfifo_in(&djrcv_dev->notif_fifo, dj_report, sizeof(struct dj_report));
392
393 if (schedule_work(&djrcv_dev->work) == 0) {
394 dbg_hid("%s: did not schedule the work item, was already "
395 "queued\n", __func__);
396 }
397 return;
398 }
399
400 memset(reportbuffer, 0, sizeof(reportbuffer)); 388 memset(reportbuffer, 0, sizeof(reportbuffer));
401 389
402 for (i = 0; i < NUMBER_OF_HID_REPORTS; i++) { 390 for (i = 0; i < NUMBER_OF_HID_REPORTS; i++) {
@@ -421,18 +409,6 @@ static void logi_dj_recv_forward_report(struct dj_receiver_dev *djrcv_dev,
421 409
422 dj_device = djrcv_dev->paired_dj_devices[dj_report->device_index]; 410 dj_device = djrcv_dev->paired_dj_devices[dj_report->device_index];
423 411
424 if (dj_device == NULL) {
425 dbg_hid("djrcv_dev->paired_dj_devices[dj_report->device_index]"
426 " is NULL, index %d\n", dj_report->device_index);
427 kfifo_in(&djrcv_dev->notif_fifo, dj_report, sizeof(struct dj_report));
428
429 if (schedule_work(&djrcv_dev->work) == 0) {
430 dbg_hid("%s: did not schedule the work item, was already "
431 "queued\n", __func__);
432 }
433 return;
434 }
435
436 if ((dj_report->report_type > ARRAY_SIZE(hid_reportid_size_map) - 1) || 412 if ((dj_report->report_type > ARRAY_SIZE(hid_reportid_size_map) - 1) ||
437 (hid_reportid_size_map[dj_report->report_type] == 0)) { 413 (hid_reportid_size_map[dj_report->report_type] == 0)) {
438 dbg_hid("invalid report type:%x\n", dj_report->report_type); 414 dbg_hid("invalid report type:%x\n", dj_report->report_type);
@@ -701,8 +677,17 @@ static int logi_dj_raw_event(struct hid_device *hdev,
701 } 677 }
702 678
703 spin_lock_irqsave(&djrcv_dev->lock, flags); 679 spin_lock_irqsave(&djrcv_dev->lock, flags);
680
681 if (!djrcv_dev->paired_dj_devices[dj_report->device_index]) {
682 /* received an event for an unknown device, bail out */
683 logi_dj_recv_queue_notification(djrcv_dev, dj_report);
684 goto out;
685 }
686
704 switch (dj_report->report_type) { 687 switch (dj_report->report_type) {
705 case REPORT_TYPE_NOTIF_DEVICE_PAIRED: 688 case REPORT_TYPE_NOTIF_DEVICE_PAIRED:
689 /* pairing notifications are handled above the switch */
690 break;
706 case REPORT_TYPE_NOTIF_DEVICE_UNPAIRED: 691 case REPORT_TYPE_NOTIF_DEVICE_UNPAIRED:
707 logi_dj_recv_queue_notification(djrcv_dev, dj_report); 692 logi_dj_recv_queue_notification(djrcv_dev, dj_report);
708 break; 693 break;
@@ -715,6 +700,8 @@ static int logi_dj_raw_event(struct hid_device *hdev,
715 default: 700 default:
716 logi_dj_recv_forward_report(djrcv_dev, dj_report); 701 logi_dj_recv_forward_report(djrcv_dev, dj_report);
717 } 702 }
703
704out:
718 spin_unlock_irqrestore(&djrcv_dev->lock, flags); 705 spin_unlock_irqrestore(&djrcv_dev->lock, flags);
719 706
720 return true; 707 return true;