blob: 22dd65399fce70795f45faeeb051b231a83874a8 [file] [log] [blame]
Forest Bond92b96792009-06-13 07:38:31 -04001/*
2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
3 * All rights reserved.
4 *
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.
9 *
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.
14 *
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.
18 *
19 *
20 * File: mac.c
21 *
22 * Purpose: MAC routines
23 *
24 * Author: Tevin Chen
25 *
26 * Date: May 21, 1996
27 *
28 * Functions:
29 *
30 * Revision History:
31 */
32
Forest Bond92b96792009-06-13 07:38:31 -040033#include "tmacro.h"
Forest Bond92b96792009-06-13 07:38:31 -040034#include "tether.h"
Forest Bond92b96792009-06-13 07:38:31 -040035#include "desc.h"
Forest Bond92b96792009-06-13 07:38:31 -040036#include "mac.h"
Forest Bond92b96792009-06-13 07:38:31 -040037#include "80211hdr.h"
Forest Bond92b96792009-06-13 07:38:31 -040038#include "control.h"
Jim Lieb9d26d602009-08-12 14:54:08 -070039
Forest Bond92b96792009-06-13 07:38:31 -040040//static int msglevel =MSG_LEVEL_DEBUG;
41static int msglevel =MSG_LEVEL_INFO;
Forest Bond92b96792009-06-13 07:38:31 -040042
Forest Bond92b96792009-06-13 07:38:31 -040043/*
44 * Description:
45 * Write MAC Multicast Address Mask
46 *
47 * Parameters:
48 * In:
Malcolm Priestley0ca3e282014-02-12 19:18:26 +000049 * mc_filter (mac filter)
Forest Bond92b96792009-06-13 07:38:31 -040050 * Out:
51 * none
52 *
53 * Return Value: none
54 *
55 */
Malcolm Priestley75859402014-05-23 18:00:00 +010056void MACvWriteMultiAddr(struct vnt_private *priv, u64 mc_filter)
Forest Bond92b96792009-06-13 07:38:31 -040057{
Malcolm Priestley0ca3e282014-02-12 19:18:26 +000058 __le64 le_mc = cpu_to_le64(mc_filter);
Forest Bond92b96792009-06-13 07:38:31 -040059
Malcolm Priestley75859402014-05-23 18:00:00 +010060 CONTROLnsRequestOut(priv, MESSAGE_TYPE_WRITE, MAC_REG_MAR0,
Malcolm Priestley0ca3e282014-02-12 19:18:26 +000061 MESSAGE_REQUEST_MACREG, sizeof(le_mc), (u8 *)&le_mc);
Forest Bond92b96792009-06-13 07:38:31 -040062}
63
Forest Bond92b96792009-06-13 07:38:31 -040064/*
65 * Description:
66 * Shut Down MAC
67 *
68 * Parameters:
69 * In:
70 * Out:
71 * none
72 *
Forest Bond92b96792009-06-13 07:38:31 -040073 *
74 */
Malcolm Priestley98583c02012-12-10 22:01:23 +000075void MACbShutdown(struct vnt_private *pDevice)
Forest Bond92b96792009-06-13 07:38:31 -040076{
Malcolm Priestley3136b5f2014-05-15 22:49:24 +010077 CONTROLnsRequestOut(pDevice,
Forest Bond92b96792009-06-13 07:38:31 -040078 MESSAGE_TYPE_MACSHUTDOWN,
79 0,
80 0,
81 0,
82 NULL
83 );
Forest Bond92b96792009-06-13 07:38:31 -040084}
85
Malcolm Priestley98583c02012-12-10 22:01:23 +000086void MACvSetBBType(struct vnt_private *pDevice, u8 byType)
Forest Bond92b96792009-06-13 07:38:31 -040087{
Malcolm Priestley98583c02012-12-10 22:01:23 +000088 u8 pbyData[2];
Forest Bond92b96792009-06-13 07:38:31 -040089
Forest Bond92b96792009-06-13 07:38:31 -040090 pbyData[0] = byType;
91 pbyData[1] = EnCFG_BBType_MASK;
92
93 CONTROLnsRequestOut(pDevice,
94 MESSAGE_TYPE_WRITE_MASK,
95 MAC_REG_ENCFG0,
96 MESSAGE_REQUEST_MACREG,
Malcolm Priestley13d8d892013-06-17 22:19:54 +010097 ARRAY_SIZE(pbyData),
Forest Bond92b96792009-06-13 07:38:31 -040098 pbyData
99 );
100}
101
Forest Bond92b96792009-06-13 07:38:31 -0400102/*
103 * Description:
104 * Disable the Key Entry by MISCFIFO
105 *
106 * Parameters:
107 * In:
108 * dwIoBase - Base Address for MAC
109 *
110 * Out:
111 * none
112 *
113 * Return Value: none
114 *
115 */
Malcolm Priestley98583c02012-12-10 22:01:23 +0000116void MACvDisableKeyEntry(struct vnt_private *pDevice, u32 uEntryIdx)
Forest Bond92b96792009-06-13 07:38:31 -0400117{
Malcolm Priestley98583c02012-12-10 22:01:23 +0000118 u8 byData;
Forest Bond92b96792009-06-13 07:38:31 -0400119
Andres Moreb902fbf2013-02-25 20:32:51 -0500120 byData = (u8) uEntryIdx;
Forest Bond92b96792009-06-13 07:38:31 -0400121
Forest Bond92b96792009-06-13 07:38:31 -0400122 //issue write misc fifo command to device
123 CONTROLnsRequestOut(pDevice,
124 MESSAGE_TYPE_CLRKEYENTRY,
125 0,
126 0,
127 1,
128 &byData
129 );
130}
131
Forest Bond92b96792009-06-13 07:38:31 -0400132/*
133 * Description:
134 * Set the Key by MISCFIFO
135 *
136 * Parameters:
137 * In:
138 * dwIoBase - Base Address for MAC
139 *
140 * Out:
141 * none
142 *
143 * Return Value: none
144 *
145 */
Malcolm Priestley98583c02012-12-10 22:01:23 +0000146void MACvSetKeyEntry(struct vnt_private *pDevice, u16 wKeyCtl, u32 uEntryIdx,
147 u32 uKeyIdx, u8 *pbyAddr, u32 *pdwKey)
Forest Bond92b96792009-06-13 07:38:31 -0400148{
Malcolm Priestley98583c02012-12-10 22:01:23 +0000149 u8 *pbyKey;
150 u16 wOffset;
151 u32 dwData1, dwData2;
152 int ii;
153 u8 pbyData[24];
Forest Bond92b96792009-06-13 07:38:31 -0400154
Malcolm Priestley14c5ef52013-01-17 23:19:37 +0000155 if (pDevice->byLocalID <= MAC_REVISION_A1)
156 if (pDevice->vnt_mgmt.byCSSPK == KEY_CTL_CCMP)
157 return;
Forest Bond92b96792009-06-13 07:38:31 -0400158
159 wOffset = MISCFIFO_KEYETRY0;
160 wOffset += (uEntryIdx * MISCFIFO_KEYENTRYSIZE);
161
162 dwData1 = 0;
163 dwData1 |= wKeyCtl;
164 dwData1 <<= 16;
165 dwData1 |= MAKEWORD(*(pbyAddr+4), *(pbyAddr+5));
166
Malcolm Priestleyb4dc03a2012-11-11 15:45:52 +0000167 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"1. wOffset: %d, Data: %X,"\
168 " KeyCtl:%X\n", wOffset, dwData1, wKeyCtl);
Forest Bond92b96792009-06-13 07:38:31 -0400169
Forest Bond92b96792009-06-13 07:38:31 -0400170 dwData2 = 0;
171 dwData2 |= *(pbyAddr+3);
172 dwData2 <<= 8;
173 dwData2 |= *(pbyAddr+2);
174 dwData2 <<= 8;
175 dwData2 |= *(pbyAddr+1);
176 dwData2 <<= 8;
177 dwData2 |= *(pbyAddr+0);
178
Malcolm Priestleyb4dc03a2012-11-11 15:45:52 +0000179 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"2. wOffset: %d, Data: %X\n",
180 wOffset, dwData2);
Forest Bond92b96792009-06-13 07:38:31 -0400181
Andres Moreb902fbf2013-02-25 20:32:51 -0500182 pbyKey = (u8 *)pdwKey;
Forest Bond92b96792009-06-13 07:38:31 -0400183
Andres Moreb902fbf2013-02-25 20:32:51 -0500184 pbyData[0] = (u8)dwData1;
185 pbyData[1] = (u8)(dwData1>>8);
186 pbyData[2] = (u8)(dwData1>>16);
187 pbyData[3] = (u8)(dwData1>>24);
188 pbyData[4] = (u8)dwData2;
189 pbyData[5] = (u8)(dwData2>>8);
190 pbyData[6] = (u8)(dwData2>>16);
191 pbyData[7] = (u8)(dwData2>>24);
Andres More33d33e422010-05-19 23:50:00 -0300192 for (ii = 8; ii < 24; ii++)
193 pbyData[ii] = *pbyKey++;
Forest Bond92b96792009-06-13 07:38:31 -0400194
195 CONTROLnsRequestOut(pDevice,
196 MESSAGE_TYPE_SETKEY,
197 wOffset,
Andres More3eaca0d2013-02-25 20:32:52 -0500198 (u16)uKeyIdx,
Malcolm Priestley13d8d892013-06-17 22:19:54 +0100199 ARRAY_SIZE(pbyData),
Forest Bond92b96792009-06-13 07:38:31 -0400200 pbyData
201 );
202
Forest Bond92b96792009-06-13 07:38:31 -0400203}
204
Malcolm Priestley98583c02012-12-10 22:01:23 +0000205void MACvRegBitsOff(struct vnt_private *pDevice, u8 byRegOfs, u8 byBits)
Forest Bond92b96792009-06-13 07:38:31 -0400206{
Malcolm Priestley98583c02012-12-10 22:01:23 +0000207 u8 pbyData[2];
Forest Bond92b96792009-06-13 07:38:31 -0400208
209 pbyData[0] = 0;
210 pbyData[1] = byBits;
211
212 CONTROLnsRequestOut(pDevice,
213 MESSAGE_TYPE_WRITE_MASK,
214 byRegOfs,
215 MESSAGE_REQUEST_MACREG,
Malcolm Priestley13d8d892013-06-17 22:19:54 +0100216 ARRAY_SIZE(pbyData),
Forest Bond92b96792009-06-13 07:38:31 -0400217 pbyData
218 );
219}
220
Malcolm Priestley98583c02012-12-10 22:01:23 +0000221void MACvRegBitsOn(struct vnt_private *pDevice, u8 byRegOfs, u8 byBits)
Forest Bond92b96792009-06-13 07:38:31 -0400222{
Malcolm Priestley98583c02012-12-10 22:01:23 +0000223 u8 pbyData[2];
Forest Bond92b96792009-06-13 07:38:31 -0400224
Forest Bond92b96792009-06-13 07:38:31 -0400225 pbyData[0] = byBits;
226 pbyData[1] = byBits;
227
228 CONTROLnsRequestOut(pDevice,
229 MESSAGE_TYPE_WRITE_MASK,
230 byRegOfs,
231 MESSAGE_REQUEST_MACREG,
Malcolm Priestley13d8d892013-06-17 22:19:54 +0100232 ARRAY_SIZE(pbyData),
Forest Bond92b96792009-06-13 07:38:31 -0400233 pbyData
234 );
235}
236
Malcolm Priestley98583c02012-12-10 22:01:23 +0000237void MACvWriteWord(struct vnt_private *pDevice, u8 byRegOfs, u16 wData)
Forest Bond92b96792009-06-13 07:38:31 -0400238{
Malcolm Priestley98583c02012-12-10 22:01:23 +0000239 u8 pbyData[2];
Forest Bond92b96792009-06-13 07:38:31 -0400240
Andres Moreb902fbf2013-02-25 20:32:51 -0500241 pbyData[0] = (u8)(wData & 0xff);
242 pbyData[1] = (u8)(wData >> 8);
Forest Bond92b96792009-06-13 07:38:31 -0400243
244 CONTROLnsRequestOut(pDevice,
245 MESSAGE_TYPE_WRITE,
246 byRegOfs,
247 MESSAGE_REQUEST_MACREG,
Malcolm Priestley13d8d892013-06-17 22:19:54 +0100248 ARRAY_SIZE(pbyData),
Forest Bond92b96792009-06-13 07:38:31 -0400249 pbyData
250 );
251
252}
253
Malcolm Priestley98583c02012-12-10 22:01:23 +0000254void MACvWriteBSSIDAddress(struct vnt_private *pDevice, u8 *pbyEtherAddr)
Forest Bond92b96792009-06-13 07:38:31 -0400255{
Malcolm Priestley98583c02012-12-10 22:01:23 +0000256 u8 pbyData[6];
Forest Bond92b96792009-06-13 07:38:31 -0400257
Andres Moreb902fbf2013-02-25 20:32:51 -0500258 pbyData[0] = *((u8 *)pbyEtherAddr);
259 pbyData[1] = *((u8 *)pbyEtherAddr+1);
260 pbyData[2] = *((u8 *)pbyEtherAddr+2);
261 pbyData[3] = *((u8 *)pbyEtherAddr+3);
262 pbyData[4] = *((u8 *)pbyEtherAddr+4);
263 pbyData[5] = *((u8 *)pbyEtherAddr+5);
Forest Bond92b96792009-06-13 07:38:31 -0400264
265 CONTROLnsRequestOut(pDevice,
266 MESSAGE_TYPE_WRITE,
267 MAC_REG_BSSID0,
268 MESSAGE_REQUEST_MACREG,
Malcolm Priestley13d8d892013-06-17 22:19:54 +0100269 ARRAY_SIZE(pbyData),
Forest Bond92b96792009-06-13 07:38:31 -0400270 pbyData
271 );
272}
273
Malcolm Priestley98583c02012-12-10 22:01:23 +0000274void MACvEnableProtectMD(struct vnt_private *pDevice)
Forest Bond92b96792009-06-13 07:38:31 -0400275{
Malcolm Priestley98583c02012-12-10 22:01:23 +0000276 u8 pbyData[2];
Forest Bond92b96792009-06-13 07:38:31 -0400277
Forest Bond92b96792009-06-13 07:38:31 -0400278 pbyData[0] = EnCFG_ProtectMd;
279 pbyData[1] = EnCFG_ProtectMd;
280
281 CONTROLnsRequestOut(pDevice,
282 MESSAGE_TYPE_WRITE_MASK,
283 MAC_REG_ENCFG0,
284 MESSAGE_REQUEST_MACREG,
Malcolm Priestley13d8d892013-06-17 22:19:54 +0100285 ARRAY_SIZE(pbyData),
Forest Bond92b96792009-06-13 07:38:31 -0400286 pbyData
287 );
288}
289
Malcolm Priestley98583c02012-12-10 22:01:23 +0000290void MACvDisableProtectMD(struct vnt_private *pDevice)
Forest Bond92b96792009-06-13 07:38:31 -0400291{
Malcolm Priestley98583c02012-12-10 22:01:23 +0000292 u8 pbyData[2];
Forest Bond92b96792009-06-13 07:38:31 -0400293
Forest Bond92b96792009-06-13 07:38:31 -0400294 pbyData[0] = 0;
295 pbyData[1] = EnCFG_ProtectMd;
296
297 CONTROLnsRequestOut(pDevice,
298 MESSAGE_TYPE_WRITE_MASK,
299 MAC_REG_ENCFG0,
300 MESSAGE_REQUEST_MACREG,
Malcolm Priestley13d8d892013-06-17 22:19:54 +0100301 ARRAY_SIZE(pbyData),
Forest Bond92b96792009-06-13 07:38:31 -0400302 pbyData
303 );
304}
305
Malcolm Priestley98583c02012-12-10 22:01:23 +0000306void MACvEnableBarkerPreambleMd(struct vnt_private *pDevice)
Forest Bond92b96792009-06-13 07:38:31 -0400307{
Malcolm Priestley98583c02012-12-10 22:01:23 +0000308 u8 pbyData[2];
Forest Bond92b96792009-06-13 07:38:31 -0400309
Forest Bond92b96792009-06-13 07:38:31 -0400310 pbyData[0] = EnCFG_BarkerPream;
311 pbyData[1] = EnCFG_BarkerPream;
312
313 CONTROLnsRequestOut(pDevice,
314 MESSAGE_TYPE_WRITE_MASK,
315 MAC_REG_ENCFG2,
316 MESSAGE_REQUEST_MACREG,
Malcolm Priestley13d8d892013-06-17 22:19:54 +0100317 ARRAY_SIZE(pbyData),
Forest Bond92b96792009-06-13 07:38:31 -0400318 pbyData
319 );
320}
321
Malcolm Priestley98583c02012-12-10 22:01:23 +0000322void MACvDisableBarkerPreambleMd(struct vnt_private *pDevice)
Forest Bond92b96792009-06-13 07:38:31 -0400323{
Malcolm Priestley98583c02012-12-10 22:01:23 +0000324 u8 pbyData[2];
Forest Bond92b96792009-06-13 07:38:31 -0400325
Forest Bond92b96792009-06-13 07:38:31 -0400326 pbyData[0] = 0;
327 pbyData[1] = EnCFG_BarkerPream;
328
329 CONTROLnsRequestOut(pDevice,
330 MESSAGE_TYPE_WRITE_MASK,
331 MAC_REG_ENCFG2,
332 MESSAGE_REQUEST_MACREG,
Malcolm Priestley13d8d892013-06-17 22:19:54 +0100333 ARRAY_SIZE(pbyData),
Forest Bond92b96792009-06-13 07:38:31 -0400334 pbyData
335 );
336}
337
Malcolm Priestley98583c02012-12-10 22:01:23 +0000338void MACvWriteBeaconInterval(struct vnt_private *pDevice, u16 wInterval)
Forest Bond92b96792009-06-13 07:38:31 -0400339{
Malcolm Priestley98583c02012-12-10 22:01:23 +0000340 u8 pbyData[2];
Forest Bond92b96792009-06-13 07:38:31 -0400341
Malcolm Priestley98583c02012-12-10 22:01:23 +0000342 pbyData[0] = (u8)(wInterval & 0xff);
343 pbyData[1] = (u8)(wInterval >> 8);
Forest Bond92b96792009-06-13 07:38:31 -0400344
345 CONTROLnsRequestOut(pDevice,
Clelia V. Korolb411f122010-09-16 15:00:19 -0300346 MESSAGE_TYPE_WRITE,
347 MAC_REG_BI,
348 MESSAGE_REQUEST_MACREG,
Malcolm Priestley13d8d892013-06-17 22:19:54 +0100349 ARRAY_SIZE(pbyData),
Clelia V. Korolb411f122010-09-16 15:00:19 -0300350 pbyData
351 );
Forest Bond92b96792009-06-13 07:38:31 -0400352}