--- driver/modules/hostap_cs.c +++ driver/modules/hostap_cs.c @@ -220,6 +220,7 @@ static void prism2_pccard_cor_sreset(loc { int res; conf_reg_t reg; + struct net_device *dev = local->dev; if (!prism2_pccard_card_present(local)) return; @@ -257,6 +258,51 @@ static void prism2_pccard_cor_sreset(loc } mdelay(2); + + if (local->link->io.NumPorts1 > 0x42) { + unsigned long int base = local->dev->base_addr; /* may need tweaking */ + + printk("Setting I/O base to 0x%lx\n", base); + + /* Set I/O base - low word */ + reg.Function = 0; + reg.Action = CS_WRITE; + reg.Offset = CISREG_IOBASE_3; + reg.Value = base & 0xff; + + res = pcmcia_access_configuration_register(local->link->handle, ®); + if (res != CS_SUCCESS) { + printk(KERN_DEBUG "prism2_pccard_cor_sreset failed 4 (%d)\n", + res); + return; + } + + mdelay(10); + + /* Set I/O base - high word */ + reg.Function = 0; + reg.Action = CS_WRITE; + reg.Offset = CISREG_IOSIZE; + reg.Value = (base >> 8) & 0xff; + + res = pcmcia_access_configuration_register(local->link->handle, ®); + if (res != CS_SUCCESS) { + printk(KERN_DEBUG "prism2_pccard_cor_sreset failed 4 (%d)\n", + res); + return; + } + + mdelay(10); + + printk("Activating wireless function\n"); + /* Activate the wireless function */ + HFA384X_OUTB(0xc5, 0x40); + mdelay(10); + HFA384X_OUTB(0x4b, 0x40); + mdelay(10); + } else { + printk("Not enough port space: 0x%x\n", local->link->io.NumPorts1); + } } @@ -265,6 +311,7 @@ static void prism2_pccard_genesis_reset( int res; conf_reg_t reg; int old_cor; + struct net_device *dev = local->dev; if (!prism2_pccard_card_present(local)) return; @@ -317,6 +364,24 @@ static void prism2_pccard_genesis_reset( } mdelay(10); + + if (local->link->io.NumPorts1 > 0x42) { + int i; + + printk("Setting HCR directly to 0x%x\n", hcr); + + HFA384X_OUTB(0x80, 0x40); + mdelay(50); + + for(i = 0; i < 10; i++) + HFA384X_OUTB(hcr, 0x42); + + mdelay(55); + + HFA384X_OUTB(0x45, 0x40); + } else { + printk("Not enough port space: 0x%x\n", local->link->io.NumPorts1); + } }