diff options
Diffstat (limited to 'drivers/media/usb/dvb-usb/gp8psk.c')
| -rw-r--r-- | drivers/media/usb/dvb-usb/gp8psk.c | 25 |
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 | ||
| 25 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); | 25 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); |
| 26 | 26 | ||
| 27 | struct gp8psk_state { | ||
| 28 | unsigned char data[80]; | ||
| 29 | }; | ||
| 30 | |||
| 27 | static int gp8psk_get_fw_version(struct dvb_usb_device *d, u8 *fw_vers) | 31 | static 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 | ||
| 54 | int gp8psk_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8 *b, int blen) | 58 | int 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 | |||
| 86 | int gp8psk_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value, | 95 | int 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 | { |
