|
@@ -1901,19 +1901,30 @@ static long s2255_vendor_req(struct s2255_dev *dev, unsigned char Request,
|
|
|
s32 TransferBufferLength, int bOut)
|
|
|
{
|
|
|
int r;
|
|
|
+ unsigned char *buf;
|
|
|
+
|
|
|
+ buf = kmalloc(TransferBufferLength, GFP_KERNEL);
|
|
|
+ if (!buf)
|
|
|
+ return -ENOMEM;
|
|
|
+
|
|
|
if (!bOut) {
|
|
|
r = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0),
|
|
|
Request,
|
|
|
USB_TYPE_VENDOR | USB_RECIP_DEVICE |
|
|
|
USB_DIR_IN,
|
|
|
- Value, Index, TransferBuffer,
|
|
|
+ Value, Index, buf,
|
|
|
TransferBufferLength, HZ * 5);
|
|
|
+
|
|
|
+ if (r >= 0)
|
|
|
+ memcpy(TransferBuffer, buf, TransferBufferLength);
|
|
|
} else {
|
|
|
+ memcpy(buf, TransferBuffer, TransferBufferLength);
|
|
|
r = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0),
|
|
|
Request, USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
|
|
- Value, Index, TransferBuffer,
|
|
|
+ Value, Index, buf,
|
|
|
TransferBufferLength, HZ * 5);
|
|
|
}
|
|
|
+ kfree(buf);
|
|
|
return r;
|
|
|
}
|
|
|
|