📄 syswlanendmips.c
字号:
/* sysWlanEndMips.c - system configuration module for Wlan END device */ /* Copyright 2001-2003 Wind River Systems, Inc. */ /*modification history--------------------01z,23may03,ss modified sysCfgParamGet to not use strlen for WEP key sizes01y,13may03,dxb Changed sysPrismEndLoad to sysWlanEndPrismLoad.01x,13may03,dxb Added comments for intConnect routines.01w,05may03,rb Removed warnings w/ diab01v,28apr03,ss added STA version info01u,26feb03,ss Fixed some diab warnings01t,30apr02,ss removed references to sysPcmcia.h01s,24apr02,dxb Updated with INCLUDE_WLAN_END macro.01r,20apr02,ss updated to handle mini PCI cards01q,21mar02,dxb Removed sysWlanBcopy().01p,27feb02,rb Fixed bug with WLAN_WEP_ENABLE01o,20feb02,rb Added international support01n,14feb02,rb Fixed endianness problem in sysWlanCfgParameterGet01m,14feb02,rb Added proper definitions for sysIntDisconnect, etc01l,13feb02,dxb Added sysPcmcia.h reference.01k,13feb02,dxb Removed reference to sysPcmcia.h.01j,11feb02,dxb Updated for version 1.01.01i,04feb02,eja Added sysWlanCfgParamGet () to get Bsp defined config params.01h,23nov01,eja Got rid of test statements.01g,23nov01,eja Added support for cisco aironet card.01f,22nov01,rb Fixed undefined ref. to sysWlanIntDisable01e,15nov01,eja Got rid of bsp routine table.01d,14nov01,eja Changed WLAN to PRISM.01c,13nov01,eja Added fix for SPR# 71650.01b,08nov01,rb Changed location of wlanEnd.h01a,06nov01,rb Implemented API change wlanLoad() -> intPrismLoad()*//* INCLUDES */#include <vxWorks.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <end.h>#include <intLib.h>#include <iv.h>#include <sysLib.h>#include "config.h"#include "configWlan.h"#include <drv/pci/pciIntLib.h> #include <drv/pci/pciConfigLib.h> #include <wrn/wlan/wlanEnd.h>#ifdef INCLUDE_WLAN_END/*************************************************************************** * DEFINES **************************************************************************/char * wlanStaVersion = WLAN_STA_VERSION;/* SUPPORTED BRIDGES and PCI cards: updates or new cards should be defined here and in sysWlanBrds [] (further down in this file)*/#define LINKSYS_BRIDGE_VENDORID (0x16AB)#define LINKSYS_BRIDGE_DEVICEID (0x1102)#define LINKSYS_PCI_VENDORID (0x1260) /* LinkSys WMP11 Mini-PCI */#define LINKSYS_PCI_DEVICEID (0x3873) /* LinkSys WMP11 Mini-PCI */#define SMC_BRIDGE_VENDORID (0x1638)#define SMC_BRIDGE_DEVICEID (0x1100)#define CISCO_BRIDGE_VENDORID (0x14B9)#define CISCO_BRIDGE_DEVICEID (0x4800)/* the two supported chipsets (unique driver for each) */#define CARD_TYPE_PRISM 0 /* Intersil Prism based cards */#define CARD_TYPE_CISCO 1 /* Cisco Aironet cards *//* max num of PCI cards */#define MAX_DEVICES (8)#define NON_VALID (-1)#define COR_OFFSET (0x3E0) /* for PCMCIA */#define COR_RESET_VALUE (0x41)#define MAX_BARS (6) /* max number of base address regs */#define MEM_SPACE_REG (0) /* bit 0 BAR value for memory space */#define IO_SPACE_REG (1) /* bit 0 BAR value for io space */#define EXT_INTERRUPT_BASE 0 #define PCI_DEV_MMU_MSK (~(VM_PAGE_SIZE - 1)) /* Mask MMU page */#define PCI_DEV_ADRS_SIZE VM_PAGE_SIZE /* one page *//**************************************************************************** * Local variables ***************************************************************************//* a card is uniquely identified by this struct */typedef struct { UINT32 vendorId; /* Vendor ID */ UINT32 deviceId; /* Device ID */ UINT32 phyCardType; /* WLAN_PCMCIA_CARD or WLAN_PCI_CARD, as defined in wlanEnd.h */ } WLAN_BOARD_ID;/* the PCI resource info for a device */typedef struct { UINT32 iobaseCsr; /* IO Base Address */ UINT32 membaseCsr; /* MEM Base Address */ UINT32 irqLevel; /* Interrupt Request Level */ UINT32 irqVector; /* Interrupt Request vector */ UINT32 pciBus; /* PCI Bus number */ UINT32 pciDevice; /* PCI Device number */ UINT32 pciFunc; /* PCI Function number */ UINT32 type; /* type of card(CARD_TYPE_CISCO or CARD_TYPE_PRISM)*/ UINT8 phyType; /* the physical type of card (WLAN_PCI or WLAN_PCMCIA) */ UINT32 used; /* Flag to check if resource is taken */ } WLAN_PCI_RSRC;/* All Supported bridges/cards */LOCAL WLAN_BOARD_ID sysWlanBrds [] = { {LINKSYS_BRIDGE_VENDORID,LINKSYS_BRIDGE_DEVICEID,WLAN_PCMCIA_CARD}, {LINKSYS_PCI_VENDORID, LINKSYS_PCI_DEVICEID, WLAN_PCI_CARD}, {CISCO_BRIDGE_VENDORID, CISCO_BRIDGE_DEVICEID, WLAN_PCI_CARD}, {SMC_BRIDGE_VENDORID, SMC_BRIDGE_DEVICEID, WLAN_PCMCIA_CARD} };LOCAL WLAN_PCI_RSRC bridge[MAX_DEVICES]; LOCAL UINT16 numBridges = 0; /* num of pci cards found */ /*************************************************************************** * Function declarations **************************************************************************/LOCAL STATUS sysWlanPciBarGet (WLAN_PCI_RSRC *);STATUS sysWlanPcmciaCardEnable (UINT16);INT32 sysWlanCardRsrcGet (INT32);STATUS sysWlanPciInit (void);STATUS sysWlanCfgParamGet (UINT32, INT32);void sysWlanIntConnect (INT32, INT32, INT32, STATUS *);void sysWlanIntDisconnect (INT32, INT32, INT32, STATUS *);void sysWlanIntEnable (INT32, STATUS *);void sysWlanIntDisable (INT32, STATUS *);STATUS sysWlanPcmciaCfgShow (void);END_OBJ * sysWlanEndPrismLoad (char * initString, void * pBSP);END_OBJ * sysWlanEndAironetLoad (char * initString, void * pBSP);UINT8 sysWlanIOInByte (UINT32);void sysWlanIOOutByte (UINT32, UINT8);UINT16 sysWlanIOInWord (UINT32);void sysWlanIOOutWord (UINT32, UINT16);UINT32 sysWlanIOInLong (UINT32);void sysWlanIOOutLong (UINT32, UINT32);UINT8 sysWlanMemInByte (UINT32);void sysWlanMemOutByte (UINT32, UINT8);UINT16 sysWlanMemInWord (UINT32);void sysWlanMemOutWord (UINT32, UINT16);UINT32 sysWlanMemInLong (UINT32);void sysWlanMemOutLong (UINT32, UINT32);UINT16 sysWlanMemEndianInWord (UINT32);void sysWlanMemEndianOutWord (UINT32, UINT16);UINT16 sysWlanIOEndianInWord (UINT32);void sysWlanIOEndianOutWord (UINT32, UINT16);/*************************************************************************** * External Function declarations **************************************************************************/IMPORT STATUS sysMmuMapAdd (void *, UINT, UINT, UINT);#ifdef INCLUDE_PRISM_END IMPORT END_OBJ * intPrismLoad (char *, void *); LOCAL void * pWlanLoad = (void *) intPrismLoad;#endif#ifdef INCLUDE_AIRONET_END IMPORT END_OBJ * cisAironetEndLoad (char *, void *); LOCAL void * pAironetLoad = (void *) cisAironetEndLoad;#endif#ifdef INCLUDE_PRISM_END/****************************************************************************** sysWlanEndPrismLoad - load an instance of the intPrism END driver** This routine loads the wlan intPrism driver with the parameters specified * by the resource table for the device, and some default values.** The END device load string formed by this routine is in the following* following format. <baseAddr>:<vecnum>:<intLvl>** .IP <baseAddr>* Device register base address* .IP <vecNum>* Interrupt vector number* .IP <intLvl>* Interrupt level** RETURNS: pointer to END object or ERROR.* SEE ALSO: intPrismEndLoad()*/END_OBJ * sysWlanEndPrismLoad ( char * initString, /* Initial parameters to initialize device with */ void * pBSP ) { /* * The End driver END_LOAD_STRING should be: * "<baseAddr>:<intVec>:<intLevel>:<attachmentType>:<nRxFrames>" * Note that the unit number is prepended by mux. */ char paramStr [END_INIT_STR_MAX]; /* from end.h */ UINT32 baseAddr = 0; /* base addr for access to board reg */ UINT32 iVec = 0; /* interrupt vector */ UINT32 iLevel = 0; /* interrupt level */ END_OBJ * pEnd = NULL; char * cp = NULL; char * token = NULL; UINT16 unitNum = 0; INT32 cardRsrc = -1; /* check if the END load routine func ptr. is set */ if (pWlanLoad == NULL) { return (NULL); } if (strlen (initString) == 0) { /* * muxDevLoad() calls us twice. If the string is * zero length, then this is the first time through * this routine, so we just return. */ pEnd = (END_OBJ *)((FUNCPTR) pWlanLoad) (initString, pBSP); } else { /* * On the second pass though here, we actually create * the initialization parameter string on the fly. * Note that we will be handed our unit number on the * second pass through and we need to preserve that information. * So we use the unit number handed from the input string. */ /* get the unit num from init string */ cp = strcpy (paramStr, initString); token = strtok(cp, ":"); if (token == NULL) { printf("sysWlanEndPrismLoad: Error determining unit num\n"); return NULL; } unitNum = atoi(token); /* Get a resource for the card */ if ( (cardRsrc = sysWlanCardRsrcGet(CARD_TYPE_PRISM)) == -1) { printf ("sysWlanEndPrismLoad: Error getting card resource\n"); return (NULL); } /* set the pBSP variable to hold the card type and type of access memory access */ if (bridge[cardRsrc].phyType == WLAN_PCMCIA_CARD) { /* enable the pccard I/O space */ if (sysWlanPcmciaCardEnable(cardRsrc) == ERROR) { printf ("sysWlanEndPrismLoad: Error enabling card I/O space\n"); return (NULL); } baseAddr = bridge[cardRsrc].iobaseCsr; pBSP = (void *) (WLAN_IO_ACCESS | WLAN_PCMCIA_CARD); } else { baseAddr = bridge[cardRsrc].membaseCsr; pBSP = (void *) (WLAN_MEM_ACCESS | WLAN_PCI_CARD); } cp = strcpy (paramStr, initString); /* cp points to paramStr */ /* Now, we advance cp, by finding the end the string */ cp += strlen (paramStr); /* finish off the initialization parameter string */ iVec = bridge[cardRsrc].irqVector; iLevel = bridge[cardRsrc].irqLevel; sprintf (cp, "%#x:%#x:%#x:%d:%d", baseAddr, iVec, iLevel, 0, 0); if ( (pEnd = (END_OBJ *)((FUNCPTR) pWlanLoad) (paramStr, pBSP)) == (END_OBJ *) ERROR ) { printf ("sysWlanEndPrismLoad: Error - device load routine failed.\n"); } } return (pEnd); }#endif#ifdef INCLUDE_AIRONET_END/****************************************************************************** sysWlanEndAironetLoad - load an instance of the cisAir END driver** This routine loads the wlan cisAir driver with the parameters * specified by the resource table for the device, and some default values.** The END device load string formed by this routine is in the following* following format.* <baseAddr>:<vecnum>:<intLvl>** .IP <baseAddr>* Device register base address* .IP <vecNum>* Interrupt vector number.* .IP <intLvl>* Interrupt level.** This routine only loads and initializes instance zero of the device.* If the user wishes to use more than one cisAir device, this routine* should be changed.** RETURNS: pointer to END object or ERROR.** SEE ALSO: anetEndLoad()*/END_OBJ * sysWlanEndAironetLoad ( char * initString, /* Initial parameters to initialize device with */ void * pBSP /* index into load routine table */ ) { /* * The End driver END_LOAD_STRING should be: * "<baseAddr>:<intVec>:<intLevel>:<attachmentType>:<nRxFrames>" * Note that the unit number is prepended by mux. */ char paramStr [END_INIT_STR_MAX]; /* from end.h */ UINT32 baseAddr = 0; /* base addr for access to board registers */ UINT32 iVec = 0; /* interrupt vector */ UINT32 iLevel = 0; /* interrupt level */ END_OBJ * pEnd = NULL; char * cp = NULL; char * token = NULL; UINT16 unitNum = 0; /* unit num from init string */ INT32 cardRsrc = -1; if (pAironetLoad == NULL) { return (NULL); } if (strlen (initString) == 0) { /* * muxDevLoad() calls us twice. If the string is * zero length, then this is the first time through * this routine, so we just return. */ pEnd = (END_OBJ *)((FUNCPTR) pAironetLoad) (initString, pBSP); } else { /* * On the second pass though here, we actually create * the initialization parameter string on the fly. * Note that we will be handed our unit number on the * second pass through and we need to preserve that information. * So we use the unit number handed from the input string. */ /* get the unit num from init string */ cp = strcpy (paramStr, initString); token = strtok(cp, ":"); if (token == NULL) { printf("sysWlanEndAironetLoad: Error determining unit num\n"); return NULL; } unitNum = atoi(token); /* Get a resource for the card */ if ( (cardRsrc = sysWlanCardRsrcGet(CARD_TYPE_CISCO)) == -1) { printf ("sysWlanEndAironetLoad: Error getting card resource\n"); return (NULL); } if (bridge[cardRsrc].phyType == WLAN_PCMCIA_CARD) { /* enable the pccard I/O space */ if (sysWlanPcmciaCardEnable(cardRsrc) == ERROR) { printf ("sysWlanEndAironetLoad: Error enabling card I/O space\n"); return (NULL); } } /* save the base address and set the pBSP variable to hold the card type and type of memory access */ baseAddr = bridge[cardRsrc].iobaseCsr; pBSP = (void *) (WLAN_IO_ACCESS | WLAN_PCMCIA_CARD); cp = strcpy (paramStr, initString); /* cp points to paramStr */ /* Now, we advance cp, by finding the end the string */ cp += strlen (paramStr);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -