Re: [PATCH REPOST] ARM: Fix regression in IXP4xx network drivers DMA masks.

2014-01-11 Thread Russell King - ARM Linux
On Mon, Jan 06, 2014 at 08:33:15PM +0100, Krzysztof Hałasa wrote:
> Russell et al.,
> 
> anything wrong with this fix?

Well, I don't understand why moving this code around fixes a problem.
After all, if PCI is enabled, then presumably common-pci.c will always
be built and run - it has to be for the PCI bus to be probed.

Oh, are you trying to use the platform notify callback to set the
DMA mask on statically defined platform devices?  No, don't do that,
initialise it in the declarations instead.

-- 
FTTC broadband for 0.8mile line: 5.8Mbps down 500kbps up.  Estimation
in database were 13.1 to 19Mbit for a good line, about 7.5+ for a bad.
Estimate before purchase was "up to 13.2Mbit".
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH REPOST] ARM: Fix regression in IXP4xx network drivers DMA masks.

2014-01-11 Thread Russell King - ARM Linux
On Mon, Jan 06, 2014 at 08:33:15PM +0100, Krzysztof Hałasa wrote:
 Russell et al.,
 
 anything wrong with this fix?

Well, I don't understand why moving this code around fixes a problem.
After all, if PCI is enabled, then presumably common-pci.c will always
be built and run - it has to be for the PCI bus to be probed.

Oh, are you trying to use the platform notify callback to set the
DMA mask on statically defined platform devices?  No, don't do that,
initialise it in the declarations instead.

-- 
FTTC broadband for 0.8mile line: 5.8Mbps down 500kbps up.  Estimation
in database were 13.1 to 19Mbit for a good line, about 7.5+ for a bad.
Estimate before purchase was up to 13.2Mbit.
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH REPOST] ARM: Fix regression in IXP4xx network drivers DMA masks.

2014-01-06 Thread Krzysztof Hałasa
Russell et al.,

anything wrong with this fix?

the following patch is still needed with 3.13-rc6.
Affected are non-PCI devices using coherent allocations.

Without the patch:

# ifconfig eth0 up
net eth0: coherent DMA mask is unset
ifconfig: SIOCSIFFLAGS: Cannot allocate memory

IXP4xx: Fix DMA masks.

Now, devices will have 32-bit default DMA masks (0x) as per DMA API.

Signed-off-by: Krzysztof Hałasa 

diff --git a/arch/arm/mach-ixp4xx/common-pci.c 
b/arch/arm/mach-ixp4xx/common-pci.c
index 6d6bde3..cefb80b 100644
--- a/arch/arm/mach-ixp4xx/common-pci.c
+++ b/arch/arm/mach-ixp4xx/common-pci.c
@@ -316,32 +316,6 @@ static int abort_handler(unsigned long addr, unsigned int 
fsr, struct pt_regs *r
 }
 
 
-static int ixp4xx_needs_bounce(struct device *dev, dma_addr_t dma_addr, size_t 
size)
-{
-   return (dma_addr + size) >= SZ_64M;
-}
-
-/*
- * Setup DMA mask to 64MB on PCI devices. Ignore all other devices.
- */
-static int ixp4xx_pci_platform_notify(struct device *dev)
-{
-   if(dev->bus == _bus_type) {
-   *dev->dma_mask =  SZ_64M - 1;
-   dev->coherent_dma_mask = SZ_64M - 1;
-   dmabounce_register_dev(dev, 2048, 4096, ixp4xx_needs_bounce);
-   }
-   return 0;
-}
-
-static int ixp4xx_pci_platform_notify_remove(struct device *dev)
-{
-   if(dev->bus == _bus_type) {
-   dmabounce_unregister_dev(dev);
-   }
-   return 0;
-}
-
 void __init ixp4xx_pci_preinit(void)
 {
unsigned long cpuid = read_cpuid_id();
@@ -475,20 +449,8 @@ int ixp4xx_setup(int nr, struct pci_sys_data *sys)
pci_add_resource_offset(>resources, [0], sys->io_offset);
pci_add_resource_offset(>resources, [1], sys->mem_offset);
 
-   platform_notify = ixp4xx_pci_platform_notify;
-   platform_notify_remove = ixp4xx_pci_platform_notify_remove;
-
return 1;
 }
 
-int dma_set_coherent_mask(struct device *dev, u64 mask)
-{
-   if (mask >= SZ_64M - 1)
-   return 0;
-
-   return -EIO;
-}
-
 EXPORT_SYMBOL(ixp4xx_pci_read);
 EXPORT_SYMBOL(ixp4xx_pci_write);
