FUJITA Tomonori wrote:
On Mon, 27 Oct 2008 17:22:06 +0100
Matthias Kaehlcke <mkaehlcke@xxxxxxx> wrote:
hi,
James Bottomley wrote:
On Mon, 2008-10-27 at 12:35 +0100, Matthias Kaehlcke wrote:
James Bottomley wrote:
On Fri, 2008-10-24 at 09:05 +0200, Matthias Kaehlcke wrote:
inserting a Verbatim 4GB USB stick in a ep9307 based device running
kernel 2.6.27 results in the following Oops:
[42949395.050000] usb 1-3: new full speed USB device using ep93xx-ohci
and address 2
[42949395.250000] usb 1-3: configuration #1 chosen from 1 choice
[42949395.260000] scsi0 : SCSI emulation for USB Mass Storage devices
[42949395.270000] usb 1-3: New USB device found, idVendor=13fe,
idProduct=1f23
[42949395.280000] usb 1-3: New USB device strings: Mfr=1, Product=2,
SerialNumber=3
[42949395.280000] usb 1-3: Product: STORE N GO
[42949395.300000] usb 1-3: Manufacturer: Verbatim
[42949395.310000] usb 1-3: SerialNumber: 078813D90478
[42949400.280000] Unable to handle kernel NULL pointer dereference at
virtual address 00000003
[42949400.280000] pgd = c0648000
[42949400.300000] [00000003] *pgd=c0647031, *pte=00000000, *ppte=00000000
[42949400.300000] Internal error: Oops: 13 [#1] PREEMPT
[42949400.300000] Modules linked in:
[42949400.300000] CPU: 0 Not tainted (2.6.27 #3)
[42949400.300000] PC is at scsi_calculate_bounce_limit+0x3c/0x44
Best guess is this line:
if (host_dev && host_dev->dma_mask)
bounce_limit = *host_dev->dma_mask;
I'd guess host_dev->dma_mask contains 0x3 ... could this be some sort of
ARM setup problem?
thanks for having a look!
i could figure out the difference between 2.6.26.3 and 2.6.27 that
triggers the Oops:
diff -u linux-2.6.26.3/include/asm-arm/pci.h
linux-2.6.27/arch/arm/include/asm/pci.h
...
@@ -30,7 +30,7 @@
* The networking and block device layers use this boolean for bounce
* buffer decisions.
*/
-#define PCI_DMA_BUS_IS_PHYS (0)
+#define PCI_DMA_BUS_IS_PHYS (1)
/*
* Whether pci_unmap_{single,page} is a nop depends upon the
...
this change affects the following piece of code in
scsi_calculate_bounce_limit():
if (!PCI_DMA_BUS_IS_PHYS)
return BLK_BOUNCE_ANY;
host_dev = scsi_get_device(shost);
if (host_dev && host_dev->dma_mask)
bounce_limit = *host_dev->dma_mask;
host_dev->dma_mask is 0xffffffff and we try to dereference the pointer
So the host_dev is some type of arm platform device? If so, it's got
it's dma_mask set up wrongly. it's a pointer in struct device and is
supposed to point to the real u64 quantity located within the actual
enclosing device.
thanks a lot for the pointer, i think i fixed the problem:
--- linux-2.6.27.org/arch/arm/mach-ep93xx/core.c 2008-10-10
00:13:53.000000000 +0200
+++ linux-2.6.27/arch/arm/mach-ep93xx/core.c 2008-10-27
17:00:42.000000000 +0100
@@ -26,6 +26,7 @@
#include <linux/serial_core.h>
#include <linux/device.h>
#include <linux/mm.h>
+#include <linux/dma-mapping.h>
#include <linux/time.h>
#include <linux/timex.h>
#include <linux/delay.h>
@@ -450,12 +451,14 @@
},
};
+static u64 ep93xx_ohci_dmamask = DMA_BIT_MASK(32);
+
static struct platform_device ep93xx_ohci_device = {
.name = "ep93xx-ohci",
.id = -1,
.dev = {
- .dma_mask = (void *)0xffffffff,
- .coherent_dma_mask = 0xffffffff,
+ .dma_mask = &ep93xx_ohci_dmamask,
+ .coherent_dma_mask = DMA_BIT_MASK(32),
},
.num_resources = ARRAY_SIZE(ep93xx_ohci_resources),
.resource = ep93xx_ohci_resources,
You can do this in a simpler way (it's the popular way to do this):
@@ -453,8 +454,8 @@ static struct platform_device ep93xx_ohci_device = {
.name = "ep93xx-ohci",
.id = -1,
.dev = {
- .dma_mask = (void *)0xffffffff,
- .coherent_dma_mask = 0xffffffff,
+ .dma_mask = &ep93xx_ohci_device.dev.coherent_dma_mask,
+ .coherent_dma_mask = DMA_BIT_MASK(32),
},
.num_resources = ARRAY_SIZE(ep93xx_ohci_resources),
.resource = ep93xx_ohci_resources,
thanks for the pointer!
begin:vcard
fn:Matthias Kaehlcke
n:Kaehlcke;Matthias
org:Electronic Engineering Solutions;Dept. de Software
adr:;;C/ Sant Ferran, 10-16 bajos;Barcelona;;08031;Spain
email;internet:mkaehlcke@xxxxxxx
title:Ingeniero de Firmware
tel;work:93 407 30 80
tel;fax:93 433 56 71
x-mozilla-html:FALSE
url:http://www.e2s.net
version:2.1
end:vcard