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" );
+