blob: 0e14aabca736df3f4ef5c2e588243ad20d9f0b9a [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 Priestley88eee072014-05-23 18:00:01 +010075void MACbShutdown(struct vnt_private *priv)
Forest Bond92b96792009-06-13 07:38:31 -040076{
Malcolm Priestley88eee072014-05-23 18:00:01 +010077 CONTROLnsRequestOut(priv, MESSAGE_TYPE_MACSHUTDOWN, 0, 0, 0, NULL);
Forest Bond92b96792009-06-13 07:38:31 -040078}
79
Malcolm Priestleybee7b682014-05-23 18:00:02 +010080void MACvSetBBType(struct vnt_private *priv, u8 type)
Forest Bond92b96792009-06-13 07:38:31 -040081{
Malcolm Priestleybee7b682014-05-23 18:00:02 +010082 u8 data[2];
Forest Bond92b96792009-06-13 07:38:31 -040083
Malcolm Priestleybee7b682014-05-23 18:00:02 +010084 data[0] = type;
85 data[1] = EnCFG_BBType_MASK;
Forest Bond92b96792009-06-13 07:38:31 -040086
Malcolm Priestleybee7b682014-05-23 18:00:02 +010087 CONTROLnsRequestOut(priv, MESSAGE_TYPE_WRITE_MASK, MAC_REG_ENCFG0,
88 MESSAGE_REQUEST_MACREG, ARRAY_SIZE(data), data);
Forest Bond92b96792009-06-13 07:38:31 -040089}
90
Forest Bond92b96792009-06-13 07:38:31 -040091/*
92 * Description:
93 * Disable the Key Entry by MISCFIFO
94 *
95 * Parameters:
96 * In:
97 * dwIoBase - Base Address for MAC
98 *
99 * Out:
100 * none
101 *
102 * Return Value: none
103 *
104 */
Malcolm Priestley98583c02012-12-10 22:01:23 +0000105void MACvDisableKeyEntry(struct vnt_private *pDevice, u32 uEntryIdx)
Forest Bond92b96792009-06-13 07:38:31 -0400106{
Malcolm Priestley98583c02012-12-10 22:01:23 +0000107 u8 byData;
Forest Bond92b96792009-06-13 07:38:31 -0400108
Andres Moreb902fbf2013-02-25 20:32:51 -0500109 byData = (u8) uEntryIdx;
Forest Bond92b96792009-06-13 07:38:31 -0400110
Forest Bond92b96792009-06-13 07:38:31 -0400111 //issue write misc fifo command to device
112 CONTROLnsRequestOut(pDevice,
113 MESSAGE_TYPE_CLRKEYENTRY,
114 0,
115 0,
116 1,
117 &byData
118 );
119}
120
Forest Bond92b96792009-06-13 07:38:31 -0400121/*
122 * Description:
123 * Set the Key by MISCFIFO
124 *
125 * Parameters:
126 * In:
127 * dwIoBase - Base Address for MAC
128 *
129 * Out:
130 * none
131 *
132 * Return Value: none
133 *
134 */
Malcolm Priestley98583c02012-12-10 22:01:23 +0000135void MACvSetKeyEntry(struct vnt_private *pDevice, u16 wKeyCtl, u32 uEntryIdx,
136 u32 uKeyIdx, u8 *pbyAddr, u32 *pdwKey)
Forest Bond92b96792009-06-13 07:38:31 -0400137{
Malcolm Priestley98583c02012-12-10 22:01:23 +0000138 u8 *pbyKey;
139 u16 wOffset;
140 u32 dwData1, dwData2;
141 int ii;
142 u8 pbyData[24];
Forest Bond92b96792009-06-13 07:38:31 -0400143
Malcolm Priestley14c5ef52013-01-17 23:19:37 +0000144 if (pDevice->byLocalID <= MAC_REVISION_A1)
145 if (pDevice->vnt_mgmt.byCSSPK == KEY_CTL_CCMP)
146 return;
Forest Bond92b96792009-06-13 07:38:31 -0400147
148 wOffset = MISCFIFO_KEYETRY0;
149 wOffset += (uEntryIdx * MISCFIFO_KEYENTRYSIZE);
150
151 dwData1 = 0;
152 dwData1 |= wKeyCtl;
153 dwData1 <<= 16;
154 dwData1 |= MAKEWORD(*(pbyAddr+4), *(pbyAddr+5));
155
Malcolm Priestleyb4dc03a2012-11-11 15:45:52 +0000156 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"1. wOffset: %d, Data: %X,"\
157 " KeyCtl:%X\n", wOffset, dwData1, wKeyCtl);
Forest Bond92b96792009-06-13 07:38:31 -0400158
Forest Bond92b96792009-06-13 07:38:31 -0400159 dwData2 = 0;
160 dwData2 |= *(pbyAddr+3);
161 dwData2 <<= 8;
162 dwData2 |= *(pbyAddr+2);
163 dwData2 <<= 8;
164 dwData2 |= *(pbyAddr+1);
165 dwData2 <<= 8;
166 dwData2 |= *(pbyAddr+0);
167
Malcolm Priestleyb4dc03a2012-11-11 15:45:52 +0000168 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"2. wOffset: %d, Data: %X\n",
169 wOffset, dwData2);
Forest Bond92b96792009-06-13 07:38:31 -0400170
Andres Moreb902fbf2013-02-25 20:32:51 -0500171 pbyKey = (u8 *)pdwKey;
Forest Bond92b96792009-06-13 07:38:31 -0400172
Andres Moreb902fbf2013-02-25 20:32:51 -0500173 pbyData[0] = (u8)dwData1;
174 pbyData[1] = (u8)(dwData1>>8);
175 pbyData[2] = (u8)(dwData1>>16);
176 pbyData[3] = (u8)(dwData1>>24);
177 pbyData[4] = (u8)dwData2;
178 pbyData[5] = (u8)(dwData2>>8);
179 pbyData[6] = (u8)(dwData2>>16);
180 pbyData[7] = (u8)(dwData2>>24);
Andres More33d33e422010-05-19 23:50:00 -0300181 for (ii = 8; ii < 24; ii++)
182 pbyData[ii] = *pbyKey++;
Forest Bond92b96792009-06-13 07:38:31 -0400183
184 CONTROLnsRequestOut(pDevice,
185 MESSAGE_TYPE_SETKEY,
186 wOffset,
Andres More3eaca0d2013-02-25 20:32:52 -0500187 (u16)uKeyIdx,
Malcolm Priestley13d8d892013-06-17 22:19:54 +0100188 ARRAY_SIZE(pbyData),
Forest Bond92b96792009-06-13 07:38:31 -0400189 pbyData
190 );
191
Forest Bond92b96792009-06-13 07:38:31 -0400192}
193
Malcolm Priestley98583c02012-12-10 22:01:23 +0000194void MACvRegBitsOff(struct vnt_private *pDevice, u8 byRegOfs, u8 byBits)
Forest Bond92b96792009-06-13 07:38:31 -0400195{
Malcolm Priestley98583c02012-12-10 22:01:23 +0000196 u8 pbyData[2];
Forest Bond92b96792009-06-13 07:38:31 -0400197
198 pbyData[0] = 0;
199 pbyData[1] = byBits;
200
201 CONTROLnsRequestOut(pDevice,
202 MESSAGE_TYPE_WRITE_MASK,
203 byRegOfs,
204 MESSAGE_REQUEST_MACREG,
Malcolm Priestley13d8d892013-06-17 22:19:54 +0100205 ARRAY_SIZE(pbyData),
Forest Bond92b96792009-06-13 07:38:31 -0400206 pbyData
207 );
208}
209
Malcolm Priestley98583c02012-12-10 22:01:23 +0000210void MACvRegBitsOn(struct vnt_private *pDevice, u8 byRegOfs, u8 byBits)
Forest Bond92b96792009-06-13 07:38:31 -0400211{
Malcolm Priestley98583c02012-12-10 22:01:23 +0000212 u8 pbyData[2];
Forest Bond92b96792009-06-13 07:38:31 -0400213
Forest Bond92b96792009-06-13 07:38:31 -0400214 pbyData[0] = byBits;
215 pbyData[1] = byBits;
216
217 CONTROLnsRequestOut(pDevice,
218 MESSAGE_TYPE_WRITE_MASK,
219 byRegOfs,
220 MESSAGE_REQUEST_MACREG,
Malcolm Priestley13d8d892013-06-17 22:19:54 +0100221 ARRAY_SIZE(pbyData),
Forest Bond92b96792009-06-13 07:38:31 -0400222 pbyData
223 );
224}
225
Malcolm Priestley98583c02012-12-10 22:01:23 +0000226void MACvWriteWord(struct vnt_private *pDevice, u8 byRegOfs, u16 wData)
Forest Bond92b96792009-06-13 07:38:31 -0400227{
Malcolm Priestley98583c02012-12-10 22:01:23 +0000228 u8 pbyData[2];
Forest Bond92b96792009-06-13 07:38:31 -0400229
Andres Moreb902fbf2013-02-25 20:32:51 -0500230 pbyData[0] = (u8)(wData & 0xff);
231 pbyData[1] = (u8)(wData >> 8);
Forest Bond92b96792009-06-13 07:38:31 -0400232
233 CONTROLnsRequestOut(pDevice,
234 MESSAGE_TYPE_WRITE,
235 byRegOfs,
236 MESSAGE_REQUEST_MACREG,
Malcolm Priestley13d8d892013-06-17 22:19:54 +0100237 ARRAY_SIZE(pbyData),
Forest Bond92b96792009-06-13 07:38:31 -0400238 pbyData
239 );
240
241}
242
Malcolm Priestley98583c02012-12-10 22:01:23 +0000243void MACvWriteBSSIDAddress(struct vnt_private *pDevice, u8 *pbyEtherAddr)
Forest Bond92b96792009-06-13 07:38:31 -0400244{
Malcolm Priestley98583c02012-12-10 22:01:23 +0000245 u8 pbyData[6];
Forest Bond92b96792009-06-13 07:38:31 -0400246
Andres Moreb902fbf2013-02-25 20:32:51 -0500247 pbyData[0] = *((u8 *)pbyEtherAddr);
248 pbyData[1] = *((u8 *)pbyEtherAddr+1);
249 pbyData[2] = *((u8 *)pbyEtherAddr+2);
250 pbyData[3] = *((u8 *)pbyEtherAddr+3);
251 pbyData[4] = *((u8 *)pbyEtherAddr+4);
252 pbyData[5] = *((u8 *)pbyEtherAddr+5);
Forest Bond92b96792009-06-13 07:38:31 -0400253
254 CONTROLnsRequestOut(pDevice,
255 MESSAGE_TYPE_WRITE,
256 MAC_REG_BSSID0,
257 MESSAGE_REQUEST_MACREG,
Malcolm Priestley13d8d892013-06-17 22:19:54 +0100258 ARRAY_SIZE(pbyData),
Forest Bond92b96792009-06-13 07:38:31 -0400259 pbyData
260 );
261}
262
Malcolm Priestley98583c02012-12-10 22:01:23 +0000263void MACvEnableProtectMD(struct vnt_private *pDevice)
Forest Bond92b96792009-06-13 07:38:31 -0400264{
Malcolm Priestley98583c02012-12-10 22:01:23 +0000265 u8 pbyData[2];
Forest Bond92b96792009-06-13 07:38:31 -0400266
Forest Bond92b96792009-06-13 07:38:31 -0400267 pbyData[0] = EnCFG_ProtectMd;
268 pbyData[1] = EnCFG_ProtectMd;
269
270 CONTROLnsRequestOut(pDevice,
271 MESSAGE_TYPE_WRITE_MASK,
272 MAC_REG_ENCFG0,
273 MESSAGE_REQUEST_MACREG,
Malcolm Priestley13d8d892013-06-17 22:19:54 +0100274 ARRAY_SIZE(pbyData),
Forest Bond92b96792009-06-13 07:38:31 -0400275 pbyData
276 );
277}
278
Malcolm Priestley98583c02012-12-10 22:01:23 +0000279void MACvDisableProtectMD(struct vnt_private *pDevice)
Forest Bond92b96792009-06-13 07:38:31 -0400280{
Malcolm Priestley98583c02012-12-10 22:01:23 +0000281 u8 pbyData[2];
Forest Bond92b96792009-06-13 07:38:31 -0400282
Forest Bond92b96792009-06-13 07:38:31 -0400283 pbyData[0] = 0;
284 pbyData[1] = EnCFG_ProtectMd;
285
286 CONTROLnsRequestOut(pDevice,
287 MESSAGE_TYPE_WRITE_MASK,
288 MAC_REG_ENCFG0,
289 MESSAGE_REQUEST_MACREG,
Malcolm Priestley13d8d892013-06-17 22:19:54 +0100290 ARRAY_SIZE(pbyData),
Forest Bond92b96792009-06-13 07:38:31 -0400291 pbyData
292 );
293}
294
Malcolm Priestley98583c02012-12-10 22:01:23 +0000295void MACvEnableBarkerPreambleMd(struct vnt_private *pDevice)
Forest Bond92b96792009-06-13 07:38:31 -0400296{
Malcolm Priestley98583c02012-12-10 22:01:23 +0000297 u8 pbyData[2];
Forest Bond92b96792009-06-13 07:38:31 -0400298
Forest Bond92b96792009-06-13 07:38:31 -0400299 pbyData[0] = EnCFG_BarkerPream;
300 pbyData[1] = EnCFG_BarkerPream;
301
302 CONTROLnsRequestOut(pDevice,
303 MESSAGE_TYPE_WRITE_MASK,
304 MAC_REG_ENCFG2,
305 MESSAGE_REQUEST_MACREG,
Malcolm Priestley13d8d892013-06-17 22:19:54 +0100306 ARRAY_SIZE(pbyData),
Forest Bond92b96792009-06-13 07:38:31 -0400307 pbyData
308 );
309}
310
Malcolm Priestley98583c02012-12-10 22:01:23 +0000311void MACvDisableBarkerPreambleMd(struct vnt_private *pDevice)
Forest Bond92b96792009-06-13 07:38:31 -0400312{
Malcolm Priestley98583c02012-12-10 22:01:23 +0000313 u8 pbyData[2];
Forest Bond92b96792009-06-13 07:38:31 -0400314
Forest Bond92b96792009-06-13 07:38:31 -0400315 pbyData[0] = 0;
316 pbyData[1] = EnCFG_BarkerPream;
317
318 CONTROLnsRequestOut(pDevice,
319 MESSAGE_TYPE_WRITE_MASK,
320 MAC_REG_ENCFG2,
321 MESSAGE_REQUEST_MACREG,
Malcolm Priestley13d8d892013-06-17 22:19:54 +0100322 ARRAY_SIZE(pbyData),
Forest Bond92b96792009-06-13 07:38:31 -0400323 pbyData
324 );
325}
326
Malcolm Priestley98583c02012-12-10 22:01:23 +0000327void MACvWriteBeaconInterval(struct vnt_private *pDevice, u16 wInterval)
Forest Bond92b96792009-06-13 07:38:31 -0400328{
Malcolm Priestley98583c02012-12-10 22:01:23 +0000329 u8 pbyData[2];
Forest Bond92b96792009-06-13 07:38:31 -0400330
Malcolm Priestley98583c02012-12-10 22:01:23 +0000331 pbyData[0] = (u8)(wInterval & 0xff);
332 pbyData[1] = (u8)(wInterval >> 8);
Forest Bond92b96792009-06-13 07:38:31 -0400333
334 CONTROLnsRequestOut(pDevice,
Clelia V. Korolb411f122010-09-16 15:00:19 -0300335 MESSAGE_TYPE_WRITE,
336 MAC_REG_BI,
337 MESSAGE_REQUEST_MACREG,
Malcolm Priestley13d8d892013-06-17 22:19:54 +0100338 ARRAY_SIZE(pbyData),
Clelia V. Korolb411f122010-09-16 15:00:19 -0300339 pbyData
340 );
Forest Bond92b96792009-06-13 07:38:31 -0400341}