Klaus Schmidinger wrote:
Anssi Hannula wrote:

Klaus Schmidinger wrote:

After letting it run for a while suddenly this happened:

Feb 18 15:19:42 video kernel: irq 5: nobody cared!

Do you have any idea what might be the problem here?

"irq #: nobody cared" is triggered when 99000 of 100000 IRQs are not handled, e.g. kfir_irq returns IRQ_NONE instead of IRQ_HANDLED. There was a "return 0" where should've been IRQ_NONE, but AFAIK that couldn't have been the cause of this error. Try this patch with debug=1 and test it with 100000+ interrupts. I added some debug printk's around return IRQ_NONE ("unhandled irq", "was audio irq", "was video irq").

Done - log attached.


Try this patch (against kfir-2.6-driver.tar.bz2).

--
Anssi Hannula
--- kfir/driver/kfir.c  2005-02-18 16:40:27.000000000 +0200
+++ kfir-rev3-irq-fix/driver/kfir.c     2005-02-19 14:03:42.000000000 +0200
@@ -1899,161 +1825,141 @@ static void KfProcessGenericModeInterrup
                // Get int counter once more.
                kfir->KfState.IntCnt = KfirRegRead(KFIR_ADR_INTERRUPT_CNT);
        } while (kfir->KfState.OldIntCnt != kfir->KfState.IntCnt);
