aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVijay Kumar B <vijaykumar@bravegnu.org>2009-09-21 01:53:58 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2009-12-11 15:23:09 -0500
commit92d450336eedf4c671f37c931fa8ccc28c6be3a9 (patch)
tree7c9bb8e3bbc63298c91373819eeb974cd09c2b23
parentdad1740133ffe49ae44044f97e4cbfcb42f037b1 (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/README1
-rw-r--r--drivers/staging/poch/poch.c109
-rw-r--r--drivers/staging/poch/poch.h6
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 @@
1TODO: 1TODO:
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
528static 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
548static 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
556static 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
578static void __poch_channel_clear_counters(struct channel_info *channel) 520static 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 */
895static int poch_mmap(struct file *filp, struct vm_area_struct *vma) 824static 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 */
968static int poch_channel_available(struct channel_info *channel) 882static 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
986static unsigned int poch_poll(struct file *filp, poll_table *pt) 896static 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 */
10struct poch_cbuf_header {
11 __s32 group_size_bytes;
12 __s32 group_count;
13 __s32 group_offsets[0];
14};
15
16struct poch_counters { 10struct poch_counters {
17 __u32 fifo_empty; 11 __u32 fifo_empty;
18 __u32 fifo_overflow; 12 __u32 fifo_overflow;