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