]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
Bluetooth: hidp: Fix assumptions on the return value of hidp_send_message
authorDan Elkouby <streetwalkermc@gmail.com>
Tue, 29 Oct 2019 16:25:55 +0000 (09:25 -0700)
committerStefan Bader <stefan.bader@canonical.com>
Tue, 12 Nov 2019 17:47:03 +0000 (18:47 +0100)
BugLink: https://bugs.launchpad.net/bugs/1850443
hidp_send_message was changed to return non-zero values on success,
which some other bits did not expect. This caused spurious errors to be
propagated through the stack, breaking some drivers, such as hid-sony
for the Dualshock 4 in Bluetooth mode.

As pointed out by Dan Carpenter, hid-microsoft directly relied on that
assumption as well.

Fixes: 48d9cc9d85dd ("Bluetooth: hidp: Let hidp_send_message return number of queued bytes")
Signed-off-by: Dan Elkouby <streetwalkermc@gmail.com>
Reviewed-by: Dan Carpenter <dan.carpenter@oracle.com>
Reviewed-by: Jiri Kosina <jkosina@suse.cz>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
(cherry picked from commit 8bb3537095f107ed55ad51f6241165b397aaafac)
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Acked-by: Connor Kuehl <connor.kuehl@canonical.com>
Acked-by: Stefan Bader <stefan.bader@canonical.com>
Signed-off-by: Khalid Elmously <khalid.elmously@canonical.com>
drivers/hid/hid-microsoft.c
net/bluetooth/hidp/core.c

index 8b3a922bdad3415e8831e83901fa2fd81426f40e..2cf83856f2e41c7e6c1456224988eaaa6a370e0f 100644 (file)
@@ -303,7 +303,7 @@ static void ms_ff_worker(struct work_struct *work)
        r->magnitude[MAGNITUDE_WEAK] = ms->weak;     /* right actuator */
 
        ret = hid_hw_output_report(hdev, (__u8 *)r, sizeof(*r));
-       if (ret)
+       if (ret < 0)
                hid_warn(hdev, "failed to send FF report\n");
 }
 
index 8d889969ae7edaf2acf653098aaae0d98618776b..bef84b95e2c4704f14351570a8683b6aab688592 100644 (file)
@@ -267,7 +267,7 @@ static int hidp_get_raw_report(struct hid_device *hid,
        set_bit(HIDP_WAITING_FOR_RETURN, &session->flags);
        data[0] = report_number;
        ret = hidp_send_ctrl_message(session, report_type, data, 1);
-       if (ret)
+       if (ret < 0)
                goto err;
 
        /* Wait for the return of the report. The returned report
@@ -343,7 +343,7 @@ static int hidp_set_raw_report(struct hid_device *hid, unsigned char reportnum,
        data[0] = reportnum;
        set_bit(HIDP_WAITING_FOR_SEND_ACK, &session->flags);
        ret = hidp_send_ctrl_message(session, report_type, data, count);
-       if (ret)
+       if (ret < 0)
                goto err;
 
        /* Wait for the ACK from the device. */