[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 +//#include #include #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 " ); MODULE_DESCRIPTION( "ACX Slave Memory Driver" ); MODULE_LICENSE( "GPL" ); +