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
688 rp = kzalloc(sizeof(struct mon_reader_bin), GFP_KERNEL); in mon_bin_open()
689 if (rp == NULL) { in mon_bin_open()
693 spin_lock_init(&rp->b_lock); in mon_bin_open()
694 init_waitqueue_head(&rp->b_wait); in mon_bin_open()
695 mutex_init(&rp->fetch_lock); in mon_bin_open()
696 rp->b_size = BUFF_DFL; in mon_bin_open()
698 size = sizeof(struct mon_pgmap) * (rp->b_size/CHUNK_SIZE); in mon_bin_open()
699 if ((rp->b_vec = kzalloc(size, GFP_KERNEL)) == NULL) { in mon_bin_open()
704 if ((rc = mon_alloc_buff(rp->b_vec, rp->b_size/CHUNK_SIZE)) < 0) in mon_bin_open()
707 rp->r.m_bus = mbus; in mon_bin_open()
708 rp->r.r_data = rp; in mon_bin_open()
709 rp->r.rnf_submit = mon_bin_submit; in mon_bin_open()
710 rp->r.rnf_error = mon_bin_error; in mon_bin_open()
711 rp->r.rnf_complete = mon_bin_complete; in mon_bin_open()
713 mon_reader_add(mbus, &rp->r); in mon_bin_open()
715 file->private_data = rp; in mon_bin_open()
720 kfree(rp->b_vec); in mon_bin_open()
722 kfree(rp); in mon_bin_open()
733 static int mon_bin_get_event(struct file *file, struct mon_reader_bin *rp, in mon_bin_get_event() argument
743 mutex_lock(&rp->fetch_lock); in mon_bin_get_event()
745 if ((rc = mon_bin_wait_event(file, rp)) < 0) { in mon_bin_get_event()
746 mutex_unlock(&rp->fetch_lock); in mon_bin_get_event()
750 ep = MON_OFF2HDR(rp, rp->b_out); in mon_bin_get_event()
753 mutex_unlock(&rp->fetch_lock); in mon_bin_get_event()
758 if ((offset = rp->b_out + PKT_SIZE) >= rp->b_size) offset = 0; in mon_bin_get_event()
760 if (copy_from_buf(rp, offset, data, step_len)) { in mon_bin_get_event()
761 mutex_unlock(&rp->fetch_lock); in mon_bin_get_event()
765 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_get_event()
766 mon_buff_area_free(rp, PKT_SIZE + ep->len_cap); in mon_bin_get_event()
767 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_get_event()
768 rp->b_read = 0; in mon_bin_get_event()
770 mutex_unlock(&rp->fetch_lock); in mon_bin_get_event()
776 struct mon_reader_bin *rp = file->private_data; in mon_bin_release() local
777 struct mon_bus* mbus = rp->r.m_bus; in mon_bin_release()
786 mon_reader_del(mbus, &rp->r); in mon_bin_release()
788 mon_free_buff(rp->b_vec, rp->b_size/CHUNK_SIZE); in mon_bin_release()
789 kfree(rp->b_vec); in mon_bin_release()
790 kfree(rp); in mon_bin_release()
799 struct mon_reader_bin *rp = file->private_data; in mon_bin_read() local
809 mutex_lock(&rp->fetch_lock); in mon_bin_read()
811 if ((rc = mon_bin_wait_event(file, rp)) < 0) { in mon_bin_read()
812 mutex_unlock(&rp->fetch_lock); in mon_bin_read()
816 ep = MON_OFF2HDR(rp, rp->b_out); in mon_bin_read()
818 if (rp->b_read < hdrbytes) { in mon_bin_read()
819 step_len = min(nbytes, (size_t)(hdrbytes - rp->b_read)); in mon_bin_read()
820 ptr = ((char *)ep) + rp->b_read; in mon_bin_read()
822 mutex_unlock(&rp->fetch_lock); in mon_bin_read()
827 rp->b_read += step_len; in mon_bin_read()
831 if (rp->b_read >= hdrbytes) { in mon_bin_read()
833 step_len -= rp->b_read - hdrbytes; in mon_bin_read()
836 offset = rp->b_out + PKT_SIZE; in mon_bin_read()
837 offset += rp->b_read - hdrbytes; in mon_bin_read()
838 if (offset >= rp->b_size) in mon_bin_read()
839 offset -= rp->b_size; in mon_bin_read()
840 if (copy_from_buf(rp, offset, buf, step_len)) { in mon_bin_read()
841 mutex_unlock(&rp->fetch_lock); in mon_bin_read()
846 rp->b_read += step_len; in mon_bin_read()
853 if (rp->b_read >= hdrbytes + ep->len_cap) { in mon_bin_read()
854 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_read()
855 mon_buff_area_free(rp, PKT_SIZE + ep->len_cap); in mon_bin_read()
856 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_read()
857 rp->b_read = 0; in mon_bin_read()
860 mutex_unlock(&rp->fetch_lock); in mon_bin_read()
868 static int mon_bin_flush(struct mon_reader_bin *rp, unsigned nevents) in mon_bin_flush() argument
874 mutex_lock(&rp->fetch_lock); in mon_bin_flush()
875 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_flush()
877 if (MON_RING_EMPTY(rp)) in mon_bin_flush()
880 ep = MON_OFF2HDR(rp, rp->b_out); in mon_bin_flush()
881 mon_buff_area_free(rp, PKT_SIZE + ep->len_cap); in mon_bin_flush()
883 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_flush()
884 rp->b_read = 0; in mon_bin_flush()
885 mutex_unlock(&rp->fetch_lock); in mon_bin_flush()
894 static int mon_bin_fetch(struct file *file, struct mon_reader_bin *rp, in mon_bin_fetch() argument
905 mutex_lock(&rp->fetch_lock); in mon_bin_fetch()
907 if ((rc = mon_bin_wait_event(file, rp)) < 0) { in mon_bin_fetch()
908 mutex_unlock(&rp->fetch_lock); in mon_bin_fetch()
912 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_fetch()
913 avail = rp->b_cnt; in mon_bin_fetch()
914 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_fetch()
916 cur_out = rp->b_out; in mon_bin_fetch()
923 ep = MON_OFF2HDR(rp, cur_out); in mon_bin_fetch()
925 mutex_unlock(&rp->fetch_lock); in mon_bin_fetch()
932 if ((cur_out += size) >= rp->b_size) in mon_bin_fetch()
933 cur_out -= rp->b_size; in mon_bin_fetch()
937 mutex_unlock(&rp->fetch_lock); in mon_bin_fetch()
945 static int mon_bin_queued(struct mon_reader_bin *rp) in mon_bin_queued() argument
954 mutex_lock(&rp->fetch_lock); in mon_bin_queued()
956 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_queued()
957 avail = rp->b_cnt; in mon_bin_queued()
958 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_queued()
960 cur_out = rp->b_out; in mon_bin_queued()
964 ep = MON_OFF2HDR(rp, cur_out); in mon_bin_queued()
969 if ((cur_out += size) >= rp->b_size) in mon_bin_queued()
970 cur_out -= rp->b_size; in mon_bin_queued()
974 mutex_unlock(&rp->fetch_lock); in mon_bin_queued()
982 struct mon_reader_bin *rp = file->private_data; in mon_bin_ioctl() local
994 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_ioctl()
995 if (!MON_RING_EMPTY(rp)) { in mon_bin_ioctl()
996 ep = MON_OFF2HDR(rp, rp->b_out); in mon_bin_ioctl()
999 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_ioctl()
1003 ret = rp->b_size; in mon_bin_ioctl()
1033 mutex_lock(&rp->fetch_lock); in mon_bin_ioctl()
1034 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_ioctl()
1035 mon_free_buff(rp->b_vec, rp->b_size/CHUNK_SIZE); in mon_bin_ioctl()
1036 kfree(rp->b_vec); in mon_bin_ioctl()
1037 rp->b_vec = vec; in mon_bin_ioctl()
1038 rp->b_size = size; in mon_bin_ioctl()
1039 rp->b_read = rp->b_in = rp->b_out = rp->b_cnt = 0; in mon_bin_ioctl()
1040 rp->cnt_lost = 0; in mon_bin_ioctl()
1041 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_ioctl()
1042 mutex_unlock(&rp->fetch_lock); in mon_bin_ioctl()
1047 ret = mon_bin_flush(rp, arg); in mon_bin_ioctl()
1061 ret = mon_bin_get_event(file, rp, getb.hdr, in mon_bin_ioctl()
1078 ret = mon_bin_flush(rp, mfetch.nflush); in mon_bin_ioctl()
1084 ret = mon_bin_fetch(file, rp, mfetch.offvec, mfetch.nfetch); in mon_bin_ioctl()
1098 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_ioctl()
1099 ndropped = rp->cnt_lost; in mon_bin_ioctl()
1100 rp->cnt_lost = 0; in mon_bin_ioctl()
1101 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_ioctl()
1102 nevents = mon_bin_queued(rp); in mon_bin_ioctl()
1124 struct mon_reader_bin *rp = file->private_data; in mon_bin_compat_ioctl() local
1138 ret = mon_bin_get_event(file, rp, compat_ptr(getb.hdr32), in mon_bin_compat_ioctl()
1157 ret = mon_bin_flush(rp, mfetch.nflush32); in mon_bin_compat_ioctl()
1163 ret = mon_bin_fetch(file, rp, compat_ptr(mfetch.offvec32), in mon_bin_compat_ioctl()
1191 struct mon_reader_bin *rp = file->private_data; in mon_bin_poll() local
1196 poll_wait(file, &rp->b_wait, wait); in mon_bin_poll()
1198 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_poll()
1199 if (!MON_RING_EMPTY(rp)) in mon_bin_poll()
1201 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_poll()
1211 struct mon_reader_bin *rp = vma->vm_private_data; in mon_bin_vma_open() local
1212 rp->mmap_active++; in mon_bin_vma_open()
1217 struct mon_reader_bin *rp = vma->vm_private_data; in mon_bin_vma_close() local
1218 rp->mmap_active--; in mon_bin_vma_close()
1226 struct mon_reader_bin *rp = vma->vm_private_data; in mon_bin_vma_fault() local
1231 if (offset >= rp->b_size) in mon_bin_vma_fault()
1234 pageptr = rp->b_vec[chunk_idx].pg; in mon_bin_vma_fault()
1271 static int mon_bin_wait_event(struct file *file, struct mon_reader_bin *rp) in mon_bin_wait_event() argument
1276 add_wait_queue(&rp->b_wait, &waita); in mon_bin_wait_event()
1279 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_wait_event()
1280 while (MON_RING_EMPTY(rp)) { in mon_bin_wait_event()
1281 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_wait_event()
1285 remove_wait_queue(&rp->b_wait, &waita); in mon_bin_wait_event()
1290 remove_wait_queue(&rp->b_wait, &waita); in mon_bin_wait_event()
1295 spin_lock_irqsave(&rp->b_lock, flags); in mon_bin_wait_event()
1297 spin_unlock_irqrestore(&rp->b_lock, flags); in mon_bin_wait_event()
1300 remove_wait_queue(&rp->b_wait, &waita); in mon_bin_wait_event()