On Thu, 2 Jul 2015, Peter Chen wrote: > > If a control-IN transfer has a data stage that is shorter than wLength > > and is a multiple of the ep0 maxpacket value, then the peripheral must > > send a zero-length packet to indicate the end of the data stage. > > Thus, the UDC driver must prepare a zero-length transaction (DTD). > > > > If "one" is "multiple"? > The wLength at setup packet is 64 bytes, Maximum Packet Length at > dQH is 64 bytes, and the Total Bytes at dTD is 64 bytes too, does device > must prepare a zero-length packet? No. Here is the exact rule for when a device must prepare a 0-length packet for a control-IN data stage. Let wlength = le16_to_cpu(setup->wLength) and let act_length = req->length be the actual data length. Then an extra 0-length packet is needed if: act_length > 0 && act_length < wlength && (act_length % maxpacket) == 0. (Note that if act_length == 0 then req already gives rise to a 0-length packet; no additional packets are needed.) Here's another way to describe the same rule: 1. Every packet before the final packet must have size equal to maxpacket. 2. If act_length < wlength then the final packet must have size smaller than maxpacket. 3. If act_length == wlength and act_length > 0 then the final packet must have size > 0. You can check that this is equivalent to the rule above. In the example you gave, act_length == wlength so a 0-length packet isn't needed. > I would like to double confirm it since the iPhone (As host after HNP) > can't work well with it if I have a zero-length packet after 64 bytes packet > which I describe above, if without zero-length packet, the iPhone works well. That means the iPhone is behaving properly. > > The host hardware will recognize when this happens, because the HCD > > will set the appropriate bits in the data-stage qTD. For example, with > > EHCI the HCD will set the Alternate Next qTD Pointer. Or with UHCI, > > the HCD will set the SPD (Short Packet Detect) bit. > > > > I see it in the code, but it is a null pointer (EHCI_LIST_END), does it > mean one qTD (with valid Next qTD Pointer) can handle one 64 byte packet > with or without zero-length packet well both? That is a tricky question, and the full answer involves the complicated details of how EHCI works. Here is a simplified answer. If a transfer requires more than one qTD, then all the qTDs but the last one will have their Alternate Next qTD Pointers set to a special value. The last qTD doesn't need this. Since ehci-hcd never uses more than one qTD for a control transfer data stage, the issue doesn't comes up. But if you look at how ehci-hcd handles large bulk transfers, you will see what I mean. > Any reasons why iPhone can't handle zero-length packet well? When the iPhone receives the 64-byte packet, it thinks the data stage is finished. It moves on to the status stage, where it sends a 0-length packet to the gadget and waits for the acknowledgment. If the gadget is still trying to send a 0-length packet, it won't acknowledge the 0-length packet sent by the iPhone. The status stage will time out and the control transfer will fail. Alan Stern -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html