ARM: v3.13-rc1: USB regression

Russell King - ARM Linux linux at arm.linux.org.uk
Sun Nov 24 17:43:59 EST 2013


On Mon, Nov 25, 2013 at 12:22:47AM +0200, Aaro Koskinen wrote:
> Hi,
> 
> With 3.13-rc1, the USB OHCI probe fails on Amstrad E3 (ARM/OMAP1)
> as follows:
> 
> [   33.814705] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
> [   33.821482] ohci-omap: OHCI OMAP driver
> [   33.925153] ohci ohci: OMAP OHCI
> [   33.929087] ohci ohci: new USB bus registered, assigned bus number 1
> [   33.967324] ohci ohci: Coherent DMA mask 0xffffffff (pfn 0xe0000-0xe0000) covers a smaller range of system memory than the DMA zone pfn 0x0-0x100000
> [   33.982292] ohci ohci: can't setup: -12
> [   33.987898] ohci ohci: USB bus 1 deregistered
> [   33.992984] ohci: probe of ohci failed with error -12
> 
> I bisected this to 4dcfa60071b3d23f0181f27d8519f12e37cefbb9 (ARM: DMA-API:
> better handing of DMA masks for coherent allocations). Reverting that
> commit makes the USB work again fine.

This is because of this:

#define __arch_dma_to_pfn(dev, addr)	\
	({ dma_addr_t __dma = addr;				\
	   if (is_lbus_device(dev))				\
		__dma += PHYS_OFFSET - OMAP1510_LB_OFFSET;	\
	   __phys_to_pfn(__dma);				\
	})

dma_addr_t is 32-bit.  PHYS_OFFSET - OMAP1510_LB_OFFSET is 0xe0000000.
Consider what the result of passing 0xffffffff as addr into this is.

Better would be:

#define __arch_dma_to_pfn(dev, addr)	\
	({ unsigned long pfn = (addr) >> PAGE_SHIFT;		\
	   if (is_lbus_device(dev))				\
		pfn += PHYS_PFN_OFFSET - 			\
			(OMAP1510_LB_OFFSET >> PAGE_SHIFT);	\
	   pfn;							\
	})

Can you try that in arch/arm/mach-omap1/include/mach/memory.h please?



More information about the linux-arm-kernel mailing list