diff -Nru linux/drivers/media/dvb/ttpci/av7110_ca.c v4l-dvb-cwdix/linux/drivers/media/dvb/ttpci/av7110_ca.c --- linux/drivers/media/dvb/ttpci/av7110_ca.c 2007-05-19 13:44:15.000000000 +0200 +++ linux/drivers/media/dvb/ttpci/av7110_ca.c 2007-05-19 13:46:10.000000000 +0200 @@ -34,6 +34,9 @@ #include #include #include +#ifndef LINUX_VERSION_CODE +#include +#endif #include "av7110.h" #include "av7110_hw.h" @@ -287,10 +290,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 +343,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; }