[linux-dvb] Another Twinhan VP20310 problem: me too!

Bas Neggers Dr_bazz at gmx.net
Mon Jan 9 21:13:34 CET 2006


Hi Manu, Joel,

I have exactly the same problem with my TwinHan VP2031 as Joel (Fedora Core
4, kernel 2.6.14). Tuning and zapping now work, I find all channels (thanks
for the czap -r switch info!), but signal is garbled (loads of green
squares, very occasionally a second or so with some recognizable images in
between the green). I use dvb-kernel modules compiled from fresh cvs source
code.

Have been struggling with this for weeks now, and am happy to find a few
shoulders to cry on ;-) Just kidding, this email list is great and you all
are very helpful.

I mailed Joel directly yesterday, and he forwarded me the TarBall that Manu
Abrahams sended him today
(cgi-bin-hgwebdir-cgi-v4l-algo-test-675755d11eb2.tar.bz2). I am also living
in the Netherlands, and even use the same cable provider as Joel (Casema).

I compiled the tarbal, which works fine, but when first removing and then
modprobing the modules I get loads of error messages (see below, also
dmesg). Joel just emailed me he got the same (lack of) results. Do we
compile against the wrong kernel? Any ideas? I'd love to start using this
card, and hate having to capitulate and install Windoze...

Thanks for looking into this!

Cheers,

Bas

--- error messages when inserting modules:
[root at mediapc cgi-bin-hgwebdir-cgi-v4l-algo-test-675755d11eb2]# rmmod bttv
ERROR: Module bttv is in use by bt878
[root at mediapc cgi-bin-hgwebdir-cgi-v4l-algo-test-675755d11eb2]# rmmod bt878
ERROR: Module bt878 is in use by dst
[root at mediapc cgi-bin-hgwebdir-cgi-v4l-algo-test-675755d11eb2]# rmmod dst
ERROR: Module dst is in use by dst_ca
[root at mediapc cgi-bin-hgwebdir-cgi-v4l-algo-test-675755d11eb2]# rmmod dst_ca
[root at mediapc cgi-bin-hgwebdir-cgi-v4l-algo-test-675755d11eb2]# rmmod dst
[root at mediapc cgi-bin-hgwebdir-cgi-v4l-algo-test-675755d11eb2]# rmmod bt878
[root at mediapc cgi-bin-hgwebdir-cgi-v4l-algo-test-675755d11eb2]# rmmod bttv
[root at mediapc cgi-bin-hgwebdir-cgi-v4l-algo-test-675755d11eb2]# modprobe
bttv
FATAL: Error inserting bttv
(/lib/modules/2.6.14-1.1656_FC4.netdev.7/kernel/drivers/media/video/bttv.ko):
Unknown symbol in module, or unknown parameter (see dmesg)
FATAL: Error running install command for bttv
[root at mediapc cgi-bin-hgwebdir-cgi-v4l-algo-test-675755d11eb2]# modprobe
bt878
FATAL: Error inserting bttv
(/lib/modules/2.6.14-1.1656_FC4.netdev.7/kernel/drivers/media/video/bttv.ko):
Unknown symbol in module, or unknown parameter (see dmesg)
WARNING: Error running install command for bttv
FATAL: Error inserting bt878
(/lib/modules/2.6.14-1.1656_FC4.netdev.7/kernel/drivers/media/dvb/bt8xx/bt878.ko):
Unknown symbol in module, or unknown parameter (see dmesg)
[root at mediapc cgi-bin-hgwebdir-cgi-v4l-algo-test-675755d11eb2]# modprobe dst
FATAL: Error inserting bttv
(/lib/modules/2.6.14-1.1656_FC4.netdev.7/kernel/drivers/media/video/bttv.ko):
Unknown symbol in module, or unknown parameter (see dmesg)
WARNING: Error running install command for bttv
WARNING: Error inserting bt878
(/lib/modules/2.6.14-1.1656_FC4.netdev.7/kernel/drivers/media/dvb/bt8xx/bt878.ko):
Unknown symbol in module, or unknown parameter (see dmesg)
FATAL: Error inserting dst
(/lib/modules/2.6.14-1.1656_FC4.netdev.7/kernel/drivers/media/dvb/bt8xx/dst.ko):
Unknown symbol in module, or unknown parameter (see dmesg)
[root at mediapc cgi-bin-hgwebdir-cgi-v4l-algo-test-675755d11eb2]# modprobe
bt878
FATAL: Error inserting bttv
(/lib/modules/2.6.14-1.1656_FC4.netdev.7/kernel/drivers/media/video/bttv.ko):
Unknown symbol in module, or unknown parameter (see dmesg)
WARNING: Error running install command for bttv
FATAL: Error inserting bt878
(/lib/modules/2.6.14-1.1656_FC4.netdev.7/kernel/drivers/media/dvb/bt8xx/bt878.ko):
Unknown symbol in module, or unknown parameter (see dmesg)
[root at mediapc cgi-bin-hgwebdir-cgi-v4l-algo-test-675755d11eb2]# rmmod
dvb_bt8xx
ERROR: Module dvb_bt8xx does not exist in /proc/modules
[root at mediapc cgi-bin-hgwebdir-cgi-v4l-algo-test-675755d11eb2]# modprobe
dvb_bt8xx
FATAL: Error inserting bttv
(/lib/modules/2.6.14-1.1656_FC4.netdev.7/kernel/drivers/media/video/bttv.ko):
Unknown symbol in module, or unknown parameter (see dmesg)
WARNING: Error running install command for bttv
WARNING: Error inserting bt878
(/lib/modules/2.6.14-1.1656_FC4.netdev.7/kernel/drivers/media/dvb/bt8xx/bt878.ko):
Unknown symbol in module, or unknown parameter (see dmesg)
WARNING: Error inserting dst
(/lib/modules/2.6.14-1.1656_FC4.netdev.7/kernel/drivers/media/dvb/bt8xx/dst.ko):
Unknown symbol in module, or unknown parameter (see dmesg)
WARNING: Error inserting dst_ca
(/lib/modules/2.6.14-1.1656_FC4.netdev.7/kernel/drivers/media/dvb/bt8xx/dst_ca.ko):
Unknown symbol in module, or unknown parameter (see dmesg)
FATAL: Error inserting dvb_bt8xx
(/lib/modules/2.6.14-1.1656_FC4.netdev.7/kernel/drivers/media/dvb/bt8xx/dvb-bt8xx.ko):
Unknown symbol in module, or unknown parameter (see dmesg)
[root at mediapc cgi-bin-hgwebdir-cgi-v4l-algo-test-675755d11eb2]# 

