Lines Matching refs:seg
134 static inline void wa_seg_init(struct wa_seg *seg) in wa_seg_init() argument
136 usb_init_urb(&seg->tr_urb); in wa_seg_init()
139 memset(((void *)seg) + sizeof(seg->tr_urb), 0, in wa_seg_init()
140 sizeof(*seg) - sizeof(seg->tr_urb)); in wa_seg_init()
156 struct wa_seg **seg; /* transfer segments */ member
169 struct wa_seg *seg, int curr_iso_frame);
189 if (xfer->seg) { in wa_xfer_destroy()
192 struct wa_seg *seg = xfer->seg[cnt]; in wa_xfer_destroy() local
193 if (seg) { in wa_xfer_destroy()
194 usb_free_urb(seg->isoc_pack_desc_urb); in wa_xfer_destroy()
195 if (seg->dto_urb) { in wa_xfer_destroy()
196 kfree(seg->dto_urb->sg); in wa_xfer_destroy()
197 usb_free_urb(seg->dto_urb); in wa_xfer_destroy()
199 usb_free_urb(&seg->tr_urb); in wa_xfer_destroy()
202 kfree(xfer->seg); in wa_xfer_destroy()
341 struct wa_seg *seg; in __wa_xfer_is_done() local
350 seg = xfer->seg[cnt]; in __wa_xfer_is_done()
351 switch (seg->status) { in __wa_xfer_is_done()
353 if (found_short && seg->result > 0) { in __wa_xfer_is_done()
356 seg->result); in __wa_xfer_is_done()
360 urb->actual_length += seg->result; in __wa_xfer_is_done()
362 && seg->result < xfer->seg_size in __wa_xfer_is_done()
367 xfer, wa_xfer_id(xfer), seg->index, found_short, in __wa_xfer_is_done()
368 seg->result, urb->actual_length); in __wa_xfer_is_done()
371 xfer->result = seg->result; in __wa_xfer_is_done()
373 xfer, wa_xfer_id(xfer), seg->index, seg->result, in __wa_xfer_is_done()
374 seg->result); in __wa_xfer_is_done()
377 xfer->result = seg->result; in __wa_xfer_is_done()
379 xfer, wa_xfer_id(xfer), seg->index, seg->result, in __wa_xfer_is_done()
380 seg->result); in __wa_xfer_is_done()
384 xfer, wa_xfer_id(xfer), cnt, seg->status); in __wa_xfer_is_done()
403 struct wa_seg *seg, enum wa_seg_status status) in __wa_xfer_mark_seg_as_done() argument
405 seg->status = status; in __wa_xfer_mark_seg_as_done()
470 struct wa_seg *seg = xfer->seg[seg_index]; in __wa_xfer_abort_cb() local
472 if ((seg->status == WA_SEG_DONE) || in __wa_xfer_abort_cb()
473 (seg->status == WA_SEG_ERROR)) { in __wa_xfer_abort_cb()
672 struct wa_seg *seg) { in __wa_setup_isoc_packet_descr() argument
681 seg->isoc_frame_count)); in __wa_setup_isoc_packet_descr()
682 for (frame_index = 0; frame_index < seg->isoc_frame_count; in __wa_setup_isoc_packet_descr()
684 int offset_index = frame_index + seg->isoc_frame_offset; in __wa_setup_isoc_packet_descr()
698 struct wa_seg *seg = xfer->seg[0]; in __wa_xfer_setup_hdr0() local
700 xfer_hdr0 = &seg->xfer_hdr; in __wa_xfer_setup_hdr0()
724 xfer_iso->dwNumOfPackets = cpu_to_le32(seg->isoc_frame_count); in __wa_xfer_setup_hdr0()
726 __wa_setup_isoc_packet_descr(packet_desc, xfer, seg); in __wa_xfer_setup_hdr0()
748 struct wa_seg *seg = urb->context; in wa_seg_dto_cb() local
749 struct wa_xfer *xfer = seg->xfer; in wa_seg_dto_cb()
769 seg->isoc_frame_index += seg->isoc_frame_count; in wa_seg_dto_cb()
771 seg->isoc_frame_index += 1; in wa_seg_dto_cb()
772 if (seg->isoc_frame_index < seg->isoc_frame_count) { in wa_seg_dto_cb()
779 if ((seg->isoc_frame_index + 1) >= in wa_seg_dto_cb()
780 seg->isoc_frame_count) in wa_seg_dto_cb()
784 wa_xfer_id(xfer), seg->index, seg->isoc_frame_index, in wa_seg_dto_cb()
792 seg->result += urb->actual_length; in wa_seg_dto_cb()
795 wa_xfer_id(xfer), seg->index, seg->result); in wa_seg_dto_cb()
796 if (seg->status < WA_SEG_PENDING) in wa_seg_dto_cb()
797 seg->status = WA_SEG_PENDING; in wa_seg_dto_cb()
804 __wa_populate_dto_urb_isoc(xfer, seg, in wa_seg_dto_cb()
805 seg->isoc_frame_offset + seg->isoc_frame_index); in wa_seg_dto_cb()
810 result = usb_submit_urb(seg->dto_urb, GFP_ATOMIC); in wa_seg_dto_cb()
813 wa_xfer_id(xfer), seg->index, result); in wa_seg_dto_cb()
833 wa_xfer_id(xfer), seg->index, urb->status); in wa_seg_dto_cb()
852 if (seg->status != WA_SEG_ERROR) { in wa_seg_dto_cb()
853 seg->result = urb->status; in wa_seg_dto_cb()
856 done = __wa_xfer_mark_seg_as_done(xfer, seg, WA_SEG_ERROR); in wa_seg_dto_cb()
885 struct wa_seg *seg = urb->context; in wa_seg_iso_pack_desc_cb() local
886 struct wa_xfer *xfer = seg->xfer; in wa_seg_iso_pack_desc_cb()
900 wa_xfer_id(xfer), seg->index); in wa_seg_iso_pack_desc_cb()
901 if (xfer->is_inbound && seg->status < WA_SEG_PENDING) in wa_seg_iso_pack_desc_cb()
902 seg->status = WA_SEG_PENDING; in wa_seg_iso_pack_desc_cb()
914 wa_xfer_id(xfer), seg->index, urb->status); in wa_seg_iso_pack_desc_cb()
920 if (seg->status != WA_SEG_ERROR) { in wa_seg_iso_pack_desc_cb()
921 usb_unlink_urb(seg->dto_urb); in wa_seg_iso_pack_desc_cb()
922 seg->result = urb->status; in wa_seg_iso_pack_desc_cb()
925 done = __wa_xfer_mark_seg_as_done(xfer, seg, in wa_seg_iso_pack_desc_cb()
958 struct wa_seg *seg = urb->context; in wa_seg_tr_cb() local
959 struct wa_xfer *xfer = seg->xfer; in wa_seg_tr_cb()
973 xfer, wa_xfer_id(xfer), seg->index); in wa_seg_tr_cb()
975 seg->status < WA_SEG_PENDING && in wa_seg_tr_cb()
977 seg->status = WA_SEG_PENDING; in wa_seg_tr_cb()
990 xfer, wa_xfer_id(xfer), seg->index, in wa_seg_tr_cb()
998 usb_unlink_urb(seg->isoc_pack_desc_urb); in wa_seg_tr_cb()
999 usb_unlink_urb(seg->dto_urb); in wa_seg_tr_cb()
1000 seg->result = urb->status; in wa_seg_tr_cb()
1003 done = __wa_xfer_mark_seg_as_done(xfer, seg, WA_SEG_ERROR); in wa_seg_tr_cb()
1100 struct wa_seg *seg, int curr_iso_frame) in __wa_populate_dto_urb_isoc() argument
1102 seg->dto_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; in __wa_populate_dto_urb_isoc()
1103 seg->dto_urb->sg = NULL; in __wa_populate_dto_urb_isoc()
1104 seg->dto_urb->num_sgs = 0; in __wa_populate_dto_urb_isoc()
1106 seg->dto_urb->transfer_dma = xfer->urb->transfer_dma + in __wa_populate_dto_urb_isoc()
1110 seg->dto_urb->transfer_buffer_length = seg->isoc_size; in __wa_populate_dto_urb_isoc()
1112 seg->dto_urb->transfer_buffer_length = in __wa_populate_dto_urb_isoc()
1120 struct wa_seg *seg, size_t buf_itr_offset, size_t buf_itr_size) in __wa_populate_dto_urb() argument
1125 seg->dto_urb->transfer_dma = in __wa_populate_dto_urb()
1127 seg->dto_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; in __wa_populate_dto_urb()
1128 seg->dto_urb->sg = NULL; in __wa_populate_dto_urb()
1129 seg->dto_urb->num_sgs = 0; in __wa_populate_dto_urb()
1132 seg->dto_urb->transfer_flags &= in __wa_populate_dto_urb()
1135 seg->dto_urb->num_mapped_sgs = 0; in __wa_populate_dto_urb()
1138 seg->dto_urb->transfer_buffer = in __wa_populate_dto_urb()
1141 seg->dto_urb->sg = NULL; in __wa_populate_dto_urb()
1142 seg->dto_urb->num_sgs = 0; in __wa_populate_dto_urb()
1144 seg->dto_urb->transfer_buffer = NULL; in __wa_populate_dto_urb()
1152 seg->dto_urb->sg = wa_xfer_create_subset_sg( in __wa_populate_dto_urb()
1155 &(seg->dto_urb->num_sgs)); in __wa_populate_dto_urb()
1156 if (!(seg->dto_urb->sg)) in __wa_populate_dto_urb()
1160 seg->dto_urb->transfer_buffer_length = buf_itr_size; in __wa_populate_dto_urb()
1176 size_t alloc_size = sizeof(*xfer->seg[0]) in __wa_xfer_setup_segs()
1177 - sizeof(xfer->seg[0]->xfer_hdr) + xfer_hdr_size; in __wa_xfer_setup_segs()
1180 struct wa_seg *seg; in __wa_xfer_setup_segs() local
1184 xfer->seg = kcalloc(xfer->segs, sizeof(xfer->seg[0]), GFP_ATOMIC); in __wa_xfer_setup_segs()
1185 if (xfer->seg == NULL) in __wa_xfer_setup_segs()
1206 seg = xfer->seg[cnt] = kmalloc(alloc_size + iso_pkt_descr_size, in __wa_xfer_setup_segs()
1208 if (seg == NULL) in __wa_xfer_setup_segs()
1210 wa_seg_init(seg); in __wa_xfer_setup_segs()
1211 seg->xfer = xfer; in __wa_xfer_setup_segs()
1212 seg->index = cnt; in __wa_xfer_setup_segs()
1213 usb_fill_bulk_urb(&seg->tr_urb, usb_dev, in __wa_xfer_setup_segs()
1216 &seg->xfer_hdr, xfer_hdr_size, in __wa_xfer_setup_segs()
1217 wa_seg_tr_cb, seg); in __wa_xfer_setup_segs()
1221 seg->isoc_frame_count = seg_isoc_frame_count; in __wa_xfer_setup_segs()
1222 seg->isoc_frame_offset = isoc_frame_offset; in __wa_xfer_setup_segs()
1223 seg->isoc_size = seg_isoc_size; in __wa_xfer_setup_segs()
1225 seg->isoc_pack_desc_urb = in __wa_xfer_setup_segs()
1227 if (seg->isoc_pack_desc_urb == NULL) in __wa_xfer_setup_segs()
1235 seg->isoc_pack_desc_urb, usb_dev, in __wa_xfer_setup_segs()
1238 (void *)(&seg->xfer_hdr) + in __wa_xfer_setup_segs()
1241 wa_seg_iso_pack_desc_cb, seg); in __wa_xfer_setup_segs()
1249 seg->dto_urb = usb_alloc_urb(0, GFP_ATOMIC); in __wa_xfer_setup_segs()
1250 if (seg->dto_urb == NULL) in __wa_xfer_setup_segs()
1253 seg->dto_urb, usb_dev, in __wa_xfer_setup_segs()
1256 NULL, 0, wa_seg_dto_cb, seg); in __wa_xfer_setup_segs()
1265 __wa_populate_dto_urb_isoc(xfer, seg, in __wa_xfer_setup_segs()
1266 seg->isoc_frame_offset); in __wa_xfer_setup_segs()
1269 result = __wa_populate_dto_urb(xfer, seg, in __wa_xfer_setup_segs()
1278 seg->status = WA_SEG_READY; in __wa_xfer_setup_segs()
1288 usb_free_urb(xfer->seg[cnt]->dto_urb); in __wa_xfer_setup_segs()
1290 usb_free_urb(xfer->seg[cnt]->isoc_pack_desc_urb); in __wa_xfer_setup_segs()
1292 kfree(xfer->seg[cnt]); in __wa_xfer_setup_segs()
1293 xfer->seg[cnt] = NULL; in __wa_xfer_setup_segs()
1328 xfer_hdr0 = &xfer->seg[0]->xfer_hdr; in __wa_xfer_setup()
1336 cpu_to_le32(xfer->seg[0]->isoc_size); in __wa_xfer_setup()
1339 struct wa_seg *seg = xfer->seg[cnt]; in __wa_xfer_setup() local
1342 xfer_hdr = &seg->xfer_hdr; in __wa_xfer_setup()
1353 cpu_to_le32(seg->isoc_size); in __wa_xfer_setup()
1355 cpu_to_le32(seg->isoc_frame_count); in __wa_xfer_setup()
1356 __wa_setup_isoc_packet_descr(packet_desc, xfer, seg); in __wa_xfer_setup()
1357 seg->status = WA_SEG_READY; in __wa_xfer_setup()
1366 xfer_hdr = &xfer->seg[cnt]->xfer_hdr; in __wa_xfer_setup()
1373 xfer->seg[cnt]->status = WA_SEG_READY; in __wa_xfer_setup()
1390 struct wa_seg *seg, int *dto_done) in __wa_seg_submit() argument
1403 seg->status = WA_SEG_SUBMITTED; in __wa_seg_submit()
1404 result = usb_submit_urb(&seg->tr_urb, GFP_ATOMIC); in __wa_seg_submit()
1407 __func__, xfer, seg->index, result); in __wa_seg_submit()
1412 if (seg->isoc_pack_desc_urb) { in __wa_seg_submit()
1414 result = usb_submit_urb(seg->isoc_pack_desc_urb, GFP_ATOMIC); in __wa_seg_submit()
1415 seg->isoc_frame_index = 0; in __wa_seg_submit()
1418 __func__, xfer, seg->index, result); in __wa_seg_submit()
1424 if (seg->dto_urb) { in __wa_seg_submit()
1427 result = usb_submit_urb(seg->dto_urb, GFP_ATOMIC); in __wa_seg_submit()
1430 __func__, xfer, seg->index, result); in __wa_seg_submit()
1440 && (seg->isoc_frame_count > 1)) in __wa_seg_submit()
1447 usb_unlink_urb(seg->isoc_pack_desc_urb); in __wa_seg_submit()
1449 usb_unlink_urb(&seg->tr_urb); in __wa_seg_submit()
1451 seg->status = WA_SEG_ERROR; in __wa_seg_submit()
1452 seg->result = result; in __wa_seg_submit()
1468 struct wa_seg *seg; in __wa_xfer_delayed_run() local
1478 seg = list_first_entry(&(rpipe->seg_list), struct wa_seg, in __wa_xfer_delayed_run()
1480 list_del(&seg->list_node); in __wa_xfer_delayed_run()
1481 xfer = seg->xfer; in __wa_xfer_delayed_run()
1488 result = __wa_seg_submit(rpipe, xfer, seg, &dto_done); in __wa_xfer_delayed_run()
1493 xfer, wa_xfer_id(xfer), seg->index, in __wa_xfer_delayed_run()
1560 struct wa_seg *seg; in __wa_xfer_submit() local
1579 seg = xfer->seg[cnt]; in __wa_xfer_submit()
1588 result = __wa_seg_submit(rpipe, xfer, seg, in __wa_xfer_submit()
1606 seg->status = WA_SEG_DELAYED; in __wa_xfer_submit()
1607 list_add_tail(&seg->list_node, &rpipe->seg_list); in __wa_xfer_submit()
1936 struct wa_seg *seg; in wa_urb_dequeue() local
1981 if (!list_empty(&xfer->list_node) && xfer->seg == NULL) in wa_urb_dequeue()
1984 if (xfer->seg == NULL) /* still hasn't reached */ in wa_urb_dequeue()
1994 seg = xfer->seg[cnt]; in wa_urb_dequeue()
1996 __func__, wa_xfer_id(xfer), cnt, seg->status); in wa_urb_dequeue()
1997 switch (seg->status) { in wa_urb_dequeue()
2001 xfer, cnt, seg->status); in wa_urb_dequeue()
2011 seg->status = WA_SEG_ABORTED; in wa_urb_dequeue()
2012 seg->result = -ENOENT; in wa_urb_dequeue()
2013 list_del(&seg->list_node); in wa_urb_dequeue()
2045 seg->status = WA_SEG_ABORTED; in wa_urb_dequeue()
2145 struct wa_seg *current_seg = xfer->seg[index]; in wa_complete_remaining_xfer_segs()
2175 struct urb *buf_in_urb, struct wa_xfer *xfer, struct wa_seg *seg) in __wa_populate_buf_in_urb_isoc() argument
2177 int urb_start_frame = seg->isoc_frame_index + seg->isoc_frame_offset; in __wa_populate_buf_in_urb_isoc()
2193 seg_index = seg->isoc_frame_index; in __wa_populate_buf_in_urb_isoc()
2202 if (seg_index < seg->isoc_frame_count) { in __wa_populate_buf_in_urb_isoc()
2223 buf_in_urb->context = seg; in __wa_populate_buf_in_urb_isoc()
2226 return seg_index - seg->isoc_frame_index; in __wa_populate_buf_in_urb_isoc()
2234 struct wa_seg *seg = xfer->seg[seg_idx]; in wa_populate_buf_in_urb() local
2276 buf_in_urb->context = seg; in wa_populate_buf_in_urb()
2295 struct wa_seg *seg; in wa_xfer_result_chew() local
2307 seg = xfer->seg[seg_idx]; in wa_xfer_result_chew()
2311 xfer, wa_xfer_id(xfer), seg_idx, usb_status, seg->status); in wa_xfer_result_chew()
2312 if (seg->status == WA_SEG_ABORTED in wa_xfer_result_chew()
2313 || seg->status == WA_SEG_ERROR) /* already handled */ in wa_xfer_result_chew()
2315 if (seg->status == WA_SEG_SUBMITTED) /* ops, got here */ in wa_xfer_result_chew()
2316 seg->status = WA_SEG_PENDING; /* before wa_seg{_dto}_cb() */ in wa_xfer_result_chew()
2317 if (seg->status != WA_SEG_PENDING) { in wa_xfer_result_chew()
2320 xfer, seg_idx, seg->status); in wa_xfer_result_chew()
2321 seg->status = WA_SEG_PENDING; /* workaround/"fix" it */ in wa_xfer_result_chew()
2324 seg->result = wa_xfer_status_to_errno(usb_status); in wa_xfer_result_chew()
2326 xfer, xfer->id, seg->index, usb_status); in wa_xfer_result_chew()
2327 seg->status = ((usb_status & 0x7F) == WA_XFER_STATUS_ABORTED) ? in wa_xfer_result_chew()
2340 wa_complete_remaining_xfer_segs(xfer, seg->index + 1, in wa_xfer_result_chew()
2351 seg->status = WA_SEG_DTI_PENDING; in wa_xfer_result_chew()
2364 seg->result = bytes_transferred; in wa_xfer_result_chew()
2366 done = __wa_xfer_mark_seg_as_done(xfer, seg, WA_SEG_DONE); in wa_xfer_result_chew()
2384 seg->result = result; in wa_xfer_result_chew()
2389 seg->status = WA_SEG_ERROR; in wa_xfer_result_chew()
2393 wa_complete_remaining_xfer_segs(xfer, seg->index + 1, seg->status); in wa_xfer_result_chew()
2449 struct wa_seg *seg; in wa_process_iso_packet_status() local
2473 seg = xfer->seg[wa->dti_isoc_xfer_seg]; in wa_process_iso_packet_status()
2477 seg->isoc_frame_count); in wa_process_iso_packet_status()
2492 for (seg_index = 0; seg_index < seg->isoc_frame_count; ++seg_index) { in wa_process_iso_packet_status()
2496 seg->isoc_frame_offset + seg_index; in wa_process_iso_packet_status()
2517 seg->status = WA_SEG_DTI_PENDING; in wa_process_iso_packet_status()
2520 seg->isoc_frame_index = first_frame_index; in wa_process_iso_packet_status()
2528 buf_in_urb, xfer, seg); in wa_process_iso_packet_status()
2530 seg->isoc_frame_index += urb_frame_count; in wa_process_iso_packet_status()
2538 seg->isoc_frame_offset + seg->isoc_frame_index; in wa_process_iso_packet_status()
2541 while ((seg->isoc_frame_index < in wa_process_iso_packet_status()
2542 seg->isoc_frame_count) && in wa_process_iso_packet_status()
2544 ++(seg->isoc_frame_index); in wa_process_iso_packet_status()
2550 && (seg->isoc_frame_index < in wa_process_iso_packet_status()
2551 seg->isoc_frame_count)); in wa_process_iso_packet_status()
2564 done = __wa_xfer_mark_seg_as_done(xfer, seg, WA_SEG_DONE); in wa_process_iso_packet_status()
2597 struct wa_seg *seg = urb->context; in wa_buf_in_cb() local
2598 struct wa_xfer *xfer = seg->xfer; in wa_buf_in_cb()
2627 seg_index = seg->isoc_frame_index; in wa_buf_in_cb()
2628 while (seg_index < seg->isoc_frame_count) { in wa_buf_in_cb()
2630 seg->isoc_frame_offset + seg_index; in wa_buf_in_cb()
2635 seg->isoc_frame_index = seg_index; in wa_buf_in_cb()
2647 seg->result += urb->actual_length; in wa_buf_in_cb()
2653 xfer, seg); in wa_buf_in_cb()
2655 seg->isoc_frame_index += urb_frame_count; in wa_buf_in_cb()
2676 xfer, wa_xfer_id(xfer), seg->index, in wa_buf_in_cb()
2677 seg->result); in wa_buf_in_cb()
2679 done = __wa_xfer_mark_seg_as_done(xfer, seg, in wa_buf_in_cb()
2701 xfer, wa_xfer_id(xfer), seg->index, in wa_buf_in_cb()
2709 seg->result = urb->status; in wa_buf_in_cb()
2712 done = __wa_xfer_mark_seg_as_done(xfer, seg, in wa_buf_in_cb()