From 6fb8eb605e4e3e1584184aa75474bb5f0e463b89 Mon Sep 17 00:00:00 2001 From: mark Date: Sat, 7 Jul 2001 19:48:14 +0000 Subject: [PATCH] Updates added to support the ISIL mini-PCI reference design. The PCI part doesn't work yet, but the changes impact the PCMCIA and PLX parts as well. I'm checking the changes in because I want the changes that affect PCMCIA to get wide testing as soon as possible. --- Configure | 12 +- config.in | 5 +- src/include/wlan/wlan_compat.h | 7 + src/prism2/driver/Makefile | 56 +++++- src/prism2/driver/hfa384x.c | 178 ++++++++--------- src/prism2/driver/prism2mgmt.c | 20 +- src/prism2/driver/prism2sta.c | 295 ++++++++++++++++++++++------ src/prism2/include/prism2/hfa384x.h | 212 +++++++++++++++++--- 8 files changed, 585 insertions(+), 200 deletions(-) diff --git a/Configure b/Configure index e480d14..7327bd1 100755 --- a/Configure +++ b/Configure @@ -473,13 +473,19 @@ $ECHO "" #======================================================================= # Should we build for PLX??? based PCI adapters? -ask_bool "Build PLX???? based PCI (_plx) adapter drivers?" WLAN_PLX +ask_bool "Build Prism2 PLX???? based PCI (_plx) adapter drivers?" PRISM2_PLX $ECHO "" #======================================================================= -# Should we build for PLX??? based PCI adapters? +# Should we build for PCMCIA Card Services? -ask_bool "Build PCMCIA Card Services (_cs) drivers?" WLAN_PCMCIA +ask_bool "Build Prism2 PCMCIA Card Services (_cs) drivers?" PRISM2_PCMCIA + +$ECHO "" +#======================================================================= +# Should we build for Prism2 native PCI? + +ask_bool "Build Prism2 PCI (_pci) drivers?" PRISM2_PCI $ECHO "" #======================================================================= diff --git a/config.in b/config.in index fe86dea..6a3f3ee 100644 --- a/config.in +++ b/config.in @@ -2,8 +2,6 @@ WLAN_VERSION=0 WLAN_PATCHLEVEL=1 WLAN_SUBLEVEL=8 WLAN_EXTRAVERSION=-pre12 -WLAN_PLX=n -WLAN_PCMCIA=y LINUX_SRC=/usr/src/linux WLAN_TARGET_ARCH= PCMCIA_SRC= @@ -18,3 +16,6 @@ WLAN_DEBUG=n CROSS_COMPILE_ENABLED=n CROSS_COMPILE= HOST_COMPILE= +PRISM2_PLX=y +PRISM2_PCMCIA=y +PRISM2_PCI=y diff --git a/src/include/wlan/wlan_compat.h b/src/include/wlan/wlan_compat.h index 7f28632..7ab0eb0 100644 --- a/src/include/wlan/wlan_compat.h +++ b/src/include/wlan/wlan_compat.h @@ -94,6 +94,13 @@ #define WLAN_ISA 2 #define WLAN_PCI 3 #define WLAN_USB 4 + #define WLAN_PLX 5 + +/* Note: the PLX HOSTIF above refers to some vendors implementations for */ +/* PCI. It's a PLX chip that is a PCI to PCMCIA adapter, but it */ +/* isn't a real PCMCIA host interface adapter providing all the */ +/* card&socket services. */ + /* LinuxPPC users! uncomment the following line to build for LinuxPPC */ /* a header file change has created a small problem that will be fixed */ diff --git a/src/prism2/driver/Makefile b/src/prism2/driver/Makefile index 2eb8baf..a5cf952 100644 --- a/src/prism2/driver/Makefile +++ b/src/prism2/driver/Makefile @@ -80,14 +80,20 @@ endif # Source and obj and target definitions CS_OBJ_DIR=obj_cs PLX_OBJ_DIR=obj_plx +PCI_OBJ_DIR=obj_pci SRC=prism2sta.c prism2mgmt.c prism2mib.c hfa384x.c -ifeq ($(WLAN_PLX), y) +ifeq ($(PRISM2_PLX), y) +SRC+=pci-scan.c +endif + +ifeq ($(PRISM2_PCI), y) SRC+=pci-scan.c endif CS_MODULE=prism2_cs.o PLX_MODULE=prism2_plx.o +PCI_MODULE=prism2_pci.o CS_OBJ= $(CS_OBJ_DIR)/prism2sta.o \ $(CS_OBJ_DIR)/prism2mgmt.o \ @@ -100,15 +106,25 @@ PLX_OBJ= $(PLX_OBJ_DIR)/prism2sta.o \ $(PLX_OBJ_DIR)/pci-scan.o \ $(PLX_OBJ_DIR)/hfa384x.o +PCI_OBJ= $(PCI_OBJ_DIR)/prism2sta.o \ + $(PCI_OBJ_DIR)/prism2mgmt.o \ + $(PCI_OBJ_DIR)/prism2mib.o \ + $(PCI_OBJ_DIR)/pci-scan.o \ + $(PCI_OBJ_DIR)/hfa384x.o + # List of modules to build MODULES= -ifeq ($(WLAN_PCMCIA), y) +ifeq ($(PRISM2_PCMCIA), y) MODULES+=$(CS_MODULE) endif -ifeq ($(WLAN_PLX), y) +ifeq ($(PRISM2_PLX), y) MODULES+=$(PLX_MODULE) endif +ifeq ($(PRISM2_PCI), y) +MODULES+=$(PCI_MODULE) +endif + # Implicit rules to handle the separate obj dirs $(OBJ_DIR)/%.o : ../shared/%.c $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ @@ -124,6 +140,10 @@ $(PLX_OBJ_DIR)/%.o : %.c $(CC) -c $(CFLAGS) $(CPPFLAGS) \ -DWLAN_HOSTIF=WLAN_PLX $< -o $@ +$(PCI_OBJ_DIR)/%.o : %.c + $(CC) -c $(CFLAGS) $(CPPFLAGS) \ + -DWLAN_HOSTIF=WLAN_PCI $< -o $@ + # Compiler Options ifndef CFLAGS CFLAGS = -O2 -Wall -Wstrict-prototypes -fomit-frame-pointer -pipe @@ -157,6 +177,7 @@ all : .depend dirs $(MODULES) dirs : mkdir -p $(CS_OBJ_DIR) mkdir -p $(PLX_OBJ_DIR) + mkdir -p $(PCI_OBJ_DIR) $(CS_MODULE) : $(CS_OBJ) $(LD) -r -o $@ $(CS_OBJ) @@ -166,12 +187,19 @@ $(PLX_MODULE) : $(PLX_OBJ) $(LD) -r -o $@ $(PLX_OBJ) chmod -x $@ +$(PCI_MODULE) : $(PCI_OBJ) + $(LD) -r -o $@ $(PCI_OBJ) + chmod -x $@ + install : $(MODULES) +ifeq ($(PRISM2_PCMCIA), y) mkdir -p $(TARGET_MODDIR)/pcmcia -ifeq ($(WLAN_PCMCIA), y) cp -f $(CS_MODULE) $(TARGET_MODDIR)/pcmcia endif -ifeq ($(WLAN_PLX), y) +ifeq ($(PRISM2_PCI), y) + cp -f $(PCI_MODULE) $(TARGET_MODDIR)/net +endif +ifeq ($(PRISM2_PLX), y) cp -f $(PLX_MODULE) $(TARGET_MODDIR)/net endif @@ -180,16 +208,20 @@ clean: rm -f core core.* *.o .*.o *.s *.a .depend tmp_make *~ tags rm -fr $(CS_OBJ_DIR) rm -fr $(PLX_OBJ_DIR) + rm -fr $(PCI_OBJ_DIR) rm -fr $(MODULES) # This probably isn't the best way to handle the dependencies, but it works. DEPLIST= -ifeq ($(WLAN_PCMCIA), y) +ifeq ($(PRISM2_PCMCIA), y) DEPLIST+=.depend.cs endif -ifeq ($(WLAN_PLX), y) +ifeq ($(PRISM2_PLX), y) DEPLIST+=.depend.plx endif +ifeq ($(PRISM2_PCI), y) +DEPLIST+=.depend.pci +endif dep .depend: $(DEPLIST) cat $(DEPLIST) > .depend @@ -202,11 +234,19 @@ dep .depend: $(DEPLIST) >> $@ ; \ done +.depend.pci: $(DEP_SRC) ../../../config.mk + rm -f $@ + for i in $(DEP_SRC); do \ + (/bin/echo -n $(PCI_OBJ_DIR)/ ; \ + $(CPP) -DWLAN_HOSTIF=WLAN_PCI -M $(CPPFLAGS) $$i ) \ + >> $@ ; \ + done + .depend.cs: $(DEP_SRC) ../../../config.mk rm -f $@ for i in $(DEP_SRC); do \ (/bin/echo -n $(CS_OBJ_DIR)/ ; \ - $(CPP) -DWLAN_HOSTIF=WLAN_PCMCIA -M $(CPPFLAGS) $$i ) \ + $(CPP) -DWLAN_HOSTIF=PRISM2_PCMCIA -M $(CPPFLAGS) $$i ) \ >> $@ ; \ done diff --git a/src/prism2/driver/hfa384x.c b/src/prism2/driver/hfa384x.c index 968cdbb..eb4c618 100644 --- a/src/prism2/driver/hfa384x.c +++ b/src/prism2/driver/hfa384x.c @@ -150,7 +150,8 @@ extern int prism2_debug; * Arguments: * hw device structure * irq device irq number -* iobase base address for register access +* iobase i/o base address for register access +* membase memory base address for register access * * Returns: * nothing @@ -160,12 +161,13 @@ extern int prism2_debug; * Call context: * process thread ----------------------------------------------------------------*/ -void hfa384x_inithw( hfa384x_t *hw, UINT irq, UINT iobase) +void hfa384x_inithw( hfa384x_t *hw, UINT irq, UINT iobase, UINT membase) { DBFENTER; memset(hw, 0, sizeof(hfa384x_t)); hw->irq = irq; hw->iobase = iobase; + hw->membase = membase; hw->bap = HFA384x_BAP_PROC; spin_lock_init(&(hw->cmdlock)); spin_lock_init(&(hw->baplock[0])); @@ -1480,31 +1482,31 @@ int hfa384x_cmd_aux_enable(hfa384x_t *hw) spin_lock_irqsave( &(hw->cmdlock), flags); /* wait for cmd the busy bit to clear */ timeout = jiffies + 1*HZ; - reg = wlan_inw_le16_to_cpu(HFA384x_CMD(hw->iobase)); + reg = hfa384x_getreg(hw, HFA384x_CMD); while ( HFA384x_CMD_ISBUSY(reg) && time_before( jiffies, timeout) ) { - reg = wlan_inw_le16_to_cpu(HFA384x_CMD(hw->iobase)); + reg = hfa384x_getreg(hw, HFA384x_CMD); } if (!HFA384x_CMD_ISBUSY(reg)) { /* busy bit clear, it's OK to write to ParamX regs */ - wlan_outw_cpu_to_le16(HFA384x_AUXPW0, - HFA384x_PARAM0(hw->iobase)); - wlan_outw_cpu_to_le16(HFA384x_AUXPW1, - HFA384x_PARAM1(hw->iobase)); - wlan_outw_cpu_to_le16(HFA384x_AUXPW2, - HFA384x_PARAM2(hw->iobase)); + hfa384x_setreg(hw, HFA384x_AUXPW0, + HFA384x_PARAM0); + hfa384x_setreg(hw, HFA384x_AUXPW1, + HFA384x_PARAM1); + hfa384x_setreg(hw, HFA384x_AUXPW2, + HFA384x_PARAM2); /* Set the aux enable in the Control register */ - wlan_outw_cpu_to_le16(HFA384x_CONTROL_AUX_DOENABLE, - HFA384x_CONTROL(hw->iobase)); + hfa384x_setreg(hw, HFA384x_CONTROL_AUX_DOENABLE, + HFA384x_CONTROL); /* Now wait for completion */ timeout = jiffies + 1*HZ; - reg = wlan_inw_le16_to_cpu(HFA384x_CONTROL(hw->iobase)); + reg = hfa384x_getreg(hw, HFA384x_CONTROL); while ( ((reg & (BIT14|BIT15)) != HFA384x_CONTROL_AUX_ISENABLED) && time_before(jiffies,timeout) ){ udelay(10); - reg = wlan_inw_le16_to_cpu(HFA384x_CONTROL(hw->iobase)); + reg = hfa384x_getreg(hw, HFA384x_CONTROL); } if ( (reg & (BIT14|BIT15)) == HFA384x_CONTROL_AUX_ISENABLED ) { result = 0; @@ -1549,19 +1551,19 @@ int hfa384x_cmd_aux_disable(hfa384x_t *hw) if (hw->auxen) return 0; /* Clear the aux enable in the Control register */ - wlan_outw(0, HFA384x_PARAM0(hw->iobase)); - wlan_outw(0, HFA384x_PARAM1(hw->iobase)); - wlan_outw(0, HFA384x_PARAM2(hw->iobase)); - wlan_outw_cpu_to_le16(HFA384x_CONTROL_AUX_DODISABLE, - HFA384x_CONTROL(hw->iobase)); + hfa384x_setreg(hw, 0, HFA384x_PARAM0); + hfa384x_setreg(hw, 0, HFA384x_PARAM1); + hfa384x_setreg(hw, 0, HFA384x_PARAM2); + hfa384x_setreg(hw, HFA384x_CONTROL_AUX_DODISABLE, + HFA384x_CONTROL); /* Now wait for completion */ timeout = jiffies + 1*HZ; - reg = wlan_inw_le16_to_cpu(HFA384x_CONTROL(hw->iobase)); + reg = hfa384x_getreg(hw, HFA384x_CONTROL); while ( ((reg & (BIT14|BIT15)) != HFA384x_CONTROL_AUX_ISDISABLED) && time_before(jiffies,timeout) ){ udelay(10); - reg = wlan_inw_le16_to_cpu(HFA384x_CONTROL(hw->iobase)); + reg = hfa384x_getreg(hw, HFA384x_CONTROL); } if ((reg & (BIT14|BIT15)) == HFA384x_CONTROL_AUX_ISDISABLED ) { result = 0; @@ -1819,26 +1821,21 @@ int hfa384x_copy_from_bap(hfa384x_t *hw, UINT16 bap, UINT16 id, UINT16 offset, (len > HFA384x_BAP_DATALEN_MAX) ){ result = -EINVAL; } else { - selectreg = (bap == 1) ? - HFA384x_SELECT1(hw->iobase) : - HFA384x_SELECT0(hw->iobase) ; - offsetreg = (bap == 1) ? - HFA384x_OFFSET1(hw->iobase) : - HFA384x_OFFSET0(hw->iobase) ; - datareg = (bap == 1) ? - HFA384x_DATA1(hw->iobase) : - HFA384x_DATA0(hw->iobase) ; + selectreg = (bap == 1) ? HFA384x_SELECT1 : HFA384x_SELECT0 ; + offsetreg = (bap == 1) ? HFA384x_OFFSET1 : HFA384x_OFFSET0 ; + datareg = (bap == 1) ? HFA384x_DATA1 : HFA384x_DATA0 ; + /* Obtain lock */ spin_lock_irqsave( &(hw->baplock[bap]), flags); /* Write id to select reg */ - wlan_outw_cpu_to_le16(id, selectreg); + hfa384x_setreg(hw, id, selectreg); /* Write offset to offset reg */ - wlan_outw_cpu_to_le16(offset, offsetreg); + hfa384x_setreg(hw, offset, offsetreg); /* Wait for offset[busy] to clear (see BAP_TIMEOUT) */ i = 0; do { - reg = wlan_inw_le16_to_cpu(offsetreg); + reg = hfa384x_getreg(hw, offsetreg); if ( i > 0 ) udelay(2); i++; } while ( i < BAP_TIMEOUT && HFA384x_OFFSET_ISBUSY(reg)); @@ -1851,11 +1848,12 @@ int hfa384x_copy_from_bap(hfa384x_t *hw, UINT16 bap, UINT16 id, UINT16 offset, } else { /* Read even(len) buf contents from data reg */ for ( i = 0; i < (len & 0xfffe); i+=2 ) { - *(UINT16*)(&(d[i])) = wlan_inw(datareg); + *(UINT16*)(&(d[i])) = + hfa384x_getreg_noswap(hw, datareg); } /* If len odd, handle last byte */ if ( len % 2 ){ - reg = wlan_inw(datareg); + reg = hfa384x_getreg_noswap(hw, datareg); d[len-1] = ((UINT8*)(®))[0]; } } @@ -1922,27 +1920,21 @@ int hfa384x_copy_to_bap(hfa384x_t *hw, UINT16 bap, UINT16 id, UINT16 offset, (len > HFA384x_BAP_DATALEN_MAX) ){ result = -EINVAL; } else { - selectreg = (bap == 1) ? - HFA384x_SELECT1(hw->iobase) : - HFA384x_SELECT0(hw->iobase) ; - offsetreg = (bap == 1) ? - HFA384x_OFFSET1(hw->iobase) : - HFA384x_OFFSET0(hw->iobase) ; - datareg = (bap == 1) ? - HFA384x_DATA1(hw->iobase) : - HFA384x_DATA0(hw->iobase) ; + selectreg = (bap == 1) ? HFA384x_SELECT1 : HFA384x_SELECT0; + offsetreg = (bap == 1) ? HFA384x_OFFSET1 : HFA384x_OFFSET0; + datareg = (bap == 1) ? HFA384x_DATA1 : HFA384x_DATA0; /* Obtain lock */ spin_lock_irqsave( &(hw->baplock[bap]), flags); /* Write id to select reg */ - wlan_outw_cpu_to_le16(id, selectreg); + hfa384x_setreg(hw, id, selectreg); udelay(10); /* Write offset to offset reg */ - wlan_outw_cpu_to_le16(offset, offsetreg); + hfa384x_setreg(hw, offset, offsetreg); /* Wait for offset[busy] to clear (see BAP_TIMEOUT) */ i = 0; do { - reg = wlan_inw_le16_to_cpu(offsetreg); + reg = hfa384x_getreg(hw, offsetreg); if ( i > 0 ) udelay(2); i++; } while ( i < BAP_TIMEOUT && HFA384x_OFFSET_ISBUSY(reg)); @@ -1955,16 +1947,18 @@ int hfa384x_copy_to_bap(hfa384x_t *hw, UINT16 bap, UINT16 id, UINT16 offset, } else { /* Write even(len) buf contents to data reg */ for ( i = 0; i < (len & 0xfffe); i+=2 ) { - wlan_outw( *(UINT16*)(&(d[i])), datareg); + hfa384x_setreg_noswap(hw, + *(UINT16*)(&(d[i])), datareg); } /* If len odd, handle last byte */ if ( len % 2 ){ - savereg = wlan_inw(datareg); - wlan_outw_cpu_to_le16((offset+(len&0xfffe)), offsetreg); + savereg = hfa384x_getreg_noswap(hw, datareg); + hfa384x_setreg_noswap(hw, + (offset+(len&0xfffe)), offsetreg); /* Wait for offset[busy] to clear (see BAP_TIMEOUT) */ i = 0; do { - reg = wlan_inw_le16_to_cpu(offsetreg); + reg = hfa384x_getreg(hw, offsetreg); if ( i > 0 ) udelay(2); i++; } while ( i < BAP_TIMEOUT && HFA384x_OFFSET_ISBUSY(reg)); @@ -1973,7 +1967,8 @@ int hfa384x_copy_to_bap(hfa384x_t *hw, UINT16 bap, UINT16 id, UINT16 offset, result = reg; } else { ((UINT8*)(&savereg))[0] = d[len-1]; - wlan_outw( savereg, datareg); + hfa384x_setreg_noswap(hw, + savereg, datareg); } } } @@ -2037,26 +2032,26 @@ hfa384x_copy_from_aux( /* Build appropriate aux page and offset */ currpage = HFA384x_AUX_MKPAGE(cardaddr); curroffset = HFA384x_AUX_MKOFF(cardaddr, auxctl); - wlan_outw_cpu_to_le16(currpage, HFA384x_AUXPAGE(hw->iobase)); - wlan_outw_cpu_to_le16(curroffset, HFA384x_AUXOFFSET(hw->iobase)); + hfa384x_setreg(hw, currpage, HFA384x_AUXPAGE); + hfa384x_setreg(hw, curroffset, HFA384x_AUXOFFSET); udelay(5); /* beat */ /* read the data */ while ( i < len) { - *((UINT16*)(buf+i)) = wlan_inw(HFA384x_AUXDATA(hw->iobase)); + *((UINT16*)(buf+i)) = hfa384x_getreg_noswap(hw, HFA384x_AUXDATA); i+=2; curroffset+=2; if ( (curroffset&HFA384x_AUX_OFF_MASK) > HFA384x_AUX_OFF_MAX ) { currpage++; curroffset = 0; curroffset = HFA384x_AUX_MKOFF(curroffset, auxctl); - wlan_outw_cpu_to_le16(currpage, HFA384x_AUXPAGE(hw->iobase)); - wlan_outw_cpu_to_le16(curroffset, HFA384x_AUXOFFSET(hw->iobase)); + hfa384x_setreg(hw, currpage, HFA384x_AUXPAGE); + hfa384x_setreg(hw, curroffset, HFA384x_AUXOFFSET); udelay(5); /* beat */ } } /* Make sure the auxctl bits are clear */ - wlan_outw_cpu_to_le16(0, HFA384x_AUXOFFSET(hw->iobase)); + hfa384x_setreg(hw, 0, HFA384x_AUXOFFSET); DBFEXIT; } @@ -2105,20 +2100,21 @@ hfa384x_copy_to_aux( /* Build appropriate aux page and offset */ currpage = HFA384x_AUX_MKPAGE(cardaddr); curroffset = HFA384x_AUX_MKOFF(cardaddr, auxctl); - wlan_outw_cpu_to_le16(currpage, HFA384x_AUXPAGE(hw->iobase)); - wlan_outw_cpu_to_le16(curroffset, HFA384x_AUXOFFSET(hw->iobase)); + hfa384x_setreg(hw, currpage, HFA384x_AUXPAGE); + hfa384x_setreg(hw, curroffset, HFA384x_AUXOFFSET); udelay(5); /* beat */ /* write the data */ while ( i < len) { - wlan_outw( *((UINT16*)(buf+i)), HFA384x_AUXDATA(hw->iobase)); + hfa384x_setreg_noswap(hw, + *((UINT16*)(buf+i)), HFA384x_AUXDATA); i+=2; curroffset+=2; if ( curroffset > HFA384x_AUX_OFF_MAX ) { currpage++; curroffset = 0; - wlan_outw_cpu_to_le16(currpage, HFA384x_AUXPAGE(hw->iobase)); - wlan_outw_cpu_to_le16(curroffset, HFA384x_AUXOFFSET(hw->iobase)); + hfa384x_setreg(hw, currpage, HFA384x_AUXPAGE); + hfa384x_setreg(hw, curroffset, HFA384x_AUXOFFSET); udelay(5); /* beat */ } } @@ -2171,10 +2167,10 @@ int hfa384x_docmd_wait( hfa384x_t *hw, UINT16 cmd, UINT16 parm0, UINT16 parm1, U /* wait for the busy bit to clear */ counter = 0; - reg = wlan_inw_le16_to_cpu(HFA384x_CMD(hw->iobase)); + reg = hfa384x_getreg(hw, HFA384x_CMD); while ( HFA384x_CMD_ISBUSY(reg) && (counter < 10)) { - reg = wlan_inw_le16_to_cpu(HFA384x_CMD(hw->iobase)); + reg = hfa384x_getreg(hw, HFA384x_CMD); counter++; udelay(10); } @@ -2182,27 +2178,27 @@ int hfa384x_docmd_wait( hfa384x_t *hw, UINT16 cmd, UINT16 parm0, UINT16 parm1, U printk("counter(1)=%d\n", counter); #endif if (HFA384x_CMD_ISBUSY(reg)) { - printk("hfa384x_cmd timeout(1).\n"); + printk("hfa384x_cmd timeout(1), reg=0x%0hx.\n", reg); goto failed; } if (!HFA384x_CMD_ISBUSY(reg)) { /* busy bit clear, write command */ - wlan_outw_cpu_to_le16(parm0, HFA384x_PARAM0(hw->iobase)); - wlan_outw_cpu_to_le16(parm1, HFA384x_PARAM1(hw->iobase)); - wlan_outw_cpu_to_le16(parm2, HFA384x_PARAM2(hw->iobase)); + hfa384x_setreg(hw, parm0, HFA384x_PARAM0); + hfa384x_setreg(hw, parm1, HFA384x_PARAM1); + hfa384x_setreg(hw, parm2, HFA384x_PARAM2); hw->lastcmd = cmd; - wlan_outw_cpu_to_le16(cmd, HFA384x_CMD(hw->iobase)); + hfa384x_setreg(hw, cmd, HFA384x_CMD); /* Now wait for completion */ counter = 0; - reg = wlan_inw_le16_to_cpu(HFA384x_EVSTAT(hw->iobase)); + reg = hfa384x_getreg(hw, HFA384x_EVSTAT); /* Initialization is the problem. It takes about 100ms. "normal" commands are typically is about 200-400 us (I've never seen less than 200). Longer is better so that we're not hammering the bus. */ while ( !HFA384x_EVSTAT_ISCMD(reg) && (counter < 1000)) { - reg = wlan_inw_le16_to_cpu(HFA384x_EVSTAT(hw->iobase)); + reg = hfa384x_getreg(hw, HFA384x_EVSTAT); counter++; udelay(200); } @@ -2211,12 +2207,12 @@ int hfa384x_docmd_wait( hfa384x_t *hw, UINT16 cmd, UINT16 parm0, UINT16 parm1, U #endif if ( HFA384x_EVSTAT_ISCMD(reg) ) { result = 0; - hw->status = wlan_inw_le16_to_cpu(HFA384x_STATUS(hw->iobase)); - hw->resp0 = wlan_inw_le16_to_cpu(HFA384x_RESP0(hw->iobase)); - hw->resp1 = wlan_inw_le16_to_cpu(HFA384x_RESP1(hw->iobase)); - hw->resp2 = wlan_inw_le16_to_cpu(HFA384x_RESP2(hw->iobase)); - wlan_outw_cpu_to_le16(HFA384x_EVACK_CMD, - HFA384x_EVACK(hw->iobase)); + hw->status = hfa384x_getreg(hw, HFA384x_STATUS); + hw->resp0 = hfa384x_getreg(hw, HFA384x_RESP0); + hw->resp1 = hfa384x_getreg(hw, HFA384x_RESP1); + hw->resp2 = hfa384x_getreg(hw, HFA384x_RESP2); + hfa384x_setreg(hw, HFA384x_EVACK_CMD, + HFA384x_EVACK); result = HFA384x_STATUS_RESULT_GET(hw->status); } else { printk("hfa384x_cmd timeout(2)\n"); @@ -2272,9 +2268,9 @@ int hfa384x_dl_docmd_wait( hfa384x_t *hw, UINT16 cmd, UINT16 parm0, UINT16 parm1 DBFENTER; /* wait for the busy bit to clear */ timeout = jiffies + 1*HZ; - reg = wlan_inw_le16_to_cpu(HFA384x_CMD(hw->iobase)); + reg = hfa384x_getreg(hw, HFA384x_CMD); while ( HFA384x_CMD_ISBUSY(reg) && time_before( jiffies, timeout) ) { - reg = wlan_inw_le16_to_cpu(HFA384x_CMD(hw->iobase)); + reg = hfa384x_getreg(hw, HFA384x_CMD); udelay(10); } if (HFA384x_CMD_ISBUSY(reg)) { @@ -2284,11 +2280,11 @@ int hfa384x_dl_docmd_wait( hfa384x_t *hw, UINT16 cmd, UINT16 parm0, UINT16 parm1 if (!HFA384x_CMD_ISBUSY(reg)) { /* busy bit clear, write command */ - wlan_outw_cpu_to_le16(parm0, HFA384x_PARAM0(hw->iobase)); - wlan_outw_cpu_to_le16(parm1, HFA384x_PARAM1(hw->iobase)); - wlan_outw_cpu_to_le16(parm2, HFA384x_PARAM2(hw->iobase)); + hfa384x_setreg(hw, parm0, HFA384x_PARAM0); + hfa384x_setreg(hw, parm1, HFA384x_PARAM1); + hfa384x_setreg(hw, parm2, HFA384x_PARAM2); hw->lastcmd = cmd; - wlan_outw_cpu_to_le16(cmd, HFA384x_CMD(hw->iobase)); + hfa384x_setreg(hw, cmd, HFA384x_CMD); /* Now wait for completion */ if ( (HFA384x_CMD_CMDCODE_GET(hw->lastcmd) == HFA384x_CMDCODE_DOWNLD) ) { @@ -2302,18 +2298,18 @@ int hfa384x_dl_docmd_wait( hfa384x_t *hw, UINT16 cmd, UINT16 parm0, UINT16 parm1 } else { timeout = jiffies + 1*HZ; } - reg = wlan_inw_le16_to_cpu(HFA384x_EVSTAT(hw->iobase)); + reg = hfa384x_getreg(hw, HFA384x_EVSTAT); while ( !HFA384x_EVSTAT_ISCMD(reg) && time_before(jiffies,timeout) ) { udelay(100); - reg = wlan_inw_le16_to_cpu(HFA384x_EVSTAT(hw->iobase)); + reg = hfa384x_getreg(hw, HFA384x_EVSTAT); } if ( HFA384x_EVSTAT_ISCMD(reg) ) { result = 0; - hw->status = wlan_inw_le16_to_cpu(HFA384x_STATUS(hw->iobase)); - hw->resp0 = wlan_inw_le16_to_cpu(HFA384x_RESP0(hw->iobase)); - hw->resp1 = wlan_inw_le16_to_cpu(HFA384x_RESP1(hw->iobase)); - hw->resp2 = wlan_inw_le16_to_cpu(HFA384x_RESP2(hw->iobase)); - wlan_outw_cpu_to_le16(HFA384x_EVACK_CMD, HFA384x_EVACK(hw->iobase)); + hw->status = hfa384x_getreg(hw, HFA384x_STATUS); + hw->resp0 = hfa384x_getreg(hw, HFA384x_RESP0); + hw->resp1 = hfa384x_getreg(hw, HFA384x_RESP1); + hw->resp2 = hfa384x_getreg(hw, HFA384x_RESP2); + hfa384x_setreg(hw, HFA384x_EVACK_CMD, HFA384x_EVACK); result = HFA384x_STATUS_RESULT_GET(hw->status); } } diff --git a/src/prism2/driver/prism2mgmt.c b/src/prism2/driver/prism2mgmt.c index 311a5b4..cedd134 100644 --- a/src/prism2/driver/prism2mgmt.c +++ b/src/prism2/driver/prism2mgmt.c @@ -534,8 +534,8 @@ int prism2mgmt_associate(wlandevice_t *wlandev, void *msgp) HFA384x_INTEN_TXEXC_SET(1) | HFA384x_INTEN_TX_SET(1) | HFA384x_INTEN_RX_SET(1); - wlan_outw_cpu_to_le16(0xffff, HFA384x_EVSTAT(priv->hw->iobase)); - wlan_outw_cpu_to_le16(reg, HFA384x_INTEN(hw->iobase)); + hfa384x_setreg(hw, 0xffff, HFA384x_EVSTAT); + hfa384x_setreg(hw, reg, HFA384x_INTEN); /* Enable the Port */ hfa384x_cmd_enable(hw, 0); @@ -881,8 +881,8 @@ pcf_skip: HFA384x_INTEN_DTIM_SET(1) | HFA384x_INTEN_TX_SET(1) | HFA384x_INTEN_RX_SET(1); - wlan_outw_cpu_to_le16(0xffff, HFA384x_EVSTAT(priv->hw->iobase)); - wlan_outw_cpu_to_le16(word, HFA384x_INTEN(hw->iobase)); + hfa384x_setreg(hw, 0xffff, HFA384x_EVSTAT); + hfa384x_setreg(hw, word, HFA384x_INTEN); /* Set the macmode so the frame setup code knows what to do */ if ( msg->bsstype.data == P80211ENUM_bsstype_infrastructure ) { @@ -977,8 +977,8 @@ int prism2mgmt_enable(wlandevice_t *wlandev, void *msgp) HFA384x_INTEN_DTIM_SET(1) | HFA384x_INTEN_TX_SET(1) | HFA384x_INTEN_RX_SET(1); - wlan_outw_cpu_to_le16(0xffff, HFA384x_EVSTAT(priv->hw->iobase)); - wlan_outw_cpu_to_le16(word, HFA384x_INTEN(hw->iobase)); + hfa384x_setreg(hw, 0xffff, HFA384x_EVSTAT); + hfa384x_setreg(hw, word, HFA384x_INTEN); /* Set the macmode so the frame setup code knows what to do */ wlandev->macmode = WLAN_MACMODE_ESS_AP; @@ -1713,8 +1713,8 @@ int prism2mgmt_dump_state(wlandevice_t *wlandev, void *msgp) hfa384x_cmd_aux_disable(hw); WLAN_LOG_NOTICE1(" cmac: FreeBlocks=%d\n", auxbuf[5]); WLAN_LOG_NOTICE2(" cmac: IntEn=0x%02x EvStat=0x%02x\n", - wlan_inw_le16_to_cpu(HFA384x_INTEN(hw->iobase)), - wlan_inw_le16_to_cpu(HFA384x_EVSTAT(hw->iobase))); + hfa384x_getreg(hw, HFA384x_INTEN), + hfa384x_getreg(hw, HFA384x_EVSTAT)); #ifdef USE_FID_STACK WLAN_LOG_NOTICE2(" drvr: txfid_top=%d stacksize=%d\n", priv->txfid_top,PRISM2_FIDSTACKLEN_MAX); @@ -1972,8 +1972,8 @@ int prism2mgmt_autojoin(wlandevice_t *wlandev, void *msgp) HFA384x_INTEN_TXEXC_SET(1) | HFA384x_INTEN_TX_SET(1) | HFA384x_INTEN_RX_SET(1); - wlan_outw_cpu_to_le16(0xffff, HFA384x_EVSTAT(priv->hw->iobase)); - wlan_outw_cpu_to_le16(reg, HFA384x_INTEN(hw->iobase)); + hfa384x_setreg(hw, 0xffff, HFA384x_EVSTAT); + hfa384x_setreg(hw, reg, HFA384x_INTEN); /* Enable the Port */ hfa384x_cmd_enable(hw, 0); diff --git a/src/prism2/driver/prism2sta.c b/src/prism2/driver/prism2sta.c index ba95372..6e7bfa1 100644 --- a/src/prism2/driver/prism2sta.c +++ b/src/prism2/driver/prism2sta.c @@ -94,7 +94,7 @@ #include #include -#if (WLAN_HOSTIF == WLAN_PLX) +#if ((WLAN_HOSTIF == WLAN_PLX) || (WLAN_HOSTIF == WLAN_PCI)) #include #include #include @@ -116,6 +116,13 @@ #define PCI_CLASS_NETWORK_OTHERS 0x280 /* PCI Class & Sub-Class code, Network-'Other controller' */ #endif +#if (WLAN_HOSTIF == WLAN_PCI) +#define PCI_TYPE (PCI_USES_MEM | PCI_ADDR0 | PCI_NO_ACPI_WAKE) +#define PCI_SIZE 0x1000 /* Memory size - 4K bytes */ +#define ISL3874A_ID 0x38731260 /* ISL3874A 11Mb/s WLAN controller */ +#define PCI_CLASS_NETWORK_OTHERS 0x280 /* PCI Class & Sub-Class code, Network-'Other controller' */ +#endif + /*================================================================*/ /* Local Macros */ @@ -135,6 +142,8 @@ #if (WLAN_HOSTIF == WLAN_PCMCIA) #define DRIVER_SUFFIX "_cs" #elif (WLAN_HOSTIF == WLAN_PLX) +#define DRIVER_SUFFIX "_plx" +#elif (WLAN_HOSTIF == WLAN_PCI) #define DRIVER_SUFFIX "_pci" /* #else , TODO: Fix .depend generation for multiple driver build */ /* #error "HOSTIF unsupported or undefined!" */ @@ -170,6 +179,39 @@ static struct pci_id_info pci_id_tbl[] = { } }; +/* Function declared here because of ptr reference below */ +static void *prism2sta_probe_plx(struct pci_dev *pdev, void *dev, + unsigned char *attr_mem, int irq, int chip_idx, + int fnd_cnt); + +struct drv_id_info prism2_plx_drv_id = { + "prism2-plx", + 0, + PCI_CLASS_NETWORK_OTHERS<<8, + pci_id_tbl, + (void *)prism2sta_probe_plx +}; + +#endif /* WLAN_PLX */ + +#if (WLAN_HOSTIF == WLAN_PCI) +static struct pci_id_info pci_id_tbl[] = { + { + "Intersil Prism2.5 ISL3874 11Mb/s WLAN Controller", + { ISL3874A_ID, 0xffffffff}, + PCI_TYPE, + PCI_SIZE, + 0 + }, + { + NULL, + { 0, 0}, + 0, + 0, + 0 + } +}; + /* Function declared here because of ptr reference below */ static void *prism2sta_probe_pci(struct pci_dev *pdev, void *dev, unsigned char *attr_mem, int irq, int chip_idx, @@ -183,22 +225,26 @@ struct drv_id_info prism2_pci_drv_id = { (void *)prism2sta_probe_pci }; -#endif /* WLAN_PLX */ +#endif /* WLAN_PCI */ /*----------------------------------------------------------------*/ /* --Module Parameters */ int prism2_debug=0; /* Debug output level, */ -static u_int irq_mask = 0xdeb8; /* Interrupt mask */ -static int irq_list[4] = { -1 }; /* Interrupt list (alternative) */ -static u_int prism2_irq_evread_max=20; /* Maximum number of ev_reads (loops) - in irq handler */ - +static u_int prism2_irq_evread_max=20; /* Maximum number of + * ev_reads (loops) + * in irq handler + */ MODULE_PARM( prism2_debug, "i"); +MODULE_PARM( prism2_irq_evread_max, "i"); + +#if (WLAN_HOSTIF == WLAN_PCMCIA) +static u_int irq_mask = 0xdeb8; /* Interrupt mask */ +static int irq_list[4] = { -1 }; /* Interrupt list */ MODULE_PARM( irq_mask, "i"); MODULE_PARM( irq_list, "1-4i"); -MODULE_PARM( prism2_irq_evread_max, "i"); +#endif /*================================================================*/ @@ -948,8 +994,8 @@ int prism2sta_initmac(wlandevice_t *wlandev) #endif /* make sure interrupts are disabled and any layabout events cleared */ - wlan_outw_cpu_to_le16(0, HFA384x_INTEN(hw->iobase)); - wlan_outw_cpu_to_le16(0xffff, HFA384x_EVACK(hw->iobase)); + hfa384x_setreg(hw, 0, HFA384x_INTEN); + hfa384x_setreg(hw, 0xffff, HFA384x_EVACK); /* Read the PDA */ result = hfa384x_drvr_readpda(hw, priv->pda, HFA384x_PDA_LEN_MAX); @@ -969,7 +1015,7 @@ int prism2sta_initmac(wlandevice_t *wlandev) } j = 0; do { - reg = wlan_inw_le16_to_cpu(HFA384x_EVSTAT(hw->iobase)); + reg = hfa384x_getreg(hw, HFA384x_EVSTAT); udelay(10); j++; } while ( !HFA384x_EVSTAT_ISALLOC(reg) && j < 50); /* 50 is timeout */ @@ -979,12 +1025,12 @@ int prism2sta_initmac(wlandevice_t *wlandev) goto failed; } #ifdef USE_FID_STACK - priv->txfid_stack[i] = wlan_inw_le16_to_cpu(HFA384x_ALLOCFID(hw->iobase)); + priv->txfid_stack[i] = hfa384x_getreg(hw, HFA384x_ALLOCFID); #else - txfid_queue_add(priv, wlan_inw_le16_to_cpu(HFA384x_ALLOCFID(hw->iobase))); + txfid_queue_add(priv, hfa384x_getreg(hw, HFA384x_ALLOCFID)); #endif reg = HFA384x_EVACK_ALLOC_SET(1); - wlan_outw_cpu_to_le16( reg, HFA384x_EVACK(hw->iobase)); + hfa384x_setreg(hw, reg, HFA384x_EVACK); #ifdef USE_FID_STACK WLAN_LOG_DEBUG2(1,"priv->txfid_stack[%d]=0x%04x\n",i,priv->txfid_stack[i]); @@ -999,7 +1045,7 @@ int prism2sta_initmac(wlandevice_t *wlandev) } i = 0; do { - reg = wlan_inw_le16_to_cpu(HFA384x_EVSTAT(hw->iobase)); + reg = hfa384x_getreg(hw, HFA384x_EVSTAT); udelay(10); i++; } while ( !HFA384x_EVSTAT_ISALLOC(reg) && i < 50); /* 50 is timeout */ @@ -1008,9 +1054,9 @@ int prism2sta_initmac(wlandevice_t *wlandev) result = -ETIMEDOUT; goto failed; } - priv->infofid = wlan_inw_le16_to_cpu(HFA384x_ALLOCFID(hw->iobase)); + priv->infofid = hfa384x_getreg(hw, HFA384x_ALLOCFID); reg = HFA384x_EVACK_ALLOC_SET(1); - wlan_outw_cpu_to_le16( reg, HFA384x_EVACK(hw->iobase)); + hfa384x_setreg(hw, reg, HFA384x_EVACK); WLAN_LOG_DEBUG1(1,"priv->infofid=0x%04x\n", priv->infofid); /* Collect version and compatibility info */ @@ -1277,7 +1323,7 @@ int prism2sta_initmac(wlandevice_t *wlandev) /* TODO: Set any internally managed config items */ /* Set swsupport regs to magic # for card presence detection */ - wlan_outw_cpu_to_le16( PRISM2STA_MAGIC, HFA384x_SWSUPPORT0(hw->iobase)); + hfa384x_setreg(hw, PRISM2STA_MAGIC, HFA384x_SWSUPPORT0); goto done; failed: @@ -1986,7 +2032,7 @@ void prism2sta_interrupt IRQ(int irq, void *dev_id, struct pt_regs *regs) DBFENTER; /* Check swsupport reg magic # for card presence */ - reg = wlan_inw_le16_to_cpu(HFA384x_SWSUPPORT0(hw->iobase)); + reg = hfa384x_getreg(hw, HFA384x_SWSUPPORT0); if ( reg != PRISM2STA_MAGIC) { WLAN_LOG_DEBUG1(2, "irq=%d, no magic. Card removed?.\n", irq); return; @@ -1996,7 +2042,7 @@ void prism2sta_interrupt IRQ(int irq, void *dev_id, struct pt_regs *regs) hw->bap = HFA384x_BAP_INT; /* read the EvStat register for interrupt enabled events */ - reg = wlan_inw_le16_to_cpu(HFA384x_EVSTAT(hw->iobase)); + reg = hfa384x_getreg(hw, HFA384x_EVSTAT); ev_read++; do { @@ -2004,58 +2050,58 @@ void prism2sta_interrupt IRQ(int irq, void *dev_id, struct pt_regs *regs) /* Handle the events */ if ( HFA384x_EVSTAT_ISINFDROP(reg) ){ prism2sta_int_infdrop(wlandev); - wlan_outw_cpu_to_le16(HFA384x_EVACK_INFDROP_SET(1), - HFA384x_EVACK(hw->iobase)); + hfa384x_setreg(hw, HFA384x_EVACK_INFDROP_SET(1), + HFA384x_EVACK); } if ( HFA384x_EVSTAT_ISINFO(reg) ){ prism2sta_int_info(wlandev); - wlan_outw_cpu_to_le16(HFA384x_EVACK_INFO_SET(1), - HFA384x_EVACK(hw->iobase)); + hfa384x_setreg(hw, HFA384x_EVACK_INFO_SET(1), + HFA384x_EVACK); } if ( HFA384x_EVSTAT_ISTXEXC(reg) ){ prism2sta_int_txexc(wlandev); - wlan_outw_cpu_to_le16(HFA384x_EVACK_TXEXC_SET(1), - HFA384x_EVACK(hw->iobase)); + hfa384x_setreg(hw, HFA384x_EVACK_TXEXC_SET(1), + HFA384x_EVACK); } if ( HFA384x_EVSTAT_ISTX(reg) ){ prism2sta_int_tx(wlandev); - wlan_outw_cpu_to_le16(HFA384x_EVACK_TX_SET(1), - HFA384x_EVACK(hw->iobase)); + hfa384x_setreg(hw, HFA384x_EVACK_TX_SET(1), + HFA384x_EVACK); } if ( HFA384x_EVSTAT_ISRX(reg) ){ prism2sta_int_rx(wlandev); - wlan_outw_cpu_to_le16(HFA384x_EVACK_RX_SET(1), - HFA384x_EVACK(hw->iobase)); + hfa384x_setreg(hw, HFA384x_EVACK_RX_SET(1), + HFA384x_EVACK); } if ( HFA384x_EVSTAT_ISALLOC(reg) ){ prism2sta_int_alloc(wlandev); - wlan_outw_cpu_to_le16(HFA384x_EVACK_ALLOC_SET(1), - HFA384x_EVACK(hw->iobase)); + hfa384x_setreg(hw, HFA384x_EVACK_ALLOC_SET(1), + HFA384x_EVACK); } if ( HFA384x_EVSTAT_ISDTIM(reg) ){ prism2sta_int_dtim(wlandev); - wlan_outw_cpu_to_le16(HFA384x_EVACK_DTIM_SET(1), - HFA384x_EVACK(hw->iobase)); + hfa384x_setreg(hw, HFA384x_EVACK_DTIM_SET(1), + HFA384x_EVACK); } /* allow the evstat to be updated after the evack */ udelay(20); /* Check swsupport reg magic # for card presence */ - reg = wlan_inw_le16_to_cpu(HFA384x_SWSUPPORT0(hw->iobase)); + reg = hfa384x_getreg(hw, HFA384x_SWSUPPORT0); if ( reg != PRISM2STA_MAGIC) { WLAN_LOG_DEBUG1(2, "irq=%d, no magic. Card removed?.\n", irq); return; } /* read the EvStat register for interrupt enabled events */ - reg = wlan_inw_le16_to_cpu(HFA384x_EVSTAT(hw->iobase)); + reg = hfa384x_getreg(hw, HFA384x_EVSTAT); ev_read++; } while (( @@ -2159,7 +2205,7 @@ void prism2sta_int_info(wlandevice_t *wlandev) int result; DBFENTER; /* Retrieve the FID */ - reg = wlan_inw_le16_to_cpu(HFA384x_INFOFID(hw->iobase)); + reg = hfa384x_getreg(hw, HFA384x_INFOFID); /* Retrieve the length */ result = hfa384x_copy_from_bap( hw, @@ -2248,7 +2294,7 @@ void prism2sta_int_txexc(wlandevice_t *wlandev) int result = 0; DBFENTER; /* Collect the status and display */ - fid = wlan_inw_le16_to_cpu(HFA384x_TXCOMPLFID(hw->iobase)); + fid = hfa384x_getreg(hw, HFA384x_TXCOMPLFID); result = hfa384x_copy_from_bap(hw, hw->bap, fid, 0, &status, sizeof(status)); if ( result ) { WLAN_LOG_DEBUG3(1, @@ -2288,7 +2334,7 @@ void prism2sta_int_tx(wlandevice_t *wlandev) UINT16 status; int result = 0; DBFENTER; - fid = wlan_inw_le16_to_cpu(HFA384x_TXCOMPLFID(hw->iobase)); + fid = hfa384x_getreg(hw, HFA384x_TXCOMPLFID); result =hfa384x_copy_from_bap(hw, hw->bap, fid, 0, &status, sizeof(status)); if ( result ) { WLAN_LOG_DEBUG3(1, @@ -2334,7 +2380,7 @@ void prism2sta_int_rx(wlandevice_t *wlandev) DBFENTER; /* Get the FID */ - rxfid = wlan_inw_le16_to_cpu(HFA384x_RXFID(hw->iobase)); + rxfid = hfa384x_getreg(hw, HFA384x_RXFID); /* Get the descriptor (including headers) */ result = hfa384x_copy_from_bap(hw, hw->bap, @@ -2636,7 +2682,7 @@ void prism2sta_int_alloc(wlandevice_t *wlandev) /* Handle the reclaimed FID */ /* collect the FID and push it onto the stack */ - fid = wlan_inw_le16_to_cpu(HFA384x_ALLOCFID(hw->iobase)); + fid = hfa384x_getreg(hw, HFA384x_ALLOCFID); #ifdef USE_FID_STACK if (! txfid_stack_full(priv)) { @@ -3217,7 +3263,7 @@ static int prism2sta_event (event_t event, int priority, event_callback_args_t * hfa384x_inithw( ((prism2sta_priv_t*)wlandev->priv)->hw, wlandev->netdev->irq, - wlandev->netdev->base_addr); + wlandev->netdev->base_addr, 0); result = prism2sta_initmac(wlandev); if ( result != 0 ) { WLAN_LOG_ERROR1( @@ -3279,7 +3325,7 @@ static int prism2sta_event (event_t event, int priority, event_callback_args_t * hfa384x_inithw( ((prism2sta_priv_t*)wlandev->priv)->hw, wlandev->netdev->irq, - wlandev->netdev->base_addr); + wlandev->netdev->base_addr, 0); result=prism2sta_initmac(wlandev); if ( result != 0 ) { WLAN_LOG_ERROR1( @@ -3302,9 +3348,127 @@ static int prism2sta_event (event_t event, int priority, event_callback_args_t * } #endif /* WLAN_PCMCIA */ +#if (WLAN_HOSTIF == WLAN_PCI) +/*---------------------------------------------------------------- +* prism2sta_probe_plx +* +* PCI-SCAN probe routine. +* Initialize MAC before return. +* +* Arguments: +* pdev ptr to pci device structure containing info about +* pci configuration. +* dev ptr to that is passed in the 2nd input argument +* of pci_drv_register() +* attr_mem ptr to attribute memory of PC card +* irq interrupt number of PCI device +* chip_idx index number in pci lookup table for this card +* fnd_cnt number of found card +* +* Returns: +* NULL - failed +* Otherwise - success +* +* Side effects: +* +* +* Call context: +* process thread +* +----------------------------------------------------------------*/ +static void *prism2sta_probe_pci(struct pci_dev *pdev, void *dev, + unsigned char *mem, int irq, int chip_idx, int fnd_cnt) +{ + wlandevice_t *wlandev; + prism2sta_priv_t *priv; + + WLAN_LOG_INFO2("A Prism2 PCI device found, " + "mem:0x%lx, irq:%d\n", (long)mem, irq); + + /* Create the network device object. */ + wlandev = kmalloc(sizeof(wlandevice_t), GFP_KERNEL); + if ( wlandev == NULL ) { + return NULL; + } + memset(wlandev, 0, sizeof(wlandevice_t)); + + /* Make up a device private data structure. */ + wlandev->priv = kmalloc(sizeof(prism2sta_priv_t), GFP_KERNEL); + if ( wlandev->priv == NULL ) { + kfree_s(wlandev, sizeof(wlandevice_t)); + return NULL; + } + memset(wlandev->priv, 0, sizeof(prism2sta_priv_t)); + + /* Make up a hw data structure. */ + priv = (prism2sta_priv_t*)wlandev->priv; + priv->hw = kmalloc(sizeof(hfa384x_t), GFP_KERNEL); + if ( priv->hw == NULL ) { + kfree_s(wlandev->priv, sizeof(prism2sta_priv_t)); + kfree_s(wlandev, sizeof(wlandevice_t)); + return NULL; + } + memset(priv->hw, 0, sizeof(hfa384x_t)); + + /* Set our entries in the wlandev */ + wlandev->open = &prism2sta_open; + wlandev->close = &prism2sta_close; + wlandev->reset = &prism2sta_reset; + wlandev->txframe = &prism2sta_txframe; + wlandev->mlmerequest = &prism2sta_mlmerequest; + + /* Set up the remaining entries in the wlan common way */ + wlandev->name = ((prism2sta_priv_t*)wlandev->priv)->node.dev_name; + if ( wlan_setup(wlandev) != 0 ) { + kfree_s(priv->hw, sizeof(hfa384x_t)); + kfree_s(wlandev->priv, sizeof(prism2sta_priv_t)); + kfree_s(wlandev, sizeof(wlandevice_t)); + WLAN_LOG_ERROR0("wlan_setup() failed!\n"); + return NULL; + } + + wlandev->netdev->irq = irq; + wlandev->netdev->mem_start = (unsigned long)mem; + wlandev->netdev->mem_end = (unsigned long)mem + PCI_SIZE; + + request_irq(wlandev->netdev->irq, prism2sta_interrupt, SA_SHIRQ, dev_info, wlandev); + + if ( register_wlandev(wlandev) != 0 ) { + kfree_s(priv->hw, sizeof(hfa384x_t)); + kfree_s(wlandev->priv, sizeof(prism2sta_priv_t)); + kfree_s(wlandev, sizeof(wlandevice_t)); + WLAN_LOG_ERROR0("register_wlandev() failed!\n"); + return NULL; + } + +#if 0 + outw(PRISM2STA_MAGIC, HFA384x_SWSUPPORT0(wlandev->netdev->base_addr)); + reg=inw( HFA384x_SWSUPPORT0(wlandev->netdev->base_addr)); + if ( reg != PRISM2STA_MAGIC ) { + kfree_s(priv->hw, sizeof(hfa384x_t)); + kfree_s(wlandev->priv, sizeof(prism2sta_priv_t)); + kfree_s(wlandev, sizeof(wlandevice_t)); + WLAN_LOG_ERROR0("MAC register access test failed!\n"); + return NULL; + } +#endif + + hfa384x_inithw(((prism2sta_priv_t*)wlandev->priv)->hw, + wlandev->netdev->irq, 0, wlandev->netdev->mem_start); + + if ( prism2sta_initmac(wlandev) != 0) { + WLAN_LOG_ERROR0("MAC Initialization failed."); + return NULL; + } + + return( (void *)wlandev); +} + +#endif /* WLAN_PCI */ + #if (WLAN_HOSTIF == WLAN_PLX) /*---------------------------------------------------------------- -* prism2sta_probe_pci +* prism2sta_probe_plx * * PCI-SCAN probe routine. Firstly, detect whether a PC card is present * or not. If yes, register required hardware resource and allocate private @@ -3331,7 +3495,7 @@ static int prism2sta_event (event_t event, int priority, event_callback_args_t * * process thread * ----------------------------------------------------------------*/ -static void *prism2sta_probe_pci(struct pci_dev *pdev, void *dev, +static void *prism2sta_probe_plx(struct pci_dev *pdev, void *dev, unsigned char *attr_mem, int irq, int chip_idx, int fnd_cnt) { int pccard_ioaddr; @@ -3344,9 +3508,11 @@ static void *prism2sta_probe_pci(struct pci_dev *pdev, void *dev, #else pccard_ioaddr = pdev->base_address[(PCI_ADDR3 >> 4) & 7]; #endif - WLAN_LOG_INFO3("A Prism2 PCI device found, mem:0x%lx, irq:%d, io addr:0x%x\n", (long)attr_mem, irq, pccard_ioaddr-1); + WLAN_LOG_INFO3("A PLX PCI/PCMCIA interface device found, " + "mem:0x%lx, irq:%d, io addr:0x%x\n", + (long)attr_mem, irq, pccard_ioaddr-1); - /* Verify whether PC card is present */ + /* Verify whether PC card is present (this needs improvement) */ if ( attr_mem[0] != 0x01 || attr_mem[2] != 0x03 || attr_mem[4] != 0x00 || attr_mem[6] != 0x00 || attr_mem[8] != 0xFF || attr_mem[10] != 0x17 || @@ -3355,6 +3521,8 @@ static void *prism2sta_probe_pci(struct pci_dev *pdev, void *dev, return NULL; } + WLAN_LOG_INFO0("A PCMCIA WLAN adapter was found.\n"); + /* Write COR to enable PC card */ attr_mem[COR_OFFSET] = COR_VALUE; reg = attr_mem[COR_OFFSET]; @@ -3415,6 +3583,7 @@ static void *prism2sta_probe_pci(struct pci_dev *pdev, void *dev, return NULL; } +#if 0 outw(PRISM2STA_MAGIC, HFA384x_SWSUPPORT0(wlandev->netdev->base_addr)); reg=inw( HFA384x_SWSUPPORT0(wlandev->netdev->base_addr)); if ( reg != PRISM2STA_MAGIC ) { @@ -3424,8 +3593,10 @@ static void *prism2sta_probe_pci(struct pci_dev *pdev, void *dev, WLAN_LOG_ERROR0("IO port access failed!\n"); return NULL; } +#endif - hfa384x_inithw(((prism2sta_priv_t*)wlandev->priv)->hw, wlandev->netdev->irq, wlandev->netdev->base_addr); + hfa384x_inithw(((prism2sta_priv_t*)wlandev->priv)->hw, + wlandev->netdev->irq, wlandev->netdev->base_addr, 0); if ( prism2sta_initmac(wlandev) != 0) { WLAN_LOG_ERROR0("MAC Initialization failed."); @@ -3467,14 +3638,7 @@ int init_module(void) WLAN_LOG_NOTICE1("%s Loaded\n", version); WLAN_LOG_NOTICE1("dev_info is: %s\n", dev_info); -#if (WLAN_HOSTIF == WLAN_PLX) - /* This call will result in a call to prism2sta_probe_pci - * if there is a matched PCI card present (ie., which - * vendor+device id are matched) - */ - pci_drv_register(&prism2_pci_drv_id, NULL); - -#elif (WLAN_HOSTIF == WLAN_PCMCIA) +#if (WLAN_HOSTIF == WLAN_PCMCIA) CardServices(GetCardServicesInfo, &serv); if ( serv.Revision != CS_RELEASE_CODE ) { @@ -3485,6 +3649,20 @@ int init_module(void) /* This call will result in a call to prism2sta_attach */ /* and eventually prism2sta_detach */ register_pcmcia_driver( &dev_info, &prism2sta_attach, &prism2sta_detach); +#elif (WLAN_HOSTIF == WLAN_PLX) + /* This call will result in a call to prism2sta_probe_plx + * if there is a matched PCI card present (ie., which + * vendor+device id are matched) + */ + pci_drv_register(&prism2_plx_drv_id, NULL); + +#elif (WLAN_HOSTIF == WLAN_PCI) + /* This call will result in a call to prism2sta_probe_pci + * if there is a matched PCI card present (ie., which + * vendor+device id are matched) + */ + pci_drv_register(&prism2_pci_drv_id, NULL); + #endif DBFEXIT; @@ -3523,6 +3701,11 @@ void cleanup_module(void) #elif (WLAN_HOSTIF == WLAN_PLX) release_region(wlandev->netdev->base_addr, 0xff); free_irq(wlandev->netdev->irq, dev_info); + pci_drv_register(&prism2_plx_drv_id, NULL); +#elif (WLAN_HOSTIF == WLAN_PCI) + release_region(wlandev->netdev->base_addr, 0xff); + free_irq(wlandev->netdev->irq, dev_info); + pci_drv_register(&prism2_pci_drv_id, NULL); #endif /* diff --git a/src/prism2/include/prism2/hfa384x.h b/src/prism2/include/prism2/hfa384x.h index 59f6bcf..f925475 100644 --- a/src/prism2/include/prism2/hfa384x.h +++ b/src/prism2/include/prism2/hfa384x.h @@ -121,6 +121,8 @@ #define HFA384x_DLSTATE_FLASHWRITEPENDING 4 /*--- Register I/O offsets --------------------------*/ +#if ((WLAN_HOSTIF == WLAN_PCMCIA) || (WLAN_HOSTIF == WLAN_PLX)) + #define HFA384x_CMD_OFF (0x00) #define HFA384x_PARAM0_OFF (0x02) #define HFA384x_PARAM1_OFF (0x04) @@ -150,6 +152,50 @@ #define HFA384x_AUXOFFSET_OFF (0x3C) #define HFA384x_AUXDATA_OFF (0x3E) +#elif (WLAN_HOSTIF == WLAN_PCI) + +#define HFA384x_CMD_OFF (0x00) +#define HFA384x_PARAM0_OFF (0x04) +#define HFA384x_PARAM1_OFF (0x08) +#define HFA384x_PARAM2_OFF (0x0c) +#define HFA384x_STATUS_OFF (0x10) +#define HFA384x_RESP0_OFF (0x14) +#define HFA384x_RESP1_OFF (0x18) +#define HFA384x_RESP2_OFF (0x1c) +#define HFA384x_INFOFID_OFF (0x20) +#define HFA384x_RXFID_OFF (0x40) +#define HFA384x_ALLOCFID_OFF (0x44) +#define HFA384x_TXCOMPLFID_OFF (0x48) +#define HFA384x_SELECT0_OFF (0x30) +#define HFA384x_OFFSET0_OFF (0x38) +#define HFA384x_DATA0_OFF (0x6c) +#define HFA384x_SELECT1_OFF (0x34) +#define HFA384x_OFFSET1_OFF (0x3c) +#define HFA384x_DATA1_OFF (0x70) +#define HFA384x_EVSTAT_OFF (0x60) +#define HFA384x_INTEN_OFF (0x64) +#define HFA384x_EVACK_OFF (0x68) +#define HFA384x_CONTROL_OFF (0x28) +#define HFA384x_SWSUPPORT0_OFF (0x50) +#define HFA384x_SWSUPPORT1_OFF (0x54) +#define HFA384x_SWSUPPORT2_OFF (0x58) +#define HFA384x_AUXPAGE_OFF (0x74) +#define HFA384x_AUXOFFSET_OFF (0x78) +#define HFA384x_AUXDATA_OFF (0x7c) +#define HFA384x_PCICOR_OFF (0x4c) +#define HFA384x_PCIHCR_OFF (0x5c) +#define HFA384x_PCI_M0_ADDRH_OFF (0x80) +#define HFA384x_PCI_M0_ADDRL_OFF (0x84) +#define HFA384x_PCI_M0_LEN_OFF (0x88) +#define HFA384x_PCI_M0_CTL_OFF (0x8c) +#define HFA384x_PCI_STATUS_OFF (0x98) +#define HFA384x_PCI_M1_ADDRH_OFF (0xa0) +#define HFA384x_PCI_M1_ADDRL_OFF (0xa4) +#define HFA384x_PCI_M1_LEN_OFF (0xa8) +#define HFA384x_PCI_M1_CTL_OFF (0xac) + +#endif + /*--- Register Field Masks --------------------------*/ #define HFA384x_CMD_BUSY ((UINT16)BIT15) #define HFA384x_CMD_AINFO ((UINT16)(BIT14 | BIT13 | BIT12 | BIT11 | BIT10 | BIT9 | BIT8)) @@ -607,36 +653,36 @@ PD Record codes /*=============================================================*/ /*------ Macros -----------------------------------------------*/ -/*--- Register access macros ------------------------*/ +/*--- Register ID macros ------------------------*/ -#define HFA384x_CMD(base) ((UINT)(base) + HFA384x_CMD_OFF) -#define HFA384x_PARAM0(base) ((UINT)(base) + HFA384x_PARAM0_OFF) -#define HFA384x_PARAM1(base) ((UINT)(base) + HFA384x_PARAM1_OFF) -#define HFA384x_PARAM2(base) ((UINT)(base) + HFA384x_PARAM2_OFF) -#define HFA384x_STATUS(base) ((UINT)(base) + HFA384x_STATUS_OFF) -#define HFA384x_RESP0(base) ((UINT)(base) + HFA384x_RESP0_OFF) -#define HFA384x_RESP1(base) ((UINT)(base) + HFA384x_RESP1_OFF) -#define HFA384x_RESP2(base) ((UINT)(base) + HFA384x_RESP2_OFF) -#define HFA384x_INFOFID(base) ((UINT)(base) + HFA384x_INFOFID_OFF) -#define HFA384x_RXFID(base) ((UINT)(base) + HFA384x_RXFID_OFF) -#define HFA384x_ALLOCFID(base) ((UINT)(base) + HFA384x_ALLOCFID_OFF) -#define HFA384x_TXCOMPLFID(base) ((UINT)(base) + HFA384x_TXCOMPLFID_OFF) -#define HFA384x_SELECT0(base) ((UINT)(base) + HFA384x_SELECT0_OFF) -#define HFA384x_OFFSET0(base) ((UINT)(base) + HFA384x_OFFSET0_OFF) -#define HFA384x_DATA0(base) ((UINT)(base) + HFA384x_DATA0_OFF) -#define HFA384x_SELECT1(base) ((UINT)(base) + HFA384x_SELECT1_OFF) -#define HFA384x_OFFSET1(base) ((UINT)(base) + HFA384x_OFFSET1_OFF) -#define HFA384x_DATA1(base) ((UINT)(base) + HFA384x_DATA1_OFF) -#define HFA384x_EVSTAT(base) ((UINT)(base) + HFA384x_EVSTAT_OFF) -#define HFA384x_INTEN(base) ((UINT)(base) + HFA384x_INTEN_OFF) -#define HFA384x_EVACK(base) ((UINT)(base) + HFA384x_EVACK_OFF) -#define HFA384x_CONTROL(base) ((UINT)(base) + HFA384x_CONTROL_OFF) -#define HFA384x_SWSUPPORT0(base) ((UINT)(base) + HFA384x_SWSUPPORT0_OFF) -#define HFA384x_SWSUPPORT1(base) ((UINT)(base) + HFA384x_SWSUPPORT1_OFF) -#define HFA384x_SWSUPPORT2(base) ((UINT)(base) + HFA384x_SWSUPPORT2_OFF) -#define HFA384x_AUXPAGE(base) ((UINT)(base) + HFA384x_AUXPAGE_OFF) -#define HFA384x_AUXOFFSET(base) ((UINT)(base) + HFA384x_AUXOFFSET_OFF) -#define HFA384x_AUXDATA(base) ((UINT)(base) + HFA384x_AUXDATA_OFF) +#define HFA384x_CMD HFA384x_CMD_OFF +#define HFA384x_PARAM0 HFA384x_PARAM0_OFF +#define HFA384x_PARAM1 HFA384x_PARAM1_OFF +#define HFA384x_PARAM2 HFA384x_PARAM2_OFF +#define HFA384x_STATUS HFA384x_STATUS_OFF +#define HFA384x_RESP0 HFA384x_RESP0_OFF +#define HFA384x_RESP1 HFA384x_RESP1_OFF +#define HFA384x_RESP2 HFA384x_RESP2_OFF +#define HFA384x_INFOFID HFA384x_INFOFID_OFF +#define HFA384x_RXFID HFA384x_RXFID_OFF +#define HFA384x_ALLOCFID HFA384x_ALLOCFID_OFF +#define HFA384x_TXCOMPLFID HFA384x_TXCOMPLFID_OFF +#define HFA384x_SELECT0 HFA384x_SELECT0_OFF +#define HFA384x_OFFSET0 HFA384x_OFFSET0_OFF +#define HFA384x_DATA0 HFA384x_DATA0_OFF +#define HFA384x_SELECT1 HFA384x_SELECT1_OFF +#define HFA384x_OFFSET1 HFA384x_OFFSET1_OFF +#define HFA384x_DATA1 HFA384x_DATA1_OFF +#define HFA384x_EVSTAT HFA384x_EVSTAT_OFF +#define HFA384x_INTEN HFA384x_INTEN_OFF +#define HFA384x_EVACK HFA384x_EVACK_OFF +#define HFA384x_CONTROL HFA384x_CONTROL_OFF +#define HFA384x_SWSUPPORT0 HFA384x_SWSUPPORT0_OFF +#define HFA384x_SWSUPPORT1 HFA384x_SWSUPPORT1_OFF +#define HFA384x_SWSUPPORT2 HFA384x_SWSUPPORT2_OFF +#define HFA384x_AUXPAGE HFA384x_AUXPAGE_OFF +#define HFA384x_AUXOFFSET HFA384x_AUXOFFSET_OFF +#define HFA384x_AUXDATA HFA384x_AUXDATA_OFF /*--- Register Test/Get/Set Field macros ------------------------*/ @@ -1908,6 +1954,7 @@ typedef struct hfa384x { /* Resource config */ UINT32 iobase; /* base address */ + UINT32 membase; /* base address */ UINT32 irq; /* irq number */ /* Controller state */ @@ -1941,7 +1988,7 @@ typedef struct hfa384x /*=============================================================*/ /*--- Function Declarations -----------------------------------*/ /*=============================================================*/ -void hfa384x_inithw( hfa384x_t *hw, UINT irq, UINT iobase); +void hfa384x_inithw( hfa384x_t *hw, UINT irq, UINT iobase, UINT membase); int hfa384x_cmd_initialize(hfa384x_t *hw); int hfa384x_cmd_enable(hfa384x_t *hw, UINT16 macport); @@ -1996,6 +2043,10 @@ int hfa384x_docmd_wait( hfa384x_t *hw, UINT16 cmd, UINT16 parm0, UINT16 parm1, U int hfa384x_dl_docmd_wait( hfa384x_t *hw, UINT16 cmd, UINT16 parm0, UINT16 parm1, UINT16 parm2); static inline int hfa384x_isgood_pdrcode(UINT16 pdrcode); +static inline UINT16 hfa384x_getreg(hfa384x_t *hw, UINT reg); +static inline void hfa384x_setreg(hfa384x_t *hw, UINT16 val, UINT reg); +static inline UINT16 hfa384x_getreg_noswap(hfa384x_t *hw, UINT reg); +static inline void hfa384x_setreg_noswap(hfa384x_t *hw, UINT16 val, UINT reg); /*=============================================================*/ /*--- Inline Function Definitions (if supported) --------------*/ @@ -2048,4 +2099,105 @@ static inline int hfa384x_isgood_pdrcode(UINT16 pdrcode) return 0; /* avoid compiler warnings */ } +#ifdef __KERNEL__ +/*---------------------------------------------------------------- +* hfa384x_getreg +* +* Retrieve the value of one of the MAC registers. Done here +* because different PRISM2 MAC parts use different buses and such. +* NOTE: This function returns the value in HOST ORDER!!!!!! +* +* Arguments: +* hw MAC part structure +* reg Register identifier (offset for I/O based i/f) +* +* Returns: +* Value from the register in HOST ORDER!!!! +----------------------------------------------------------------*/ +static inline UINT16 hfa384x_getreg(hfa384x_t *hw, UINT reg) +{ +#if ((WLAN_HOSTIF == WLAN_PCMCIA) || (WLAN_HOSTIF == WLAN_PLX)) + return wlan_inw_le16_to_cpu(hw->iobase+reg); +#elif (WLAN_HOSTIF == WLAN_PCI) + return __le16_to_cpu(*((UINT16*)(hw->membase + reg))); +#endif +} + +/*---------------------------------------------------------------- +* hfa384x_setreg +* +* Set the value of one of the MAC registers. Done here +* because different PRISM2 MAC parts use different buses and such. +* NOTE: This function assumes the value is in HOST ORDER!!!!!! +* +* Arguments: +* hw MAC part structure +* val Value, in HOST ORDER!!, to put in the register +* reg Register identifier (offset for I/O based i/f) +* +* Returns: +* Nothing +----------------------------------------------------------------*/ +static inline void hfa384x_setreg(hfa384x_t *hw, UINT16 val, UINT reg) +{ +#if ((WLAN_HOSTIF == WLAN_PCMCIA) || (WLAN_HOSTIF == WLAN_PLX)) + wlan_outw_cpu_to_le16( val, hw->iobase + reg); + return; +#elif (WLAN_HOSTIF == WLAN_PCI) + (*((UINT16*)(hw->membase + reg))) = __cpu_to_le16(val); + return; +#endif +} + + +/*---------------------------------------------------------------- +* hfa384x_getreg_noswap +* +* Retrieve the value of one of the MAC registers. Done here +* because different PRISM2 MAC parts use different buses and such. +* +* Arguments: +* hw MAC part structure +* reg Register identifier (offset for I/O based i/f) +* +* Returns: +* Value from the register. +----------------------------------------------------------------*/ +static inline UINT16 hfa384x_getreg_noswap(hfa384x_t *hw, UINT reg) +{ +#if ((WLAN_HOSTIF == WLAN_PCMCIA) || (WLAN_HOSTIF == WLAN_PLX)) + return wlan_inw(hw->iobase+reg); +#elif (WLAN_HOSTIF == WLAN_PCI) + return *((UINT16*)(hw->membase + reg)); +#endif +} + + +/*---------------------------------------------------------------- +* hfa384x_setreg +* +* Set the value of one of the MAC registers. Done here +* because different PRISM2 MAC parts use different buses and such. +* +* Arguments: +* hw MAC part structure +* val Value to put in the register +* reg Register identifier (offset for I/O based i/f) +* +* Returns: +* Nothing +----------------------------------------------------------------*/ +static inline void hfa384x_setreg_noswap(hfa384x_t *hw, UINT16 val, UINT reg) +{ +#if ((WLAN_HOSTIF == WLAN_PCMCIA) || (WLAN_HOSTIF == WLAN_PLX)) + wlan_outw( val, hw->iobase + reg); + return; +#elif (WLAN_HOSTIF == WLAN_PCI) + (*((UINT16*)(hw->membase + reg))) = val; + return; +#endif +} + +#endif /* __KERNEL__ */ + #endif /* _HFA384x_H */