The relevant parts of my dmesg (before modules loaded fine, card was
detected):

bttv: disagrees about version of symbol btcx_riscmem_alloc
bttv: Unknown symbol btcx_riscmem_alloc
bttv: disagrees about version of symbol btcx_riscmem_free
bttv: Unknown symbol btcx_riscmem_free
bttv: disagrees about version of symbol tveeprom_hauppauge_analog
bttv: Unknown symbol tveeprom_hauppauge_analog
bttv: disagrees about version of symbol btcx_riscmem_alloc
bttv: Unknown symbol btcx_riscmem_alloc
bttv: disagrees about version of symbol btcx_riscmem_free
bttv: Unknown symbol btcx_riscmem_free
bttv: disagrees about version of symbol tveeprom_hauppauge_analog
bttv: Unknown symbol tveeprom_hauppauge_analog
bt878: Unknown symbol bttv_read_gpio
bt878: Unknown symbol bttv_write_gpio
bt878: Unknown symbol bttv_gpio_enable
bttv: disagrees about version of symbol btcx_riscmem_alloc
bttv: Unknown symbol btcx_riscmem_alloc
bttv: disagrees about version of symbol btcx_riscmem_free
bttv: Unknown symbol btcx_riscmem_free
bttv: disagrees about version of symbol tveeprom_hauppauge_analog
bttv: Unknown symbol tveeprom_hauppauge_analog
bt878: Unknown symbol bttv_read_gpio
bt878: Unknown symbol bttv_write_gpio
bt878: Unknown symbol bttv_gpio_enable
dst: Unknown symbol bt878_device_control
bttv: disagrees about version of symbol btcx_riscmem_alloc
bttv: Unknown symbol btcx_riscmem_alloc
bttv: disagrees about version of symbol btcx_riscmem_free
bttv: Unknown symbol btcx_riscmem_free
bttv: disagrees about version of symbol tveeprom_hauppauge_analog
bttv: Unknown symbol tveeprom_hauppauge_analog
bt878: Unknown symbol bttv_read_gpio
bt878: Unknown symbol bttv_write_gpio
bt878: Unknown symbol bttv_gpio_enable
bttv: disagrees about version of symbol btcx_riscmem_alloc
bttv: Unknown symbol btcx_riscmem_alloc
bttv: disagrees about version of symbol btcx_riscmem_free
bttv: Unknown symbol btcx_riscmem_free
bttv: disagrees about version of symbol tveeprom_hauppauge_analog
bttv: Unknown symbol tveeprom_hauppauge_analog
bt878: Unknown symbol bttv_read_gpio
bt878: Unknown symbol bttv_write_gpio
bt878: Unknown symbol bttv_gpio_enable
dst: Unknown symbol bt878_device_control
dst_ca: Unknown symbol write_dst
dst_ca: Unknown symbol dst_pio_disable
dst_ca: Unknown symbol dst_comm_init
dst_ca: Unknown symbol read_dst
dst_ca: Unknown symbol dst_check_sum
dst_ca: Unknown symbol dst_error_bailout
dst_ca: Unknown symbol dst_wait_dst_ready
dst_ca: Unknown symbol rdc_reset_state
dst_ca: Unknown symbol dst_error_recovery
dvb_bt8xx: disagrees about version of symbol dvb_dmxdev_init
dvb_bt8xx: Unknown symbol dvb_dmxdev_init
dvb_bt8xx: disagrees about version of symbol nxt6000_attach
dvb_bt8xx: Unknown symbol nxt6000_attach
dvb_bt8xx: disagrees about version of symbol mt352_attach
dvb_bt8xx: Unknown symbol mt352_attach
dvb_bt8xx: Unknown symbol bt878_num
dvb_bt8xx: Unknown symbol bttv_sub_unregister
dvb_bt8xx: Unknown symbol dst_attach
dvb_bt8xx: Unknown symbol bttv_write_gpio
dvb_bt8xx: disagrees about version of symbol dvb_dmx_swfilter_204
dvb_bt8xx: Unknown symbol dvb_dmx_swfilter_204
dvb_bt8xx: Unknown symbol bttv_sub_register
dvb_bt8xx: disagrees about version of symbol dvb_dmx_release
dvb_bt8xx: Unknown symbol dvb_dmx_release
dvb_bt8xx: disagrees about version of symbol sp887x_attach
dvb_bt8xx: Unknown symbol sp887x_attach
dvb_bt8xx: Unknown symbol bttv_get_pcidev
dvb_bt8xx: disagrees about version of symbol dvb_net_init
dvb_bt8xx: Unknown symbol dvb_net_init
dvb_bt8xx: disagrees about version of symbol dvb_dmx_swfilter
dvb_bt8xx: Unknown symbol dvb_dmx_swfilter
dvb_bt8xx: disagrees about version of symbol dvb_dmxdev_release
dvb_bt8xx: Unknown symbol dvb_dmxdev_release
dvb_bt8xx: Unknown symbol dst_ca_attach
dvb_bt8xx: Unknown symbol bt878_start
dvb_bt8xx: disagrees about version of symbol dvb_net_release
dvb_bt8xx: Unknown symbol dvb_net_release
dvb_bt8xx: Unknown symbol bttv_gpio_enable
dvb_bt8xx: disagrees about version of symbol cx24110_pll_write
dvb_bt8xx: Unknown symbol cx24110_pll_write
dvb_bt8xx: disagrees about version of symbol or51211_attach
dvb_bt8xx: Unknown symbol or51211_attach
dvb_bt8xx: disagrees about version of symbol dvb_unregister_frontend
dvb_bt8xx: Unknown symbol dvb_unregister_frontend
dvb_bt8xx: Unknown symbol bt878_stop
dvb_bt8xx: disagrees about version of symbol dvb_register_frontend
dvb_bt8xx: Unknown symbol dvb_register_frontend
dvb_bt8xx: disagrees about version of symbol mt352_write
dvb_bt8xx: Unknown symbol mt352_write
dvb_bt8xx: disagrees about version of symbol dvb_dmx_init
dvb_bt8xx: Unknown symbol dvb_dmx_init
dvb_bt8xx: Unknown symbol bt878
dvb_bt8xx: disagrees about version of symbol cx24110_attach
dvb_bt8xx: Unknown symbol cx24110_attach





