Index: driver/compat.h
===================================================================
RCS file: /cvs/linuxtv/DVB/driver/compat.h,v
retrieving revision 1.13
diff -p -u -r1.13 compat.h
--- driver/compat.h	7 Feb 2003 12:22:51 -0000	1.13
+++ driver/compat.h	14 Dec 2004 19:14:47 -0000
@@ -102,5 +102,44 @@ int try_module_get(struct module *mod)
 #endif
 
 
+#ifndef wait_event_interruptible_timeout
+#define __wait_event_interruptible_timeout(wq, condition, ret)          \
+do {                                                                    \
+        wait_queue_t __wait;                                            \
+        init_waitqueue_entry(&__wait, current);                         \
+                                                                        \
+        add_wait_queue(&wq, &__wait);                                   \
+        for (;;) {                                                      \
+                set_current_state(TASK_INTERRUPTIBLE);                  \
+                if (condition)                                          \
+                        break;                                          \
+                if (!signal_pending(current)) {                         \
+                        ret = schedule_timeout(ret);                    \
+                        if (!ret)                                       \
+                                break;                                  \
+                        continue;                                       \
+                }                                                       \
+                ret = -ERESTARTSYS;                                     \
+                break;                                                  \
+        }                                                               \
+        current->state = TASK_RUNNING;                                  \
+        remove_wait_queue(&wq, &__wait);                                \
+} while (0)
+
+#define wait_event_interruptible_timeout(wq, condition, timeout)        \
+({                                                                      \
+        long __ret = timeout;                                           \
+        if (!(condition))                                               \
+                __wait_event_interruptible_timeout(wq, condition, __ret); \
+        __ret;                                                          \
+})
+#endif
+
+
+#ifndef BUG_ON
+#define BUG_ON(condition) do { if (unlikely((condition)!=0)) BUG(); } while(0)
+#endif
+
+
 #endif
 
Index: driver/av7110/av7110.c
===================================================================
RCS file: /cvs/linuxtv/DVB/driver/av7110/av7110.c,v
retrieving revision 1.71
diff -p -u -r1.71 av7110.c
--- driver/av7110/av7110.c	2 Dec 2004 17:40:51 -0000	1.71
+++ driver/av7110/av7110.c	14 Dec 2004 19:15:11 -0000
@@ -1512,6 +1512,13 @@ static int OutCommand(av7110_t *av7110, 
                 flags[0] = OSDQOver;
                 flags[1] = OSDQFull;
                 break;
+        case 0x80: /* COMTYPE_MISC */
+                if (FW_VERSION(av7110->arm_app) >= 0x261d) {
+                        type = "MSG";
+                        flags[0] = GPMQOver;
+                        flags[1] = GPMQBusy;
+                }
+                break;
         default:
                 break;
         }
@@ -1997,25 +2004,21 @@ LoadBitmap(av7110_t *av7110, u16 format,
 static int 
 BlitBitmap(av7110_t *av7110, u16 win, u16 x, u16 y, u16 trans)
 {
-        DECLARE_WAITQUEUE(wait, current);
-        
-        if (av7110->bmp_state==BMP_NONE)
-                return -1;
-        if (av7110->bmp_state==BMP_LOADING) {
-                add_wait_queue(&av7110->bmpq, &wait);
-                while (1) {
-                        set_current_state(TASK_INTERRUPTIBLE);
-                        if (av7110->bmp_state!=BMP_LOADING
-                            || signal_pending(current))
-                                break;
-                        schedule();
-                }
-                current->state=TASK_RUNNING;
-                remove_wait_queue(&av7110->bmpq, &wait);
+        int ret;
+
+        BUG_ON (av7110->bmp_state == BMP_NONE);
+
+        ret = wait_event_interruptible_timeout(av7110->bmpq,
+                                av7110->bmp_state != BMP_LOADING, 10*HZ);
+        if (ret == -ERESTARTSYS || ret == 0) {
+                printk("dvb-ttpci: warning: timeout waiting in %s()\n", __FUNCTION__);
+                av7110->bmp_state = BMP_NONE;
+                return (ret == 0) ? -ETIMEDOUT : ret;
         }
-        if (av7110->bmp_state==BMP_LOADED)
-                return outcom(av7110, COMTYPE_OSD, BlitBmp, 4, win, x, y, trans);
-        return -1;
+
+        BUG_ON (av7110->bmp_state != BMP_LOADED);
+
+        return outcom(av7110, COMTYPE_OSD, BlitBmp, 4, win, x, y, trans);
 } 
 
 static inline int 
@@ -2082,6 +2085,7 @@ OSDSetBlock(av7110_t *av7110, int x0, in
 {
         uint w, h, bpp, bpl, size, lpb, bnum, brest;
         int i;
+        int rc;
 
         w=x1-x0+1; h=y1-y0+1;
         if (inc<=0)
@@ -2096,13 +2100,21 @@ OSDSetBlock(av7110_t *av7110, int x0, in
         brest=size-bnum*lpb*bpl;
 
         for (i=0; i<bnum; i++) {
-                LoadBitmap(av7110, bpp2bit[av7110->osdbpp[av7110->osdwin]], w, lpb, inc, data); 
-                BlitBitmap(av7110, av7110->osdwin, x0, y0+i*lpb, 0);
+                rc = LoadBitmap(av7110, bpp2bit[av7110->osdbpp[av7110->osdwin]], w, lpb, inc, data); 
+                if (rc)
+                        return rc;
+                rc = BlitBitmap(av7110, av7110->osdwin, x0, y0+i*lpb, 0);
+                if (rc)
+                        return rc;
                 data+=lpb*inc; 
         }
         if (brest) {
-                LoadBitmap(av7110, bpp2bit[av7110->osdbpp[av7110->osdwin]], w, brest/bpl, inc, data); 
-                BlitBitmap(av7110, av7110->osdwin, x0, y0+bnum*lpb, 0);
+                rc = LoadBitmap(av7110, bpp2bit[av7110->osdbpp[av7110->osdwin]], w, brest/bpl, inc, data); 
+                if (rc)
+                        return rc;
+                rc = BlitBitmap(av7110, av7110->osdwin, x0, y0+bnum*lpb, 0);
+                if (rc)
+                        return rc;
         }
         ReleaseBitmap(av7110);
         return 0;
