]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/usb/host/ehci-dbg.c
MAINTAINERS: make IOAT easier to find
[linux-2.6-omap-h63xx.git] / drivers / usb / host / ehci-dbg.c
index b0f8ed5a7fb9dce367ad6d24feeea7fd5c8315c9..0cb53ca8d3434c521162e7e1461a01c6c13d7677 100644 (file)
@@ -358,7 +358,8 @@ struct debug_buffer {
        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; \
@@ -488,8 +489,8 @@ static ssize_t fill_async_buffer(struct debug_buffer *buf)
 
        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;
 
@@ -510,7 +511,7 @@ static ssize_t fill_async_buffer(struct debug_buffer *buf)
        }
        spin_unlock_irqrestore (&ehci->lock, flags);
 
-       return strlen(buf->page);
+       return strlen(buf->output_buf);
 }
 
 #define DBG_SCHED_LIMIT 64
@@ -531,8 +532,8 @@ static ssize_t fill_periodic_buffer(struct debug_buffer *buf)
 
        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;
@@ -568,14 +569,16 @@ static ssize_t fill_periodic_buffer(struct debug_buffer *buf)
                                for (temp = 0; temp < seen_count; temp++) {
                                        if (seen [temp].ptr != p.ptr)
                                                continue;
-                                       if (p.qh->qh_next.ptr)
+                                       if (p.qh->qh_next.ptr) {
                                                temp = scnprintf (next, size,
                                                        " ...");
-                                       p.ptr = NULL;
+                                               size -= temp;
+                                               next += temp;
+                                       }
                                        break;
                                }
                                /* show more info the first time around */
-                               if (temp == seen_count && p.ptr) {
+                               if (temp == seen_count) {
                                        u32     scratch = hc32_to_cpup(ehci,
                                                        &p.qh->hw_info1);
                                        struct ehci_qtd *qtd;
@@ -649,7 +652,7 @@ static ssize_t fill_periodic_buffer(struct debug_buffer *buf)
        spin_unlock_irqrestore (&ehci->lock, flags);
        kfree (seen);
 
-       return PAGE_SIZE - size;
+       return buf->alloc_size - size;
 }
 #undef DBG_SCHED_LIMIT
 
@@ -665,14 +668,14 @@ static ssize_t fill_registers_buffer(struct debug_buffer *buf)
 
        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);
 
        if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) {
                size = scnprintf (next, size,
-                       "bus %s, device %s (driver " DRIVER_VERSION ")\n"
+                       "bus %s, device %s\n"
                        "%s\n"
                        "SUSPENDED (no register access)\n",
                        hcd->self.controller->bus->name,
@@ -684,7 +687,7 @@ static ssize_t fill_registers_buffer(struct debug_buffer *buf)
        /* Capability Registers */
        i = HC_VERSION(ehci_readl(ehci, &ehci->caps->hc_capbase));
        temp = scnprintf (next, size,
-               "bus %s, device %s (driver " DRIVER_VERSION ")\n"
+               "bus %s, device %s\n"
                "%s\n"
                "EHCI %x.%02x, hcd state %d\n",
                hcd->self.controller->bus->name,
@@ -808,7 +811,7 @@ static ssize_t fill_registers_buffer(struct debug_buffer *buf)
 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,
@@ -822,6 +825,7 @@ 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;
@@ -831,10 +835,10 @@ static int fill_buffer(struct debug_buffer *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;
        }
@@ -867,7 +871,7 @@ static ssize_t debug_output(struct file *file, char __user *user_buf,
        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;
@@ -879,8 +883,8 @@ static int debug_close(struct inode *inode, struct file *file)
        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);
        }
 
@@ -895,10 +899,14 @@ static int debug_async_open(struct inode *inode, struct file *file)
 
 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)