From: Al Viro <[email protected]>

[I've pretty much zero confidence in that one - if anything, it would need
to be split]

Signed-off-by: Al Viro <[email protected]>
---
 arch/m68k/include/asm/dvma.h             | 21 +++++--------
 arch/m68k/sun3/dvma.c                    | 31 ++++++++-----------
 arch/m68k/sun3/sun3dvma.c                | 52 ++++++++++++++------------------
 arch/m68k/sun3x/dvma.c                   | 15 +++------
 drivers/net/ethernet/i825xx/sun3_82586.c | 13 ++++----
 drivers/scsi/sun3_scsi.c                 | 23 ++++++--------
 6 files changed, 64 insertions(+), 91 deletions(-)

diff --git a/arch/m68k/include/asm/dvma.h b/arch/m68k/include/asm/dvma.h
index 890bbf7..1fa85e5 100644
--- a/arch/m68k/include/asm/dvma.h
+++ b/arch/m68k/include/asm/dvma.h
@@ -16,18 +16,16 @@
 #define DVMA_PAGE_ALIGN(addr)  ALIGN(addr, DVMA_PAGE_SIZE)
 
 extern void dvma_init(void);
-extern int dvma_map_iommu(unsigned long kaddr, unsigned long baddr,
-                         int len);
+extern int dvma_map_iommu(void *kaddr, unsigned long baddr, int len);
 
 #define dvma_malloc(x) dvma_malloc_align(x, 0)
 #define dvma_map(x, y) dvma_map_align(x, y, 0)
 #define dvma_map_vme(x, y) (dvma_map(x, y) & 0xfffff)
 #define dvma_map_align_vme(x, y, z) (dvma_map_align (x, y, z) & 0xfffff)
-extern unsigned long dvma_map_align(unsigned long kaddr, int len,
-                           int align);
+extern unsigned long dvma_map_align(void *kaddr, int len, int align);
 extern void *dvma_malloc_align(unsigned long len, unsigned long align);
 
-extern void dvma_unmap(void *baddr);
+extern void dvma_unmap(unsigned long);
 extern void dvma_free(void *vaddr);
 
 
@@ -51,14 +49,13 @@ extern void dvma_free(void *vaddr);
 
 /* virt <-> phys conversions */
 #define dvma_vtop(x) ((unsigned long)(x) & 0xffffff)
-#define dvma_ptov(x) ((unsigned long)(x) | 0xf000000)
+#define dvma_ptov(x) ((void *)((unsigned long)(x) | 0xf000000))
 #define dvma_vtovme(x) ((unsigned long)(x) & 0x00fffff)
-#define dvma_vmetov(x) ((unsigned long)(x) | 0xff00000)
+#define dvma_vmetov(x) ((void*)((unsigned long)(x) | 0xff00000))
 #define dvma_vtob(x) dvma_vtop(x)
 #define dvma_btov(x) dvma_ptov(x)
 
-static inline int dvma_map_cpu(unsigned long kaddr, unsigned long vaddr,
-                              int len)
+static inline int dvma_map_cpu(void *kaddr, void *vaddr, int len)
 {
        return 0;
 }