-EXPORT_SYMBOL(dma_set_coherent_mask);
diff --git a/arch/arm/mach-ixp4xx/common.c b/arch/arm/mach-ixp4xx/common.c
index 9edaf47..c03787c 100644
--- a/arch/arm/mach-ixp4xx/common.c
+++ b/arch/arm/mach-ixp4xx/common.c
@@ -30,8 +30,8 @@
 #include 
 #include 
 #include 
+#include 
 #include 
-
 #include 
 #include 
 #include 
@@ -40,7 +40,6 @@
 #include 
 #include 
 #include 
-
 #include 
 #include 
 #include 
@@ -578,6 +577,49 @@ void ixp4xx_restart(enum reboot_mode mode, const char *cmd)
}
 }
 
+#ifdef CONFIG_PCI
+static int ixp4xx_needs_bounce(struct device *dev, dma_addr_t dma_addr, size_t 
size)
+{
+   return (dma_addr + size) >= SZ_64M;
+}
+
+static int ixp4xx_platform_notify_remove(struct device *dev)
+{
+   if (dev->bus == _bus_type)
+   dmabounce_unregister_dev(dev);
+
+   return 0;
+}
+#endif
+
+/*
+ * Setup DMA mask to 64MB on PCI devices and 4 GB on all other things.
+ */
+static int ixp4xx_platform_notify(struct device *dev)
+{
+#ifdef CONFIG_PCI
+   if (dev->bus == _bus_type) {
+   dev->coherent_dma_mask = DMA_BIT_MASK(28); /* 64 MB */
+   dmabounce_register_dev(dev, 2048, 4096, ixp4xx_needs_bounce);
+   } else
+#endif
+   dev->coherent_dma_mask = DMA_BIT_MASK(32);
+
+   dev->dma_mask = >coherent_dma_mask;
+   return 0;
+}
+
+int dma_set_coherent_mask(struct device *dev, u64 mask)
+{
+   if ((mask & DMA_BIT_MASK(28)) == DMA_BIT_MASK(28)) {
+   dev->coherent_dma_mask = mask;
+   return 0;
+   }
+
+   return -EIO;
+}
+EXPORT_SYMBOL(dma_set_coherent_mask);
+
 #ifdef CONFIG_IXP4XX_INDIRECT_PCI
 /*
  * In the case of using indirect PCI, we simply return the actual PCI
@@ -600,12 +642,16 @@ static void ixp4xx_iounmap(void __iomem *addr)
if (!is_pci_memory((__force u32)addr))
__iounmap(addr);
 }
+#endif
 
 void __init ixp4xx_init_early(void)
 {
+   platform_notify = ixp4xx_platform_notify;
+#ifdef CONFIG_PCI
+   platform_notify_remove = ixp4xx_platform_notify_remove;
+#endif
+#ifdef CONFIG_IXP4XX_INDIRECT_PCI
arch_ioremap_caller = ixp4xx_ioremap_caller;
arch_iounmap = ixp4xx_iounmap;
-}
-#else
-void __init ixp4xx_init_early(void) {}
 #endif
+}

-- 
Krzysztof Halasa

Research Institute for Automation and Measurements PIAP
Al. Jerozolimskie 202, 02-486 Warsaw, Poland
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH REPOST] ARM: Fix regression in IXP4xx network drivers DMA masks.

2014-01-06 Thread Krzysztof Hałasa
Russell et al.,

anything wrong with this fix?

the following patch is still needed with 3.13-rc6.
Affected are non-PCI devices using coherent allocations.

Without the patch:

# ifconfig eth0 up
net eth0: coherent DMA mask is unset
ifconfig: SIOCSIFFLAGS: Cannot allocate memory

IXP4xx: Fix DMA masks.

Now, devices will have 32-bit default DMA masks (0x) as per DMA API.

Signed-off-by: Krzysztof Hałasa khal...@piap.pl

diff --git a/arch/arm/mach-ixp4xx/common-pci.c 
b/arch/arm/mach-ixp4xx/common-pci.c
index 6d6bde3..cefb80b 100644
--- a/arch/arm/mach-ixp4xx/common-pci.c
+++ b/arch/arm/mach-ixp4xx/common-pci.c
@@ -316,32 +316,6 @@ static int abort_handler(unsigned long addr, unsigned int 
fsr, struct pt_regs *r
 }
 
 
-static int ixp4xx_needs_bounce(struct device *dev, dma_addr_t dma_addr, size_t 
size)
-{
-   return (dma_addr + size) = SZ_64M;
-}
-
-/*
- * Setup DMA mask to 64MB on PCI devices. Ignore all other devices.
- */
-static int ixp4xx_pci_platform_notify(struct device *dev)
-{
-   if(dev-bus == pci_bus_type) {
-   *dev-dma_mask =  SZ_64M - 1;
-   dev-coherent_dma_mask = SZ_64M - 1;
-   dmabounce_register_dev(dev, 2048, 4096, ixp4xx_needs_bounce);
-   }
-   return 0;
-}
-
-static int ixp4xx_pci_platform_notify_remove(struct device *dev)
-{
-   if(dev-bus == pci_bus_type) {
-   dmabounce_unregister_dev(dev);
-   }
-   return 0;
-}
-
 void __init ixp4xx_pci_preinit(void)
 {
unsigned long cpuid = read_cpuid_id();
@@ -475,20 +449,8 @@ int ixp4xx_setup(int nr, struct pci_sys_data *sys)
pci_add_resource_offset(sys-resources, res[0], sys-io_offset);
pci_add_resource_offset(sys-resources, res[1], sys-mem_offset);
 
-   platform_notify = ixp4xx_pci_platform_notify;
-   platform_notify_remove = ixp4xx_pci_platform_notify_remove;
-
return 1;
 }
 
