diff options
Diffstat (limited to 'drivers/hid/hid-logitech-dj.c')
-rw-r--r-- | drivers/hid/hid-logitech-dj.c | 43 |
1 files changed, 25 insertions, 18 deletions
diff --git a/drivers/hid/hid-logitech-dj.c b/drivers/hid/hid-logitech-dj.c index b7ba82960c79..9bf8637747a5 100644 --- a/drivers/hid/hid-logitech-dj.c +++ b/drivers/hid/hid-logitech-dj.c | |||
@@ -656,7 +656,6 @@ static int logi_dj_raw_event(struct hid_device *hdev, | |||
656 | struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); | 656 | struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); |
657 | struct dj_report *dj_report = (struct dj_report *) data; | 657 | struct dj_report *dj_report = (struct dj_report *) data; |
658 | unsigned long flags; | 658 | unsigned long flags; |
659 | bool report_processed = false; | ||
660 | 659 | ||
661 | dbg_hid("%s, size:%d\n", __func__, size); | 660 | dbg_hid("%s, size:%d\n", __func__, size); |
662 | 661 | ||
@@ -683,34 +682,42 @@ static int logi_dj_raw_event(struct hid_device *hdev, | |||
683 | * device (via hid_input_report() ) and return 1 so hid-core does not do | 682 | * device (via hid_input_report() ) and return 1 so hid-core does not do |
684 | * anything else with it. | 683 | * anything else with it. |
685 | */ | 684 | */ |
685 | |||
686 | /* case 1) */ | ||
687 | if (data[0] != REPORT_ID_DJ_SHORT) | ||
688 | return false; | ||
689 | |||
686 | if ((dj_report->device_index < DJ_DEVICE_INDEX_MIN) || | 690 | if ((dj_report->device_index < DJ_DEVICE_INDEX_MIN) || |
687 | (dj_report->device_index > DJ_DEVICE_INDEX_MAX)) { | 691 | (dj_report->device_index > DJ_DEVICE_INDEX_MAX)) { |
688 | dev_err(&hdev->dev, "%s: invalid device index:%d\n", | 692 | /* |
693 | * Device index is wrong, bail out. | ||
694 | * This driver can ignore safely the receiver notifications, | ||
695 | * so ignore those reports too. | ||
696 | */ | ||
697 | if (dj_report->device_index != DJ_RECEIVER_INDEX) | ||
698 | dev_err(&hdev->dev, "%s: invalid device index:%d\n", | ||
689 | __func__, dj_report->device_index); | 699 | __func__, dj_report->device_index); |
690 | return false; | 700 | return false; |
691 | } | 701 | } |
692 | 702 | ||
693 | spin_lock_irqsave(&djrcv_dev->lock, flags); | 703 | spin_lock_irqsave(&djrcv_dev->lock, flags); |
694 | if (dj_report->report_id == REPORT_ID_DJ_SHORT) { | 704 | switch (dj_report->report_type) { |
695 | switch (dj_report->report_type) { | 705 | case REPORT_TYPE_NOTIF_DEVICE_PAIRED: |
696 | case REPORT_TYPE_NOTIF_DEVICE_PAIRED: | 706 | case REPORT_TYPE_NOTIF_DEVICE_UNPAIRED: |
697 | case REPORT_TYPE_NOTIF_DEVICE_UNPAIRED: | 707 | logi_dj_recv_queue_notification(djrcv_dev, dj_report); |
698 | logi_dj_recv_queue_notification(djrcv_dev, dj_report); | 708 | break; |
699 | break; | 709 | case REPORT_TYPE_NOTIF_CONNECTION_STATUS: |
700 | case REPORT_TYPE_NOTIF_CONNECTION_STATUS: | 710 | if (dj_report->report_params[CONNECTION_STATUS_PARAM_STATUS] == |
701 | if (dj_report->report_params[CONNECTION_STATUS_PARAM_STATUS] == | 711 | STATUS_LINKLOSS) { |
702 | STATUS_LINKLOSS) { | 712 | logi_dj_recv_forward_null_report(djrcv_dev, dj_report); |
703 | logi_dj_recv_forward_null_report(djrcv_dev, dj_report); | ||
704 | } | ||
705 | break; | ||
706 | default: | ||
707 | logi_dj_recv_forward_report(djrcv_dev, dj_report); | ||
708 | } | 713 | } |
709 | report_processed = true; | 714 | break; |
715 | default: | ||
716 | logi_dj_recv_forward_report(djrcv_dev, dj_report); | ||
710 | } | 717 | } |
711 | spin_unlock_irqrestore(&djrcv_dev->lock, flags); | 718 | spin_unlock_irqrestore(&djrcv_dev->lock, flags); |
712 | 719 | ||
713 | return report_processed; | 720 | return true; |
714 | } | 721 | } |
715 | 722 | ||
716 | static int logi_dj_probe(struct hid_device *hdev, | 723 | static int logi_dj_probe(struct hid_device *hdev, |