Lines Matching refs:usb
32 static void recycle_frame(struct fhci_usb *usb, struct packet *pkt) in recycle_frame() argument
40 cq_put(&usb->ep0->empty_frame_Q, pkt); in recycle_frame()
44 void fhci_transaction_confirm(struct fhci_usb *usb, struct packet *pkt) in fhci_transaction_confirm() argument
52 td = fhci_remove_td_from_frame(usb->actual_frame); in fhci_transaction_confirm()
60 cq_put(&usb->ep0->dummy_packets_Q, pkt->data); in fhci_transaction_confirm()
63 recycle_frame(usb, pkt); in fhci_transaction_confirm()
72 td_next->start_frame = usb->actual_frame->frame_num; in fhci_transaction_confirm()
91 fhci_dbg(usb->fhci, "td err fu\n"); in fhci_transaction_confirm()
95 fhci_dbg(usb->fhci, "td err f!u\n"); in fhci_transaction_confirm()
98 fhci_dbg(usb->fhci, "td err !f\n"); in fhci_transaction_confirm()
106 fhci_vdbg(usb->fhci, "td nack\n"); in fhci_transaction_confirm()
122 fhci_move_td_from_ed_to_done_list(usb, ed); in fhci_transaction_confirm()
130 void fhci_flush_all_transmissions(struct fhci_usb *usb) in fhci_flush_all_transmissions() argument
135 mode = in_8(&usb->fhci->regs->usb_usmod); in fhci_flush_all_transmissions()
136 clrbits8(&usb->fhci->regs->usb_usmod, USB_MODE_EN); in fhci_flush_all_transmissions()
138 fhci_flush_bds(usb); in fhci_flush_all_transmissions()
140 while ((td = fhci_peek_td_from_frame(usb->actual_frame)) != NULL) { in fhci_flush_all_transmissions()
144 fhci_transaction_confirm(usb, pkt); in fhci_flush_all_transmissions()
147 usb->actual_frame->frame_status = FRAME_END_TRANSMISSION; in fhci_flush_all_transmissions()
150 out_be16(&usb->fhci->regs->usb_usber, 0xffff); in fhci_flush_all_transmissions()
152 out_8(&usb->fhci->regs->usb_usmod, mode | USB_MODE_EN); in fhci_flush_all_transmissions()
159 static int add_packet(struct fhci_usb *usb, struct ed *ed, struct td *td) in add_packet() argument
192 if (usb->port_status == FHCI_PORT_FULL) in add_packet()
198 if (usb->actual_frame->total_bytes + len + PROTOCOL_OVERHEAD >= in add_packet()
199 usb->max_bytes_per_frame) { in add_packet()
200 fhci_vdbg(usb->fhci, "not enough space in this frame: " in add_packet()
201 "%d %d %d\n", usb->actual_frame->total_bytes, len, in add_packet()
202 usb->max_bytes_per_frame); in add_packet()
207 if (usb->actual_frame->frame_status != FRAME_IS_PREPARED && in add_packet()
208 (usb->actual_frame->frame_status & FRAME_END_TRANSMISSION || in add_packet()
209 (fw_transaction_time + usb->sw_transaction_time >= in add_packet()
210 1000 - fhci_get_sof_timer_count(usb)))) { in add_packet()
211 fhci_dbg(usb->fhci, "not enough time in this frame\n"); in add_packet()
216 pkt = cq_get(&usb->ep0->empty_frame_Q); in add_packet()
218 fhci_dbg(usb->fhci, "there is no empty frame\n"); in add_packet()
225 data = cq_get(&usb->ep0->dummy_packets_Q); in add_packet()
235 usb->actual_frame->total_bytes += (len + PROTOCOL_OVERHEAD); in add_packet()
236 fhci_add_td_to_frame(usb->actual_frame, td); in add_packet()
238 if (usb->port_status != FHCI_PORT_FULL && in add_packet()
239 usb->port_status != FHCI_PORT_LOW) { in add_packet()
242 fhci_transaction_confirm(usb, pkt); in add_packet()
243 } else if (fhci_host_transaction(usb, pkt, td->type, ed->dev_addr, in add_packet()
249 cq_put(&usb->ep0->dummy_packets_Q, pkt->data); in add_packet()
250 recycle_frame(usb, pkt); in add_packet()
251 usb->actual_frame->total_bytes -= (len + PROTOCOL_OVERHEAD); in add_packet()
252 fhci_err(usb->fhci, "host transaction failed\n"); in add_packet()
272 static int scan_ed_list(struct fhci_usb *usb, in scan_ed_list() argument
286 u32 save_transaction_time = usb->sw_transaction_time; in scan_ed_list()
297 fhci_move_td_from_ed_to_done_list(usb, ed); in scan_ed_list()
308 (((usb->actual_frame->frame_num - in scan_ed_list()
312 if (add_packet(usb, ed, td) < 0) in scan_ed_list()
316 td->start_frame = usb->actual_frame->frame_num; in scan_ed_list()
317 usb->sw_transaction_time += save_transaction_time; in scan_ed_list()
319 if (usb->actual_frame->total_bytes >= in scan_ed_list()
320 usb->max_bytes_per_frame) { in scan_ed_list()
321 usb->actual_frame->frame_status = in scan_ed_list()
323 fhci_push_dummy_bd(usb->ep0); in scan_ed_list()
328 if (usb->actual_frame->total_bytes >= frame_part[list_type]) in scan_ed_list()
334 usb->sw_transaction_time = save_transaction_time; in scan_ed_list()
339 static u32 rotate_frames(struct fhci_usb *usb) in rotate_frames() argument
341 struct fhci_hcd *fhci = usb->fhci; in rotate_frames()
343 if (!list_empty(&usb->actual_frame->tds_list)) { in rotate_frames()
345 usb->actual_frame->frame_num) & 0x7ff) > 5) in rotate_frames()
346 fhci_flush_actual_frame(usb); in rotate_frames()
351 usb->actual_frame->frame_status = FRAME_IS_PREPARED; in rotate_frames()
352 usb->actual_frame->frame_num = in_be16(&fhci->pram->frame_num) & 0x7ff; in rotate_frames()
353 usb->actual_frame->total_bytes = 0; in rotate_frames()
362 void fhci_schedule_transactions(struct fhci_usb *usb) in fhci_schedule_transactions() argument
366 if (usb->actual_frame->frame_status & FRAME_END_TRANSMISSION) in fhci_schedule_transactions()
367 if (rotate_frames(usb) != 0) in fhci_schedule_transactions()
370 if (usb->actual_frame->frame_status & FRAME_END_TRANSMISSION) in fhci_schedule_transactions()
373 if (usb->actual_frame->total_bytes == 0) { in fhci_schedule_transactions()
378 scan_ed_list(usb, &usb->hc_list->iso_list, FHCI_TF_ISO); in fhci_schedule_transactions()
384 scan_ed_list(usb, &usb->hc_list->intr_list, FHCI_TF_INTR); in fhci_schedule_transactions()
390 left = scan_ed_list(usb, &usb->hc_list->ctrl_list, in fhci_schedule_transactions()
399 scan_ed_list(usb, &usb->hc_list->bulk_list, FHCI_TF_BULK); in fhci_schedule_transactions()
405 struct fhci_usb *usb = fhci->usb_lld; in sof_interrupt() local
407 if ((usb->port_status == FHCI_PORT_DISABLED) && in sof_interrupt()
408 (usb->vroot_hub->port.wPortStatus & USB_PORT_STAT_CONNECTION) && in sof_interrupt()
409 !(usb->vroot_hub->port.wPortChange & USB_PORT_STAT_C_CONNECTION)) { in sof_interrupt()
410 if (usb->vroot_hub->port.wPortStatus & USB_PORT_STAT_LOW_SPEED) in sof_interrupt()
411 usb->port_status = FHCI_PORT_LOW; in sof_interrupt()
413 usb->port_status = FHCI_PORT_FULL; in sof_interrupt()
415 usb->saved_msk &= ~USB_E_IDLE_MASK; in sof_interrupt()
416 out_be16(&usb->fhci->regs->usb_usbmr, usb->saved_msk); in sof_interrupt()
419 gtm_set_exact_timer16(fhci->timer, usb->max_frame_usage, false); in sof_interrupt()
421 fhci_host_transmit_actual_frame(usb); in sof_interrupt()
422 usb->actual_frame->frame_status = FRAME_IS_TRANSMITTED; in sof_interrupt()
424 fhci_schedule_transactions(usb); in sof_interrupt()
430 struct fhci_usb *usb = fhci->usb_lld; in fhci_device_disconnected_interrupt() local
434 fhci_usb_disable_interrupt(usb); in fhci_device_disconnected_interrupt()
435 clrbits8(&usb->fhci->regs->usb_usmod, USB_MODE_LSS); in fhci_device_disconnected_interrupt()
436 usb->port_status = FHCI_PORT_DISABLED; in fhci_device_disconnected_interrupt()
441 usb->saved_msk |= USB_E_IDLE_MASK; in fhci_device_disconnected_interrupt()
442 out_be16(&usb->fhci->regs->usb_usbmr, usb->saved_msk); in fhci_device_disconnected_interrupt()
444 usb->vroot_hub->port.wPortStatus &= ~USB_PORT_STAT_CONNECTION; in fhci_device_disconnected_interrupt()
445 usb->vroot_hub->port.wPortChange |= USB_PORT_STAT_C_CONNECTION; in fhci_device_disconnected_interrupt()
446 usb->max_bytes_per_frame = 0; in fhci_device_disconnected_interrupt()
447 fhci_usb_enable_interrupt(usb); in fhci_device_disconnected_interrupt()
456 struct fhci_usb *usb = fhci->usb_lld; in fhci_device_connected_interrupt() local
462 fhci_usb_disable_interrupt(usb); in fhci_device_connected_interrupt()
474 usb->port_status = FHCI_PORT_LOW; in fhci_device_connected_interrupt()
475 setbits8(&usb->fhci->regs->usb_usmod, USB_MODE_LSS); in fhci_device_connected_interrupt()
476 usb->vroot_hub->port.wPortStatus |= in fhci_device_connected_interrupt()
479 usb->vroot_hub->port.wPortChange |= in fhci_device_connected_interrupt()
481 usb->max_bytes_per_frame = in fhci_device_connected_interrupt()
483 fhci_port_enable(usb); in fhci_device_connected_interrupt()
492 usb->port_status = FHCI_PORT_FULL; in fhci_device_connected_interrupt()
493 clrbits8(&usb->fhci->regs->usb_usmod, USB_MODE_LSS); in fhci_device_connected_interrupt()
494 usb->vroot_hub->port.wPortStatus &= in fhci_device_connected_interrupt()
496 usb->vroot_hub->port.wPortStatus |= in fhci_device_connected_interrupt()
498 usb->vroot_hub->port.wPortChange |= in fhci_device_connected_interrupt()
500 usb->max_bytes_per_frame = (MAX_BYTES_PER_FRAME - 15); in fhci_device_connected_interrupt()
501 fhci_port_enable(usb); in fhci_device_connected_interrupt()
504 fhci_usb_enable_interrupt(usb); in fhci_device_connected_interrupt()
512 struct fhci_usb *usb = fhci->usb_lld; in fhci_frame_limit_timer_irq() local
518 if (usb->actual_frame->frame_status == FRAME_IS_TRANSMITTED) { in fhci_frame_limit_timer_irq()
519 usb->actual_frame->frame_status = FRAME_TIMER_END_TRANSMISSION; in fhci_frame_limit_timer_irq()
520 fhci_push_dummy_bd(usb->ep0); in fhci_frame_limit_timer_irq()
523 fhci_schedule_transactions(usb); in fhci_frame_limit_timer_irq()
531 static void abort_transmission(struct fhci_usb *usb) in abort_transmission() argument
533 fhci_dbg(usb->fhci, "-> %s\n", __func__); in abort_transmission()
537 out_8(&usb->fhci->regs->usb_uscom, USB_CMD_FLUSH_FIFO | EP_ZERO); in abort_transmission()
540 fhci_flush_bds(usb); in abort_transmission()
543 fhci_dbg(usb->fhci, "<- %s\n", __func__); in abort_transmission()
549 struct fhci_usb *usb; in fhci_irq() local
555 usb = fhci->usb_lld; in fhci_irq()
557 usb_er |= in_be16(&usb->fhci->regs->usb_usber) & in fhci_irq()
558 in_be16(&usb->fhci->regs->usb_usbmr); in fhci_irq()
561 out_be16(&usb->fhci->regs->usb_usber, usb_er); in fhci_irq()
566 if ((usb->port_status == FHCI_PORT_FULL) || in fhci_irq()
567 (usb->port_status == FHCI_PORT_LOW)) { in fhci_irq()
570 } else if (usb->port_status == FHCI_PORT_WAITING) { in fhci_irq()
571 usb->port_status = FHCI_PORT_DISCONNECTING; in fhci_irq()
574 usb->saved_msk |= USB_E_IDLE_MASK; in fhci_irq()
575 out_be16(&usb->fhci->regs->usb_usber, in fhci_irq()
576 usb->saved_msk); in fhci_irq()
577 } else if (usb->port_status == FHCI_PORT_DISABLED) { in fhci_irq()
605 if (usb->port_status == FHCI_PORT_DISABLED) { in fhci_irq()
608 } else if (usb->port_status == in fhci_irq()
612 usb->saved_msk &= ~USB_E_IDLE_MASK; in fhci_irq()
613 out_be16(&usb->fhci->regs->usb_usbmr, in fhci_irq()
614 usb->saved_msk); in fhci_irq()