Lines Matching refs:hsotg

56 static void dwc2_track_missed_sofs(struct dwc2_hsotg *hsotg)  in dwc2_track_missed_sofs()  argument
59 u16 curr_frame_number = hsotg->frame_number; in dwc2_track_missed_sofs()
61 if (hsotg->frame_num_idx < FRAME_NUM_ARRAY_SIZE) { in dwc2_track_missed_sofs()
62 if (((hsotg->last_frame_num + 1) & HFNUM_MAX_FRNUM) != in dwc2_track_missed_sofs()
64 hsotg->frame_num_array[hsotg->frame_num_idx] = in dwc2_track_missed_sofs()
66 hsotg->last_frame_num_array[hsotg->frame_num_idx] = in dwc2_track_missed_sofs()
67 hsotg->last_frame_num; in dwc2_track_missed_sofs()
68 hsotg->frame_num_idx++; in dwc2_track_missed_sofs()
70 } else if (!hsotg->dumped_frame_num_array) { in dwc2_track_missed_sofs()
73 dev_info(hsotg->dev, "Frame Last Frame\n"); in dwc2_track_missed_sofs()
74 dev_info(hsotg->dev, "----- ----------\n"); in dwc2_track_missed_sofs()
76 dev_info(hsotg->dev, "0x%04x 0x%04x\n", in dwc2_track_missed_sofs()
77 hsotg->frame_num_array[i], in dwc2_track_missed_sofs()
78 hsotg->last_frame_num_array[i]); in dwc2_track_missed_sofs()
80 hsotg->dumped_frame_num_array = 1; in dwc2_track_missed_sofs()
82 hsotg->last_frame_num = curr_frame_number; in dwc2_track_missed_sofs()
86 static void dwc2_hc_handle_tt_clear(struct dwc2_hsotg *hsotg, in dwc2_hc_handle_tt_clear() argument
119 static void dwc2_sof_intr(struct dwc2_hsotg *hsotg) in dwc2_sof_intr() argument
126 dev_vdbg(hsotg->dev, "--Start of Frame Interrupt--\n"); in dwc2_sof_intr()
129 hsotg->frame_number = dwc2_hcd_get_frame_number(hsotg); in dwc2_sof_intr()
131 dwc2_track_missed_sofs(hsotg); in dwc2_sof_intr()
134 qh_entry = hsotg->periodic_sched_inactive.next; in dwc2_sof_intr()
135 while (qh_entry != &hsotg->periodic_sched_inactive) { in dwc2_sof_intr()
138 if (dwc2_frame_num_le(qh->sched_frame, hsotg->frame_number)) in dwc2_sof_intr()
144 &hsotg->periodic_sched_ready); in dwc2_sof_intr()
146 tr_type = dwc2_hcd_select_transactions(hsotg); in dwc2_sof_intr()
148 dwc2_hcd_queue_transactions(hsotg, tr_type); in dwc2_sof_intr()
151 dwc2_writel(GINTSTS_SOF, hsotg->regs + GINTSTS); in dwc2_sof_intr()
159 static void dwc2_rx_fifo_level_intr(struct dwc2_hsotg *hsotg) in dwc2_rx_fifo_level_intr() argument
165 dev_vdbg(hsotg->dev, "--RxFIFO Level Interrupt--\n"); in dwc2_rx_fifo_level_intr()
167 grxsts = dwc2_readl(hsotg->regs + GRXSTSP); in dwc2_rx_fifo_level_intr()
169 chan = hsotg->hc_ptr_array[chnum]; in dwc2_rx_fifo_level_intr()
171 dev_err(hsotg->dev, "Unable to get corresponding channel\n"); in dwc2_rx_fifo_level_intr()
181 dev_vdbg(hsotg->dev, " Ch num = %d\n", chnum); in dwc2_rx_fifo_level_intr()
182 dev_vdbg(hsotg->dev, " Count = %d\n", bcnt); in dwc2_rx_fifo_level_intr()
183 dev_vdbg(hsotg->dev, " DPID = %d, chan.dpid = %d\n", dpid, in dwc2_rx_fifo_level_intr()
185 dev_vdbg(hsotg->dev, " PStatus = %d\n", pktsts); in dwc2_rx_fifo_level_intr()
192 dwc2_read_packet(hsotg, chan->xfer_buf, bcnt); in dwc2_rx_fifo_level_intr()
205 dev_err(hsotg->dev, in dwc2_rx_fifo_level_intr()
217 static void dwc2_np_tx_fifo_empty_intr(struct dwc2_hsotg *hsotg) in dwc2_np_tx_fifo_empty_intr() argument
219 dev_vdbg(hsotg->dev, "--Non-Periodic TxFIFO Empty Interrupt--\n"); in dwc2_np_tx_fifo_empty_intr()
220 dwc2_hcd_queue_transactions(hsotg, DWC2_TRANSACTION_NON_PERIODIC); in dwc2_np_tx_fifo_empty_intr()
229 static void dwc2_perio_tx_fifo_empty_intr(struct dwc2_hsotg *hsotg) in dwc2_perio_tx_fifo_empty_intr() argument
232 dev_vdbg(hsotg->dev, "--Periodic TxFIFO Empty Interrupt--\n"); in dwc2_perio_tx_fifo_empty_intr()
233 dwc2_hcd_queue_transactions(hsotg, DWC2_TRANSACTION_PERIODIC); in dwc2_perio_tx_fifo_empty_intr()
236 static void dwc2_hprt0_enable(struct dwc2_hsotg *hsotg, u32 hprt0, in dwc2_hprt0_enable() argument
239 struct dwc2_core_params *params = hsotg->core_params; in dwc2_hprt0_enable()
247 dev_vdbg(hsotg->dev, "%s(%p)\n", __func__, hsotg); in dwc2_hprt0_enable()
250 hfir = dwc2_readl(hsotg->regs + HFIR); in dwc2_hprt0_enable()
252 hfir |= dwc2_calc_frame_interval(hsotg) << HFIR_FRINT_SHIFT & in dwc2_hprt0_enable()
254 dwc2_writel(hfir, hsotg->regs + HFIR); in dwc2_hprt0_enable()
259 hsotg->flags.b.port_reset_change = 1; in dwc2_hprt0_enable()
263 usbcfg = dwc2_readl(hsotg->regs + GUSBCFG); in dwc2_hprt0_enable()
271 dwc2_writel(usbcfg, hsotg->regs + GUSBCFG); in dwc2_hprt0_enable()
275 hcfg = dwc2_readl(hsotg->regs + HCFG); in dwc2_hprt0_enable()
283 dev_vdbg(hsotg->dev, in dwc2_hprt0_enable()
289 dwc2_writel(hcfg, hsotg->regs + HCFG); in dwc2_hprt0_enable()
294 dev_vdbg(hsotg->dev, in dwc2_hprt0_enable()
300 dwc2_writel(hcfg, hsotg->regs + HCFG); in dwc2_hprt0_enable()
308 dwc2_writel(usbcfg, hsotg->regs + GUSBCFG); in dwc2_hprt0_enable()
315 queue_delayed_work(hsotg->wq_otg, &hsotg->reset_work, in dwc2_hprt0_enable()
319 hsotg->flags.b.port_reset_change = 1; in dwc2_hprt0_enable()
328 static void dwc2_port_intr(struct dwc2_hsotg *hsotg) in dwc2_port_intr() argument
333 dev_vdbg(hsotg->dev, "--Port Interrupt--\n"); in dwc2_port_intr()
335 hprt0 = dwc2_readl(hsotg->regs + HPRT0); in dwc2_port_intr()
350 dev_vdbg(hsotg->dev, in dwc2_port_intr()
353 if (hsotg->lx_state != DWC2_L0) in dwc2_port_intr()
354 usb_hcd_resume_root_hub(hsotg->priv); in dwc2_port_intr()
356 hsotg->flags.b.port_connect_status_change = 1; in dwc2_port_intr()
357 hsotg->flags.b.port_connect_status = 1; in dwc2_port_intr()
371 dev_vdbg(hsotg->dev, in dwc2_port_intr()
376 dwc2_hprt0_enable(hsotg, hprt0, &hprt0_modify); in dwc2_port_intr()
378 hsotg->flags.b.port_enable_change = 1; in dwc2_port_intr()
383 dev_vdbg(hsotg->dev, in dwc2_port_intr()
386 hsotg->flags.b.port_over_current_change = 1; in dwc2_port_intr()
391 dwc2_writel(hprt0_modify, hsotg->regs + HPRT0); in dwc2_port_intr()
403 static u32 dwc2_get_actual_xfer_length(struct dwc2_hsotg *hsotg, in dwc2_get_actual_xfer_length() argument
411 hctsiz = dwc2_readl(hsotg->regs + HCTSIZ(chnum)); in dwc2_get_actual_xfer_length()
451 static int dwc2_update_urb_state(struct dwc2_hsotg *hsotg, in dwc2_update_urb_state() argument
459 int xfer_length = dwc2_get_actual_xfer_length(hsotg, chan, chnum, qtd, in dwc2_update_urb_state()
464 dev_warn(hsotg->dev, "%s(): trimming xfer length\n", __func__); in dwc2_update_urb_state()
470 dev_vdbg(hsotg->dev, "%s(): non-aligned buffer\n", __func__); in dwc2_update_urb_state()
471 dma_unmap_single(hsotg->dev, chan->qh->dw_align_buf_dma, in dwc2_update_urb_state()
480 dev_vdbg(hsotg->dev, "urb->actual_length=%d xfer_length=%d\n", in dwc2_update_urb_state()
494 hctsiz = dwc2_readl(hsotg->regs + HCTSIZ(chnum)); in dwc2_update_urb_state()
495 dev_vdbg(hsotg->dev, "DWC_otg: %s: %s, channel %d\n", in dwc2_update_urb_state()
497 dev_vdbg(hsotg->dev, " chan->xfer_len %d\n", chan->xfer_len); in dwc2_update_urb_state()
498 dev_vdbg(hsotg->dev, " hctsiz.xfersize %d\n", in dwc2_update_urb_state()
500 dev_vdbg(hsotg->dev, " urb->transfer_buffer_length %d\n", urb->length); in dwc2_update_urb_state()
501 dev_vdbg(hsotg->dev, " urb->actual_length %d\n", urb->actual_length); in dwc2_update_urb_state()
502 dev_vdbg(hsotg->dev, " short_read %d, xfer_done %d\n", short_read, in dwc2_update_urb_state()
513 void dwc2_hcd_save_data_toggle(struct dwc2_hsotg *hsotg, in dwc2_hcd_save_data_toggle() argument
517 u32 hctsiz = dwc2_readl(hsotg->regs + HCTSIZ(chnum)); in dwc2_hcd_save_data_toggle()
544 struct dwc2_hsotg *hsotg, struct dwc2_host_chan *chan, in dwc2_update_isoc_urb_state() argument
559 frame_desc->actual_length = dwc2_get_actual_xfer_length(hsotg, in dwc2_update_isoc_urb_state()
564 dev_vdbg(hsotg->dev, "%s(): non-aligned buffer\n", in dwc2_update_isoc_urb_state()
566 dma_unmap_single(hsotg->dev, chan->qh->dw_align_buf_dma, in dwc2_update_isoc_urb_state()
593 frame_desc->actual_length = dwc2_get_actual_xfer_length(hsotg, in dwc2_update_isoc_urb_state()
598 dev_vdbg(hsotg->dev, "%s(): non-aligned buffer\n", in dwc2_update_isoc_urb_state()
600 dma_unmap_single(hsotg->dev, chan->qh->dw_align_buf_dma, in dwc2_update_isoc_urb_state()
614 hsotg->core_params->dma_enable > 0) { in dwc2_update_isoc_urb_state()
621 dev_err(hsotg->dev, "Unhandled halt_status (%d)\n", in dwc2_update_isoc_urb_state()
631 dwc2_host_complete(hsotg, qtd, 0); in dwc2_update_isoc_urb_state()
647 static void dwc2_deactivate_qh(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh, in dwc2_deactivate_qh() argument
654 dev_vdbg(hsotg->dev, " %s(%p,%p,%d)\n", __func__, in dwc2_deactivate_qh()
655 hsotg, qh, free_qtd); in dwc2_deactivate_qh()
658 dev_dbg(hsotg->dev, "## QTD list empty ##\n"); in dwc2_deactivate_qh()
671 dwc2_hcd_qtd_unlink_and_free(hsotg, qtd, qh); in dwc2_deactivate_qh()
679 dwc2_hcd_qh_deactivate(hsotg, qh, continue_split); in dwc2_deactivate_qh()
695 static void dwc2_release_channel(struct dwc2_hsotg *hsotg, in dwc2_release_channel() argument
705 dev_vdbg(hsotg->dev, " %s: channel %d, halt_status %d\n", in dwc2_release_channel()
719 dev_vdbg(hsotg->dev, in dwc2_release_channel()
722 dwc2_host_complete(hsotg, qtd, -EPROTO); in dwc2_release_channel()
733 dev_vdbg(hsotg->dev, " Complete URB with I/O error\n"); in dwc2_release_channel()
735 dwc2_host_complete(hsotg, qtd, -EIO); in dwc2_release_channel()
742 dwc2_deactivate_qh(hsotg, chan->qh, free_qtd); in dwc2_release_channel()
752 dwc2_hc_cleanup(hsotg, chan); in dwc2_release_channel()
753 list_add_tail(&chan->hc_list_entry, &hsotg->free_hc_list); in dwc2_release_channel()
755 if (hsotg->core_params->uframe_sched > 0) { in dwc2_release_channel()
756 hsotg->available_host_channels++; in dwc2_release_channel()
761 hsotg->non_periodic_channels--; in dwc2_release_channel()
774 haintmsk = dwc2_readl(hsotg->regs + HAINTMSK); in dwc2_release_channel()
776 dwc2_writel(haintmsk, hsotg->regs + HAINTMSK); in dwc2_release_channel()
779 tr_type = dwc2_hcd_select_transactions(hsotg); in dwc2_release_channel()
781 dwc2_hcd_queue_transactions(hsotg, tr_type); in dwc2_release_channel()
794 static void dwc2_halt_channel(struct dwc2_hsotg *hsotg, in dwc2_halt_channel() argument
799 dev_vdbg(hsotg->dev, "%s()\n", __func__); in dwc2_halt_channel()
801 if (hsotg->core_params->dma_enable > 0) { in dwc2_halt_channel()
803 dev_vdbg(hsotg->dev, "DMA enabled\n"); in dwc2_halt_channel()
804 dwc2_release_channel(hsotg, chan, qtd, halt_status); in dwc2_halt_channel()
809 dwc2_hc_halt(hsotg, chan, halt_status); in dwc2_halt_channel()
814 dev_vdbg(hsotg->dev, "Halt on queue\n"); in dwc2_halt_channel()
817 dev_vdbg(hsotg->dev, "control/bulk\n"); in dwc2_halt_channel()
823 gintmsk = dwc2_readl(hsotg->regs + GINTMSK); in dwc2_halt_channel()
825 dwc2_writel(gintmsk, hsotg->regs + GINTMSK); in dwc2_halt_channel()
827 dev_vdbg(hsotg->dev, "isoc/intr\n"); in dwc2_halt_channel()
835 &hsotg->periodic_sched_assigned); in dwc2_halt_channel()
842 gintmsk = dwc2_readl(hsotg->regs + GINTMSK); in dwc2_halt_channel()
844 dwc2_writel(gintmsk, hsotg->regs + GINTMSK); in dwc2_halt_channel()
854 static void dwc2_complete_non_periodic_xfer(struct dwc2_hsotg *hsotg, in dwc2_complete_non_periodic_xfer() argument
859 dev_vdbg(hsotg->dev, "%s()\n", __func__); in dwc2_complete_non_periodic_xfer()
869 dev_vdbg(hsotg->dev, "got NYET\n"); in dwc2_complete_non_periodic_xfer()
889 dwc2_halt_channel(hsotg, chan, qtd, halt_status); in dwc2_complete_non_periodic_xfer()
895 dwc2_release_channel(hsotg, chan, qtd, halt_status); in dwc2_complete_non_periodic_xfer()
904 static void dwc2_complete_periodic_xfer(struct dwc2_hsotg *hsotg, in dwc2_complete_periodic_xfer() argument
909 u32 hctsiz = dwc2_readl(hsotg->regs + HCTSIZ(chnum)); in dwc2_complete_periodic_xfer()
915 dwc2_release_channel(hsotg, chan, qtd, halt_status); in dwc2_complete_periodic_xfer()
918 dwc2_halt_channel(hsotg, chan, qtd, halt_status); in dwc2_complete_periodic_xfer()
921 static int dwc2_xfercomp_isoc_split_in(struct dwc2_hsotg *hsotg, in dwc2_xfercomp_isoc_split_in() argument
932 len = dwc2_get_actual_xfer_length(hsotg, chan, chnum, qtd, in dwc2_xfercomp_isoc_split_in()
943 dev_vdbg(hsotg->dev, "%s(): non-aligned buffer\n", __func__); in dwc2_xfercomp_isoc_split_in()
944 dma_unmap_single(hsotg->dev, chan->qh->dw_align_buf_dma, in dwc2_xfercomp_isoc_split_in()
960 dwc2_host_complete(hsotg, qtd, 0); in dwc2_xfercomp_isoc_split_in()
961 dwc2_release_channel(hsotg, chan, qtd, in dwc2_xfercomp_isoc_split_in()
964 dwc2_release_channel(hsotg, chan, qtd, in dwc2_xfercomp_isoc_split_in()
975 static void dwc2_hc_xfercomp_intr(struct dwc2_hsotg *hsotg, in dwc2_hc_xfercomp_intr() argument
985 dev_vdbg(hsotg->dev, in dwc2_hc_xfercomp_intr()
994 if (hsotg->core_params->dma_desc_enable > 0) { in dwc2_hc_xfercomp_intr()
995 dwc2_hcd_complete_xfer_ddma(hsotg, chan, chnum, halt_status); in dwc2_hc_xfercomp_intr()
1005 hsotg->core_params->dma_enable > 0) { in dwc2_hc_xfercomp_intr()
1007 dwc2_xfercomp_isoc_split_in(hsotg, chan, chnum, in dwc2_hc_xfercomp_intr()
1024 dev_vdbg(hsotg->dev, in dwc2_hc_xfercomp_intr()
1029 urb_xfer_done = dwc2_update_urb_state(hsotg, chan, in dwc2_hc_xfercomp_intr()
1033 dev_vdbg(hsotg->dev, in dwc2_hc_xfercomp_intr()
1036 dwc2_hcd_save_data_toggle(hsotg, chan, chnum, in dwc2_hc_xfercomp_intr()
1042 dev_vdbg(hsotg->dev, " Control transfer complete\n"); in dwc2_hc_xfercomp_intr()
1045 dwc2_host_complete(hsotg, qtd, urb->status); in dwc2_hc_xfercomp_intr()
1050 dwc2_complete_non_periodic_xfer(hsotg, chan, chnum, qtd, in dwc2_hc_xfercomp_intr()
1054 dev_vdbg(hsotg->dev, " Bulk transfer complete\n"); in dwc2_hc_xfercomp_intr()
1055 urb_xfer_done = dwc2_update_urb_state(hsotg, chan, chnum, urb, in dwc2_hc_xfercomp_intr()
1058 dwc2_host_complete(hsotg, qtd, urb->status); in dwc2_hc_xfercomp_intr()
1064 dwc2_hcd_save_data_toggle(hsotg, chan, chnum, qtd); in dwc2_hc_xfercomp_intr()
1065 dwc2_complete_non_periodic_xfer(hsotg, chan, chnum, qtd, in dwc2_hc_xfercomp_intr()
1069 dev_vdbg(hsotg->dev, " Interrupt transfer complete\n"); in dwc2_hc_xfercomp_intr()
1070 urb_xfer_done = dwc2_update_urb_state(hsotg, chan, chnum, urb, in dwc2_hc_xfercomp_intr()
1078 dwc2_host_complete(hsotg, qtd, urb->status); in dwc2_hc_xfercomp_intr()
1084 dwc2_hcd_save_data_toggle(hsotg, chan, chnum, qtd); in dwc2_hc_xfercomp_intr()
1085 dwc2_complete_periodic_xfer(hsotg, chan, chnum, qtd, in dwc2_hc_xfercomp_intr()
1090 dev_vdbg(hsotg->dev, " Isochronous transfer complete\n"); in dwc2_hc_xfercomp_intr()
1092 halt_status = dwc2_update_isoc_urb_state(hsotg, chan, in dwc2_hc_xfercomp_intr()
1094 dwc2_complete_periodic_xfer(hsotg, chan, chnum, qtd, in dwc2_hc_xfercomp_intr()
1100 disable_hc_int(hsotg, chnum, HCINTMSK_XFERCOMPL); in dwc2_hc_xfercomp_intr()
1107 static void dwc2_hc_stall_intr(struct dwc2_hsotg *hsotg, in dwc2_hc_stall_intr() argument
1114 dev_dbg(hsotg->dev, "--Host Channel %d Interrupt: STALL Received--\n", in dwc2_hc_stall_intr()
1117 if (hsotg->core_params->dma_desc_enable > 0) { in dwc2_hc_stall_intr()
1118 dwc2_hcd_complete_xfer_ddma(hsotg, chan, chnum, in dwc2_hc_stall_intr()
1129 dwc2_host_complete(hsotg, qtd, -EPIPE); in dwc2_hc_stall_intr()
1133 dwc2_host_complete(hsotg, qtd, -EPIPE); in dwc2_hc_stall_intr()
1145 dwc2_halt_channel(hsotg, chan, qtd, DWC2_HC_XFER_STALL); in dwc2_hc_stall_intr()
1148 disable_hc_int(hsotg, chnum, HCINTMSK_STALL); in dwc2_hc_stall_intr()
1157 static void dwc2_update_urb_state_abn(struct dwc2_hsotg *hsotg, in dwc2_update_urb_state_abn() argument
1163 u32 xfer_length = dwc2_get_actual_xfer_length(hsotg, chan, chnum, in dwc2_update_urb_state_abn()
1168 dev_warn(hsotg->dev, "%s(): trimming xfer length\n", __func__); in dwc2_update_urb_state_abn()
1174 dev_vdbg(hsotg->dev, "%s(): non-aligned buffer\n", __func__); in dwc2_update_urb_state_abn()
1175 dma_unmap_single(hsotg->dev, chan->qh->dw_align_buf_dma, in dwc2_update_urb_state_abn()
1187 hctsiz = dwc2_readl(hsotg->regs + HCTSIZ(chnum)); in dwc2_update_urb_state_abn()
1188 dev_vdbg(hsotg->dev, "DWC_otg: %s: %s, channel %d\n", in dwc2_update_urb_state_abn()
1190 dev_vdbg(hsotg->dev, " chan->start_pkt_count %d\n", in dwc2_update_urb_state_abn()
1192 dev_vdbg(hsotg->dev, " hctsiz.pktcnt %d\n", in dwc2_update_urb_state_abn()
1194 dev_vdbg(hsotg->dev, " chan->max_packet %d\n", chan->max_packet); in dwc2_update_urb_state_abn()
1195 dev_vdbg(hsotg->dev, " bytes_transferred %d\n", in dwc2_update_urb_state_abn()
1197 dev_vdbg(hsotg->dev, " urb->actual_length %d\n", in dwc2_update_urb_state_abn()
1199 dev_vdbg(hsotg->dev, " urb->transfer_buffer_length %d\n", in dwc2_update_urb_state_abn()
1207 static void dwc2_hc_nak_intr(struct dwc2_hsotg *hsotg, in dwc2_hc_nak_intr() argument
1212 dev_dbg(hsotg->dev, "%s: qtd is NULL\n", __func__); in dwc2_hc_nak_intr()
1217 dev_dbg(hsotg->dev, "%s: qtd->urb is NULL\n", __func__); in dwc2_hc_nak_intr()
1222 dev_vdbg(hsotg->dev, "--Host Channel %d Interrupt: NAK Received--\n", in dwc2_hc_nak_intr()
1233 dwc2_halt_channel(hsotg, chan, qtd, DWC2_HC_XFER_NAK); in dwc2_hc_nak_intr()
1240 if (hsotg->core_params->dma_enable > 0 && chan->ep_is_in) { in dwc2_hc_nak_intr()
1259 dwc2_update_urb_state_abn(hsotg, chan, chnum, qtd->urb, in dwc2_hc_nak_intr()
1261 dwc2_hcd_save_data_toggle(hsotg, chan, chnum, qtd); in dwc2_hc_nak_intr()
1272 dwc2_halt_channel(hsotg, chan, qtd, DWC2_HC_XFER_NAK); in dwc2_hc_nak_intr()
1276 dwc2_halt_channel(hsotg, chan, qtd, DWC2_HC_XFER_NAK); in dwc2_hc_nak_intr()
1280 dev_err(hsotg->dev, "NACK interrupt for ISOC transfer\n"); in dwc2_hc_nak_intr()
1285 disable_hc_int(hsotg, chnum, HCINTMSK_NAK); in dwc2_hc_nak_intr()
1293 static void dwc2_hc_ack_intr(struct dwc2_hsotg *hsotg, in dwc2_hc_ack_intr() argument
1300 dev_vdbg(hsotg->dev, "--Host Channel %d Interrupt: ACK Received--\n", in dwc2_hc_ack_intr()
1311 dwc2_halt_channel(hsotg, chan, qtd, DWC2_HC_XFER_ACK); in dwc2_hc_ack_intr()
1354 dwc2_halt_channel(hsotg, chan, qtd, DWC2_HC_XFER_ACK); in dwc2_hc_ack_intr()
1362 disable_hc_int(hsotg, chnum, HCINTMSK_ACK); in dwc2_hc_ack_intr()
1372 static void dwc2_hc_nyet_intr(struct dwc2_hsotg *hsotg, in dwc2_hc_nyet_intr() argument
1377 dev_vdbg(hsotg->dev, "--Host Channel %d Interrupt: NYET Received--\n", in dwc2_hc_nyet_intr()
1386 hsotg->core_params->dma_enable > 0) { in dwc2_hc_nyet_intr()
1392 dwc2_host_complete(hsotg, qtd, 0); in dwc2_hc_nyet_intr()
1393 dwc2_release_channel(hsotg, chan, qtd, in dwc2_hc_nyet_intr()
1396 dwc2_release_channel(hsotg, chan, qtd, in dwc2_hc_nyet_intr()
1404 int frnum = dwc2_hcd_get_frame_number(hsotg); in dwc2_hc_nyet_intr()
1423 dwc2_halt_channel(hsotg, chan, qtd, in dwc2_hc_nyet_intr()
1430 dwc2_halt_channel(hsotg, chan, qtd, DWC2_HC_XFER_NYET); in dwc2_hc_nyet_intr()
1437 dwc2_update_urb_state_abn(hsotg, chan, chnum, qtd->urb, qtd, in dwc2_hc_nyet_intr()
1439 dwc2_hcd_save_data_toggle(hsotg, chan, chnum, qtd); in dwc2_hc_nyet_intr()
1445 dwc2_halt_channel(hsotg, chan, qtd, DWC2_HC_XFER_NYET); in dwc2_hc_nyet_intr()
1448 disable_hc_int(hsotg, chnum, HCINTMSK_NYET); in dwc2_hc_nyet_intr()
1455 static void dwc2_hc_babble_intr(struct dwc2_hsotg *hsotg, in dwc2_hc_babble_intr() argument
1459 dev_dbg(hsotg->dev, "--Host Channel %d Interrupt: Babble Error--\n", in dwc2_hc_babble_intr()
1462 dwc2_hc_handle_tt_clear(hsotg, chan, qtd); in dwc2_hc_babble_intr()
1464 if (hsotg->core_params->dma_desc_enable > 0) { in dwc2_hc_babble_intr()
1465 dwc2_hcd_complete_xfer_ddma(hsotg, chan, chnum, in dwc2_hc_babble_intr()
1471 dwc2_host_complete(hsotg, qtd, -EOVERFLOW); in dwc2_hc_babble_intr()
1472 dwc2_halt_channel(hsotg, chan, qtd, DWC2_HC_XFER_BABBLE_ERR); in dwc2_hc_babble_intr()
1476 halt_status = dwc2_update_isoc_urb_state(hsotg, chan, chnum, in dwc2_hc_babble_intr()
1478 dwc2_halt_channel(hsotg, chan, qtd, halt_status); in dwc2_hc_babble_intr()
1482 disable_hc_int(hsotg, chnum, HCINTMSK_BBLERR); in dwc2_hc_babble_intr()
1489 static void dwc2_hc_ahberr_intr(struct dwc2_hsotg *hsotg, in dwc2_hc_ahberr_intr() argument
1500 dev_dbg(hsotg->dev, "--Host Channel %d Interrupt: AHB Error--\n", in dwc2_hc_ahberr_intr()
1506 dwc2_hc_handle_tt_clear(hsotg, chan, qtd); in dwc2_hc_ahberr_intr()
1508 hcchar = dwc2_readl(hsotg->regs + HCCHAR(chnum)); in dwc2_hc_ahberr_intr()
1509 hcsplt = dwc2_readl(hsotg->regs + HCSPLT(chnum)); in dwc2_hc_ahberr_intr()
1510 hctsiz = dwc2_readl(hsotg->regs + HCTSIZ(chnum)); in dwc2_hc_ahberr_intr()
1511 hc_dma = dwc2_readl(hsotg->regs + HCDMA(chnum)); in dwc2_hc_ahberr_intr()
1513 dev_err(hsotg->dev, "AHB ERROR, Channel %d\n", chnum); in dwc2_hc_ahberr_intr()
1514 dev_err(hsotg->dev, " hcchar 0x%08x, hcsplt 0x%08x\n", hcchar, hcsplt); in dwc2_hc_ahberr_intr()
1515 dev_err(hsotg->dev, " hctsiz 0x%08x, hc_dma 0x%08x\n", hctsiz, hc_dma); in dwc2_hc_ahberr_intr()
1516 dev_err(hsotg->dev, " Device address: %d\n", in dwc2_hc_ahberr_intr()
1518 dev_err(hsotg->dev, " Endpoint: %d, %s\n", in dwc2_hc_ahberr_intr()
1540 dev_err(hsotg->dev, " Endpoint type: %s\n", pipetype); in dwc2_hc_ahberr_intr()
1557 dev_err(hsotg->dev, " Speed: %s\n", speed); in dwc2_hc_ahberr_intr()
1559 dev_err(hsotg->dev, " Max packet size: %d\n", in dwc2_hc_ahberr_intr()
1561 dev_err(hsotg->dev, " Data buffer length: %d\n", urb->length); in dwc2_hc_ahberr_intr()
1562 dev_err(hsotg->dev, " Transfer buffer: %p, Transfer DMA: %08lx\n", in dwc2_hc_ahberr_intr()
1564 dev_err(hsotg->dev, " Setup buffer: %p, Setup DMA: %08lx\n", in dwc2_hc_ahberr_intr()
1566 dev_err(hsotg->dev, " Interval: %d\n", urb->interval); in dwc2_hc_ahberr_intr()
1569 if (hsotg->core_params->dma_desc_enable > 0) { in dwc2_hc_ahberr_intr()
1570 dwc2_hcd_complete_xfer_ddma(hsotg, chan, chnum, in dwc2_hc_ahberr_intr()
1575 dwc2_host_complete(hsotg, qtd, -EIO); in dwc2_hc_ahberr_intr()
1582 dwc2_hc_halt(hsotg, chan, DWC2_HC_XFER_AHB_ERR); in dwc2_hc_ahberr_intr()
1585 disable_hc_int(hsotg, chnum, HCINTMSK_AHBERR); in dwc2_hc_ahberr_intr()
1592 static void dwc2_hc_xacterr_intr(struct dwc2_hsotg *hsotg, in dwc2_hc_xacterr_intr() argument
1596 dev_dbg(hsotg->dev, in dwc2_hc_xacterr_intr()
1599 dwc2_hc_handle_tt_clear(hsotg, chan, qtd); in dwc2_hc_xacterr_intr()
1601 if (hsotg->core_params->dma_desc_enable > 0) { in dwc2_hc_xacterr_intr()
1602 dwc2_hcd_complete_xfer_ddma(hsotg, chan, chnum, in dwc2_hc_xacterr_intr()
1613 dwc2_update_urb_state_abn(hsotg, chan, chnum, qtd->urb, in dwc2_hc_xacterr_intr()
1615 dwc2_hcd_save_data_toggle(hsotg, chan, chnum, qtd); in dwc2_hc_xacterr_intr()
1624 dwc2_halt_channel(hsotg, chan, qtd, DWC2_HC_XFER_XACT_ERR); in dwc2_hc_xacterr_intr()
1630 dwc2_halt_channel(hsotg, chan, qtd, DWC2_HC_XFER_XACT_ERR); in dwc2_hc_xacterr_intr()
1636 halt_status = dwc2_update_isoc_urb_state(hsotg, chan, in dwc2_hc_xacterr_intr()
1638 dwc2_halt_channel(hsotg, chan, qtd, halt_status); in dwc2_hc_xacterr_intr()
1644 disable_hc_int(hsotg, chnum, HCINTMSK_XACTERR); in dwc2_hc_xacterr_intr()
1651 static void dwc2_hc_frmovrun_intr(struct dwc2_hsotg *hsotg, in dwc2_hc_frmovrun_intr() argument
1658 dev_dbg(hsotg->dev, "--Host Channel %d Interrupt: Frame Overrun--\n", in dwc2_hc_frmovrun_intr()
1661 dwc2_hc_handle_tt_clear(hsotg, chan, qtd); in dwc2_hc_frmovrun_intr()
1668 dwc2_halt_channel(hsotg, chan, qtd, DWC2_HC_XFER_FRAME_OVERRUN); in dwc2_hc_frmovrun_intr()
1671 halt_status = dwc2_update_isoc_urb_state(hsotg, chan, chnum, in dwc2_hc_frmovrun_intr()
1673 dwc2_halt_channel(hsotg, chan, qtd, halt_status); in dwc2_hc_frmovrun_intr()
1677 disable_hc_int(hsotg, chnum, HCINTMSK_FRMOVRUN); in dwc2_hc_frmovrun_intr()
1684 static void dwc2_hc_datatglerr_intr(struct dwc2_hsotg *hsotg, in dwc2_hc_datatglerr_intr() argument
1688 dev_dbg(hsotg->dev, in dwc2_hc_datatglerr_intr()
1694 dev_err(hsotg->dev, in dwc2_hc_datatglerr_intr()
1698 dwc2_hc_handle_tt_clear(hsotg, chan, qtd); in dwc2_hc_datatglerr_intr()
1699 disable_hc_int(hsotg, chnum, HCINTMSK_DATATGLERR); in dwc2_hc_datatglerr_intr()
1709 static bool dwc2_halt_status_ok(struct dwc2_hsotg *hsotg, in dwc2_halt_status_ok() argument
1724 hcchar = dwc2_readl(hsotg->regs + HCCHAR(chnum)); in dwc2_halt_status_ok()
1725 hctsiz = dwc2_readl(hsotg->regs + HCTSIZ(chnum)); in dwc2_halt_status_ok()
1726 hcintmsk = dwc2_readl(hsotg->regs + HCINTMSK(chnum)); in dwc2_halt_status_ok()
1727 hcsplt = dwc2_readl(hsotg->regs + HCSPLT(chnum)); in dwc2_halt_status_ok()
1728 dev_dbg(hsotg->dev, in dwc2_halt_status_ok()
1731 dev_dbg(hsotg->dev, in dwc2_halt_status_ok()
1734 dev_dbg(hsotg->dev, in dwc2_halt_status_ok()
1738 dev_dbg(hsotg->dev, "qtd->complete_split %d\n", in dwc2_halt_status_ok()
1740 dev_warn(hsotg->dev, in dwc2_halt_status_ok()
1751 hcchar = dwc2_readl(hsotg->regs + HCCHAR(chnum)); in dwc2_halt_status_ok()
1753 dev_warn(hsotg->dev, in dwc2_halt_status_ok()
1757 dwc2_halt_channel(hsotg, chan, qtd, chan->halt_status); in dwc2_halt_status_ok()
1769 static void dwc2_hc_chhltd_intr_dma(struct dwc2_hsotg *hsotg, in dwc2_hc_chhltd_intr_dma() argument
1777 dev_vdbg(hsotg->dev, in dwc2_hc_chhltd_intr_dma()
1785 if (hsotg->hw_params.snpsid >= DWC2_CORE_REV_2_71a) { in dwc2_hc_chhltd_intr_dma()
1795 hsotg->core_params->dma_desc_enable <= 0)) { in dwc2_hc_chhltd_intr_dma()
1796 if (hsotg->core_params->dma_desc_enable > 0) in dwc2_hc_chhltd_intr_dma()
1797 dwc2_hcd_complete_xfer_ddma(hsotg, chan, chnum, in dwc2_hc_chhltd_intr_dma()
1806 dwc2_release_channel(hsotg, chan, qtd, in dwc2_hc_chhltd_intr_dma()
1811 hcintmsk = dwc2_readl(hsotg->regs + HCINTMSK(chnum)); in dwc2_hc_chhltd_intr_dma()
1822 dwc2_hc_ack_intr(hsotg, chan, chnum, qtd); in dwc2_hc_chhltd_intr_dma()
1823 dwc2_hc_xfercomp_intr(hsotg, chan, chnum, qtd); in dwc2_hc_chhltd_intr_dma()
1825 dwc2_hc_stall_intr(hsotg, chan, chnum, qtd); in dwc2_hc_chhltd_intr_dma()
1827 hsotg->core_params->dma_desc_enable <= 0) { in dwc2_hc_chhltd_intr_dma()
1831 dev_vdbg(hsotg->dev, in dwc2_hc_chhltd_intr_dma()
1835 dev_vdbg(hsotg->dev, in dwc2_hc_chhltd_intr_dma()
1845 dwc2_hc_xacterr_intr(hsotg, chan, chnum, qtd); in dwc2_hc_chhltd_intr_dma()
1847 hsotg->core_params->dma_desc_enable > 0) { in dwc2_hc_chhltd_intr_dma()
1848 dwc2_hc_xacterr_intr(hsotg, chan, chnum, qtd); in dwc2_hc_chhltd_intr_dma()
1850 hsotg->core_params->dma_desc_enable > 0) { in dwc2_hc_chhltd_intr_dma()
1851 dwc2_hc_ahberr_intr(hsotg, chan, chnum, qtd); in dwc2_hc_chhltd_intr_dma()
1853 dwc2_hc_babble_intr(hsotg, chan, chnum, qtd); in dwc2_hc_chhltd_intr_dma()
1855 dwc2_hc_frmovrun_intr(hsotg, chan, chnum, qtd); in dwc2_hc_chhltd_intr_dma()
1864 dwc2_hc_nyet_intr(hsotg, chan, chnum, qtd); in dwc2_hc_chhltd_intr_dma()
1874 dwc2_hc_nak_intr(hsotg, chan, chnum, qtd); in dwc2_hc_chhltd_intr_dma()
1884 dwc2_hc_ack_intr(hsotg, chan, chnum, qtd); in dwc2_hc_chhltd_intr_dma()
1894 dev_dbg(hsotg->dev, in dwc2_hc_chhltd_intr_dma()
1897 dwc2_halt_channel(hsotg, chan, qtd, in dwc2_hc_chhltd_intr_dma()
1900 dev_err(hsotg->dev, in dwc2_hc_chhltd_intr_dma()
1903 dev_err(hsotg->dev, in dwc2_hc_chhltd_intr_dma()
1906 dwc2_readl(hsotg->regs + GINTSTS)); in dwc2_hc_chhltd_intr_dma()
1911 dev_info(hsotg->dev, in dwc2_hc_chhltd_intr_dma()
1917 dwc2_update_urb_state_abn(hsotg, chan, chnum, qtd->urb, in dwc2_hc_chhltd_intr_dma()
1919 dwc2_hcd_save_data_toggle(hsotg, chan, chnum, qtd); in dwc2_hc_chhltd_intr_dma()
1920 dwc2_halt_channel(hsotg, chan, qtd, DWC2_HC_XFER_XACT_ERR); in dwc2_hc_chhltd_intr_dma()
1935 static void dwc2_hc_chhltd_intr(struct dwc2_hsotg *hsotg, in dwc2_hc_chhltd_intr() argument
1940 dev_vdbg(hsotg->dev, "--Host Channel %d Interrupt: Channel Halted--\n", in dwc2_hc_chhltd_intr()
1943 if (hsotg->core_params->dma_enable > 0) { in dwc2_hc_chhltd_intr()
1944 dwc2_hc_chhltd_intr_dma(hsotg, chan, chnum, qtd); in dwc2_hc_chhltd_intr()
1946 if (!dwc2_halt_status_ok(hsotg, chan, chnum, qtd)) in dwc2_hc_chhltd_intr()
1948 dwc2_release_channel(hsotg, chan, qtd, chan->halt_status); in dwc2_hc_chhltd_intr()
1971 static void dwc2_hc_n_intr(struct dwc2_hsotg *hsotg, int chnum) in dwc2_hc_n_intr() argument
1977 chan = hsotg->hc_ptr_array[chnum]; in dwc2_hc_n_intr()
1979 hcint = dwc2_readl(hsotg->regs + HCINT(chnum)); in dwc2_hc_n_intr()
1980 hcintmsk = dwc2_readl(hsotg->regs + HCINTMSK(chnum)); in dwc2_hc_n_intr()
1982 dev_err(hsotg->dev, "## hc_ptr_array for channel is NULL ##\n"); in dwc2_hc_n_intr()
1983 dwc2_writel(hcint, hsotg->regs + HCINT(chnum)); in dwc2_hc_n_intr()
1988 dev_vdbg(hsotg->dev, "--Host Channel Interrupt--, Channel %d\n", in dwc2_hc_n_intr()
1990 dev_vdbg(hsotg->dev, in dwc2_hc_n_intr()
1995 dwc2_writel(hcint, hsotg->regs + HCINT(chnum)); in dwc2_hc_n_intr()
2010 if (hsotg->core_params->dma_desc_enable > 0) in dwc2_hc_n_intr()
2011 dwc2_hcd_complete_xfer_ddma(hsotg, chan, chnum, in dwc2_hc_n_intr()
2014 dwc2_release_channel(hsotg, chan, NULL, in dwc2_hc_n_intr()
2024 dev_dbg(hsotg->dev, "## no QTD queued for channel %d ##\n", in dwc2_hc_n_intr()
2026 dev_dbg(hsotg->dev, in dwc2_hc_n_intr()
2030 disable_hc_int(hsotg, chnum, HCINTMSK_CHHLTD); in dwc2_hc_n_intr()
2038 if (hsotg->core_params->dma_enable <= 0) { in dwc2_hc_n_intr()
2044 dwc2_hc_xfercomp_intr(hsotg, chan, chnum, qtd); in dwc2_hc_n_intr()
2054 dwc2_hc_chhltd_intr(hsotg, chan, chnum, qtd); in dwc2_hc_n_intr()
2059 dwc2_hc_ahberr_intr(hsotg, chan, chnum, qtd); in dwc2_hc_n_intr()
2064 dwc2_hc_stall_intr(hsotg, chan, chnum, qtd); in dwc2_hc_n_intr()
2069 dwc2_hc_nak_intr(hsotg, chan, chnum, qtd); in dwc2_hc_n_intr()
2074 dwc2_hc_ack_intr(hsotg, chan, chnum, qtd); in dwc2_hc_n_intr()
2079 dwc2_hc_nyet_intr(hsotg, chan, chnum, qtd); in dwc2_hc_n_intr()
2084 dwc2_hc_xacterr_intr(hsotg, chan, chnum, qtd); in dwc2_hc_n_intr()
2089 dwc2_hc_babble_intr(hsotg, chan, chnum, qtd); in dwc2_hc_n_intr()
2094 dwc2_hc_frmovrun_intr(hsotg, chan, chnum, qtd); in dwc2_hc_n_intr()
2099 dwc2_hc_datatglerr_intr(hsotg, chan, chnum, qtd); in dwc2_hc_n_intr()
2114 static void dwc2_hc_intr(struct dwc2_hsotg *hsotg) in dwc2_hc_intr() argument
2119 haint = dwc2_readl(hsotg->regs + HAINT); in dwc2_hc_intr()
2121 dev_vdbg(hsotg->dev, "%s()\n", __func__); in dwc2_hc_intr()
2123 dev_vdbg(hsotg->dev, "HAINT=%08x\n", haint); in dwc2_hc_intr()
2126 for (i = 0; i < hsotg->core_params->host_channels; i++) { in dwc2_hc_intr()
2128 dwc2_hc_n_intr(hsotg, i); in dwc2_hc_intr()
2133 irqreturn_t dwc2_handle_hcd_intr(struct dwc2_hsotg *hsotg) in dwc2_handle_hcd_intr() argument
2138 if (!dwc2_is_controller_alive(hsotg)) { in dwc2_handle_hcd_intr()
2139 dev_warn(hsotg->dev, "Controller is dead\n"); in dwc2_handle_hcd_intr()
2143 spin_lock(&hsotg->lock); in dwc2_handle_hcd_intr()
2146 if (dwc2_is_host_mode(hsotg)) { in dwc2_handle_hcd_intr()
2147 gintsts = dwc2_read_core_intr(hsotg); in dwc2_handle_hcd_intr()
2149 spin_unlock(&hsotg->lock); in dwc2_handle_hcd_intr()
2165 dev_vdbg(hsotg->dev, in dwc2_handle_hcd_intr()
2170 dwc2_sof_intr(hsotg); in dwc2_handle_hcd_intr()
2172 dwc2_rx_fifo_level_intr(hsotg); in dwc2_handle_hcd_intr()
2174 dwc2_np_tx_fifo_empty_intr(hsotg); in dwc2_handle_hcd_intr()
2176 dwc2_port_intr(hsotg); in dwc2_handle_hcd_intr()
2178 dwc2_hc_intr(hsotg); in dwc2_handle_hcd_intr()
2180 dwc2_perio_tx_fifo_empty_intr(hsotg); in dwc2_handle_hcd_intr()
2183 dev_vdbg(hsotg->dev, in dwc2_handle_hcd_intr()
2185 dev_vdbg(hsotg->dev, in dwc2_handle_hcd_intr()
2187 dwc2_readl(hsotg->regs + GINTSTS), in dwc2_handle_hcd_intr()
2188 dwc2_readl(hsotg->regs + GINTMSK)); in dwc2_handle_hcd_intr()
2192 spin_unlock(&hsotg->lock); in dwc2_handle_hcd_intr()