diff options
Diffstat (limited to 'drivers/media/dvb/b2c2/flexcop-usb.c')
-rw-r--r-- | drivers/media/dvb/b2c2/flexcop-usb.c | 47 |
1 files changed, 46 insertions, 1 deletions
diff --git a/drivers/media/dvb/b2c2/flexcop-usb.c b/drivers/media/dvb/b2c2/flexcop-usb.c index 5fa68febf3a6..98470ce9a054 100644 --- a/drivers/media/dvb/b2c2/flexcop-usb.c +++ b/drivers/media/dvb/b2c2/flexcop-usb.c | |||
@@ -282,6 +282,51 @@ static int flexcop_usb_i2c_request(struct flexcop_device *fc, flexcop_access_op_ | |||
282 | return flexcop_usb_i2c_req(fc->bus_specific,B2C2_USB_I2C_REQUEST,USB_FUNC_I2C_WRITE,port,chipaddr,addr,buf,len); | 282 | return flexcop_usb_i2c_req(fc->bus_specific,B2C2_USB_I2C_REQUEST,USB_FUNC_I2C_WRITE,port,chipaddr,addr,buf,len); |
283 | } | 283 | } |
284 | 284 | ||
285 | static void flexcop_usb_process_frame(struct flexcop_usb *fc_usb, u8 *buffer, int buffer_length) | ||
286 | { | ||
287 | u8 *b; | ||
288 | int l; | ||
289 | |||
290 | deb_ts("tmp_buffer_length=%d, buffer_length=%d\n", fc_usb->tmp_buffer_length, buffer_length); | ||
291 | |||
292 | if (fc_usb->tmp_buffer_length > 0) { | ||
293 | memcpy(fc_usb->tmp_buffer+fc_usb->tmp_buffer_length, buffer, buffer_length); | ||
294 | fc_usb->tmp_buffer_length += buffer_length; | ||
295 | b = fc_usb->tmp_buffer; | ||
296 | l = fc_usb->tmp_buffer_length; | ||
297 | } else { | ||
298 | b=buffer; | ||
299 | l=buffer_length; | ||
300 | } | ||
301 | |||
302 | while (l >= 190) { | ||
303 | if (*b == 0xff) | ||
304 | switch (*(b+1) & 0x03) { | ||
305 | case 0x01: /* media packet */ | ||
306 | if ( *(b+2) == 0x47 ) | ||
307 | flexcop_pass_dmx_packets(fc_usb->fc_dev, b+2, 1); | ||
308 | else | ||
309 | deb_ts("not ts packet %02x %02x %02x %02x \n", *(b+2), *(b+3), *(b+4), *(b+5) ); | ||
310 | |||
311 | b += 190; | ||
312 | l -= 190; | ||
313 | break; | ||
314 | default: | ||
315 | deb_ts("wrong packet type\n"); | ||
316 | l = 0; | ||
317 | break; | ||
318 | } | ||
319 | else { | ||
320 | deb_ts("wrong header\n"); | ||
321 | l = 0; | ||
322 | } | ||
323 | } | ||
324 | |||
325 | if (l>0) | ||
326 | memcpy(fc_usb->tmp_buffer, b, l); | ||
327 | fc_usb->tmp_buffer_length = l; | ||
328 | } | ||
329 | |||
285 | static void flexcop_usb_urb_complete(struct urb *urb, struct pt_regs *ptregs) | 330 | static void flexcop_usb_urb_complete(struct urb *urb, struct pt_regs *ptregs) |
286 | { | 331 | { |
287 | struct flexcop_usb *fc_usb = urb->context; | 332 | struct flexcop_usb *fc_usb = urb->context; |
@@ -297,7 +342,7 @@ static void flexcop_usb_urb_complete(struct urb *urb, struct pt_regs *ptregs) | |||
297 | if (urb->iso_frame_desc[i].actual_length > 0) { | 342 | if (urb->iso_frame_desc[i].actual_length > 0) { |
298 | deb_ts("passed %d bytes to the demux\n",urb->iso_frame_desc[i].actual_length); | 343 | deb_ts("passed %d bytes to the demux\n",urb->iso_frame_desc[i].actual_length); |
299 | 344 | ||
300 | flexcop_pass_dmx_data(fc_usb->fc_dev, | 345 | flexcop_usb_process_frame(fc_usb, |
301 | urb->transfer_buffer + urb->iso_frame_desc[i].offset, | 346 | urb->transfer_buffer + urb->iso_frame_desc[i].offset, |
302 | urb->iso_frame_desc[i].actual_length); | 347 | urb->iso_frame_desc[i].actual_length); |
303 | } | 348 | } |