]> www.vanbest.org Git - sasc-ng.git/commitdiff
add cwidx patch for DVB multiproto
authorleslie <unknown>
Thu, 31 Jan 2008 21:14:34 +0000 (22:14 +0100)
committerleslie <unknown>
Thu, 31 Jan 2008 21:14:34 +0000 (22:14 +0100)
patches/dvb-cwidx-multiproto.diff [new file with mode: 0644]

diff --git a/patches/dvb-cwidx-multiproto.diff b/patches/dvb-cwidx-multiproto.diff
new file mode 100644 (file)
index 0000000..f499f49
--- /dev/null
@@ -0,0 +1,94 @@
+diff -ur linux/drivers/media/dvb/ttpci/av7110_ca.c linux/drivers/media/dvb/ttpci/av7110_ca.c
+--- linux/drivers/media/dvb/ttpci/av7110_ca.c  2008-01-27 22:48:52.000000000 +0100
++++ linux/drivers/media/dvb/ttpci/av7110_ca.c  2008-01-31 16:54:44.000000000 +0100
+@@ -34,7 +34,9 @@
+ #include <linux/fs.h>
+ #include <linux/timer.h>
+ #include <linux/poll.h>
+-
++#ifndef LINUX_VERSION_CODE
++#include <linux/version.h>
++#endif
+ #include "av7110.h"
+ #include "av7110_hw.h"
+ #include "av7110_ca.h"
+@@ -287,10 +289,31 @@
+       }
+       case CA_GET_MSG:
+-              break;
++        {
++                ca_pid_t *arg = (ca_pid_t*) parg;
++                u16 buf[4], res[2];
++                buf[0]=0x0745;
++                buf[1]=2;
++                buf[2]=arg->pid >> 16;
++                buf[3]=arg->pid & 0xFFFF;
++                av7110_fw_request(av7110,buf,sizeof(buf),res,2);
++                arg->index=(res[0]<<16) + res[1];
++                break;
++        }
+       case CA_SEND_MSG:
+-              break;
++        {
++                ca_pid_t *arg = (ca_pid_t*) parg;
++                u16 buf[6], res[2];
++                buf[0]=0x0746;
++                buf[1]=4;
++                buf[2]=arg->pid >> 16;
++                buf[3]=arg->pid & 0xFFFF;
++                buf[4]=arg->index >> 16;
++                buf[5]=arg->index & 0xFFFF;
++                av7110_fw_request(av7110,buf,sizeof(buf),res,2);
++                break;
++        }
+       case CA_GET_DESCR_INFO:
+       {
+@@ -319,6 +342,45 @@
+               break;
+       }
++        case CA_SET_PID:
++        {
++                int handle;
++                ca_pid_t *pid = (ca_pid_t*) parg;
++
++                if (pid->pid >= 0x1fff)
++                        return -EINVAL;
++                if (pid->index < 0 || pid->index >= 16)
++                        return -EINVAL;
++
++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16))
++                if (down_interruptible (&av7110->demux.mutex))
++#else
++                if (mutex_lock_interruptible (&av7110->demux.mutex))
++#endif
++                      return -ERESTARTSYS;
++
++                for(handle=0; handle<32; handle++) {
++                  struct dvb_demux_filter *dvbdmxfilter=av7110->handle2filter[handle];
++                  if(dvbdmxfilter) {
++                    struct dvb_demux_feed *feed=dvbdmxfilter->feed;
++                    if(feed && feed->state==DMX_STATE_GO && feed->pid==pid->pid) {
++                      /* we map the new cmd to CacheError as it's not
++                         implemented anyways, i.e. free. */
++                      av7110_fw_cmd(av7110, COMTYPE_PIDFILTER, CacheError, 1,
++                                  (handle<<8)|pid->index); /* hw handle / cw index*/
++                      break;
++                      }
++                    }
++                  }
++
++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16))
++                up(&av7110->demux.mutex);
++#else
++                mutex_unlock(&av7110->demux.mutex);
++#endif
++                break;
++        }
++
+       default:
+               return -EINVAL;
+       }