Lines Matching refs:priv_ep
103 struct cdns3_endpoint *priv_ep) in cdns3_get_dma_pos() argument
107 dma_index = readl(&priv_dev->regs->ep_traddr) - priv_ep->trb_pool_dma; in cdns3_get_dma_pos()
159 dma_addr_t cdns3_trb_virt_to_dma(struct cdns3_endpoint *priv_ep, in cdns3_trb_virt_to_dma() argument
162 u32 offset = (char *)trb - (char *)priv_ep->trb_pool; in cdns3_trb_virt_to_dma()
164 return priv_ep->trb_pool_dma + offset; in cdns3_trb_virt_to_dma()
167 int cdns3_ring_size(struct cdns3_endpoint *priv_ep) in cdns3_ring_size() argument
169 switch (priv_ep->type) { in cdns3_ring_size()
185 int cdns3_allocate_trb_pool(struct cdns3_endpoint *priv_ep) in cdns3_allocate_trb_pool() argument
187 int ring_size = cdns3_ring_size(priv_ep); in cdns3_allocate_trb_pool()
190 if (!priv_ep->trb_pool) { in cdns3_allocate_trb_pool()
191 priv_ep->trb_pool = in cdns3_allocate_trb_pool()
193 (unsigned long *)&priv_ep->trb_pool_dma); in cdns3_allocate_trb_pool()
194 if (!priv_ep->trb_pool) in cdns3_allocate_trb_pool()
197 memset(priv_ep->trb_pool, 0, ring_size); in cdns3_allocate_trb_pool()
200 if (!priv_ep->num) in cdns3_allocate_trb_pool()
203 priv_ep->num_trbs = ring_size / TRB_SIZE; in cdns3_allocate_trb_pool()
205 link_trb = (priv_ep->trb_pool + (priv_ep->num_trbs - 1)); in cdns3_allocate_trb_pool()
206 link_trb->buffer = TRB_BUFFER(priv_ep->trb_pool_dma); in cdns3_allocate_trb_pool()
212 static void cdns3_free_trb_pool(struct cdns3_endpoint *priv_ep) in cdns3_free_trb_pool() argument
214 if (priv_ep->trb_pool) { in cdns3_free_trb_pool()
215 dma_free_coherent(priv_ep->trb_pool); in cdns3_free_trb_pool()
216 priv_ep->trb_pool = NULL; in cdns3_free_trb_pool()
226 static void cdns3_ep_stall_flush(struct cdns3_endpoint *priv_ep) in cdns3_ep_stall_flush() argument
228 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in cdns3_ep_stall_flush()
231 trace_cdns3_halt(priv_ep, 1, 1); in cdns3_ep_stall_flush()
239 priv_ep->flags |= EP_STALLED; in cdns3_ep_stall_flush()
240 priv_ep->flags &= ~EP_STALL_PENDING; in cdns3_ep_stall_flush()
282 static void cdns3_ep_inc_enq(struct cdns3_endpoint *priv_ep) in cdns3_ep_inc_enq() argument
284 priv_ep->free_trbs--; in cdns3_ep_inc_enq()
285 cdns3_ep_inc_trb(&priv_ep->enqueue, &priv_ep->pcs, priv_ep->num_trbs); in cdns3_ep_inc_enq()
292 static void cdns3_ep_inc_deq(struct cdns3_endpoint *priv_ep) in cdns3_ep_inc_deq() argument
294 priv_ep->free_trbs++; in cdns3_ep_inc_deq()
295 cdns3_ep_inc_trb(&priv_ep->dequeue, &priv_ep->ccs, priv_ep->num_trbs); in cdns3_ep_inc_deq()
300 struct cdns3_endpoint *priv_ep = priv_req->priv_ep; in cdns3_move_deq_to_next_trb() local
304 cdns3_ep_inc_deq(priv_ep); in cdns3_move_deq_to_next_trb()
305 current_trb = priv_ep->dequeue; in cdns3_move_deq_to_next_trb()
308 cdns3_ep_inc_deq(priv_ep); in cdns3_move_deq_to_next_trb()
355 struct cdns3_endpoint *priv_ep) in cdns3_start_all_request() argument
360 while (!list_empty(&priv_ep->deferred_req_list)) { in cdns3_start_all_request()
361 request = cdns3_next_request(&priv_ep->deferred_req_list); in cdns3_start_all_request()
363 ret = cdns3_ep_run_transfer(priv_ep, request); in cdns3_start_all_request()
369 &priv_ep->pending_req_list); in cdns3_start_all_request()
372 priv_ep->flags &= ~EP_RING_FULL; in cdns3_start_all_request()
383 if (!priv_ep->dir && priv_ep->type != USB_ENDPOINT_XFER_ISOC) { \
384 priv_ep->flags |= EP_QUIRK_EXTRA_BUF_DET; \
394 static void cdns3_wa2_descmiss_copy_data(struct cdns3_endpoint *priv_ep, in cdns3_wa2_descmiss_copy_data() argument
400 while (!list_empty(&priv_ep->wa2_descmiss_req_list)) { in cdns3_wa2_descmiss_copy_data()
405 cdns3_next_priv_request(&priv_ep->wa2_descmiss_req_list); in cdns3_wa2_descmiss_copy_data()
430 cdns3_gadget_ep_free_request(&priv_ep->endpoint, descmiss_req); in cdns3_wa2_descmiss_copy_data()
431 --priv_ep->wa2_counter; in cdns3_wa2_descmiss_copy_data()
439 struct cdns3_endpoint *priv_ep, in cdns3_wa2_gadget_giveback() argument
442 if (priv_ep->flags & EP_QUIRK_EXTRA_BUF_EN && in cdns3_wa2_gadget_giveback()
446 req = cdns3_next_request(&priv_ep->deferred_req_list); in cdns3_wa2_gadget_giveback()
448 priv_ep->descmis_req = NULL; in cdns3_wa2_gadget_giveback()
453 cdns3_wa2_descmiss_copy_data(priv_ep, req); in cdns3_wa2_gadget_giveback()
454 if (!(priv_ep->flags & EP_QUIRK_END_TRANSFER) && in cdns3_wa2_gadget_giveback()
464 cdns3_start_all_request(priv_dev, priv_ep); in cdns3_wa2_gadget_giveback()
472 struct cdns3_endpoint *priv_ep, in cdns3_wa2_gadget_ep_queue() argument
482 if (priv_ep->flags & EP_QUIRK_EXTRA_BUF_DET) { in cdns3_wa2_gadget_ep_queue()
485 cdns3_select_ep(priv_dev, priv_ep->num | priv_ep->dir); in cdns3_wa2_gadget_ep_queue()
486 priv_ep->flags &= ~EP_QUIRK_EXTRA_BUF_DET; in cdns3_wa2_gadget_ep_queue()
489 trace_cdns3_wa2(priv_ep, "workaround disabled\n"); in cdns3_wa2_gadget_ep_queue()
493 if (priv_ep->flags & EP_QUIRK_EXTRA_BUF_EN) { in cdns3_wa2_gadget_ep_queue()
494 u8 pending_empty = list_empty(&priv_ep->pending_req_list); in cdns3_wa2_gadget_ep_queue()
495 u8 descmiss_empty = list_empty(&priv_ep->wa2_descmiss_req_list); in cdns3_wa2_gadget_ep_queue()
504 cdns3_wa2_descmiss_copy_data(priv_ep, in cdns3_wa2_gadget_ep_queue()
507 trace_cdns3_wa2(priv_ep, "get internal stored data"); in cdns3_wa2_gadget_ep_queue()
510 &priv_ep->pending_req_list); in cdns3_wa2_gadget_ep_queue()
511 cdns3_gadget_giveback(priv_ep, priv_req, in cdns3_wa2_gadget_ep_queue()
527 trace_cdns3_wa2(priv_ep, "wait for pending transfer\n"); in cdns3_wa2_gadget_ep_queue()
533 &priv_ep->wa2_descmiss_req_list); in cdns3_wa2_gadget_ep_queue()
539 static void cdns3_wa2_remove_old_request(struct cdns3_endpoint *priv_ep) in cdns3_wa2_remove_old_request() argument
543 while (!list_empty(&priv_ep->wa2_descmiss_req_list)) { in cdns3_wa2_remove_old_request()
546 priv_req = cdns3_next_priv_request(&priv_ep->wa2_descmiss_req_list); in cdns3_wa2_remove_old_request()
549 trace_cdns3_wa2(priv_ep, "removes eldest request"); in cdns3_wa2_remove_old_request()
552 cdns3_gadget_ep_free_request(&priv_ep->endpoint, in cdns3_wa2_remove_old_request()
555 --priv_ep->wa2_counter; in cdns3_wa2_remove_old_request()
569 static void cdns3_wa2_descmissing_packet(struct cdns3_endpoint *priv_ep) in cdns3_wa2_descmissing_packet() argument
574 if (priv_ep->flags & EP_QUIRK_EXTRA_BUF_DET) { in cdns3_wa2_descmissing_packet()
575 priv_ep->flags &= ~EP_QUIRK_EXTRA_BUF_DET; in cdns3_wa2_descmissing_packet()
576 priv_ep->flags |= EP_QUIRK_EXTRA_BUF_EN; in cdns3_wa2_descmissing_packet()
579 trace_cdns3_wa2(priv_ep, "Description Missing detected\n"); in cdns3_wa2_descmissing_packet()
581 if (priv_ep->wa2_counter >= CDNS3_WA2_NUM_BUFFERS) in cdns3_wa2_descmissing_packet()
582 cdns3_wa2_remove_old_request(priv_ep); in cdns3_wa2_descmissing_packet()
584 request = cdns3_gadget_ep_alloc_request(&priv_ep->endpoint, in cdns3_wa2_descmissing_packet()
598 if (priv_ep->descmis_req) in cdns3_wa2_descmissing_packet()
599 priv_ep->descmis_req->flags |= REQUEST_INTERNAL_CH; in cdns3_wa2_descmissing_packet()
603 priv_ep->wa2_counter++; in cdns3_wa2_descmissing_packet()
606 cdns3_gadget_ep_free_request(&priv_ep->endpoint, request); in cdns3_wa2_descmissing_packet()
611 priv_ep->descmis_req = priv_req; in cdns3_wa2_descmissing_packet()
613 __cdns3_gadget_ep_queue(&priv_ep->endpoint, in cdns3_wa2_descmissing_packet()
614 &priv_ep->descmis_req->request, in cdns3_wa2_descmissing_packet()
620 dev_err(priv_ep->cdns3_dev->dev, in cdns3_wa2_descmissing_packet()
634 void cdns3_gadget_giveback(struct cdns3_endpoint *priv_ep, in cdns3_gadget_giveback() argument
638 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in cdns3_gadget_giveback()
647 priv_ep->dir); in cdns3_gadget_giveback()
650 priv_ep->dir == USB_DIR_OUT && !request->status) in cdns3_gadget_giveback()
658 request = cdns3_wa2_gadget_giveback(priv_dev, priv_ep, in cdns3_gadget_giveback()
666 usb_gadget_giveback_request(&priv_ep->endpoint, in cdns3_gadget_giveback()
672 cdns3_gadget_ep_free_request(&priv_ep->endpoint, request); in cdns3_gadget_giveback()
675 void cdns3_wa1_restore_cycle_bit(struct cdns3_endpoint *priv_ep) in cdns3_wa1_restore_cycle_bit() argument
678 if (priv_ep->wa1_set) { in cdns3_wa1_restore_cycle_bit()
679 trace_cdns3_wa1(priv_ep, "restore cycle bit"); in cdns3_wa1_restore_cycle_bit()
681 priv_ep->wa1_set = 0; in cdns3_wa1_restore_cycle_bit()
682 priv_ep->wa1_trb_index = 0xFFFF; in cdns3_wa1_restore_cycle_bit()
683 if (priv_ep->wa1_cycle_bit) { in cdns3_wa1_restore_cycle_bit()
684 priv_ep->wa1_trb->control = in cdns3_wa1_restore_cycle_bit()
685 priv_ep->wa1_trb->control | 0x1; in cdns3_wa1_restore_cycle_bit()
687 priv_ep->wa1_trb->control = in cdns3_wa1_restore_cycle_bit()
688 priv_ep->wa1_trb->control & ~0x1; in cdns3_wa1_restore_cycle_bit()
721 struct cdns3_endpoint *priv_ep = priv_req->priv_ep; in cdns3_prepare_aligned_request_buf() local
722 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in cdns3_prepare_aligned_request_buf()
763 if (priv_ep->dir == USB_DIR_IN) { in cdns3_prepare_aligned_request_buf()
774 static int cdns3_wa1_update_guard(struct cdns3_endpoint *priv_ep, in cdns3_wa1_update_guard() argument
777 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in cdns3_wa1_update_guard()
779 if (!priv_ep->wa1_set) { in cdns3_wa1_update_guard()
785 priv_ep->wa1_cycle_bit = priv_ep->pcs ? TRB_CYCLE : 0; in cdns3_wa1_update_guard()
786 priv_ep->wa1_set = 1; in cdns3_wa1_update_guard()
787 priv_ep->wa1_trb = trb; in cdns3_wa1_update_guard()
788 priv_ep->wa1_trb_index = priv_ep->enqueue; in cdns3_wa1_update_guard()
789 trace_cdns3_wa1(priv_ep, "set guard"); in cdns3_wa1_update_guard()
797 struct cdns3_endpoint *priv_ep) in cdns3_wa1_tray_restore_cycle_bit() argument
803 dma_index = cdns3_get_dma_pos(priv_dev, priv_ep); in cdns3_wa1_tray_restore_cycle_bit()
805 if (!doorbell || dma_index != priv_ep->wa1_trb_index) in cdns3_wa1_tray_restore_cycle_bit()
806 cdns3_wa1_restore_cycle_bit(priv_ep); in cdns3_wa1_tray_restore_cycle_bit()
815 int cdns3_ep_run_transfer(struct cdns3_endpoint *priv_ep, in cdns3_ep_run_transfer() argument
818 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in cdns3_ep_run_transfer()
829 if (num_trb > priv_ep->free_trbs) { in cdns3_ep_run_transfer()
830 priv_ep->flags |= EP_RING_FULL; in cdns3_ep_run_transfer()
835 address = priv_ep->endpoint.desc->bEndpointAddress; in cdns3_ep_run_transfer()
837 priv_ep->flags |= EP_PENDING_REQUEST; in cdns3_ep_run_transfer()
845 trb = priv_ep->trb_pool + priv_ep->enqueue; in cdns3_ep_run_transfer()
846 priv_req->start_trb = priv_ep->enqueue; in cdns3_ep_run_transfer()
849 cdns3_select_ep(priv_ep->cdns3_dev, address); in cdns3_ep_run_transfer()
852 if ((priv_ep->enqueue + num_trb) >= (priv_ep->num_trbs - 1)) { in cdns3_ep_run_transfer()
858 dma_index = cdns3_get_dma_pos(priv_dev, priv_ep); in cdns3_ep_run_transfer()
861 if (doorbell && dma_index == priv_ep->num_trbs - 1) { in cdns3_ep_run_transfer()
862 priv_ep->flags |= EP_DEFERRED_DRDY; in cdns3_ep_run_transfer()
867 link_trb = priv_ep->trb_pool + (priv_ep->num_trbs - 1); in cdns3_ep_run_transfer()
876 if (priv_ep->type == USB_ENDPOINT_XFER_ISOC || in cdns3_ep_run_transfer()
880 link_trb->control = ((priv_ep->pcs) ? TRB_CYCLE : 0) | in cdns3_ep_run_transfer()
885 togle_pcs = cdns3_wa1_update_guard(priv_ep, trb); in cdns3_ep_run_transfer()
888 control = priv_ep->pcs ? 0 : TRB_CYCLE; in cdns3_ep_run_transfer()
902 priv_ep->endpoint.maxpacket); in cdns3_ep_run_transfer()
904 trb->length = TRB_BURST_LEN(priv_ep->trb_burst_size) | in cdns3_ep_run_transfer()
911 pcs = priv_ep->pcs ? TRB_CYCLE : 0; in cdns3_ep_run_transfer()
920 if (priv_ep->type == USB_ENDPOINT_XFER_ISOC && !priv_ep->dir) { in cdns3_ep_run_transfer()
935 priv_req->end_trb = priv_ep->enqueue; in cdns3_ep_run_transfer()
936 cdns3_ep_inc_enq(priv_ep); in cdns3_ep_run_transfer()
937 trb = priv_ep->trb_pool + priv_ep->enqueue; in cdns3_ep_run_transfer()
957 cdns3_wa1_tray_restore_cycle_bit(priv_dev, priv_ep); in cdns3_ep_run_transfer()
959 trace_cdns3_prepare_trb(priv_ep, priv_req->trb); in cdns3_ep_run_transfer()
971 if (priv_ep->flags & EP_UPDATE_EP_TRBADDR) { in cdns3_ep_run_transfer()
977 if (priv_ep->type == USB_ENDPOINT_XFER_ISOC && !priv_ep->dir && in cdns3_ep_run_transfer()
978 !(priv_ep->flags & EP_QUIRK_ISO_OUT_EN)) { in cdns3_ep_run_transfer()
979 priv_ep->flags |= EP_QUIRK_ISO_OUT_EN; in cdns3_ep_run_transfer()
984 writel(EP_TRADDR_TRADDR(priv_ep->trb_pool_dma + in cdns3_ep_run_transfer()
988 priv_ep->flags &= ~EP_UPDATE_EP_TRBADDR; in cdns3_ep_run_transfer()
991 if (!priv_ep->wa1_set && !(priv_ep->flags & EP_STALLED)) { in cdns3_ep_run_transfer()
992 trace_cdns3_ring(priv_ep); in cdns3_ep_run_transfer()
996 trace_cdns3_doorbell_epx(priv_ep->name, in cdns3_ep_run_transfer()
1008 struct cdns3_endpoint *priv_ep; in cdns3_set_hw_configuration() local
1028 priv_ep = ep_to_cdns3_ep(ep); in cdns3_set_hw_configuration()
1029 if (priv_ep->flags & EP_ENABLED) in cdns3_set_hw_configuration()
1030 cdns3_start_all_request(priv_dev, priv_ep); in cdns3_set_hw_configuration()
1077 static bool cdns3_request_handled(struct cdns3_endpoint *priv_ep, in cdns3_request_handled() argument
1080 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in cdns3_request_handled()
1086 current_index = cdns3_get_dma_pos(priv_dev, priv_ep); in cdns3_request_handled()
1089 trb = &priv_ep->trb_pool[priv_req->start_trb]; in cdns3_request_handled()
1091 if ((trb->control & TRB_CYCLE) != priv_ep->ccs) in cdns3_request_handled()
1094 if (doorbell == 1 && current_index == priv_ep->dequeue) in cdns3_request_handled()
1098 if (TRBS_PER_SEGMENT == 2 && priv_ep->type != USB_ENDPOINT_XFER_ISOC) { in cdns3_request_handled()
1103 if (priv_ep->enqueue == priv_ep->dequeue && in cdns3_request_handled()
1104 priv_ep->free_trbs == 0) { in cdns3_request_handled()
1106 } else if (priv_ep->dequeue < current_index) { in cdns3_request_handled()
1107 if ((current_index == (priv_ep->num_trbs - 1)) && in cdns3_request_handled()
1108 !priv_ep->dequeue) in cdns3_request_handled()
1111 if (priv_req->end_trb >= priv_ep->dequeue && in cdns3_request_handled()
1114 } else if (priv_ep->dequeue > current_index) { in cdns3_request_handled()
1116 priv_req->end_trb >= priv_ep->dequeue) in cdns3_request_handled()
1127 struct cdns3_endpoint *priv_ep) in cdns3_transfer_completed() argument
1133 while (!list_empty(&priv_ep->pending_req_list)) { in cdns3_transfer_completed()
1134 request = cdns3_next_request(&priv_ep->pending_req_list); in cdns3_transfer_completed()
1141 cdns3_select_ep(priv_dev, priv_ep->endpoint.address); in cdns3_transfer_completed()
1144 priv_ep->endpoint.desc->bEndpointAddress); in cdns3_transfer_completed()
1147 if (!cdns3_request_handled(priv_ep, priv_req)) in cdns3_transfer_completed()
1150 trb = priv_ep->trb_pool + priv_ep->dequeue; in cdns3_transfer_completed()
1151 trace_cdns3_complete_trb(priv_ep, trb); in cdns3_transfer_completed()
1160 cdns3_gadget_giveback(priv_ep, priv_req, 0); in cdns3_transfer_completed()
1162 if (priv_ep->type != USB_ENDPOINT_XFER_ISOC && in cdns3_transfer_completed()
1166 priv_ep->flags &= ~EP_PENDING_REQUEST; in cdns3_transfer_completed()
1169 if (!(priv_ep->flags & EP_STALLED) && in cdns3_transfer_completed()
1170 !(priv_ep->flags & EP_STALL_PENDING)) in cdns3_transfer_completed()
1171 cdns3_start_all_request(priv_dev, priv_ep); in cdns3_transfer_completed()
1174 void cdns3_rearm_transfer(struct cdns3_endpoint *priv_ep, u8 rearm) in cdns3_rearm_transfer() argument
1176 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in cdns3_rearm_transfer()
1178 cdns3_wa1_restore_cycle_bit(priv_ep); in cdns3_rearm_transfer()
1181 trace_cdns3_ring(priv_ep); in cdns3_rearm_transfer()
1189 trace_cdns3_doorbell_epx(priv_ep->name, in cdns3_rearm_transfer()
1200 static int cdns3_check_ep_interrupt_proceed(struct cdns3_endpoint *priv_ep) in cdns3_check_ep_interrupt_proceed() argument
1202 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in cdns3_check_ep_interrupt_proceed()
1206 cdns3_select_ep(priv_dev, priv_ep->endpoint.address); in cdns3_check_ep_interrupt_proceed()
1208 cdns3_select_ep(priv_dev, priv_ep->endpoint.desc->bEndpointAddress); in cdns3_check_ep_interrupt_proceed()
1211 trace_cdns3_epx_irq(priv_dev, priv_ep); in cdns3_check_ep_interrupt_proceed()
1217 if (priv_ep->flags & EP_STALL_PENDING && in cdns3_check_ep_interrupt_proceed()
1220 cdns3_ep_stall_flush(priv_ep); in cdns3_check_ep_interrupt_proceed()
1230 if (priv_ep->type == USB_ENDPOINT_XFER_ISOC && in cdns3_check_ep_interrupt_proceed()
1231 !priv_ep->wa1_set) { in cdns3_check_ep_interrupt_proceed()
1232 if (!priv_ep->dir) { in cdns3_check_ep_interrupt_proceed()
1237 priv_ep->flags &= ~EP_QUIRK_ISO_OUT_EN; in cdns3_check_ep_interrupt_proceed()
1239 cdns3_transfer_completed(priv_dev, priv_ep); in cdns3_check_ep_interrupt_proceed()
1240 } else if (!(priv_ep->flags & EP_STALLED) && in cdns3_check_ep_interrupt_proceed()
1241 !(priv_ep->flags & EP_STALL_PENDING)) { in cdns3_check_ep_interrupt_proceed()
1242 if (priv_ep->flags & EP_DEFERRED_DRDY) { in cdns3_check_ep_interrupt_proceed()
1243 priv_ep->flags &= ~EP_DEFERRED_DRDY; in cdns3_check_ep_interrupt_proceed()
1244 cdns3_start_all_request(priv_dev, priv_ep); in cdns3_check_ep_interrupt_proceed()
1246 cdns3_rearm_transfer(priv_ep, in cdns3_check_ep_interrupt_proceed()
1247 priv_ep->wa1_set); in cdns3_check_ep_interrupt_proceed()
1253 if (priv_ep->flags & EP_QUIRK_EXTRA_BUF_EN) { in cdns3_check_ep_interrupt_proceed()
1255 priv_ep->flags |= EP_QUIRK_END_TRANSFER; in cdns3_check_ep_interrupt_proceed()
1257 priv_ep->flags &= ~EP_QUIRK_END_TRANSFER; in cdns3_check_ep_interrupt_proceed()
1260 cdns3_transfer_completed(priv_dev, priv_ep); in cdns3_check_ep_interrupt_proceed()
1270 !(priv_ep->flags & EP_STALLED)) in cdns3_check_ep_interrupt_proceed()
1271 cdns3_wa2_descmissing_packet(priv_ep); in cdns3_check_ep_interrupt_proceed()
1510 struct cdns3_endpoint *priv_ep) in cdns3_configure_dmult() argument
1521 if (priv_dev->dev_ver >= DEV_VER_V3 && priv_ep) { in cdns3_configure_dmult()
1524 if (priv_ep->dir) in cdns3_configure_dmult()
1525 mask = BIT(priv_ep->num + 16); in cdns3_configure_dmult()
1527 mask = BIT(priv_ep->num); in cdns3_configure_dmult()
1529 if (priv_ep->type != USB_ENDPOINT_XFER_ISOC) { in cdns3_configure_dmult()
1536 if (priv_ep->type == USB_ENDPOINT_XFER_ISOC && !priv_ep->dir) in cdns3_configure_dmult()
1547 void cdns3_ep_config(struct cdns3_endpoint *priv_ep) in cdns3_ep_config() argument
1549 bool is_iso_ep = (priv_ep->type == USB_ENDPOINT_XFER_ISOC); in cdns3_ep_config()
1550 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in cdns3_ep_config()
1551 u32 bEndpointAddress = priv_ep->num | priv_ep->dir; in cdns3_ep_config()
1561 cdns3_configure_dmult(priv_dev, priv_ep); in cdns3_ep_config()
1563 switch (priv_ep->type) { in cdns3_ep_config()
1567 if ((priv_dev->dev_ver == DEV_VER_V2 && !priv_ep->dir) || in cdns3_ep_config()
1574 if ((priv_dev->dev_ver == DEV_VER_V2 && !priv_ep->dir) || in cdns3_ep_config()
1595 if (priv_ep->type == USB_ENDPOINT_XFER_ISOC) { in cdns3_ep_config()
1600 if (priv_ep->interval > 1) in cdns3_ep_config()
1612 priv_ep->trb_burst_size = 128; in cdns3_ep_config()
1614 priv_ep->trb_burst_size = 64; in cdns3_ep_config()
1616 priv_ep->trb_burst_size = 16; in cdns3_ep_config()
1619 !!priv_ep->dir); in cdns3_ep_config()
1634 priv_ep->name, ep_cfg); in cdns3_ep_config()
1639 struct cdns3_endpoint *priv_ep) in cdns3_ep_dir_is_correct() argument
1641 return (priv_ep->endpoint.caps.dir_in && usb_endpoint_dir_in(desc)) || in cdns3_ep_dir_is_correct()
1642 (priv_ep->endpoint.caps.dir_out && usb_endpoint_dir_out(desc)); in cdns3_ep_dir_is_correct()
1650 struct cdns3_endpoint *priv_ep; in cdns3_find_available_ep() local
1659 priv_ep = ep_to_cdns3_ep(ep); in cdns3_find_available_ep()
1660 if (cdns3_ep_dir_is_correct(desc, priv_ep)) { in cdns3_find_available_ep()
1661 if (!(priv_ep->flags & EP_CLAIMED)) { in cdns3_find_available_ep()
1662 priv_ep->num = num; in cdns3_find_available_ep()
1663 return priv_ep; in cdns3_find_available_ep()
1693 struct cdns3_endpoint *priv_ep; in cdns3_gadget_match_ep() local
1696 priv_ep = cdns3_find_available_ep(priv_dev, desc); in cdns3_gadget_match_ep()
1697 if (IS_ERR(priv_ep)) { in cdns3_gadget_match_ep()
1702 dev_dbg(priv_dev->dev, "match endpoint: %s\n", priv_ep->name); in cdns3_gadget_match_ep()
1705 priv_ep->endpoint.desc = desc; in cdns3_gadget_match_ep()
1706 priv_ep->dir = usb_endpoint_dir_in(desc) ? USB_DIR_IN : USB_DIR_OUT; in cdns3_gadget_match_ep()
1707 priv_ep->type = usb_endpoint_type(desc); in cdns3_gadget_match_ep()
1708 priv_ep->flags |= EP_CLAIMED; in cdns3_gadget_match_ep()
1709 priv_ep->interval = desc->bInterval ? BIT(desc->bInterval - 1) : 0; in cdns3_gadget_match_ep()
1712 return &priv_ep->endpoint; in cdns3_gadget_match_ep()
1725 struct cdns3_endpoint *priv_ep = ep_to_cdns3_ep(ep); in cdns3_gadget_ep_alloc_request() local
1732 priv_req->priv_ep = priv_ep; in cdns3_gadget_ep_alloc_request()
1765 struct cdns3_endpoint *priv_ep; in cdns3_gadget_ep_enable() local
1774 priv_ep = ep_to_cdns3_ep(ep); in cdns3_gadget_ep_enable()
1775 priv_dev = priv_ep->cdns3_dev; in cdns3_gadget_ep_enable()
1787 if (WARN_ON(priv_ep->flags & EP_ENABLED)) in cdns3_gadget_ep_enable()
1792 priv_ep->endpoint.desc = desc; in cdns3_gadget_ep_enable()
1793 priv_ep->type = usb_endpoint_type(desc); in cdns3_gadget_ep_enable()
1794 priv_ep->interval = desc->bInterval ? BIT(desc->bInterval - 1) : 0; in cdns3_gadget_ep_enable()
1796 if (priv_ep->interval > ISO_MAX_INTERVAL && in cdns3_gadget_ep_enable()
1797 priv_ep->type == USB_ENDPOINT_XFER_ISOC) { in cdns3_gadget_ep_enable()
1805 ret = cdns3_allocate_trb_pool(priv_ep); in cdns3_gadget_ep_enable()
1810 bEndpointAddress = priv_ep->num | priv_ep->dir; in cdns3_gadget_ep_enable()
1813 trace_cdns3_gadget_ep_enable(priv_ep); in cdns3_gadget_ep_enable()
1822 cdns3_free_trb_pool(priv_ep); in cdns3_gadget_ep_enable()
1832 cdns3_wa2_enable_detection(priv_dev, priv_ep, reg); in cdns3_gadget_ep_enable()
1844 if (priv_ep->type == USB_ENDPOINT_XFER_ISOC && !priv_ep->dir) in cdns3_gadget_ep_enable()
1851 priv_ep->flags &= ~(EP_PENDING_REQUEST | EP_STALLED | EP_STALL_PENDING | in cdns3_gadget_ep_enable()
1853 priv_ep->flags |= EP_ENABLED | EP_UPDATE_EP_TRBADDR; in cdns3_gadget_ep_enable()
1854 priv_ep->wa1_set = 0; in cdns3_gadget_ep_enable()
1855 priv_ep->enqueue = 0; in cdns3_gadget_ep_enable()
1856 priv_ep->dequeue = 0; in cdns3_gadget_ep_enable()
1858 priv_ep->pcs = !!EP_STS_CCS(reg); in cdns3_gadget_ep_enable()
1859 priv_ep->ccs = !!EP_STS_CCS(reg); in cdns3_gadget_ep_enable()
1861 priv_ep->free_trbs = priv_ep->num_trbs - 1; in cdns3_gadget_ep_enable()
1876 struct cdns3_endpoint *priv_ep; in cdns3_gadget_ep_disable() local
1890 priv_ep = ep_to_cdns3_ep(ep); in cdns3_gadget_ep_disable()
1891 priv_dev = priv_ep->cdns3_dev; in cdns3_gadget_ep_disable()
1893 if (WARN_ON(!(priv_ep->flags & EP_ENABLED))) in cdns3_gadget_ep_disable()
1898 trace_cdns3_gadget_ep_disable(priv_ep); in cdns3_gadget_ep_disable()
1920 priv_ep->name); in cdns3_gadget_ep_disable()
1922 while (!list_empty(&priv_ep->pending_req_list)) { in cdns3_gadget_ep_disable()
1923 request = cdns3_next_request(&priv_ep->pending_req_list); in cdns3_gadget_ep_disable()
1925 cdns3_gadget_giveback(priv_ep, to_cdns3_request(request), in cdns3_gadget_ep_disable()
1929 while (!list_empty(&priv_ep->wa2_descmiss_req_list)) { in cdns3_gadget_ep_disable()
1930 priv_req = cdns3_next_priv_request(&priv_ep->wa2_descmiss_req_list); in cdns3_gadget_ep_disable()
1933 cdns3_gadget_ep_free_request(&priv_ep->endpoint, in cdns3_gadget_ep_disable()
1936 --priv_ep->wa2_counter; in cdns3_gadget_ep_disable()
1939 while (!list_empty(&priv_ep->deferred_req_list)) { in cdns3_gadget_ep_disable()
1940 request = cdns3_next_request(&priv_ep->deferred_req_list); in cdns3_gadget_ep_disable()
1942 cdns3_gadget_giveback(priv_ep, to_cdns3_request(request), in cdns3_gadget_ep_disable()
1946 priv_ep->descmis_req = NULL; in cdns3_gadget_ep_disable()
1949 priv_ep->flags &= ~EP_ENABLED; in cdns3_gadget_ep_disable()
1968 struct cdns3_endpoint *priv_ep = ep_to_cdns3_ep(ep); in __cdns3_gadget_ep_queue() local
1969 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in __cdns3_gadget_ep_queue()
1979 ret = cdns3_wa2_gadget_ep_queue(priv_dev, priv_ep, in __cdns3_gadget_ep_queue()
1995 list_add_tail(&request->list, &priv_ep->deferred_req_list); in __cdns3_gadget_ep_queue()
2002 if (priv_dev->hw_configured_flag && !(priv_ep->flags & EP_STALLED) && in __cdns3_gadget_ep_queue()
2003 !(priv_ep->flags & EP_STALL_PENDING)) in __cdns3_gadget_ep_queue()
2004 cdns3_start_all_request(priv_dev, priv_ep); in __cdns3_gadget_ep_queue()
2013 struct cdns3_endpoint *priv_ep; in cdns3_gadget_ep_queue() local
2021 priv_ep = ep_to_cdns3_ep(ep); in cdns3_gadget_ep_queue()
2022 priv_dev = priv_ep->cdns3_dev; in cdns3_gadget_ep_queue()
2040 priv_ep->name); in cdns3_gadget_ep_queue()
2058 struct cdns3_endpoint *priv_ep = ep_to_cdns3_ep(ep); in cdns3_gadget_ep_dequeue() local
2059 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in cdns3_gadget_ep_dequeue()
2077 list_for_each_entry_safe(req, req_temp, &priv_ep->pending_req_list, in cdns3_gadget_ep_dequeue()
2083 list_for_each_entry_safe(req, req_temp, &priv_ep->deferred_req_list, in cdns3_gadget_ep_dequeue()
2093 if (priv_ep->wa1_trb == priv_req->trb) in cdns3_gadget_ep_dequeue()
2094 cdns3_wa1_restore_cycle_bit(priv_ep); in cdns3_gadget_ep_dequeue()
2098 cdns3_gadget_giveback(priv_ep, priv_req, -ECONNRESET); in cdns3_gadget_ep_dequeue()
2101 request = cdns3_next_request(&priv_ep->deferred_req_list); in cdns3_gadget_ep_dequeue()
2105 link_trb->buffer = TRB_BUFFER(priv_ep->trb_pool_dma + in cdns3_gadget_ep_dequeue()
2110 priv_ep->flags |= EP_UPDATE_EP_TRBADDR; in cdns3_gadget_ep_dequeue()
2123 void __cdns3_gadget_ep_set_halt(struct cdns3_endpoint *priv_ep) in __cdns3_gadget_ep_set_halt() argument
2125 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in __cdns3_gadget_ep_set_halt()
2127 trace_cdns3_halt(priv_ep, 1, 0); in __cdns3_gadget_ep_set_halt()
2129 if (!(priv_ep->flags & EP_STALLED)) { in __cdns3_gadget_ep_set_halt()
2133 cdns3_ep_stall_flush(priv_ep); in __cdns3_gadget_ep_set_halt()
2135 priv_ep->flags |= EP_STALL_PENDING; in __cdns3_gadget_ep_set_halt()
2144 int __cdns3_gadget_ep_clear_halt(struct cdns3_endpoint *priv_ep) in __cdns3_gadget_ep_clear_halt() argument
2146 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in __cdns3_gadget_ep_clear_halt()
2151 trace_cdns3_halt(priv_ep, 0, 0); in __cdns3_gadget_ep_clear_halt()
2161 priv_ep->flags &= ~(EP_STALLED | EP_STALL_PENDING); in __cdns3_gadget_ep_clear_halt()
2163 request = cdns3_next_request(&priv_ep->pending_req_list); in __cdns3_gadget_ep_clear_halt()
2166 cdns3_rearm_transfer(priv_ep, 1); in __cdns3_gadget_ep_clear_halt()
2168 cdns3_start_all_request(priv_dev, priv_ep); in __cdns3_gadget_ep_clear_halt()
2181 struct cdns3_endpoint *priv_ep = ep_to_cdns3_ep(ep); in cdns3_gadget_ep_set_halt() local
2182 struct cdns3_device *priv_dev = priv_ep->cdns3_dev; in cdns3_gadget_ep_set_halt()
2186 if (!(priv_ep->flags & EP_ENABLED)) in cdns3_gadget_ep_set_halt()
2194 priv_ep->flags &= ~EP_WEDGE; in cdns3_gadget_ep_set_halt()
2195 ret = __cdns3_gadget_ep_clear_halt(priv_ep); in cdns3_gadget_ep_set_halt()
2197 __cdns3_gadget_ep_set_halt(priv_ep); in cdns3_gadget_ep_set_halt()
2353 struct cdns3_endpoint *priv_ep; in cdns3_gadget_udc_stop() local
2366 priv_ep = ep_to_cdns3_ep(ep); in cdns3_gadget_udc_stop()
2367 bEndpointAddress = priv_ep->num | priv_ep->dir; in cdns3_gadget_udc_stop()
2438 struct cdns3_endpoint *priv_ep; in cdns3_init_eps() local
2463 priv_ep = devm_kzalloc(priv_dev->dev, sizeof(*priv_ep), in cdns3_init_eps()
2465 if (!priv_ep) { in cdns3_init_eps()
2471 priv_ep->cdns3_dev = priv_dev; in cdns3_init_eps()
2472 priv_dev->eps[i] = priv_ep; in cdns3_init_eps()
2473 priv_ep->num = ep_number; in cdns3_init_eps()
2474 priv_ep->dir = ep_dir ? USB_DIR_IN : USB_DIR_OUT; in cdns3_init_eps()
2477 ret = cdns3_init_ep0(priv_dev, priv_ep); in cdns3_init_eps()
2483 snprintf(priv_ep->name, sizeof(priv_ep->name), "ep%d%s", in cdns3_init_eps()
2485 priv_ep->endpoint.name = priv_ep->name; in cdns3_init_eps()
2487 usb_ep_set_maxpacket_limit(&priv_ep->endpoint, in cdns3_init_eps()
2489 priv_ep->endpoint.max_streams = CDNS3_EP_MAX_STREAMS; in cdns3_init_eps()
2490 priv_ep->endpoint.ops = &cdns3_gadget_ep_ops; in cdns3_init_eps()
2492 priv_ep->endpoint.caps.dir_in = 1; in cdns3_init_eps()
2494 priv_ep->endpoint.caps.dir_out = 1; in cdns3_init_eps()
2497 priv_ep->endpoint.caps.type_iso = 1; in cdns3_init_eps()
2499 priv_ep->endpoint.caps.type_bulk = 1; in cdns3_init_eps()
2500 priv_ep->endpoint.caps.type_int = 1; in cdns3_init_eps()
2502 list_add_tail(&priv_ep->endpoint.ep_list, in cdns3_init_eps()
2506 priv_ep->flags = 0; in cdns3_init_eps()
2509 priv_ep->name, in cdns3_init_eps()
2510 priv_ep->endpoint.caps.type_bulk ? "BULK, INT" : "", in cdns3_init_eps()
2511 priv_ep->endpoint.caps.type_iso ? "ISO" : ""); in cdns3_init_eps()
2513 INIT_LIST_HEAD(&priv_ep->pending_req_list); in cdns3_init_eps()
2514 INIT_LIST_HEAD(&priv_ep->deferred_req_list); in cdns3_init_eps()
2515 INIT_LIST_HEAD(&priv_ep->wa2_descmiss_req_list); in cdns3_init_eps()