<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-e1-hardware/+/21784">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, approved
  tnt: Looks good to me, but someone else must approve

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">icE1usb fw: un-configure E1 when altsetting 0 is selected.<br><br>So far we started on altsetting 0->1 transition, but we didn't stop<br>on the inverse 1->0 which typically happens when the host software<br>(osmo-e1d) stops.<br><br>Closes: OS#4676<br>Change-Id: I8e4817f68d8893ab2dc98fe93ce9a673e209ca63<br>---<br>M firmware/ice40-riscv/icE1usb/usb_e1.c<br>1 file changed, 57 insertions(+), 29 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/firmware/ice40-riscv/icE1usb/usb_e1.c b/firmware/ice40-riscv/icE1usb/usb_e1.c</span><br><span>index bbbb24e..11402c6 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>@@ -263,46 +263,74 @@</span><br><span>       if (base->bInterfaceNumber != 0)</span><br><span>          return USB_FND_CONTINUE;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    if (sel->bAlternateSetting != 1)</span><br><span style="color: hsl(0, 100%, 40%);">-             return USB_FND_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+       switch (sel->bAlternateSetting) {</span><br><span style="color: hsl(120, 100%, 40%);">+  case 0:</span><br><span style="color: hsl(120, 100%, 40%);">+               if (!g_usb_e1.running)</span><br><span style="color: hsl(120, 100%, 40%);">+                        return USB_FND_SUCCESS;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     /* Hack to avoid re-setting while running ... avoid BD desync */</span><br><span style="color: hsl(0, 100%, 40%);">-        if (g_usb_e1.running)</span><br><span style="color: hsl(0, 100%, 40%);">-           return USB_FND_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+               /* disable E1 rx/tx */</span><br><span style="color: hsl(120, 100%, 40%);">+                e1_init(0, 0);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      _perform_rx_config();</span><br><span style="color: hsl(0, 100%, 40%);">-   _perform_tx_config();</span><br><span style="color: hsl(120, 100%, 40%);">+         /* EP1 OUT */</span><br><span style="color: hsl(120, 100%, 40%);">+         usb_ep_regs[1].out.bd[0].csr = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+             usb_ep_regs[1].out.bd[1].csr = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   g_usb_e1.running = true;</span><br><span style="color: hsl(120, 100%, 40%);">+              /* EP1 IN (feedback) */</span><br><span style="color: hsl(120, 100%, 40%);">+               usb_ep_regs[1].in.bd[0].csr = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    /* Configure EP1 OUT / EP2 IN */</span><br><span style="color: hsl(0, 100%, 40%);">-        usb_ep_regs[1].out.status = USB_EP_TYPE_ISOC | USB_EP_BD_DUAL;  /* Type=Isochronous, dual buffered */</span><br><span style="color: hsl(0, 100%, 40%);">-   usb_ep_regs[2].in.status  = USB_EP_TYPE_ISOC | USB_EP_BD_DUAL;  /* Type=Isochronous, dual buffered */</span><br><span style="color: hsl(120, 100%, 40%);">+         /* EP2 IN (data) */</span><br><span style="color: hsl(120, 100%, 40%);">+           usb_ep_regs[2].in.bd[0].csr = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+              usb_ep_regs[2].in.bd[1].csr = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    /* Configure EP1 IN (feedback) */</span><br><span style="color: hsl(0, 100%, 40%);">-       usb_ep_regs[1].in.status  = USB_EP_TYPE_ISOC; /* Type=Isochronous, single buffered */</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.bd[0].csr = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    /* EP2 IN: Prepare two buffers */</span><br><span style="color: hsl(0, 100%, 40%);">-       usb_ep_regs[2].in.bd[0].ptr = 1024;</span><br><span style="color: hsl(0, 100%, 40%);">-     usb_ep_regs[2].in.bd[0].csr = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+              g_usb_e1.running = false;</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case 1:</span><br><span style="color: hsl(120, 100%, 40%);">+               /* Hack to avoid re-setting while running ... avoid BD desync */</span><br><span style="color: hsl(120, 100%, 40%);">+              if (g_usb_e1.running)</span><br><span style="color: hsl(120, 100%, 40%);">+                 return USB_FND_SUCCESS;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     usb_ep_regs[2].in.bd[1].ptr = 1536;</span><br><span style="color: hsl(0, 100%, 40%);">-     usb_ep_regs[2].in.bd[1].csr = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+              _perform_rx_config();</span><br><span style="color: hsl(120, 100%, 40%);">+         _perform_tx_config();</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       /* EP1 OUT: Queue two buffers */</span><br><span style="color: hsl(0, 100%, 40%);">-        usb_ep_regs[1].out.bd[0].ptr = 1024;</span><br><span style="color: hsl(0, 100%, 40%);">-    usb_ep_regs[1].out.bd[0].csr = USB_BD_STATE_RDY_DATA | USB_BD_LEN(388);</span><br><span style="color: hsl(120, 100%, 40%);">+               g_usb_e1.running = true;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    usb_ep_regs[1].out.bd[1].ptr = 1536;</span><br><span style="color: hsl(0, 100%, 40%);">-    usb_ep_regs[1].out.bd[1].csr = USB_BD_STATE_RDY_DATA | USB_BD_LEN(388);</span><br><span style="color: hsl(120, 100%, 40%);">+               /* Configure EP1 OUT / EP2 IN */</span><br><span style="color: hsl(120, 100%, 40%);">+              usb_ep_regs[1].out.status = USB_EP_TYPE_ISOC | USB_EP_BD_DUAL;  /* Type=Isochronous, dual buffered */</span><br><span style="color: hsl(120, 100%, 40%);">+         usb_ep_regs[2].in.status  = USB_EP_TYPE_ISOC | USB_EP_BD_DUAL;  /* Type=Isochronous, dual buffered */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       /* EP1 IN: Queue buffer */</span><br><span style="color: hsl(0, 100%, 40%);">-      _usb_fill_feedback_ep();</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Configure EP1 IN (feedback) */</span><br><span style="color: hsl(120, 100%, 40%);">+             usb_ep_regs[1].in.status  = USB_EP_TYPE_ISOC; /* Type=Isochronous, single buffered */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       /* EP3 IN: Interrupt */</span><br><span style="color: hsl(0, 100%, 40%);">- usb_ep_regs[3].in.status = USB_EP_TYPE_INT;</span><br><span style="color: hsl(0, 100%, 40%);">-     usb_ep_regs[3].in.bd[0].ptr = 68;</span><br><span style="color: hsl(0, 100%, 40%);">-       usb_ep_regs[3].in.bd[0].csr = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+              /* EP2 IN: Prepare two buffers */</span><br><span style="color: hsl(120, 100%, 40%);">+             g_usb_e1.in_bdi = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+          usb_ep_regs[2].in.bd[0].ptr = 1024;</span><br><span style="color: hsl(120, 100%, 40%);">+           usb_ep_regs[2].in.bd[0].csr = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            usb_ep_regs[2].in.bd[1].ptr = 1536;</span><br><span style="color: hsl(120, 100%, 40%);">+           usb_ep_regs[2].in.bd[1].csr = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            /* EP1 OUT: Queue two buffers */</span><br><span style="color: hsl(120, 100%, 40%);">+              g_usb_e1.out_bdi = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+         usb_ep_regs[1].out.bd[0].ptr = 1024;</span><br><span style="color: hsl(120, 100%, 40%);">+          usb_ep_regs[1].out.bd[0].csr = USB_BD_STATE_RDY_DATA | USB_BD_LEN(388);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             usb_ep_regs[1].out.bd[1].ptr = 1536;</span><br><span style="color: hsl(120, 100%, 40%);">+          usb_ep_regs[1].out.bd[1].csr = USB_BD_STATE_RDY_DATA | USB_BD_LEN(388);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             /* EP1 IN: Queue buffer */</span><br><span style="color: hsl(120, 100%, 40%);">+            _usb_fill_feedback_ep();</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              return USB_FND_ERROR;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span>        return USB_FND_SUCCESS;</span><br><span> }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-e1-hardware/+/21784">change 21784</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/+/21784"/><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: I8e4817f68d8893ab2dc98fe93ce9a673e209ca63 </div>
<div style="display:none"> Gerrit-Change-Number: 21784 </div>
<div style="display:none"> Gerrit-PatchSet: 7 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: tnt <tnt@246tNt.com> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>