-int dma_set_coherent_mask(struct device *dev, u64 mask)
-{
-   if (mask = SZ_64M - 1)
-   return 0;
-
-   return -EIO;
-}
-
 EXPORT_SYMBOL(ixp4xx_pci_read);
 EXPORT_SYMBOL(ixp4xx_pci_write);
-EXPORT_SYMBOL(dma_set_coherent_mask);
diff --git a/arch/arm/mach-ixp4xx/common.c b/arch/arm/mach-ixp4xx/common.c
index 9edaf47..c03787c 100644
--- a/arch/arm/mach-ixp4xx/common.c
+++ b/arch/arm/mach-ixp4xx/common.c
@@ -30,8 +30,8 @@
 #include linux/export.h
 #include linux/gpio.h
 #include linux/cpu.h
+#include linux/pci.h
 #include linux/sched_clock.h
-
 #include mach/udc.h
 #include mach/hardware.h
 #include mach/io.h
@@ -40,7 +40,6 @@
 #include asm/page.h
 #include asm/irq.h
 #include asm/system_misc.h
-
 #include asm/mach/map.h
 #include asm/mach/irq.h
 #include asm/mach/time.h
@@ -578,6 +577,49 @@ void ixp4xx_restart(enum reboot_mode mode, const char *cmd)
}
 }
 
+#ifdef CONFIG_PCI
+static int ixp4xx_needs_bounce(struct device *dev, dma_addr_t dma_addr, size_t 
size)
+{
+   return (dma_addr + size) = SZ_64M;
+}
+
+static int ixp4xx_platform_notify_remove(struct device *dev)
+{
+   if (dev-bus == pci_bus_type)
+   dmabounce_unregister_dev(dev);
+
+   return 0;
+}
+#endif
+
+/*
+ * Setup DMA mask to 64MB on PCI devices and 4 GB on all other things.
+ */
+static int ixp4xx_platform_notify(struct device *dev)
+{
+#ifdef CONFIG_PCI
+   if (dev-bus == pci_bus_type) {
+   dev-coherent_dma_mask = DMA_BIT_MASK(28); /* 64 MB */
+   dmabounce_register_dev(dev, 2048, 4096, ixp4xx_needs_bounce);
+   } else
+#endif
+   dev-coherent_dma_mask = DMA_BIT_MASK(32);
+
+   dev-dma_mask = dev-coherent_dma_mask;
+   return 0;
+}
+
+int dma_set_coherent_mask(struct device *dev, u64 mask)
+{
+   if ((mask  DMA_BIT_MASK(28)) == DMA_BIT_MASK(28)) {
+   dev-coherent_dma_mask = mask;
+   return 0;
+   }
+
+   return -EIO;
+}
+EXPORT_SYMBOL(dma_set_coherent_mask);
+
 #ifdef CONFIG_IXP4XX_INDIRECT_PCI
 /*
  * In the case of using indirect PCI, we simply return the actual PCI
@@ -600,12 +642,16 @@ static void ixp4xx_iounmap(void __iomem *addr)
if (!is_pci_memory((__force u32)addr))
__iounmap(addr);
 }
+#endif
 
 void __init ixp4xx_init_early(void)
 {
+   platform_notify = ixp4xx_platform_notify;
+#ifdef CONFIG_PCI
+   platform_notify_remove = ixp4xx_platform_notify_remove;
+#endif
+#ifdef CONFIG_IXP4XX_INDIRECT_PCI
arch_ioremap_caller = ixp4xx_ioremap_caller;
arch_iounmap = ixp4xx_iounmap;
-}
-#else
-void __init ixp4xx_init_early(void) {}
 #endif
+}

-- 
Krzysztof Halasa

Research Institute for Automation and Measurements PIAP
Al. Jerozolimskie 202, 02-486 Warsaw, Poland
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/