123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481 |
- /*
- * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- *
- * File: mac.c
- *
- * Purpose: MAC routines
- *
- * Author: Tevin Chen
- *
- * Date: May 21, 1996
- *
- * Functions:
- *
- * Revision History:
- */
- #include "tmacro.h"
- #include "tether.h"
- #include "desc.h"
- #include "mac.h"
- #include "80211hdr.h"
- #include "rndis.h"
- #include "control.h"
- /*--------------------- Static Definitions -------------------------*/
- //static int msglevel =MSG_LEVEL_DEBUG;
- static int msglevel =MSG_LEVEL_INFO;
- /*--------------------- Static Classes ----------------------------*/
- /*--------------------- Static Variables --------------------------*/
- /*--------------------- Static Functions --------------------------*/
- /*--------------------- Export Variables --------------------------*/
- /*--------------------- Export Functions --------------------------*/
- /*
- * Description:
- * Set this hash index into multicast address register bit
- *
- * Parameters:
- * In:
- * byHashIdx - Hash index to set
- * Out:
- * none
- *
- * Return Value: none
- *
- */
- void MACvSetMultiAddrByHash (PSDevice pDevice, BYTE byHashIdx)
- {
- unsigned int uByteIdx;
- BYTE byBitMask;
- BYTE pbyData[2];
- // calculate byte position
- uByteIdx = byHashIdx / 8;
- // calculate bit position
- byBitMask = 1;
- byBitMask <<= (byHashIdx % 8);
- // turn on the bit
- pbyData[0] = byBitMask;
- pbyData[1] = byBitMask;
- CONTROLnsRequestOut(pDevice,
- MESSAGE_TYPE_WRITE_MASK,
- (WORD) (MAC_REG_MAR0 + uByteIdx),
- MESSAGE_REQUEST_MACREG,
- 2,
- pbyData);
- }
- /*
- * Description:
- * Write MAC Multicast Address Mask
- *
- * Parameters:
- * In:
- * uByteidx - Index of Mask
- * byData - Mask Value to write
- * Out:
- * none
- *
- * Return Value: none
- *
- */
- void MACvWriteMultiAddr(PSDevice pDevice, unsigned int uByteIdx, BYTE byData)
- {
- BYTE byData1;
- byData1 = byData;
- CONTROLnsRequestOut(pDevice,
- MESSAGE_TYPE_WRITE,
- (WORD) (MAC_REG_MAR0 + uByteIdx),
- MESSAGE_REQUEST_MACREG,
- 1,
- &byData1);
- }
- /*
- * Description:
- * Shut Down MAC
- *
- * Parameters:
- * In:
- * Out:
- * none
- *
- * Return Value: TRUE if success; otherwise FALSE
- *
- */
- BOOL MACbShutdown (PSDevice pDevice)
- {
- CONTROLnsRequestOutAsyn(pDevice,
- MESSAGE_TYPE_MACSHUTDOWN,
- 0,
- 0,
- 0,
- NULL
- );
- return TRUE;
- }
- void MACvSetBBType(PSDevice pDevice,BYTE byType)
- {
- BYTE pbyData[2];
- pbyData[0] = byType;
- pbyData[1] = EnCFG_BBType_MASK;
- CONTROLnsRequestOut(pDevice,
- MESSAGE_TYPE_WRITE_MASK,
- MAC_REG_ENCFG0,
- MESSAGE_REQUEST_MACREG,
- 2,
- pbyData
- );
- }
- void MACvSetMISCFifo (PSDevice pDevice, WORD wOffset, DWORD dwData)
- {
- BYTE pbyData[4];
- if (wOffset > 273)
- return;
- pbyData[0] = (BYTE)dwData;
- pbyData[1] = (BYTE)(dwData>>8);
- pbyData[2] = (BYTE)(dwData>>16);
- pbyData[3] = (BYTE)(dwData>>24);
- CONTROLnsRequestOut(pDevice,
- MESSAGE_TYPE_WRITE_MISCFF,
- wOffset,
- 0,
- 4,
- pbyData
- );
- }
- /*
- * Description:
- * Disable the Key Entry by MISCFIFO
- *
- * Parameters:
- * In:
- * dwIoBase - Base Address for MAC
- *
- * Out:
- * none
- *
- * Return Value: none
- *
- */
- void MACvDisableKeyEntry(PSDevice pDevice, unsigned int uEntryIdx)
- {
- WORD wOffset;
- BYTE byData;
- byData = (BYTE) uEntryIdx;
- wOffset = MISCFIFO_KEYETRY0;
- wOffset += (uEntryIdx * MISCFIFO_KEYENTRYSIZE);
- //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset);
- //VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, 0);
- //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
- //issue write misc fifo command to device
- CONTROLnsRequestOut(pDevice,
- MESSAGE_TYPE_CLRKEYENTRY,
- 0,
- 0,
- 1,
- &byData
- );
- }
- /*
- * Description:
- * Set the Key by MISCFIFO
- *
- * Parameters:
- * In:
- * dwIoBase - Base Address for MAC
- *
- * Out:
- * none
- *
- * Return Value: none
- *
- */
- void MACvSetKeyEntry(PSDevice pDevice, WORD wKeyCtl,
- unsigned int uEntryIdx, unsigned int uKeyIdx,
- PBYTE pbyAddr, PDWORD pdwKey)
- {
- PBYTE pbyKey;
- WORD wOffset;
- DWORD dwData1,dwData2;
- int ii;
- BYTE pbyData[24];
- if ( pDevice->byLocalID <= MAC_REVISION_A1 ) {
- if ( pDevice->sMgmtObj.byCSSPK == KEY_CTL_CCMP )
- return;
- }
- wOffset = MISCFIFO_KEYETRY0;
- wOffset += (uEntryIdx * MISCFIFO_KEYENTRYSIZE);
- dwData1 = 0;
- dwData1 |= wKeyCtl;
- dwData1 <<= 16;
- dwData1 |= MAKEWORD(*(pbyAddr+4), *(pbyAddr+5));
- DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"1. wOffset: %d, Data: %lX, KeyCtl:%X\n", wOffset, dwData1, wKeyCtl);
- //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset);
- //VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, dwData);
- //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
- //wOffset++;
- dwData2 = 0;
- dwData2 |= *(pbyAddr+3);
- dwData2 <<= 8;
- dwData2 |= *(pbyAddr+2);
- dwData2 <<= 8;
- dwData2 |= *(pbyAddr+1);
- dwData2 <<= 8;
- dwData2 |= *(pbyAddr+0);
- DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"2. wOffset: %d, Data: %lX\n", wOffset, dwData2);
- //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset);
- //VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, dwData);
- //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
- //wOffset++;
- //wOffset += (uKeyIdx * 4);
- /* for (ii=0;ii<4;ii++) {
- // alway push 128 bits
- DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"3.(%d) wOffset: %d, Data: %lX\n", ii, wOffset+ii, *pdwKey);
- VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset+ii);
- VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, *pdwKey++);
- VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
- }
- */
- pbyKey = (PBYTE)pdwKey;
- pbyData[0] = (BYTE)dwData1;
- pbyData[1] = (BYTE)(dwData1>>8);
- pbyData[2] = (BYTE)(dwData1>>16);
- pbyData[3] = (BYTE)(dwData1>>24);
- pbyData[4] = (BYTE)dwData2;
- pbyData[5] = (BYTE)(dwData2>>8);
- pbyData[6] = (BYTE)(dwData2>>16);
- pbyData[7] = (BYTE)(dwData2>>24);
- for (ii = 8; ii < 24; ii++)
- pbyData[ii] = *pbyKey++;
- CONTROLnsRequestOut(pDevice,
- MESSAGE_TYPE_SETKEY,
- wOffset,
- (WORD)uKeyIdx,
- 24,
- pbyData
- );
- }
- void MACvRegBitsOff(PSDevice pDevice, BYTE byRegOfs, BYTE byBits)
- {
- BYTE pbyData[2];
- pbyData[0] = 0;
- pbyData[1] = byBits;
- CONTROLnsRequestOut(pDevice,
- MESSAGE_TYPE_WRITE_MASK,
- byRegOfs,
- MESSAGE_REQUEST_MACREG,
- 2,
- pbyData
- );
- }
- void MACvRegBitsOn(PSDevice pDevice, BYTE byRegOfs, BYTE byBits)
- {
- BYTE pbyData[2];
- pbyData[0] = byBits;
- pbyData[1] = byBits;
- CONTROLnsRequestOut(pDevice,
- MESSAGE_TYPE_WRITE_MASK,
- byRegOfs,
- MESSAGE_REQUEST_MACREG,
- 2,
- pbyData
- );
- }
- void MACvWriteWord(PSDevice pDevice, BYTE byRegOfs, WORD wData)
- {
- BYTE pbyData[2];
- pbyData[0] = (BYTE)(wData & 0xff);
- pbyData[1] = (BYTE)(wData >> 8);
- CONTROLnsRequestOut(pDevice,
- MESSAGE_TYPE_WRITE,
- byRegOfs,
- MESSAGE_REQUEST_MACREG,
- 2,
- pbyData
- );
- }
- void MACvWriteBSSIDAddress(PSDevice pDevice, PBYTE pbyEtherAddr)
- {
- BYTE pbyData[6];
- pbyData[0] = *((PBYTE)pbyEtherAddr);
- pbyData[1] = *((PBYTE)pbyEtherAddr+1);
- pbyData[2] = *((PBYTE)pbyEtherAddr+2);
- pbyData[3] = *((PBYTE)pbyEtherAddr+3);
- pbyData[4] = *((PBYTE)pbyEtherAddr+4);
- pbyData[5] = *((PBYTE)pbyEtherAddr+5);
- CONTROLnsRequestOut(pDevice,
- MESSAGE_TYPE_WRITE,
- MAC_REG_BSSID0,
- MESSAGE_REQUEST_MACREG,
- 6,
- pbyData
- );
- }
- void MACvEnableProtectMD(PSDevice pDevice)
- {
- BYTE pbyData[2];
- pbyData[0] = EnCFG_ProtectMd;
- pbyData[1] = EnCFG_ProtectMd;
- CONTROLnsRequestOut(pDevice,
- MESSAGE_TYPE_WRITE_MASK,
- MAC_REG_ENCFG0,
- MESSAGE_REQUEST_MACREG,
- 2,
- pbyData
- );
- }
- void MACvDisableProtectMD(PSDevice pDevice)
- {
- BYTE pbyData[2];
- pbyData[0] = 0;
- pbyData[1] = EnCFG_ProtectMd;
- CONTROLnsRequestOut(pDevice,
- MESSAGE_TYPE_WRITE_MASK,
- MAC_REG_ENCFG0,
- MESSAGE_REQUEST_MACREG,
- 2,
- pbyData
- );
- }
- void MACvEnableBarkerPreambleMd(PSDevice pDevice)
- {
- BYTE pbyData[2];
- pbyData[0] = EnCFG_BarkerPream;
- pbyData[1] = EnCFG_BarkerPream;
- CONTROLnsRequestOut(pDevice,
- MESSAGE_TYPE_WRITE_MASK,
- MAC_REG_ENCFG2,
- MESSAGE_REQUEST_MACREG,
- 2,
- pbyData
- );
- }
- void MACvDisableBarkerPreambleMd(PSDevice pDevice)
- {
- BYTE pbyData[2];
- pbyData[0] = 0;
- pbyData[1] = EnCFG_BarkerPream;
- CONTROLnsRequestOut(pDevice,
- MESSAGE_TYPE_WRITE_MASK,
- MAC_REG_ENCFG2,
- MESSAGE_REQUEST_MACREG,
- 2,
- pbyData
- );
- }
- void MACvWriteBeaconInterval(PSDevice pDevice, WORD wInterval)
- {
- BYTE pbyData[2];
- pbyData[0] = (BYTE) (wInterval & 0xff);
- pbyData[1] = (BYTE) (wInterval >> 8);
- CONTROLnsRequestOut(pDevice,
- MESSAGE_TYPE_WRITE,
- MAC_REG_BI,
- MESSAGE_REQUEST_MACREG,
- 2,
- pbyData
- );
- }
|