<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>