Mailing List archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[linux-dvb] Re: More thoughts on coldboot driver crash



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 <mistert@rz.fh-augsburg.de>
+
+ * 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},

Home | Main Index | Thread Index