aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb/b2c2/flexcop-usb.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/dvb/b2c2/flexcop-usb.c')
-rw-r--r--drivers/media/dvb/b2c2/flexcop-usb.c47
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
285static 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
285static void flexcop_usb_urb_complete(struct urb *urb, struct pt_regs *ptregs) 330static 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 }