Re: NET2280: Adding PLX usb2380 support (issues encountered)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



In the start_dma function, I added the following lines at the start of
the function:

if (req->req.length % ep->ep.maxpacket)
{
     printk("%s packet is short(%d)...\n", (ep->is_in) ? "IN" : "OUT",
req->req.length);
}

The packet is never listed as short via my method above during this
erroneous data transfer, and yet the logic right below "/* previous
OUT packet might have been short */", is triggered, and
req->td->dmadesc = 0 is set, causing the 'paranoia' logic to get
triggered.  Is my logic above a correct method of determining if a
packet was short, or is there another way for a short OUT packet to be
triggered that I'm not accounting for (i.e. start_dma is not the
source of the packet)?

On Wed, Jan 20, 2016 at 2:43 PM, Justin DeFields
<justindefields@xxxxxxxxx> wrote:
> System: Custom Xilinx Zynq based system
> Kernel: Xilinx linux v2015.1 (linux 3.18)
>
> I was attempting to add support for the PLX usb2380 chip to the
> net2280.c driver.  As far as I can tell, this chip is the same as the
> 3380, but does not support USB3.0 (2.0 only).
>
> I have changed all checks for the quirk PLX_SUPERSPEED to a new quirk
> called PLX_PCIE_MSI, except for where PLX_SUPERSPEED was used to set
> USB_SPEED_SUPER.
>
> This implementation seemed to work fine, except for when I attached
> the 'g_serial' gadget with ACM.  The issue I have is that any data
> transfer that is not a multiple of the endpoint maxpacket size (512
> bytes), results in the '/* paranoia */' block of code in
> 'scan_dma_completions (struct net2280_ep *ep)' function to be called 8
> times, and then the transfer goes off the rails at that point.  The
> data all got to it's destination, but much more data was processed
> than expected (it seems like the last DMA transaction is being
> processed more than once).
>
> I noticed that the chip has some errata, which specifically called out
> DMA issues when the transfer size is unaligned, but I am using the
> 'AB' revision, and that errata seemed to be listed for 'AA' only.
>
> As a side note, if I remove the  '/* paranoia */' block of code in
> scan_dma_completions, the transfer actually completes as expected with
> no extra data, but it takes a VERY long time for it to complete
> (roughly 10 seconds after the first paranoia loop is entered).
>
> If I use PIO instead of DMA, the transfer sometimes completes,
> sometimes it doesn't, and sometimes it doesn't even start.
>
> I suspect there could be some differences in FIFO sizes, or endpoint
> configuration between the 2380 and 3380, but I've tried many
> permutations and combinations of the various quirk flags in this
> driver, and most didn't change driver operation at all surprisingly
> (or at least not to any degree that I could measure).  I'm looking for
> some assistance or tips in debugging this issue.
>
> Thanks,
>
> Justin DeFields
> Embedded Software Engineer



-- 
Justin DeFields
Embedded Software Engineer
--
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



[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux