<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-e1-hardware/+/21777">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">icE1usb: Report errors via the newly-added Interrupt Endpoint<br><br>Instead of just reporting flags, we actually report error counts<br>so the host software can maintain proper (rate) counter about the<br>frequency of each type of error.<br><br>Closes: OS#4674<br>Change-Id: If157fde9d4ca05910b09537e19f37603c6d925f0<br>---<br>M firmware/ice40-riscv/icE1usb/ice1usb_proto.h<br>M firmware/ice40-riscv/icE1usb/usb_desc_app.c<br>M firmware/ice40-riscv/icE1usb/usb_e1.c<br>3 files changed, 79 insertions(+), 2 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-e1-hardware refs/changes/77/21777/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/firmware/ice40-riscv/icE1usb/ice1usb_proto.h b/firmware/ice40-riscv/icE1usb/ice1usb_proto.h</span><br><span>index b636ec6..5f5f31c 100644</span><br><span>--- a/firmware/ice40-riscv/icE1usb/ice1usb_proto.h</span><br><span>+++ b/firmware/ice40-riscv/icE1usb/ice1usb_proto.h</span><br><span>@@ -68,3 +68,32 @@</span><br><span> struct ice1usb_rx_config {</span><br><span>   uint8_t mode;           /*!< enum ice1usb_rx_mode */</span><br><span> } __attribute__((packed));</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%);">+ * Interrupt Endpoint</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%);">+enum ice1usb_irq_type {</span><br><span style="color: hsl(120, 100%, 40%);">+      ICE1USB_IRQQ_T_ERRCNT           = 1,</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%);">+/* Ensue ro keep those in sync with e1.h */</span><br><span style="color: hsl(120, 100%, 40%);">+#define ICE1USB_ERR_F_ALIGN_ERR        0x01</span><br><span style="color: hsl(120, 100%, 40%);">+#define ICE1USB_ERR_F_TICK_ERR    0x02</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct ice1usb_irq_err {</span><br><span style="color: hsl(120, 100%, 40%);">+      /* 16-bit little-endian counters */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint16_t crc;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t align;</span><br><span style="color: hsl(120, 100%, 40%);">+       uint16_t ovfl;</span><br><span style="color: hsl(120, 100%, 40%);">+        uint16_t unfl;</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t flags;</span><br><span style="color: hsl(120, 100%, 40%);">+} __attribute__((packed));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct ice1usb_irq {</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t type;           /*!< enum ice1usb_irq_type */</span><br><span style="color: hsl(120, 100%, 40%);">+      union {</span><br><span style="color: hsl(120, 100%, 40%);">+               struct ice1usb_irq_err errors;</span><br><span style="color: hsl(120, 100%, 40%);">+        } u;</span><br><span style="color: hsl(120, 100%, 40%);">+} __attribute__((packed));</span><br><span>diff --git a/firmware/ice40-riscv/icE1usb/usb_desc_app.c b/firmware/ice40-riscv/icE1usb/usb_desc_app.c</span><br><span>index 9fe3968..153d70e 100644</span><br><span>--- a/firmware/ice40-riscv/icE1usb/usb_desc_app.c</span><br><span>+++ b/firmware/ice40-riscv/icE1usb/usb_desc_app.c</span><br><span>@@ -28,12 +28,14 @@</span><br><span>                      struct usb_ep_desc ep_data_in;</span><br><span>                       struct usb_ep_desc ep_data_out;</span><br><span>                      struct usb_ep_desc ep_fb;</span><br><span style="color: hsl(120, 100%, 40%);">+                     struct usb_ep_desc ep_interrupt;</span><br><span>             } __attribute__ ((packed)) off;</span><br><span>              struct {</span><br><span>                     struct usb_intf_desc intf;</span><br><span>                   struct usb_ep_desc ep_data_in;</span><br><span>                       struct usb_ep_desc ep_data_out;</span><br><span>                      struct usb_ep_desc ep_fb;</span><br><span style="color: hsl(120, 100%, 40%);">+                     struct usb_ep_desc ep_interrupt;</span><br><span>             } __attribute__ ((packed)) on;</span><br><span>       } __attribute__ ((packed)) e1;</span><br><span> </span><br><span>@@ -79,7 +81,7 @@</span><br><span>                               .bDescriptorType        = USB_DT_INTF,</span><br><span>                               .bInterfaceNumber       = 0,</span><br><span>                                 .bAlternateSetting      = 0,</span><br><span style="color: hsl(0, 100%, 40%);">-                            .bNumEndpoints          = 3,</span><br><span style="color: hsl(120, 100%, 40%);">+                          .bNumEndpoints          = 4,</span><br><span>                                 .bInterfaceClass        = 0xff,</span><br><span>                              .bInterfaceSubClass     = 0xe1,</span><br><span>                              .bInterfaceProtocol     = 0x00,</span><br><span>@@ -109,6 +111,14 @@</span><br><span>                               .wMaxPacketSize         = 0,</span><br><span>                                 .bInterval              = 3,</span><br><span>                         },</span><br><span style="color: hsl(120, 100%, 40%);">+                    .ep_interrupt = {</span><br><span style="color: hsl(120, 100%, 40%);">+                             .bLength                = sizeof(struct usb_ep_desc),</span><br><span style="color: hsl(120, 100%, 40%);">+                         .bDescriptorType        = USB_DT_EP,</span><br><span style="color: hsl(120, 100%, 40%);">+                          .bEndpointAddress       = 0x83,</span><br><span style="color: hsl(120, 100%, 40%);">+                               .bmAttributes           = 0x03,</span><br><span style="color: hsl(120, 100%, 40%);">+                               .wMaxPacketSize         = 10,</span><br><span style="color: hsl(120, 100%, 40%);">+                         .bInterval              = 3,</span><br><span style="color: hsl(120, 100%, 40%);">+                  },</span><br><span>           },</span><br><span>           .on = {</span><br><span>                      .intf = {</span><br><span>@@ -116,7 +126,7 @@</span><br><span>                              .bDescriptorType        = USB_DT_INTF,</span><br><span>                               .bInterfaceNumber       = 0,</span><br><span>                                 .bAlternateSetting      = 1,</span><br><span style="color: hsl(0, 100%, 40%);">-                            .bNumEndpoints          = 3,</span><br><span style="color: hsl(120, 100%, 40%);">+                          .bNumEndpoints          = 4,</span><br><span>                                 .bInterfaceClass        = 0xff,</span><br><span>                              .bInterfaceSubClass     = 0xe1,</span><br><span>                              .bInterfaceProtocol     = 0x00,</span><br><span>@@ -146,6 +156,14 @@</span><br><span>                               .wMaxPacketSize         = 8,</span><br><span>                                 .bInterval              = 3,</span><br><span>                         },</span><br><span style="color: hsl(120, 100%, 40%);">+                    .ep_interrupt = {</span><br><span style="color: hsl(120, 100%, 40%);">+                             .bLength                = sizeof(struct usb_ep_desc),</span><br><span style="color: hsl(120, 100%, 40%);">+                         .bDescriptorType        = USB_DT_EP,</span><br><span style="color: hsl(120, 100%, 40%);">+                          .bEndpointAddress       = 0x83,</span><br><span style="color: hsl(120, 100%, 40%);">+                               .bmAttributes           = 0x03,</span><br><span style="color: hsl(120, 100%, 40%);">+                               .wMaxPacketSize         = 10,</span><br><span style="color: hsl(120, 100%, 40%);">+                         .bInterval              = 3,</span><br><span style="color: hsl(120, 100%, 40%);">+                  },</span><br><span>           },</span><br><span>   },</span><br><span> #if 0</span><br><span>diff --git a/firmware/ice40-riscv/icE1usb/usb_e1.c b/firmware/ice40-riscv/icE1usb/usb_e1.c</span><br><span>index f94b897..bb21998 100644</span><br><span>--- a/firmware/ice40-riscv/icE1usb/usb_e1.c</span><br><span>+++ b/firmware/ice40-riscv/icE1usb/usb_e1.c</span><br><span>@@ -25,6 +25,7 @@</span><br><span>     int in_bdi;             /* buffer descriptor index for IN EP */</span><br><span>      struct ice1usb_tx_config tx_cfg;</span><br><span>     struct ice1usb_rx_config rx_cfg;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct e1_error_count last_err;</span><br><span> } g_usb_e1 = {</span><br><span>    /* default configuration at power-up */</span><br><span>      .tx_cfg = {</span><br><span>@@ -86,6 +87,29 @@</span><br><span>     if (!g_usb_e1.running)</span><br><span>               return;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   /* EP3 IRQ */</span><br><span style="color: hsl(120, 100%, 40%);">+ if ((usb_ep_regs[3].in.bd[0].csr & USB_BD_STATE_MSK) != USB_BD_STATE_RDY_DATA) {</span><br><span style="color: hsl(120, 100%, 40%);">+          const struct e1_error_count *cur_err = e1_get_error_count();</span><br><span style="color: hsl(120, 100%, 40%);">+          if (memcmp(cur_err, &g_usb_e1.last_err, sizeof(*cur_err))) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      struct ice1usb_irq errmsg = {</span><br><span style="color: hsl(120, 100%, 40%);">+                         .type = ICE1USB_IRQQ_T_ERRCNT,</span><br><span style="color: hsl(120, 100%, 40%);">+                                .u = {</span><br><span style="color: hsl(120, 100%, 40%);">+                                        .errors = {</span><br><span style="color: hsl(120, 100%, 40%);">+                                           .crc = cur_err->crc,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               .align = cur_err->align,</span><br><span style="color: hsl(120, 100%, 40%);">+                                           .ovfl = cur_err->ovfl,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             .unfl = cur_err->unfl,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             .flags = cur_err->flags,</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%);">+                    printf("E");</span><br><span style="color: hsl(120, 100%, 40%);">+                        usb_data_write(usb_ep_regs[3].in.bd[0].ptr, &errmsg, sizeof(errmsg));</span><br><span style="color: hsl(120, 100%, 40%);">+                     usb_ep_regs[3].in.bd[0].csr = USB_BD_STATE_RDY_DATA | USB_BD_LEN(sizeof(errmsg));</span><br><span style="color: hsl(120, 100%, 40%);">+                     g_usb_e1.last_err = *cur_err;</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>  /* EP2 IN */</span><br><span>         bdi = g_usb_e1.in_bdi;</span><br><span> </span><br><span>@@ -212,6 +236,7 @@</span><br><span>     usb_ep_boot(intf, 0x01, true);</span><br><span>       usb_ep_boot(intf, 0x81, true);</span><br><span>       usb_ep_boot(intf, 0x82, true);</span><br><span style="color: hsl(120, 100%, 40%);">+        usb_ep_boot(intf, 0x83, true);</span><br><span> </span><br><span>   return USB_FND_SUCCESS;</span><br><span> }</span><br><span>@@ -274,6 +299,11 @@</span><br><span>  /* EP1 IN: Queue buffer */</span><br><span>   _usb_fill_feedback_ep();</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  /* EP3 IN: Interrupt */</span><br><span style="color: hsl(120, 100%, 40%);">+       usb_ep_regs[3].in.status = USB_EP_TYPE_INT;</span><br><span style="color: hsl(120, 100%, 40%);">+   usb_ep_regs[3].in.bd[0].ptr = 68;</span><br><span style="color: hsl(120, 100%, 40%);">+     usb_ep_regs[3].in.bd[0].csr = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   return USB_FND_SUCCESS;</span><br><span> }</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-e1-hardware/+/21777">change 21777</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/osmo-e1-hardware/+/21777"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-e1-hardware </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: If157fde9d4ca05910b09537e19f37603c6d925f0 </div>
<div style="display:none"> Gerrit-Change-Number: 21777 </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>