Message: 4
Date: Mon, 09 Jan 2006 14:04:25 +0400
From: Manu Abraham <abraham.manu at gmail.com>
Subject: Re: [linux-dvb] Another Twinhan VP20310 problem
To: "J. van Amerongen" <joel at jovana.nl>
Cc: linux-dvb at linuxtv.org
Message-ID: <43C23529.7020700 at gmail.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed

J. van Amerongen wrote:

>I have already going through:
>http://www.linuxtv.org/pipermail/linux-dvb/2005-September/004871.html
>
>The card can tune and scan. But no picture.
>I have try:
>
>
>
>
>There is one thing I didn't try, because I can't find:
> 
>
>>try changing the dst_tlist[]  (for DCT-CI )
>>.type_flags = DST_TYPE_HAS_NEWTUNE | DST_TYPE_HAS_FW_2
>>only and see what happens.
>>   
>>

You would require this one.

This is probably fixed in the v4l-algo test tree.. But unfortunately my
link is down (on dialup right now) and hence will not be able to access
the repo. (It's holidays here and the ISP does not have tech. people to
fix it) I will send you a tarball of the tree, in case you can test it out.


Manu




------------------------------

Message: 5
Date: Mon, 09 Jan 2006 14:09:16 +0400
From: Manu Abraham <abraham.manu at gmail.com>
Subject: Re: [linux-dvb] [PATCH 3/6] DVB-PinnSat: Remove op_sync_orin
        and     irq_err_ignore
