Lines Matching refs:wa

153 	struct wahc *wa;		/* Wire adapter we are plugged to */  member
221 static inline int __wa_dto_try_get(struct wahc *wa) in __wa_dto_try_get() argument
223 return (test_and_set_bit(0, &wa->dto_in_use) == 0); in __wa_dto_try_get()
227 static inline void __wa_dto_put(struct wahc *wa) in __wa_dto_put() argument
229 clear_bit_unlock(0, &wa->dto_in_use); in __wa_dto_put()
233 static void wa_check_for_delayed_rpipes(struct wahc *wa) in wa_check_for_delayed_rpipes() argument
239 spin_lock_irqsave(&wa->rpipe_lock, flags); in wa_check_for_delayed_rpipes()
240 while (!list_empty(&wa->rpipe_delayed_list) && !dto_waiting) { in wa_check_for_delayed_rpipes()
241 rpipe = list_first_entry(&wa->rpipe_delayed_list, in wa_check_for_delayed_rpipes()
252 spin_unlock_irqrestore(&wa->rpipe_lock, flags); in wa_check_for_delayed_rpipes()
256 static void wa_add_delayed_rpipe(struct wahc *wa, struct wa_rpipe *rpipe) in wa_add_delayed_rpipe() argument
260 spin_lock_irqsave(&wa->rpipe_lock, flags); in wa_add_delayed_rpipe()
265 list_add_tail(&rpipe->list_node, &wa->rpipe_delayed_list); in wa_add_delayed_rpipe()
267 spin_unlock_irqrestore(&wa->rpipe_lock, flags); in wa_add_delayed_rpipe()
284 spin_lock_irqsave(&xfer->wa->xfer_list_lock, flags); in wa_xfer_giveback()
286 usb_hcd_unlink_urb_from_ep(&(xfer->wa->wusb->usb_hcd), xfer->urb); in wa_xfer_giveback()
287 spin_unlock_irqrestore(&xfer->wa->xfer_list_lock, flags); in wa_xfer_giveback()
289 wusbhc_giveback_urb(xfer->wa->wusb, xfer->urb, xfer->result); in wa_xfer_giveback()
290 wa_put(xfer->wa); in wa_xfer_giveback()
317 xfer->id = atomic_add_return(1, &xfer->wa->xfer_id_count); in wa_xfer_id_init()
339 struct device *dev = &xfer->wa->usb_iface->dev; in __wa_xfer_is_done()
420 static struct wa_xfer *wa_xfer_get_by_id(struct wahc *wa, u32 id) in wa_xfer_get_by_id() argument
424 spin_lock_irqsave(&wa->xfer_list_lock, flags); in wa_xfer_get_by_id()
425 list_for_each_entry(xfer_itr, &wa->xfer_list, list_node) { in wa_xfer_get_by_id()
433 spin_unlock_irqrestore(&wa->xfer_list_lock, flags); in wa_xfer_get_by_id()
439 struct wahc *wa; member
446 struct wahc *wa = b->wa; in __wa_xfer_abort_cb() local
455 struct device *dev = &wa->usb_iface->dev; in __wa_xfer_abort_cb()
457 xfer = wa_xfer_get_by_id(wa, le32_to_cpu(b->cmd.dwTransferID)); in __wa_xfer_abort_cb()
494 wa_put(wa); /* taken in __wa_xfer_abort */ in __wa_xfer_abort_cb()
511 struct device *dev = &xfer->wa->usb_iface->dev; in __wa_xfer_abort()
522 b->wa = wa_get(xfer->wa); in __wa_xfer_abort()
525 usb_fill_bulk_urb(&b->urb, xfer->wa->usb_dev, in __wa_xfer_abort()
526 usb_sndbulkpipe(xfer->wa->usb_dev, in __wa_xfer_abort()
527 xfer->wa->dto_epd->bEndpointAddress), in __wa_xfer_abort()
536 wa_put(xfer->wa); in __wa_xfer_abort()
568 if ((xfer->wa->quirks & WUSB_QUIRK_ALEREON_HWA_CONCAT_ISOC) in __wa_seg_calculate_isoc_frame_count()
596 struct device *dev = &xfer->wa->usb_iface->dev; in __wa_xfer_setup_sizes()
625 * 1 << (xfer->wa->wa_descr->bRPipeBlockSize - 1); in __wa_xfer_setup_sizes()
750 struct wahc *wa; in wa_seg_dto_cb() local
764 wa = xfer->wa; in wa_seg_dto_cb()
765 dev = &wa->usb_iface->dev; in wa_seg_dto_cb()
768 if (wa->quirks & WUSB_QUIRK_ALEREON_HWA_CONCAT_ISOC) in wa_seg_dto_cb()
820 __wa_dto_put(wa); in wa_seg_dto_cb()
821 wa_check_for_delayed_rpipes(wa); in wa_seg_dto_cb()
827 __wa_dto_put(wa); in wa_seg_dto_cb()
828 wa_check_for_delayed_rpipes(wa); in wa_seg_dto_cb()
847 if (edc_inc(&wa->nep_edc, EDC_MAX_ERRORS, in wa_seg_dto_cb()
850 wa_reset_all(wa); in wa_seg_dto_cb()
860 __wa_dto_put(wa); in wa_seg_dto_cb()
861 wa_check_for_delayed_rpipes(wa); in wa_seg_dto_cb()
887 struct wahc *wa; in wa_seg_iso_pack_desc_cb() local
897 wa = xfer->wa; in wa_seg_iso_pack_desc_cb()
898 dev = &wa->usb_iface->dev; in wa_seg_iso_pack_desc_cb()
910 wa = xfer->wa; in wa_seg_iso_pack_desc_cb()
911 dev = &wa->usb_iface->dev; in wa_seg_iso_pack_desc_cb()
915 if (edc_inc(&wa->nep_edc, EDC_MAX_ERRORS, in wa_seg_iso_pack_desc_cb()
918 wa_reset_all(wa); in wa_seg_iso_pack_desc_cb()
960 struct wahc *wa; in wa_seg_tr_cb() local
970 wa = xfer->wa; in wa_seg_tr_cb()
971 dev = &wa->usb_iface->dev; in wa_seg_tr_cb()
985 wa = xfer->wa; in wa_seg_tr_cb()
986 dev = &wa->usb_iface->dev; in wa_seg_tr_cb()
992 if (edc_inc(&wa->nep_edc, EDC_MAX_ERRORS, in wa_seg_tr_cb()
996 wa_reset_all(wa); in wa_seg_tr_cb()
1109 if (xfer->wa->quirks & WUSB_QUIRK_ALEREON_HWA_CONCAT_ISOC) in __wa_populate_dto_urb_isoc()
1178 struct usb_device *usb_dev = xfer->wa->usb_dev; in __wa_xfer_setup_segs()
1179 const struct usb_endpoint_descriptor *dto_epd = xfer->wa->dto_epd; in __wa_xfer_setup_segs()
1312 struct device *dev = &xfer->wa->usb_iface->dev; in __wa_xfer_setup()
1425 struct wahc *wa = xfer->wa; in __wa_seg_submit() local
1439 if (((wa->quirks & WUSB_QUIRK_ALEREON_HWA_CONCAT_ISOC) == 0) in __wa_seg_submit()
1467 struct device *dev = &rpipe->wa->usb_iface->dev; in __wa_xfer_delayed_run()
1477 && (dto_acquired = __wa_dto_try_get(rpipe->wa))) { in __wa_xfer_delayed_run()
1491 __wa_dto_put(rpipe->wa); in __wa_xfer_delayed_run()
1542 wa_add_delayed_rpipe(rpipe->wa, rpipe); in wa_xfer_delayed_run()
1544 wa_check_for_delayed_rpipes(rpipe->wa); in wa_xfer_delayed_run()
1557 struct wahc *wa = xfer->wa; in __wa_xfer_submit() local
1558 struct device *dev = &wa->usb_iface->dev; in __wa_xfer_submit()
1567 spin_lock_irqsave(&wa->xfer_list_lock, flags); in __wa_xfer_submit()
1568 list_add_tail(&xfer->list_node, &wa->xfer_list); in __wa_xfer_submit()
1569 spin_unlock_irqrestore(&wa->xfer_list_lock, flags); in __wa_xfer_submit()
1585 dto_acquired = __wa_dto_try_get(rpipe->wa); in __wa_xfer_submit()
1594 __wa_dto_put(rpipe->wa); in __wa_xfer_submit()
1623 wa_add_delayed_rpipe(rpipe->wa, rpipe); in __wa_xfer_submit()
1625 wa_check_for_delayed_rpipes(rpipe->wa); in __wa_xfer_submit()
1657 struct wahc *wa = xfer->wa; in wa_urb_enqueue_b() local
1658 struct wusbhc *wusbhc = wa->wusb; in wa_urb_enqueue_b()
1662 result = rpipe_get_by_ep(wa, xfer->ep, urb, xfer->gfp); in wa_urb_enqueue_b()
1752 struct wahc *wa = container_of(ws, struct wahc, xfer_enqueue_work); in wa_urb_enqueue_run() local
1758 spin_lock_irq(&wa->xfer_list_lock); in wa_urb_enqueue_run()
1759 list_cut_position(&tmp_list, &wa->xfer_delayed_list, in wa_urb_enqueue_run()
1760 wa->xfer_delayed_list.prev); in wa_urb_enqueue_run()
1761 spin_unlock_irq(&wa->xfer_list_lock); in wa_urb_enqueue_run()
1783 struct wahc *wa = container_of(ws, struct wahc, xfer_error_work); in wa_process_errored_transfers_run() local
1790 spin_lock_irq(&wa->xfer_list_lock); in wa_process_errored_transfers_run()
1791 list_cut_position(&tmp_list, &wa->xfer_errored_list, in wa_process_errored_transfers_run()
1792 wa->xfer_errored_list.prev); in wa_process_errored_transfers_run()
1793 spin_unlock_irq(&wa->xfer_list_lock); in wa_process_errored_transfers_run()
1810 rpipe_clear_feature_stalled(wa, ep); in wa_process_errored_transfers_run()
1833 int wa_urb_enqueue(struct wahc *wa, struct usb_host_endpoint *ep, in wa_urb_enqueue() argument
1837 struct device *dev = &wa->usb_iface->dev; in wa_urb_enqueue()
1850 spin_lock_irqsave(&wa->xfer_list_lock, my_flags); in wa_urb_enqueue()
1851 result = usb_hcd_link_urb_to_ep(&(wa->wusb->usb_hcd), urb); in wa_urb_enqueue()
1852 spin_unlock_irqrestore(&wa->xfer_list_lock, my_flags); in wa_urb_enqueue()
1865 xfer->wa = wa_get(wa); in wa_urb_enqueue()
1879 spin_lock_irqsave(&wa->xfer_list_lock, my_flags); in wa_urb_enqueue()
1880 list_add_tail(&xfer->list_node, &wa->xfer_delayed_list); in wa_urb_enqueue()
1881 spin_unlock_irqrestore(&wa->xfer_list_lock, my_flags); in wa_urb_enqueue()
1882 queue_work(wusbd, &wa->xfer_enqueue_work); in wa_urb_enqueue()
1893 wa_put(xfer->wa); in wa_urb_enqueue()
1895 spin_lock_irqsave(&wa->xfer_list_lock, my_flags); in wa_urb_enqueue()
1896 usb_hcd_unlink_urb_from_ep(&(wa->wusb->usb_hcd), urb); in wa_urb_enqueue()
1897 spin_unlock_irqrestore(&wa->xfer_list_lock, my_flags); in wa_urb_enqueue()
1906 spin_lock_irqsave(&wa->xfer_list_lock, my_flags); in wa_urb_enqueue()
1907 usb_hcd_unlink_urb_from_ep(&(wa->wusb->usb_hcd), urb); in wa_urb_enqueue()
1908 spin_unlock_irqrestore(&wa->xfer_list_lock, my_flags); in wa_urb_enqueue()
1932 int wa_urb_dequeue(struct wahc *wa, struct urb *urb, int status) in wa_urb_dequeue() argument
1943 spin_lock_irqsave(&wa->xfer_list_lock, flags); in wa_urb_dequeue()
1944 result = usb_hcd_check_unlink_urb(&(wa->wusb->usb_hcd), urb, status); in wa_urb_dequeue()
1952 spin_unlock_irqrestore(&wa->xfer_list_lock, flags); in wa_urb_dequeue()
1980 spin_lock_irqsave(&wa->xfer_list_lock, flags2); in wa_urb_dequeue()
1983 spin_unlock_irqrestore(&wa->xfer_list_lock, flags2); in wa_urb_dequeue()
2070 spin_unlock_irqrestore(&wa->xfer_list_lock, flags2); in wa_urb_dequeue()
2174 static int __wa_populate_buf_in_urb_isoc(struct wahc *wa, in __wa_populate_buf_in_urb_isoc() argument
2181 const int dti_packet_size = usb_endpoint_maxp(wa->dti_epd); in __wa_populate_buf_in_urb_isoc()
2288 static void wa_xfer_result_chew(struct wahc *wa, struct wa_xfer *xfer, in wa_xfer_result_chew() argument
2292 struct device *dev = &wa->usb_iface->dev; in wa_xfer_result_chew()
2301 struct urb *buf_in_urb = &(wa->buf_in_urbs[0]); in wa_xfer_result_chew()
2345 wa->dti_isoc_xfer_in_progress = wa_xfer_id(xfer); in wa_xfer_result_chew()
2346 wa->dti_isoc_xfer_seg = seg_idx; in wa_xfer_result_chew()
2347 wa->dti_state = WA_DTI_ISOC_PACKET_STATUS_PENDING; in wa_xfer_result_chew()
2356 ++(wa->active_buf_in_urbs); in wa_xfer_result_chew()
2359 --(wa->active_buf_in_urbs); in wa_xfer_result_chew()
2376 if (edc_inc(&wa->dti_edc, EDC_MAX_ERRORS, EDC_ERROR_TIMEFRAME)) { in wa_xfer_result_chew()
2379 wa_reset_all(wa); in wa_xfer_result_chew()
2404 spin_lock(&wa->xfer_list_lock); in wa_xfer_result_chew()
2406 list_move_tail(&xfer->list_node, &wa->xfer_errored_list); in wa_xfer_result_chew()
2407 spin_unlock(&wa->xfer_list_lock); in wa_xfer_result_chew()
2409 queue_work(wusbd, &wa->xfer_error_work); in wa_xfer_result_chew()
2422 wa_urb_dequeue(wa, xfer->urb, -ENOENT); in wa_xfer_result_chew()
2425 if (edc_inc(&wa->dti_edc, EDC_MAX_ERRORS, EDC_ERROR_TIMEFRAME)) { in wa_xfer_result_chew()
2428 wa_reset_all(wa); in wa_xfer_result_chew()
2442 static int wa_process_iso_packet_status(struct wahc *wa, struct urb *urb) in wa_process_iso_packet_status() argument
2444 struct device *dev = &wa->usb_iface->dev; in wa_process_iso_packet_status()
2458 packet_status = (struct wa_xfer_packet_status_hwaiso *)(wa->dti_buf); in wa_process_iso_packet_status()
2464 xfer = wa_xfer_get_by_id(wa, wa->dti_isoc_xfer_in_progress); in wa_process_iso_packet_status()
2467 wa->dti_isoc_xfer_in_progress); in wa_process_iso_packet_status()
2471 if (unlikely(wa->dti_isoc_xfer_seg >= xfer->segs)) in wa_process_iso_packet_status()
2473 seg = xfer->seg[wa->dti_isoc_xfer_seg]; in wa_process_iso_packet_status()
2491 wa->wusb->usb_hcd.driver->get_frame_number(&wa->wusb->usb_hcd); in wa_process_iso_packet_status()
2526 buf_in_urb = &(wa->buf_in_urbs[urb_index]); in wa_process_iso_packet_status()
2527 urb_frame_count = __wa_populate_buf_in_urb_isoc(wa, in wa_process_iso_packet_status()
2533 ++(wa->active_buf_in_urbs); in wa_process_iso_packet_status()
2554 --(wa->active_buf_in_urbs); in wa_process_iso_packet_status()
2557 wa_reset_all(wa); in wa_process_iso_packet_status()
2568 wa->dti_state = WA_DTI_BUF_IN_DATA_PENDING; in wa_process_iso_packet_status()
2570 wa->dti_state = WA_DTI_TRANSFER_RESULT_PENDING; in wa_process_iso_packet_status()
2599 struct wahc *wa; in wa_buf_in_cb() local
2612 wa = xfer->wa; in wa_buf_in_cb()
2613 dev = &wa->usb_iface->dev; in wa_buf_in_cb()
2614 --(wa->active_buf_in_urbs); in wa_buf_in_cb()
2615 active_buf_in_urbs = wa->active_buf_in_urbs; in wa_buf_in_cb()
2652 urb_frame_count = __wa_populate_buf_in_urb_isoc(wa, urb, in wa_buf_in_cb()
2656 ++(wa->active_buf_in_urbs); in wa_buf_in_cb()
2659 --(wa->active_buf_in_urbs); in wa_buf_in_cb()
2662 wa_reset_all(wa); in wa_buf_in_cb()
2697 resubmit_dti = wa->dti_state != WA_DTI_TRANSFER_RESULT_PENDING; in wa_buf_in_cb()
2703 if (edc_inc(&wa->nep_edc, EDC_MAX_ERRORS, in wa_buf_in_cb()
2707 wa_reset_all(wa); in wa_buf_in_cb()
2726 wa->dti_state = WA_DTI_TRANSFER_RESULT_PENDING; in wa_buf_in_cb()
2728 result = usb_submit_urb(wa->dti_urb, GFP_ATOMIC); in wa_buf_in_cb()
2732 wa_reset_all(wa); in wa_buf_in_cb()
2766 struct wahc *wa = urb->context; in wa_dti_cb() local
2767 struct device *dev = &wa->usb_iface->dev; in wa_dti_cb()
2771 BUG_ON(wa->dti_urb != urb); in wa_dti_cb()
2772 switch (wa->dti_urb->status) { in wa_dti_cb()
2774 if (wa->dti_state == WA_DTI_TRANSFER_RESULT_PENDING) { in wa_dti_cb()
2787 xfer_result = (struct wa_xfer_result *)(wa->dti_buf); in wa_dti_cb()
2807 xfer = wa_xfer_get_by_id(wa, xfer_id); in wa_dti_cb()
2814 wa_xfer_result_chew(wa, xfer, xfer_result); in wa_dti_cb()
2816 } else if (wa->dti_state == WA_DTI_ISOC_PACKET_STATUS_PENDING) { in wa_dti_cb()
2817 dti_busy = wa_process_iso_packet_status(wa, urb); in wa_dti_cb()
2820 wa->dti_state); in wa_dti_cb()
2829 if (edc_inc(&wa->dti_edc, EDC_MAX_ERRORS, in wa_dti_cb()
2833 wa_reset_all(wa); in wa_dti_cb()
2843 result = usb_submit_urb(wa->dti_urb, GFP_ATOMIC); in wa_dti_cb()
2847 wa_reset_all(wa); in wa_dti_cb()
2858 int wa_dti_start(struct wahc *wa) in wa_dti_start() argument
2860 const struct usb_endpoint_descriptor *dti_epd = wa->dti_epd; in wa_dti_start()
2861 struct device *dev = &wa->usb_iface->dev; in wa_dti_start()
2864 if (wa->dti_urb != NULL) /* DTI URB already started */ in wa_dti_start()
2867 wa->dti_urb = usb_alloc_urb(0, GFP_KERNEL); in wa_dti_start()
2868 if (wa->dti_urb == NULL) { in wa_dti_start()
2873 wa->dti_urb, wa->usb_dev, in wa_dti_start()
2874 usb_rcvbulkpipe(wa->usb_dev, 0x80 | dti_epd->bEndpointAddress), in wa_dti_start()
2875 wa->dti_buf, wa->dti_buf_size, in wa_dti_start()
2876 wa_dti_cb, wa); in wa_dti_start()
2881 &(wa->buf_in_urbs[index]), wa->usb_dev, in wa_dti_start()
2882 usb_rcvbulkpipe(wa->usb_dev, in wa_dti_start()
2884 NULL, 0, wa_buf_in_cb, wa); in wa_dti_start()
2886 result = usb_submit_urb(wa->dti_urb, GFP_KERNEL); in wa_dti_start()
2896 usb_put_urb(wa->dti_urb); in wa_dti_start()
2897 wa->dti_urb = NULL; in wa_dti_start()
2918 void wa_handle_notif_xfer(struct wahc *wa, struct wa_notif_hdr *notif_hdr) in wa_handle_notif_xfer() argument
2920 struct device *dev = &wa->usb_iface->dev; in wa_handle_notif_xfer()
2922 const struct usb_endpoint_descriptor *dti_epd = wa->dti_epd; in wa_handle_notif_xfer()
2935 if (wa_dti_start(wa) < 0) in wa_handle_notif_xfer()
2941 wa_reset_all(wa); in wa_handle_notif_xfer()