From: leslie Date: Thu, 31 Jan 2008 21:14:34 +0000 (+0100) Subject: add cwidx patch for DVB multiproto X-Git-Tag: 0.9.0~14 X-Git-Url: http://www.vanbest.org/gitweb/?a=commitdiff_plain;h=3ddab659c292643db8cad6872fa1e38e78486bf3;p=sasc-ng.git add cwidx patch for DVB multiproto --- diff --git a/patches/dvb-cwidx-multiproto.diff b/patches/dvb-cwidx-multiproto.diff new file mode 100644 index 0000000..f499f49 --- /dev/null +++ b/patches/dvb-cwidx-multiproto.diff @@ -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 + #include + #include +- ++#ifndef LINUX_VERSION_CODE ++#include ++#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; + }