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