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
42 /*--------------------- Static Definitions -------------------------*/
43 //static int msglevel =MSG_LEVEL_DEBUG;
44 static int msglevel =MSG_LEVEL_INFO;
45 /*--------------------- Static Classes ----------------------------*/
47 /*--------------------- Static Variables --------------------------*/
49 /*--------------------- Static Functions --------------------------*/
51 /*--------------------- Export Variables --------------------------*/
53 /*--------------------- Export Functions --------------------------*/
61 * Set this hash index into multicast address register bit
65 * byHashIdx - Hash index to set
72 void MACvSetMultiAddrByHash (PSDevice pDevice, BYTE byHashIdx)
79 // calculate byte position
80 uByteIdx = byHashIdx / 8;
82 // calculate bit position
84 byBitMask <<= (byHashIdx % 8);
87 pbyData[0] = byBitMask;
88 pbyData[1] = byBitMask;
90 CONTROLnsRequestOut(pDevice,
91 MESSAGE_TYPE_WRITE_MASK,
92 (WORD) (MAC_REG_MAR0 + uByteIdx),
93 MESSAGE_REQUEST_MACREG,
102 * Write MAC Multicast Address Mask
106 * uByteidx - Index of Mask
107 * byData - Mask Value to write
114 VOID MACvWriteMultiAddr (PSDevice pDevice, UINT uByteIdx, BYTE byData)
119 CONTROLnsRequestOut(pDevice,
121 (WORD) (MAC_REG_MAR0 + uByteIdx),
122 MESSAGE_REQUEST_MACREG,
137 * Return Value: TRUE if success; otherwise FALSE
140 BOOL MACbShutdown (PSDevice pDevice)
142 CONTROLnsRequestOutAsyn(pDevice,
143 MESSAGE_TYPE_MACSHUTDOWN,
152 void MACvSetBBType(PSDevice pDevice,BYTE byType)
158 pbyData[1] = EnCFG_BBType_MASK;
160 CONTROLnsRequestOut(pDevice,
161 MESSAGE_TYPE_WRITE_MASK,
163 MESSAGE_REQUEST_MACREG,
169 void MACvSetMISCFifo (PSDevice pDevice, WORD wOffset, DWORD dwData)
175 pbyData[0] = (BYTE)dwData;
176 pbyData[1] = (BYTE)(dwData>>8);
177 pbyData[2] = (BYTE)(dwData>>16);
178 pbyData[3] = (BYTE)(dwData>>24);
180 CONTROLnsRequestOut(pDevice,
181 MESSAGE_TYPE_WRITE_MISCFF,
191 * Disable the Key Entry by MISCFIFO
195 * dwIoBase - Base Address for MAC
203 void MACvDisableKeyEntry (PSDevice pDevice, UINT uEntryIdx)
209 byData = (BYTE) uEntryIdx;
211 wOffset = MISCFIFO_KEYETRY0;
212 wOffset += (uEntryIdx * MISCFIFO_KEYENTRYSIZE);
214 //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset);
215 //VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, 0);
216 //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
218 //issue write misc fifo command to device
219 CONTROLnsRequestOut(pDevice,
220 MESSAGE_TYPE_CLRKEYENTRY,
231 * Set the Key by MISCFIFO
235 * dwIoBase - Base Address for MAC
243 void MACvSetKeyEntry (PSDevice pDevice, WORD wKeyCtl, UINT uEntryIdx, UINT uKeyIdx, PBYTE pbyAddr, PDWORD pdwKey)
247 DWORD dwData1,dwData2;
255 if ( pDevice->byLocalID <= MAC_REVISION_A1 ) {
256 if ( pDevice->sMgmtObj.byCSSPK == KEY_CTL_CCMP )
260 wOffset = MISCFIFO_KEYETRY0;
261 wOffset += (uEntryIdx * MISCFIFO_KEYENTRYSIZE);
266 dwData1 |= MAKEWORD(*(pbyAddr+4), *(pbyAddr+5));
268 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"1. wOffset: %d, Data: %lX, KeyCtl:%X\n", wOffset, dwData1, wKeyCtl);
270 //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset);
271 //VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, dwData);
272 //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
277 dwData2 |= *(pbyAddr+3);
279 dwData2 |= *(pbyAddr+2);
281 dwData2 |= *(pbyAddr+1);
283 dwData2 |= *(pbyAddr+0);
285 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"2. wOffset: %d, Data: %lX\n", wOffset, dwData2);
287 //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset);
288 //VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, dwData);
289 //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
293 //wOffset += (uKeyIdx * 4);
294 /* for (ii=0;ii<4;ii++) {
295 // alway push 128 bits
296 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"3.(%d) wOffset: %d, Data: %lX\n", ii, wOffset+ii, *pdwKey);
297 VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset+ii);
298 VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, *pdwKey++);
299 VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
302 pbyKey = (PBYTE)pdwKey;
304 pbyData[0] = (BYTE)dwData1;
305 pbyData[1] = (BYTE)(dwData1>>8);
306 pbyData[2] = (BYTE)(dwData1>>16);
307 pbyData[3] = (BYTE)(dwData1>>24);
308 pbyData[4] = (BYTE)dwData2;
309 pbyData[5] = (BYTE)(dwData2>>8);
310 pbyData[6] = (BYTE)(dwData2>>16);
311 pbyData[7] = (BYTE)(dwData2>>24);
313 pbyData[ii] = *pbyKey++;
315 CONTROLnsRequestOut(pDevice,
327 void MACvRegBitsOff(PSDevice pDevice, BYTE byRegOfs, BYTE byBits)
334 CONTROLnsRequestOut(pDevice,
335 MESSAGE_TYPE_WRITE_MASK,
337 MESSAGE_REQUEST_MACREG,
344 void MACvRegBitsOn(PSDevice pDevice, BYTE byRegOfs, BYTE byBits)
352 CONTROLnsRequestOut(pDevice,
353 MESSAGE_TYPE_WRITE_MASK,
355 MESSAGE_REQUEST_MACREG,
361 void MACvWriteWord(PSDevice pDevice, BYTE byRegOfs, WORD wData)
366 pbyData[0] = (BYTE)(wData & 0xff);
367 pbyData[1] = (BYTE)(wData >> 8);
369 CONTROLnsRequestOut(pDevice,
372 MESSAGE_REQUEST_MACREG,
379 void MACvWriteBSSIDAddress(PSDevice pDevice, PBYTE pbyEtherAddr)
384 pbyData[0] = *((PBYTE)pbyEtherAddr);
385 pbyData[1] = *((PBYTE)pbyEtherAddr+1);
386 pbyData[2] = *((PBYTE)pbyEtherAddr+2);
387 pbyData[3] = *((PBYTE)pbyEtherAddr+3);
388 pbyData[4] = *((PBYTE)pbyEtherAddr+4);
389 pbyData[5] = *((PBYTE)pbyEtherAddr+5);
391 CONTROLnsRequestOut(pDevice,
394 MESSAGE_REQUEST_MACREG,
400 void MACvEnableProtectMD(PSDevice pDevice)
405 pbyData[0] = EnCFG_ProtectMd;
406 pbyData[1] = EnCFG_ProtectMd;
408 CONTROLnsRequestOut(pDevice,
409 MESSAGE_TYPE_WRITE_MASK,
411 MESSAGE_REQUEST_MACREG,
417 void MACvDisableProtectMD(PSDevice pDevice)
423 pbyData[1] = EnCFG_ProtectMd;
425 CONTROLnsRequestOut(pDevice,
426 MESSAGE_TYPE_WRITE_MASK,
428 MESSAGE_REQUEST_MACREG,
434 void MACvEnableBarkerPreambleMd(PSDevice pDevice)
439 pbyData[0] = EnCFG_BarkerPream;
440 pbyData[1] = EnCFG_BarkerPream;
442 CONTROLnsRequestOut(pDevice,
443 MESSAGE_TYPE_WRITE_MASK,
445 MESSAGE_REQUEST_MACREG,
451 void MACvDisableBarkerPreambleMd(PSDevice pDevice)
457 pbyData[1] = EnCFG_BarkerPream;
459 CONTROLnsRequestOut(pDevice,
460 MESSAGE_TYPE_WRITE_MASK,
462 MESSAGE_REQUEST_MACREG,
469 void MACvWriteBeaconInterval(PSDevice pDevice, WORD wInterval)
473 pbyData[0] = (BYTE) (wInterval & 0xff);
474 pbyData[1] = (BYTE) (wInterval >> 8);
476 CONTROLnsRequestOut(pDevice,
479 MESSAGE_REQUEST_MACREG,