diff options
author | Vijay Kumar B <vijaykumar@bravegnu.org> | 2009-09-21 01:53:58 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-12-11 15:23:09 -0500 |
commit | 92d450336eedf4c671f37c931fa8ccc28c6be3a9 (patch) | |
tree | 7c9bb8e3bbc63298c91373819eeb974cd09c2b23 | |
parent | dad1740133ffe49ae44044f97e4cbfcb42f037b1 (diff) |
Staging: poch: Remove circular buffer header
Remove the circular buffer header. Which has been superseded by the
ioctl consume interface.
Signed-off-by: Vijay Kumar B <vijaykumar@bravegnu.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | drivers/staging/poch/README | 1 | ||||
-rw-r--r-- | drivers/staging/poch/poch.c | 109 | ||||
-rw-r--r-- | drivers/staging/poch/poch.h | 6 |
3 files changed, 8 insertions, 108 deletions
diff --git a/drivers/staging/poch/README b/drivers/staging/poch/README index 842afd46499..600121f7d67 100644 --- a/drivers/staging/poch/README +++ b/drivers/staging/poch/README | |||
@@ -1,7 +1,6 @@ | |||
1 | TODO: | 1 | TODO: |
2 | - Rx block size is limited to < 2048, hardware bug? | 2 | - Rx block size is limited to < 2048, hardware bug? |
3 | - Group size is limited to < page size, kernel alloc/mmap API issues | 3 | - Group size is limited to < page size, kernel alloc/mmap API issues |
4 | - fix/workaround cache issues in circular buffer header | ||
5 | - test whether Tx is transmitting data from provided buffers | 4 | - test whether Tx is transmitting data from provided buffers |
6 | - handle device unplug case | 5 | - handle device unplug case |
7 | - handle temperature above threshold | 6 | - handle temperature above threshold |
diff --git a/drivers/staging/poch/poch.c b/drivers/staging/poch/poch.c index babd881809a..9095158fb1b 100644 --- a/drivers/staging/poch/poch.c +++ b/drivers/staging/poch/poch.c | |||
@@ -197,9 +197,6 @@ struct channel_info { | |||
197 | 197 | ||
198 | /* Contains the header and circular buffer exported to userspace. */ | 198 | /* Contains the header and circular buffer exported to userspace. */ |
199 | spinlock_t group_offsets_lock; | 199 | spinlock_t group_offsets_lock; |
200 | struct poch_cbuf_header *header; | ||
201 | struct page *header_pg; | ||
202 | unsigned long header_size; | ||
203 | 200 | ||
204 | /* Last group consumed by user space. */ | 201 | /* Last group consumed by user space. */ |
205 | unsigned int consumed; | 202 | unsigned int consumed; |
@@ -329,14 +326,12 @@ static ssize_t show_mmap_size(struct device *dev, | |||
329 | int len; | 326 | int len; |
330 | unsigned long mmap_size; | 327 | unsigned long mmap_size; |
331 | unsigned long group_pages; | 328 | unsigned long group_pages; |
332 | unsigned long header_pages; | ||
333 | unsigned long total_group_pages; | 329 | unsigned long total_group_pages; |
334 | 330 | ||
335 | group_pages = npages(channel->group_size); | 331 | group_pages = npages(channel->group_size); |
336 | header_pages = npages(channel->header_size); | ||
337 | total_group_pages = group_pages * channel->group_count; | 332 | total_group_pages = group_pages * channel->group_count; |
338 | 333 | ||
339 | mmap_size = (header_pages + total_group_pages) * PAGE_SIZE; | 334 | mmap_size = total_group_pages * PAGE_SIZE; |
340 | len = sprintf(buf, "%lu\n", mmap_size); | 335 | len = sprintf(buf, "%lu\n", mmap_size); |
341 | return len; | 336 | return len; |
342 | } | 337 | } |
@@ -369,10 +364,8 @@ static int poch_channel_alloc_groups(struct channel_info *channel) | |||
369 | { | 364 | { |
370 | unsigned long i; | 365 | unsigned long i; |
371 | unsigned long group_pages; | 366 | unsigned long group_pages; |
372 | unsigned long header_pages; | ||
373 | 367 | ||
374 | group_pages = npages(channel->group_size); | 368 | group_pages = npages(channel->group_size); |
375 | header_pages = npages(channel->header_size); | ||
376 | 369 | ||
377 | for (i = 0; i < channel->group_count; i++) { | 370 | for (i = 0; i < channel->group_count; i++) { |
378 | struct poch_group_info *group; | 371 | struct poch_group_info *group; |
@@ -402,8 +395,7 @@ static int poch_channel_alloc_groups(struct channel_info *channel) | |||
402 | * this? | 395 | * this? |
403 | */ | 396 | */ |
404 | group->dma_addr = page_to_pfn(group->pg) * PAGE_SIZE; | 397 | group->dma_addr = page_to_pfn(group->pg) * PAGE_SIZE; |
405 | group->user_offset = | 398 | group->user_offset = (i * group_pages) * PAGE_SIZE; |
406 | (header_pages + (i * group_pages)) * PAGE_SIZE; | ||
407 | 399 | ||
408 | printk(KERN_INFO PFX "%ld: user_offset: 0x%lx\n", i, | 400 | printk(KERN_INFO PFX "%ld: user_offset: 0x%lx\n", i, |
409 | group->user_offset); | 401 | group->user_offset); |
@@ -525,56 +517,6 @@ static void channel_dma_init(struct channel_info *channel) | |||
525 | 517 | ||
526 | } | 518 | } |
527 | 519 | ||
528 | static int poch_channel_alloc_header(struct channel_info *channel) | ||
529 | { | ||
530 | struct poch_cbuf_header *header = channel->header; | ||
531 | unsigned long group_offset_size; | ||
532 | unsigned long tot_group_offsets_size; | ||
533 | |||
534 | /* Allocate memory to hold header exported userspace */ | ||
535 | group_offset_size = sizeof(header->group_offsets[0]); | ||
536 | tot_group_offsets_size = group_offset_size * channel->group_count; | ||
537 | channel->header_size = sizeof(*header) + tot_group_offsets_size; | ||
538 | channel->header_pg = alloc_pages(GFP_KERNEL | __GFP_ZERO, | ||
539 | get_order(channel->header_size)); | ||
540 | if (!channel->header_pg) | ||
541 | return -ENOMEM; | ||
542 | |||
543 | channel->header = page_address(channel->header_pg); | ||
544 | |||
545 | return 0; | ||
546 | } | ||
547 | |||
548 | static void poch_channel_free_header(struct channel_info *channel) | ||
549 | { | ||
550 | unsigned int order; | ||
551 | |||
552 | order = get_order(channel->header_size); | ||
553 | __free_pages(channel->header_pg, order); | ||
554 | } | ||
555 | |||
556 | static void poch_channel_init_header(struct channel_info *channel) | ||
557 | { | ||
558 | int i; | ||
559 | struct poch_group_info *groups; | ||
560 | s32 *group_offsets; | ||
561 | |||
562 | channel->header->group_size_bytes = channel->group_size; | ||
563 | channel->header->group_count = channel->group_count; | ||
564 | |||
565 | spin_lock_init(&channel->group_offsets_lock); | ||
566 | |||
567 | group_offsets = channel->header->group_offsets; | ||
568 | groups = channel->groups; | ||
569 | |||
570 | for (i = 0; i < channel->group_count; i++) { | ||
571 | if (channel->dir == CHANNEL_DIR_RX) | ||
572 | group_offsets[i] = -1; | ||
573 | else | ||
574 | group_offsets[i] = groups[i].user_offset; | ||
575 | } | ||
576 | } | ||
577 | |||
578 | static void __poch_channel_clear_counters(struct channel_info *channel) | 520 | static void __poch_channel_clear_counters(struct channel_info *channel) |
579 | { | 521 | { |
580 | channel->counters.pll_unlock = 0; | 522 | channel->counters.pll_unlock = 0; |
@@ -617,12 +559,6 @@ static int poch_channel_init(struct channel_info *channel, | |||
617 | goto out_free_group_info; | 559 | goto out_free_group_info; |
618 | } | 560 | } |
619 | 561 | ||
620 | ret = poch_channel_alloc_header(channel); | ||
621 | if (ret) { | ||
622 | dev_err(dev, "error allocating user space header\n"); | ||
623 | goto out_free_groups; | ||
624 | } | ||
625 | |||
626 | channel->fpga_iomem = poch_dev->fpga_iomem; | 562 | channel->fpga_iomem = poch_dev->fpga_iomem; |
627 | channel->bridge_iomem = poch_dev->bridge_iomem; | 563 | channel->bridge_iomem = poch_dev->bridge_iomem; |
628 | channel->iomem_lock = &poch_dev->iomem_lock; | 564 | channel->iomem_lock = &poch_dev->iomem_lock; |
@@ -630,14 +566,8 @@ static int poch_channel_init(struct channel_info *channel, | |||
630 | 566 | ||
631 | __poch_channel_clear_counters(channel); | 567 | __poch_channel_clear_counters(channel); |
632 | 568 | ||
633 | printk(KERN_WARNING "poch_channel_init_header\n"); | ||
634 | |||
635 | poch_channel_init_header(channel); | ||
636 | |||
637 | return 0; | 569 | return 0; |
638 | 570 | ||
639 | out_free_groups: | ||
640 | poch_channel_free_groups(channel); | ||
641 | out_free_group_info: | 571 | out_free_group_info: |
642 | kfree(channel->groups); | 572 | kfree(channel->groups); |
643 | out: | 573 | out: |
@@ -881,7 +811,6 @@ static int poch_release(struct inode *inode, struct file *filp) | |||
881 | } | 811 | } |
882 | 812 | ||
883 | atomic_dec(&channel->inited); | 813 | atomic_dec(&channel->inited); |
884 | poch_channel_free_header(channel); | ||
885 | poch_channel_free_groups(channel); | 814 | poch_channel_free_groups(channel); |
886 | kfree(channel->groups); | 815 | kfree(channel->groups); |
887 | atomic_inc(&channel->free); | 816 | atomic_inc(&channel->free); |
@@ -890,7 +819,7 @@ static int poch_release(struct inode *inode, struct file *filp) | |||
890 | } | 819 | } |
891 | 820 | ||
892 | /* | 821 | /* |
893 | * Map the header and the group buffers, to user space. | 822 | * Map the the group buffers, to user space. |
894 | */ | 823 | */ |
895 | static int poch_mmap(struct file *filp, struct vm_area_struct *vma) | 824 | static int poch_mmap(struct file *filp, struct vm_area_struct *vma) |
896 | { | 825 | { |
@@ -900,7 +829,6 @@ static int poch_mmap(struct file *filp, struct vm_area_struct *vma) | |||
900 | unsigned long size; | 829 | unsigned long size; |
901 | 830 | ||
902 | unsigned long group_pages; | 831 | unsigned long group_pages; |
903 | unsigned long header_pages; | ||
904 | unsigned long total_group_pages; | 832 | unsigned long total_group_pages; |
905 | 833 | ||
906 | int pg_num; | 834 | int pg_num; |
@@ -917,30 +845,16 @@ static int poch_mmap(struct file *filp, struct vm_area_struct *vma) | |||
917 | } | 845 | } |
918 | 846 | ||
919 | group_pages = npages(channel->group_size); | 847 | group_pages = npages(channel->group_size); |
920 | header_pages = npages(channel->header_size); | ||
921 | total_group_pages = group_pages * channel->group_count; | 848 | total_group_pages = group_pages * channel->group_count; |
922 | 849 | ||
923 | size = vma->vm_end - vma->vm_start; | 850 | size = vma->vm_end - vma->vm_start; |
924 | if (size != (header_pages + total_group_pages) * PAGE_SIZE) { | 851 | if (size != total_group_pages * PAGE_SIZE) { |
925 | printk(KERN_WARNING PFX "required %lu bytes\n", size); | 852 | printk(KERN_WARNING PFX "required %lu bytes\n", size); |
926 | return -EINVAL; | 853 | return -EINVAL; |
927 | } | 854 | } |
928 | 855 | ||
929 | start = vma->vm_start; | 856 | start = vma->vm_start; |
930 | 857 | ||
931 | /* FIXME: Cleanup required on failure? */ | ||
932 | pg = channel->header_pg; | ||
933 | for (pg_num = 0; pg_num < header_pages; pg_num++, pg++) { | ||
934 | printk(KERN_DEBUG PFX "page_count: %d\n", page_count(pg)); | ||
935 | printk(KERN_DEBUG PFX "%d: header: 0x%lx\n", pg_num, start); | ||
936 | ret = vm_insert_page(vma, start, pg); | ||
937 | if (ret) { | ||
938 | printk(KERN_DEBUG "vm_insert 1 failed at %lx\n", start); | ||
939 | return ret; | ||
940 | } | ||
941 | start += PAGE_SIZE; | ||
942 | } | ||
943 | |||
944 | for (i = 0; i < channel->group_count; i++) { | 858 | for (i = 0; i < channel->group_count; i++) { |
945 | pg = channel->groups[i].pg; | 859 | pg = channel->groups[i].pg; |
946 | for (pg_num = 0; pg_num < group_pages; pg_num++, pg++) { | 860 | for (pg_num = 0; pg_num < group_pages; pg_num++, pg++) { |
@@ -967,20 +881,16 @@ static int poch_mmap(struct file *filp, struct vm_area_struct *vma) | |||
967 | */ | 881 | */ |
968 | static int poch_channel_available(struct channel_info *channel) | 882 | static int poch_channel_available(struct channel_info *channel) |
969 | { | 883 | { |
970 | int i; | 884 | int available = 0; |
971 | 885 | ||
972 | spin_lock_irq(&channel->group_offsets_lock); | 886 | spin_lock_irq(&channel->group_offsets_lock); |
973 | 887 | ||
974 | for (i = 0; i < channel->group_count; i++) { | 888 | if (channel->consumed != channel->transfer) |
975 | if (channel->header->group_offsets[i] != -1) { | 889 | available = 1; |
976 | spin_unlock_irq(&channel->group_offsets_lock); | ||
977 | return 1; | ||
978 | } | ||
979 | } | ||
980 | 890 | ||
981 | spin_unlock_irq(&channel->group_offsets_lock); | 891 | spin_unlock_irq(&channel->group_offsets_lock); |
982 | 892 | ||
983 | return 0; | 893 | return available; |
984 | } | 894 | } |
985 | 895 | ||
986 | static unsigned int poch_poll(struct file *filp, poll_table *pt) | 896 | static unsigned int poch_poll(struct file *filp, poll_table *pt) |
@@ -1138,7 +1048,6 @@ static void poch_irq_dma(struct channel_info *channel) | |||
1138 | long groups_done; | 1048 | long groups_done; |
1139 | unsigned long i, j; | 1049 | unsigned long i, j; |
1140 | struct poch_group_info *groups; | 1050 | struct poch_group_info *groups; |
1141 | s32 *group_offsets; | ||
1142 | u32 curr_group_reg; | 1051 | u32 curr_group_reg; |
1143 | 1052 | ||
1144 | if (!atomic_read(&channel->inited)) | 1053 | if (!atomic_read(&channel->inited)) |
@@ -1158,14 +1067,12 @@ static void poch_irq_dma(struct channel_info *channel) | |||
1158 | if (groups_done <= 0) | 1067 | if (groups_done <= 0) |
1159 | groups_done += channel->group_count; | 1068 | groups_done += channel->group_count; |
1160 | 1069 | ||
1161 | group_offsets = channel->header->group_offsets; | ||
1162 | groups = channel->groups; | 1070 | groups = channel->groups; |
1163 | 1071 | ||
1164 | spin_lock(&channel->group_offsets_lock); | 1072 | spin_lock(&channel->group_offsets_lock); |
1165 | 1073 | ||
1166 | for (i = 0; i < groups_done; i++) { | 1074 | for (i = 0; i < groups_done; i++) { |
1167 | j = (prev_transfer + i) % channel->group_count; | 1075 | j = (prev_transfer + i) % channel->group_count; |
1168 | group_offsets[j] = groups[j].user_offset; | ||
1169 | 1076 | ||
1170 | channel->transfer += 1; | 1077 | channel->transfer += 1; |
1171 | channel->transfer %= channel->group_count; | 1078 | channel->transfer %= channel->group_count; |
diff --git a/drivers/staging/poch/poch.h b/drivers/staging/poch/poch.h index ba1490b4252..bf622448ac8 100644 --- a/drivers/staging/poch/poch.h +++ b/drivers/staging/poch/poch.h | |||
@@ -7,12 +7,6 @@ | |||
7 | * include/linux for final version. | 7 | * include/linux for final version. |
8 | * | 8 | * |
9 | */ | 9 | */ |
10 | struct poch_cbuf_header { | ||
11 | __s32 group_size_bytes; | ||
12 | __s32 group_count; | ||
13 | __s32 group_offsets[0]; | ||
14 | }; | ||
15 | |||
16 | struct poch_counters { | 10 | struct poch_counters { |
17 | __u32 fifo_empty; | 11 | __u32 fifo_empty; |
18 | __u32 fifo_overflow; | 12 | __u32 fifo_overflow; |