From: Vojtech P. <vo...@us...> - 2002-01-28 16:24:25
|
Update of /cvsroot/linuxconsole/ruby/linux/drivers/usb In directory usw-pr-cvs1:/tmp/cvs-serv20736 Modified Files: hid-core.c Log Message: Make sure the report descriptor is always in DMA-able memory. Index: hid-core.c =================================================================== RCS file: /cvsroot/linuxconsole/ruby/linux/drivers/usb/hid-core.c,v retrieving revision 1.42 retrieving revision 1.43 diff -u -d -r1.42 -r1.43 --- hid-core.c 2002/01/27 00:22:46 1.42 +++ hid-core.c 2002/01/28 16:24:20 1.43 @@ -1256,6 +1256,7 @@ struct hid_descriptor *hdesc; struct hid_device *hid; unsigned rsize = 0; + u8 *rdesc; char *buf; int n; @@ -1278,26 +1279,31 @@ return NULL; } - { - __u8 rdesc[rsize]; + if (!(rdesc = kmalloc(rsize, GFP_KERNEL))) { + dbg("couldn't allocate rdesc memory"); + return NULL; + } - if ((n = hid_get_class_descriptor(dev, interface->bInterfaceNumber, HID_DT_REPORT, rdesc, rsize)) < 0) { - dbg("reading report descriptor failed"); - return NULL; - } + if ((n = hid_get_class_descriptor(dev, interface->bInterfaceNumber, HID_DT_REPORT, rdesc, rsize)) < 0) { + dbg("reading report descriptor failed"); + kfree(rdesc); + return NULL; + } #ifdef DEBUG_DATA - printk(KERN_DEBUG __FILE__ ": report descriptor (size %u, read %d) = ", rsize, n); - for (n = 0; n < rsize; n++) - printk(" %02x", (unsigned) rdesc[n]); - printk("\n"); + printk(KERN_DEBUG __FILE__ ": report descriptor (size %u, read %d) = ", rsize, n); + for (n = 0; n < rsize; n++) + printk(" %02x", (unsigned) rdesc[n]); + printk("\n"); #endif - if (!(hid = hid_parse_report(rdesc, rsize))) { - dbg("parsing report descriptor failed"); - return NULL; - } + if (!(hid = hid_parse_report(rdesc, rsize))) { + dbg("parsing report descriptor failed"); + kfree(rdesc); + return NULL; } + + kfree(rdesc); for (n = 0; n < interface->bNumEndpoints; n++) { |