-       dbprintk(KERN_DEBUG
-                "kfir: KfProcessGenericModeInterrupt done...\n");
+       dbprintk(KERN_DEBUG "kfir: KfProcessGenericModeInterrupt done...\n");
        return;
 }
 
 static irqreturn_t kfir_irq(int irq, void *dev_id, struct pt_regs *regs)
 {
-       struct kfir_dev *kfir = (struct kfir_dev *) dev_id;
+       struct kfir_dev *kfir = (struct kfir_dev *)dev_id;
        u32 plxstat;
        u32 altstat, altmask;
        u32 val;
-       int count = 0;
        dbprintk(KERN_DEBUG "kfir: kfir_irq called\n");
 
-       while (1) {
-               plxstat = rplxl(PLX9054_INT_CNTRL_STS);
-               wplxl(PLX9054_INT_CNTRL_STS, plxstat);
-               dbprintk(KERN_DEBUG "kfir: irq_stat=%08x\n", plxstat);
-
-               if (!
-                   (plxstat &
-                    (LOCAL_INT_ACTIVE | DMA0_INT_ACTIVE | (1 << 14))))
-                       return 0;
-
-               /* Error on PCI bus ? */
-               if (plxstat & (1 << 14)) {
-                       pci_read_config_dword(kfir->pdev, PCI_COMMAND,
-                                             &val);
-                       if (val & 0xf8000000)
-                               pci_write_config_dword(kfir->pdev,
-                                                      PCI_COMMAND, val);
-               }
-
-               /* Altera Interrupt ? */
-               if (plxstat & LOCAL_INT_ACTIVE) {
-                       dbprintk(KERN_DEBUG "kfir: local int\n");
-                       altstat = raltl(ALT_ADR_INT_REG_CLR) & 0xff;
-
-                       // audio interrupt
-                       if (altstat & ALT_D_INT_REQ_CLR_ADSP_INT) {
-                               dbprintk(KERN_DEBUG "kfir: ADSP int\n");
-                               waltl(ALT_ADR_INT_REG_CLR, altstat);
-
-                               altmask = raltl(ALT_ADR_INT_MASK) & 0xFF;
-                               // Mask Audio Int.
-                               altmask &= ~ALT_D_INT_REQ_CLR_ADSP_INT;
-                               waltl(ALT_ADR_INT_MASK, altmask);
-
-                               if (kfir->Params.StreamType !=
-                                   VT_KFIR_VIDEO_ES) {
-                                       // nothing for 5E version
-                               }
-                               KfirRegWrite(KFIR_ADR_AUDIO_INT_ACK, 1);
-                       }
-                       // video interrupt
-                       if (altstat & ALT_D_INT_REQ_CLR_KFIR_INT) {
-                               waltl(ALT_ADR_INT_REG_CLR, altstat);
-                               if (kfir->mode == KFIR_GENERIC_MODE)
-                                       KfProcessGenericModeInterrupt
-                                           (kfir);
-                       }
+       plxstat = rplxl(PLX9054_INT_CNTRL_STS);
+       wplxl(PLX9054_INT_CNTRL_STS, plxstat);
+       dbprintk(KERN_DEBUG "kfir: irq_stat=%08x\n", plxstat);
+
+       if (!(plxstat & (LOCAL_INT_ACTIVE | DMA0_INT_ACTIVE | (1 << 14))))
+               return IRQ_NONE;
+
+       /* Error on PCI bus ? */
+       if (plxstat & (1 << 14)) {
+               pci_read_config_dword(kfir->pdev, PCI_COMMAND, &val);
+               if (val & 0xf8000000)
+                       pci_write_config_dword(kfir->pdev, PCI_COMMAND, val);
+       }
+
+       /* Altera Interrupt ? */
+       if (plxstat & LOCAL_INT_ACTIVE) {
+               dbprintk(KERN_DEBUG "kfir: local int\n");
+               altstat = raltl(ALT_ADR_INT_REG_CLR) & 0xff;
+
+               // audio interrupt
+               if (altstat & ALT_D_INT_REQ_CLR_ADSP_INT) {
+                       dbprintk(KERN_DEBUG "kfir: ADSP int\n");
+                       waltl(ALT_ADR_INT_REG_CLR, altstat);
+
+                       altmask = raltl(ALT_ADR_INT_MASK) & 0xFF;
+                       // Mask Audio Int.
+                       altmask &= ~ALT_D_INT_REQ_CLR_ADSP_INT;
+                       waltl(ALT_ADR_INT_MASK, altmask);
+
+/*                     if (kfir->Params.StreamType != VT_KFIR_VIDEO_ES) {
+                               // nothing for 5E version
+                       }*/
+                       KfirRegWrite(KFIR_ADR_AUDIO_INT_ACK, 1);
+               }
+               // video interrupt
+               if (altstat & ALT_D_INT_REQ_CLR_KFIR_INT) {
+                       waltl(ALT_ADR_INT_REG_CLR, altstat);
+                       if (kfir->mode == KFIR_GENERIC_MODE)
+                               KfProcessGenericModeInterrupt(kfir);
                }
+       }
 
-               if (kfir->mode == KFIR_GENERIC_MODE) {
-                       // DMA0 interrupt?
-                       if (plxstat & DMA0_INT_ACTIVE) {
-                               DWORD Data;
-                               int free;
-
-                               // Clear DMA 0 interrupt.
-                               Data = rplxl(PLX9054_DMA_CMD_STS);
-                               Data |= DMA0_CLEAR_INT;
-                               Data &= ~DMA0_ENABLE;   // disable it.
-                               wplxl(PLX9054_DMA_CMD_STS, Data);
-
-                               if (kfir->KfState.KfirEReady ==
-                                   KFIR_D_EREADY_SEQ_END) {
-                               }
-                               if (kfir->KfState.KfirEReady ==
-                                   KFIR_D_EREADY_READY) {
-                                       printk(KERN_INFO
-                                              "kfir: kfir ready\n");
-                                       //kfir->recording=0;
-                               }
-                               if (kfir->recording == 1) {
-                                       free = kfir->readp - kfir->writep;
-                                       if (free <= 0)
-                                               free += MPGBUFSIZE;
-                                       if (free > MUX_DMA_LENGTH) {
-                                               memcpy(kfir->mpgbuf +
-                                                      kfir->writep,
-                                                      kfir->dmabuf,
-                                                      MUX_DMA_LENGTH);
-                                               kfir->writep +=
-                                                   MUX_DMA_LENGTH;
-                                               kfir->writep &=
-                                                   (MPGBUFSIZE - 1);
-                                               wake_up(&kfir->wq);
+       if (kfir->mode == KFIR_GENERIC_MODE) {
+               // DMA0 interrupt?
+               if (plxstat & DMA0_INT_ACTIVE) {
+                       DWORD Data;
+                       int free;
+
+                       // Clear DMA 0 interrupt.
+                       Data = rplxl(PLX9054_DMA_CMD_STS);
+                       Data |= DMA0_CLEAR_INT;
+                       Data &= ~DMA0_ENABLE;   // disable it.
+                       wplxl(PLX9054_DMA_CMD_STS, Data);
+
+/*                     if (kfir->KfState.KfirEReady ==
+                               KFIR_D_EREADY_SEQ_END) {
+                       }*/
+                       if (kfir->KfState.KfirEReady == KFIR_D_EREADY_READY) {
+                               printk(KERN_INFO "kfir: kfir ready\n");
+                               //kfir->recording=0;
+                       }
+                       if (kfir->recording == 1) {
+                               free = kfir->readp - kfir->writep;
+                               if (free <= 0)
+                                       free += MPGBUFSIZE;
+                               if (free > MUX_DMA_LENGTH) {
+                                       memcpy(kfir->mpgbuf + kfir->writep,
+                                              kfir->dmabuf, MUX_DMA_LENGTH);
+                                       kfir->writep += MUX_DMA_LENGTH;
+                                       kfir->writep &= (MPGBUFSIZE - 1);
+                                       wake_up(&kfir->wq);
 
-                                       }       // else we have an overflow!!
+                               }       // else we have an overflow!!
+                       }
+                       if (kfir->recording == 2) {
+                               int i;
+                               u8 *ptr;
+                               u32 val;
+
+                               if (kfir->Params.StreamType ==
+                                   VT_KFIR_TRANSPORT) {
+                                       kfir->recording = 0;
+                                       break;
                                }
-                               if (kfir->recording == 2) {
-                                       int i;
-                                       u8 *ptr;
-                                       u32 val;
 
-                                       if (kfir->Params.StreamType ==
-                                           VT_KFIR_TRANSPORT) {
+                               for (i = 0; i < MUX_DMA_LENGTH - 3; i++) {
+                                       ptr = kfir->dmabuf + i;
+                                       val = ((ptr[0] << 24) |
+                                              (ptr[1] << 16) |
+                                              (ptr[2] << 8) | ptr[3]);
+
+                                       if (val == 0x000001b7) {
+                                               daprintk(KERN_DEBUG
+                                                        "kfir: end code 1 
found at %d\n",
+                                                        i);
+                                               //kfir->recording=0;
+                                               //break;
+                                       }
+                                       if (val == 0x000001b9) {
+                                               daprintk(KERN_DEBUG
+                                                        "kfir: end code 2 
found at %d\n",
+                                                        i);
                                                kfir->recording = 0;
                                                break;
                                        }
 
-                                       for (i = 0; i < MUX_DMA_LENGTH - 3;
-                                            i++) {
-                                               ptr = kfir->dmabuf + i;
-                                               val = ((ptr[0] << 24) |
-                                                      (ptr[1] << 16) |
-                                                      (ptr[2] << 8) |
-                                                      ptr[3]);
-
-                                               if (val == 0x000001b7) {
-                                                       daprintk(KERN_DEBUG
-                                                                "kfir: end 
code 1 found at %d\n",
-                                                                i);
-                                                       //kfir->recording=0;
-                                                       //break;
-                                               }
-                                               if (val == 0x000001b9) {
-                                                       daprintk(KERN_DEBUG
-                                                                "kfir: end 
code 2 found at %d\n",
-                                                                i);
-                                                       kfir->recording =
-                                                           0;
-                                                       break;
-                                               }
-
-                                       }
-
                                }
-                               if (kfir->recording)
-                                       start_dma0(kfir);
 
                        }
+                       if (kfir->recording)
+                               start_dma0(kfir);
 
                }
-               if ((++count) > 10) {
-                       printk(KERN_INFO "kfir: irq loop\n");
-                       wplxl(PLX9054_INT_CNTRL_STS, 0);
-               }
+
        }
+/*     if ((++count) > 10) {
+               printk(KERN_INFO "kfir: irq loop\n");
+               wplxl(PLX9054_INT_CNTRL_STS, 0);
+       }*/
        dbprintk(KERN_DEBUG "kfir: kfir_irq done\n");
        return IRQ_HANDLED;
 }
 
-
 static int init_plx9054(struct kfir_dev *kfir)
 {
        u32 val;
_______________________________________________
mpeg2 mailing list
mpeg2@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/mpeg2

Reply via email to