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