Index: linux/drivers/media/dvb/ttpci/av7110.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/ttpci/av7110.c,v
retrieving revision 1.161
diff -p -u -r1.161 av7110.c
--- linux/drivers/media/dvb/ttpci/av7110.c	1 Dec 2004 00:44:45 -0000	1.161
+++ linux/drivers/media/dvb/ttpci/av7110.c	2 Dec 2004 16:55:35 -0000
@@ -1732,7 +1732,7 @@ static void av7110_fe_lock_fix(struct av
 	} else {
 		SetPIDs(av7110, 0, 0, 0, 0, 0);
 		av7110_fw_cmd(av7110, COMTYPE_PID_FILTER, FlushTSQueue, 0);
-		msleep(50);
+		av7110_wait_msgstate(av7110, GPMQBusy);
 	}
 
 	up(&av7110->pid_mutex);
Index: linux/drivers/media/dvb/ttpci/av7110_hw.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/ttpci/av7110_hw.c,v
retrieving revision 1.29
diff -p -u -r1.29 av7110_hw.c
--- linux/drivers/media/dvb/ttpci/av7110_hw.c	2 Dec 2004 14:02:37 -0000	1.29
+++ linux/drivers/media/dvb/ttpci/av7110_hw.c	2 Dec 2004 16:55:37 -0000
@@ -293,6 +293,37 @@ int av7110_bootarm(struct av7110 *av7110
  * DEBI command polling
  ****************************************************************************/
 
+int av7110_wait_msgstate(struct av7110 *av7110, u16 flags)
+{
+	unsigned long start;
+	u32 stat;
+
+	if (FW_VERSION(av7110->arm_app) <= 0x261c) {
+		/* not supported by old firmware */
+		msleep(50);
+		return 0;
+	}
+	
+	/* new firmware */
+	start = jiffies;
+	for (;;) {
+		if (down_interruptible(&av7110->dcomlock))
+			return -ERESTARTSYS;
+		stat = rdebi(av7110, DEBINOSWAP, MSGSTATE, 0, 2);
+		up(&av7110->dcomlock);
+		if ((stat & flags) == 0) {
+			break;
+		}
+		if (time_after(jiffies, start + ARM_WAIT_FREE)) {
+			printk(KERN_ERR "%s: timeout waiting for MSGSTATE %04x\n",
+				__FUNCTION__, stat & flags);
+			return -1;
+		}
+		msleep(1);
+	}
+	return 0;
+}
+
 int __av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length)
 {
 	int i;
Index: linux/drivers/media/dvb/ttpci/av7110_hw.h
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/ttpci/av7110_hw.h,v
retrieving revision 1.9
diff -p -u -r1.9 av7110_hw.h
--- linux/drivers/media/dvb/ttpci/av7110_hw.h	27 Jul 2004 12:36:01 -0000	1.9
+++ linux/drivers/media/dvb/ttpci/av7110_hw.h	2 Dec 2004 16:55:37 -0000
@@ -65,6 +65,9 @@ enum av7110_video_output_mode
 #define HPQOver		0x0008
 #define OSDQFull	0x0010		/* OSD Queue Full */
 #define OSDQOver	0x0020
+#define GPMQBusy	0x0040		/* Queue not empty, FW >= 261d */
+#define HPQBusy		0x0080
+#define OSDQBusy	0x0100
 
 /* hw section filter flags */
 #define	SECTION_EIT		0x01
@@ -368,6 +371,7 @@ extern int av7110_firmversion(struct av7
 #define FW_4M_SDRAM(arm_app)      ((arm_app) & 0x40000000)
 #define FW_VERSION(arm_app)	  ((arm_app) & 0x0000FFFF)
 
+extern int av7110_wait_msgstate(struct av7110 *av7110, u16 flags);
 extern int av7110_fw_cmd(struct av7110 *av7110, int type, int com, int num, ...);
 extern int __av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length);
 extern int av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length);
