From patchwork Sun Jul 3 17:04:46 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oliver Endriss X-Patchwork-Id: 369 Return-path: Envelope-to: mchehab@pedra Delivery-date: Sun, 03 Jul 2011 14:06:07 -0300 Received: from mchehab by pedra with local (Exim 4.72) (envelope-from ) id 1QdQ7S-0000l7-IS for mchehab@pedra; Sun, 03 Jul 2011 14:06:07 -0300 Received: from mail.corp.redhat.com [10.5.5.51] by pedra with IMAP (fetchmail-6.3.17) for (single-drop); Sun, 03 Jul 2011 14:06:06 -0300 (BRT) Received: from zmta02.collab.prod.int.phx2.redhat.com (LHLO zmta02.collab.prod.int.phx2.redhat.com) (10.5.5.32) by mail05.corp.redhat.com with LMTP; Sun, 3 Jul 2011 13:05:48 -0400 (EDT) Received: from localhost (localhost.localdomain [127.0.0.1]) by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id DFEA69D900 for ; Sun, 3 Jul 2011 13:05:48 -0400 (EDT) Received: from zmta02.collab.prod.int.phx2.redhat.com ([127.0.0.1]) by localhost (zmta02.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id iLB0elLkyG9Z for ; Sun, 3 Jul 2011 13:05:48 -0400 (EDT) Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id C170D9D8FD for ; Sun, 3 Jul 2011 13:05:48 -0400 (EDT) Received: from mx1.redhat.com (ext-mx12.extmail.prod.ext.phx2.redhat.com [10.5.110.17]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id p63H5mke014086 for ; Sun, 3 Jul 2011 13:05:48 -0400 Received: from mailout-de.gmx.net (mailout-de.gmx.net [213.165.64.23]) by mx1.redhat.com (8.14.4/8.14.4) with SMTP id p63H5loi012972 for ; Sun, 3 Jul 2011 13:05:47 -0400 Received: (qmail invoked by alias); 03 Jul 2011 17:05:46 -0000 Received: from p5DE56C0C.dip.t-dialin.net (HELO charon.escape-edv.de) [93.229.108.12] by mail.gmx.net (mp005) with SMTP; 03 Jul 2011 19:05:46 +0200 X-Authenticated: #476490 X-Provags-ID: V01U2FsdGVkX18ScPsD0R8S4CM+v0KVx568XxKdkGXlAicAvN3Aww 7oe+2V3JZpj272 Received: from orion.escape-edv.de (192.168.1.10) by charon.escape-edv.de (192.168.1.9) with esmtp ; Sun, 03 Jul 2011 19:07:24 +0200 From: Oliver Endriss Organization: ESCAPE GmbH EDV-Loesungen To: linux-media@vger.kernel.org Subject: [PATCH 16/16] ngene: Strip dummy packets inserted by the driver Date: Sun, 3 Jul 2011 19:04:46 +0200 User-Agent: KMail/1.9.6 Cc: Mauro Carvalho Chehab References: <201107031831.20378@orion.escape-edv.de> In-Reply-To: <201107031831.20378@orion.escape-edv.de> MIME-Version: 1.0 Content-Disposition: inline Message-Id: <201107031904.48044@orion.escape-edv.de> X-Y-GMX-Trusted: 0 X-RedHat-Spam-Score: 0.001 (FREEMAIL_FROM, RCVD_IN_DNSWL_NONE, T_TO_NO_BRKTS_FREEMAIL) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Scanned-By: MIMEDefang 2.68 on 10.5.110.17 Sender: As the CI requires a continuous data stream, the driver inserts dummy packets when necessary. Do not pass these packets to userspace anymore. Signed-off-by: Oliver Endriss --- drivers/media/dvb/ngene/ngene-core.c | 2 +- drivers/media/dvb/ngene/ngene-dvb.c | 42 +++++++++++++++++++++++++++++----- drivers/media/dvb/ngene/ngene.h | 2 + 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/drivers/media/dvb/ngene/ngene-core.c b/drivers/media/dvb/ngene/ngene-core.c index df0f0bd..f129a93 100644 --- a/drivers/media/dvb/ngene/ngene-core.c +++ b/drivers/media/dvb/ngene/ngene-core.c @@ -507,7 +507,7 @@ void FillTSBuffer(void *Buffer, int Length, u32 Flags) { u32 *ptr = Buffer; - memset(Buffer, 0xff, Length); + memset(Buffer, TS_FILLER, Length); while (Length > 0) { if (Flags & DF_SWAP32) *ptr = 0x471FFF10; diff --git a/drivers/media/dvb/ngene/ngene-dvb.c b/drivers/media/dvb/ngene/ngene-dvb.c index ba209cb..fcb16a6 100644 --- a/drivers/media/dvb/ngene/ngene-dvb.c +++ b/drivers/media/dvb/ngene/ngene-dvb.c @@ -118,6 +118,16 @@ static void swap_buffer(u32 *p, u32 len) } } +/* start of filler packet */ +static u8 fill_ts[] = { 0x47, 0x1f, 0xff, 0x10, TS_FILLER }; + +/* #define DEBUG_CI_XFER */ +#ifdef DEBUG_CI_XFER +static u32 ok; +static u32 overflow; +static u32 stripped; +#endif + void *tsin_exchange(void *priv, void *buf, u32 len, u32 clock, u32 flags) { struct ngene_channel *chan = priv; @@ -126,21 +136,41 @@ void *tsin_exchange(void *priv, void *buf, u32 len, u32 clock, u32 flags) if (flags & DF_SWAP32) swap_buffer(buf, len); + if (dev->ci.en && chan->number == 2) { - if (dvb_ringbuffer_free(&dev->tsin_rbuf) > len) { - dvb_ringbuffer_write(&dev->tsin_rbuf, buf, len); - wake_up_interruptible(&dev->tsin_rbuf.queue); + while (len >= 188) { + if (memcmp(buf, fill_ts, sizeof fill_ts) != 0) { + if (dvb_ringbuffer_free(&dev->tsin_rbuf) >= 188) { + dvb_ringbuffer_write(&dev->tsin_rbuf, buf, 188); + wake_up(&dev->tsin_rbuf.queue); +#ifdef DEBUG_CI_XFER + ok++; +#endif + } +#ifdef DEBUG_CI_XFER + else + overflow++; +#endif + } +#ifdef DEBUG_CI_XFER + else + stripped++; + + if (ok % 100 == 0 && overflow) + printk(KERN_WARNING "%s: ok %u overflow %u dropped %u\n", __func__, ok, overflow, stripped); +#endif + buf += 188; + len -= 188; } - return 0; + return NULL; } + if (chan->users > 0) dvb_dmx_swfilter(&chan->demux, buf, len); return NULL; } -u8 fill_ts[188] = { 0x47, 0x1f, 0xff, 0x10 }; - void *tsout_exchange(void *priv, void *buf, u32 len, u32 clock, u32 flags) { struct ngene_channel *chan = priv; diff --git a/drivers/media/dvb/ngene/ngene.h b/drivers/media/dvb/ngene/ngene.h index 90fa136..5443dc0 100644 --- a/drivers/media/dvb/ngene/ngene.h +++ b/drivers/media/dvb/ngene/ngene.h @@ -789,6 +789,8 @@ struct ngene { u8 uart_rbuf[UART_RBUF_LEN]; int uart_rp, uart_wp; +#define TS_FILLER 0x6f + u8 *tsout_buf; #define TSOUT_BUF_SIZE (512*188*8) struct dvb_ringbuffer tsout_rbuf;