static int vp702x_usb_inout_cmd(struct dvb_usb_device *d, u8 cmd, u8 *o, int olen, u8 *i, int ilen, int msec) { u8 bout[olen+2]; u8 bin[ilen+1]; int ret = 0; bout[0] = 0x00; bout[1] = cmd; memcpy(&bout[2],o,olen); ret = vp702x_usb_inout_op(d, bout, olen+2, bin, ilen+1,msec); if (ret == 0) memcpy(i,&bin[1],ilen); return ret; }
static int vp702x_usb_inout_cmd(struct dvb_usb_device *d, u8 cmd, u8 *o, int olen, u8 *i, int ilen, int msec) { struct vp702x_device_state *st = d->priv; int ret = 0; u8 *buf; int buflen = max(olen + 2, ilen + 1); ret = mutex_lock_interruptible(&st->buf_mutex); if (ret < 0) return ret; if (buflen > st->buf_len) { buf = kmalloc(buflen, GFP_KERNEL); if (!buf) { mutex_unlock(&st->buf_mutex); return -ENOMEM; } info("successfully reallocated a bigger buffer"); kfree(st->buf); st->buf = buf; st->buf_len = buflen; } else { buf = st->buf; } buf[0] = 0x00; buf[1] = cmd; memcpy(&buf[2], o, olen); ret = vp702x_usb_inout_op(d, buf, olen+2, buf, ilen+1, msec); if (ret == 0) memcpy(i, &buf[1], ilen); mutex_unlock(&st->buf_mutex); return ret; }