mac.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481
  1. /*
  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. #include "tmacro.h"
  33. #include "tether.h"
  34. #include "desc.h"
  35. #include "mac.h"
  36. #include "80211hdr.h"
  37. #include "rndis.h"
  38. #include "control.h"
  39. /*--------------------- Static Definitions -------------------------*/
  40. //static int msglevel =MSG_LEVEL_DEBUG;
  41. static int msglevel =MSG_LEVEL_INFO;
  42. /*--------------------- Static Classes ----------------------------*/
  43. /*--------------------- Static Variables --------------------------*/
  44. /*--------------------- Static Functions --------------------------*/
  45. /*--------------------- Export Variables --------------------------*/
  46. /*--------------------- Export Functions --------------------------*/
  47. /*
  48. * Description:
  49. * Set this hash index into multicast address register bit
  50. *
  51. * Parameters:
  52. * In:
  53. * byHashIdx - Hash index to set
  54. * Out:
  55. * none
  56. *
  57. * Return Value: none
  58. *
  59. */
  60. void MACvSetMultiAddrByHash (PSDevice pDevice, BYTE byHashIdx)
  61. {
  62. unsigned int uByteIdx;
  63. BYTE byBitMask;
  64. BYTE pbyData[2];
  65. // calculate byte position
  66. uByteIdx = byHashIdx / 8;
  67. // calculate bit position
  68. byBitMask = 1;
  69. byBitMask <<= (byHashIdx % 8);
  70. // turn on the bit
  71. pbyData[0] = byBitMask;
  72. pbyData[1] = byBitMask;
  73. CONTROLnsRequestOut(pDevice,
  74. MESSAGE_TYPE_WRITE_MASK,
  75. (WORD) (MAC_REG_MAR0 + uByteIdx),
  76. MESSAGE_REQUEST_MACREG,
  77. 2,
  78. pbyData);
  79. }
  80. /*
  81. * Description:
  82. * Write MAC Multicast Address Mask
  83. *
  84. * Parameters:
  85. * In:
  86. * uByteidx - Index of Mask
  87. * byData - Mask Value to write
  88. * Out:
  89. * none
  90. *
  91. * Return Value: none
  92. *
  93. */
  94. void MACvWriteMultiAddr(PSDevice pDevice, unsigned int uByteIdx, BYTE byData)
  95. {
  96. BYTE byData1;
  97. byData1 = byData;
  98. CONTROLnsRequestOut(pDevice,
  99. MESSAGE_TYPE_WRITE,
  100. (WORD) (MAC_REG_MAR0 + uByteIdx),
  101. MESSAGE_REQUEST_MACREG,
  102. 1,
  103. &byData1);
  104. }
  105. /*
  106. * Description:
  107. * Shut Down MAC
  108. *
  109. * Parameters:
  110. * In:
  111. * Out:
  112. * none
  113. *
  114. * Return Value: TRUE if success; otherwise FALSE
  115. *
  116. */
  117. BOOL MACbShutdown (PSDevice pDevice)
  118. {
  119. CONTROLnsRequestOutAsyn(pDevice,
  120. MESSAGE_TYPE_MACSHUTDOWN,
  121. 0,
  122. 0,
  123. 0,
  124. NULL
  125. );
  126. return TRUE;
  127. }
  128. void MACvSetBBType(PSDevice pDevice,BYTE byType)
  129. {
  130. BYTE pbyData[2];
  131. pbyData[0] = byType;
  132. pbyData[1] = EnCFG_BBType_MASK;
  133. CONTROLnsRequestOut(pDevice,
  134. MESSAGE_TYPE_WRITE_MASK,
  135. MAC_REG_ENCFG0,
  136. MESSAGE_REQUEST_MACREG,
  137. 2,
  138. pbyData
  139. );
  140. }
  141. void MACvSetMISCFifo (PSDevice pDevice, WORD wOffset, DWORD dwData)
  142. {
  143. BYTE pbyData[4];
  144. if (wOffset > 273)
  145. return;
  146. pbyData[0] = (BYTE)dwData;
  147. pbyData[1] = (BYTE)(dwData>>8);
  148. pbyData[2] = (BYTE)(dwData>>16);
  149. pbyData[3] = (BYTE)(dwData>>24);
  150. CONTROLnsRequestOut(pDevice,
  151. MESSAGE_TYPE_WRITE_MISCFF,
  152. wOffset,
  153. 0,
  154. 4,
  155. pbyData
  156. );
  157. }
  158. /*
  159. * Description:
  160. * Disable the Key Entry by MISCFIFO
  161. *
  162. * Parameters:
  163. * In:
  164. * dwIoBase - Base Address for MAC
  165. *
  166. * Out:
  167. * none
  168. *
  169. * Return Value: none
  170. *
  171. */
  172. void MACvDisableKeyEntry(PSDevice pDevice, unsigned int uEntryIdx)
  173. {
  174. WORD wOffset;
  175. BYTE byData;
  176. byData = (BYTE) uEntryIdx;
  177. wOffset = MISCFIFO_KEYETRY0;
  178. wOffset += (uEntryIdx * MISCFIFO_KEYENTRYSIZE);
  179. //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset);
  180. //VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, 0);
  181. //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
  182. //issue write misc fifo command to device
  183. CONTROLnsRequestOut(pDevice,
  184. MESSAGE_TYPE_CLRKEYENTRY,
  185. 0,
  186. 0,
  187. 1,
  188. &byData
  189. );
  190. }
  191. /*
  192. * Description:
  193. * Set the Key by MISCFIFO
  194. *
  195. * Parameters:
  196. * In:
  197. * dwIoBase - Base Address for MAC
  198. *
  199. * Out:
  200. * none
  201. *
  202. * Return Value: none
  203. *
  204. */
  205. void MACvSetKeyEntry(PSDevice pDevice, WORD wKeyCtl,
  206. unsigned int uEntryIdx, unsigned int uKeyIdx,
  207. PBYTE pbyAddr, PDWORD pdwKey)
  208. {
  209. PBYTE pbyKey;
  210. WORD wOffset;
  211. DWORD dwData1,dwData2;
  212. int ii;
  213. BYTE pbyData[24];
  214. if ( pDevice->byLocalID <= MAC_REVISION_A1 ) {
  215. if ( pDevice->sMgmtObj.byCSSPK == KEY_CTL_CCMP )
  216. return;
  217. }
  218. wOffset = MISCFIFO_KEYETRY0;
  219. wOffset += (uEntryIdx * MISCFIFO_KEYENTRYSIZE);
  220. dwData1 = 0;
  221. dwData1 |= wKeyCtl;
  222. dwData1 <<= 16;
  223. dwData1 |= MAKEWORD(*(pbyAddr+4), *(pbyAddr+5));
  224. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"1. wOffset: %d, Data: %lX, KeyCtl:%X\n", wOffset, dwData1, wKeyCtl);
  225. //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset);
  226. //VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, dwData);
  227. //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
  228. //wOffset++;
  229. dwData2 = 0;
  230. dwData2 |= *(pbyAddr+3);
  231. dwData2 <<= 8;
  232. dwData2 |= *(pbyAddr+2);
  233. dwData2 <<= 8;
  234. dwData2 |= *(pbyAddr+1);
  235. dwData2 <<= 8;
  236. dwData2 |= *(pbyAddr+0);
  237. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"2. wOffset: %d, Data: %lX\n", wOffset, dwData2);
  238. //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset);
  239. //VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, dwData);
  240. //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
  241. //wOffset++;
  242. //wOffset += (uKeyIdx * 4);
  243. /* for (ii=0;ii<4;ii++) {
  244. // alway push 128 bits
  245. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"3.(%d) wOffset: %d, Data: %lX\n", ii, wOffset+ii, *pdwKey);
  246. VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset+ii);
  247. VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, *pdwKey++);
  248. VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
  249. }
  250. */
  251. pbyKey = (PBYTE)pdwKey;
  252. pbyData[0] = (BYTE)dwData1;
  253. pbyData[1] = (BYTE)(dwData1>>8);
  254. pbyData[2] = (BYTE)(dwData1>>16);
  255. pbyData[3] = (BYTE)(dwData1>>24);
  256. pbyData[4] = (BYTE)dwData2;
  257. pbyData[5] = (BYTE)(dwData2>>8);
  258. pbyData[6] = (BYTE)(dwData2>>16);
  259. pbyData[7] = (BYTE)(dwData2>>24);
  260. for (ii = 8; ii < 24; ii++)
  261. pbyData[ii] = *pbyKey++;
  262. CONTROLnsRequestOut(pDevice,
  263. MESSAGE_TYPE_SETKEY,
  264. wOffset,
  265. (WORD)uKeyIdx,
  266. 24,
  267. pbyData
  268. );
  269. }
  270. void MACvRegBitsOff(PSDevice pDevice, BYTE byRegOfs, BYTE byBits)
  271. {
  272. BYTE pbyData[2];
  273. pbyData[0] = 0;
  274. pbyData[1] = byBits;
  275. CONTROLnsRequestOut(pDevice,
  276. MESSAGE_TYPE_WRITE_MASK,
  277. byRegOfs,
  278. MESSAGE_REQUEST_MACREG,
  279. 2,
  280. pbyData
  281. );
  282. }
  283. void MACvRegBitsOn(PSDevice pDevice, BYTE byRegOfs, BYTE byBits)
  284. {
  285. BYTE pbyData[2];
  286. pbyData[0] = byBits;
  287. pbyData[1] = byBits;
  288. CONTROLnsRequestOut(pDevice,
  289. MESSAGE_TYPE_WRITE_MASK,
  290. byRegOfs,
  291. MESSAGE_REQUEST_MACREG,
  292. 2,
  293. pbyData
  294. );
  295. }
  296. void MACvWriteWord(PSDevice pDevice, BYTE byRegOfs, WORD wData)
  297. {
  298. BYTE pbyData[2];
  299. pbyData[0] = (BYTE)(wData & 0xff);
  300. pbyData[1] = (BYTE)(wData >> 8);
  301. CONTROLnsRequestOut(pDevice,
  302. MESSAGE_TYPE_WRITE,
  303. byRegOfs,
  304. MESSAGE_REQUEST_MACREG,
  305. 2,
  306. pbyData
  307. );
  308. }
  309. void MACvWriteBSSIDAddress(PSDevice pDevice, PBYTE pbyEtherAddr)
  310. {
  311. BYTE pbyData[6];
  312. pbyData[0] = *((PBYTE)pbyEtherAddr);
  313. pbyData[1] = *((PBYTE)pbyEtherAddr+1);
  314. pbyData[2] = *((PBYTE)pbyEtherAddr+2);
  315. pbyData[3] = *((PBYTE)pbyEtherAddr+3);
  316. pbyData[4] = *((PBYTE)pbyEtherAddr+4);
  317. pbyData[5] = *((PBYTE)pbyEtherAddr+5);
  318. CONTROLnsRequestOut(pDevice,
  319. MESSAGE_TYPE_WRITE,
  320. MAC_REG_BSSID0,
  321. MESSAGE_REQUEST_MACREG,
  322. 6,
  323. pbyData
  324. );
  325. }
  326. void MACvEnableProtectMD(PSDevice pDevice)
  327. {
  328. BYTE pbyData[2];
  329. pbyData[0] = EnCFG_ProtectMd;
  330. pbyData[1] = EnCFG_ProtectMd;
  331. CONTROLnsRequestOut(pDevice,
  332. MESSAGE_TYPE_WRITE_MASK,
  333. MAC_REG_ENCFG0,
  334. MESSAGE_REQUEST_MACREG,
  335. 2,
  336. pbyData
  337. );
  338. }
  339. void MACvDisableProtectMD(PSDevice pDevice)
  340. {
  341. BYTE pbyData[2];
  342. pbyData[0] = 0;
  343. pbyData[1] = EnCFG_ProtectMd;
  344. CONTROLnsRequestOut(pDevice,
  345. MESSAGE_TYPE_WRITE_MASK,
  346. MAC_REG_ENCFG0,
  347. MESSAGE_REQUEST_MACREG,
  348. 2,
  349. pbyData
  350. );
  351. }
  352. void MACvEnableBarkerPreambleMd(PSDevice pDevice)
  353. {
  354. BYTE pbyData[2];
  355. pbyData[0] = EnCFG_BarkerPream;
  356. pbyData[1] = EnCFG_BarkerPream;
  357. CONTROLnsRequestOut(pDevice,
  358. MESSAGE_TYPE_WRITE_MASK,
  359. MAC_REG_ENCFG2,
  360. MESSAGE_REQUEST_MACREG,
  361. 2,
  362. pbyData
  363. );
  364. }
  365. void MACvDisableBarkerPreambleMd(PSDevice pDevice)
  366. {
  367. BYTE pbyData[2];
  368. pbyData[0] = 0;
  369. pbyData[1] = EnCFG_BarkerPream;
  370. CONTROLnsRequestOut(pDevice,
  371. MESSAGE_TYPE_WRITE_MASK,
  372. MAC_REG_ENCFG2,
  373. MESSAGE_REQUEST_MACREG,
  374. 2,
  375. pbyData
  376. );
  377. }
  378. void MACvWriteBeaconInterval(PSDevice pDevice, WORD wInterval)
  379. {
  380. BYTE pbyData[2];
  381. pbyData[0] = (BYTE) (wInterval & 0xff);
  382. pbyData[1] = (BYTE) (wInterval >> 8);
  383. CONTROLnsRequestOut(pDevice,
  384. MESSAGE_TYPE_WRITE,
  385. MAC_REG_BI,
  386. MESSAGE_REQUEST_MACREG,
  387. 2,
  388. pbyData
  389. );
  390. }