To: Edgar Toernig <froese at gmx.de>
Cc: linux-dvb at linuxtv.org
Message-ID: <43C2364C.1060201 at gmail.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed

Edgar Toernig wrote:

>The op_sync_orin and irq_err_ignore code is not really card
>specific.  Some cards set op_sync_orin but any card would
>benefit from setting it.  And irq_err_ignore just shuts up
>some error printks in the irq handler.
>
>This patch activates resyncing for all cards thus making
>op_sync_orin superfluous.
>
>irq_err_ignore is removed.  The error printks are only
>activated then debugging is turned on.
>
> 
>
To make this work you need not move the card specific application of
these parameters globally to all cards. The reason being that 
individual modules loose the capability of changing this option as all 
cards will be affected in the very same manner.

As i said earlier, i am against this patch.

The same feature can be achieved, without touching all modules .. You
can see how the very same can be achieved without stirring up so much.


Manu


Signed-off-by: Manu Abraham <manu at linuxtv.org>

# HG changeset patch
# User root at manu.kromtek.com
# Date Sat Dec 24 17:01:34 2005
# Node ID 1b4ffaea140aaff910e5d2b26451c57d2a88caa5
# parent: f515634631e7165ebcc6c995be92661f70587862
Do a RISC_SYNC also



--- a/linux/drivers/media/dvb/bt8xx/dvb-bt8xx.c    Sat Dec 24 16:54:12 2005
+++ b/linux/drivers/media/dvb/bt8xx/dvb-bt8xx.c    Sat Dec 24 17:01:34 2005
@@ -801,13 +801,13 @@
         card->gpio_mode = 0x0400c060;
         /* should be:
BT878_A_GAIN=0,BT878_A_PWRDN,BT878_DA_DPM,BT878_DA_SBR,
                   BT878_DA_IOM=1,BT878_DA_APP to enable serial
highspeed mode. */
-        card->op_sync_orin = 0;
+        card->op_sync_orin = BT878_RISC_SYNC_MASK;
         card->irq_err_ignore = BT878_AFBUS | BT878_AFDSR;
         break;

     case BTTV_BOARD_DVICO_DVBT_LITE:
         card->gpio_mode = 0x0400C060;
-        card->op_sync_orin = 0;
+        card->op_sync_orin = BT878_RISC_SYNC_MASK;
         card->irq_err_ignore = BT878_AFBUS | BT878_AFDSR;
         /* 26, 15, 14, 6, 5
          * A_PWRDN  DA_DPM DA_SBR DA_IOM_DA
@@ -823,7 +823,7 @@
     case BTTV_BOARD_NEBULA_DIGITV:
     case BTTV_BOARD_AVDVBT_761:
         card->gpio_mode = (1 << 26) | (1 << 14) | (1 << 5);
-        card->op_sync_orin = 0;
+        card->op_sync_orin = BT878_RISC_SYNC_MASK;
         card->irq_err_ignore = BT878_AFBUS | BT878_AFDSR;
         /* A_PWRDN DA_SBR DA_APP (high speed serial) */
         break;
