> > > > > > (**) 8.5.1 in the USB 2.0 spec says that after a NYET handshake, > > > > > > "the host controller must return to using a PING token until the > > > > > > endpoint indicates it has space". > > > > > > > > > > > > Clearly, the HDRC did not issue any PINGs ... it just went right > > > > > > to the status handshake. Fishy, and quite possibly something > > > > > > > > > > The PING flow-control is only for the OUT tokens. > > > > > So Host should send PING only if next OUT token is to be sent. > > > > > > > > That "must" language is unambiguous: PING "must" be sent. > > > > There is no "should" in that paragraph of the spec. > > > > Re-read that please ... "must". That's what getting a NYET means. > > Here's the exact text from the spec: > > If the endpoint instead responds to the OUT/DATA transaction with > a NYET handshake, this means that the endpoint accepted the data > but does not have room for another wMaxPacketSize data payload. > The host controller must return to using a PING token until the > endpoint indicates it has space. > > This clearly indicates, even though it doesn't say so explicitly,
Disagree. It says explicitly that it "must" return to PING. It does not create an exception like the one you ascribe to that text. (Note by the way that "wMaxPacketSize" is superfluous. If it's ready for any data at all, it's ready for that much.) > that the > host controller must return to using a PING token _before sending the next > OUT/DATA transaction_ until the endpoint indicates it has space. And implementors are certainly allowed to use the same FIFO for IN transfers, which could have the same "fifo must be ready" constraint as OUT ones do. > The > entire discussion of the PING protocol is centered around the idea of > improved handling of OUT transfers; PINGs aren't needed before IN or SETUP > transactions at all. No, but PINGs *are* needed to finish processing an OUT transfer. Which is what the text says... > After all, what reason could there be for sending a PING before an > IN/DATA? PING asks whether the endpoint has space to store a new > wMaxPacketSize data payload, but with IN transfers the endpoint doesn't > have to store anything. What reason? Well, as noted above, the spec is written so hosts "must" send the PING. Accordingly, peripherals are allowed to rely on that. For example, trusting that the FIFO empties before control IN/STATUS packets start to arrive. > > > That's not right. Here's what the spec says (section 8.5.1): > > > > > > High-speed devices must support an improved NAK mechanism for Bulk > > > OUT and Control endpoints and transactions. Control endpoints > > > must support this protocol for an OUT transaction in the data and > > > status stages. > > > > And ... the OUT/DATA stage can't have completed if a PING was due. > > As soon as the OUT/DATA stage completes, then the IN transactions > > may do their usual thing, and that different paragraph applies. > > No. If a PING is due, it means that the data already sent was received > correctly and hence the data stage _is_ complete. You can see it in the > section I quoted above: "... this means that the endpoint accepted the > data...". You're using a different definition of complete than I am. I'm using the same definition that a normal bulk OUT would use: ready to accept one more OUT packet. (ISTR that peripherals are expected to handle any number of zero length OUT packets at the same point they're expected to start handling the status stage, for example ...) > > Show me that's a misreading of the spec, and I'll agree with you. > > Specifically, that "must" does not seem amenable to any kind of > > misreading. There's no precondition there; not even any kind of > > weasel-wording to support ignoring the "must"-PING sentence. > > I agree about the meaning of "must"; the question is: must do what? The text seems clear to me: must PING until the endpoint has space. > I claim the intention of the spec is that the host must send a PING before > starting another OUT/DATA transaction. Thing is, you're inferring an "intention" that's not written, while ignoring the text that *IS* written. Given a spec, standard practice is to stick to what's written, unless it's ambiguous. (Here, it isn't.) If there's ambiguity, then it's fair to use "intention" to make an educated guess ... but then also update the spec to remove the ambiguity, once everyone agrees on how that should be resolved. > You seem to think it means the host must send a PING Period, no matter what, since that's clearly what the spec says. > before starting the IN/DATA transaction for the > status stage. I don't see how we can determine what the authors of the > spec really had in mind other than by asking them... but my interpretation > makes more sense. See above. > Well, the patch is a separate question. Thinking about it some more, I > doubt it will actually fix the problem. In fact, my best guess is that > for some reason the net2280 doesn't set the DATA_IN_TOKEN_INTERRUPT flag > when the IN token arrives. Maybe some sort of low-level hardware timing > issue. Like ... maybe the NetChip folk took the USB spec at its word? :) Or alternatively, some of the recent net2280 patches broke some of the more subtle race-avoidance logic in that driver. As I mentioned, I saw something rather fishy go flying by at one point; and that particular conditional does look fishy lately. - Dave ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys-and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ linux-usb-devel@lists.sourceforge.net To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel