Lines Matching full:rp

203 static inline struct mon_bin_hdr *MON_OFF2HDR(const struct mon_reader_bin *rp,  in MON_OFF2HDR()  argument
207 (rp->b_vec[offset / CHUNK_SIZE].ptr + offset % CHUNK_SIZE); in MON_OFF2HDR()
210 #define MON_RING_EMPTY(rp) ((rp)->b_cnt == 0) argument
220 static void mon_buff_area_fill(const struct mon_reader_bin *rp,
222 static int mon_bin_wait_event(struct file *file, struct mon_reader_bin *rp);
295 static unsigned int mon_buff_area_alloc(struct mon_reader_bin *rp, in mon_buff_area_alloc() argument
301 if (rp->b_cnt + size > rp->b_size) in mon_buff_area_alloc()
303 offset = rp->b_in; in mon_buff_area_alloc()
304 rp->b_cnt += size; in mon_buff_area_alloc()
305 if ((rp->b_in += size) >= rp->b_size) in mon_buff_area_alloc()
306 rp->b_in -= rp->b_size; in mon_buff_area_alloc()
320 static unsigned int mon_buff_area_alloc_contiguous(struct mon_reader_bin *rp, in mon_buff_area_alloc_contiguous() argument
327 if (rp->b_cnt + size > rp->b_size) in mon_buff_area_alloc_contiguous()
329 if (rp->b_in + size > rp->b_size) { in mon_buff_area_alloc_contiguous()
335 fill_size = rp->b_size - rp->b_in; in mon_buff_area_alloc_contiguous()
336 if (rp->b_cnt + size + fill_size > rp->b_size) in mon_buff_area_alloc_contiguous()
338 mon_buff_area_fill(rp, rp->b_in, fill_size); in mon_buff_area_alloc_contiguous()
341 rp->b_in = size; in mon_buff_area_alloc_contiguous()
342 rp->b_cnt += size + fill_size; in mon_buff_area_alloc_contiguous()
343 } else if (rp->b_in + size == rp->b_size) { in mon_buff_area_alloc_contiguous()
344 offset = rp->b_in; in mon_buff_area_alloc_contiguous()
345 rp->b_in = 0; in mon_buff_area_alloc_contiguous()
346 rp->b_cnt += size; in mon_buff_area_alloc_contiguous()
348 offset = rp->b_in; in mon_buff_area_alloc_contiguous()
349 rp->b_in += size; in mon_buff_area_alloc_contiguous()
350 rp->b_cnt += size; in mon_buff_area_alloc_contiguous()
359 static void mon_buff_area_shrink(struct mon_reader_bin *rp, unsigned int size) in mon_buff_area_shrink() argument
363 rp->b_cnt -= size; in mon_buff_area_shrink()
364 if (rp->b_in < size) in mon_buff_area_shrink()
365 rp->b_in += rp->b_size; in mon_buff_area_shrink()
366 rp->b_in -= size; in mon_buff_area_shrink()
373 static void mon_buff_area_free(struct mon_reader_bin *rp, unsigned int size) in mon_buff_area_free() argument
377 rp->b_cnt -= size; in mon_buff_area_free()
378 if ((rp->b_out += size) >= rp->b_size) in mon_buff_area_free()
379 rp->b_out -= rp->b_size; in mon_buff_area_free()
382 static void mon_buff_area_fill(const struct mon_reader_bin *rp, in mon_buff_area_fill() argument
387 ep = MON_OFF2HDR(rp, offset); in mon_buff_area_fill()
403 static unsigned int mon_bin_get_data(const struct mon_reader_bin *rp, in mon_bin_get_data() argument
417 mon_copy_to_buff(rp, offset, urb->transfer_buffer, length); in mon_bin_get_data()
432 offset = mon_copy_to_buff(rp, offset, sg_virt(sg), in mon_bin_get_data()
447 static unsigned int mon_bin_collate_isodesc(const struct mon_reader_bin *rp, in mon_bin_collate_isodesc() argument
465 static void mon_bin_get_isodesc(const struct mon_reader_bin *rp, in mon_bin_get_isodesc() argument
474 (rp->b_vec[offset / CHUNK_SIZE].ptr + offset % CHUNK_SIZE); in mon_bin_get_isodesc()
479 if ((offset += sizeof(struct mon_bin_isodesc)) >= rp->b_size) in mon_bin_get_isodesc()
485 static void mon_bin_event(struct mon_reader_bin *rp, struct urb *urb, in mon_bin_event() argument
502 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_event()
520 length = mon_bin_collate_isodesc(rp, urb, ndesc); in mon_bin_event()
530 if (length >= rp->b_size/5) in mon_bin_event()
531 length = rp->b_size/5; in mon_bin_event()
548 if (rp->mmap_active) { in mon_bin_event()
549 offset = mon_buff_area_alloc_contiguous(rp, in mon_bin_event()
552 offset = mon_buff_area_alloc(rp, length + PKT_SIZE + lendesc); in mon_bin_event()
555 rp->cnt_lost++; in mon_bin_event()
556 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_event()
560 ep = MON_OFF2HDR(rp, offset); in mon_bin_event()
561 if ((offset += PKT_SIZE) >= rp->b_size) offset = 0; in mon_bin_event()
597 mon_bin_get_isodesc(rp, offset, urb, ev_type, ndesc); in mon_bin_event()
598 if ((offset += lendesc) >= rp->b_size) in mon_bin_event()
599 offset -= rp->b_size; in mon_bin_event()
603 length = mon_bin_get_data(rp, offset, urb, length, in mon_bin_event()
609 mon_buff_area_shrink(rp, delta); in mon_bin_event()
615 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_event()
617 wake_up(&rp->b_wait); in mon_bin_event()
622 struct mon_reader_bin *rp = data; in mon_bin_submit() local
623 mon_bin_event(rp, urb, 'S', -EINPROGRESS); in mon_bin_submit()
628 struct mon_reader_bin *rp = data; in mon_bin_complete() local
629 mon_bin_event(rp, urb, 'C', status); in mon_bin_complete()
634 struct mon_reader_bin *rp = data; in mon_bin_error() local
642 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_error()
644 offset = mon_buff_area_alloc(rp, PKT_SIZE); in mon_bin_error()
647 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_error()
651 ep = MON_OFF2HDR(rp, offset); in mon_bin_error()
668 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_error()
670 wake_up(&rp->b_wait); in mon_bin_error()
676 struct mon_reader_bin *rp; in mon_bin_open() local
692 rp = kzalloc(sizeof(struct mon_reader_bin), GFP_KERNEL); in mon_bin_open()
693 if (rp == NULL) { in mon_bin_open()
697 spin_lock_init(&rp->b_lock); in mon_bin_open()
698 init_waitqueue_head(&rp->b_wait); in mon_bin_open()
699 mutex_init(&rp->fetch_lock); in mon_bin_open()
700 rp->b_size = BUFF_DFL; in mon_bin_open()
702 size = sizeof(struct mon_pgmap) * (rp->b_size/CHUNK_SIZE); in mon_bin_open()
703 if ((rp->b_vec = kzalloc(size, GFP_KERNEL)) == NULL) { in mon_bin_open()
708 if ((rc = mon_alloc_buff(rp->b_vec, rp->b_size/CHUNK_SIZE)) < 0) in mon_bin_open()
711 rp->r.m_bus = mbus; in mon_bin_open()
712 rp->r.r_data = rp; in mon_bin_open()
713 rp->r.rnf_submit = mon_bin_submit; in mon_bin_open()
714 rp->r.rnf_error = mon_bin_error; in mon_bin_open()
715 rp->r.rnf_complete = mon_bin_complete; in mon_bin_open()
717 mon_reader_add(mbus, &rp->r); in mon_bin_open()
719 file->private_data = rp; in mon_bin_open()
724 kfree(rp->b_vec); in mon_bin_open()
726 kfree(rp); in mon_bin_open()
737 static int mon_bin_get_event(struct file *file, struct mon_reader_bin *rp, in mon_bin_get_event() argument
747 mutex_lock(&rp->fetch_lock); in mon_bin_get_event()
749 if ((rc = mon_bin_wait_event(file, rp)) < 0) { in mon_bin_get_event()
750 mutex_unlock(&rp->fetch_lock); in mon_bin_get_event()
754 ep = MON_OFF2HDR(rp, rp->b_out); in mon_bin_get_event()
757 mutex_unlock(&rp->fetch_lock); in mon_bin_get_event()
762 if ((offset = rp->b_out + PKT_SIZE) >= rp->b_size) offset = 0; in mon_bin_get_event()
764 if (copy_from_buf(rp, offset, data, step_len)) { in mon_bin_get_event()
765 mutex_unlock(&rp->fetch_lock); in mon_bin_get_event()
769 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_get_event()
770 mon_buff_area_free(rp, PKT_SIZE + ep->len_cap); in mon_bin_get_event()
771 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_get_event()
772 rp->b_read = 0; in mon_bin_get_event()
774 mutex_unlock(&rp->fetch_lock); in mon_bin_get_event()
780 struct mon_reader_bin *rp = file->private_data; in mon_bin_release() local
781 struct mon_bus* mbus = rp->r.m_bus; in mon_bin_release()
790 mon_reader_del(mbus, &rp->r); in mon_bin_release()
792 mon_free_buff(rp->b_vec, rp->b_size/CHUNK_SIZE); in mon_bin_release()
793 kfree(rp->b_vec); in mon_bin_release()
794 kfree(rp); in mon_bin_release()
803 struct mon_reader_bin *rp = file->private_data; in mon_bin_read() local
813 mutex_lock(&rp->fetch_lock); in mon_bin_read()
815 if ((rc = mon_bin_wait_event(file, rp)) < 0) { in mon_bin_read()
816 mutex_unlock(&rp->fetch_lock); in mon_bin_read()
820 ep = MON_OFF2HDR(rp, rp->b_out); in mon_bin_read()
822 if (rp->b_read < hdrbytes) { in mon_bin_read()
823 step_len = min(nbytes, (size_t)(hdrbytes - rp->b_read)); in mon_bin_read()
824 ptr = ((char *)ep) + rp->b_read; in mon_bin_read()
826 mutex_unlock(&rp->fetch_lock); in mon_bin_read()
831 rp->b_read += step_len; in mon_bin_read()
835 if (rp->b_read >= hdrbytes) { in mon_bin_read()
837 step_len -= rp->b_read - hdrbytes; in mon_bin_read()
840 offset = rp->b_out + PKT_SIZE; in mon_bin_read()
841 offset += rp->b_read - hdrbytes; in mon_bin_read()
842 if (offset >= rp->b_size) in mon_bin_read()
843 offset -= rp->b_size; in mon_bin_read()
844 if (copy_from_buf(rp, offset, buf, step_len)) { in mon_bin_read()
845 mutex_unlock(&rp->fetch_lock); in mon_bin_read()
850 rp->b_read += step_len; in mon_bin_read()
857 if (rp->b_read >= hdrbytes + ep->len_cap) { in mon_bin_read()
858 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_read()
859 mon_buff_area_free(rp, PKT_SIZE + ep->len_cap); in mon_bin_read()
860 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_read()
861 rp->b_read = 0; in mon_bin_read()
864 mutex_unlock(&rp->fetch_lock); in mon_bin_read()
872 static int mon_bin_flush(struct mon_reader_bin *rp, unsigned nevents) in mon_bin_flush() argument
878 mutex_lock(&rp->fetch_lock); in mon_bin_flush()
879 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_flush()
881 if (MON_RING_EMPTY(rp)) in mon_bin_flush()
884 ep = MON_OFF2HDR(rp, rp->b_out); in mon_bin_flush()
885 mon_buff_area_free(rp, PKT_SIZE + ep->len_cap); in mon_bin_flush()
887 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_flush()
888 rp->b_read = 0; in mon_bin_flush()
889 mutex_unlock(&rp->fetch_lock); in mon_bin_flush()
898 static int mon_bin_fetch(struct file *file, struct mon_reader_bin *rp, in mon_bin_fetch() argument
909 mutex_lock(&rp->fetch_lock); in mon_bin_fetch()
911 if ((rc = mon_bin_wait_event(file, rp)) < 0) { in mon_bin_fetch()
912 mutex_unlock(&rp->fetch_lock); in mon_bin_fetch()
916 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_fetch()
917 avail = rp->b_cnt; in mon_bin_fetch()
918 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_fetch()
920 cur_out = rp->b_out; in mon_bin_fetch()
927 ep = MON_OFF2HDR(rp, cur_out); in mon_bin_fetch()
929 mutex_unlock(&rp->fetch_lock); in mon_bin_fetch()
936 if ((cur_out += size) >= rp->b_size) in mon_bin_fetch()
937 cur_out -= rp->b_size; in mon_bin_fetch()
941 mutex_unlock(&rp->fetch_lock); in mon_bin_fetch()
949 static int mon_bin_queued(struct mon_reader_bin *rp) in mon_bin_queued() argument
958 mutex_lock(&rp->fetch_lock); in mon_bin_queued()
960 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_queued()
961 avail = rp->b_cnt; in mon_bin_queued()
962 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_queued()
964 cur_out = rp->b_out; in mon_bin_queued()
968 ep = MON_OFF2HDR(rp, cur_out); in mon_bin_queued()
973 if ((cur_out += size) >= rp->b_size) in mon_bin_queued()
974 cur_out -= rp->b_size; in mon_bin_queued()
978 mutex_unlock(&rp->fetch_lock); in mon_bin_queued()
986 struct mon_reader_bin *rp = file->private_data; in mon_bin_ioctl() local
987 // struct mon_bus* mbus = rp->r.m_bus; in mon_bin_ioctl()
998 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_ioctl()
999 if (!MON_RING_EMPTY(rp)) { in mon_bin_ioctl()
1000 ep = MON_OFF2HDR(rp, rp->b_out); in mon_bin_ioctl()
1003 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_ioctl()
1007 mutex_lock(&rp->fetch_lock); in mon_bin_ioctl()
1008 ret = rp->b_size; in mon_bin_ioctl()
1009 mutex_unlock(&rp->fetch_lock); in mon_bin_ioctl()
1040 mutex_lock(&rp->fetch_lock); in mon_bin_ioctl()
1041 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_ioctl()
1042 if (rp->mmap_active) { in mon_bin_ioctl()
1047 mon_free_buff(rp->b_vec, rp->b_size/CHUNK_SIZE); in mon_bin_ioctl()
1048 kfree(rp->b_vec); in mon_bin_ioctl()
1049 rp->b_vec = vec; in mon_bin_ioctl()
1050 rp->b_size = size; in mon_bin_ioctl()
1051 rp->b_read = rp->b_in = rp->b_out = rp->b_cnt = 0; in mon_bin_ioctl()
1052 rp->cnt_lost = 0; in mon_bin_ioctl()
1054 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_ioctl()
1055 mutex_unlock(&rp->fetch_lock); in mon_bin_ioctl()
1060 ret = mon_bin_flush(rp, arg); in mon_bin_ioctl()
1074 ret = mon_bin_get_event(file, rp, getb.hdr, in mon_bin_ioctl()
1091 ret = mon_bin_flush(rp, mfetch.nflush); in mon_bin_ioctl()
1097 ret = mon_bin_fetch(file, rp, mfetch.offvec, mfetch.nfetch); in mon_bin_ioctl()
1111 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_ioctl()
1112 ndropped = rp->cnt_lost; in mon_bin_ioctl()
1113 rp->cnt_lost = 0; in mon_bin_ioctl()
1114 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_ioctl()
1115 nevents = mon_bin_queued(rp); in mon_bin_ioctl()
1137 struct mon_reader_bin *rp = file->private_data; in mon_bin_compat_ioctl() local
1151 ret = mon_bin_get_event(file, rp, compat_ptr(getb.hdr32), in mon_bin_compat_ioctl()
1170 ret = mon_bin_flush(rp, mfetch.nflush32); in mon_bin_compat_ioctl()
1176 ret = mon_bin_fetch(file, rp, compat_ptr(mfetch.offvec32), in mon_bin_compat_ioctl()
1204 struct mon_reader_bin *rp = file->private_data; in mon_bin_poll() local
1209 poll_wait(file, &rp->b_wait, wait); in mon_bin_poll()
1211 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_poll()
1212 if (!MON_RING_EMPTY(rp)) in mon_bin_poll()
1214 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_poll()
1224 struct mon_reader_bin *rp = vma->vm_private_data; in mon_bin_vma_open() local
1227 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_vma_open()
1228 rp->mmap_active++; in mon_bin_vma_open()
1229 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_vma_open()
1236 struct mon_reader_bin *rp = vma->vm_private_data; in mon_bin_vma_close() local
1237 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_vma_close()
1238 rp->mmap_active--; in mon_bin_vma_close()
1239 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_vma_close()
1247 struct mon_reader_bin *rp = vmf->vma->vm_private_data; in mon_bin_vma_fault() local
1252 if (offset >= rp->b_size) in mon_bin_vma_fault()
1255 pageptr = rp->b_vec[chunk_idx].pg; in mon_bin_vma_fault()
1297 static int mon_bin_wait_event(struct file *file, struct mon_reader_bin *rp) in mon_bin_wait_event() argument
1302 add_wait_queue(&rp->b_wait, &waita); in mon_bin_wait_event()
1305 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_wait_event()
1306 while (MON_RING_EMPTY(rp)) { in mon_bin_wait_event()
1307 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_wait_event()
1311 remove_wait_queue(&rp->b_wait, &waita); in mon_bin_wait_event()
1316 remove_wait_queue(&rp->b_wait, &waita); in mon_bin_wait_event()
1321 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_wait_event()
1323 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_wait_event()
1326 remove_wait_queue(&rp->b_wait, &waita); in mon_bin_wait_event()