All pastes #188220 Raw Edit

Someone

public text v1 · immutable
·published 2006-10-01 22:09 UTC
rendered paste body
[lamikr@aragorn ~]$ diff -Naur mem.c own/h6300/eclipsewk/h6300_dev/drivers/net/wireless/acx/mem.c 
--- mem.c       2006-10-02 01:06:53.000000000 +0300
+++ own/h6300/eclipsewk/h6300_dev/drivers/net/wireless/acx/mem.c        2006-09-26 02:16:50.000000000 +0300
@@ -79,7 +79,7 @@
 
 #define CARD_EEPROM_ID_SIZE 6
 
-#include <asm/arch/pxa-regs.h>
+//#include <asm/arch/pxa-regs.h>
 #include <asm/io.h>
 
 #define REG_ACX_VENDOR_ID 0x900
@@ -132,63 +132,45 @@
 INLINE_IO u32
 read_reg32(acx_device_t *adev, unsigned int offset)
 {
-        u32 val;
        u32 addr;
 
-        if (offset > IO_ACX_ECPU_CTRL)
+    if (offset > IO_ACX_ECPU_CTRL)
          addr = offset;
        else
          addr = adev->io[offset];
 
-       if (addr < 0x20) {
-         return readl(((u8*)adev->iobase) + addr);
-       }
-
-       writel( addr, &adev->iobase[ACX_SLV_REG_ADDR] );
-       val = readl( &adev->iobase[ACX_SLV_REG_DATA] );
-
-       return val;
+#if ACX_IO_WIDTH == 32
+    return readl((u8 *)adev->iobase + addr);
+#else
+    return readw((u8 *)adev->iobase + addr)
+        + (readw((u8 *)adev->iobase + addr + 2) << 16);
+#endif
 }
 
 INLINE_IO u16
 read_reg16(acx_device_t *adev, unsigned int offset)
 {
-       u16 lo;
        u32 addr;
 
-        if (offset > IO_ACX_ECPU_CTRL)
+    if (offset > IO_ACX_ECPU_CTRL)
          addr = offset;
        else
          addr = adev->io[offset];
 
-       if (addr < 0x20) {
-           return readw(((u8 *) adev->iobase) + addr);
-       }
-
-       writel( addr, &adev->iobase[ACX_SLV_REG_ADDR] );
-       lo = readw( (u16 *)&adev->iobase[ACX_SLV_REG_DATA] );
-
-       return lo;
+       return readw(((u8 *) adev->iobase) + addr);
 }
 
 INLINE_IO u8
 read_reg8(acx_device_t *adev, unsigned int offset)
 {
-       u8 lo;
        u32 addr;
 
-        if (offset > IO_ACX_ECPU_CTRL)
+    if (offset > IO_ACX_ECPU_CTRL)
          addr = offset;
        else
          addr = adev->io[offset];
 
-       if (addr < 0x20)
-           return readb(((u8 *)adev->iobase) + addr);
-
-       writel( addr, &adev->iobase[ACX_SLV_REG_ADDR] );
-       lo = readw( (u8 *)&adev->iobase[ACX_SLV_REG_DATA] );
-
-       return (u8)lo;
+       return readb(((u8 *)adev->iobase) + addr);
 }
 
 INLINE_IO void
@@ -196,18 +178,17 @@
 {
        u32 addr;
 
-        if (offset > IO_ACX_ECPU_CTRL)
+       if (offset > IO_ACX_ECPU_CTRL)
          addr = offset;
        else
          addr = adev->io[offset];
 
-       if (addr < 0x20) {
-           writel(val, ((u8*)adev->iobase) + addr);
-           return;
-       }
-
-       writel( addr, &adev->iobase[ACX_SLV_REG_ADDR] );
-       writel( val, &adev->iobase[ACX_SLV_REG_DATA] );
+#if ACX_IO_WIDTH == 32
+    writel(val, (u8 *)adev->iobase + addr);
+#else
+    writew(val & 0xffff, (u8 *)adev->iobase + addr);
+    writew(val >> 16, (u8 *)adev->iobase + addr + 2);
+#endif
 }
 
 INLINE_IO void
@@ -215,17 +196,11 @@
 {
        u32 addr;
 
-        if (offset > IO_ACX_ECPU_CTRL)
+    if (offset > IO_ACX_ECPU_CTRL)
          addr = offset;
        else
          addr = adev->io[offset];
-
-       if (addr < 0x20) {
-           writew(val, ((u8 *)adev->iobase) + addr);
-           return;
-       }
-       writel( addr, &adev->iobase[ACX_SLV_REG_ADDR] );
-       writew( val, (u16 *) &adev->iobase[ACX_SLV_REG_DATA] );
+    writew(val, ((u8 *)adev->iobase) + addr);
 }
 
 INLINE_IO void
