struct usb_bus *bus;
        struct mutex mutex;     /* protect filling of buffer */
        size_t count;           /* number of characters filled into buffer */
-       char *page;
+       char *output_buf;
+       size_t alloc_size;
 };
 
 #define speed_char(info1) ({ char tmp; \
 
        hcd = bus_to_hcd(buf->bus);
        ehci = hcd_to_ehci (hcd);
-       next = buf->page;
-       size = PAGE_SIZE;
+       next = buf->output_buf;
+       size = buf->alloc_size;
 
        *next = 0;
 
        }
        spin_unlock_irqrestore (&ehci->lock, flags);
 
-       return strlen(buf->page);
+       return strlen(buf->output_buf);
 }
 
 #define DBG_SCHED_LIMIT 64
 
        hcd = bus_to_hcd(buf->bus);
        ehci = hcd_to_ehci (hcd);
-       next = buf->page;
-       size = PAGE_SIZE;
+       next = buf->output_buf;
+       size = buf->alloc_size;
 
        temp = scnprintf (next, size, "size = %d\n", ehci->periodic_size);
        size -= temp;
        spin_unlock_irqrestore (&ehci->lock, flags);
        kfree (seen);
 
-       return PAGE_SIZE - size;
+       return buf->alloc_size - size;
 }
 #undef DBG_SCHED_LIMIT
 
 
        hcd = bus_to_hcd(buf->bus);
        ehci = hcd_to_ehci (hcd);
-       next = buf->page;
-       size = PAGE_SIZE;
+       next = buf->output_buf;
+       size = buf->alloc_size;
 
        spin_lock_irqsave (&ehci->lock, flags);
 
 done:
        spin_unlock_irqrestore (&ehci->lock, flags);
 
-       return PAGE_SIZE - size;
+       return buf->alloc_size - size;
 }
 
 static struct debug_buffer *alloc_buffer(struct usb_bus *bus,
                buf->bus = bus;
                buf->fill_func = fill_func;
                mutex_init(&buf->mutex);
+               buf->alloc_size = PAGE_SIZE;
        }
 
        return buf;
 {
        int ret = 0;
 
-       if (!buf->page)
-               buf->page = (char *)get_zeroed_page(GFP_KERNEL);
+       if (!buf->output_buf)
+               buf->output_buf = (char *)vmalloc(buf->alloc_size);
 
-       if (!buf->page) {
+       if (!buf->output_buf) {
                ret = -ENOMEM;
                goto out;
        }
        mutex_unlock(&buf->mutex);
 
        ret = simple_read_from_buffer(user_buf, len, offset,
-                                     buf->page, buf->count);
+                                     buf->output_buf, buf->count);
 
 out:
        return ret;
        struct debug_buffer *buf = file->private_data;
 
        if (buf) {
-               if (buf->page)
-                       free_page((unsigned long)buf->page);
+               if (buf->output_buf)
+                       vfree(buf->output_buf);
                kfree(buf);
        }
 
 
 static int debug_periodic_open(struct inode *inode, struct file *file)
 {
-       file->private_data = alloc_buffer(inode->i_private,
-                                         fill_periodic_buffer);
+       struct debug_buffer *buf;
+       buf = alloc_buffer(inode->i_private, fill_periodic_buffer);
+       if (!buf)
+               return -ENOMEM;
 
-       return file->private_data ? 0 : -ENOMEM;
+       buf->alloc_size = (sizeof(void *) == 4 ? 6 : 8)*PAGE_SIZE;
+       file->private_data = buf;
+       return 0;
 }
 
 static int debug_registers_open(struct inode *inode, struct file *file)