Hi Ralph, hi everybody else,

Ralph Metzler wrote:
Hi,

although I can only type with my left hand right now, I had enough of
this thread. This bug has been fixed a long time ago as part of the
work I did for the KNC card support (this also already included SU1278
support btw.).
I don't understand why it was then decided by Convergence not to transfer
this and other improvements to the NEWSTRUCT branch BEFORE just dropping the old branch.
well, enough ranting. I attached a diff with the related changes in CVS in those days. Whoever owns a KNC1 card please review and apply these changes to the current driver tree in order to fit Michael's recent changes.

I have neither a KNC1 card nor do I know anybody who owns one, so please please help if you want to see support for those cards in the driver.

@MiHu: Could you please review+apply the consistent_alloc() related changes and those ones in fidbirq()?

many thanks,

Holger
? knc1_and_more.diff
Index: dmxdev.c
===================================================================
RCS file: /cvs/linuxtv/DVB/driver/dmxdev.c,v
retrieving revision 1.48
retrieving revision 1.52
diff -p -u -r1.48 -r1.52
--- dmxdev.c    1 Apr 2002 01:14:53 -0000       1.48
+++ dmxdev.c    1 Aug 2002 17:46:11 -0000       1.52
@@ -32,7 +32,7 @@
 MODULE_DESCRIPTION("");
 MODULE_AUTHOR("Ralph Metzler, Marcus Metzler");
 #ifdef MODULE_LICENSE
-MODULE_LICENSE("GPL");
+MODULE_LICENSE("GPL and additional rights");
 #endif
 MODULE_PARM(debug,"i");
 #endif