@@ -75,11 +72,9 @@ static inline int dvma_map_cpu(unsigned long kaddr, unsigned 
long vaddr,
 #define IOMMU_ENTRIES              (IOMMU_TOTAL_ENTRIES - 0x80)
 
 #define dvma_vtob(x) ((unsigned long)(x) & 0x00ffffff)
-#define dvma_btov(x) ((unsigned long)(x) | 0xff000000)
-
-extern int dvma_map_cpu(unsigned long kaddr, unsigned long vaddr, int len);
-
+#define dvma_btov(x) ((void *)((unsigned long)(x) | 0xff000000))
 
+extern int dvma_map_cpu(void *kaddr, void *vaddr, int len);
 
 /* everything below this line is specific to dma used for the onboard
    ESP scsi on sun3x */
diff --git a/arch/m68k/sun3/dvma.c b/arch/m68k/sun3/dvma.c
index d95506e..0b0d352 100644
--- a/arch/m68k/sun3/dvma.c
+++ b/arch/m68k/sun3/dvma.c
@@ -20,47 +20,42 @@
 
 static unsigned long ptelist[120];
 
-static unsigned long dvma_page(unsigned long kaddr, unsigned long vaddr)
+static void *dvma_page(void *kaddr, void *vaddr)
 {
        unsigned long pte;
        unsigned long j;
        pte_t ptep;
+       int idx;
 
        j = *(volatile unsigned long *)kaddr;
        *(volatile unsigned long *)kaddr = j;
 
        ptep = pfn_pte(virt_to_pfn(kaddr), PAGE_KERNEL);
        pte = pte_val(ptep);
-//             printk("dvma_remap: addr %lx -> %lx pte %08lx len %x\n",
+//             printk("dvma_remap: addr %p -> %lx pte %08lx len %x\n",
 //                    kaddr, vaddr, pte, len);
-       if(ptelist[(vaddr & 0xff000) >> PAGE_SHIFT] != pte) {
-               sun3_put_pte(vaddr, pte);
-               ptelist[(vaddr & 0xff000) >> PAGE_SHIFT] = pte;
-       }
+       idx = ((unsigned long)vaddr & 0xff000) >> PAGE_SHIFT;
 
-       return (vaddr + (kaddr & ~PAGE_MASK));
+       if (ptelist[idx] != pte) {
+               sun3_put_pte((unsigned long)vaddr, pte);
+               ptelist[idx] = pte;
+       }
 
+       return vaddr + offset_in_page(kaddr);
 }
 
-int dvma_map_iommu(unsigned long kaddr, unsigned long baddr,
-                             int len)
+int dvma_map_iommu(void *kaddr, unsigned long baddr, int len)
 {
+       void *vaddr = dvma_btov(baddr);
+       void *end = vaddr + len;
 
-       unsigned long end;
-       unsigned long vaddr;
-
-       vaddr = dvma_btov(baddr);
-
-       end = vaddr + len;
-
-       while(vaddr < end) {
+       while (vaddr < end) {
                dvma_page(kaddr, vaddr);
                kaddr += PAGE_SIZE;
                vaddr += PAGE_SIZE;
        }
 
        return 0;
-
 }
 
 void __init sun3_dvma_init(void)
diff --git a/arch/m68k/sun3/sun3dvma.c b/arch/m68k/sun3/sun3dvma.c
index fdc4900..68eefa4 100644
--- a/arch/m68k/sun3/sun3dvma.c
+++ b/arch/m68k/sun3/sun3dvma.c
@@ -277,7 +277,7 @@ void __init dvma_init(void)
 
 }
 
-unsigned long dvma_map_align(unsigned long kaddr, int len, int align)
+unsigned long dvma_map_align(void *kaddr, int len, int align)
 {
 
        unsigned long baddr;
@@ -287,58 +287,52 @@ unsigned long dvma_map_align(unsigned long kaddr, int 
len, int align)
                len = 0x800;
 
        if(!kaddr || !len) {
-//             printk("error: kaddr %lx len %x\n", kaddr, len);
+//             printk("error: kaddr %p len %x\n", kaddr, len);
 //             *(int *)4 = 0;
                return 0;
        }
 
 #ifdef DEBUG
-       printk("dvma_map request %08lx bytes from %08lx\n",
+       printk("dvma_map request %08lx bytes from %p\n",
               len, kaddr);
 #endif
-       off = kaddr & ~DVMA_PAGE_MASK;
-       kaddr &= PAGE_MASK;
+       off = (unsigned long)kaddr % DVMA_PAGE_SIZE;
+       kaddr -= off;
        len += off;
-       len = ((len + (DVMA_PAGE_SIZE-1)) & DVMA_PAGE_MASK);
+       len = ALIGN(len, DVMA_PAGE_SIZE);
 
        if(align == 0)
                align = DVMA_PAGE_SIZE;
        else
-               align = ((align + (DVMA_PAGE_SIZE-1)) & DVMA_PAGE_MASK);
+               align = ALIGN(align, DVMA_PAGE_SIZE);
 
        baddr = get_baddr(len, align);
 //     printk("using baddr %lx\n", baddr);
 
-       if(!dvma_map_iommu(kaddr, baddr, len))
+       if (!dvma_map_iommu(kaddr, baddr, len))
                return (baddr + off);
 
-       printk("dvma_map failed kaddr %lx baddr %lx len %x\n", kaddr, baddr, 
len);
+       printk("dvma_map failed kaddr %p baddr %lx len %x\n", kaddr, baddr, 
len);
        BUG();
        return 0;
 }
 EXPORT_SYMBOL(dvma_map_align);
 
-void dvma_unmap(void *baddr)
+void dvma_unmap(unsigned long baddr)
 {
-       unsigned long addr;
-
-       addr = (unsigned long)baddr;
        /* check if this is a vme mapping */
-       if(!(addr & 0x00f00000))
-               addr |= 0xf00000;
-
-       free_baddr(addr);
-
-       return;
+       if (!(baddr & 0x00f00000))
+               baddr |= 0xf00000;
 
+       free_baddr(baddr);
 }
 EXPORT_SYMBOL(dvma_unmap);
 
 void *dvma_malloc_align(unsigned long len, unsigned long align)
 {
-       unsigned long kaddr;
+       void *kaddr;
        unsigned long baddr;
-       unsigned long vaddr;
+       void *vaddr;
 
        if(!len)
                return NULL;
@@ -348,28 +342,28 @@ void *dvma_malloc_align(unsigned long len, unsigned long 
align)
 #endif
        len = ((len + (DVMA_PAGE_SIZE-1)) & DVMA_PAGE_MASK);
 
-        if((kaddr = __get_free_pages(GFP_ATOMIC, get_order(len))) == 0)
+        if((kaddr = get_free_pages(GFP_ATOMIC, get_order(len))) == NULL)
                return NULL;
 
-       if((baddr = (unsigned long)dvma_map_align(kaddr, len, align)) == 0) {
-               free_pages((void *)kaddr, get_order(len));
+       if((baddr = dvma_map_align(kaddr, len, align)) == 0) {
+               free_pages(kaddr, get_order(len));
                return NULL;
        }
 
        vaddr = dvma_btov(baddr);
 
-       if(dvma_map_cpu(kaddr, vaddr, len) < 0) {
-               dvma_unmap((void *)baddr);
-               free_pages((void *)kaddr, get_order(len));
+       if (dvma_map_cpu(kaddr, vaddr, len) < 0) {
+               dvma_unmap(baddr);
+               free_pages(kaddr, get_order(len));
                return NULL;
        }
 
 #ifdef DEBUG
-       printk("mapped %08lx bytes %08lx kern -> %08lx bus\n",
+       printk("mapped %08lx bytes %p kern -> %08lx bus\n",
               len, kaddr, baddr);
 #endif
 
-       return (void *)vaddr;
+       return vaddr;
 
 }
 EXPORT_SYMBOL(dvma_malloc_align);
diff --git a/arch/m68k/sun3x/dvma.c b/arch/m68k/sun3x/dvma.c
index d5ddcda..a85faa5 100644
--- a/arch/m68k/sun3x/dvma.c
+++ b/arch/m68k/sun3x/dvma.c
@@ -79,18 +79,14 @@ void dvma_print (unsigned long dvma_addr)
 
 /* create a virtual mapping for a page assigned within the IOMMU
    so that the cpu can reach it easily */
-inline int dvma_map_cpu(unsigned long kaddr,
-                              unsigned long vaddr, int len)
+int dvma_map_cpu(void *k, void *v, int len)
 {
        pgd_t *pgd;
-       unsigned long end;
+       unsigned long kaddr = (unsigned long)k & PAGE_MASK;
+       unsigned long vaddr = (unsigned long)v & PAGE_MASK;
+       unsigned long end = PAGE_ALIGN(vaddr + len);
        int ret = 0;
 
-       kaddr &= PAGE_MASK;
-       vaddr &= PAGE_MASK;
-
-       end = PAGE_ALIGN(vaddr + len);
-
 #ifdef DEBUG
        printk("dvma: mapping kern %08lx to virt %08lx\n",
               kaddr, vaddr);
@@ -148,8 +144,7 @@ inline int dvma_map_cpu(unsigned long kaddr,
 }
 
 
-inline int dvma_map_iommu(unsigned long kaddr, unsigned long baddr,
-                                int len)
+int dvma_map_iommu(void *kaddr, unsigned long baddr, int len)
 {
        unsigned long end, index;
 
diff --git a/drivers/net/ethernet/i825xx/sun3_82586.c 
b/drivers/net/ethernet/i825xx/sun3_82586.c
index 353f57f6..a9a279f 100644
--- a/drivers/net/ethernet/i825xx/sun3_82586.c
+++ b/drivers/net/ethernet/i825xx/sun3_82586.c
@@ -131,7 +131,7 @@ static void    sun3_82586_dump(struct net_device *,void *);
 
 /* helper-functions */
 static int     init586(struct net_device *dev);
-static int     check586(struct net_device *dev,char *where,unsigned size);
+static int     check586(struct net_device *dev,unsigned long where,unsigned 
size);
 static void    alloc586(struct net_device *dev);
 static void    startrecv586(struct net_device *dev);
 static void   *alloc_rfa(struct net_device *dev,void *ptr);
@@ -203,7 +203,7 @@ static int sun3_82586_open(struct net_device *dev)
 /**********************************************
  * Check to see if there's an 82586 out there.
  */
-static int check586(struct net_device *dev,char *where,unsigned size)
+static int check586(struct net_device *dev,unsigned long where,unsigned size)
 {
        struct priv pb;
        struct priv *p = &pb;
@@ -211,7 +211,7 @@ static int check586(struct net_device *dev,char 
*where,unsigned size)
        int i;
 
        p->base = (unsigned long) dvma_btov(0);
-       p->memtop = (char *)dvma_btov((unsigned long)where);
+       p->memtop = dvma_btov(where);
        p->scp = (struct scp_struct *)(p->base + SCP_DEFAULT_ADDRESS);
        memset((char *)p->scp,0, sizeof(struct scp_struct));
        for(i=0;i<sizeof(struct scp_struct);i++) /* memory was writeable? */
@@ -221,7 +221,7 @@ static int check586(struct net_device *dev,char 
*where,unsigned size)
        if(p->scp->sysbus != SYSBUSVAL)
                return 0;
 
-       iscp_addr = (char *)dvma_btov((unsigned long)where);
+       iscp_addr = dvma_btov(where);
 
        p->iscp = (struct iscp_struct *) iscp_addr;
        memset((char *)p->iscp,0, sizeof(struct iscp_struct));
@@ -366,14 +366,13 @@ static int __init sun3_82586_probe1(struct net_device 
*dev,int ioaddr)
                retval = -ENODEV;
                goto out;
        }
-       if(!check586(dev,(char *) dev->mem_start,size)) {
+       if(!check586(dev, dev->mem_start,size)) {
                printk("?memcheck, Can't find memory at 0x%lx with size 
%d!\n",dev->mem_start,size);
                retval = -ENODEV;
                goto out;
        }
 
-       ((struct priv *)netdev_priv(dev))->memtop =
-                                       (char *)dvma_btov(dev->mem_start);
+       ((struct priv *)netdev_priv(dev))->memtop = dvma_btov(dev->mem_start);
        ((struct priv *)netdev_priv(dev))->base = (unsigned long) dvma_btov(0);
        alloc586(dev);
 
diff --git a/drivers/scsi/sun3_scsi.c b/drivers/scsi/sun3_scsi.c
index 22a4283..5cfc634 100644
--- a/drivers/scsi/sun3_scsi.c
+++ b/drivers/scsi/sun3_scsi.c
@@ -100,7 +100,7 @@ static struct scsi_cmnd *sun3_dma_setup_done;
 static unsigned char *sun3_scsi_regp;
 static volatile struct sun3_dma_regs *dregs;
 static struct sun3_udc_regs *udc_regs;
-static unsigned char *sun3_dma_orig_addr = NULL;
+static unsigned long sun3_dma_orig_addr;
 static unsigned long sun3_dma_orig_count = 0;
 static int sun3_dma_active = 0;
 static unsigned long last_residual = 0;
@@ -237,15 +237,15 @@ void sun3_sun3_debug (void)
 /* sun3scsi_dma_setup() -- initialize the dma controller for a read/write */
 static unsigned long sun3scsi_dma_setup(void *data, unsigned long count, int 
write_flag)
 {
-       void *addr;
+       unsigned long addr;
 
-       if(sun3_dma_orig_addr != NULL)
+       if (sun3_dma_orig_addr)
                dvma_unmap(sun3_dma_orig_addr);
 
 #ifdef SUN3_SCSI_VME
-       addr = (void *)dvma_map_vme((unsigned long) data, count);
+       addr = dvma_map_vme(data, count);
 #else
-       addr = (void *)dvma_map((unsigned long) data, count);
+       addr = dvma_map(data, count);
 #endif
                
        sun3_dma_orig_addr = addr;
@@ -399,9 +399,7 @@ static int sun3scsi_dma_finish(int write_flag)
        last_residual = fifo;
        /* empty bytes from the fifo which didn't make it */
        if ((!write_flag) && (dregs->csr & CSR_LEFT)) {
-               unsigned char *vaddr;
-
-               vaddr = (unsigned char *)dvma_vmetov(sun3_dma_orig_addr);
+               unsigned char *vaddr = dvma_vmetov(sun3_dma_orig_addr);
 
                vaddr += (sun3_dma_orig_count - fifo);
                vaddr--;
@@ -444,11 +442,8 @@ static int sun3scsi_dma_finish(int write_flag)
 
        /* empty bytes from the fifo which didn't make it */
        if((!write_flag) && (count - fifo) == 2) {
-               unsigned short data;
-               unsigned char *vaddr;
-
-               data = dregs->fifo_data;
-               vaddr = (unsigned char *)dvma_btov(sun3_dma_orig_addr);
+               unsigned short data = dregs->fifo_data;
+               unsigned char *vaddr = dvma_btov(sun3_dma_orig_addr);
                
                vaddr += (sun3_dma_orig_count - fifo);
 
@@ -458,7 +453,7 @@ static int sun3scsi_dma_finish(int write_flag)
 #endif
 
        dvma_unmap(sun3_dma_orig_addr);
-       sun3_dma_orig_addr = NULL;
+       sun3_dma_orig_addr = 0;
 
 #ifdef SUN3_SCSI_VME
        dregs->dma_addr_hi = 0;
-- 
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to