Hi, Mathias Nyman <mathias.nyman@xxxxxxxxxxxxxxx> writes: > TD fragments section 4.11.7.1 in xhci specs have additional requirements > on how trbs in TDs must be organized. > > TD fragments shall not span transfer ring segments and TD fragments must > be packet aligned. Normally we don't care about TD fragments, on TD is one > big fragment, but if a TD spans ring segments it will be treated as two > fragments, and we need to comply with the alignment requirements. > > For us this means that the payload data must be packet aligned in the > last trb before a link trb. > In most mass storage bulk tranfers we are lucky as the block size aligns > nicely with packet size, and there are no issues. > However, usb network adapters using scatterlists can hit this alignment > issue, and usbtest in kernel triggers this in minutes. > > This patch is a partial solution, it solves the easy case when the last > trb before the link trb contains a packet boundary. > If that is the case then just split the trb at the boundary. > If not, then just print a debug message and continue as we have always > done, hoping for the best > > Signed-off-by: Mathias Nyman <mathias.nyman@xxxxxxxxxxxxxxx> > --- > drivers/usb/host/xhci-ring.c | 27 +++++++++++++++++++++++++++ > 1 file changed, 27 insertions(+) > > diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c > index d86da81..c7c9521 100644 > --- a/drivers/usb/host/xhci-ring.c > +++ b/drivers/usb/host/xhci-ring.c > @@ -3098,6 +3098,27 @@ static u32 xhci_td_remainder(struct xhci_hcd *xhci, int transferred, > return (total_packet_count - ((transferred + trb_buff_len) / maxp)); > } > > +static int xhci_align_td(struct xhci_hcd *xhci, struct urb *urb, u32 enqd_len, > + u32 *trb_buff_len) > +{ > + unsigned int unalign; > + unsigned int max_pkt; > + > + max_pkt = usb_endpoint_maxp(&urb->ep->desc); /*FIXME MATTU GET_MAX..? */ ^^^^^^^^^^^^^^^^^^^^^^^^^^ -- balbi
Attachment:
signature.asc
Description: PGP signature