@@ -855,7 +855,7 @@

     case BTTV_BOARD_PC_HDTV:
         card->gpio_mode = 0x0100EC7B;
-        card->op_sync_orin = 0;
+        card->op_sync_orin = BT878_RISC_SYNC_MASK;
         card->irq_err_ignore = BT878_AFBUS | BT878_AFDSR;
         break;


# HG changeset patch
# User root at manu.kromtek.com
# Date Sat Dec 24 16:54:12 2005
# Node ID f515634631e7165ebcc6c995be92661f70587862
# parent: 70e9c12d0066a13eb2902f5a5cf0610e92a7457f
Ignore FBUS and FDSR errors



--- a/linux/drivers/media/dvb/bt8xx/dvb-bt8xx.c    Wed Dec 21 13:24:21 2005
+++ b/linux/drivers/media/dvb/bt8xx/dvb-bt8xx.c    Sat Dec 24 16:54:12 2005
@@ -802,13 +802,13 @@
         /* should be:
BT878_A_GAIN=0,BT878_A_PWRDN,BT878_DA_DPM,BT878_DA_SBR,
                   BT878_DA_IOM=1,BT878_DA_APP to enable serial
highspeed mode. */
         card->op_sync_orin = 0;
-        card->irq_err_ignore = 0;
+        card->irq_err_ignore = BT878_AFBUS | BT878_AFDSR;
         break;

     case BTTV_BOARD_DVICO_DVBT_LITE:
         card->gpio_mode = 0x0400C060;
         card->op_sync_orin = 0;
-        card->irq_err_ignore = 0;
+        card->irq_err_ignore = BT878_AFBUS | BT878_AFDSR;
         /* 26, 15, 14, 6, 5
          * A_PWRDN  DA_DPM DA_SBR DA_IOM_DA
          * DA_APP(parallel) */
@@ -824,14 +824,14 @@
     case BTTV_BOARD_AVDVBT_761:
         card->gpio_mode = (1 << 26) | (1 << 14) | (1 << 5);
         card->op_sync_orin = 0;
-        card->irq_err_ignore = 0;
+        card->irq_err_ignore = BT878_AFBUS | BT878_AFDSR;
         /* A_PWRDN DA_SBR DA_APP (high speed serial) */
         break;

     case BTTV_BOARD_AVDVBT_771: //case 0x07711461:
         card->gpio_mode = 0x0400402B;
         card->op_sync_orin = BT878_RISC_SYNC_MASK;
-        card->irq_err_ignore = 0;
+        card->irq_err_ignore = BT878_AFBUS | BT878_AFDSR;
         /* A_PWRDN DA_SBR  DA_APP[0] PKTP=10 RISC_ENABLE FIFO_ENABLE*/
         break;

@@ -856,7 +856,7 @@
     case BTTV_BOARD_PC_HDTV:
         card->gpio_mode = 0x0100EC7B;
         card->op_sync_orin = 0;
-        card->irq_err_ignore = 0;
+        card->irq_err_ignore = BT878_AFBUS | BT878_AFDSR;
         break;

     default:



------------------------------

Message: 6
Date: Mon, 09 Jan 2006 14:10:13 +0400
From: Manu Abraham <abraham.manu at gmail.com>
Subject: Re: [linux-dvb] [PATCH 6/6] DVB-PinnSat: Misc cleanup and
        robustness      tweaks
To: Edgar Toernig <froese at gmx.de>
Cc: linux-dvb at linuxtv.org
Message-ID: <43C23685.7060407 at gmail.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed

Edgar Toernig wrote:

>General cleanups and some tweaks to make the code more
>robust, especially against fifo overrun errors.
>
>I still don't know what causes the audio fifo to overflow
>on some chipsets - the video fifo seems to never show
>this problem (yeah, it's two time as big but the data
>rate is much more then twice of that comming via DVB).
> 
>

