From mboxrd@z Thu Jan 1 00:00:00 1970 From: erik quanstrom Date: Thu, 14 Feb 2013 09:33:10 -0500 To: 9fans@9fans.net Message-ID: <54c0ba490a70bb58de6700d2c4e7bd96@brasstown.quanstro.net> In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit Subject: Re: [9fans] usb serial bug Topicbox-Message-UUID: 1772f0ea-ead8-11e9-9d60-3106f5b1d025 On Thu Feb 14 05:24:27 EST 2013, 9fans@hamnavoe.com wrote: > > this is a WORKAROUND. a proper fix would be something > > like allowing ORDWR in usbopen if that is indeed the problem. > > No, endpoints are unidirectional by design; in the usb spec there are > no read/write endpoints. The confusing thing in the spec is that two > different endpoints can have the same endpoint number - they are > distinguished by direction. So what looks like a read/write endpoint > number 1 is really two separate endpoints, input ep 1 and output ep 1. > The current Plan 9 usb architecture perpetuates the confusion by > referring to them both with one name epN.1, but you still have to open > them both independently. > > in that case, shouldn't these three blocks be reverted? - erik /n/dump/2012/1201/sys/src/cmd/usb/serial/serial.c:648,654 - /n/dump/2013/0212/sys/src/cmd/usb/serial/serial.c:647,657 fprint(2, "serial: openep %d: %r\n", epin); return -1; } - p->epout = openep(ser->dev, epout); + if(epout == epin){ + incref(p->epin); + p->epout = p->epin; + }else + p->epout = openep(ser->dev, epout); if(p->epout == nil){ fprint(2, "serial: openep %d: %r\n", epout); closedev(p->epin); /n/dump/2012/1201/sys/src/cmd/usb/serial/serial.c:674,681 - /n/dump/2013/0212/sys/src/cmd/usb/serial/serial.c:677,688 if(ser->seteps!= nil) ser->seteps(p); - opendevdata(p->epin, OREAD); - opendevdata(p->epout, OWRITE); + if(p->epin == p->epout) + opendevdata(p->epin, ORDWR); + else{ + opendevdata(p->epin, OREAD); + opendevdata(p->epout, OWRITE); + } if(p->epin->dfd < 0 ||p->epout->dfd < 0 || (ser->hasepintr && p->epintr->dfd < 0)){ fprint(2, "serial: open i/o ep data: %r\n"); /n/dump/2012/1201/sys/src/cmd/usb/serial/serial.c:709,717 - /n/dump/2013/0212/sys/src/cmd/usb/serial/serial.c:716,724 ep->dir == Ein && epintr == -1) epintr = ep->id; if(ep->type == Ebulk){ - if(ep->dir == Ein && epin == -1) + if((ep->dir == Ein || ep->dir == Eboth) && epin == -1) epin = ep->id; - if(ep->dir == Eout && epout == -1) + if((ep->dir == Ein || ep->dir == Eboth) && epout == -1) epout = ep->id; } }