aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/usb/dvb-usb/gp8psk.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/usb/dvb-usb/gp8psk.c')
-rw-r--r--drivers/media/usb/dvb-usb/gp8psk.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/drivers/media/usb/dvb-usb/gp8psk.c b/drivers/media/usb/dvb-usb/gp8psk.c
index 5d0384dd45b5..adfd76491451 100644
--- a/drivers/media/usb/dvb-usb/gp8psk.c
+++ b/drivers/media/usb/dvb-usb/gp8psk.c
@@ -24,6 +24,10 @@ MODULE_PARM_DESC(debug, "set debugging level (1=info,xfer=2,rc=4 (or-able))." DV
24 24
25DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); 25DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
26 26
27struct gp8psk_state {
28 unsigned char data[80];
29};
30
27static int gp8psk_get_fw_version(struct dvb_usb_device *d, u8 *fw_vers) 31static int gp8psk_get_fw_version(struct dvb_usb_device *d, u8 *fw_vers)
28{ 32{
29 return (gp8psk_usb_in_op(d, GET_FW_VERS, 0, 0, fw_vers, 6)); 33 return (gp8psk_usb_in_op(d, GET_FW_VERS, 0, 0, fw_vers, 6));
@@ -53,17 +57,22 @@ static void gp8psk_info(struct dvb_usb_device *d)
53 57
54int gp8psk_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8 *b, int blen) 58int gp8psk_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8 *b, int blen)
55{ 59{
60 struct gp8psk_state *st = d->priv;
56 int ret = 0,try = 0; 61 int ret = 0,try = 0;
57 62
63 if (blen > sizeof(st->data))
64 return -EIO;
65
58 if ((ret = mutex_lock_interruptible(&d->usb_mutex))) 66 if ((ret = mutex_lock_interruptible(&d->usb_mutex)))
59 return ret; 67 return ret;
60 68
61 while (ret >= 0 && ret != blen && try < 3) { 69 while (ret >= 0 && ret != blen && try < 3) {
70 memcpy(st->data, b, blen);
62 ret = usb_control_msg(d->udev, 71 ret = usb_control_msg(d->udev,
63 usb_rcvctrlpipe(d->udev,0), 72 usb_rcvctrlpipe(d->udev,0),
64 req, 73 req,
65 USB_TYPE_VENDOR | USB_DIR_IN, 74 USB_TYPE_VENDOR | USB_DIR_IN,
66 value,index,b,blen, 75 value, index, st->data, blen,
67 2000); 76 2000);
68 deb_info("reading number %d (ret: %d)\n",try,ret); 77 deb_info("reading number %d (ret: %d)\n",try,ret);
69 try++; 78 try++;
@@ -86,19 +95,24 @@ int gp8psk_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8
86int gp8psk_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value, 95int gp8psk_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value,
87 u16 index, u8 *b, int blen) 96 u16 index, u8 *b, int blen)
88{ 97{
98 struct gp8psk_state *st = d->priv;
89 int ret; 99 int ret;
90 100
91 deb_xfer("out: req. %x, val: %x, ind: %x, buffer: ",req,value,index); 101 deb_xfer("out: req. %x, val: %x, ind: %x, buffer: ",req,value,index);
92 debug_dump(b,blen,deb_xfer); 102 debug_dump(b,blen,deb_xfer);
93 103
104 if (blen > sizeof(st->data))
105 return -EIO;
106
94 if ((ret = mutex_lock_interruptible(&d->usb_mutex))) 107 if ((ret = mutex_lock_interruptible(&d->usb_mutex)))
95 return ret; 108 return ret;
96 109
110 memcpy(st->data, b, blen);
97 if (usb_control_msg(d->udev, 111 if (usb_control_msg(d->udev,
98 usb_sndctrlpipe(d->udev,0), 112 usb_sndctrlpipe(d->udev,0),
99 req, 113 req,
100 USB_TYPE_VENDOR | USB_DIR_OUT, 114 USB_TYPE_VENDOR | USB_DIR_OUT,
101 value,index,b,blen, 115 value, index, st->data, blen,
102 2000) != blen) { 116 2000) != blen) {
103 warn("usb out operation failed."); 117 warn("usb out operation failed.");
104 ret = -EIO; 118 ret = -EIO;
@@ -143,6 +157,11 @@ static int gp8psk_load_bcm4500fw(struct dvb_usb_device *d)
143 err("failed to load bcm4500 firmware."); 157 err("failed to load bcm4500 firmware.");
144 goto out_free; 158 goto out_free;
145 } 159 }
160 if (buflen > 64) {
161 err("firmare chunk size bigger than 64 bytes.");
162 goto out_free;
163 }
164
146 memcpy(buf, ptr, buflen); 165 memcpy(buf, ptr, buflen);
147 if (dvb_usb_generic_write(d, buf, buflen)) { 166 if (dvb_usb_generic_write(d, buf, buflen)) {
148 err("failed to load bcm4500 firmware."); 167 err("failed to load bcm4500 firmware.");
@@ -265,6 +284,8 @@ static struct dvb_usb_device_properties gp8psk_properties = {
265 .usb_ctrl = CYPRESS_FX2, 284 .usb_ctrl = CYPRESS_FX2,
266 .firmware = "dvb-usb-gp8psk-01.fw", 285 .firmware = "dvb-usb-gp8psk-01.fw",
267 286
287 .size_of_priv = sizeof(struct gp8psk_state),
288
268 .num_adapters = 1, 289 .num_adapters = 1,
269 .adapter = { 290 .adapter = {
270 { 291 {