Browse Source

[media] saa7164: collect/show the firmware debugging via a thread

Signed-off-by: Steven Toth <stoth@kernellabs.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Steven Toth 15 years ago
parent
commit
0b62ceb035

+ 2 - 3
drivers/media/video/saa7164/saa7164-api.c

@@ -24,7 +24,7 @@
 
 #include "saa7164.h"
 
-int saa7164_api_collect_debug(struct saa7164_dev *dev, struct seq_file *m)
+int saa7164_api_collect_debug(struct saa7164_dev *dev)
 {
 	tmComResDebugGetData_t d;
 	u8 more = 255;
@@ -45,8 +45,7 @@ int saa7164_api_collect_debug(struct saa7164_dev *dev, struct seq_file *m)
 		if (d.dwResult != SAA_OK)
 			break;
 
-		seq_printf(m, "%s", d.ucDebugData);
-
+		printk(KERN_INFO "saa7164[%d]-FWMSG: %s", dev->nr, d.ucDebugData);
 	}
 
 	return 0;

+ 81 - 7
drivers/media/video/saa7164/saa7164-core.c

@@ -1112,15 +1112,51 @@ static int saa7164_proc_show(struct seq_file *m, void *v)
 		dev = list_entry(list, struct saa7164_dev, devlist);
 		seq_printf(m, "%s = %p\n", dev->name, dev);
 
-		if (dev->board != SAA7164_BOARD_UNKNOWN) {
-			seq_printf(m, "Firmware messages ----->\n");
-			saa7164_api_collect_debug(dev, m);
-			seq_printf(m, "<---- Firmware messages\n");
-		}
-
 		/* Lock the bus from any other access */
 		b = &dev->bus;
 		mutex_lock(&b->lock);
+
+		seq_printf(m, " .m_pdwSetWritePos = 0x%x (0x%08x)\n",
+			b->m_dwSetReadPos, saa7164_readl(b->m_dwSetReadPos));
+
+		seq_printf(m, " .m_pdwSetReadPos  = 0x%x (0x%08x)\n",
+			b->m_dwSetWritePos, saa7164_readl(b->m_dwSetWritePos));
+
+		seq_printf(m, " .m_pdwGetWritePos = 0x%x (0x%08x)\n",
+			b->m_dwGetReadPos, saa7164_readl(b->m_dwGetReadPos));
+
+		seq_printf(m, " .m_pdwGetReadPos  = 0x%x (0x%08x)\n",
+			b->m_dwGetWritePos, saa7164_readl(b->m_dwGetWritePos));
+		c = 0;
+		seq_printf(m, "\n  Set Ring:\n");
+		seq_printf(m, "\n addr  00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\n");
+		for (i = 0; i < b->m_dwSizeSetRing; i++) {
+			if (c == 0)
+				seq_printf(m, " %04x:", i);
+
+			seq_printf(m, " %02x", *(b->m_pdwSetRing + i));
+
+			if (++c == 16) {
+				seq_printf(m, "\n");
+				c = 0;
+			}
+		}
+
+		c = 0;
+		seq_printf(m, "\n  Get Ring:\n");
+		seq_printf(m, "\n addr  00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\n");
+		for (i = 0; i < b->m_dwSizeGetRing; i++) {
+			if (c == 0)
+				seq_printf(m, " %04x:", i);
+
+			seq_printf(m, " %02x", *(b->m_pdwGetRing + i));
+
+			if (++c == 16) {
+				seq_printf(m, "\n");
+				c = 0;
+			}
+		}
+
 		mutex_unlock(&b->lock);
 
 	}
@@ -1152,6 +1188,31 @@ static int saa7164_proc_create(void)
 }
 #endif
 
+static int saa7164_thread_function(void *data)
+{
+	struct saa7164_dev *dev = data;
+
+	dprintk(DBGLVL_THR, "thread started\n");
+
+	set_freezable();
+
+	while (1) {
+		msleep_interruptible(100);
+		if (kthread_should_stop())
+			break;
+		try_to_freeze();
+
+		dprintk(DBGLVL_THR, "thread running\n");
+
+		/* Dump the firmware debug message to console */
+		saa7164_api_collect_debug(dev);
+
+	}
+
+	dprintk(DBGLVL_THR, "thread exiting\n");
+	return 0;
+}
+
 static int __devinit saa7164_initdev(struct pci_dev *pci_dev,
 				     const struct pci_device_id *pci_id)
 {
@@ -1313,6 +1374,14 @@ static int __devinit saa7164_initdev(struct pci_dev *pci_dev,
 		}
 		saa7164_api_set_debug(dev, fw_debug);
 
+		if (fw_debug) {
+			dev->kthread = kthread_run(saa7164_thread_function, dev,
+				"saa7164 debug");
+			if (!dev->kthread)
+				printk(KERN_ERR "%s() Failed to create "
+					"debug kernel thread\n", __func__);
+		}
+
 	} /* != BOARD_UNKNOWN */
 	else
 		printk(KERN_ERR "%s() Unsupported board detected, "
@@ -1340,8 +1409,13 @@ static void __devexit saa7164_finidev(struct pci_dev *pci_dev)
 {
 	struct saa7164_dev *dev = pci_get_drvdata(pci_dev);
 
-	if (dev->board != SAA7164_BOARD_UNKNOWN)
+	if (dev->board != SAA7164_BOARD_UNKNOWN) {
+		if (fw_debug && dev->kthread) {
+			kthread_stop(dev->kthread);
+			dev->kthread = NULL;
+		}
 		saa7164_api_set_debug(dev, 0x00);
+	}
 
 	saa7164_histogram_print(&dev->ports[ SAA7164_PORT_ENC1 ],
 		&dev->ports[ SAA7164_PORT_ENC1 ].irq_interval);

+ 9 - 1
drivers/media/video/saa7164/saa7164.h

@@ -51,6 +51,8 @@
 #include <linux/version.h>
 #include <linux/mutex.h>
 #include <linux/crc32.h>
+#include <linux/kthread.h>
+#include <linux/freezer.h>
 
 #include <media/tuner.h>
 #include <media/tveeprom.h>
@@ -109,6 +111,7 @@
 #define DBGLVL_BUF 512
 #define DBGLVL_ENC 1024
 #define DBGLVL_VBI 2048
+#define DBGLVL_THR 4096
 
 #define SAA7164_NORMS ( V4L2_STD_NTSC_M |  V4L2_STD_NTSC_M_JP |  V4L2_STD_NTSC_443 )
 
@@ -471,6 +474,11 @@ struct saa7164_dev {
 	/* Deferred command/api interrupts handling */
 	struct work_struct workcmd;
 
+	/* A kernel thread to monitor the firmware log, used
+	 * only in debug mode.
+	 */
+	struct task_struct *kthread;
+
 };
 
 extern struct list_head saa7164_devlist;
@@ -542,7 +550,7 @@ int saa7164_api_set_audio_detection(struct saa7164_port *port, int autodetect);
 int saa7164_api_get_videomux(struct saa7164_port *port);
 int saa7164_api_set_vbi_format(struct saa7164_port *port);
 int saa7164_api_set_debug(struct saa7164_dev *dev, u8 level);
-int saa7164_api_collect_debug(struct saa7164_dev *dev, struct seq_file *m);
+int saa7164_api_collect_debug(struct saa7164_dev *dev);
 
 /* ----------------------------------------------------------- */
 /* saa7164-cards.c                                             */