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 int msglevel =MSG_LEVEL_DEBUG;
42 static int msglevel =MSG_LEVEL_INFO;
46 * Write MAC Multicast Address Mask
50 * uByteidx - Index of Mask
51 * byData - Mask Value to write
58 void MACvWriteMultiAddr(struct vnt_private *pDevice, u32 uByteIdx, u8 byData)
63 CONTROLnsRequestOut(pDevice,
65 (u16) (MAC_REG_MAR0 + uByteIdx),
66 MESSAGE_REQUEST_MACREG,
82 void MACbShutdown(struct vnt_private *pDevice)
84 CONTROLnsRequestOutAsyn(pDevice,
85 MESSAGE_TYPE_MACSHUTDOWN,
93 void MACvSetBBType(struct vnt_private *pDevice, u8 byType)
98 pbyData[1] = EnCFG_BBType_MASK;
100 CONTROLnsRequestOut(pDevice,
101 MESSAGE_TYPE_WRITE_MASK,
103 MESSAGE_REQUEST_MACREG,
111 * Disable the Key Entry by MISCFIFO
115 * dwIoBase - Base Address for MAC
123 void MACvDisableKeyEntry(struct vnt_private *pDevice, u32 uEntryIdx)
128 byData = (u8) uEntryIdx;
130 wOffset = MISCFIFO_KEYETRY0;
131 wOffset += (uEntryIdx * MISCFIFO_KEYENTRYSIZE);
133 //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset);
134 //VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, 0);
135 //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
137 //issue write misc fifo command to device
138 CONTROLnsRequestOut(pDevice,
139 MESSAGE_TYPE_CLRKEYENTRY,
149 * Set the Key by MISCFIFO
153 * dwIoBase - Base Address for MAC
161 void MACvSetKeyEntry(struct vnt_private *pDevice, u16 wKeyCtl, u32 uEntryIdx,
162 u32 uKeyIdx, u8 *pbyAddr, u32 *pdwKey)
166 u32 dwData1, dwData2;
170 if (pDevice->byLocalID <= MAC_REVISION_A1)
171 if (pDevice->vnt_mgmt.byCSSPK == KEY_CTL_CCMP)
174 wOffset = MISCFIFO_KEYETRY0;
175 wOffset += (uEntryIdx * MISCFIFO_KEYENTRYSIZE);
180 dwData1 |= MAKEWORD(*(pbyAddr+4), *(pbyAddr+5));
182 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"1. wOffset: %d, Data: %X,"\
183 " KeyCtl:%X\n", wOffset, dwData1, wKeyCtl);
185 //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset);
186 //VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, dwData);
187 //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
192 dwData2 |= *(pbyAddr+3);
194 dwData2 |= *(pbyAddr+2);
196 dwData2 |= *(pbyAddr+1);
198 dwData2 |= *(pbyAddr+0);
200 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"2. wOffset: %d, Data: %X\n",
203 //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset);
204 //VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, dwData);
205 //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
209 //wOffset += (uKeyIdx * 4);
210 /* for (ii=0;ii<4;ii++) {
211 // alway push 128 bits
212 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"3.(%d) wOffset: %d, Data: %lX\n", ii, wOffset+ii, *pdwKey);
213 VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset+ii);
214 VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, *pdwKey++);
215 VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
218 pbyKey = (u8 *)pdwKey;
220 pbyData[0] = (u8)dwData1;
221 pbyData[1] = (u8)(dwData1>>8);
222 pbyData[2] = (u8)(dwData1>>16);
223 pbyData[3] = (u8)(dwData1>>24);
224 pbyData[4] = (u8)dwData2;
225 pbyData[5] = (u8)(dwData2>>8);
226 pbyData[6] = (u8)(dwData2>>16);
227 pbyData[7] = (u8)(dwData2>>24);
228 for (ii = 8; ii < 24; ii++)
229 pbyData[ii] = *pbyKey++;
231 CONTROLnsRequestOut(pDevice,
241 void MACvRegBitsOff(struct vnt_private *pDevice, u8 byRegOfs, u8 byBits)
248 CONTROLnsRequestOut(pDevice,
249 MESSAGE_TYPE_WRITE_MASK,
251 MESSAGE_REQUEST_MACREG,
257 void MACvRegBitsOn(struct vnt_private *pDevice, u8 byRegOfs, u8 byBits)
264 CONTROLnsRequestOut(pDevice,
265 MESSAGE_TYPE_WRITE_MASK,
267 MESSAGE_REQUEST_MACREG,
273 void MACvWriteWord(struct vnt_private *pDevice, u8 byRegOfs, u16 wData)
277 pbyData[0] = (u8)(wData & 0xff);
278 pbyData[1] = (u8)(wData >> 8);
280 CONTROLnsRequestOut(pDevice,
283 MESSAGE_REQUEST_MACREG,
290 void MACvWriteBSSIDAddress(struct vnt_private *pDevice, u8 *pbyEtherAddr)
294 pbyData[0] = *((u8 *)pbyEtherAddr);
295 pbyData[1] = *((u8 *)pbyEtherAddr+1);
296 pbyData[2] = *((u8 *)pbyEtherAddr+2);
297 pbyData[3] = *((u8 *)pbyEtherAddr+3);
298 pbyData[4] = *((u8 *)pbyEtherAddr+4);
299 pbyData[5] = *((u8 *)pbyEtherAddr+5);
301 CONTROLnsRequestOut(pDevice,
304 MESSAGE_REQUEST_MACREG,
310 void MACvEnableProtectMD(struct vnt_private *pDevice)
314 pbyData[0] = EnCFG_ProtectMd;
315 pbyData[1] = EnCFG_ProtectMd;
317 CONTROLnsRequestOut(pDevice,
318 MESSAGE_TYPE_WRITE_MASK,
320 MESSAGE_REQUEST_MACREG,
326 void MACvDisableProtectMD(struct vnt_private *pDevice)
331 pbyData[1] = EnCFG_ProtectMd;
333 CONTROLnsRequestOut(pDevice,
334 MESSAGE_TYPE_WRITE_MASK,
336 MESSAGE_REQUEST_MACREG,
342 void MACvEnableBarkerPreambleMd(struct vnt_private *pDevice)
346 pbyData[0] = EnCFG_BarkerPream;
347 pbyData[1] = EnCFG_BarkerPream;
349 CONTROLnsRequestOut(pDevice,
350 MESSAGE_TYPE_WRITE_MASK,
352 MESSAGE_REQUEST_MACREG,
358 void MACvDisableBarkerPreambleMd(struct vnt_private *pDevice)
363 pbyData[1] = EnCFG_BarkerPream;
365 CONTROLnsRequestOut(pDevice,
366 MESSAGE_TYPE_WRITE_MASK,
368 MESSAGE_REQUEST_MACREG,
374 void MACvWriteBeaconInterval(struct vnt_private *pDevice, u16 wInterval)
378 pbyData[0] = (u8)(wInterval & 0xff);
379 pbyData[1] = (u8)(wInterval >> 8);
381 CONTROLnsRequestOut(pDevice,
384 MESSAGE_REQUEST_MACREG,