--- linux-2.6.19.2.orig/drivers/char/avm_new/avm_debug.c	2010-07-07 15:54:32.000000000 +0200
+++ linux-2.6.19.2/drivers/char/avm_new/avm_debug.c	2011-03-10 13:22:23.000000000 +0100
@@ -103,6 +103,7 @@
              unsigned int lost;
     volatile unsigned int is_open;
              unsigned int major;
+             unsigned int written;
              dev_t        device;
              struct cdev *cdev;
 #if defined(AVM_DEBUG_UDEV)
@@ -350,7 +351,14 @@
 
     return -ENXIO;
 }
-
+/*--------------------------------------------------------------------------------*\
+\*--------------------------------------------------------------------------------*/
+static inline unsigned int inc_idx(unsigned int idx, unsigned int max_idx) {
+    if(++idx >= max_idx) {
+        return 0;
+    }
+    return idx;
+}
 /*------------------------------------------------------------------------------------------*\
 \*------------------------------------------------------------------------------------------*/
 static ssize_t avm_debug_write(struct file *filp, const char *write_buffer, size_t write_length, loff_t *write_pos) {
@@ -412,10 +420,24 @@
         restore_printk();   /*--- alle weiteren Ausgaben nur noch über standard-printk ---*/
 #endif /*--- #ifdef CONFIG_PRINTK ---*/
     } else if(!strncmp(AVM_DBG_EOF, p, sizeof(AVM_DBG_EOF) - 1)) {
+        int val;
         p += sizeof(AVM_DBG_EOF) - 1;
         SKIP_SPACES(p);
-        avm_debug.eof_sync = (*p == '1') ? 1 : 0;
-        /*--- __printk("\n[avm_debug]eofsync %d\n", avm_debug.eof_sync); ---*/
+        val = (*p == '1') ? 1 : 0;
+        avm_debug.eof_sync = val;
+        if(avm_debug.eof_sync) {
+            unsigned long flags;
+            /*--- Debugbuffer nochmal reaktivieren ---*/
+            spin_lock_irqsave(&avm_debug.lock, flags);
+            if(avm_debug.written >= avm_debug.size) {
+                avm_debug.read = inc_idx(avm_debug.write, avm_debug.size);
+            } else {
+                avm_debug.read = 0;
+            }
+            printk("---> reanimated debugbuffer: read=%d write=%d, written=%d <---\n", avm_debug.read, avm_debug.write, avm_debug.written);
+            spin_unlock_irqrestore(&avm_debug.lock, flags);
+        }
+        /*--- printk("\n[avm_debug]eofsync %d\n", avm_debug.eof_sync); ---*/
     } else if(!strncmp(AVM_DBG_SIGNAL, p, sizeof(AVM_DBG_SIGNAL) - 1)) {
         int val = -1;
         p += sizeof(AVM_DBG_SIGNAL) - 1;
@@ -639,14 +661,6 @@
     }
     return size;
 }
-/*--------------------------------------------------------------------------------*\
-\*--------------------------------------------------------------------------------*/
-static inline unsigned int inc_idx(unsigned int idx, unsigned int max_idx) {
-    if(++idx >= max_idx) {
-        return 0;
-    }
-    return idx;
-}
 /*------------------------------------------------------------------------------------------*\
 \*------------------------------------------------------------------------------------------*/
 void DebugPrintf_Puts(char *DebugData, unsigned int length) {
@@ -659,12 +673,13 @@
     spin_lock_irqsave(&avm_debug.lock, flags);
     local_write = avm_debug.write;
     local_read  = avm_debug.read;
+    avm_debug.written += length;
     while(length--) {
+        avm_debug.buffer[local_write] = *DebugData++;
         local_write = inc_idx(local_write, avm_debug.size);
         if(local_write == local_read) {
             wrap++;
         }
-        avm_debug.buffer[local_write] = *DebugData++;
     }
     if(wrap) {
         avm_debug.read = inc_idx(local_write, avm_debug.size);
@@ -1094,6 +1109,7 @@
         pud->Pos += sizeof("(null)") - 1;
         return;
     }
+#if !defined(CONFIG_MACH_ATHEROS)
 #if defined(CONFIG_MIPS_FUSIV) || defined(CONFIG_ARCH_PUMA5) || defined(CONFIG_AR9) || defined(CONFIG_VR9)
     if((((unsigned int)B < 0x80000000))) {
 #elif defined(CONFIG_MIPS)/*--- #if defined(CONFIG_MIPS_FUSIV) ---*/
@@ -1108,6 +1124,7 @@
             B = tmp;
         }
     }
+#endif/*--- #if !defined(CONFIG_MACH_ATHEROS) ---*/
     if(pud->Leftjust == TRUE) { /*--- reverse ---*/
         B += pud->field_length - 1;
     }
@@ -1142,6 +1159,7 @@
     if(pstring == NULL) {
         pstring = "(null)";
     }
+#if !defined(CONFIG_MACH_ATHEROS)
 #if defined(CONFIG_MIPS_FUSIV) || defined(CONFIG_ARCH_PUMA5) || defined(CONFIG_AR9) || defined(CONFIG_VR9)
     if((((unsigned int)pstring < 0x80000000))) {
 #elif defined(CONFIG_MIPS)/*--- #if defined(CONFIG_MIPS_FUSIV) ---*/
@@ -1156,6 +1174,7 @@
             pstring = tmp;
         }
     }
+#endif/*--- #if !defined(CONFIG_MACH_ATHEROS) ---*/
     if (pud->field_prec == 0) {
         pud->field_prec = MAX_DEBUG_MESSAGE_LEN - pud->Pos - 2;
     }
@@ -1581,6 +1600,7 @@
 #endif
     if(pdbg->s_push) {
         sock_release(pdbg->s_push);
+        pdbg->s_push = NULL;
     }
 }
 #define TIME_DIFF(act, old) ((unsigned long)(act) - (unsigned long)(old))