The overflow does happen on certain chipset's (chipset quirks ) or due
to PCI bus saturation. Where i have seen this issue is when using
multiple cards in the order of cards > 3. But even then the PCI bus
should be able to handle this bandwidth. since a transponder is only
approx 27.5 Mbps. Even with three such cards, data rate does not even go
near the actual PCI b/w.

The reason why it overflows is data is not read from the FIFO as it
should be and the PCI bus expects larger chunks. Another way of handling
this is to reduce the latency, such that even smaller chunks can be
handled. But even then for example having a motherboard with all
peripherals on the same bus can create problems, as data bursts from
other peripherals can create a substantial delay, if latency is set too
high.

>Maybe some PCI-bridges honour the (ro) MAX_LAT register
>nowadays - it's much too high for DVB data rates.
>
>---
>
> bt878.c |  105 ++++++++++++++++++++++++++++++--------------------------
> bt878.h |   14 ++-----
> 2 files changed, 61 insertions(+), 58 deletions(-)
>
>--- 0.6/drivers/media/dvb/bt8xx/bt878.h Sat, 07 Jan 2006 02:03:06 +0100
froese (kernel-dvb/h/15_bt878.h 1.2 644)
>+++ 0.7/drivers/media/dvb/bt8xx/bt878.h Sun, 08 Jan 2006 01:45:15 +0100
froese (kernel-dvb/h/15_bt878.h 1.3 644)
>@@ -28,7 +28,7 @@
> #include "bt848.h"
> #include "bttv.h"
>
>-#define BT878_VERSION_CODE 0x000000
>+#define BT878_VERSION_CODE 0x000001
>
> #define BT878_AINT_STAT               0x100
> #define BT878_ARISCS          (0xf<<28)
>@@ -75,15 +75,6 @@
>
> #define BT878_ARISC_PC                0x120
>
>-/* BT878 FUNCTION 0 REGISTERS */
>-#define BT878_GPIO_DMA_CTL    0x10c
>-
>-/* Interrupt register */
>-#define BT878_INT_STAT                0x100
>-#define BT878_INT_MASK                0x104
>-#define BT878_I2CRACK         (1<<25)
>-#define BT878_I2CDONE         (1<<8)
>-
> #define BT878_MAX 4
>
> extern int bt878_num;
>@@ -117,6 +108,9 @@
>       dma_addr_t risc_dma;
>       u32 risc_pos;
>
>+      unsigned int errors;
>+      unsigned long error_expire;
>+
>       struct tasklet_struct tasklet;
>       int shutdown;
> };
>--- 0.6/drivers/media/dvb/bt8xx/bt878.c Sat, 07 Jan 2006 02:03:06 +0100
froese (kernel-dvb/h/16_bt878.c 1.3 644)
>+++ 0.7/drivers/media/dvb/bt8xx/bt878.c Sun, 08 Jan 2006 01:45:15 +0100
froese (kernel-dvb/h/16_bt878.c 1.4 644)
>@@ -143,9 +143,9 @@
> #define RISC_SYNC_VRO         0x0C
>
> #define RISC_FLUSH()          bt->risc_pos = 0
>-#define RISC_INSTR(instr)     bt->risc_cpu[bt->risc_pos++] =
cpu_to_le32(instr)
>+#define RISC_INSTR(instr)     bt->risc_cpu[bt->risc_pos++] =
cpu_to_le32((instr))
>
>-static int bt878_make_risc(struct bt878 *bt)
>+static int bt878_calc_line_size(struct bt878 *bt)
> 
>

calc_line_size would be misleading, since it is in fact creating the
RISC program itself.
IIRC, there is another function calculating the line size too. So you
have merged those two functions .. ?
Any specific reason why those two functions should be merged into one
function ?

