<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/simtrace2/+/16804">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">firmware: More common infrastructure for USB handling<br><br>Let's move low-level handling of endpoint queue refill from the<br>individual apps into common/shared code.<br><br>Now the main simply has to call usb_process() for every interface,<br>and inbound messages will be dispatched to call-back functions from<br>there.<br><br>Change-Id: Ic6f9c6c1ffdbb0c9c3b284371ecc83b17e3be746<br>---<br>M firmware/apps/cardem/main.c<br>M firmware/libcommon/include/usb_buf.h<br>M firmware/libcommon/source/host_communication.c<br>M firmware/libcommon/source/mode_cardemu.c<br>M firmware/libcommon/source/sniffer.c<br>5 files changed, 109 insertions(+), 63 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/simtrace2 refs/changes/04/16804/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/firmware/apps/cardem/main.c b/firmware/apps/cardem/main.c</span><br><span>index 3476af2..3170a9e 100644</span><br><span>--- a/firmware/apps/cardem/main.c</span><br><span>+++ b/firmware/apps/cardem/main.c</span><br><span>@@ -220,6 +220,7 @@</span><br><span> }</span><br><span> last_simtrace_config = simtrace_config;</span><br><span> } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ //FIXME: usb_proces() for every interface in this configuration?</span><br><span> if (config_func_ptrs[simtrace_config].run) {</span><br><span> config_func_ptrs[simtrace_config].run();</span><br><span> }</span><br><span>diff --git a/firmware/libcommon/include/usb_buf.h b/firmware/libcommon/include/usb_buf.h</span><br><span>index 3a4eda2..4c795a8 100644</span><br><span>--- a/firmware/libcommon/include/usb_buf.h</span><br><span>+++ b/firmware/libcommon/include/usb_buf.h</span><br><span>@@ -42,5 +42,15 @@</span><br><span> void usb_buf_init(void);</span><br><span> struct usb_buffered_ep *usb_get_buf_ep(uint8_t ep);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int usb_refill_to_host(uint8_t ep);</span><br><span style="color: hsl(0, 100%, 40%);">-int usb_refill_from_host(uint8_t ep);</span><br><span style="color: hsl(120, 100%, 40%);">+struct usb_if {</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t if_num; /* interface number */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t ep_out; /* OUT endpoint (0 if none) */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t ep_in; /* IN endpint (0 if none) */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t ep_int; /* INT endpoint (0 if none) */</span><br><span style="color: hsl(120, 100%, 40%);">+ void *data; /* opaque data, passed through */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* call-back to be called for inclming messages on OUT EP */</span><br><span style="color: hsl(120, 100%, 40%);">+ void (*rx_out)(struct msgb *msg, const struct usb_if *usb_if);</span><br><span style="color: hsl(120, 100%, 40%);">+ } ops;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+void usb_process(const struct usb_if *usb_if);</span><br><span>diff --git a/firmware/libcommon/source/host_communication.c b/firmware/libcommon/source/host_communication.c</span><br><span>index 9a6e5b3..e367b37 100644</span><br><span>--- a/firmware/libcommon/source/host_communication.c</span><br><span>+++ b/firmware/libcommon/source/host_communication.c</span><br><span>@@ -57,7 +57,7 @@</span><br><span> }</span><br><span> </span><br><span> /* check if the spcified IN endpoint is idle and submit the next buffer from queue */</span><br><span style="color: hsl(0, 100%, 40%);">-int usb_refill_to_host(uint8_t ep)</span><br><span style="color: hsl(120, 100%, 40%);">+static int usb_refill_to_host(uint8_t ep)</span><br><span> {</span><br><span> struct usb_buffered_ep *bep = usb_get_buf_ep(ep);</span><br><span> struct msgb *msg;</span><br><span>@@ -130,7 +130,7 @@</span><br><span> }</span><br><span> </span><br><span> /* refill the read queue for data received from host PC on OUT EP, if needed */</span><br><span style="color: hsl(0, 100%, 40%);">-int usb_refill_from_host(uint8_t ep)</span><br><span style="color: hsl(120, 100%, 40%);">+static int usb_refill_from_host(uint8_t ep)</span><br><span> {</span><br><span> struct usb_buffered_ep *bep = usb_get_buf_ep(ep);</span><br><span> struct msgb *msg;</span><br><span>@@ -198,3 +198,45 @@</span><br><span> </span><br><span> return ret;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* iterate over the queue of incoming USB commands and dispatch/execute</span><br><span style="color: hsl(120, 100%, 40%);">+ * them */</span><br><span style="color: hsl(120, 100%, 40%);">+static void process_any_usb_commands(const struct usb_if *usb_if)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct llist_head *queue = usb_get_queue(usb_if->ep_out);</span><br><span style="color: hsl(120, 100%, 40%);">+ struct llist_head *lh;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct msgb *msg;</span><br><span style="color: hsl(120, 100%, 40%);">+ int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* limit the number of iterations to 10, to ensure we don't get</span><br><span style="color: hsl(120, 100%, 40%);">+ * stuck here without returning to main loop processing */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < 10; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* de-queue the list head in an irq-safe way */</span><br><span style="color: hsl(120, 100%, 40%);">+ lh = llist_head_dequeue_irqsafe(queue);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!lh)</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ msg = llist_entry(lh, struct msgb, list);</span><br><span style="color: hsl(120, 100%, 40%);">+ usb_if->ops.rx_out(msg, usb_if);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* perform any action related to USB processing (IRQ/INT/OUT EP refill, handling OUT) */</span><br><span style="color: hsl(120, 100%, 40%);">+void usb_process(const struct usb_if *usb_if)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ /* first try to send any pending messages on IRQ */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (usb_if->ep_int)</span><br><span style="color: hsl(120, 100%, 40%);">+ usb_refill_to_host(usb_if->ep_int);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* then try to send any pending messages on IN */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (usb_if->ep_in)</span><br><span style="color: hsl(120, 100%, 40%);">+ usb_refill_to_host(usb_if->ep_in);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* ensure we can handle incoming USB messages from the</span><br><span style="color: hsl(120, 100%, 40%);">+ * host */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (usb_if->ep_out) {</span><br><span style="color: hsl(120, 100%, 40%);">+ usb_refill_from_host(usb_if->ep_out);</span><br><span style="color: hsl(120, 100%, 40%);">+ process_any_usb_commands(usb_if);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/firmware/libcommon/source/mode_cardemu.c b/firmware/libcommon/source/mode_cardemu.c</span><br><span>index c5c173f..cab3cdf 100644</span><br><span>--- a/firmware/libcommon/source/mode_cardemu.c</span><br><span>+++ b/firmware/libcommon/source/mode_cardemu.c</span><br><span>@@ -34,6 +34,8 @@</span><br><span> </span><br><span> #define TRACE_ENTRY() TRACE_DEBUG("%s entering\r\n", __func__)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void dispatch_received_usb_msg(struct msgb *msg, const struct usb_if *usb_if);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #ifdef PINS_CARDSIM</span><br><span> static const Pin pins_cardsim[] = PINS_CARDSIM;</span><br><span> #endif</span><br><span>@@ -56,9 +58,7 @@</span><br><span> struct ringbuf rb;</span><br><span> struct Usart_info usart_info;</span><br><span> int usb_pending_old;</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t ep_out;</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t ep_in;</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t ep_int;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct usb_if usb_if;</span><br><span> const Pin pin_insert;</span><br><span> #ifdef DETECT_VCC_BY_ADC</span><br><span> uint32_t vcc_uv;</span><br><span>@@ -77,9 +77,16 @@</span><br><span> .id = ID_USART1,</span><br><span> .state = USART_RCV</span><br><span> },</span><br><span style="color: hsl(0, 100%, 40%);">- .ep_out = SIMTRACE_CARDEM_USB_EP_USIM1_DATAOUT,</span><br><span style="color: hsl(0, 100%, 40%);">- .ep_in = SIMTRACE_CARDEM_USB_EP_USIM1_DATAIN,</span><br><span style="color: hsl(0, 100%, 40%);">- .ep_int = SIMTRACE_CARDEM_USB_EP_USIM1_INT,</span><br><span style="color: hsl(120, 100%, 40%);">+ .usb_if = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .if_num = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ep_out = SIMTRACE_CARDEM_USB_EP_USIM1_DATAOUT,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ep_in = SIMTRACE_CARDEM_USB_EP_USIM1_DATAIN,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ep_int = SIMTRACE_CARDEM_USB_EP_USIM1_INT,</span><br><span style="color: hsl(120, 100%, 40%);">+ .data = &cardem_inst[0],</span><br><span style="color: hsl(120, 100%, 40%);">+ .ops = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .rx_out = dispatch_received_usb_msg,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span> #ifdef PIN_SET_USIM1_PRES</span><br><span> .pin_insert = PIN_SET_USIM1_PRES,</span><br><span> #endif</span><br><span>@@ -92,9 +99,16 @@</span><br><span> .id = ID_USART0,</span><br><span> .state = USART_RCV</span><br><span> },</span><br><span style="color: hsl(0, 100%, 40%);">- .ep_out = SIMTRACE_CARDEM_USB_EP_USIM2_DATAOUT,</span><br><span style="color: hsl(0, 100%, 40%);">- .ep_in = SIMTRACE_CARDEM_USB_EP_USIM2_DATAIN,</span><br><span style="color: hsl(0, 100%, 40%);">- .ep_int = SIMTRACE_CARDEM_USB_EP_USIM2_INT,</span><br><span style="color: hsl(120, 100%, 40%);">+ .usb_if = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .if_num = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ep_out = SIMTRACE_CARDEM_USB_EP_USIM2_DATAOUT,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ep_in = SIMTRACE_CARDEM_USB_EP_USIM2_DATAIN,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ep_int = SIMTRACE_CARDEM_USB_EP_USIM2_INT,</span><br><span style="color: hsl(120, 100%, 40%);">+ .data = &cardem_inst[1],</span><br><span style="color: hsl(120, 100%, 40%);">+ .ops = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .rx_out = dispatch_received_usb_msg,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> #ifdef PIN_SET_USIM2_PRES</span><br><span> .pin_insert = PIN_SET_USIM2_PRES,</span><br><span> #endif</span><br><span>@@ -621,8 +635,9 @@</span><br><span> }</span><br><span> </span><br><span> /* handle a single USB command as received from the USB host */</span><br><span style="color: hsl(0, 100%, 40%);">-static void dispatch_usb_command(struct msgb *msg, struct cardem_inst *ci)</span><br><span style="color: hsl(120, 100%, 40%);">+static void dispatch_usb_command(struct msgb *msg, const struct usb_if *usb_if)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+ struct cardem_inst *ci = usb_if->data;</span><br><span> struct simtrace_msg_hdr *sh = (struct simtrace_msg_hdr *) msg->l1h;</span><br><span> </span><br><span> if (msgb_length(msg) < sizeof(*sh)) {</span><br><span>@@ -651,7 +666,8 @@</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void dispatch_received_msg(struct msgb *msg, struct cardem_inst *ci)</span><br><span style="color: hsl(120, 100%, 40%);">+/* handle a single USB transfer as received from the USB host */</span><br><span style="color: hsl(120, 100%, 40%);">+static void dispatch_received_usb_msg(struct msgb *msg, const struct usb_if *usb_if)</span><br><span> {</span><br><span> struct msgb *segm;</span><br><span> struct simtrace_msg_hdr *mh;</span><br><span>@@ -662,7 +678,7 @@</span><br><span> mh = (struct simtrace_msg_hdr *) msg->data;</span><br><span> if (mh->msg_len == msgb_length(msg)) {</span><br><span> /* fast path: only one message in buffer */</span><br><span style="color: hsl(0, 100%, 40%);">- dispatch_usb_command(msg, ci);</span><br><span style="color: hsl(120, 100%, 40%);">+ dispatch_usb_command(msg, usb_if);</span><br><span> return;</span><br><span> }</span><br><span> </span><br><span>@@ -671,22 +687,22 @@</span><br><span> while (1) {</span><br><span> mh = (struct simtrace_msg_hdr *) msg->data;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- segm = usb_buf_alloc(ci->ep_out);</span><br><span style="color: hsl(120, 100%, 40%);">+ segm = usb_buf_alloc(usb_if->ep_out);</span><br><span> if (!segm) {</span><br><span> TRACE_ERROR("%u: ENOMEM during msg segmentation\r\n",</span><br><span style="color: hsl(0, 100%, 40%);">- ci->num);</span><br><span style="color: hsl(120, 100%, 40%);">+ usb_if->if_num);</span><br><span> break;</span><br><span> }</span><br><span> </span><br><span> if (mh->msg_len > msgb_length(msg)) {</span><br><span> TRACE_ERROR("%u: Unexpected large message (%u bytes)\n",</span><br><span style="color: hsl(0, 100%, 40%);">- ci->num, mh->msg_len);</span><br><span style="color: hsl(120, 100%, 40%);">+ usb_if->if_num, mh->msg_len);</span><br><span> usb_buf_free(segm);</span><br><span> } else {</span><br><span> uint8_t *cur = msgb_put(segm, mh->msg_len);</span><br><span> segm->l1h = segm->head;</span><br><span> memcpy(cur, mh, mh->msg_len);</span><br><span style="color: hsl(0, 100%, 40%);">- dispatch_usb_command(segm, ci);</span><br><span style="color: hsl(120, 100%, 40%);">+ dispatch_usb_command(segm, usb_if);</span><br><span> }</span><br><span> /* pull this message */</span><br><span> msgb_pull(msg, mh->msg_len);</span><br><span>@@ -698,35 +714,14 @@</span><br><span> usb_buf_free(msg);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* iterate over the queue of incoming USB commands and dispatch/execute</span><br><span style="color: hsl(0, 100%, 40%);">- * them */</span><br><span style="color: hsl(0, 100%, 40%);">-static void process_any_usb_commands(struct llist_head *main_q,</span><br><span style="color: hsl(0, 100%, 40%);">- struct cardem_inst *ci)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct llist_head *lh;</span><br><span style="color: hsl(0, 100%, 40%);">- struct msgb *msg;</span><br><span style="color: hsl(0, 100%, 40%);">- int i;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* limit the number of iterations to 10, to ensure we don't get</span><br><span style="color: hsl(0, 100%, 40%);">- * stuck here without returning to main loop processing */</span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 0; i < 10; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">- /* de-queue the list head in an irq-safe way */</span><br><span style="color: hsl(0, 100%, 40%);">- lh = llist_head_dequeue_irqsafe(main_q);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!lh)</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- msg = llist_entry(lh, struct msgb, list);</span><br><span style="color: hsl(0, 100%, 40%);">- dispatch_received_msg(msg, ci);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* main loop function, called repeatedly */</span><br><span> void mode_cardemu_run(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- struct llist_head *queue;</span><br><span> unsigned int i;</span><br><span> </span><br><span> for (i = 0; i < ARRAY_SIZE(cardem_inst); i++) {</span><br><span> struct cardem_inst *ci = &cardem_inst[i];</span><br><span style="color: hsl(120, 100%, 40%);">+ struct usb_if *usb_if = &ci->usb_if;</span><br><span> </span><br><span> /* drain the ring buffer from UART into card_emu */</span><br><span> while (1) {</span><br><span>@@ -743,16 +738,6 @@</span><br><span> </span><br><span> process_io_statechg(ci);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* first try to send any pending messages on IRQ */</span><br><span style="color: hsl(0, 100%, 40%);">- usb_refill_to_host(ci->ep_int);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* then try to send any pending messages on IN */</span><br><span style="color: hsl(0, 100%, 40%);">- usb_refill_to_host(ci->ep_in);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* ensure we can handle incoming USB messages from the</span><br><span style="color: hsl(0, 100%, 40%);">- * host */</span><br><span style="color: hsl(0, 100%, 40%);">- usb_refill_from_host(ci->ep_out);</span><br><span style="color: hsl(0, 100%, 40%);">- queue = usb_get_queue(ci->ep_out);</span><br><span style="color: hsl(0, 100%, 40%);">- process_any_usb_commands(queue, ci);</span><br><span style="color: hsl(120, 100%, 40%);">+ usb_process(&ci->usb_if);</span><br><span> }</span><br><span> }</span><br><span>diff --git a/firmware/libcommon/source/sniffer.c b/firmware/libcommon/source/sniffer.c</span><br><span>index 08770e2..78413ec 100644</span><br><span>--- a/firmware/libcommon/source/sniffer.c</span><br><span>+++ b/firmware/libcommon/source/sniffer.c</span><br><span>@@ -974,20 +974,28 @@</span><br><span> usb_msg_upd_len_and_submit(usb_msg);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* handle incoming message from USB OUT EP */</span><br><span style="color: hsl(120, 100%, 40%);">+static void dispatch_usb_out(struct msgb *msg, const struct usb_if *usb_if)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ /* currently we don't need any incoming data */</span><br><span style="color: hsl(120, 100%, 40%);">+ msgb_free(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct usb_if sniffer_usb_if = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .if_num = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ep_in = SIMTRACE_USB_EP_CARD_DATAIN,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ep_int = SIMTRACE_USB_EP_CARD_INT,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ep_out = SIMTRACE_USB_EP_CARD_DATAOUT,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ops = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .rx_out = dispatch_usb_out,</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Main (idle/busy) loop of this USB configuration */</span><br><span> void Sniffer_run(void)</span><br><span> {</span><br><span> /* Handle USB queue */</span><br><span style="color: hsl(0, 100%, 40%);">- /* first try to send any pending messages on INT */</span><br><span style="color: hsl(0, 100%, 40%);">- usb_refill_to_host(SIMTRACE_USB_EP_CARD_INT);</span><br><span style="color: hsl(0, 100%, 40%);">- /* then try to send any pending messages on IN */</span><br><span style="color: hsl(0, 100%, 40%);">- usb_refill_to_host(SIMTRACE_USB_EP_CARD_DATAIN);</span><br><span style="color: hsl(0, 100%, 40%);">- /* ensure we can handle incoming USB messages from the host */</span><br><span style="color: hsl(0, 100%, 40%);">- /* currently we don't need any incoming data</span><br><span style="color: hsl(0, 100%, 40%);">- usb_refill_from_host(SIMTRACE_USB_EP_CARD_DATAOUT);</span><br><span style="color: hsl(0, 100%, 40%);">- struct llist_head *queue = usb_get_queue(SIMTRACE_USB_EP_CARD_DATAOUT);</span><br><span style="color: hsl(0, 100%, 40%);">- process_any_usb_commands(queue);</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(120, 100%, 40%);">+ usb_process(&sniffer_usb_if);</span><br><span> </span><br><span> /* WARNING: the signal data and flags are not synchronized. We have to hope </span><br><span> * the processing is fast enough to not land in the wrong state while data</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/simtrace2/+/16804">change 16804</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/simtrace2/+/16804"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: simtrace2 </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ic6f9c6c1ffdbb0c9c3b284371ecc83b17e3be746 </div>
<div style="display:none"> Gerrit-Change-Number: 16804 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>