@@ -233,17 +208,12 @@
 {
        u32 addr;
 
-        if (offset > IO_ACX_ECPU_CTRL)
+    if (offset > IO_ACX_ECPU_CTRL)
          addr = offset;
        else
          addr = adev->io[offset];
 
-       if (addr < 0x20) {
-           writeb(val, ((u8 *) adev->iobase) + addr);
-           return;
-       }
-       writel( addr, &adev->iobase[ACX_SLV_REG_ADDR] );
-       writeb( val, (u8 *)&adev->iobase[ACX_SLV_REG_DATA] );
+       writeb(val, ((u8 *) adev->iobase) + addr);
 }
 
 /* Handle PCI posting properly:
@@ -404,9 +374,15 @@
     printk ("acx copy_from_slavemem: warning!  destination not word-aligned!\n");
   }
 
+  write_reg32(adev, IO_ACX_SLV_END_CTL, 0);
+  write_reg32(adev, IO_ACX_SLV_MEM_CTL, 0x00010000);
+  write_reg32(adev, IO_ACX_SLV_MEM_ADDR, source);
+
   while (count >= 4) {
+#if 0
     write_reg32 (adev, IO_ACX_SLV_MEM_ADDR, source);
     udelay (10);
+#endif
     *((u32 *) destination) = read_reg32 (adev, IO_ACX_SLV_MEM_DATA);
     count -= 4;
     source += 4;
@@ -418,8 +394,10 @@
    * and transfer a byte at a time until the request is satisfied.
    */
   if (count) {
+#if 0
     write_reg32 (adev, IO_ACX_SLV_MEM_ADDR, source);
     udelay (10);
+#endif
     tmp = read_reg32 (adev, IO_ACX_SLV_MEM_DATA);
     while (count--) {
       *destination++ = *ptmp++;
@@ -450,9 +428,15 @@
   memcpy (src, source, count);
   source = src;
 
+  write_reg32(adev, IO_ACX_SLV_END_CTL, 0);
+  write_reg32(adev, IO_ACX_SLV_MEM_CTL, 0x00010000);
+  write_reg32(adev, IO_ACX_SLV_MEM_ADDR, destination);
+
   while (count >= 4) {
+#if 0
     write_reg32 (adev, IO_ACX_SLV_MEM_ADDR, destination);
     udelay (10);
+#endif
     write_reg32 (adev, IO_ACX_SLV_MEM_DATA, *((u32 *) source));
     count -= 4;
     source += 4;
@@ -464,17 +448,21 @@
    * what they want to write.
    */
   if (count) {
+#if 0
     write_reg32 (adev, IO_ACX_SLV_MEM_ADDR, destination);
     udelay (10);
     tmp = read_reg32 (adev, IO_ACX_SLV_MEM_DATA);
+#endif
     while (count--) {
       *ptmp++ = *source++;
     }
+#if 0
     /*
      * reset address in case we're currently in auto-increment mode
      */
     write_reg32 (adev, IO_ACX_SLV_MEM_ADDR, destination);
     udelay (10);
+#endif
     write_reg32 (adev, IO_ACX_SLV_MEM_DATA, tmp);
     udelay (10);
   }
@@ -1603,12 +1591,19 @@
        u32 tmp;
 
        FN_ENTER;
+
+
+       /* Pocket PC driver setting this register
+     * with 2.
+     */
+    write_reg16(adev,0x010c,0x2);
+
        /*
        write_reg32 (adev, IO_ACX_SLV_MEM_CP, 0);
        */
        /* reset the device to make sure the eCPU is stopped
         * to upload the firmware correctly */
-
+
        acx_lock(adev, flags);
 
        /* Windows driver does some funny things here */
@@ -1660,7 +1655,7 @@
        adev->irq_status |= HOST_INT_SCAN_COMPLETE;
 
        acx_unlock(adev, flags);
-
+
        /* need to know radio type before fw load */
        /* Need to wait for arrival of this information in a loop,
         * most probably since eCPU runs some init code from EEPROM
@@ -5179,3 +5174,4 @@
 MODULE_AUTHOR( "Todd Blumer <todd@sdgsystems.com>" );
 MODULE_DESCRIPTION( "ACX Slave Memory Driver" );
 MODULE_LICENSE( "GPL" );
+