> {
>       bt->block_bytes = bt->buf_size >> 4;
>       bt->block_count = 1 << 4;
>@@ -177,16 +177,15 @@
>       dprintk("bt878: risc len lines %u, bytes per line %u\n",
>                       bt->line_count, bt->line_bytes);
>       for (line = 0; line < bt->line_count; line++) {
>-              // At the beginning of every block we issue an IRQ with
previous (finished) block number set
>+              // At the beginning of every block we issue an IRQ with
>+              // previous (finished) block number set
>               if (!(buf_pos % bt->block_bytes))
>                       RISC_INSTR(RISC_WRITE | RISC_WR_SOL | RISC_WR_EOL |
>                                  RISC_IRQ |
>-                                 RISC_STATUS(((buf_pos /
>-                                               bt->block_bytes) +
>-                                              (bt->block_count -
>-                                               1)) %
>-                                             bt->block_count) | bt->
>-                                 line_bytes);
>+                                 RISC_STATUS(((buf_pos / bt->block_bytes)
+
>+                                              bt->block_count - 1) %
>+                                             bt->block_count) |
>+                                 bt->line_bytes);
>               else
>                       RISC_INSTR(RISC_WRITE | RISC_WR_SOL | RISC_WR_EOL |
>                                  bt->line_bytes);
>@@ -212,23 +211,26 @@
>       u32 int_mask;
>
>       dprintk("bt878 debug: bt878_start (ctl=%8.8x)\n", controlreg);
>-      /* complete the writing of the risc dma program now we have
>-       * the card specifics
>-       */
>-      bt878_risc_program(bt);
>+
>       controlreg &= ~0x1f;
>-      controlreg |= 0x1b;
>+      btwrite(controlreg, BT878_AGPIO_DMA_CTL);
>
> 
>


>       btwrite(bt->risc_dma, BT878_ARISC_START);
>+      bt->last_block = bt->block_count - 1;
>+
>+      bt->errors = 0;
>
>       int_mask = BT878_ARISCI;
>       if (bt878_debug)
>               int_mask |= BT878_ASCERR | BT878_AOCERR |
>                           BT878_APABORT | BT878_ARIPERR | BT878_APPERR |
>                           BT878_AFDSR | BT878_AFTRGT | BT878_AFBUS;
>-
>+      btwrite(int_mask, BT878_AINT_STAT);
>       btwrite(int_mask, BT878_AINT_MASK);
>-      btwrite(controlreg, BT878_AGPIO_DMA_CTL);
>+
>+      /* start dma (with fifo threshold at minimum) */
>+      /* just in case with a read-modify-write to flush prior writes */
>+      btor(0x13, BT878_AGPIO_DMA_CTL);
> }
>
> void bt878_stop(struct bt878 *bt)
>@@ -261,7 +263,7 @@
>
> static irqreturn_t bt878_irq(int irq, void *dev_id, struct pt_regs *regs)
> {
>-      u32 stat, astat, mask;
>+      u32 stat, astat;
>       int count;
>       struct bt878 *bt;
>
>@@ -270,13 +272,16 @@
>       count = 0;
>       while (1) {
>               stat = btread(BT878_AINT_STAT);
>-              mask = btread(BT878_AINT_MASK);
>-              if (!(astat = (stat & mask)))
>-                      return IRQ_NONE;        /* this interrupt is not for
me */
>-/*            dprintk("bt878(%d) debug: irq count %d, stat 0x%8.8x, mask
0x%8.8x\n",bt->nr,count,stat,mask); */
>-              btwrite(astat, BT878_AINT_STAT);        /* try to clear
interupt condition */
>+              astat = stat & btread(BT878_AINT_MASK);
>+              if (!astat)
>+                      break;  /* not for us */
>
>+              btwrite(astat, BT878_AINT_STAT);  /* ack interrupt */
>
>+              if (astat & BT878_ARISCI) {
>+                      bt->finished_block = (stat & BT878_ARISCS) >> 28;
>+                      tasklet_schedule(&bt->tasklet);
>+              }
>               if (astat & (BT878_ASCERR | BT878_AOCERR)) {
>                       if (bt878_verbose) {
>                               printk(KERN_ERR
>@@ -309,21 +314,33 @@
>                                     btread(BT878_ARISC_PC));
>                       }
>               }
>-              if (astat & BT878_ARISCI) {
>-                      bt->finished_block = (stat & BT878_ARISCS) >> 28;
>-                      tasklet_schedule(&bt->tasklet);
>-                      break;
>+              if (astat & ~BT878_ARISCI) {
>+                      if (time_after(jiffies, bt->error_expire))
>+                              bt->errors = 0;
>+                      bt->error_expire = jiffies + 5*HZ;
>+                      bt->errors++;
> 
>

IMHO, You shouldn't be sleeping inside an interrupt handler. Use the
tasklet itself, if you need to sleep, for a predefined period, sleep
within the tasklet. But i wouldn't advise sleeping there either, since
this will cause other *working* modules which depend on this also to sleep.

Such changes would require all 878 cards to be tested quite thoroughly.
Right now i can't test this part ( for the dst, since it is a bit broken
at present )

>+                      if (bt->errors == 10 || bt->errors == 15) {
>+                              printk(KERN_ERR "bt878(%d): too many errors,
"
>+                                              "resetting dma\n", bt->nr);
>+                              /* reset dma and set fifo-trigger to minimum
*/
>+                              btand(~0x1f, BT878_AGPIO_DMA_CTL);
>+                              btor(0x13, BT878_AGPIO_DMA_CTL);
>+                      }
>+                      if (bt->errors == 20) {
>+                              printk(KERN_ERR "bt878(%d): too many errors,
"
>+                                              "shutting up\n", bt->nr);
>+                              btwrite(BT878_ARISCI, BT878_AINT_MASK);
>+                      }
> 
>

I would say that just,

errors > error_count,
do_operations would be sufficient ..

But anyway what's the idea behind reducing the fifo size if in case of
errors ? normally when we have communication errors , we generally
increase the buffer size, not reduce it...

>               }
>               count++;
>-              if (count > 20) {
>+              if (count > 30) {
>                       btwrite(0, BT878_AINT_MASK);
>-                      printk(KERN_ERR
>-                             "bt878(%d): IRQ lockup, cleared int mask\n",
>-                             bt->nr);
>+                      printk(KERN_ERR "bt878(%d): IRQ lockup,"
>+                                              " device disabled\n",
bt->nr);
>                       break;
>               }
>       }
>-      return IRQ_HANDLED;
>+      return IRQ_RETVAL(count);
> }
>
> int
>@@ -424,42 +441,35 @@
>       bt->bt878_mem = ioremap(bt->bt878_adr, 0x1000);
> #endif
>
>-      /* clear interrupt mask */
>-      btwrite(0, BT848_INT_MASK);
>+      /* disable interrupts and dma */
>+      btwrite(0, BT878_AINT_MASK);
>+      btwrite(0, BT878_AGPIO_DMA_CTL);
>
>       result = request_irq(bt->irq, bt878_irq,
>                            SA_SHIRQ | SA_INTERRUPT, "bt878",
>                            (void *) bt);
>-      if (result == -EINVAL) {
>-              printk(KERN_ERR "bt878(%d): Bad irq number or handler\n",
>-                     bt878_num);
>-              goto fail1;
>-      }
>       if (result == -EBUSY) {
>               printk(KERN_ERR
>                      "bt878(%d): IRQ %d busy, change your PnP config in
BIOS\n",
>                      bt878_num, bt->irq);
>               goto fail1;
>       }
>-      if (result < 0)
>+      if (result < 0) {
>+              printk(KERN_ERR "bt878(%d): Bad irq number or handler
(%d)\n",
>+                               bt878_num, result);
>               goto fail1;
>+      }
>
>       pci_set_master(dev);
>       pci_set_drvdata(dev, bt);
>
>-/*        if(init_bt878(btv) < 0) {
>-              bt878_remove(dev);
>-              return -EIO;
>-      }
>-*/
>-
>       if ((result = bt878_mem_alloc(bt))) {
>               printk(KERN_ERR "bt878: failed to allocate memory!\n");
>               goto fail2;
>       }
>
>-      bt878_make_risc(bt);
>-      btwrite(0, BT878_AINT_MASK);
>+      bt878_calc_line_size(bt);
>+      bt878_risc_program(bt);
>       bt878_num++;
>
>       return 0;
>@@ -491,7 +501,6 @@
>
>       /* disable PCI bus-mastering */
>       pci_read_config_byte(bt->dev, PCI_COMMAND, &command);
>-      /* Should this be &=~ ?? */
>       command &= ~PCI_COMMAND_MASTER;
>       pci_write_config_byte(bt->dev, PCI_COMMAND, command);
>
>
> 
>


Manu




------------------------------

_______________________________________________
linux-dvb mailing list
linux-dvb at linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

End of linux-dvb Digest, Vol 12, Issue 31
*****************************************


-- 
10 GB Mailbox, 100 FreeSMS/Monat http://www.gmx.net/de/go/topmail
+++ GMX - die erste Adresse für Mail, Message, More +++



More information about the linux-dvb mailing list