2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 * Purpose: MAC routines
35 #if !defined(__TMACRO_H__)
38 #if !defined(__TBIT_H__)
41 #if !defined(__TETHER_H__)
44 #if !defined(__DESC_H__)
47 #if !defined(__MAC_H__)
50 #if !defined(__80211hdr_H__)
53 #if !defined(__RNDIS_H__)
56 #if !defined(__CONTROL_H__)
59 /*--------------------- Static Definitions -------------------------*/
60 //static int msglevel =MSG_LEVEL_DEBUG;
61 static int msglevel =MSG_LEVEL_INFO;
62 /*--------------------- Static Classes ----------------------------*/
64 /*--------------------- Static Variables --------------------------*/
66 /*--------------------- Static Functions --------------------------*/
68 /*--------------------- Export Variables --------------------------*/
70 /*--------------------- Export Functions --------------------------*/
78 * Set this hash index into multicast address register bit
82 * byHashIdx - Hash index to set
89 void MACvSetMultiAddrByHash (PSDevice pDevice, BYTE byHashIdx)
96 // calculate byte position
97 uByteIdx = byHashIdx / 8;
99 // calculate bit position
101 byBitMask <<= (byHashIdx % 8);
104 pbyData[0] = byBitMask;
105 pbyData[1] = byBitMask;
107 CONTROLnsRequestOut(pDevice,
108 MESSAGE_TYPE_WRITE_MASK,
109 (WORD) (MAC_REG_MAR0 + uByteIdx),
110 MESSAGE_REQUEST_MACREG,
119 * Write MAC Multicast Address Mask
123 * uByteidx - Index of Mask
124 * byData - Mask Value to write
131 VOID MACvWriteMultiAddr (PSDevice pDevice, UINT uByteIdx, BYTE byData)
136 CONTROLnsRequestOut(pDevice,
138 (WORD) (MAC_REG_MAR0 + uByteIdx),
139 MESSAGE_REQUEST_MACREG,
154 * Return Value: TRUE if success; otherwise FALSE
157 BOOL MACbShutdown (PSDevice pDevice)
159 CONTROLnsRequestOutAsyn(pDevice,
160 MESSAGE_TYPE_MACSHUTDOWN,
169 void MACvSetBBType(PSDevice pDevice,BYTE byType)
175 pbyData[1] = EnCFG_BBType_MASK;
177 CONTROLnsRequestOut(pDevice,
178 MESSAGE_TYPE_WRITE_MASK,
180 MESSAGE_REQUEST_MACREG,
186 void MACvSetMISCFifo (PSDevice pDevice, WORD wOffset, DWORD dwData)
192 pbyData[0] = (BYTE)dwData;
193 pbyData[1] = (BYTE)(dwData>>8);
194 pbyData[2] = (BYTE)(dwData>>16);
195 pbyData[3] = (BYTE)(dwData>>24);
197 CONTROLnsRequestOut(pDevice,
198 MESSAGE_TYPE_WRITE_MISCFF,
208 * Disable the Key Entry by MISCFIFO
212 * dwIoBase - Base Address for MAC
220 void MACvDisableKeyEntry (PSDevice pDevice, UINT uEntryIdx)
226 byData = (BYTE) uEntryIdx;
228 wOffset = MISCFIFO_KEYETRY0;
229 wOffset += (uEntryIdx * MISCFIFO_KEYENTRYSIZE);
231 //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset);
232 //VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, 0);
233 //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
235 //issue write misc fifo command to device
236 CONTROLnsRequestOut(pDevice,
237 MESSAGE_TYPE_CLRKEYENTRY,
248 * Set the Key by MISCFIFO
252 * dwIoBase - Base Address for MAC
260 void MACvSetKeyEntry (PSDevice pDevice, WORD wKeyCtl, UINT uEntryIdx, UINT uKeyIdx, PBYTE pbyAddr, PDWORD pdwKey)
264 DWORD dwData1,dwData2;
272 if ( pDevice->byLocalID <= MAC_REVISION_A1 ) {
273 if ( pDevice->sMgmtObj.byCSSPK == KEY_CTL_CCMP )
277 wOffset = MISCFIFO_KEYETRY0;
278 wOffset += (uEntryIdx * MISCFIFO_KEYENTRYSIZE);
283 dwData1 |= MAKEWORD(*(pbyAddr+4), *(pbyAddr+5));
285 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"1. wOffset: %d, Data: %lX, KeyCtl:%X\n", wOffset, dwData1, wKeyCtl);
287 //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset);
288 //VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, dwData);
289 //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
294 dwData2 |= *(pbyAddr+3);
296 dwData2 |= *(pbyAddr+2);
298 dwData2 |= *(pbyAddr+1);
300 dwData2 |= *(pbyAddr+0);
302 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"2. wOffset: %d, Data: %lX\n", wOffset, dwData2);
304 //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset);
305 //VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, dwData);
306 //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
310 //wOffset += (uKeyIdx * 4);
311 /* for (ii=0;ii<4;ii++) {
312 // alway push 128 bits
313 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"3.(%d) wOffset: %d, Data: %lX\n", ii, wOffset+ii, *pdwKey);
314 VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset+ii);
315 VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, *pdwKey++);
316 VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
319 pbyKey = (PBYTE)pdwKey;
321 pbyData[0] = (BYTE)dwData1;
322 pbyData[1] = (BYTE)(dwData1>>8);
323 pbyData[2] = (BYTE)(dwData1>>16);
324 pbyData[3] = (BYTE)(dwData1>>24);
325 pbyData[4] = (BYTE)dwData2;
326 pbyData[5] = (BYTE)(dwData2>>8);
327 pbyData[6] = (BYTE)(dwData2>>16);
328 pbyData[7] = (BYTE)(dwData2>>24);
330 pbyData[ii] = *pbyKey++;
332 CONTROLnsRequestOut(pDevice,
344 void MACvRegBitsOff(PSDevice pDevice, BYTE byRegOfs, BYTE byBits)
351 CONTROLnsRequestOut(pDevice,
352 MESSAGE_TYPE_WRITE_MASK,
354 MESSAGE_REQUEST_MACREG,
361 void MACvRegBitsOn(PSDevice pDevice, BYTE byRegOfs, BYTE byBits)
369 CONTROLnsRequestOut(pDevice,
370 MESSAGE_TYPE_WRITE_MASK,
372 MESSAGE_REQUEST_MACREG,
378 void MACvWriteWord(PSDevice pDevice, BYTE byRegOfs, WORD wData)
383 pbyData[0] = (BYTE)(wData & 0xff);
384 pbyData[1] = (BYTE)(wData >> 8);
386 CONTROLnsRequestOut(pDevice,
389 MESSAGE_REQUEST_MACREG,
396 void MACvWriteBSSIDAddress(PSDevice pDevice, PBYTE pbyEtherAddr)
401 pbyData[0] = *((PBYTE)pbyEtherAddr);
402 pbyData[1] = *((PBYTE)pbyEtherAddr+1);
403 pbyData[2] = *((PBYTE)pbyEtherAddr+2);
404 pbyData[3] = *((PBYTE)pbyEtherAddr+3);
405 pbyData[4] = *((PBYTE)pbyEtherAddr+4);
406 pbyData[5] = *((PBYTE)pbyEtherAddr+5);
408 CONTROLnsRequestOut(pDevice,
411 MESSAGE_REQUEST_MACREG,
417 void MACvEnableProtectMD(PSDevice pDevice)
422 pbyData[0] = EnCFG_ProtectMd;
423 pbyData[1] = EnCFG_ProtectMd;
425 CONTROLnsRequestOut(pDevice,
426 MESSAGE_TYPE_WRITE_MASK,
428 MESSAGE_REQUEST_MACREG,
434 void MACvDisableProtectMD(PSDevice pDevice)
440 pbyData[1] = EnCFG_ProtectMd;
442 CONTROLnsRequestOut(pDevice,
443 MESSAGE_TYPE_WRITE_MASK,
445 MESSAGE_REQUEST_MACREG,
451 void MACvEnableBarkerPreambleMd(PSDevice pDevice)
456 pbyData[0] = EnCFG_BarkerPream;
457 pbyData[1] = EnCFG_BarkerPream;
459 CONTROLnsRequestOut(pDevice,
460 MESSAGE_TYPE_WRITE_MASK,
462 MESSAGE_REQUEST_MACREG,
468 void MACvDisableBarkerPreambleMd(PSDevice pDevice)
474 pbyData[1] = EnCFG_BarkerPream;
476 CONTROLnsRequestOut(pDevice,
477 MESSAGE_TYPE_WRITE_MASK,
479 MESSAGE_REQUEST_MACREG,
486 void MACvWriteBeaconInterval(PSDevice pDevice, WORD wInterval)
490 pbyData[0] = (BYTE) (wInterval & 0xff);
491 pbyData[1] = (BYTE) (wInterval >> 8);
493 CONTROLnsRequestOut(pDevice,
496 MESSAGE_REQUEST_MACREG,