Re: DM3730 + MUSB host mode + DMA + USB Ethernet dongle = Fail

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

 



Hi,

On Thu, May 07, 2015 at 09:06:06AM -0700, Tony Lindgren wrote:
> * Tim Nordell <tim.nordell@xxxxxxxxxxx> [150506 16:19]:
> > Hi all -
> > 
> > I'm running kernel v3.19 (although I've tried v4.1-rc2's version of the MUSB
> > code) on a DM3730 processor.  I'm running into an issue where if I enable
> > MUSB Inventra DMA, plug in a USB Ethernet Dongle, and run iperf between the
> > dongle and a PC, the MUSB driver stops working.  I get the following in my
> > kernel log, twice back-to-back:
> > 
> >     musb_host_rx 1762: Rx interrupt with no errors or packet!
> > 
> > Any ideas?
> > 
> > The test above works in PIO mode, but I'd like to reduce the system CPU
> > usage of the driver by using DMA.  I'm using a ASIX AX88772B Ethernet
> > dongle, although, this shouldn't impact the error above.  I also tried
> > re-reading the RXCSR register immediately after the error printout above,
> > and the immediate subsequent time it contains the bit the driver is looking
> > for.  I tried nesting the check so that if the bit the driver is looking for
> > is set with an immediate subsequent read that it would continue past it, but
> > it still keels over (albeit lasting maybe a second longer).
> > 
> > Something about this feels race conditiony too.  Depending on the kernel
> > configuration options in the kernel debug menu (which slows down other parts
> > of the kernel), or if I enable verbose debug message output from the MUSB
> > driver, it lasts much, much longer before keeling over as a system.  You can
> > restore normal behavior by unplugging/replugging in the device.
> 
> This sounds like some issue dealing with certain size transfers where
> there's data remaining after a DMA transfer. You might be able to make
> it easily reproducable with a variable size ping from your PC even with
> debugging enabled. Something like the script below.
> 
> Regards,
> 
> Tony
> 
> 8< --------------
> #!/bin/bash
> 
> device=$1
> size=$2
> 
> while [ 1 ]; do
> 	#echo "Pinging with size $size"
> 	if ! ping -w0 -c1 $device -s$size > /dev/null 2>&1; then
> 		break;
> 	fi
> 	size=$(expr $SIZE + 1)
> 
> 	if [ $size -gt 8192 ]; then
> 		size=1
> 	fi
> done
> 
> echo "Test ran up to $size"

I'd be very much interested in getting such logs :-)

-- 
balbi

Attachment: signature.asc
Description: Digital signature


[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux