Lines Matching refs:epq

136 	struct isp1362_ep_queue *epq = NULL;  in get_ptd_queue()  local
139 epq = &isp1362_hcd->istl_queue[0]; in get_ptd_queue()
141 epq = &isp1362_hcd->istl_queue[1]; in get_ptd_queue()
143 epq = &isp1362_hcd->intl_queue; in get_ptd_queue()
146 epq = &isp1362_hcd->atl_queue; in get_ptd_queue()
148 if (epq) in get_ptd_queue()
149 DBG(1, "%s: PTD $%04x is on %s queue\n", __func__, offset, epq->name); in get_ptd_queue()
153 return epq; in get_ptd_queue()
156 static inline int get_ptd_offset(struct isp1362_ep_queue *epq, u8 index) in get_ptd_offset() argument
160 if (index * epq->blk_size > epq->buf_size) { in get_ptd_offset()
162 __func__, epq->name, index, in get_ptd_offset()
163 epq->buf_size / epq->blk_size); in get_ptd_offset()
166 offset = epq->buf_start + index * epq->blk_size; in get_ptd_offset()
167 DBG(3, "%s: %s PTD[%02x] # %04x\n", __func__, epq->name, index, offset); in get_ptd_offset()
174 static inline u16 max_transfer_size(struct isp1362_ep_queue *epq, size_t size, in max_transfer_size() argument
179 xfer_size = min_t(size_t, xfer_size, epq->buf_avail * epq->blk_size - PTD_HEADER_SIZE); in max_transfer_size()
186 static int claim_ptd_buffers(struct isp1362_ep_queue *epq, in claim_ptd_buffers() argument
190 int num_ptds = ((len + PTD_HEADER_SIZE - 1) / epq->blk_size) + 1; in claim_ptd_buffers()
193 BUG_ON(len > epq->buf_size); in claim_ptd_buffers()
195 if (!epq->buf_avail) in claim_ptd_buffers()
200 epq->name, len, epq->blk_size, num_ptds, epq->buf_map, epq->skip_map); in claim_ptd_buffers()
203 found = bitmap_find_next_zero_area(&epq->buf_map, epq->buf_count, 0, in claim_ptd_buffers()
205 if (found >= epq->buf_count) in claim_ptd_buffers()
209 num_ptds, found, len, (int)(epq->blk_size - PTD_HEADER_SIZE)); in claim_ptd_buffers()
210 ptd_offset = get_ptd_offset(epq, found); in claim_ptd_buffers()
214 epq->buf_avail -= num_ptds; in claim_ptd_buffers()
215 BUG_ON(epq->buf_avail > epq->buf_count); in claim_ptd_buffers()
217 bitmap_set(&epq->buf_map, found, num_ptds); in claim_ptd_buffers()
219 __func__, epq->name, ep->ptd_index, ep->ptd_offset, in claim_ptd_buffers()
220 epq->buf_avail, epq->buf_count, num_ptds, epq->buf_map, epq->skip_map); in claim_ptd_buffers()
225 static inline void release_ptd_buffers(struct isp1362_ep_queue *epq, struct isp1362_ep *ep) in release_ptd_buffers() argument
229 if (last > epq->buf_count) in release_ptd_buffers()
231 __func__, ep, ep->num_req, ep->length, epq->name, ep->ptd_index, in release_ptd_buffers()
232 ep->ptd_offset, ep->num_ptds, epq->buf_count, epq->buf_avail, in release_ptd_buffers()
233 epq->buf_map, epq->skip_map); in release_ptd_buffers()
234 BUG_ON(last > epq->buf_count); in release_ptd_buffers()
236 bitmap_clear(&epq->buf_map, ep->ptd_index, ep->num_ptds); in release_ptd_buffers()
237 bitmap_set(&epq->skip_map, ep->ptd_index, ep->num_ptds); in release_ptd_buffers()
238 epq->buf_avail += ep->num_ptds; in release_ptd_buffers()
239 epq->ptd_count--; in release_ptd_buffers()
241 BUG_ON(epq->buf_avail > epq->buf_count); in release_ptd_buffers()
242 BUG_ON(epq->ptd_count > epq->buf_count); in release_ptd_buffers()
245 __func__, epq->name, in release_ptd_buffers()
246 ep->ptd_offset, ep->num_ptds, epq->buf_avail, epq->buf_count); in release_ptd_buffers()
248 epq->buf_map, epq->skip_map); in release_ptd_buffers()
261 struct isp1362_ep *ep, struct isp1362_ep_queue *epq, in prepare_ptd() argument
270 DBG(3, "%s: %s ep %p\n", __func__, epq->name, ep); in prepare_ptd()
286 len = max_transfer_size(epq, buf_len, ep->maxpacket); in prepare_ptd()
298 len = max_transfer_size(epq, buf_len, ep->maxpacket); in prepare_ptd()
346 struct isp1362_ep_queue *epq) in isp1362_write_ptd() argument
362 struct isp1362_ep_queue *epq) in isp1362_read_ptd() argument
371 DBG(1, "%s: ep %p removed from active list %p\n", __func__, ep, &epq->active); in isp1362_read_ptd()
402 struct isp1362_ep_queue *epq; in remove_ptd() local
407 epq = get_ptd_queue(isp1362_hcd, ep->ptd_offset); in remove_ptd()
408 BUG_ON(!epq); in remove_ptd()
422 index, ep->ptd_offset, epq->skip_map, 1 << index); in remove_ptd()
425 epq->skip_map |= 1 << index; in remove_ptd()
426 if (epq == &isp1362_hcd->atl_queue) { in remove_ptd()
428 isp1362_read_reg32(isp1362_hcd, HCATLSKIP), epq->skip_map); in remove_ptd()
429 isp1362_write_reg32(isp1362_hcd, HCATLSKIP, epq->skip_map); in remove_ptd()
430 if (~epq->skip_map == 0) in remove_ptd()
432 } else if (epq == &isp1362_hcd->intl_queue) { in remove_ptd()
434 isp1362_read_reg32(isp1362_hcd, HCINTLSKIP), epq->skip_map); in remove_ptd()
435 isp1362_write_reg32(isp1362_hcd, HCINTLSKIP, epq->skip_map); in remove_ptd()
436 if (~epq->skip_map == 0) in remove_ptd()
659 struct isp1362_ep_queue *epq = in finish_unlinks() local
663 BUG_ON(epq == NULL); in finish_unlinks()
667 release_ptd_buffers(epq, ep); in finish_unlinks()
714 struct isp1362_ep *ep, struct isp1362_ep_queue *epq) in submit_req() argument
718 prepare_ptd(isp1362_hcd, urb, ep, epq, 0); in submit_req()
719 index = claim_ptd_buffers(epq, ep, ep->length); in submit_req()
722 ep->num_req, epq->name, ep->num_ptds, epq->buf_map, epq->skip_map); in submit_req()
726 __func__, ep->num_req, ep->length, epq->name, ep->num_ptds, in submit_req()
727 epq->buf_map, epq->skip_map); in submit_req()
731 list_add_tail(&ep->active, &epq->active); in submit_req()
733 ep, ep->num_req, ep->length, &epq->active); in submit_req()
734 DBG(1, "%s: Submitting %s PTD $%04x for ep %p req %d\n", __func__, epq->name, in submit_req()
736 isp1362_write_ptd(isp1362_hcd, ep, epq); in submit_req()
737 __clear_bit(ep->ptd_index, &epq->skip_map); in submit_req()
745 struct isp1362_ep_queue *epq = &isp1362_hcd->atl_queue; in start_atl_transfers() local
749 if (atomic_read(&epq->finishing)) { in start_atl_transfers()
750 DBG(1, "%s: finish_transfers is active for %s\n", __func__, epq->name); in start_atl_transfers()
759 DBG(2, "%s: Skipping active %s ep %p\n", __func__, epq->name, ep); in start_atl_transfers()
763 DBG(1, "%s: Processing %s ep %p req %d\n", __func__, epq->name, in start_atl_transfers()
766 ret = submit_req(isp1362_hcd, urb, ep, epq); in start_atl_transfers()
788 epq->ptd_count += ptd_count; in start_atl_transfers()
789 if (epq->ptd_count > epq->stat_maxptds) { in start_atl_transfers()
790 epq->stat_maxptds = epq->ptd_count; in start_atl_transfers()
791 DBG(0, "%s: max_ptds: %d\n", __func__, epq->stat_maxptds); in start_atl_transfers()
798 struct isp1362_ep_queue *epq = &isp1362_hcd->intl_queue; in start_intl_transfers() local
801 if (atomic_read(&epq->finishing)) { in start_intl_transfers()
802 DBG(1, "%s: finish_transfers is active for %s\n", __func__, epq->name); in start_intl_transfers()
812 epq->name, ep); in start_intl_transfers()
817 epq->name, ep, ep->num_req); in start_intl_transfers()
818 ret = submit_req(isp1362_hcd, urb, ep, epq); in start_intl_transfers()
836 epq->ptd_count += ptd_count; in start_intl_transfers()
837 if (epq->ptd_count > epq->stat_maxptds) in start_intl_transfers()
838 epq->stat_maxptds = epq->ptd_count; in start_intl_transfers()
841 static inline int next_ptd(struct isp1362_ep_queue *epq, struct isp1362_ep *ep) in next_ptd() argument
844 int num_ptds = (ep->length + PTD_HEADER_SIZE + (epq->blk_size - 1)) / epq->blk_size; in next_ptd()
847 ep->length, num_ptds, epq->blk_size, ptd_offset + num_ptds * epq->blk_size); in next_ptd()
849 ptd_offset += num_ptds * epq->blk_size; in next_ptd()
850 if (ptd_offset < epq->buf_start + epq->buf_size) in next_ptd()
860 struct isp1362_ep_queue *epq; in start_iso_transfers() local
867 epq = &isp1362_hcd->istl_queue[flip]; in start_iso_transfers()
868 if (atomic_read(&epq->finishing)) { in start_iso_transfers()
869 DBG(1, "%s: finish_transfers is active for %s\n", __func__, epq->name); in start_iso_transfers()
873 if (!list_empty(&epq->active)) in start_iso_transfers()
876 ptd_offset = epq->buf_start; in start_iso_transfers()
881 DBG(1, "%s: Processing %s ep %p\n", __func__, epq->name, ep); in start_iso_transfers()
895 prepare_ptd(isp1362_hcd, urb, ep, epq, fno); in start_iso_transfers()
897 epq->buf_start + epq->buf_size) { in start_iso_transfers()
903 list_add_tail(&ep->active, &epq->active); in start_iso_transfers()
905 ptd_offset = next_ptd(epq, ep); in start_iso_transfers()
908 __func__, ep->num_req, epq->name); in start_iso_transfers()
913 list_for_each_entry(ep, &epq->active, active) { in start_iso_transfers()
914 if (epq->active.next == &ep->active) in start_iso_transfers()
916 isp1362_write_ptd(isp1362_hcd, ep, epq); in start_iso_transfers()
923 epq->ptd_count += ptd_count; in start_iso_transfers()
924 if (epq->ptd_count > epq->stat_maxptds) in start_iso_transfers()
925 epq->stat_maxptds = epq->ptd_count; in start_iso_transfers()
938 struct isp1362_ep_queue *epq) in finish_transfers() argument
943 if (list_empty(&epq->active)) { in finish_transfers()
944 DBG(1, "%s: Nothing to do for %s queue\n", __func__, epq->name); in finish_transfers()
948 DBG(1, "%s: Finishing %s transfers %08lx\n", __func__, epq->name, done_map); in finish_transfers()
950 atomic_inc(&epq->finishing); in finish_transfers()
951 list_for_each_entry_safe(ep, tmp, &epq->active, active) { in finish_transfers()
954 DBG(1, "%s: Checking %s PTD[%02x] $%04x\n", __func__, epq->name, in finish_transfers()
959 isp1362_read_ptd(isp1362_hcd, ep, epq); in finish_transfers()
960 epq->free_ptd = index; in finish_transfers()
962 release_ptd_buffers(epq, ep); in finish_transfers()
970 DBG(1, "%s: Postprocessing %s ep %p req %d\n", __func__, epq->name, in finish_transfers()
979 __func__, done_map, epq->skip_map); in finish_transfers()
980 atomic_dec(&epq->finishing); in finish_transfers()
983 static void finish_iso_transfers(struct isp1362_hcd *isp1362_hcd, struct isp1362_ep_queue *epq) in finish_iso_transfers() argument
988 if (list_empty(&epq->active)) { in finish_iso_transfers()
989 DBG(1, "%s: Nothing to do for %s queue\n", __func__, epq->name); in finish_iso_transfers()
993 DBG(1, "%s: Finishing %s transfers\n", __func__, epq->name); in finish_iso_transfers()
995 atomic_inc(&epq->finishing); in finish_iso_transfers()
996 list_for_each_entry_safe(ep, tmp, &epq->active, active) { in finish_iso_transfers()
999 isp1362_read_ptd(isp1362_hcd, ep, epq); in finish_iso_transfers()
1000 DBG(1, "%s: Postprocessing %s ep %p\n", __func__, epq->name, ep); in finish_iso_transfers()
1003 WARN_ON(epq->blk_size != 0); in finish_iso_transfers()
1004 atomic_dec(&epq->finishing); in finish_iso_transfers()