diff options
Diffstat (limited to 'drivers/usb/host/ehci-dbg.c')
-rw-r--r-- | drivers/usb/host/ehci-dbg.c | 44 |
1 files changed, 25 insertions, 19 deletions
diff --git a/drivers/usb/host/ehci-dbg.c b/drivers/usb/host/ehci-dbg.c index b0f8ed5a7fb9..9534ff3f5e7b 100644 --- a/drivers/usb/host/ehci-dbg.c +++ b/drivers/usb/host/ehci-dbg.c | |||
@@ -358,7 +358,8 @@ struct debug_buffer { | |||
358 | struct usb_bus *bus; | 358 | struct usb_bus *bus; |
359 | struct mutex mutex; /* protect filling of buffer */ | 359 | struct mutex mutex; /* protect filling of buffer */ |
360 | size_t count; /* number of characters filled into buffer */ | 360 | size_t count; /* number of characters filled into buffer */ |
361 | char *page; | 361 | char *output_buf; |
362 | size_t alloc_size; | ||
362 | }; | 363 | }; |
363 | 364 | ||
364 | #define speed_char(info1) ({ char tmp; \ | 365 | #define speed_char(info1) ({ char tmp; \ |
@@ -488,8 +489,8 @@ static ssize_t fill_async_buffer(struct debug_buffer *buf) | |||
488 | 489 | ||
489 | hcd = bus_to_hcd(buf->bus); | 490 | hcd = bus_to_hcd(buf->bus); |
490 | ehci = hcd_to_ehci (hcd); | 491 | ehci = hcd_to_ehci (hcd); |
491 | next = buf->page; | 492 | next = buf->output_buf; |
492 | size = PAGE_SIZE; | 493 | size = buf->alloc_size; |
493 | 494 | ||
494 | *next = 0; | 495 | *next = 0; |
495 | 496 | ||
@@ -510,7 +511,7 @@ static ssize_t fill_async_buffer(struct debug_buffer *buf) | |||
510 | } | 511 | } |
511 | spin_unlock_irqrestore (&ehci->lock, flags); | 512 | spin_unlock_irqrestore (&ehci->lock, flags); |
512 | 513 | ||
513 | return strlen(buf->page); | 514 | return strlen(buf->output_buf); |
514 | } | 515 | } |
515 | 516 | ||
516 | #define DBG_SCHED_LIMIT 64 | 517 | #define DBG_SCHED_LIMIT 64 |
@@ -531,8 +532,8 @@ static ssize_t fill_periodic_buffer(struct debug_buffer *buf) | |||
531 | 532 | ||
532 | hcd = bus_to_hcd(buf->bus); | 533 | hcd = bus_to_hcd(buf->bus); |
533 | ehci = hcd_to_ehci (hcd); | 534 | ehci = hcd_to_ehci (hcd); |
534 | next = buf->page; | 535 | next = buf->output_buf; |
535 | size = PAGE_SIZE; | 536 | size = buf->alloc_size; |
536 | 537 | ||
537 | temp = scnprintf (next, size, "size = %d\n", ehci->periodic_size); | 538 | temp = scnprintf (next, size, "size = %d\n", ehci->periodic_size); |
538 | size -= temp; | 539 | size -= temp; |
@@ -649,7 +650,7 @@ static ssize_t fill_periodic_buffer(struct debug_buffer *buf) | |||
649 | spin_unlock_irqrestore (&ehci->lock, flags); | 650 | spin_unlock_irqrestore (&ehci->lock, flags); |
650 | kfree (seen); | 651 | kfree (seen); |
651 | 652 | ||
652 | return PAGE_SIZE - size; | 653 | return buf->alloc_size - size; |
653 | } | 654 | } |
654 | #undef DBG_SCHED_LIMIT | 655 | #undef DBG_SCHED_LIMIT |
655 | 656 | ||
@@ -665,8 +666,8 @@ static ssize_t fill_registers_buffer(struct debug_buffer *buf) | |||
665 | 666 | ||
666 | hcd = bus_to_hcd(buf->bus); | 667 | hcd = bus_to_hcd(buf->bus); |
667 | ehci = hcd_to_ehci (hcd); | 668 | ehci = hcd_to_ehci (hcd); |
668 | next = buf->page; | 669 | next = buf->output_buf; |
669 | size = PAGE_SIZE; | 670 | size = buf->alloc_size; |
670 | 671 | ||
671 | spin_lock_irqsave (&ehci->lock, flags); | 672 | spin_lock_irqsave (&ehci->lock, flags); |
672 | 673 | ||
@@ -808,7 +809,7 @@ static ssize_t fill_registers_buffer(struct debug_buffer *buf) | |||
808 | done: | 809 | done: |
809 | spin_unlock_irqrestore (&ehci->lock, flags); | 810 | spin_unlock_irqrestore (&ehci->lock, flags); |
810 | 811 | ||
811 | return PAGE_SIZE - size; | 812 | return buf->alloc_size - size; |
812 | } | 813 | } |
813 | 814 | ||
814 | static struct debug_buffer *alloc_buffer(struct usb_bus *bus, | 815 | static struct debug_buffer *alloc_buffer(struct usb_bus *bus, |
@@ -822,6 +823,7 @@ static struct debug_buffer *alloc_buffer(struct usb_bus *bus, | |||
822 | buf->bus = bus; | 823 | buf->bus = bus; |
823 | buf->fill_func = fill_func; | 824 | buf->fill_func = fill_func; |
824 | mutex_init(&buf->mutex); | 825 | mutex_init(&buf->mutex); |
826 | buf->alloc_size = PAGE_SIZE; | ||
825 | } | 827 | } |
826 | 828 | ||
827 | return buf; | 829 | return buf; |
@@ -831,10 +833,10 @@ static int fill_buffer(struct debug_buffer *buf) | |||
831 | { | 833 | { |
832 | int ret = 0; | 834 | int ret = 0; |
833 | 835 | ||
834 | if (!buf->page) | 836 | if (!buf->output_buf) |
835 | buf->page = (char *)get_zeroed_page(GFP_KERNEL); | 837 | buf->output_buf = (char *)vmalloc(buf->alloc_size); |
836 | 838 | ||
837 | if (!buf->page) { | 839 | if (!buf->output_buf) { |
838 | ret = -ENOMEM; | 840 | ret = -ENOMEM; |
839 | goto out; | 841 | goto out; |
840 | } | 842 | } |
@@ -867,7 +869,7 @@ static ssize_t debug_output(struct file *file, char __user *user_buf, | |||
867 | mutex_unlock(&buf->mutex); | 869 | mutex_unlock(&buf->mutex); |
868 | 870 | ||
869 | ret = simple_read_from_buffer(user_buf, len, offset, | 871 | ret = simple_read_from_buffer(user_buf, len, offset, |
870 | buf->page, buf->count); | 872 | buf->output_buf, buf->count); |
871 | 873 | ||
872 | out: | 874 | out: |
873 | return ret; | 875 | return ret; |
@@ -879,8 +881,8 @@ static int debug_close(struct inode *inode, struct file *file) | |||
879 | struct debug_buffer *buf = file->private_data; | 881 | struct debug_buffer *buf = file->private_data; |
880 | 882 | ||
881 | if (buf) { | 883 | if (buf) { |
882 | if (buf->page) | 884 | if (buf->output_buf) |
883 | free_page((unsigned long)buf->page); | 885 | vfree(buf->output_buf); |
884 | kfree(buf); | 886 | kfree(buf); |
885 | } | 887 | } |
886 | 888 | ||
@@ -895,10 +897,14 @@ static int debug_async_open(struct inode *inode, struct file *file) | |||
895 | 897 | ||
896 | static int debug_periodic_open(struct inode *inode, struct file *file) | 898 | static int debug_periodic_open(struct inode *inode, struct file *file) |
897 | { | 899 | { |
898 | file->private_data = alloc_buffer(inode->i_private, | 900 | struct debug_buffer *buf; |
899 | fill_periodic_buffer); | 901 | buf = alloc_buffer(inode->i_private, fill_periodic_buffer); |
902 | if (!buf) | ||
903 | return -ENOMEM; | ||
900 | 904 | ||
901 | return file->private_data ? 0 : -ENOMEM; | 905 | buf->alloc_size = (sizeof(void *) == 4 ? 6 : 8)*PAGE_SIZE; |
906 | file->private_data = buf; | ||
907 | return 0; | ||
902 | } | 908 | } |
903 | 909 | ||
904 | static int debug_registers_open(struct inode *inode, struct file *file) | 910 | static int debug_registers_open(struct inode *inode, struct file *file) |