patch-2.3.99-pre6 linux/arch/arm/mm/consistent.c

Next file: linux/arch/arm/mm/fault-common.c
Previous file: linux/arch/arm/lib/csumpartialcopyuser.S
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.3.99-pre5/linux/arch/arm/mm/consistent.c linux/arch/arm/mm/consistent.c
@@ -29,20 +29,29 @@
 	if (in_interrupt())
 		BUG();
 
+	size = PAGE_ALIGN(size);
 	order = get_order(size);
 
 	page = __get_free_pages(gfp, order);
 	if (!page)
 		goto no_page;
 
-	memset((void *)page, 0, PAGE_SIZE << order);
-	clean_cache_area(page, PAGE_SIZE << order);
+	memset((void *)page, 0, size);
+	clean_cache_area(page, size);
 
 	*dma_handle = virt_to_bus((void *)page);
 
-	ret = __ioremap(virt_to_phys((void *)page), PAGE_SIZE << order, 0);
-	if (ret)
+	ret = __ioremap(virt_to_phys((void *)page), size, 0);
+	if (ret) {
+		/* free wasted pages */
+		unsigned long end = page + (PAGE_SIZE << order);
+		page += size;
+		while (page < end) {
+			free_page(page);
+			page += PAGE_SIZE;
+		}
 		return ret;
+	}
 
 	free_pages(page, order);
 no_page:
@@ -81,18 +90,18 @@
 /*
  * make an area consistent.
  */
-void consistent_sync(void *vaddr, size_t size, int rw)
+void consistent_sync(void *vaddr, size_t size, int direction)
 {
-	switch (rw) {
-	case 0:
+	switch (direction) {
+	case PCI_DMA_NONE:
 		BUG();
-	case 1:	/* invalidate only */
+	case PCI_DMA_FROMDEVICE:	/* invalidate only */
 		dma_cache_inv(vaddr, size);
 		break;
-	case 2:	/* writeback only */
+	case PCI_DMA_TODEVICE:		/* writeback only */
 		dma_cache_wback(vaddr, size);
 		break;
-	case 3:	/* writeback and invalidate */
+	case PCI_DMA_BIDIRECTIONAL:	/* writeback and invalidate */
 		dma_cache_wback_inv(vaddr, size);
 		break;
 	}

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)