I said:
>> 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.
Erik replied:
> in that case, shouldn't these three blocks be reverted?
Erik is right, I was talking through my hat. It's OK to open bulk
endpoints read/write, and the kernel will do the right thing. The
actual problem, which neither of us had spotted although it was
staring us in the face, is this:
if((ep->dir == Ein || ep->dir == Eboth) && epin == -1)
epin = ep->id;
if((ep->dir == Ein || ep->dir == Eboth) && epout == -1)
epout = ep->id;
Notice the two occurrences of Ein? The second one obviously should
be Eout. It was a typo (mine, I blush to admit).
My usb serial adapter uses the same ep number for input and output,
so my testing didn't reveal this error. I think the same typo will
account for the double-free bug which Jeff (and Lucio on 4 Feb) reported.
Erik, Jeff, Lucio - please try changing the offending Ein to Eout in
/sys/src/cmd/usb/serial/serial.c:721 and see if your troubles are resolved.