Lines Matching refs:hsotg
63 static void dwc2_track_missed_sofs(struct dwc2_hsotg *hsotg) in dwc2_track_missed_sofs() argument
65 u16 curr_frame_number = hsotg->frame_number; in dwc2_track_missed_sofs()
66 u16 expected = dwc2_frame_num_inc(hsotg->last_frame_num, 1); in dwc2_track_missed_sofs()
69 dwc2_sch_vdbg(hsotg, "MISSED SOF %04x != %04x\n", in dwc2_track_missed_sofs()
73 if (hsotg->frame_num_idx < FRAME_NUM_ARRAY_SIZE) { in dwc2_track_missed_sofs()
75 hsotg->frame_num_array[hsotg->frame_num_idx] = in dwc2_track_missed_sofs()
77 hsotg->last_frame_num_array[hsotg->frame_num_idx] = in dwc2_track_missed_sofs()
78 hsotg->last_frame_num; in dwc2_track_missed_sofs()
79 hsotg->frame_num_idx++; in dwc2_track_missed_sofs()
81 } else if (!hsotg->dumped_frame_num_array) { in dwc2_track_missed_sofs()
84 dev_info(hsotg->dev, "Frame Last Frame\n"); in dwc2_track_missed_sofs()
85 dev_info(hsotg->dev, "----- ----------\n"); in dwc2_track_missed_sofs()
87 dev_info(hsotg->dev, "0x%04x 0x%04x\n", in dwc2_track_missed_sofs()
88 hsotg->frame_num_array[i], in dwc2_track_missed_sofs()
89 hsotg->last_frame_num_array[i]); in dwc2_track_missed_sofs()
91 hsotg->dumped_frame_num_array = 1; in dwc2_track_missed_sofs()
94 hsotg->last_frame_num = curr_frame_number; in dwc2_track_missed_sofs()
97 static void dwc2_hc_handle_tt_clear(struct dwc2_hsotg *hsotg, in dwc2_hc_handle_tt_clear() argument
101 struct usb_device *root_hub = dwc2_hsotg_to_hcd(hsotg)->self.root_hub; in dwc2_hc_handle_tt_clear()
140 static void dwc2_sof_intr(struct dwc2_hsotg *hsotg) in dwc2_sof_intr() argument
147 dwc2_writel(hsotg, GINTSTS_SOF, GINTSTS); in dwc2_sof_intr()
150 dev_vdbg(hsotg->dev, "--Start of Frame Interrupt--\n"); in dwc2_sof_intr()
153 hsotg->frame_number = dwc2_hcd_get_frame_number(hsotg); in dwc2_sof_intr()
155 dwc2_track_missed_sofs(hsotg); in dwc2_sof_intr()
158 qh_entry = hsotg->periodic_sched_inactive.next; in dwc2_sof_intr()
159 while (qh_entry != &hsotg->periodic_sched_inactive) { in dwc2_sof_intr()
163 hsotg->frame_number)) { in dwc2_sof_intr()
164 dwc2_sch_vdbg(hsotg, "QH=%p ready fn=%04x, nxt=%04x\n", in dwc2_sof_intr()
165 qh, hsotg->frame_number, in dwc2_sof_intr()
173 &hsotg->periodic_sched_ready); in dwc2_sof_intr()
176 tr_type = dwc2_hcd_select_transactions(hsotg); in dwc2_sof_intr()
178 dwc2_hcd_queue_transactions(hsotg, tr_type); in dwc2_sof_intr()
186 static void dwc2_rx_fifo_level_intr(struct dwc2_hsotg *hsotg) in dwc2_rx_fifo_level_intr() argument
192 dev_vdbg(hsotg->dev, "--RxFIFO Level Interrupt--\n"); in dwc2_rx_fifo_level_intr()
194 grxsts = dwc2_readl(hsotg, GRXSTSP); in dwc2_rx_fifo_level_intr()
196 chan = hsotg->hc_ptr_array[chnum]; in dwc2_rx_fifo_level_intr()
198 dev_err(hsotg->dev, "Unable to get corresponding channel\n"); in dwc2_rx_fifo_level_intr()
208 dev_vdbg(hsotg->dev, " Ch num = %d\n", chnum); in dwc2_rx_fifo_level_intr()
209 dev_vdbg(hsotg->dev, " Count = %d\n", bcnt); in dwc2_rx_fifo_level_intr()
210 dev_vdbg(hsotg->dev, " DPID = %d, chan.dpid = %d\n", dpid, in dwc2_rx_fifo_level_intr()
212 dev_vdbg(hsotg->dev, " PStatus = %d\n", pktsts); in dwc2_rx_fifo_level_intr()
219 dwc2_read_packet(hsotg, chan->xfer_buf, bcnt); in dwc2_rx_fifo_level_intr()
232 dev_err(hsotg->dev, in dwc2_rx_fifo_level_intr()
244 static void dwc2_np_tx_fifo_empty_intr(struct dwc2_hsotg *hsotg) in dwc2_np_tx_fifo_empty_intr() argument
246 dev_vdbg(hsotg->dev, "--Non-Periodic TxFIFO Empty Interrupt--\n"); in dwc2_np_tx_fifo_empty_intr()
247 dwc2_hcd_queue_transactions(hsotg, DWC2_TRANSACTION_NON_PERIODIC); in dwc2_np_tx_fifo_empty_intr()
256 static void dwc2_perio_tx_fifo_empty_intr(struct dwc2_hsotg *hsotg) in dwc2_perio_tx_fifo_empty_intr() argument
259 dev_vdbg(hsotg->dev, "--Periodic TxFIFO Empty Interrupt--\n"); in dwc2_perio_tx_fifo_empty_intr()
260 dwc2_hcd_queue_transactions(hsotg, DWC2_TRANSACTION_PERIODIC); in dwc2_perio_tx_fifo_empty_intr()
263 static void dwc2_hprt0_enable(struct dwc2_hsotg *hsotg, u32 hprt0, in dwc2_hprt0_enable() argument
266 struct dwc2_core_params *params = &hsotg->params; in dwc2_hprt0_enable()
274 dev_vdbg(hsotg->dev, "%s(%p)\n", __func__, hsotg); in dwc2_hprt0_enable()
277 hfir = dwc2_readl(hsotg, HFIR); in dwc2_hprt0_enable()
279 hfir |= dwc2_calc_frame_interval(hsotg) << HFIR_FRINT_SHIFT & in dwc2_hprt0_enable()
281 dwc2_writel(hsotg, hfir, HFIR); in dwc2_hprt0_enable()
286 hsotg->flags.b.port_reset_change = 1; in dwc2_hprt0_enable()
290 usbcfg = dwc2_readl(hsotg, GUSBCFG); in dwc2_hprt0_enable()
298 dwc2_writel(hsotg, usbcfg, GUSBCFG); in dwc2_hprt0_enable()
302 hcfg = dwc2_readl(hsotg, HCFG); in dwc2_hprt0_enable()
309 dev_vdbg(hsotg->dev, in dwc2_hprt0_enable()
315 dwc2_writel(hsotg, hcfg, HCFG); in dwc2_hprt0_enable()
320 dev_vdbg(hsotg->dev, in dwc2_hprt0_enable()
326 dwc2_writel(hsotg, hcfg, HCFG); in dwc2_hprt0_enable()
334 dwc2_writel(hsotg, usbcfg, GUSBCFG); in dwc2_hprt0_enable()
341 dwc2_writel(hsotg, *hprt0_modify, HPRT0); in dwc2_hprt0_enable()
342 queue_delayed_work(hsotg->wq_otg, &hsotg->reset_work, in dwc2_hprt0_enable()
346 hsotg->flags.b.port_reset_change = 1; in dwc2_hprt0_enable()
355 static void dwc2_port_intr(struct dwc2_hsotg *hsotg) in dwc2_port_intr() argument
360 dev_vdbg(hsotg->dev, "--Port Interrupt--\n"); in dwc2_port_intr()
362 hprt0 = dwc2_readl(hsotg, HPRT0); in dwc2_port_intr()
377 dwc2_writel(hsotg, hprt0_modify | HPRT0_CONNDET, HPRT0); in dwc2_port_intr()
379 dev_vdbg(hsotg->dev, in dwc2_port_intr()
382 dwc2_hcd_connect(hsotg); in dwc2_port_intr()
395 dwc2_writel(hsotg, hprt0_modify | HPRT0_ENACHG, HPRT0); in dwc2_port_intr()
396 dev_vdbg(hsotg->dev, in dwc2_port_intr()
400 hsotg->new_connection = true; in dwc2_port_intr()
401 dwc2_hprt0_enable(hsotg, hprt0, &hprt0_modify); in dwc2_port_intr()
403 hsotg->flags.b.port_enable_change = 1; in dwc2_port_intr()
404 if (hsotg->params.dma_desc_fs_enable) { in dwc2_port_intr()
407 hsotg->params.dma_desc_enable = false; in dwc2_port_intr()
408 hsotg->new_connection = false; in dwc2_port_intr()
409 hcfg = dwc2_readl(hsotg, HCFG); in dwc2_port_intr()
411 dwc2_writel(hsotg, hcfg, HCFG); in dwc2_port_intr()
418 dwc2_writel(hsotg, hprt0_modify | HPRT0_OVRCURRCHG, in dwc2_port_intr()
420 dev_vdbg(hsotg->dev, in dwc2_port_intr()
423 hsotg->flags.b.port_over_current_change = 1; in dwc2_port_intr()
436 static u32 dwc2_get_actual_xfer_length(struct dwc2_hsotg *hsotg, in dwc2_get_actual_xfer_length() argument
444 hctsiz = dwc2_readl(hsotg, HCTSIZ(chnum)); in dwc2_get_actual_xfer_length()
490 static int dwc2_update_urb_state(struct dwc2_hsotg *hsotg, in dwc2_update_urb_state() argument
498 int xfer_length = dwc2_get_actual_xfer_length(hsotg, chan, chnum, qtd, in dwc2_update_urb_state()
503 dev_dbg(hsotg->dev, "%s(): trimming xfer length\n", __func__); in dwc2_update_urb_state()
507 dev_vdbg(hsotg->dev, "urb->actual_length=%d xfer_length=%d\n", in dwc2_update_urb_state()
521 hctsiz = dwc2_readl(hsotg, HCTSIZ(chnum)); in dwc2_update_urb_state()
522 dev_vdbg(hsotg->dev, "DWC_otg: %s: %s, channel %d\n", in dwc2_update_urb_state()
524 dev_vdbg(hsotg->dev, " chan->xfer_len %d\n", chan->xfer_len); in dwc2_update_urb_state()
525 dev_vdbg(hsotg->dev, " hctsiz.xfersize %d\n", in dwc2_update_urb_state()
527 dev_vdbg(hsotg->dev, " urb->transfer_buffer_length %d\n", urb->length); in dwc2_update_urb_state()
528 dev_vdbg(hsotg->dev, " urb->actual_length %d\n", urb->actual_length); in dwc2_update_urb_state()
529 dev_vdbg(hsotg->dev, " short_read %d, xfer_done %d\n", short_read, in dwc2_update_urb_state()
540 void dwc2_hcd_save_data_toggle(struct dwc2_hsotg *hsotg, in dwc2_hcd_save_data_toggle() argument
544 u32 hctsiz = dwc2_readl(hsotg, HCTSIZ(chnum)); in dwc2_hcd_save_data_toggle()
585 struct dwc2_hsotg *hsotg, struct dwc2_host_chan *chan, in dwc2_update_isoc_urb_state() argument
600 frame_desc->actual_length = dwc2_get_actual_xfer_length(hsotg, in dwc2_update_isoc_urb_state()
619 frame_desc->actual_length = dwc2_get_actual_xfer_length(hsotg, in dwc2_update_isoc_urb_state()
625 hsotg->params.host_dma) { in dwc2_update_isoc_urb_state()
632 dev_err(hsotg->dev, "Unhandled halt_status (%d)\n", in dwc2_update_isoc_urb_state()
642 dwc2_host_complete(hsotg, qtd, 0); in dwc2_update_isoc_urb_state()
658 static void dwc2_deactivate_qh(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh, in dwc2_deactivate_qh() argument
665 dev_vdbg(hsotg->dev, " %s(%p,%p,%d)\n", __func__, in dwc2_deactivate_qh()
666 hsotg, qh, free_qtd); in dwc2_deactivate_qh()
669 dev_dbg(hsotg->dev, "## QTD list empty ##\n"); in dwc2_deactivate_qh()
682 dwc2_hcd_qtd_unlink_and_free(hsotg, qtd, qh); in dwc2_deactivate_qh()
688 dwc2_hcd_qh_deactivate(hsotg, qh, continue_split); in dwc2_deactivate_qh()
704 static void dwc2_release_channel(struct dwc2_hsotg *hsotg, in dwc2_release_channel() argument
714 dev_vdbg(hsotg->dev, " %s: channel %d, halt_status %d\n", in dwc2_release_channel()
728 dev_vdbg(hsotg->dev, in dwc2_release_channel()
731 dwc2_host_complete(hsotg, qtd, -EPROTO); in dwc2_release_channel()
742 dev_vdbg(hsotg->dev, " Complete URB with I/O error\n"); in dwc2_release_channel()
744 dwc2_host_complete(hsotg, qtd, -EIO); in dwc2_release_channel()
751 dwc2_deactivate_qh(hsotg, chan->qh, free_qtd); in dwc2_release_channel()
761 dwc2_hc_cleanup(hsotg, chan); in dwc2_release_channel()
762 list_add_tail(&chan->hc_list_entry, &hsotg->free_hc_list); in dwc2_release_channel()
764 if (hsotg->params.uframe_sched) { in dwc2_release_channel()
765 hsotg->available_host_channels++; in dwc2_release_channel()
770 hsotg->non_periodic_channels--; in dwc2_release_channel()
783 haintmsk = dwc2_readl(hsotg, HAINTMSK); in dwc2_release_channel()
785 dwc2_writel(hsotg, haintmsk, HAINTMSK); in dwc2_release_channel()
788 tr_type = dwc2_hcd_select_transactions(hsotg); in dwc2_release_channel()
790 dwc2_hcd_queue_transactions(hsotg, tr_type); in dwc2_release_channel()
803 static void dwc2_halt_channel(struct dwc2_hsotg *hsotg, in dwc2_halt_channel() argument
808 dev_vdbg(hsotg->dev, "%s()\n", __func__); in dwc2_halt_channel()
810 if (hsotg->params.host_dma) { in dwc2_halt_channel()
812 dev_vdbg(hsotg->dev, "DMA enabled\n"); in dwc2_halt_channel()
813 dwc2_release_channel(hsotg, chan, qtd, halt_status); in dwc2_halt_channel()
818 dwc2_hc_halt(hsotg, chan, halt_status); in dwc2_halt_channel()
823 dev_vdbg(hsotg->dev, "Halt on queue\n"); in dwc2_halt_channel()
826 dev_vdbg(hsotg->dev, "control/bulk\n"); in dwc2_halt_channel()
832 gintmsk = dwc2_readl(hsotg, GINTMSK); in dwc2_halt_channel()
834 dwc2_writel(hsotg, gintmsk, GINTMSK); in dwc2_halt_channel()
836 dev_vdbg(hsotg->dev, "isoc/intr\n"); in dwc2_halt_channel()
844 &hsotg->periodic_sched_assigned); in dwc2_halt_channel()
851 gintmsk = dwc2_readl(hsotg, GINTMSK); in dwc2_halt_channel()
853 dwc2_writel(hsotg, gintmsk, GINTMSK); in dwc2_halt_channel()
863 static void dwc2_complete_non_periodic_xfer(struct dwc2_hsotg *hsotg, in dwc2_complete_non_periodic_xfer() argument
868 dev_vdbg(hsotg->dev, "%s()\n", __func__); in dwc2_complete_non_periodic_xfer()
878 dev_vdbg(hsotg->dev, "got NYET\n"); in dwc2_complete_non_periodic_xfer()
898 dwc2_halt_channel(hsotg, chan, qtd, halt_status); in dwc2_complete_non_periodic_xfer()
904 dwc2_release_channel(hsotg, chan, qtd, halt_status); in dwc2_complete_non_periodic_xfer()
913 static void dwc2_complete_periodic_xfer(struct dwc2_hsotg *hsotg, in dwc2_complete_periodic_xfer() argument
918 u32 hctsiz = dwc2_readl(hsotg, HCTSIZ(chnum)); in dwc2_complete_periodic_xfer()
924 dwc2_release_channel(hsotg, chan, qtd, halt_status); in dwc2_complete_periodic_xfer()
927 dwc2_halt_channel(hsotg, chan, qtd, halt_status); in dwc2_complete_periodic_xfer()
930 static int dwc2_xfercomp_isoc_split_in(struct dwc2_hsotg *hsotg, in dwc2_xfercomp_isoc_split_in() argument
943 len = dwc2_get_actual_xfer_length(hsotg, chan, chnum, qtd, in dwc2_xfercomp_isoc_split_in()
953 dev_vdbg(hsotg->dev, "non-aligned buffer\n"); in dwc2_xfercomp_isoc_split_in()
954 dma_unmap_single(hsotg->dev, chan->qh->dw_align_buf_dma, in dwc2_xfercomp_isoc_split_in()
962 hctsiz = dwc2_readl(hsotg, HCTSIZ(chnum)); in dwc2_xfercomp_isoc_split_in()
973 dwc2_host_complete(hsotg, qtd, 0); in dwc2_xfercomp_isoc_split_in()
974 dwc2_release_channel(hsotg, chan, qtd, in dwc2_xfercomp_isoc_split_in()
977 dwc2_release_channel(hsotg, chan, qtd, in dwc2_xfercomp_isoc_split_in()
988 static void dwc2_hc_xfercomp_intr(struct dwc2_hsotg *hsotg, in dwc2_hc_xfercomp_intr() argument
998 dev_vdbg(hsotg->dev, in dwc2_hc_xfercomp_intr()
1007 if (hsotg->params.dma_desc_enable) { in dwc2_hc_xfercomp_intr()
1008 dwc2_hcd_complete_xfer_ddma(hsotg, chan, chnum, halt_status); in dwc2_hc_xfercomp_intr()
1018 hsotg->params.host_dma) { in dwc2_hc_xfercomp_intr()
1020 dwc2_xfercomp_isoc_split_in(hsotg, chan, chnum, in dwc2_hc_xfercomp_intr()
1037 dev_vdbg(hsotg->dev, in dwc2_hc_xfercomp_intr()
1042 urb_xfer_done = dwc2_update_urb_state(hsotg, chan, in dwc2_hc_xfercomp_intr()
1046 dev_vdbg(hsotg->dev, in dwc2_hc_xfercomp_intr()
1049 dwc2_hcd_save_data_toggle(hsotg, chan, chnum, in dwc2_hc_xfercomp_intr()
1055 dev_vdbg(hsotg->dev, " Control transfer complete\n"); in dwc2_hc_xfercomp_intr()
1058 dwc2_host_complete(hsotg, qtd, urb->status); in dwc2_hc_xfercomp_intr()
1063 dwc2_complete_non_periodic_xfer(hsotg, chan, chnum, qtd, in dwc2_hc_xfercomp_intr()
1067 dev_vdbg(hsotg->dev, " Bulk transfer complete\n"); in dwc2_hc_xfercomp_intr()
1068 urb_xfer_done = dwc2_update_urb_state(hsotg, chan, chnum, urb, in dwc2_hc_xfercomp_intr()
1071 dwc2_host_complete(hsotg, qtd, urb->status); in dwc2_hc_xfercomp_intr()
1077 dwc2_hcd_save_data_toggle(hsotg, chan, chnum, qtd); in dwc2_hc_xfercomp_intr()
1078 dwc2_complete_non_periodic_xfer(hsotg, chan, chnum, qtd, in dwc2_hc_xfercomp_intr()
1082 dev_vdbg(hsotg->dev, " Interrupt transfer complete\n"); in dwc2_hc_xfercomp_intr()
1083 urb_xfer_done = dwc2_update_urb_state(hsotg, chan, chnum, urb, in dwc2_hc_xfercomp_intr()
1091 dwc2_host_complete(hsotg, qtd, urb->status); in dwc2_hc_xfercomp_intr()
1097 dwc2_hcd_save_data_toggle(hsotg, chan, chnum, qtd); in dwc2_hc_xfercomp_intr()
1098 dwc2_complete_periodic_xfer(hsotg, chan, chnum, qtd, in dwc2_hc_xfercomp_intr()
1103 dev_vdbg(hsotg->dev, " Isochronous transfer complete\n"); in dwc2_hc_xfercomp_intr()
1105 halt_status = dwc2_update_isoc_urb_state(hsotg, chan, in dwc2_hc_xfercomp_intr()
1108 dwc2_complete_periodic_xfer(hsotg, chan, chnum, qtd, in dwc2_hc_xfercomp_intr()
1114 disable_hc_int(hsotg, chnum, HCINTMSK_XFERCOMPL); in dwc2_hc_xfercomp_intr()
1121 static void dwc2_hc_stall_intr(struct dwc2_hsotg *hsotg, in dwc2_hc_stall_intr() argument
1128 dev_dbg(hsotg->dev, "--Host Channel %d Interrupt: STALL Received--\n", in dwc2_hc_stall_intr()
1131 if (hsotg->params.dma_desc_enable) { in dwc2_hc_stall_intr()
1132 dwc2_hcd_complete_xfer_ddma(hsotg, chan, chnum, in dwc2_hc_stall_intr()
1143 dwc2_host_complete(hsotg, qtd, -EPIPE); in dwc2_hc_stall_intr()
1147 dwc2_host_complete(hsotg, qtd, -EPIPE); in dwc2_hc_stall_intr()
1159 dwc2_halt_channel(hsotg, chan, qtd, DWC2_HC_XFER_STALL); in dwc2_hc_stall_intr()
1162 disable_hc_int(hsotg, chnum, HCINTMSK_STALL); in dwc2_hc_stall_intr()
1171 static void dwc2_update_urb_state_abn(struct dwc2_hsotg *hsotg, in dwc2_update_urb_state_abn() argument
1177 u32 xfer_length = dwc2_get_actual_xfer_length(hsotg, chan, chnum, in dwc2_update_urb_state_abn()
1182 dev_warn(hsotg->dev, "%s(): trimming xfer length\n", __func__); in dwc2_update_urb_state_abn()
1191 hctsiz = dwc2_readl(hsotg, HCTSIZ(chnum)); in dwc2_update_urb_state_abn()
1192 dev_vdbg(hsotg->dev, "DWC_otg: %s: %s, channel %d\n", in dwc2_update_urb_state_abn()
1194 dev_vdbg(hsotg->dev, " chan->start_pkt_count %d\n", in dwc2_update_urb_state_abn()
1196 dev_vdbg(hsotg->dev, " hctsiz.pktcnt %d\n", in dwc2_update_urb_state_abn()
1198 dev_vdbg(hsotg->dev, " chan->max_packet %d\n", chan->max_packet); in dwc2_update_urb_state_abn()
1199 dev_vdbg(hsotg->dev, " bytes_transferred %d\n", in dwc2_update_urb_state_abn()
1201 dev_vdbg(hsotg->dev, " urb->actual_length %d\n", in dwc2_update_urb_state_abn()
1203 dev_vdbg(hsotg->dev, " urb->transfer_buffer_length %d\n", in dwc2_update_urb_state_abn()
1211 static void dwc2_hc_nak_intr(struct dwc2_hsotg *hsotg, in dwc2_hc_nak_intr() argument
1216 dev_dbg(hsotg->dev, "%s: qtd is NULL\n", __func__); in dwc2_hc_nak_intr()
1221 dev_dbg(hsotg->dev, "%s: qtd->urb is NULL\n", __func__); in dwc2_hc_nak_intr()
1226 dev_vdbg(hsotg->dev, "--Host Channel %d Interrupt: NAK Received--\n", in dwc2_hc_nak_intr()
1256 dwc2_halt_channel(hsotg, chan, qtd, DWC2_HC_XFER_NAK); in dwc2_hc_nak_intr()
1263 if (hsotg->params.host_dma && chan->ep_is_in) { in dwc2_hc_nak_intr()
1282 dwc2_update_urb_state_abn(hsotg, chan, chnum, qtd->urb, in dwc2_hc_nak_intr()
1284 dwc2_hcd_save_data_toggle(hsotg, chan, chnum, qtd); in dwc2_hc_nak_intr()
1295 dwc2_halt_channel(hsotg, chan, qtd, DWC2_HC_XFER_NAK); in dwc2_hc_nak_intr()
1299 dwc2_halt_channel(hsotg, chan, qtd, DWC2_HC_XFER_NAK); in dwc2_hc_nak_intr()
1303 dev_err(hsotg->dev, "NACK interrupt for ISOC transfer\n"); in dwc2_hc_nak_intr()
1308 disable_hc_int(hsotg, chnum, HCINTMSK_NAK); in dwc2_hc_nak_intr()
1316 static void dwc2_hc_ack_intr(struct dwc2_hsotg *hsotg, in dwc2_hc_ack_intr() argument
1323 dev_vdbg(hsotg->dev, "--Host Channel %d Interrupt: ACK Received--\n", in dwc2_hc_ack_intr()
1334 dwc2_halt_channel(hsotg, chan, qtd, DWC2_HC_XFER_ACK); in dwc2_hc_ack_intr()
1377 dwc2_halt_channel(hsotg, chan, qtd, DWC2_HC_XFER_ACK); in dwc2_hc_ack_intr()
1385 disable_hc_int(hsotg, chnum, HCINTMSK_ACK); in dwc2_hc_ack_intr()
1395 static void dwc2_hc_nyet_intr(struct dwc2_hsotg *hsotg, in dwc2_hc_nyet_intr() argument
1400 dev_vdbg(hsotg->dev, "--Host Channel %d Interrupt: NYET Received--\n", in dwc2_hc_nyet_intr()
1409 hsotg->params.host_dma) { in dwc2_hc_nyet_intr()
1415 dwc2_host_complete(hsotg, qtd, 0); in dwc2_hc_nyet_intr()
1416 dwc2_release_channel(hsotg, chan, qtd, in dwc2_hc_nyet_intr()
1419 dwc2_release_channel(hsotg, chan, qtd, in dwc2_hc_nyet_intr()
1430 if (!hsotg->params.uframe_sched) { in dwc2_hc_nyet_intr()
1431 int frnum = dwc2_hcd_get_frame_number(hsotg); in dwc2_hc_nyet_intr()
1487 dwc2_halt_channel(hsotg, chan, qtd, in dwc2_hc_nyet_intr()
1494 dwc2_halt_channel(hsotg, chan, qtd, DWC2_HC_XFER_NYET); in dwc2_hc_nyet_intr()
1501 dwc2_update_urb_state_abn(hsotg, chan, chnum, qtd->urb, qtd, in dwc2_hc_nyet_intr()
1503 dwc2_hcd_save_data_toggle(hsotg, chan, chnum, qtd); in dwc2_hc_nyet_intr()
1509 dwc2_halt_channel(hsotg, chan, qtd, DWC2_HC_XFER_NYET); in dwc2_hc_nyet_intr()
1512 disable_hc_int(hsotg, chnum, HCINTMSK_NYET); in dwc2_hc_nyet_intr()
1519 static void dwc2_hc_babble_intr(struct dwc2_hsotg *hsotg, in dwc2_hc_babble_intr() argument
1523 dev_dbg(hsotg->dev, "--Host Channel %d Interrupt: Babble Error--\n", in dwc2_hc_babble_intr()
1526 dwc2_hc_handle_tt_clear(hsotg, chan, qtd); in dwc2_hc_babble_intr()
1528 if (hsotg->params.dma_desc_enable) { in dwc2_hc_babble_intr()
1529 dwc2_hcd_complete_xfer_ddma(hsotg, chan, chnum, in dwc2_hc_babble_intr()
1535 dwc2_host_complete(hsotg, qtd, -EOVERFLOW); in dwc2_hc_babble_intr()
1536 dwc2_halt_channel(hsotg, chan, qtd, DWC2_HC_XFER_BABBLE_ERR); in dwc2_hc_babble_intr()
1540 halt_status = dwc2_update_isoc_urb_state(hsotg, chan, chnum, in dwc2_hc_babble_intr()
1542 dwc2_halt_channel(hsotg, chan, qtd, halt_status); in dwc2_hc_babble_intr()
1546 disable_hc_int(hsotg, chnum, HCINTMSK_BBLERR); in dwc2_hc_babble_intr()
1553 static void dwc2_hc_ahberr_intr(struct dwc2_hsotg *hsotg, in dwc2_hc_ahberr_intr() argument
1564 dev_dbg(hsotg->dev, "--Host Channel %d Interrupt: AHB Error--\n", in dwc2_hc_ahberr_intr()
1570 dwc2_hc_handle_tt_clear(hsotg, chan, qtd); in dwc2_hc_ahberr_intr()
1572 hcchar = dwc2_readl(hsotg, HCCHAR(chnum)); in dwc2_hc_ahberr_intr()
1573 hcsplt = dwc2_readl(hsotg, HCSPLT(chnum)); in dwc2_hc_ahberr_intr()
1574 hctsiz = dwc2_readl(hsotg, HCTSIZ(chnum)); in dwc2_hc_ahberr_intr()
1575 hc_dma = dwc2_readl(hsotg, HCDMA(chnum)); in dwc2_hc_ahberr_intr()
1577 dev_err(hsotg->dev, "AHB ERROR, Channel %d\n", chnum); in dwc2_hc_ahberr_intr()
1578 dev_err(hsotg->dev, " hcchar 0x%08x, hcsplt 0x%08x\n", hcchar, hcsplt); in dwc2_hc_ahberr_intr()
1579 dev_err(hsotg->dev, " hctsiz 0x%08x, hc_dma 0x%08x\n", hctsiz, hc_dma); in dwc2_hc_ahberr_intr()
1580 dev_err(hsotg->dev, " Device address: %d\n", in dwc2_hc_ahberr_intr()
1582 dev_err(hsotg->dev, " Endpoint: %d, %s\n", in dwc2_hc_ahberr_intr()
1604 dev_err(hsotg->dev, " Endpoint type: %s\n", pipetype); in dwc2_hc_ahberr_intr()
1621 dev_err(hsotg->dev, " Speed: %s\n", speed); in dwc2_hc_ahberr_intr()
1623 dev_err(hsotg->dev, " Max packet size: %d (mult %d)\n", in dwc2_hc_ahberr_intr()
1626 dev_err(hsotg->dev, " Data buffer length: %d\n", urb->length); in dwc2_hc_ahberr_intr()
1627 dev_err(hsotg->dev, " Transfer buffer: %p, Transfer DMA: %08lx\n", in dwc2_hc_ahberr_intr()
1629 dev_err(hsotg->dev, " Setup buffer: %p, Setup DMA: %08lx\n", in dwc2_hc_ahberr_intr()
1631 dev_err(hsotg->dev, " Interval: %d\n", urb->interval); in dwc2_hc_ahberr_intr()
1634 if (hsotg->params.dma_desc_enable) { in dwc2_hc_ahberr_intr()
1635 dwc2_hcd_complete_xfer_ddma(hsotg, chan, chnum, in dwc2_hc_ahberr_intr()
1640 dwc2_host_complete(hsotg, qtd, -EIO); in dwc2_hc_ahberr_intr()
1647 dwc2_hc_halt(hsotg, chan, DWC2_HC_XFER_AHB_ERR); in dwc2_hc_ahberr_intr()
1650 disable_hc_int(hsotg, chnum, HCINTMSK_AHBERR); in dwc2_hc_ahberr_intr()
1657 static void dwc2_hc_xacterr_intr(struct dwc2_hsotg *hsotg, in dwc2_hc_xacterr_intr() argument
1661 dev_dbg(hsotg->dev, in dwc2_hc_xacterr_intr()
1664 dwc2_hc_handle_tt_clear(hsotg, chan, qtd); in dwc2_hc_xacterr_intr()
1666 if (hsotg->params.dma_desc_enable) { in dwc2_hc_xacterr_intr()
1667 dwc2_hcd_complete_xfer_ddma(hsotg, chan, chnum, in dwc2_hc_xacterr_intr()
1677 dwc2_update_urb_state_abn(hsotg, chan, chnum, qtd->urb, in dwc2_hc_xacterr_intr()
1679 dwc2_hcd_save_data_toggle(hsotg, chan, chnum, qtd); in dwc2_hc_xacterr_intr()
1688 dwc2_halt_channel(hsotg, chan, qtd, DWC2_HC_XFER_XACT_ERR); in dwc2_hc_xacterr_intr()
1694 dwc2_halt_channel(hsotg, chan, qtd, DWC2_HC_XFER_XACT_ERR); in dwc2_hc_xacterr_intr()
1700 halt_status = dwc2_update_isoc_urb_state(hsotg, chan, in dwc2_hc_xacterr_intr()
1702 dwc2_halt_channel(hsotg, chan, qtd, halt_status); in dwc2_hc_xacterr_intr()
1708 disable_hc_int(hsotg, chnum, HCINTMSK_XACTERR); in dwc2_hc_xacterr_intr()
1715 static void dwc2_hc_frmovrun_intr(struct dwc2_hsotg *hsotg, in dwc2_hc_frmovrun_intr() argument
1722 dev_dbg(hsotg->dev, "--Host Channel %d Interrupt: Frame Overrun--\n", in dwc2_hc_frmovrun_intr()
1725 dwc2_hc_handle_tt_clear(hsotg, chan, qtd); in dwc2_hc_frmovrun_intr()
1732 dwc2_halt_channel(hsotg, chan, qtd, DWC2_HC_XFER_FRAME_OVERRUN); in dwc2_hc_frmovrun_intr()
1735 halt_status = dwc2_update_isoc_urb_state(hsotg, chan, chnum, in dwc2_hc_frmovrun_intr()
1737 dwc2_halt_channel(hsotg, chan, qtd, halt_status); in dwc2_hc_frmovrun_intr()
1741 disable_hc_int(hsotg, chnum, HCINTMSK_FRMOVRUN); in dwc2_hc_frmovrun_intr()
1748 static void dwc2_hc_datatglerr_intr(struct dwc2_hsotg *hsotg, in dwc2_hc_datatglerr_intr() argument
1752 dev_dbg(hsotg->dev, in dwc2_hc_datatglerr_intr()
1758 dev_err(hsotg->dev, in dwc2_hc_datatglerr_intr()
1762 dwc2_hc_handle_tt_clear(hsotg, chan, qtd); in dwc2_hc_datatglerr_intr()
1763 disable_hc_int(hsotg, chnum, HCINTMSK_DATATGLERR); in dwc2_hc_datatglerr_intr()
1773 static bool dwc2_halt_status_ok(struct dwc2_hsotg *hsotg, in dwc2_halt_status_ok() argument
1788 hcchar = dwc2_readl(hsotg, HCCHAR(chnum)); in dwc2_halt_status_ok()
1789 hctsiz = dwc2_readl(hsotg, HCTSIZ(chnum)); in dwc2_halt_status_ok()
1790 hcintmsk = dwc2_readl(hsotg, HCINTMSK(chnum)); in dwc2_halt_status_ok()
1791 hcsplt = dwc2_readl(hsotg, HCSPLT(chnum)); in dwc2_halt_status_ok()
1792 dev_dbg(hsotg->dev, in dwc2_halt_status_ok()
1795 dev_dbg(hsotg->dev, in dwc2_halt_status_ok()
1798 dev_dbg(hsotg->dev, in dwc2_halt_status_ok()
1802 dev_dbg(hsotg->dev, "qtd->complete_split %d\n", in dwc2_halt_status_ok()
1804 dev_warn(hsotg->dev, in dwc2_halt_status_ok()
1815 hcchar = dwc2_readl(hsotg, HCCHAR(chnum)); in dwc2_halt_status_ok()
1817 dev_warn(hsotg->dev, in dwc2_halt_status_ok()
1821 dwc2_halt_channel(hsotg, chan, qtd, chan->halt_status); in dwc2_halt_status_ok()
1833 static void dwc2_hc_chhltd_intr_dma(struct dwc2_hsotg *hsotg, in dwc2_hc_chhltd_intr_dma() argument
1841 dev_vdbg(hsotg->dev, in dwc2_hc_chhltd_intr_dma()
1849 if (hsotg->hw_params.snpsid >= DWC2_CORE_REV_2_71a) { in dwc2_hc_chhltd_intr_dma()
1859 !hsotg->params.dma_desc_enable)) { in dwc2_hc_chhltd_intr_dma()
1860 if (hsotg->params.dma_desc_enable) in dwc2_hc_chhltd_intr_dma()
1861 dwc2_hcd_complete_xfer_ddma(hsotg, chan, chnum, in dwc2_hc_chhltd_intr_dma()
1870 dwc2_release_channel(hsotg, chan, qtd, in dwc2_hc_chhltd_intr_dma()
1875 hcintmsk = dwc2_readl(hsotg, HCINTMSK(chnum)); in dwc2_hc_chhltd_intr_dma()
1886 dwc2_hc_ack_intr(hsotg, chan, chnum, qtd); in dwc2_hc_chhltd_intr_dma()
1887 dwc2_hc_xfercomp_intr(hsotg, chan, chnum, qtd); in dwc2_hc_chhltd_intr_dma()
1889 dwc2_hc_stall_intr(hsotg, chan, chnum, qtd); in dwc2_hc_chhltd_intr_dma()
1891 !hsotg->params.dma_desc_enable) { in dwc2_hc_chhltd_intr_dma()
1895 dev_vdbg(hsotg->dev, in dwc2_hc_chhltd_intr_dma()
1899 dev_vdbg(hsotg->dev, in dwc2_hc_chhltd_intr_dma()
1909 dwc2_hc_xacterr_intr(hsotg, chan, chnum, qtd); in dwc2_hc_chhltd_intr_dma()
1911 hsotg->params.dma_desc_enable) { in dwc2_hc_chhltd_intr_dma()
1912 dwc2_hc_xacterr_intr(hsotg, chan, chnum, qtd); in dwc2_hc_chhltd_intr_dma()
1914 hsotg->params.dma_desc_enable) { in dwc2_hc_chhltd_intr_dma()
1915 dwc2_hc_ahberr_intr(hsotg, chan, chnum, qtd); in dwc2_hc_chhltd_intr_dma()
1917 dwc2_hc_babble_intr(hsotg, chan, chnum, qtd); in dwc2_hc_chhltd_intr_dma()
1919 dwc2_hc_frmovrun_intr(hsotg, chan, chnum, qtd); in dwc2_hc_chhltd_intr_dma()
1928 dwc2_hc_nyet_intr(hsotg, chan, chnum, qtd); in dwc2_hc_chhltd_intr_dma()
1938 dwc2_hc_nak_intr(hsotg, chan, chnum, qtd); in dwc2_hc_chhltd_intr_dma()
1948 dwc2_hc_ack_intr(hsotg, chan, chnum, qtd); in dwc2_hc_chhltd_intr_dma()
1958 dev_dbg(hsotg->dev, in dwc2_hc_chhltd_intr_dma()
1961 dwc2_halt_channel(hsotg, chan, qtd, in dwc2_hc_chhltd_intr_dma()
1964 dev_err(hsotg->dev, in dwc2_hc_chhltd_intr_dma()
1967 dev_err(hsotg->dev, in dwc2_hc_chhltd_intr_dma()
1970 dwc2_readl(hsotg, GINTSTS)); in dwc2_hc_chhltd_intr_dma()
1975 dev_info(hsotg->dev, in dwc2_hc_chhltd_intr_dma()
1981 dwc2_update_urb_state_abn(hsotg, chan, chnum, qtd->urb, in dwc2_hc_chhltd_intr_dma()
1995 dwc2_hcd_save_data_toggle(hsotg, chan, chnum, qtd); in dwc2_hc_chhltd_intr_dma()
1996 dwc2_halt_channel(hsotg, chan, qtd, DWC2_HC_XFER_XACT_ERR); in dwc2_hc_chhltd_intr_dma()
2011 static void dwc2_hc_chhltd_intr(struct dwc2_hsotg *hsotg, in dwc2_hc_chhltd_intr() argument
2016 dev_vdbg(hsotg->dev, "--Host Channel %d Interrupt: Channel Halted--\n", in dwc2_hc_chhltd_intr()
2019 if (hsotg->params.host_dma) { in dwc2_hc_chhltd_intr()
2020 dwc2_hc_chhltd_intr_dma(hsotg, chan, chnum, qtd); in dwc2_hc_chhltd_intr()
2022 if (!dwc2_halt_status_ok(hsotg, chan, chnum, qtd)) in dwc2_hc_chhltd_intr()
2024 dwc2_release_channel(hsotg, chan, qtd, chan->halt_status); in dwc2_hc_chhltd_intr()
2047 static void dwc2_hc_n_intr(struct dwc2_hsotg *hsotg, int chnum) in dwc2_hc_n_intr() argument
2053 chan = hsotg->hc_ptr_array[chnum]; in dwc2_hc_n_intr()
2055 hcint = dwc2_readl(hsotg, HCINT(chnum)); in dwc2_hc_n_intr()
2056 hcintmsk = dwc2_readl(hsotg, HCINTMSK(chnum)); in dwc2_hc_n_intr()
2058 dev_err(hsotg->dev, "## hc_ptr_array for channel is NULL ##\n"); in dwc2_hc_n_intr()
2059 dwc2_writel(hsotg, hcint, HCINT(chnum)); in dwc2_hc_n_intr()
2064 dev_vdbg(hsotg->dev, "--Host Channel Interrupt--, Channel %d\n", in dwc2_hc_n_intr()
2066 dev_vdbg(hsotg->dev, in dwc2_hc_n_intr()
2076 dev_warn(hsotg->dev, "Interrupt on disabled channel\n"); in dwc2_hc_n_intr()
2083 dwc2_writel(hsotg, hcint, HCINT(chnum)); in dwc2_hc_n_intr()
2096 if (hsotg->params.dma_desc_enable) in dwc2_hc_n_intr()
2097 dwc2_hcd_complete_xfer_ddma(hsotg, chan, chnum, in dwc2_hc_n_intr()
2100 dwc2_release_channel(hsotg, chan, NULL, in dwc2_hc_n_intr()
2110 dev_dbg(hsotg->dev, "## no QTD queued for channel %d ##\n", in dwc2_hc_n_intr()
2112 dev_dbg(hsotg->dev, in dwc2_hc_n_intr()
2116 disable_hc_int(hsotg, chnum, HCINTMSK_CHHLTD); in dwc2_hc_n_intr()
2124 if (!hsotg->params.host_dma) { in dwc2_hc_n_intr()
2130 dwc2_hc_xfercomp_intr(hsotg, chan, chnum, qtd); in dwc2_hc_n_intr()
2140 dwc2_hc_chhltd_intr(hsotg, chan, chnum, qtd); in dwc2_hc_n_intr()
2145 dwc2_hc_ahberr_intr(hsotg, chan, chnum, qtd); in dwc2_hc_n_intr()
2150 dwc2_hc_stall_intr(hsotg, chan, chnum, qtd); in dwc2_hc_n_intr()
2155 dwc2_hc_nak_intr(hsotg, chan, chnum, qtd); in dwc2_hc_n_intr()
2160 dwc2_hc_ack_intr(hsotg, chan, chnum, qtd); in dwc2_hc_n_intr()
2165 dwc2_hc_nyet_intr(hsotg, chan, chnum, qtd); in dwc2_hc_n_intr()
2170 dwc2_hc_xacterr_intr(hsotg, chan, chnum, qtd); in dwc2_hc_n_intr()
2175 dwc2_hc_babble_intr(hsotg, chan, chnum, qtd); in dwc2_hc_n_intr()
2180 dwc2_hc_frmovrun_intr(hsotg, chan, chnum, qtd); in dwc2_hc_n_intr()
2185 dwc2_hc_datatglerr_intr(hsotg, chan, chnum, qtd); in dwc2_hc_n_intr()
2200 static void dwc2_hc_intr(struct dwc2_hsotg *hsotg) in dwc2_hc_intr() argument
2206 haint = dwc2_readl(hsotg, HAINT); in dwc2_hc_intr()
2208 dev_vdbg(hsotg->dev, "%s()\n", __func__); in dwc2_hc_intr()
2210 dev_vdbg(hsotg->dev, "HAINT=%08x\n", haint); in dwc2_hc_intr()
2219 list_for_each_entry_safe(chan, chan_tmp, &hsotg->split_order, in dwc2_hc_intr()
2224 dwc2_hc_n_intr(hsotg, hc_num); in dwc2_hc_intr()
2229 for (i = 0; i < hsotg->params.host_channels; i++) { in dwc2_hc_intr()
2231 dwc2_hc_n_intr(hsotg, i); in dwc2_hc_intr()
2236 irqreturn_t dwc2_handle_hcd_intr(struct dwc2_hsotg *hsotg) in dwc2_handle_hcd_intr() argument
2241 if (!dwc2_is_controller_alive(hsotg)) { in dwc2_handle_hcd_intr()
2242 dev_warn(hsotg->dev, "Controller is dead\n"); in dwc2_handle_hcd_intr()
2246 spin_lock(&hsotg->lock); in dwc2_handle_hcd_intr()
2249 if (dwc2_is_host_mode(hsotg)) { in dwc2_handle_hcd_intr()
2250 gintsts = dwc2_read_core_intr(hsotg); in dwc2_handle_hcd_intr()
2252 spin_unlock(&hsotg->lock); in dwc2_handle_hcd_intr()
2268 dev_vdbg(hsotg->dev, in dwc2_handle_hcd_intr()
2273 dwc2_sof_intr(hsotg); in dwc2_handle_hcd_intr()
2275 dwc2_rx_fifo_level_intr(hsotg); in dwc2_handle_hcd_intr()
2277 dwc2_np_tx_fifo_empty_intr(hsotg); in dwc2_handle_hcd_intr()
2279 dwc2_port_intr(hsotg); in dwc2_handle_hcd_intr()
2281 dwc2_hc_intr(hsotg); in dwc2_handle_hcd_intr()
2283 dwc2_perio_tx_fifo_empty_intr(hsotg); in dwc2_handle_hcd_intr()
2286 dev_vdbg(hsotg->dev, in dwc2_handle_hcd_intr()
2288 dev_vdbg(hsotg->dev, in dwc2_handle_hcd_intr()
2290 dwc2_readl(hsotg, GINTSTS), in dwc2_handle_hcd_intr()
2291 dwc2_readl(hsotg, GINTMSK)); in dwc2_handle_hcd_intr()
2295 spin_unlock(&hsotg->lock); in dwc2_handle_hcd_intr()