This patch allows HIDIOCGREPORT and HIDIOCSREPORT to return a more
meaningful result. I did this while playing with my new monitor because
HIDIOCSREPORT doesn't seem to do anything and I was suspecting that it
didn't return the proper error code, but it turns out that there is no
error so I guess that talking to the monitor requires some black magic.

Is there a chance that this is useful and correct? At least it doesn't
break anything, AFAIK.

Please CC me, I'm not on linux-usb-devel.

diff -ur linux-2.4.17/drivers/usb/hid-core.c 
linux-2.4.17-hidpatch/drivers/usb/hid-core.c
--- linux-2.4.17/drivers/usb/hid-core.c Fri Dec 21 18:41:55 2001
+++ linux-2.4.17-hidpatch/drivers/usb/hid-core.c        Sat Dec 22 10:17:32 2001
@@ -891,7 +891,7 @@
  * hid_read_report() reads in report values without waiting for an irq urb.
  */
 
-void hid_read_report(struct hid_device *hid, struct hid_report *report)
+int hid_read_report(struct hid_device *hid, struct hid_report *report)
 {
        int len = ((report->size - 1) >> 3) + 1 + 
hid->report_enum[report->type].numbered;
        u8 data[len];
@@ -899,10 +899,10 @@
 
        if ((read = usb_get_report(hid->dev, hid->ifnum, report->type + 1, report->id, 
data, len)) != len) {
                dbg("reading report type %d id %d failed len %d read %d", report->type 
+ 1, report->id, len, read);
-               return;
+               return -1;
        }
 
-       hid_input_report(report->type, data, len, hid);
+       return hid_input_report(report->type, data, len, hid);
 }
 
 /*
@@ -987,17 +987,18 @@
 
 static int hid_submit_out(struct hid_device *hid)
 {
+       int result;
+
        hid->urbout.transfer_buffer_length = 
le16_to_cpup(&hid->out[hid->outtail].dr.length);
        hid->urbout.transfer_buffer = hid->out[hid->outtail].buffer;
        hid->urbout.setup_packet = (void *) &(hid->out[hid->outtail].dr);
        hid->urbout.dev = hid->dev;
 
-       if (usb_submit_urb(&hid->urbout)) {
-               err("usb_submit_urb(out) failed");
-               return -1;
-       }
+       result = usb_submit_urb(&hid->urbout);
+       if (result)
+               err("usb_submit_urb(out) failed (%d)", result);
 
-       return 0;
+       return result;
 }
 
 static void hid_ctrl(struct urb *urb)
@@ -1013,7 +1014,7 @@
                hid_submit_out(hid);
 }
 
-void hid_write_report(struct hid_device *hid, struct hid_report *report)
+int hid_write_report(struct hid_device *hid, struct hid_report *report)
 {
        hid_output_report(report, hid->out[hid->outhead].buffer);
 
@@ -1026,7 +1027,9 @@
                hid->outtail = (hid->outtail + 1) & (HID_CONTROL_FIFO_SIZE - 1);
 
        if (hid->urbout.status != -EINPROGRESS)
-               hid_submit_out(hid);
+               return hid_submit_out(hid);
+       else
+               return 0;
 }
 
 int hid_open(struct hid_device *hid)
diff -ur linux-2.4.17/drivers/usb/hid-input.c 
linux-2.4.17-hidpatch/drivers/usb/hid-input.c
--- linux-2.4.17/drivers/usb/hid-input.c        Sun Nov 11 19:09:37 2001
+++ linux-2.4.17-hidpatch/drivers/usb/hid-input.c       Sat Dec 22 10:17:32 2001
@@ -353,9 +353,8 @@
        }
 
        hid_set_field(field, offset, value);
-       hid_write_report(hid, field->report);
 
-       return 0;
+       return hid_write_report(hid, field->report);
 }
 
 static int hidinput_open(struct input_dev *dev)
diff -ur linux-2.4.17/drivers/usb/hid.h linux-2.4.17-hidpatch/drivers/usb/hid.h
--- linux-2.4.17/drivers/usb/hid.h      Wed Dec 26 19:12:03 2001
+++ linux-2.4.17-hidpatch/drivers/usb/hid.h     Sat Dec 22 10:28:42 2001
@@ -369,6 +369,6 @@
 void hid_close(struct hid_device *);
 int hid_find_field(struct hid_device *, unsigned int, unsigned int, struct hid_field 
**);
 int hid_set_field(struct hid_field *, unsigned, __s32);
-void hid_write_report(struct hid_device *, struct hid_report *);
-void hid_read_report(struct hid_device *, struct hid_report *);
+int hid_write_report(struct hid_device *, struct hid_report *);
+int hid_read_report(struct hid_device *, struct hid_report *);
 void hid_init_reports(struct hid_device *hid);
diff -ur linux-2.4.17/drivers/usb/hiddev.c linux-2.4.17-hidpatch/drivers/usb/hiddev.c
--- linux-2.4.17/drivers/usb/hiddev.c   Sun Oct 21 04:13:11 2001
+++ linux-2.4.17-hidpatch/drivers/usb/hiddev.c  Sat Dec 22 10:17:32 2001
@@ -402,9 +402,7 @@
                if ((report = hiddev_lookup_report(hid, &rinfo)) == NULL)
                        return -EINVAL;
 
-               hid_read_report(hid, report);
-
-               return 0;
+               return hid_read_report(hid, report);
 
        case HIDIOCSREPORT:
                if (copy_from_user(&rinfo, (void *) arg, sizeof(rinfo)))
@@ -416,9 +414,7 @@
                if ((report = hiddev_lookup_report(hid, &rinfo)) == NULL)
                        return -EINVAL;
 
-               hid_write_report(hid, report);
-
-               return 0;
+               return hid_write_report(hid, report);
 
        case HIDIOCGREPORTINFO:
                if (copy_from_user(&rinfo, (void *) arg, sizeof(rinfo)))

-- 
Ciao,
    Flavio Stanchina
    Trento - Italy

"The best defense against logic is ignorance."
http://spazioweb.inwind.it/fstanchina/


_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to