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