Mailing List archive

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

[linux-dvb] Re: [PATCH] dvb-ttpci+budgetpatch integrated latest patch



HI

This is a late-time patch, fixing some
oops with large number of rmmod/insmod

Emard
diff -pur dvb-kernel.orig/linux/drivers/media/dvb/ttpci/av7110.c dvb-kernel/linux/drivers/media/dvb/ttpci/av7110.c
--- dvb-kernel.orig/linux/drivers/media/dvb/ttpci/av7110.c	2005-01-08 20:41:51.000000000 +0100
+++ dvb-kernel/linux/drivers/media/dvb/ttpci/av7110.c	2005-01-08 22:42:55.000000000 +0100
@@ -1150,15 +1150,14 @@ static int stop_ts_capture(struct av7110
 
 	if (--budget->feeding1)
 		return budget->feeding1;
-	saa7146_write(budget->dev, MC1, MASK_20);	// DMA3 off
+	saa7146_write(budget->dev, MC1, MASK_20);	/* DMA3 off */
 	SAA7146_IER_DISABLE(budget->dev, MASK_10);
+	SAA7146_ISR_CLEAR(budget->dev, MASK_10);
 	return 0;
 }
 
 static int start_ts_capture(struct av7110 *budget)
 {
-	struct saa7146_dev *dev = budget->dev;
-
 	dprintk(2, "budget: %p\n", budget);
 
 	if (budget->feeding1)
@@ -1166,8 +1165,8 @@ static int start_ts_capture(struct av711
 	memset(budget->grabbing, 0x00, TS_HEIGHT * TS_WIDTH);
 	budget->tsf = 0xff;
 	budget->ttbp = 0;
-	saa7146_write(dev, MC1, (MASK_04 | MASK_20));	// DMA3 on
-	SAA7146_IER_ENABLE(budget->dev, MASK_10);	// VPE
+	SAA7146_IER_ENABLE(budget->dev, MASK_10);	/* VPE */
+	saa7146_write(budget->dev, MC1, (MASK_04 | MASK_20));	/* DMA3 on */
 	return ++budget->feeding1;
 }
 
@@ -2290,7 +2289,7 @@ static int av7110_attach(struct saa7146_
 		    (av7110->grabbing = 
 		     saa7146_vmalloc_build_pgtable(dev->pci, length, &av7110->pt)))
 			return -ENOMEM;
-		saa7146_write(dev, PCI_BT_V1, 0x1c1c101f);
+		saa7146_write(dev, PCI_BT_V1, 0x1c1f101f);
 		saa7146_write(dev, BCS_CTRL, 0x80400040);
 		/* set dd1 stream a & b */
 		saa7146_write(dev, DD1_STREAM_B, 0x00000000);
@@ -2362,6 +2361,8 @@ static int av7110_attach(struct saa7146_
 		saa7146_write(dev, MC1, (MASK_13 | MASK_29));
 
 		/* end of budgetpatch register initialization */
+		spin_lock_init(&av7110->feedlock1);
+		tasklet_init (&av7110->vpe_tasklet,  vpeirq,  (unsigned long) av7110);
 	} else {
 		saa7146_write(dev, PCI_BT_V1, 0x1c00101f);
 		saa7146_write(dev, BCS_CTRL, 0x80400040);
@@ -2376,10 +2377,6 @@ static int av7110_attach(struct saa7146_
 		saa7146_write(dev, GPIO_CTRL, 0x000000);
 	}
 	
-	if(budgetpatch)
-		spin_lock_init(&av7110->feedlock1);
-
-	tasklet_init (&av7110->vpe_tasklet,  vpeirq,  (unsigned long) av7110);
 	tasklet_init (&av7110->debi_tasklet, debiirq, (unsigned long) av7110);
 	tasklet_init (&av7110->gpio_tasklet, gpioirq, (unsigned long) av7110);
 
@@ -2494,10 +2491,15 @@ static int av7110_detach (struct saa7146
 		return 0;
 	}
 
-	tasklet_kill(&av7110->vpe_tasklet);
 	if(budgetpatch)
+	{
+		saa7146_write(saa, MC1, MASK_20);	/* DMA3 off */
+		SAA7146_IER_DISABLE(saa, MASK_10);
+		SAA7146_ISR_CLEAR(saa, MASK_10);
+		msleep(50);
+		tasklet_kill(&av7110->vpe_tasklet);
 		saa7146_pgtable_free(saa->pci, &av7110->pt);
-
+	}
 	av7110_exit_v4l(av7110);
 
 	av7110->arm_rmmod = 1;
@@ -2572,7 +2574,8 @@ static void av7110_irq(struct saa7146_de
 	}
 
 	if (*isr & MASK_10)
-		tasklet_schedule(&av7110->vpe_tasklet);
+		if (budgetpatch)
+			tasklet_schedule(&av7110->vpe_tasklet);
 }
 
 
Only in dvb-kernel/linux/drivers/media/dvb/ttpci: av7110.c~

Home | Main Index | Thread Index