Index: driver/av7110/av7110.c
===================================================================
RCS file: /cvs/linuxtv/DVB/driver/av7110/av7110.c,v
retrieving revision 1.70
diff -p -u -r1.70 av7110.c
--- driver/av7110/av7110.c	17 Nov 2004 17:08:02 -0000	1.70
+++ driver/av7110/av7110.c	1 Dec 2004 23:48:01 -0000
@@ -1432,14 +1432,44 @@ void gpioirq (unsigned long data)
  * DEBI command polling 
  ****************************************************************************/
 
+int av7110_wait_msgstate(struct av7110_s *av7110, u16 flags)
+{
+        unsigned long start;
+        u32 stat;
+
+        if (FW_VERSION(av7110->arm_app) <= 0x261c) {
+                /* not supported by old firmware */
+                mdelay(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;
+                }
+                mdelay(1);
+        }
+        return 0;
+}
 
 static int OutCommand(av7110_t *av7110, u16* buf, int length)
 {
         int i;
         u32 start;
-#ifdef COM_DEBUG
+        char *type = NULL;
+        u16 flags[2] = {0, 0};
         u32 stat;
-#endif
 
         if (!av7110->arm_ready)
                 return -1;
@@ -1468,16 +1498,45 @@ static int OutCommand(av7110_t *av7110, 
         }
 #endif
 
-        start = jiffies;
-        while ( rdebi(av7110, DEBINOSWAP, MSGSTATE, 0, 2) & OSDQFull )
-        {
-                ddelay(1);
-                if ((jiffies - start) > ARM_WAIT_OSD)
-                {
-                        printk(KERN_ERR "%s: timeout waiting for !OSDQFull\n", __FUNCTION__);
-                        return -1;
+        switch ((buf[0] >> 8) & 0xff) {
+        case COMTYPE_PIDFILTER:
+        case COMTYPE_ENCODER:
+        case COMTYPE_REC_PLAY:
+        case COMTYPE_MPEGDECODER:
+                type = "MSG";
+                flags[0] = GPMQOver;
+                flags[1] = GPMQFull;
+                break;
+        case COMTYPE_OSD:
+                type = "OSD";
+                flags[0] = OSDQOver;
+                flags[1] = OSDQFull;
+                break;
+        default:
+                break;
+        }
+
+        if (type != NULL) {
+                /* non-immediate COMMAND type */
+                start = jiffies;
+                for (;;) {
+                        stat = rdebi(av7110, DEBINOSWAP, MSGSTATE, 0, 2);
+                        if (stat & flags[0]) {
+                                printk(KERN_ERR "%s: %s QUEUE overflow\n",
+                                        __FUNCTION__, type);
+                                return -1;
+                        }
+                        if ((stat & flags[1]) == 0)
+                                break;
+                        if (time_after(jiffies, start + ARM_WAIT_FREE)) {
+                                printk(KERN_ERR "%s: timeout waiting on busy %s QUEUE\n",
+                                        __FUNCTION__, type);
+                                return -1;
+                        }
+                        ddelay(1);
                 }
         }
+
         for (i=2; i<length; i++)
                 wdebi(av7110, DEBINOSWAP, COMMAND + 2*i, (u32) buf[i], 2);
 
@@ -4816,7 +4875,8 @@ void av7110_before_after_tune (fe_status
         	outcom(av7110, COMTYPE_PIDFILTER, Scan, 0);
 	} else {
 		SetPIDs(av7110, 0, 0, 0, 0, 0);
-        	outcom(av7110, COMTYPE_PIDFILTER, FlushTSQueue, 0);
+        	outcom(av7110, COMTYPE_PID_FILTER, FlushTSQueue, 0);
+		av7110_wait_msgstate(av7110, GPMQBusy);
 	}
 
         up(&av7110->pid_mutex);
Index: driver/av7110/av7110.h
===================================================================
RCS file: /cvs/linuxtv/DVB/driver/av7110/av7110.h,v
retrieving revision 1.14
diff -p -u -r1.14 av7110.h
--- driver/av7110/av7110.h	27 Jul 2004 13:10:35 -0000	1.14
+++ driver/av7110/av7110.h	1 Dec 2004 23:48:01 -0000
@@ -123,6 +123,9 @@ typedef enum VIDEOOUTPUTMODE
 #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
 
 #define	SECTION_EIT	        0x01
 #define	SECTION_SINGLE	        0x00
