Lines Matching refs:rp

200 static inline struct mon_bin_hdr *MON_OFF2HDR(const struct mon_reader_bin *rp,  in MON_OFF2HDR()  argument
204 (rp->b_vec[offset / CHUNK_SIZE].ptr + offset % CHUNK_SIZE); in MON_OFF2HDR()
207 #define MON_RING_EMPTY(rp) ((rp)->b_cnt == 0) argument
217 static void mon_buff_area_fill(const struct mon_reader_bin *rp,
219 static int mon_bin_wait_event(struct file *file, struct mon_reader_bin *rp);
292 static unsigned int mon_buff_area_alloc(struct mon_reader_bin *rp, in mon_buff_area_alloc() argument
298 if (rp->b_cnt + size > rp->b_size) in mon_buff_area_alloc()
300 offset = rp->b_in; in mon_buff_area_alloc()
301 rp->b_cnt += size; in mon_buff_area_alloc()
302 if ((rp->b_in += size) >= rp->b_size) in mon_buff_area_alloc()
303 rp->b_in -= rp->b_size; in mon_buff_area_alloc()
317 static unsigned int mon_buff_area_alloc_contiguous(struct mon_reader_bin *rp, in mon_buff_area_alloc_contiguous() argument
324 if (rp->b_cnt + size > rp->b_size) in mon_buff_area_alloc_contiguous()
326 if (rp->b_in + size > rp->b_size) { in mon_buff_area_alloc_contiguous()
332 fill_size = rp->b_size - rp->b_in; in mon_buff_area_alloc_contiguous()
333 if (rp->b_cnt + size + fill_size > rp->b_size) in mon_buff_area_alloc_contiguous()
335 mon_buff_area_fill(rp, rp->b_in, fill_size); in mon_buff_area_alloc_contiguous()
338 rp->b_in = size; in mon_buff_area_alloc_contiguous()
339 rp->b_cnt += size + fill_size; in mon_buff_area_alloc_contiguous()
340 } else if (rp->b_in + size == rp->b_size) { in mon_buff_area_alloc_contiguous()
341 offset = rp->b_in; in mon_buff_area_alloc_contiguous()
342 rp->b_in = 0; in mon_buff_area_alloc_contiguous()
343 rp->b_cnt += size; in mon_buff_area_alloc_contiguous()
345 offset = rp->b_in; in mon_buff_area_alloc_contiguous()
346 rp->b_in += size; in mon_buff_area_alloc_contiguous()
347 rp->b_cnt += size; in mon_buff_area_alloc_contiguous()
356 static void mon_buff_area_shrink(struct mon_reader_bin *rp, unsigned int size) in mon_buff_area_shrink() argument
360 rp->b_cnt -= size; in mon_buff_area_shrink()
361 if (rp->b_in < size) in mon_buff_area_shrink()
362 rp->b_in += rp->b_size; in mon_buff_area_shrink()
363 rp->b_in -= size; in mon_buff_area_shrink()
370 static void mon_buff_area_free(struct mon_reader_bin *rp, unsigned int size) in mon_buff_area_free() argument
374 rp->b_cnt -= size; in mon_buff_area_free()
375 if ((rp->b_out += size) >= rp->b_size) in mon_buff_area_free()
376 rp->b_out -= rp->b_size; in mon_buff_area_free()
379 static void mon_buff_area_fill(const struct mon_reader_bin *rp, in mon_buff_area_fill() argument
384 ep = MON_OFF2HDR(rp, offset); in mon_buff_area_fill()
400 static unsigned int mon_bin_get_data(const struct mon_reader_bin *rp, in mon_bin_get_data() argument
414 mon_copy_to_buff(rp, offset, urb->transfer_buffer, length); in mon_bin_get_data()
429 offset = mon_copy_to_buff(rp, offset, sg_virt(sg), in mon_bin_get_data()
444 static unsigned int mon_bin_collate_isodesc(const struct mon_reader_bin *rp, in mon_bin_collate_isodesc() argument
462 static void mon_bin_get_isodesc(const struct mon_reader_bin *rp, in mon_bin_get_isodesc() argument
471 (rp->b_vec[offset / CHUNK_SIZE].ptr + offset % CHUNK_SIZE); in mon_bin_get_isodesc()
476 if ((offset += sizeof(struct mon_bin_isodesc)) >= rp->b_size) in mon_bin_get_isodesc()
482 static void mon_bin_event(struct mon_reader_bin *rp, struct urb *urb, in mon_bin_event() argument
499 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_event()
517 length = mon_bin_collate_isodesc(rp, urb, ndesc); in mon_bin_event()
527 if (length >= rp->b_size/5) in mon_bin_event()
528 length = rp->b_size/5; in mon_bin_event()
545 if (rp->mmap_active) { in mon_bin_event()
546 offset = mon_buff_area_alloc_contiguous(rp, in mon_bin_event()
549 offset = mon_buff_area_alloc(rp, length + PKT_SIZE + lendesc); in mon_bin_event()
552 rp->cnt_lost++; in mon_bin_event()
553 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_event()
557 ep = MON_OFF2HDR(rp, offset); in mon_bin_event()
558 if ((offset += PKT_SIZE) >= rp->b_size) offset = 0; in mon_bin_event()
594 mon_bin_get_isodesc(rp, offset, urb, ev_type, ndesc); in mon_bin_event()
595 if ((offset += lendesc) >= rp->b_size) in mon_bin_event()
596 offset -= rp->b_size; in mon_bin_event()
600 length = mon_bin_get_data(rp, offset, urb, length, in mon_bin_event()
606 mon_buff_area_shrink(rp, delta); in mon_bin_event()
612 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_event()
614 wake_up(&rp->b_wait); in mon_bin_event()
619 struct mon_reader_bin *rp = data; in mon_bin_submit() local
620 mon_bin_event(rp, urb, 'S', -EINPROGRESS); in mon_bin_submit()
625 struct mon_reader_bin *rp = data; in mon_bin_complete() local
626 mon_bin_event(rp, urb, 'C', status); in mon_bin_complete()
631 struct mon_reader_bin *rp = data; in mon_bin_error() local
639 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_error()
641 offset = mon_buff_area_alloc(rp, PKT_SIZE); in mon_bin_error()
644 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_error()
648 ep = MON_OFF2HDR(rp, offset); in mon_bin_error()
665 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_error()
667 wake_up(&rp->b_wait); in mon_bin_error()
673 struct mon_reader_bin *rp; in mon_bin_open() local
689 rp = kzalloc(sizeof(struct mon_reader_bin), GFP_KERNEL); in mon_bin_open()
690 if (rp == NULL) { in mon_bin_open()
694 spin_lock_init(&rp->b_lock); in mon_bin_open()
695 init_waitqueue_head(&rp->b_wait); in mon_bin_open()
696 mutex_init(&rp->fetch_lock); in mon_bin_open()
697 rp->b_size = BUFF_DFL; in mon_bin_open()
699 size = sizeof(struct mon_pgmap) * (rp->b_size/CHUNK_SIZE); in mon_bin_open()
700 if ((rp->b_vec = kzalloc(size, GFP_KERNEL)) == NULL) { in mon_bin_open()
705 if ((rc = mon_alloc_buff(rp->b_vec, rp->b_size/CHUNK_SIZE)) < 0) in mon_bin_open()
708 rp->r.m_bus = mbus; in mon_bin_open()
709 rp->r.r_data = rp; in mon_bin_open()
710 rp->r.rnf_submit = mon_bin_submit; in mon_bin_open()
711 rp->r.rnf_error = mon_bin_error; in mon_bin_open()
712 rp->r.rnf_complete = mon_bin_complete; in mon_bin_open()
714 mon_reader_add(mbus, &rp->r); in mon_bin_open()
716 file->private_data = rp; in mon_bin_open()
721 kfree(rp->b_vec); in mon_bin_open()
723 kfree(rp); in mon_bin_open()
734 static int mon_bin_get_event(struct file *file, struct mon_reader_bin *rp, in mon_bin_get_event() argument
744 mutex_lock(&rp->fetch_lock); in mon_bin_get_event()
746 if ((rc = mon_bin_wait_event(file, rp)) < 0) { in mon_bin_get_event()
747 mutex_unlock(&rp->fetch_lock); in mon_bin_get_event()
751 ep = MON_OFF2HDR(rp, rp->b_out); in mon_bin_get_event()
754 mutex_unlock(&rp->fetch_lock); in mon_bin_get_event()
759 if ((offset = rp->b_out + PKT_SIZE) >= rp->b_size) offset = 0; in mon_bin_get_event()
761 if (copy_from_buf(rp, offset, data, step_len)) { in mon_bin_get_event()
762 mutex_unlock(&rp->fetch_lock); in mon_bin_get_event()
766 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_get_event()
767 mon_buff_area_free(rp, PKT_SIZE + ep->len_cap); in mon_bin_get_event()
768 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_get_event()
769 rp->b_read = 0; in mon_bin_get_event()
771 mutex_unlock(&rp->fetch_lock); in mon_bin_get_event()
777 struct mon_reader_bin *rp = file->private_data; in mon_bin_release() local
778 struct mon_bus* mbus = rp->r.m_bus; in mon_bin_release()
787 mon_reader_del(mbus, &rp->r); in mon_bin_release()
789 mon_free_buff(rp->b_vec, rp->b_size/CHUNK_SIZE); in mon_bin_release()
790 kfree(rp->b_vec); in mon_bin_release()
791 kfree(rp); in mon_bin_release()
800 struct mon_reader_bin *rp = file->private_data; in mon_bin_read() local
810 mutex_lock(&rp->fetch_lock); in mon_bin_read()
812 if ((rc = mon_bin_wait_event(file, rp)) < 0) { in mon_bin_read()
813 mutex_unlock(&rp->fetch_lock); in mon_bin_read()
817 ep = MON_OFF2HDR(rp, rp->b_out); in mon_bin_read()
819 if (rp->b_read < hdrbytes) { in mon_bin_read()
820 step_len = min(nbytes, (size_t)(hdrbytes - rp->b_read)); in mon_bin_read()
821 ptr = ((char *)ep) + rp->b_read; in mon_bin_read()
823 mutex_unlock(&rp->fetch_lock); in mon_bin_read()
828 rp->b_read += step_len; in mon_bin_read()
832 if (rp->b_read >= hdrbytes) { in mon_bin_read()
834 step_len -= rp->b_read - hdrbytes; in mon_bin_read()
837 offset = rp->b_out + PKT_SIZE; in mon_bin_read()
838 offset += rp->b_read - hdrbytes; in mon_bin_read()
839 if (offset >= rp->b_size) in mon_bin_read()
840 offset -= rp->b_size; in mon_bin_read()
841 if (copy_from_buf(rp, offset, buf, step_len)) { in mon_bin_read()
842 mutex_unlock(&rp->fetch_lock); in mon_bin_read()
847 rp->b_read += step_len; in mon_bin_read()
854 if (rp->b_read >= hdrbytes + ep->len_cap) { in mon_bin_read()
855 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_read()
856 mon_buff_area_free(rp, PKT_SIZE + ep->len_cap); in mon_bin_read()
857 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_read()
858 rp->b_read = 0; in mon_bin_read()
861 mutex_unlock(&rp->fetch_lock); in mon_bin_read()
869 static int mon_bin_flush(struct mon_reader_bin *rp, unsigned nevents) in mon_bin_flush() argument
875 mutex_lock(&rp->fetch_lock); in mon_bin_flush()
876 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_flush()
878 if (MON_RING_EMPTY(rp)) in mon_bin_flush()
881 ep = MON_OFF2HDR(rp, rp->b_out); in mon_bin_flush()
882 mon_buff_area_free(rp, PKT_SIZE + ep->len_cap); in mon_bin_flush()
884 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_flush()
885 rp->b_read = 0; in mon_bin_flush()
886 mutex_unlock(&rp->fetch_lock); in mon_bin_flush()
895 static int mon_bin_fetch(struct file *file, struct mon_reader_bin *rp, in mon_bin_fetch() argument
906 mutex_lock(&rp->fetch_lock); in mon_bin_fetch()
908 if ((rc = mon_bin_wait_event(file, rp)) < 0) { in mon_bin_fetch()
909 mutex_unlock(&rp->fetch_lock); in mon_bin_fetch()
913 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_fetch()
914 avail = rp->b_cnt; in mon_bin_fetch()
915 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_fetch()
917 cur_out = rp->b_out; in mon_bin_fetch()
924 ep = MON_OFF2HDR(rp, cur_out); in mon_bin_fetch()
926 mutex_unlock(&rp->fetch_lock); in mon_bin_fetch()
933 if ((cur_out += size) >= rp->b_size) in mon_bin_fetch()
934 cur_out -= rp->b_size; in mon_bin_fetch()
938 mutex_unlock(&rp->fetch_lock); in mon_bin_fetch()
946 static int mon_bin_queued(struct mon_reader_bin *rp) in mon_bin_queued() argument
955 mutex_lock(&rp->fetch_lock); in mon_bin_queued()
957 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_queued()
958 avail = rp->b_cnt; in mon_bin_queued()
959 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_queued()
961 cur_out = rp->b_out; in mon_bin_queued()
965 ep = MON_OFF2HDR(rp, cur_out); in mon_bin_queued()
970 if ((cur_out += size) >= rp->b_size) in mon_bin_queued()
971 cur_out -= rp->b_size; in mon_bin_queued()
975 mutex_unlock(&rp->fetch_lock); in mon_bin_queued()
983 struct mon_reader_bin *rp = file->private_data; in mon_bin_ioctl() local
995 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_ioctl()
996 if (!MON_RING_EMPTY(rp)) { in mon_bin_ioctl()
997 ep = MON_OFF2HDR(rp, rp->b_out); in mon_bin_ioctl()
1000 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_ioctl()
1004 ret = rp->b_size; in mon_bin_ioctl()
1034 mutex_lock(&rp->fetch_lock); in mon_bin_ioctl()
1035 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_ioctl()
1036 mon_free_buff(rp->b_vec, rp->b_size/CHUNK_SIZE); in mon_bin_ioctl()
1037 kfree(rp->b_vec); in mon_bin_ioctl()
1038 rp->b_vec = vec; in mon_bin_ioctl()
1039 rp->b_size = size; in mon_bin_ioctl()
1040 rp->b_read = rp->b_in = rp->b_out = rp->b_cnt = 0; in mon_bin_ioctl()
1041 rp->cnt_lost = 0; in mon_bin_ioctl()
1042 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_ioctl()
1043 mutex_unlock(&rp->fetch_lock); in mon_bin_ioctl()
1048 ret = mon_bin_flush(rp, arg); in mon_bin_ioctl()
1062 ret = mon_bin_get_event(file, rp, getb.hdr, in mon_bin_ioctl()
1079 ret = mon_bin_flush(rp, mfetch.nflush); in mon_bin_ioctl()
1085 ret = mon_bin_fetch(file, rp, mfetch.offvec, mfetch.nfetch); in mon_bin_ioctl()
1099 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_ioctl()
1100 ndropped = rp->cnt_lost; in mon_bin_ioctl()
1101 rp->cnt_lost = 0; in mon_bin_ioctl()
1102 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_ioctl()
1103 nevents = mon_bin_queued(rp); in mon_bin_ioctl()
1125 struct mon_reader_bin *rp = file->private_data; in mon_bin_compat_ioctl() local
1139 ret = mon_bin_get_event(file, rp, compat_ptr(getb.hdr32), in mon_bin_compat_ioctl()
1158 ret = mon_bin_flush(rp, mfetch.nflush32); in mon_bin_compat_ioctl()
1164 ret = mon_bin_fetch(file, rp, compat_ptr(mfetch.offvec32), in mon_bin_compat_ioctl()
1192 struct mon_reader_bin *rp = file->private_data; in mon_bin_poll() local
1197 poll_wait(file, &rp->b_wait, wait); in mon_bin_poll()
1199 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_poll()
1200 if (!MON_RING_EMPTY(rp)) in mon_bin_poll()
1202 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_poll()
1212 struct mon_reader_bin *rp = vma->vm_private_data; in mon_bin_vma_open() local
1213 rp->mmap_active++; in mon_bin_vma_open()
1218 struct mon_reader_bin *rp = vma->vm_private_data; in mon_bin_vma_close() local
1219 rp->mmap_active--; in mon_bin_vma_close()
1227 struct mon_reader_bin *rp = vma->vm_private_data; in mon_bin_vma_fault() local
1232 if (offset >= rp->b_size) in mon_bin_vma_fault()
1235 pageptr = rp->b_vec[chunk_idx].pg; in mon_bin_vma_fault()
1272 static int mon_bin_wait_event(struct file *file, struct mon_reader_bin *rp) in mon_bin_wait_event() argument
1277 add_wait_queue(&rp->b_wait, &waita); in mon_bin_wait_event()
1280 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_wait_event()
1281 while (MON_RING_EMPTY(rp)) { in mon_bin_wait_event()
1282 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_wait_event()
1286 remove_wait_queue(&rp->b_wait, &waita); in mon_bin_wait_event()
1291 remove_wait_queue(&rp->b_wait, &waita); in mon_bin_wait_event()
1296 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_wait_event()
1298 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_wait_event()
1301 remove_wait_queue(&rp->b_wait, &waita); in mon_bin_wait_event()