@@ -184,7 +184,9 @@ DmxDevDVROpen(dmxdev_t *dmxdev, struct f
 {
         dmx_frontend_t *front;
 
-        down(&dmxdev->mutex);
+        if (down_interruptible(&dmxdev->mutex))
+               return -ERESTARTSYS;
+
        if ((file->f_flags&O_ACCMODE)==O_RDWR) {
                if (!(dmxdev->capabilities&DMXDEV_CAP_DUPLEX)) {
                        up(&dmxdev->mutex);
@@ -226,7 +228,9 @@ DmxDevDVROpen(dmxdev_t *dmxdev, struct f
 int 
 DmxDevDVRClose(dmxdev_t *dmxdev, struct file *file)
 {
-        down(&dmxdev->mutex);
+        if (down_interruptible(&dmxdev->mutex))
+               return -ERESTARTSYS;
+
        if ((file->f_flags&O_ACCMODE)==O_WRONLY) {
                dmxdev->demux->disconnect_frontend(dmxdev->demux);      
                dmxdev->demux->connect_frontend(dmxdev->demux, 
@@ -256,7 +260,8 @@ DmxDevDVRWrite(dmxdev_t *dmxdev, struct 
                return -EOPNOTSUPP;
        if ((file->f_flags&O_ACCMODE)!=O_WRONLY)
                return -EINVAL;
-        down(&dmxdev->mutex);
+        if (down_interruptible(&dmxdev->mutex))
+               return -ERESTARTSYS;
         ret=dmxdev->demux->write(dmxdev->demux, buf, count);
         up(&dmxdev->mutex);
        return ret;
@@ -268,7 +273,8 @@ DmxDevDVRRead(dmxdev_t *dmxdev, struct f
 {
        int ret;
 
-        down(&dmxdev->mutex);
+        if (down_interruptible(&dmxdev->mutex))
+               return -ERESTARTSYS;
         ret= DmxDevBufferRead(&dmxdev->dvr_buffer, 
                              file->f_flags&O_NONBLOCK, 
                              buf, count, ppos);
@@ -685,7 +691,10 @@ DmxDevFilterNum(dmxdev_t *dmxdev)
         
        if (!dmxdev->filter)
                return 0;
-        down(&dmxdev->mutex);
+       
+        if (down_interruptible(&dmxdev->mutex))
+               return -ERESTARTSYS;
+
         for (i=0, num=0; i<dmxdev->filternum; i++)
                 if (dmxdev->filter[i].state==DMXDEV_STATE_FREE)
                        num++;
@@ -701,7 +710,10 @@ DmxDevFilterAlloc(dmxdev_t *dmxdev, stru
         
        if (!dmxdev->filter)
                return -EINVAL;
-        down(&dmxdev->mutex);
+
+        if (down_interruptible(&dmxdev->mutex))
+               return -ERESTARTSYS;
+       
         for (i=0; i<dmxdev->filternum; i++)
                 if (dmxdev->filter[i].state==DMXDEV_STATE_FREE)
                         break;
@@ -728,7 +740,8 @@ DmxDevFilterFree(dmxdev_t *dmxdev, struc
 {
         dmxdev_filter_t *dmxdevfilter;
         
-        down(&dmxdev->mutex);
+        if (down_interruptible(&dmxdev->mutex))
+               return -ERESTARTSYS;
 
         if (!(dmxdevfilter=DmxDevFile2Filter(dmxdev, file))) {
                up(&dmxdev->mutex);
@@ -894,7 +907,9 @@ DmxDevRead(dmxdev_t *dmxdev, struct file
         dmxdev_filter_t *dmxdevfilter=DmxDevFile2Filter(dmxdev, file);
        int ret=0;
 
-        down(&dmxdev->mutex);
+        if (down_interruptible(&dmxdev->mutex))
+               return -ERESTARTSYS;
+
        if (dmxdevfilter->type==DMXDEV_TYPE_SEC)
                ret=DmxDevReadSec(dmxdevfilter, file, buf, count, ppos);
        else
@@ -917,7 +932,9 @@ int DmxDevIoctl(dmxdev_t *dmxdev, struct
        if (!dmxdevfilter)
                return -EINVAL;
 
-        down(&dmxdev->mutex);
+        if (down_interruptible(&dmxdev->mutex))
+               return -ERESTARTSYS;
+
        switch (cmd) {
        case DMX_START: 
                if (dmxdevfilter->state<DMXDEV_STATE_SET)
@@ -1022,7 +1039,9 @@ int DmxDevDVRIoctl(dmxdev_t *dmxdev, str
         //void *parg=(void *)arg;
        int ret=0;
 
-        down(&dmxdev->mutex);
+        if (down_interruptible(&dmxdev->mutex))
+               return -ERESTARTSYS;
+
        switch (cmd) {
        case DMX_SET_BUFFER_SIZE: 
                // FIXME: implement
@@ -1040,11 +1059,17 @@ unsigned int 
 DmxDevDVRPoll(dmxdev_t *dmxdev, struct file *file, poll_table * wait)
 {
         if ((file->f_flags&O_ACCMODE)==O_RDONLY) {
+               if (dmxdev->dvr_buffer.error)
+                       return (POLLIN | POLLRDNORM | POLLPRI | POLLERR);
+
                if (dmxdev->dvr_buffer.pread!=dmxdev->dvr_buffer.pwrite)
                        return (POLLIN | POLLRDNORM | POLLPRI);
                
                poll_wait(file, &dmxdev->dvr_buffer.queue, wait);
                
+               if (dmxdev->dvr_buffer.error)
+                       return (POLLIN | POLLRDNORM | POLLPRI | POLLERR);
+
                if (dmxdev->dvr_buffer.pread!=dmxdev->dvr_buffer.pwrite)
                        return (POLLIN | POLLRDNORM | POLLPRI);
                
Index: dvb.c
===================================================================
RCS file: /cvs/linuxtv/DVB/driver/Attic/dvb.c,v
retrieving revision 1.132
retrieving revision 1.142
diff -p -u -r1.132 -r1.142
--- dvb.c       3 May 2002 14:16:14 -0000       1.132
+++ dvb.c       7 Aug 2002 14:07:14 -0000       1.142
@@ -7,6 +7,10 @@
  * originally based on code by:
  *
  * Copyright (C) 1998,1999 Christian Theiss <[EMAIL PROTECTED]>
+
+ * Modifications for support of the KNC1 DVB-S card are:
+ *
+ * Copyright (C) 2002 ANDIgital
  
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -444,13 +448,15 @@ static int arm_thread(void *data)
                        break;
                 if (!dvb->arm_ready)
                         continue;
-                down_interruptible(&dvb->dcomlock);
+                if (down_interruptible(&dvb->dcomlock))
+                       break;
                 newloops=rdebi(dvb, DEBINOSWAP, STATUS_LOOPS, 0, 2);
                 up(&dvb->dcomlock);
                 if (newloops==dvb->arm_loops) {
                         printk("dvb%d: ARM crashed!\n", dvb->num);
                         arm_error(dvb);
-                        down_interruptible(&dvb->dcomlock);
+                        if (down_interruptible(&dvb->dcomlock))
+                               break;
                         newloops=rdebi(dvb, DEBINOSWAP, STATUS_LOOPS, 0, 2)-1;
                         up(&dvb->dcomlock);
                 }
@@ -756,25 +762,31 @@ TTBStop(struct dvb_struct *dvb)
 
 #define TS_WIDTH  (4*188)
 #define TS_HEIGHT (1024/4)
+#define TS_BUFLEN (TS_WIDTH*TS_HEIGHT)
+
 static int
 TTBStart(struct dvb_struct *dvb)
 {
         struct saa7146 *saa=dvb->saa;
 
-        //printk ("function : %s\n", __FUNCTION__);
+        dprintk ("function : %s\n", __FUNCTION__);
         if (dvb->feeding) {
                 dvb->feeding++;
                 return dvb->feeding;
         }
+
+        if (dvb->card_type==DVB_CARD_KNC1) 
+                setgpio(dvb, 0, GPIO_OUTLO);
+
        saa7146_write(saa->mem, MC1, MASK_20); // DMA3 off
 
-        memset(saa->grabbing, 0x00, TS_HEIGHT*TS_WIDTH);
+        memset(dvb->ttb_virt, 0x00, TS_BUFLEN);
 
         saa7146_write(saa->mem, PCI_BT_V1, 0x001c0000);
 
         dvb->tsf=0;
         dvb->ttbp=0;
-        saa7146_write(dvb->saa->mem, DD1_INIT, 0x02000680);
+        saa7146_write(dvb->saa->mem, DD1_INIT, 0x070006c0);
         saa7146_write(dvb->saa->mem, MC2, 
                       (MASK_09 | MASK_25 | MASK_10 | MASK_26));
 
@@ -782,10 +794,10 @@ TTBStart(struct dvb_struct *dvb)
        saa7146_write(saa->mem, MC2, (MASK_08 | MASK_24));
         mdelay(10);
 
-        saa7146_write(saa->mem, BASE_ODD3, 0);
-        saa7146_write(saa->mem, BASE_EVEN3, TS_WIDTH*TS_HEIGHT/2);
-        saa7146_write(saa->mem, PROT_ADDR3, TS_WIDTH*TS_HEIGHT);       
-        saa7146_write(saa->mem, BASE_PAGE3, virt_to_bus(saa->page_table[0])|ME1|0xb0);
+        saa7146_write(saa->mem, BASE_ODD3, dvb->ttb_bus);
+        saa7146_write(saa->mem, BASE_EVEN3, dvb->ttb_bus+TS_BUFLEN/2);
+        saa7146_write(saa->mem, PROT_ADDR3, dvb->ttb_bus+TS_BUFLEN);   
+        saa7146_write(saa->mem, BASE_PAGE3, 0xb0);
         saa7146_write(saa->mem, PITCH3, TS_WIDTH);     
 
         saa7146_write(saa->mem, NUM_LINE_BYTE3, ((TS_HEIGHT/2)<<16)|TS_WIDTH);
@@ -922,9 +934,7 @@ static void vpeirq(struct saa7146* saa, 
 {
         struct dvb_struct *dvb=(struct dvb_struct *) data;
   
-        if (dvb->card_type!=DVB_CARD_TT_BUDGET)
-                return;
-        //printk("vpeirq %08x\n", saa7146_read(dvb->saa_mem, PCI_VDP3));
+        dprintk("vpeirq %08x\n", saa7146_read(dvb->saa_mem, PCI_VDP3));
 }
 
 
@@ -932,21 +942,16 @@ static void vpeirq(struct saa7146* saa, 
 static void fidbirq(struct saa7146* saa, void *data)
 {
         struct dvb_struct *dvb=(struct dvb_struct *) data;
-        u8 *mem;
-  
-        if (dvb->card_type!=DVB_CARD_TT_BUDGET)
-                return;
-        
-        mem=(dvb->tsf ? TS_HEIGHT*TS_WIDTH/2 :0)+(u8 *)dvb->saa->grabbing;
+        u8 *mem=(dvb->tsf ? TS_BUFLEN/2 :0)+(u8 *)dvb->ttb_virt;
 
         // FIXME: think of something better without busy waiting
         if (dvb->tsf) 
-                while (saa7146_read(dvb->saa_mem, PCI_VDP3)>0x20000);
+                while (saa7146_read(dvb->saa_mem, PCI_VDP3)-dvb->ttb_bus>0x20000);
         else
-                while (saa7146_read(dvb->saa_mem, PCI_VDP3)<0x17800);
+                while (saa7146_read(dvb->saa_mem, PCI_VDP3)-dvb->ttb_bus<0x17800);
 
         dvb->tsf^=1;
-        saa7146_write(dvb->saa_mem, DD1_INIT, 0x02000600|(dvb->tsf ? 0x40:0x80));
+        saa7146_write(dvb->saa_mem, DD1_INIT, 0x07000600|(dvb->tsf ? 0x40:0x80));
         saa7146_write(dvb->saa_mem, MC2, 
                       (MASK_09 | MASK_25 | MASK_10 | MASK_26));
 
@@ -954,18 +959,22 @@ static void fidbirq(struct saa7146* saa,
         if (dvb->feeding && mem[0]==0x47)
                 DvbDmxSWFilterPackets(&dvb->demux, mem, 512);
 }
-#else
 static void fidbirq(struct saa7146* saa, void *data)
 {
         struct dvb_struct *dvb=(struct dvb_struct *) data;
-        u8 *mem=(u8 *)(dvb->saa->grabbing);
+        u8 *mem=dvb->ttb_virt;
         int num;
         u32 dmapos;
 
-        dmapos=saa7146_read(dvb->saa_mem, PCI_VDP3);
+        dmapos=saa7146_read(dvb->saa_mem, PCI_VDP3)-dvb->ttb_bus;
         dmapos-=(dmapos%188);
+        
+        if (dmapos>=TS_BUFLEN) 
+                return;
 
         if (dvb->tsf) {
+                if (dvb->ttbp>TS_BUFLEN/2)
+                        dvb->ttbp=TS_BUFLEN/2;
                 mem+=dvb->ttbp;
                 if (dmapos<0x20000) {
                         num=1024-dvb->ttbp/188;
@@ -975,18 +984,17 @@ static void fidbirq(struct saa7146* saa,
                         dvb->ttbp=dmapos;
                 }
         } else {
-                if (dvb->ttbp) {
-                        if (dvb->feeding)
-                                DvbDmxSWFilterPackets(&dvb->demux, 
-                                                      mem+dvb->ttbp,
-                                                      1024- dvb->ttbp / 188);
-                }
+                if (dvb->ttbp &&  
+                    dvb->feeding)
+                        DvbDmxSWFilterPackets(&dvb->demux, 
+                                              mem+dvb->ttbp,
+                                              1024- dvb->ttbp / 188);
                 num=dmapos/188;
                 dvb->ttbp=dmapos;
         }
 
         dvb->tsf^=1;
-        saa7146_write(dvb->saa_mem, DD1_INIT, 0x02000600|(dvb->tsf ? 0x40:0x80));
+        saa7146_write(dvb->saa_mem, DD1_INIT, 0x07000600|(dvb->tsf ? 0x40:0x80));
         saa7146_write(dvb->saa_mem, MC2, 
                       (MASK_09 | MASK_25 | MASK_10 | MASK_26));
 
@@ -994,6 +1002,45 @@ static void fidbirq(struct saa7146* saa,
         if (dvb->feeding && mem[0]==0x47)
                 DvbDmxSWFilterPackets(&dvb->demux, mem, num);
 }
+#else
+static void fidbirq(struct saa7146* saa, void *data)
+{
+        struct dvb_struct *dvb=(struct dvb_struct *) data;
+        u8 *mem=dvb->ttb_virt;
+        int num;
+        u32 dmapos;
+        int field=0x80&saa7146_read(dvb->saa_mem, PSR); 
+
+        dmapos=saa7146_read(dvb->saa_mem, PCI_VDP3)-dvb->ttb_bus;
+        dmapos-=(dmapos%188);
+        
+        if (dmapos>=TS_BUFLEN) 
+                return;
+
+        if (field) {
+                if (dvb->ttbp>TS_BUFLEN/2)
+                        dvb->ttbp=TS_BUFLEN/2;
+                mem+=dvb->ttbp;
+                if (dmapos<0x20000) {
+                        num=1024-dvb->ttbp/188;
+                        dvb->ttbp=0;
+                } else {
+                        num=(dmapos - dvb->ttbp)/188;
+                        dvb->ttbp=dmapos;
+                }
+        } else {
+                if (dvb->ttbp<TS_BUFLEN/2)
+                        dvb->ttbp=0;
+                if (dvb->ttbp && dvb->feeding)
+                        DvbDmxSWFilterPackets(&dvb->demux, 
+                                              mem+dvb->ttbp,
+                                              1024- dvb->ttbp / 188);
+                num=dmapos/188;
+                dvb->ttbp=dmapos;
+        }
+        if (dvb->feeding && mem[0]==0x47)
+                DvbDmxSWFilterPackets(&dvb->demux, mem, num);
+}
 #endif
 
 //#define DEBUG_TIMING
@@ -1471,7 +1518,8 @@ SOutCommand(struct dvb_struct *dvb, u16*
         
         if (!dvb->arm_ready)
                 return -1;
-        down_interruptible(&dvb->dcomlock);
+        if (down_interruptible(&dvb->dcomlock))
+               return -ERESTARTSYS;
         ret=OutCommand(dvb, buf, length);
         up(&dvb->dcomlock);
         return ret;
@@ -1522,7 +1570,8 @@ static int CommandRequest(struct dvb_str
        
         if (!dvb->arm_ready)
                 return -1;
-        down_interruptible(&dvb->dcomlock);
+        if (down_interruptible(&dvb->dcomlock))
+               return -ERESTARTSYS;
         OutCommand(dvb, Buff, length);
         
         start = jiffies;
@@ -1653,7 +1702,8 @@ static int FlushText(struct dvb_struct *
 {
         u32 start;
 
-        down_interruptible(&dvb->dcomlock);
+        if (down_interruptible(&dvb->dcomlock))
+               return -ERESTARTSYS;
         start = jiffies;
         while ( rdebi(dvb, DEBINOSWAP, BUFF1_BASE, 0, 2 ) ) {
                 ddelay(1); 
@@ -1675,7 +1725,8 @@ static int WriteText(struct dvb_struct *
         int length=strlen(buf)+1;
         u16 cbuf[5] = { (COMTYPE_OSD<<8) + DText, 3, win, x, y };
         
-        down_interruptible(&dvb->dcomlock);
+        if (down_interruptible(&dvb->dcomlock))
+               return -ERESTARTSYS;
         start = jiffies;
         while ( rdebi(dvb, DEBINOSWAP, BUFF1_BASE, 0, 2 ) ) {
                 ddelay(1);
@@ -2365,13 +2416,25 @@ audcom(struct dvb_struct *dvb, u32 com)
                       (com>>16), (com&0xffff));
 }
 
+
+static inline void demod_writereg(struct dvb_struct *dvb, u8 adr, u8 val);
+static inline u8 demod_readreg(struct dvb_struct *dvb, u8 adr);
+
 inline static void 
 Set22K(struct dvb_struct *dvb, int state)
 {
-        if (dvb->card_type==DVB_CARD_TT_SIEMENS)
+        switch (dvb->card_type) {
+        case DVB_CARD_TT_SIEMENS:
                 outcom(dvb, COMTYPE_AUDIODAC, (state ? ON22K : OFF22K), 0);
-        if (dvb->card_type==DVB_CARD_TT_BUDGET)
+                break;
+        case DVB_CARD_TT_BUDGET:
                 setgpio(dvb, 3, (state ? GPIO_OUTHI : GPIO_OUTLO));
+                break;
+        case DVB_CARD_KNC1:
+        case DVB_CARD_TT_BUDGET_CI:
+                demod_writereg(dvb, 0x08, (demod_readreg(dvb, 0x08)&0xfc)|(state ? 
+0x03 : 0x00)); 
+                break;
+        }
 }
 
 
@@ -2450,6 +2513,45 @@ SetDiSEqC(struct dvb_struct *dvb, int in
         }
 }
 
+static inline int
+stv0299_wait_free(struct dvb_struct *dvb)
+{
+       int i;
+
+       for (i=0; i<200; i++) 
+                if (!(demod_readreg(dvb, 0x0a)&1))
+                        return 0;
+                else
+                        ddelay(1);
+        printk("stv0299 fifo full timeout!\n");
+
+       return -1;
+}
+
+static inline int
+stv0299_wait_idle(struct dvb_struct *dvb)
+{
+       int i;
+
+       for (i=0; i<200; i++) 
+                if ((demod_readreg(dvb, 0x0a)&3)==2)
+                        return 0;
+                else
+                        ddelay(1);
+        printk("stv0299 fifo not idle timeout!\n");
+
+       return -1;
+}
+
+static inline int
+DiseqcSendByteStv0299(struct dvb_struct *dvb, u8 data)
+{
+        if (stv0299_wait_free(dvb))
+                return -1;
+        demod_writereg(dvb, 0x09, data); 
+        return 0;
+}
+
 inline static int
 SendDiSEqCMsg(struct dvb_struct *dvb, int len, u8 *msg, int burst)
 {
@@ -2487,6 +2589,7 @@ SendDiSEqCMsg(struct dvb_struct *dvb, in
                         DiseqcSendByte(dvb, msg[i]);
 
                 mdelay(16);
+
                 
                 if (burst!=-1) {
                         if (burst) 
@@ -2500,7 +2603,27 @@ SendDiSEqCMsg(struct dvb_struct *dvb, in
                         ddelay(2);
                 }
                 Set22K(dvb, dvb->sec.ttk);
+                break;
+
+        case DVB_CARD_TT_BUDGET_CI:
+        case DVB_CARD_KNC1:
+                stv0299_wait_idle(dvb);
+                demod_writereg(dvb, 0x08, 0x06); 
+                mdelay(16);
+
+                for (i=0; i<len; i++)
+                        DiseqcSendByteStv0299(dvb, msg[i]);
 
+                stv0299_wait_idle(dvb);
+                mdelay(16);
+                
+                if (burst!=-1) {
+                        demod_writereg(dvb, 0x08, 0x02); 
+                        DiseqcSendByteStv0299(dvb, burst ? 0xff : 0x00);
+                        stv0299_wait_idle(dvb);
+                        mdelay(16);
+                }
+                Set22K(dvb, dvb->sec.ttk);
                 break;
 
         default:
@@ -2595,9 +2718,16 @@ SetVoltage(struct dvb_struct *dvb, int p
 
         switch (dvb->frontend.demod_type) {
         case DVB_DEMOD_STV0299:
-                demod_writereg(dvb, 0x0c, 
-                               (demod_readreg(dvb, 0x0c)&0x0f)|
-                               (power ? 0x40 : 0)|(voltage ? 0x10 : 0));
+                if (dvb->card_type==DVB_CARD_KNC1) 
+                        demod_writereg(dvb, 0x0c, 
+                                       (demod_readreg(dvb, 0x0c)&0x0f)
+                                       |(power ? 0x10 : 0)
+                                       |(voltage ? 0x40 : 0) 
+                                );
+                else
+                        demod_writereg(dvb, 0x0c, 
+                                       (demod_readreg(dvb, 0x0c)&0x0f)|
+                                       (power ? 0x40 : 0)|(voltage ? 0x10 : 0));
                 break;
         case DVB_DEMOD_VES1893:
                 demod_writereg(dvb, 0x1f, (power ? 0x20 : 0)|(voltage ? 0x10 : 0));
@@ -2702,6 +2832,7 @@ InitFront(struct dvb_struct *dvb)
                         secSetTone(dvb, SEC_TONE_ON);
                         secSetVoltage(dvb, SEC_VOLTAGE_13);
                         para.Frequency=12669500-10600000;
+                       para.Inversion=INVERSION_OFF;
                         para.u.qpsk.SymbolRate=22000000;
                         para.u.qpsk.FEC_inner=0;
                 } else {
@@ -2710,6 +2841,7 @@ InitFront(struct dvb_struct *dvb)
                         secSetTone(dvb, SEC_TONE_ON);
                         secSetVoltage(dvb, SEC_VOLTAGE_13);
                         para.Frequency=12480000-10600000;
+                       para.Inversion=INVERSION_OFF;
                         para.u.qpsk.SymbolRate=27500000;
                         para.u.qpsk.FEC_inner=0;
                 }
@@ -2720,6 +2852,7 @@ InitFront(struct dvb_struct *dvb)
                         break;
                 ChangePIDs(dvb, 0x0262, 0x026c, 0, 0, 0x0262);
                 para.Frequency=394000000;
+                para.Inversion=INVERSION_OFF;
                 para.u.qam.SymbolRate=6900000;
                 para.u.qam.FEC_inner=0;
                 para.u.qam.QAM=QAM_64;
@@ -2729,6 +2862,7 @@ InitFront(struct dvb_struct *dvb)
 //                      break;
                 ChangePIDs(dvb, 110, 120, 0, 0, 0);
                 para.Frequency=730000000;
+                para.Inversion=INVERSION_OFF;
                 para.u.ofdm.bandWidth=BANDWIDTH_8_MHZ;
                 para.u.ofdm.HP_CodeRate=FEC_2_3;
                 para.u.ofdm.LP_CodeRate=FEC_1_2;
@@ -2747,6 +2881,10 @@ InitFront(struct dvb_struct *dvb)
                 //iwdebi(dvb, DEBINOSWAP, TX_BUFF, 0, 2);
                 //ARM_ResetMailBox(dvb);
         }
+        if (dvb->card_type==DVB_CARD_KNC1) {
+                demod_writereg(dvb, 0x05, 0x00); 
+                demod_writereg(dvb, 0x0f, 0x92); 
+        }
 }
 
 
@@ -2888,7 +3026,7 @@ void init_p2t(p2t_t *p, dvb_demux_feed_t
 void clear_p2t(p2t_t *p)
 {
        memset(p->pes,0,TS_SIZE);
-       p->counter = 0;
+//     p->counter = 0;
        p->pos = 0;
        p->frags = 0;
 }
@@ -3494,17 +3632,6 @@ static int dvb_mmap(struct video_device 
        return 0;
 }
 
-static int dvb_open(struct video_device *dev, int flags)
-{
-       MOD_INC_USE_COUNT;
-       return 0;   
-}
-
-static void dvb_close(struct video_device *dev)
-{
-       fprintk(KERN_ERR "dvb: dvb_close called\n");
-        MOD_DEC_USE_COUNT;  
-}
 
 static unsigned int dvb_poll(struct dvb_struct *dvb, struct file *file,
        poll_table *wait)
@@ -3546,6 +3673,7 @@ static unsigned int dvb_apoll(struct dvb
 
 /* template for video_device-structure */
 static struct video_device dvb_template = {
+owner:         THIS_MODULE,
 name:          "DVB Board",
 type:          VID_TYPE_TUNER          |
                 VID_TYPE_CAPTURE       |
@@ -3554,8 +3682,6 @@ type:             VID_TYPE_TUNER          |
                 VID_TYPE_FRAMERAM      |
                 VID_TYPE_SCALES,
 hardware:       VID_HARDWARE_SAA7146,
-open:           dvb_open,
-close:          dvb_close,
 read:           NULL,
 write:         NULL,           
 poll:          NULL,
@@ -3563,7 +3689,6 @@ ioctl:            dvb_ioctl,
 mmap:          dvb_mmap,
 initialize:    dvb_init_done,
 priv:          NULL,
-busy:           0,
 minor:          0
 };
 
@@ -3809,7 +3934,9 @@ dvb_start_feed(dvb_demux_feed_t *dvbdmxf
         if (!dvbdmx->dmx.frontend)
                 return -EINVAL;
 
-        if (dvb->card_type==DVB_CARD_TT_BUDGET) 
+        if (dvb->card_type==DVB_CARD_TT_BUDGET    ||
+            dvb->card_type==DVB_CARD_TT_BUDGET_CI ||
+            dvb->card_type==DVB_CARD_KNC1)  
                 return TTBStart(dvb); 
 
         if (dvbdmxfeed->pid>0x1fff)
@@ -3888,7 +4015,9 @@ dvb_stop_feed(dvb_demux_feed_t *dvbdmxfe
         dvb_demux_t *dvbdmx=dvbdmxfeed->demux;
         struct dvb_struct *dvb=(struct dvb_struct *) dvbdmx->priv;
 
-        if (dvb->card_type==DVB_CARD_TT_BUDGET) 
+        if (dvb->card_type==DVB_CARD_TT_BUDGET ||
+            dvb->card_type==DVB_CARD_TT_BUDGET_CI ||
+            dvb->card_type==DVB_CARD_KNC1)  
                 return TTBStop(dvb); 
 
         if (dvbdmxfeed->type==DMX_TYPE_TS) {
@@ -4062,7 +4191,8 @@ void ci_ll_release(ring_buffer_t *cirbuf
 }
 
 
-int ci_ll_reset(ring_buffer_t *cibuf, struct file *file, int slots, ca_slot_info_t 
*slot)
+static int 
+ci_ll_reset(ring_buffer_t *cibuf, struct file *file, int slots, ca_slot_info_t *slot)
 {
        int i;
 
@@ -5382,7 +5512,9 @@ dvb_register(struct dvb_struct *dvb)
                 DmxDevInit(&dvb->dmxdev);
         }
 
-        if (dvb->card_type==DVB_CARD_TT_BUDGET) {
+        if (dvb->card_type==DVB_CARD_TT_BUDGET    ||
+            dvb->card_type==DVB_CARD_TT_BUDGET_CI ||
+            dvb->card_type==DVB_CARD_KNC1) {
                 dvbdemux->filternum=256;
                 dvbdemux->feednum=256;
                 dvbdemux->start_feed=dvb_start_feed;
@@ -5462,7 +5594,9 @@ dvb_register(struct dvb_struct *dvb)
                 if (dvb->frontend.type==DVB_C || dvb->frontend.type==DVB_T)
                         dvb->dvb_devs=&dvbc_devs;
         }
-        if (dvb->card_type==DVB_CARD_TT_BUDGET) {
+        if (dvb->card_type==DVB_CARD_TT_BUDGET    ||
+            dvb->card_type==DVB_CARD_TT_BUDGET_CI ||
+            dvb->card_type==DVB_CARD_KNC1) {
                 if (dvb->frontend.type==DVB_S)
                         dvb->dvb_devs=&ttbs_devs;
                 if (dvb->frontend.type==DVB_C || dvb->frontend.type==DVB_T)
@@ -5507,6 +5641,14 @@ get_card_type(struct pci_dev *dev)
                 type=DVB_CARD_TT_SIEMENS;
                 break;
 
+        case 0x1131:
+                switch (dev->subsystem_device) {
+                case 0x4f56: 
+                        type=DVB_CARD_KNC1;
+                        break;                  
+                }
+                break;                  
+
         case 0x13c2:
                 switch (dev->subsystem_device) {
 
@@ -5516,6 +5658,9 @@ get_card_type(struct pci_dev *dev)
                 case 0x1005: /* WinTV-NOVA-T */
                         type=DVB_CARD_TT_BUDGET;
                         break;                  
+                case 0x100c: /* WinTV-NOVA-CI */
+                        type=DVB_CARD_TT_BUDGET_CI;
+                        break;                  
 
                 case 0x0000: /* Siemens cable and sat card (maybe older version?) */
                 case 0x0001: /* Technotrend, Hauppauge (maybe retail version ?)   */
@@ -5535,6 +5680,52 @@ get_card_type(struct pci_dev *dev)
         return type;
 }
 
+static const u8 saa7113_tab[] = {
+       0x01, 0x08,
+       0x02, 0xc0,
+       0x03, 0x33,
+       0x04, 0x00,
+       0x05, 0x00,
+       0x06, 0xeb,
+       0x07, 0xe0,
+       0x08, 0x28,
+       0x09, 0x00,
+       0x0a, 0x80,
+       0x0b, 0x47,
+       0x0c, 0x40,
+       0x0d, 0x00,
+       0x0e, 0x01,
+        0x0f, 0x44,
+
+       0x10, 0x08,
+       0x11, 0x0c,
+       0x12, 0x7b,
+       0x13, 0x00,
+        0x15, 0x00,  0x16, 0x00,  0x17, 0x00,
+
+        0x57, 0xff, 
+        0x40, 0x82,  0x58, 0x00,  0x59, 0x54,  0x5a, 0x07,
+        0x5b, 0x83,  0x5e, 0x00,
+        0xff
+};
+
+
+
+static void
+init_saa7113(struct dvb_struct *dvb)
+{
+        const u8 *data=saa7113_tab;
+        
+        if (i2c_writereg(dvb, 0x4a, 0x01, 0x08)!=1)
+                return;
+        printk("dvb%d: SAA7113 detected and initializing\n", dvb->num);
+        while (*data!=0xff) {
+                i2c_writereg(dvb, 0x4a, *data, *(data+1));
+                data+=2;
+        }
+        printk("saa7113: status=%02x\n", i2c_readreg(dvb, 0x4a, 0x1f));
+}
+
 
 __init static int 
 init_card(struct dvb_struct *dvb, int num, 
@@ -5612,18 +5803,41 @@ init_card(struct dvb_struct *dvb, int nu
                 kernel_thread(arm_thread, (void *)dvb, 0);
         }
 
-        if (dvb->card_type==DVB_CARD_TT_BUDGET) {
-                saa7146_write(dvb->saa_mem, DD1_INIT, 0x02000600);
+        if (dvb->card_type==DVB_CARD_TT_BUDGET ||
+            dvb->card_type==DVB_CARD_TT_BUDGET_CI||
+            dvb->card_type==DVB_CARD_KNC1) {
+                dvb->ttb_virt=pci_alloc_consistent(dvb->pdev, 188*1024,
+                                                   &dvb->ttb_bus);
+                if (!dvb->ttb_virt) 
+                        return -1;
+        }
+
+        if (dvb->card_type==DVB_CARD_TT_BUDGET ||
+            dvb->card_type==DVB_CARD_TT_BUDGET_CI) {
+                saa7146_write(dvb->saa_mem, DD1_INIT, 0x06000600);
                 saa7146_write(dvb->saa_mem, MC2, 
                               (MASK_09 | MASK_25 | MASK_10 | MASK_26));
                 setgpio(dvb, 2, GPIO_OUTHI); /* frontend power on */
         }
 
+        if (dvb->card_type==DVB_CARD_KNC1) {
+                saa7146_write(dvb->saa_mem, DD1_INIT, 0x07000600);
+                saa7146_write(dvb->saa_mem, MC2, 
+                              (MASK_09 | MASK_25 | MASK_10 | MASK_26));
+                setgpio(dvb, 0, GPIO_OUTLO);
+                ddelay(10);
+                setgpio(dvb, 0, GPIO_OUTHI); /* set analog in on, CI off */
+                init_saa7113(dvb);
+                if(vid_register(dvb) < 0)
+                        return -1;
+        }
+
         /* figure out and init frontend */
         InitFront(dvb);
 
         /* remaining inits according to card and frontend type */
 
+                
         if (dvb->card_type==DVB_CARD_TT_SIEMENS) {
                 
                 /* register video4linux device */
@@ -5837,13 +6051,21 @@ exit_dvb(void)
                 free_ipack(&dvbs[i].ipack[0]);
                 free_ipack(&dvbs[i].ipack[1]);
                 vfree(dvbs[i].iobuf);
+                if (dvbs[i].card_type==DVB_CARD_TT_BUDGET ||
+                    dvbs[i].card_type==DVB_CARD_TT_BUDGET_CI||
+                    dvbs[i].card_type==DVB_CARD_KNC1) 
+                        pci_free_consistent(dvbs[i].pdev, 188*1024, 
+                                            dvbs[i].ttb_virt, 
+                                            dvbs[i].ttb_bus);
+
                 pci_free_consistent(dvbs[i].pdev, 8192, 
                                     dvbs[i].debi_virt,
                                     dvbs[i].debi_bus);
                 
-                if (dvbs[i].card_type==DVB_CARD_TT_SIEMENS) {
+                if (dvbs[i].card_type==DVB_CARD_TT_SIEMENS||
+                    dvbs[i].card_type==DVB_CARD_KNC1) 
                         vid_unregister(&dvbs[i]);
-                }
+
                 dvb_unregister(&dvbs[i]);
         }
         if ( saa7146_del_extension(&dvb_extension)) 
Index: dvb.h
===================================================================
RCS file: /cvs/linuxtv/DVB/driver/Attic/dvb.h,v
retrieving revision 1.59
retrieving revision 1.61
diff -p -u -r1.59 -r1.61
--- dvb.h       22 Apr 2002 00:04:12 -0000      1.59
+++ dvb.h       9 Jul 2002 13:01:46 -0000       1.61
@@ -520,6 +520,8 @@ struct dvb_struct {
         int card_type;         /* basic card type */
 #define DVB_CARD_TT_SIEMENS   0
 #define DVB_CARD_TT_BUDGET    1
+#define DVB_CARD_TT_BUDGET_CI 2
+#define DVB_CARD_KNC1         3
 
         int adac_type;         /* audio DAC type */
 #define DVB_ADAC_TI       0
@@ -647,6 +649,9 @@ struct dvb_struct {
         void               *saa_mem;
         void               *debi_virt;
         dma_addr_t          debi_bus;
+
+        void               *ttb_virt;
+        dma_addr_t          ttb_bus;
 
         dvb_front_t         frontend;
         sec_t               sec;
Index: dvb_demux.c
===================================================================
RCS file: /cvs/linuxtv/DVB/driver/dvb_demux.c,v
retrieving revision 1.30
retrieving revision 1.31
diff -p -u -r1.30 -r1.31
--- dvb_demux.c 3 May 2002 14:16:14 -0000       1.30
+++ dvb_demux.c 1 Aug 2002 17:46:11 -0000       1.31
@@ -500,7 +500,9 @@ dmx_ts_feed_set_type(dmx_ts_feed_t *feed
         dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed;
         dvb_demux_t *dvbdmx=dvbdmxfeed->demux;
   
-        down(&dvbdmx->mutex);
+        if (down_interruptible(&dvbdmx->mutex))
+               return -ERESTARTSYS;
+
         dvbdmxfeed->ts_type=type;
         dvbdmxfeed->pes_type=pes_type;
 
@@ -559,7 +561,9 @@ dmx_ts_feed_set(struct dmx_ts_feed_s* fe
         dvb_demux_t *dvbdmx=dvbdmxfeed->demux;
        int ret;
        
-        down(&dvbdmx->mutex);
+        if (down_interruptible(&dvbdmx->mutex))
+               return -ERESTARTSYS;
+
        ret=dmx_pid_set(pid, dvbdmxfeed);
        if (ret<0) {
                up(&dvbdmx->mutex);
@@ -599,7 +603,9 @@ dmx_ts_feed_start_filtering(struct dmx_t
         dvb_demux_t *dvbdmx=dvbdmxfeed->demux;
        int ret;
 
-        down(&dvbdmx->mutex);
+        if (down_interruptible(&dvbdmx->mutex))
+               return -ERESTARTSYS;
+
         if (dvbdmxfeed->state!=DMX_STATE_READY ||
            dvbdmxfeed->type!=DMX_TYPE_TS) {
                up(&dvbdmx->mutex);
@@ -629,7 +635,9 @@ dmx_ts_feed_stop_filtering(struct dmx_ts
         dvb_demux_t *dvbdmx=dvbdmxfeed->demux;
        int ret;
 
-        down(&dvbdmx->mutex);
+        if (down_interruptible(&dvbdmx->mutex))
+               return -ERESTARTSYS;
+
         if (dvbdmxfeed->state<DMX_STATE_GO) {
                up(&dvbdmx->mutex);
                 return -EINVAL;
@@ -655,7 +663,9 @@ static int dvbdmx_allocate_ts_feed(dmx_d
         dvb_demux_t *dvbdmx=(dvb_demux_t *) demux;
         dvb_demux_feed_t *dvbdmxfeed;
 
-        down(&dvbdmx->mutex);
+        if (down_interruptible(&dvbdmx->mutex))
+               return -ERESTARTSYS;
+
         if (!(dvbdmxfeed=DvbDmxFeedAlloc(dvbdmx))) {
                up(&dvbdmx->mutex);
                 return -EBUSY;
@@ -696,7 +706,9 @@ static int dvbdmx_release_ts_feed(dmx_de
         dvb_demux_t *dvbdmx=(dvb_demux_t *) demux;
         dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed;
 
-        down(&dvbdmx->mutex);
+        if (down_interruptible(&dvbdmx->mutex))
+               return -ERESTARTSYS;
+
         if (dvbdmxfeed->state==DMX_STATE_FREE) {
                up(&dvbdmx->mutex);
                 return -EINVAL;
@@ -773,7 +785,9 @@ dmx_section_feed_allocate_filter(struct 
         dvb_demux_t *dvbdemux=dvbdmxfeed->demux;
         dvb_demux_filter_t *dvbdmxfilter;
 
-       down(&dvbdemux->mutex);
+       if (down_interruptible(&dvbdemux->mutex))
+               return -ERESTARTSYS;
+
         dvbdmxfilter=DvbDmxFilterAlloc(dvbdemux);
         if (!dvbdmxfilter) {
                up(&dvbdemux->mutex);
@@ -805,7 +819,10 @@ dmx_section_feed_set(struct dmx_section_
 
         if (pid>0x1fff)
                 return -EINVAL;
-        down(&dvbdmx->mutex);
+
+       if (down_interruptible(&dvbdmx->mutex))
+               return -ERESTARTSYS;
+
         if (dvbdmxfeed->pid!=0xffff) {
                 dvbdmx->pid2feed[dvbdmxfeed->pid]=0;
                 dvbdmxfeed->pid=0xffff;
@@ -846,7 +863,9 @@ dmx_section_feed_start_filtering(dmx_sec
         dvb_demux_t *dvbdmx=dvbdmxfeed->demux;
        int ret;
 
-        down(&dvbdmx->mutex);
+        if (down_interruptible(&dvbdmx->mutex))
+               return -ERESTARTSYS;
+
         if (feed->is_filtering) {
                up(&dvbdmx->mutex);
                return -EBUSY;
@@ -882,7 +901,9 @@ dmx_section_feed_stop_filtering(struct d
         dvb_demux_t *dvbdmx=dvbdmxfeed->demux;
         int ret;
 
-        down(&dvbdmx->mutex);
+        if (down_interruptible(&dvbdmx->mutex))
+               return -ERESTARTSYS;
+
         if (!dvbdmx->stop_feed) {
                up(&dvbdmx->mutex);
                 return -1;
@@ -904,7 +925,9 @@ dmx_section_feed_release_filter(dmx_sect
         dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed;
         dvb_demux_t *dvbdmx=dvbdmxfeed->demux;
 
-        down(&dvbdmx->mutex);
+        if (down_interruptible(&dvbdmx->mutex))
+               return -ERESTARTSYS;
+
         if (dvbdmxfilter->feed!=dvbdmxfeed) {
                up(&dvbdmx->mutex);
                 return -EINVAL;
@@ -934,7 +957,9 @@ static int dvbdmx_allocate_section_feed(
         dvb_demux_t *dvbdmx=(dvb_demux_t *) demux;
         dvb_demux_feed_t *dvbdmxfeed;
 
-        down(&dvbdmx->mutex);
+        if (down_interruptible(&dvbdmx->mutex))
+               return -ERESTARTSYS;
+
         if (!(dvbdmxfeed=DvbDmxFeedAlloc(dvbdmx))) {
                up(&dvbdmx->mutex);
                 return -EBUSY;
@@ -967,7 +992,9 @@ static int dvbdmx_release_section_feed(d
         dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed;
         dvb_demux_t *dvbdmx=(dvb_demux_t *) demux;
 
-        down(&dvbdmx->mutex);
+        if (down_interruptible(&dvbdmx->mutex))
+               return -ERESTARTSYS;
+
         if (dvbdmxfeed->state==DMX_STATE_FREE) {
                up(&dvbdmx->mutex);
                 return -EINVAL;
@@ -1020,7 +1047,9 @@ static int dvbdmx_write(dmx_demux_t *dem
             (demux->frontend->source!=DMX_MEMORY_FE))
                 return -EINVAL;
 
-        down(&dvbdemux->mutex);
+        if (down_interruptible(&dvbdemux->mutex))
+               return -ERESTARTSYS;
+
         DvbDmxSWFilter(dvbdemux, buf, count);
         up(&dvbdemux->mutex);
         return count;
@@ -1083,7 +1112,9 @@ static int dvbdmx_connect_frontend(dmx_d
         if (demux->frontend)
                 return -EINVAL;
         
-        down(&dvbdemux->mutex);
+        if (down_interruptible(&dvbdemux->mutex))
+               return -ERESTARTSYS;
+
         demux->frontend=frontend;
         up(&dvbdemux->mutex);
         return 0;
@@ -1093,7 +1124,9 @@ static int dvbdmx_disconnect_frontend(dm
 {
         dvb_demux_t *dvbdemux=(dvb_demux_t *) demux;
 
-        down(&dvbdemux->mutex);
+        if (down_interruptible(&dvbdemux->mutex))
+               return -ERESTARTSYS;
+
         demux->frontend=NULL;
         up(&dvbdemux->mutex);
         return 0;
Index: dvb_frontend.c
===================================================================
RCS file: /cvs/linuxtv/DVB/driver/dvb_frontend.c,v
retrieving revision 1.8
retrieving revision 1.10
diff -p -u -r1.8 -r1.10
--- dvb_frontend.c      18 Apr 2002 23:36:25 -0000      1.8
+++ dvb_frontend.c      1 Aug 2002 17:46:11 -0000       1.10
@@ -192,7 +192,7 @@ tuner_command(dvb_front_t *fe, unsigned 
         if (cmd == TUNER_SET_TVFREQ &&
             fe->demod && 
             fe->demod_type==DVB_DEMOD_STV0299) {
-                u8 msg[2]={ 0x05, 0x85 }; 
+                u8 msg[2]={ 0x05, 0xb5 }; 
                 
                 dvb_frontend_demod_command(fe, FE_WRITEREG, msg); 
                 fe->tuner->driver->command(fe->tuner, cmd, arg);
@@ -466,7 +466,9 @@ fe_thread(void *data)
                if (fe->exit || signal_pending(current))
                        break;
 
-                down_interruptible(&fe->sem);
+                if (down_interruptible(&fe->sem))
+                       break;
+
                switch (fe->tuning) {
                 case FE_STATE_TUNE:
                         fe_tune(fe);
@@ -492,7 +494,10 @@ dvb_frontend_stop(dvb_front_t *fe)
 {
         if (fe->tuning==FE_STATE_IDLE)
                 return;
-        down_interruptible(&fe->sem);
+
+       if (down_interruptible(&fe->sem))
+               return;
+
         fe->tuning=FE_STATE_IDLE;
        wake_up_interruptible(&fe->wait);
         up(&fe->sem);
@@ -512,8 +517,11 @@ dvb_frontend_tune(dvb_front_t *fe, Front
                 return -EINVAL;
 
        memcpy(&fe->new_param, new_param, sizeof(FrontendParameters));
-        down_interruptible(&fe->sem);
-        fe->tuning=FE_STATE_TUNE;
+
+       if (down_interruptible(&fe->sem))
+               return -ERESTARTSYS;
+
+       fe->tuning=FE_STATE_TUNE;
        wake_up_interruptible(&fe->wait);
         up(&fe->sem);
        return 0;
Index: dvbdev.c
===================================================================
RCS file: /cvs/linuxtv/DVB/driver/dvbdev.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -p -u -r1.11 -r1.12
--- dvbdev.c    9 Jan 2002 12:57:33 -0000       1.11
+++ dvbdev.c    11 Jun 2002 16:30:51 -0000      1.12
@@ -41,7 +41,7 @@
 MODULE_DESCRIPTION("Device registrar for DVB drivers");
 MODULE_AUTHOR("Marcus Metzler, Ralph Metzler");
 #ifdef MODULE_LICENSE
-MODULE_LICENSE("LGPL");
+MODULE_LICENSE("GPL and additional rights");
 #endif
 #endif
 
Index: modules.conf
===================================================================
RCS file: /cvs/linuxtv/DVB/driver/modules.conf,v
retrieving revision 1.1
retrieving revision 1.2
diff -p -u -r1.1 -r1.2
--- modules.conf        9 Jan 2002 13:00:42 -0000       1.1
+++ modules.conf        15 May 2002 00:26:52 -0000      1.2
@@ -1,4 +1,5 @@
 alias char-major-250 dvb
+alias /dev/ost/* dvb
 options dvb init_chan=2 pids_off=0
 below saa7146_core VES1893 VES1820 L64781 stv0299 tuner
 below dvb saa7146_v4l
Index: saa7146_core.c
===================================================================
RCS file: /cvs/linuxtv/DVB/driver/Attic/saa7146_core.c,v
retrieving revision 1.17
retrieving revision 1.18
diff -p -u -r1.17 -r1.18
--- saa7146_core.c      15 Apr 2002 00:49:12 -0000      1.17
+++ saa7146_core.c      11 Jun 2002 16:30:51 -0000      1.18
@@ -30,6 +30,7 @@
 #endif
 #include <asm/io.h>            /* for accessing the pci-device */
 #include <linux/vmalloc.h>     /* for module-version */
+#include <linux/highmem.h>
 
 #include "saa7146_defs.h"
 #include "saa7146_core.h"
@@ -820,10 +821,10 @@ int       saa7146_add_extension(struct saa7146
        for (i = 0; i < SAA7146_MAX_EXTENSIONS; i++) {
                if (NULL == saa7146_ext[i])
                        break;
-               if (SAA7146_MAX_EXTENSIONS == i) {
-                       printk(KERN_WARNING "saa7146.o: attach_extension(%s) - enlarge 
SAA7146_MAX_EXTENSIONS.\n",ext->name);
-                       return -ENOMEM;
-               }
+       }
+       if (SAA7146_MAX_EXTENSIONS == i) {
+               printk(KERN_WARNING "saa7146.o: attach_extension(%s) - enlarge 
+SAA7146_MAX_EXTENSIONS.\n",ext->name);
+               return -ENOMEM;
        }
        saa7146_ext[i] = ext;
        saa7146_extension_count++;
Index: stv0299.c
===================================================================
RCS file: /cvs/linuxtv/DVB/driver/Attic/stv0299.c,v
retrieving revision 1.15
retrieving revision 1.18
diff -p -u -r1.15 -r1.18
--- stv0299.c   18 Apr 2002 23:36:25 -0000      1.15
+++ stv0299.c   9 Jul 2002 13:01:46 -0000       1.18
@@ -55,11 +55,11 @@ init_tab[] = {
        0x02, 0x30,   // P: 0  SERCLK: 0 VCO:ON  STDBY:0
  
        0x03, 0x00,
-       0x04, 0x88,   // F22FR, F22=
-       0x05, 0x0f,   // SDAT:0 SCLT:0 I2CT:0
+       0x04, 0x7d,   // F22FR, F22=352MHz/128/125
+       0x05, 0x35,   // SDAT:0 SCLT:0 I2CT:0
        0x06, 0x00,   // DAC mode and MSB 
        0x07, 0x00,   // DAC LSB
-       0x08, 0x40,   // DiSEqC
+       0x08, 0x43,   // DiSEqC
        0x09, 0x00,
        0x0a, 0x42, 
        0x0c, 0x51,   // QPSK reverse:1  Nyquist:0 OP0 val:1 OP0 con:1 OP1 val:1 OP1 
con:1 
@@ -204,6 +204,10 @@ static int SetInversion(struct i2c_clien
                val=0x00;
                break;
        }
+       /* MAJOR HACK ALERT */
+       if (readreg(client, 0x0f)==0x92)
+               val^=1;
+
        writereg(client, 0x0c, 
                 (readreg(client, 0x0c)&0xfe)|val);
        return 0;
@@ -319,7 +323,7 @@ static int attach_adapter(struct i2c_ada
 
         dprintk("stv0299: attaching stv0299 at 0x%02x ", (client->addr)<<1);
         dprintk("to adapter %s\n", adap->name);
-        writereg(client, 0x05, 0x80);
+        writereg(client, 0x05, 0xb5);
        MOD_INC_USE_COUNT;
         return 0;
 }
@@ -367,19 +371,35 @@ static int dvb_command(struct i2c_client
         case FE_READ_BER:
        {
                u32 *ber=(u32 *) arg;
-               *ber=0;
+
+               writereg(client,0x24,0x13);
+               *ber = readreg(client,0x1d);
+                *ber|=(readreg(client,0x1e)<<8);
+               *ber*=38147;
+               *ber/=10;
                break;
        }
         case FE_READ_SIGNAL_STRENGTH:
        {
                s32 *signal=(s32 *) arg;
-               *signal=0;
+               
+               #warning FIXME! the value must be scaled properly
+               u32 s;
+               s = readreg(client,0x19);
+                s|=(readreg(client,0x18)<<8);          
+               *signal=-70000000+(0xffff-s)*1000;
                break;
        }
         case FE_READ_SNR:
        {
                s32 *snr=(s32 *) arg;
-               *snr=0;
+               u32 nir;
+               nir = readreg(client,0x25);
+                nir|=(readreg(client,0x24)<<8);
+               if (nir>11188)
+                 *snr=0;
+               else
+                 *snr=19020000-1700*nir;
                break;
        }
        case FE_READ_UNCORRECTED_BLOCKS: 
Index: tuner.c
===================================================================
RCS file: /cvs/linuxtv/DVB/driver/Attic/tuner.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -p -u -r1.16 -r1.17
--- tuner.c     4 Mar 2002 10:44:34 -0000       1.16
+++ tuner.c     9 Jul 2002 13:01:46 -0000       1.17
@@ -215,7 +215,7 @@ static struct tunertype tuners[] = {
                 174000000UL, 454000000UL, 0xa1, 0x92, 0x34, 0x8e},
         {"TSA5059", Philips, DVBS, 
                  100000000UL, 2700000000UL, 125000, 1, 0,
-                0xffffffffUL, 0xffffffffUL, 0x30, 0x30, 0x30, 0x95},
+                0xffffffffUL, 0xffffffffUL, 0x20, 0x20, 0x20, 0x84},
         {"TSA5522", Philips, DVBS, 
                 100000000UL, 2700000000UL, 125000, 1, 0, 
                 0xffffffffUL, 0xffffffffUL, 0x00, 0x00, 0x00, 0x8e},


Reply via email to