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
41 /*--------------------- Static Definitions -------------------------*/
42 //static int msglevel =MSG_LEVEL_DEBUG;
43 static int msglevel =MSG_LEVEL_INFO;
44 /*--------------------- Static Classes ----------------------------*/
46 /*--------------------- Static Variables --------------------------*/
48 /*--------------------- Static Functions --------------------------*/
50 /*--------------------- Export Variables --------------------------*/
52 /*--------------------- Export Functions --------------------------*/
60 * Set this hash index into multicast address register bit
64 * byHashIdx - Hash index to set
71 void MACvSetMultiAddrByHash (PSDevice pDevice, BYTE byHashIdx)
78 // calculate byte position
79 uByteIdx = byHashIdx / 8;
81 // calculate bit position
83 byBitMask <<= (byHashIdx % 8);
86 pbyData[0] = byBitMask;
87 pbyData[1] = byBitMask;
89 CONTROLnsRequestOut(pDevice,
90 MESSAGE_TYPE_WRITE_MASK,
91 (WORD) (MAC_REG_MAR0 + uByteIdx),
92 MESSAGE_REQUEST_MACREG,
101 * Write MAC Multicast Address Mask
105 * uByteidx - Index of Mask
106 * byData - Mask Value to write
113 VOID MACvWriteMultiAddr (PSDevice pDevice, UINT uByteIdx, BYTE byData)
118 CONTROLnsRequestOut(pDevice,
120 (WORD) (MAC_REG_MAR0 + uByteIdx),
121 MESSAGE_REQUEST_MACREG,
136 * Return Value: TRUE if success; otherwise FALSE
139 BOOL MACbShutdown (PSDevice pDevice)
141 CONTROLnsRequestOutAsyn(pDevice,
142 MESSAGE_TYPE_MACSHUTDOWN,
151 void MACvSetBBType(PSDevice pDevice,BYTE byType)
157 pbyData[1] = EnCFG_BBType_MASK;
159 CONTROLnsRequestOut(pDevice,
160 MESSAGE_TYPE_WRITE_MASK,
162 MESSAGE_REQUEST_MACREG,
168 void MACvSetMISCFifo (PSDevice pDevice, WORD wOffset, DWORD dwData)
174 pbyData[0] = (BYTE)dwData;
175 pbyData[1] = (BYTE)(dwData>>8);
176 pbyData[2] = (BYTE)(dwData>>16);
177 pbyData[3] = (BYTE)(dwData>>24);
179 CONTROLnsRequestOut(pDevice,
180 MESSAGE_TYPE_WRITE_MISCFF,
190 * Disable the Key Entry by MISCFIFO
194 * dwIoBase - Base Address for MAC
202 void MACvDisableKeyEntry (PSDevice pDevice, UINT uEntryIdx)
208 byData = (BYTE) uEntryIdx;
210 wOffset = MISCFIFO_KEYETRY0;
211 wOffset += (uEntryIdx * MISCFIFO_KEYENTRYSIZE);
213 //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset);
214 //VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, 0);
215 //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
217 //issue write misc fifo command to device
218 CONTROLnsRequestOut(pDevice,
219 MESSAGE_TYPE_CLRKEYENTRY,
230 * Set the Key by MISCFIFO
234 * dwIoBase - Base Address for MAC
242 void MACvSetKeyEntry (PSDevice pDevice, WORD wKeyCtl, UINT uEntryIdx, UINT uKeyIdx, PBYTE pbyAddr, PDWORD pdwKey)
246 DWORD dwData1,dwData2;
254 if ( pDevice->byLocalID <= MAC_REVISION_A1 ) {
255 if ( pDevice->sMgmtObj.byCSSPK == KEY_CTL_CCMP )
259 wOffset = MISCFIFO_KEYETRY0;
260 wOffset += (uEntryIdx * MISCFIFO_KEYENTRYSIZE);
265 dwData1 |= MAKEWORD(*(pbyAddr+4), *(pbyAddr+5));
267 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"1. wOffset: %d, Data: %lX, KeyCtl:%X\n", wOffset, dwData1, wKeyCtl);
269 //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset);
270 //VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, dwData);
271 //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
276 dwData2 |= *(pbyAddr+3);
278 dwData2 |= *(pbyAddr+2);
280 dwData2 |= *(pbyAddr+1);
282 dwData2 |= *(pbyAddr+0);
284 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"2. wOffset: %d, Data: %lX\n", wOffset, dwData2);
286 //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset);
287 //VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, dwData);
288 //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
292 //wOffset += (uKeyIdx * 4);
293 /* for (ii=0;ii<4;ii++) {
294 // alway push 128 bits
295 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"3.(%d) wOffset: %d, Data: %lX\n", ii, wOffset+ii, *pdwKey);
296 VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset+ii);
297 VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, *pdwKey++);
298 VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
301 pbyKey = (PBYTE)pdwKey;
303 pbyData[0] = (BYTE)dwData1;
304 pbyData[1] = (BYTE)(dwData1>>8);
305 pbyData[2] = (BYTE)(dwData1>>16);
306 pbyData[3] = (BYTE)(dwData1>>24);
307 pbyData[4] = (BYTE)dwData2;
308 pbyData[5] = (BYTE)(dwData2>>8);
309 pbyData[6] = (BYTE)(dwData2>>16);
310 pbyData[7] = (BYTE)(dwData2>>24);
312 pbyData[ii] = *pbyKey++;
314 CONTROLnsRequestOut(pDevice,
326 void MACvRegBitsOff(PSDevice pDevice, BYTE byRegOfs, BYTE byBits)
333 CONTROLnsRequestOut(pDevice,
334 MESSAGE_TYPE_WRITE_MASK,
336 MESSAGE_REQUEST_MACREG,
343 void MACvRegBitsOn(PSDevice pDevice, BYTE byRegOfs, BYTE byBits)
351 CONTROLnsRequestOut(pDevice,
352 MESSAGE_TYPE_WRITE_MASK,
354 MESSAGE_REQUEST_MACREG,
360 void MACvWriteWord(PSDevice pDevice, BYTE byRegOfs, WORD wData)
365 pbyData[0] = (BYTE)(wData & 0xff);
366 pbyData[1] = (BYTE)(wData >> 8);
368 CONTROLnsRequestOut(pDevice,
371 MESSAGE_REQUEST_MACREG,
378 void MACvWriteBSSIDAddress(PSDevice pDevice, PBYTE pbyEtherAddr)
383 pbyData[0] = *((PBYTE)pbyEtherAddr);
384 pbyData[1] = *((PBYTE)pbyEtherAddr+1);
385 pbyData[2] = *((PBYTE)pbyEtherAddr+2);
386 pbyData[3] = *((PBYTE)pbyEtherAddr+3);
387 pbyData[4] = *((PBYTE)pbyEtherAddr+4);
388 pbyData[5] = *((PBYTE)pbyEtherAddr+5);
390 CONTROLnsRequestOut(pDevice,
393 MESSAGE_REQUEST_MACREG,
399 void MACvEnableProtectMD(PSDevice pDevice)
404 pbyData[0] = EnCFG_ProtectMd;
405 pbyData[1] = EnCFG_ProtectMd;
407 CONTROLnsRequestOut(pDevice,
408 MESSAGE_TYPE_WRITE_MASK,
410 MESSAGE_REQUEST_MACREG,
416 void MACvDisableProtectMD(PSDevice pDevice)
422 pbyData[1] = EnCFG_ProtectMd;
424 CONTROLnsRequestOut(pDevice,
425 MESSAGE_TYPE_WRITE_MASK,
427 MESSAGE_REQUEST_MACREG,
433 void MACvEnableBarkerPreambleMd(PSDevice pDevice)
438 pbyData[0] = EnCFG_BarkerPream;
439 pbyData[1] = EnCFG_BarkerPream;
441 CONTROLnsRequestOut(pDevice,
442 MESSAGE_TYPE_WRITE_MASK,
444 MESSAGE_REQUEST_MACREG,
450 void MACvDisableBarkerPreambleMd(PSDevice pDevice)
456 pbyData[1] = EnCFG_BarkerPream;
458 CONTROLnsRequestOut(pDevice,
459 MESSAGE_TYPE_WRITE_MASK,
461 MESSAGE_REQUEST_MACREG,
468 void MACvWriteBeaconInterval(PSDevice pDevice, WORD wInterval)
472 pbyData[0] = (BYTE) (wInterval & 0xff);
473 pbyData[1] = (BYTE) (wInterval >> 8);
475 CONTROLnsRequestOut(pDevice,
478 MESSAGE_REQUEST_MACREG,