📄 mac.c
字号:
/* * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. * All rights reserved. * * This software is copyrighted by and is the sole property of * VIA Networking Technologies, Inc. This software may only be used * in accordance with the corresponding license agreement. Any unauthorized * use, duplication, transmission, distribution, or disclosure of this * software is expressly forbidden. * * This software is provided by VIA Networking Technologies, Inc. "as is" * and any express or implied warranties, including, but not limited to, the * implied warranties of merchantability and fitness for a particular purpose * are disclaimed. In no event shall VIA Networking Technologies, Inc. * be liable for any direct, indirect, incidental, special, exemplary, or * consequential damages. * * * File: mac.c * * Purpose: MAC routines * * Author: Tevin Chen * * Date: May 21, 1996 * * Functions: * * Revision History: */#if !defined(__TMACRO_H__)#include "tmacro.h"#endif#if !defined(__TBIT_H__)#include "tbit.h"#endif#if !defined(__TETHER_H__)#include "tether.h"#endif#if !defined(__DESC_H__)#include "desc.h"#endif#if !defined(__MAC_H__)#include "mac.h"#endif#if !defined(__80211hdr_H__)#include "80211hdr.h"#endif#if !defined(__RNDIS_H__)#include "rndis.h"#endif#if !defined(__CONTROL_H__)#include "control.h"#endif/*--------------------- 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){ UINT 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, UINT 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, UINT 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, UINT uEntryIdx, UINT 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 );}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -