static void usb_flush(struct consumer const *consumer) { struct usb_stream_config const *config = DOWNCAST(consumer, struct usb_stream_config, consumer); while (tx_fifo_is_ready(config) && queue_count(consumer->queue)) ; }
/* Try to send some bytes to the host */ static void tx_fifo_handler(void) { size_t count; if (!is_reset) return; /* If the HW FIFO isn't ready, then we can't do anything right now. */ if (!tx_fifo_is_ready()) return; count = get_bytes_from_blob(ep_buf_tx, USB_MAX_PACKET_SIZE); if (count) usb_enable_tx(count); }
/* Try to send some bytes to the host */ static void tx_fifo_handler(void) { struct dwc_usb_ep *ep = &ep_console_ctl; size_t count; if (!is_reset) return; /* If the HW FIFO isn't ready, then we can't do anything right now. */ if (!tx_fifo_is_ready()) return; count = QUEUE_REMOVE_UNITS(&tx_q, ep->in_databuffer, USB_MAX_PACKET_SIZE); if (count) usb_enable_tx(count); }
static int usb_wait_console(void) { timestamp_t deadline = get_time(); int wait_time_us = 1; if (!is_enabled || !tx_fifo_is_ready()) return EC_SUCCESS; deadline.val += USB_CONSOLE_TIMEOUT_US; /* * If the USB console is not used, Tx buffer would never free up. * In this case, let's drop characters immediately instead of sitting * for some time just to time out. On the other hand, if the last * Tx is good, it's likely the host is there to receive data, and * we should wait so that we don't clobber the buffer. */ if (last_tx_ok) { while (queue_space(&tx_q) < USB_MAX_PACKET_SIZE || !is_reset) { if (timestamp_expired(deadline, NULL) || in_interrupt_context()) { last_tx_ok = 0; return EC_ERROR_TIMEOUT; } if (wait_time_us < MSEC) udelay(wait_time_us); else usleep(wait_time_us); wait_time_us *= 2; } return EC_SUCCESS; } last_tx_ok = queue_space(&tx_q); return EC_SUCCESS; }