diff options
Diffstat (limited to 'drivers/staging/vt6656/mac.c')
| -rw-r--r-- | drivers/staging/vt6656/mac.c | 388 |
1 files changed, 388 insertions, 0 deletions
diff --git a/drivers/staging/vt6656/mac.c b/drivers/staging/vt6656/mac.c new file mode 100644 index 00000000..343db192 --- /dev/null +++ b/drivers/staging/vt6656/mac.c @@ -0,0 +1,388 @@ +/* + * 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 int msglevel =MSG_LEVEL_DEBUG; +static int msglevel =MSG_LEVEL_INFO; + +/* + * Description: + * Write MAC Multicast Address Mask + * + * Parameters: + * In: + * uByteidx - Index of Mask + * byData - Mask Value to write + * Out: + * none + * + * Return Value: none + * + */ +void MACvWriteMultiAddr(struct vnt_private *pDevice, u32 uByteIdx, u8 byData) +{ + u8 byData1; + + byData1 = byData; + CONTROLnsRequestOut(pDevice, + MESSAGE_TYPE_WRITE, + (u16) (MAC_REG_MAR0 + uByteIdx), + MESSAGE_REQUEST_MACREG, + 1, + &byData1); +} + +/* + * Description: + * Shut Down MAC + * + * Parameters: + * In: + * Out: + * none + * + * + */ +void MACbShutdown(struct vnt_private *pDevice) +{ + CONTROLnsRequestOutAsyn(pDevice, + MESSAGE_TYPE_MACSHUTDOWN, + 0, + 0, + 0, + NULL + ); +} + +void MACvSetBBType(struct vnt_private *pDevice, u8 byType) +{ + u8 pbyData[2]; + + pbyData[0] = byType; + pbyData[1] = EnCFG_BBType_MASK; + + CONTROLnsRequestOut(pDevice, + MESSAGE_TYPE_WRITE_MASK, + MAC_REG_ENCFG0, + MESSAGE_REQUEST_MACREG, + 2, + pbyData + ); +} + +/* + * Description: + * Disable the Key Entry by MISCFIFO + * + * Parameters: + * In: + * dwIoBase - Base Address for MAC + * + * Out: + * none + * + * Return Value: none + * + */ +void MACvDisableKeyEntry(struct vnt_private *pDevice, u32 uEntryIdx) +{ + u16 wOffset; + u8 byData; + + byData = (u8) 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(struct vnt_private *pDevice, u16 wKeyCtl, u32 uEntryIdx, + u32 uKeyIdx, u8 *pbyAddr, u32 *pdwKey) +{ + u8 *pbyKey; + u16 wOffset; + u32 dwData1, dwData2; + int ii; + u8 pbyData[24]; + + if (pDevice->byLocalID <= MAC_REVISION_A1) + if (pDevice->vnt_mgmt.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: %X,"\ + " 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: %X\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 = (u8 *)pdwKey; + + pbyData[0] = (u8)dwData1; + pbyData[1] = (u8)(dwData1>>8); + pbyData[2] = (u8)(dwData1>>16); + pbyData[3] = (u8)(dwData1>>24); + pbyData[4] = (u8)dwData2; + pbyData[5] = (u8)(dwData2>>8); + pbyData[6] = (u8)(dwData2>>16); + pbyData[7] = (u8)(dwData2>>24); + for (ii = 8; ii < 24; ii++) + pbyData[ii] = *pbyKey++; + + CONTROLnsRequestOut(pDevice, + MESSAGE_TYPE_SETKEY, + wOffset, + (u16)uKeyIdx, + 24, + pbyData + ); + +} + +void MACvRegBitsOff(struct vnt_private *pDevice, u8 byRegOfs, u8 byBits) +{ + u8 pbyData[2]; + + pbyData[0] = 0; + pbyData[1] = byBits; + + CONTROLnsRequestOut(pDevice, + MESSAGE_TYPE_WRITE_MASK, + byRegOfs, + MESSAGE_REQUEST_MACREG, + 2, + pbyData + ); +} + +void MACvRegBitsOn(struct vnt_private *pDevice, u8 byRegOfs, u8 byBits) +{ + u8 pbyData[2]; + + pbyData[0] = byBits; + pbyData[1] = byBits; + + CONTROLnsRequestOut(pDevice, + MESSAGE_TYPE_WRITE_MASK, + byRegOfs, + MESSAGE_REQUEST_MACREG, + 2, + pbyData + ); +} + +void MACvWriteWord(struct vnt_private *pDevice, u8 byRegOfs, u16 wData) +{ + u8 pbyData[2]; + + pbyData[0] = (u8)(wData & 0xff); + pbyData[1] = (u8)(wData >> 8); + + CONTROLnsRequestOut(pDevice, + MESSAGE_TYPE_WRITE, + byRegOfs, + MESSAGE_REQUEST_MACREG, + 2, + pbyData + ); + +} + +void MACvWriteBSSIDAddress(struct vnt_private *pDevice, u8 *pbyEtherAddr) +{ + u8 pbyData[6]; + + pbyData[0] = *((u8 *)pbyEtherAddr); + pbyData[1] = *((u8 *)pbyEtherAddr+1); + pbyData[2] = *((u8 *)pbyEtherAddr+2); + pbyData[3] = *((u8 *)pbyEtherAddr+3); + pbyData[4] = *((u8 *)pbyEtherAddr+4); + pbyData[5] = *((u8 *)pbyEtherAddr+5); + + CONTROLnsRequestOut(pDevice, + MESSAGE_TYPE_WRITE, + MAC_REG_BSSID0, + MESSAGE_REQUEST_MACREG, + 6, + pbyData + ); +} + +void MACvEnableProtectMD(struct vnt_private *pDevice) +{ + u8 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(struct vnt_private *pDevice) +{ + u8 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(struct vnt_private *pDevice) +{ + u8 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(struct vnt_private *pDevice) +{ + u8 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(struct vnt_private *pDevice, u16 wInterval) +{ + u8 pbyData[2]; + + pbyData[0] = (u8)(wInterval & 0xff); + pbyData[1] = (u8)(wInterval >> 8); + + CONTROLnsRequestOut(pDevice, + MESSAGE_TYPE_WRITE, + MAC_REG_BI, + MESSAGE_REQUEST_MACREG, + 2, + pbyData + ); +} |
