blob: 7783a37bff946c5070072b06dbf898e0546dc833 [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 Priestleye836e422014-05-23 18:00:04 +0100105void MACvDisableKeyEntry(struct vnt_private *priv, u8 entry_idx)
Forest Bond92b96792009-06-13 07:38:31 -0400106{
Malcolm Priestleye836e422014-05-23 18:00:04 +0100107 CONTROLnsRequestOut(priv, MESSAGE_TYPE_CLRKEYENTRY, 0, 0,
108 sizeof(entry_idx), &entry_idx);
Forest Bond92b96792009-06-13 07:38:31 -0400109}
110
Forest Bond92b96792009-06-13 07:38:31 -0400111/*
112 * Description:
113 * Set the Key by MISCFIFO
114 *
115 * Parameters:
116 * In:
117 * dwIoBase - Base Address for MAC
118 *
119 * Out:
120 * none
121 *
122 * Return Value: none
123 *
124 */
Malcolm Priestley98583c02012-12-10 22:01:23 +0000125void MACvSetKeyEntry(struct vnt_private *pDevice, u16 wKeyCtl, u32 uEntryIdx,
126 u32 uKeyIdx, u8 *pbyAddr, u32 *pdwKey)
Forest Bond92b96792009-06-13 07:38:31 -0400127{
Malcolm Priestley98583c02012-12-10 22:01:23 +0000128 u8 *pbyKey;
129 u16 wOffset;
130 u32 dwData1, dwData2;
131 int ii;
132 u8 pbyData[24];
Forest Bond92b96792009-06-13 07:38:31 -0400133
Malcolm Priestley14c5ef52013-01-17 23:19:37 +0000134 if (pDevice->byLocalID <= MAC_REVISION_A1)
135 if (pDevice->vnt_mgmt.byCSSPK == KEY_CTL_CCMP)
136 return;
Forest Bond92b96792009-06-13 07:38:31 -0400137
138 wOffset = MISCFIFO_KEYETRY0;
139 wOffset += (uEntryIdx * MISCFIFO_KEYENTRYSIZE);
140
141 dwData1 = 0;
142 dwData1 |= wKeyCtl;
143 dwData1 <<= 16;
144 dwData1 |= MAKEWORD(*(pbyAddr+4), *(pbyAddr+5));
145
Malcolm Priestleyb4dc03a2012-11-11 15:45:52 +0000146 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"1. wOffset: %d, Data: %X,"\
147 " KeyCtl:%X\n", wOffset, dwData1, wKeyCtl);
Forest Bond92b96792009-06-13 07:38:31 -0400148
Forest Bond92b96792009-06-13 07:38:31 -0400149 dwData2 = 0;
150 dwData2 |= *(pbyAddr+3);
151 dwData2 <<= 8;
152 dwData2 |= *(pbyAddr+2);
153 dwData2 <<= 8;
154 dwData2 |= *(pbyAddr+1);
155 dwData2 <<= 8;
156 dwData2 |= *(pbyAddr+0);
157
Malcolm Priestleyb4dc03a2012-11-11 15:45:52 +0000158 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"2. wOffset: %d, Data: %X\n",
159 wOffset, dwData2);
Forest Bond92b96792009-06-13 07:38:31 -0400160
Andres Moreb902fbf2013-02-25 20:32:51 -0500161 pbyKey = (u8 *)pdwKey;
Forest Bond92b96792009-06-13 07:38:31 -0400162
Andres Moreb902fbf2013-02-25 20:32:51 -0500163 pbyData[0] = (u8)dwData1;
164 pbyData[1] = (u8)(dwData1>>8);
165 pbyData[2] = (u8)(dwData1>>16);
166 pbyData[3] = (u8)(dwData1>>24);
167 pbyData[4] = (u8)dwData2;
168 pbyData[5] = (u8)(dwData2>>8);
169 pbyData[6] = (u8)(dwData2>>16);
170 pbyData[7] = (u8)(dwData2>>24);
Andres More33d33e422010-05-19 23:50:00 -0300171 for (ii = 8; ii < 24; ii++)
172 pbyData[ii] = *pbyKey++;
Forest Bond92b96792009-06-13 07:38:31 -0400173
174 CONTROLnsRequestOut(pDevice,
175 MESSAGE_TYPE_SETKEY,
176 wOffset,
Andres More3eaca0d2013-02-25 20:32:52 -0500177 (u16)uKeyIdx,
Malcolm Priestley13d8d892013-06-17 22:19:54 +0100178 ARRAY_SIZE(pbyData),
Forest Bond92b96792009-06-13 07:38:31 -0400179 pbyData
180 );
181
Forest Bond92b96792009-06-13 07:38:31 -0400182}
183
Malcolm Priestleyf22f7692014-05-23 18:00:05 +0100184void MACvRegBitsOff(struct vnt_private *priv, u8 reg_ofs, u8 bits)
Forest Bond92b96792009-06-13 07:38:31 -0400185{
Malcolm Priestleyf22f7692014-05-23 18:00:05 +0100186 u8 data[2];
Forest Bond92b96792009-06-13 07:38:31 -0400187
Malcolm Priestleyf22f7692014-05-23 18:00:05 +0100188 data[0] = 0;
189 data[1] = bits;
Forest Bond92b96792009-06-13 07:38:31 -0400190
Malcolm Priestleyf22f7692014-05-23 18:00:05 +0100191 CONTROLnsRequestOut(priv, MESSAGE_TYPE_WRITE_MASK,
192 reg_ofs, MESSAGE_REQUEST_MACREG, ARRAY_SIZE(data), data);
Forest Bond92b96792009-06-13 07:38:31 -0400193}
194
Malcolm Priestley8fda36c2014-05-23 18:00:06 +0100195void MACvRegBitsOn(struct vnt_private *priv, u8 reg_ofs, u8 bits)
Forest Bond92b96792009-06-13 07:38:31 -0400196{
Malcolm Priestley8fda36c2014-05-23 18:00:06 +0100197 u8 data[2];
Forest Bond92b96792009-06-13 07:38:31 -0400198
Malcolm Priestley8fda36c2014-05-23 18:00:06 +0100199 data[0] = bits;
200 data[1] = bits;
Forest Bond92b96792009-06-13 07:38:31 -0400201
Malcolm Priestley8fda36c2014-05-23 18:00:06 +0100202 CONTROLnsRequestOut(priv, MESSAGE_TYPE_WRITE_MASK,
203 reg_ofs, MESSAGE_REQUEST_MACREG, ARRAY_SIZE(data), data);
Forest Bond92b96792009-06-13 07:38:31 -0400204}
205
Malcolm Priestleye1cc91f2014-05-23 18:00:07 +0100206void MACvWriteWord(struct vnt_private *priv, u8 reg_ofs, u16 word)
Forest Bond92b96792009-06-13 07:38:31 -0400207{
Malcolm Priestleye1cc91f2014-05-23 18:00:07 +0100208 u8 data[2];
Forest Bond92b96792009-06-13 07:38:31 -0400209
Malcolm Priestleye1cc91f2014-05-23 18:00:07 +0100210 data[0] = (u8)(word & 0xff);
211 data[1] = (u8)(word >> 8);
Forest Bond92b96792009-06-13 07:38:31 -0400212
Malcolm Priestleye1cc91f2014-05-23 18:00:07 +0100213 CONTROLnsRequestOut(priv, MESSAGE_TYPE_WRITE,
214 reg_ofs, MESSAGE_REQUEST_MACREG, ARRAY_SIZE(data), data);
Forest Bond92b96792009-06-13 07:38:31 -0400215}
216
Malcolm Priestley11952002014-05-23 18:00:09 +0100217void MACvWriteBSSIDAddress(struct vnt_private *priv, u8 *addr)
Forest Bond92b96792009-06-13 07:38:31 -0400218{
Malcolm Priestley11952002014-05-23 18:00:09 +0100219 CONTROLnsRequestOut(priv, MESSAGE_TYPE_WRITE, MAC_REG_BSSID0,
220 MESSAGE_REQUEST_MACREG, ETH_ALEN, addr);
Forest Bond92b96792009-06-13 07:38:31 -0400221}
222
Malcolm Priestleya7ecb9d2014-05-23 18:00:10 +0100223void MACvEnableProtectMD(struct vnt_private *priv)
Forest Bond92b96792009-06-13 07:38:31 -0400224{
Malcolm Priestleya7ecb9d2014-05-23 18:00:10 +0100225 u8 data[2];
Forest Bond92b96792009-06-13 07:38:31 -0400226
Malcolm Priestleya7ecb9d2014-05-23 18:00:10 +0100227 data[0] = EnCFG_ProtectMd;
228 data[1] = EnCFG_ProtectMd;
Forest Bond92b96792009-06-13 07:38:31 -0400229
Malcolm Priestleya7ecb9d2014-05-23 18:00:10 +0100230 CONTROLnsRequestOut(priv, MESSAGE_TYPE_WRITE_MASK,
231 MAC_REG_ENCFG0, MESSAGE_REQUEST_MACREG, ARRAY_SIZE(data), data);
Forest Bond92b96792009-06-13 07:38:31 -0400232}
233
Malcolm Priestley98583c02012-12-10 22:01:23 +0000234void MACvDisableProtectMD(struct vnt_private *pDevice)
Forest Bond92b96792009-06-13 07:38:31 -0400235{
Malcolm Priestley98583c02012-12-10 22:01:23 +0000236 u8 pbyData[2];
Forest Bond92b96792009-06-13 07:38:31 -0400237
Forest Bond92b96792009-06-13 07:38:31 -0400238 pbyData[0] = 0;
239 pbyData[1] = EnCFG_ProtectMd;
240
241 CONTROLnsRequestOut(pDevice,
242 MESSAGE_TYPE_WRITE_MASK,
243 MAC_REG_ENCFG0,
244 MESSAGE_REQUEST_MACREG,
Malcolm Priestley13d8d892013-06-17 22:19:54 +0100245 ARRAY_SIZE(pbyData),
Forest Bond92b96792009-06-13 07:38:31 -0400246 pbyData
247 );
248}
249
Malcolm Priestley98583c02012-12-10 22:01:23 +0000250void MACvEnableBarkerPreambleMd(struct vnt_private *pDevice)
Forest Bond92b96792009-06-13 07:38:31 -0400251{
Malcolm Priestley98583c02012-12-10 22:01:23 +0000252 u8 pbyData[2];
Forest Bond92b96792009-06-13 07:38:31 -0400253
Forest Bond92b96792009-06-13 07:38:31 -0400254 pbyData[0] = EnCFG_BarkerPream;
255 pbyData[1] = EnCFG_BarkerPream;
256
257 CONTROLnsRequestOut(pDevice,
258 MESSAGE_TYPE_WRITE_MASK,
259 MAC_REG_ENCFG2,
260 MESSAGE_REQUEST_MACREG,
Malcolm Priestley13d8d892013-06-17 22:19:54 +0100261 ARRAY_SIZE(pbyData),
Forest Bond92b96792009-06-13 07:38:31 -0400262 pbyData
263 );
264}
265
Malcolm Priestley98583c02012-12-10 22:01:23 +0000266void MACvDisableBarkerPreambleMd(struct vnt_private *pDevice)
Forest Bond92b96792009-06-13 07:38:31 -0400267{
Malcolm Priestley98583c02012-12-10 22:01:23 +0000268 u8 pbyData[2];
Forest Bond92b96792009-06-13 07:38:31 -0400269
Forest Bond92b96792009-06-13 07:38:31 -0400270 pbyData[0] = 0;
271 pbyData[1] = EnCFG_BarkerPream;
272
273 CONTROLnsRequestOut(pDevice,
274 MESSAGE_TYPE_WRITE_MASK,
275 MAC_REG_ENCFG2,
276 MESSAGE_REQUEST_MACREG,
Malcolm Priestley13d8d892013-06-17 22:19:54 +0100277 ARRAY_SIZE(pbyData),
Forest Bond92b96792009-06-13 07:38:31 -0400278 pbyData
279 );
280}
281
Malcolm Priestley98583c02012-12-10 22:01:23 +0000282void MACvWriteBeaconInterval(struct vnt_private *pDevice, u16 wInterval)
Forest Bond92b96792009-06-13 07:38:31 -0400283{
Malcolm Priestley98583c02012-12-10 22:01:23 +0000284 u8 pbyData[2];
Forest Bond92b96792009-06-13 07:38:31 -0400285
Malcolm Priestley98583c02012-12-10 22:01:23 +0000286 pbyData[0] = (u8)(wInterval & 0xff);
287 pbyData[1] = (u8)(wInterval >> 8);
Forest Bond92b96792009-06-13 07:38:31 -0400288
289 CONTROLnsRequestOut(pDevice,
Clelia V. Korolb411f122010-09-16 15:00:19 -0300290 MESSAGE_TYPE_WRITE,
291 MAC_REG_BI,
292 MESSAGE_REQUEST_MACREG,
Malcolm Priestley13d8d892013-06-17 22:19:54 +0100293 ARRAY_SIZE(pbyData),
Clelia V. Korolb411f122010-09-16 15:00:19 -0300294 pbyData
295 );
Forest Bond92b96792009-06-13 07:38:31 -0400296}