mac.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891
  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. * MACbIsRegBitsOn - Test if All test Bits On
  30. * MACbIsRegBitsOff - Test if All test Bits Off
  31. * MACbIsIntDisable - Test if MAC interrupt disable
  32. * MACvSetShortRetryLimit - Set 802.11 Short Retry limit
  33. * MACvSetLongRetryLimit - Set 802.11 Long Retry limit
  34. * MACvSetLoopbackMode - Set MAC Loopback Mode
  35. * MACvSaveContext - Save Context of MAC Registers
  36. * MACvRestoreContext - Restore Context of MAC Registers
  37. * MACbSoftwareReset - Software Reset MAC
  38. * MACbSafeRxOff - Turn Off MAC Rx
  39. * MACbSafeTxOff - Turn Off MAC Tx
  40. * MACbSafeStop - Stop MAC function
  41. * MACbShutdown - Shut down MAC
  42. * MACvInitialize - Initialize MAC
  43. * MACvSetCurrRxDescAddr - Set Rx Descriptors Address
  44. * MACvSetCurrTx0DescAddr - Set Tx0 Descriptors Address
  45. * MACvSetCurrTx1DescAddr - Set Tx1 Descriptors Address
  46. * MACvTimer0MicroSDelay - Micro Second Delay Loop by MAC
  47. *
  48. * Revision History:
  49. * 08-22-2003 Kyle Hsu : Porting MAC functions from sim53
  50. * 09-03-2003 Bryan YC Fan : Add MACvClearBusSusInd()& MACvEnableBusSusEn()
  51. * 09-18-2003 Jerry Chen : Add MACvSetKeyEntry & MACvDisableKeyEntry
  52. *
  53. */
  54. #include "tmacro.h"
  55. #include "mac.h"
  56. /*
  57. * Description:
  58. * Test if all test bits on
  59. *
  60. * Parameters:
  61. * In:
  62. * dwIoBase - Base Address for MAC
  63. * byRegOfs - Offset of MAC Register
  64. * byTestBits - Test bits
  65. * Out:
  66. * none
  67. *
  68. * Return Value: true if all test bits On; otherwise false
  69. *
  70. */
  71. bool MACbIsRegBitsOn(void __iomem *dwIoBase, unsigned char byRegOfs,
  72. unsigned char byTestBits)
  73. {
  74. unsigned char byData;
  75. VNSvInPortB(dwIoBase + byRegOfs, &byData);
  76. return (byData & byTestBits) == byTestBits;
  77. }
  78. /*
  79. * Description:
  80. * Test if all test bits off
  81. *
  82. * Parameters:
  83. * In:
  84. * dwIoBase - Base Address for MAC
  85. * byRegOfs - Offset of MAC Register
  86. * byTestBits - Test bits
  87. * Out:
  88. * none
  89. *
  90. * Return Value: true if all test bits Off; otherwise false
  91. *
  92. */
  93. bool MACbIsRegBitsOff(void __iomem *dwIoBase, unsigned char byRegOfs,
  94. unsigned char byTestBits)
  95. {
  96. unsigned char byData;
  97. VNSvInPortB(dwIoBase + byRegOfs, &byData);
  98. return !(byData & byTestBits);
  99. }
  100. /*
  101. * Description:
  102. * Test if MAC interrupt disable
  103. *
  104. * Parameters:
  105. * In:
  106. * dwIoBase - Base Address for MAC
  107. * Out:
  108. * none
  109. *
  110. * Return Value: true if interrupt is disable; otherwise false
  111. *
  112. */
  113. bool MACbIsIntDisable(void __iomem *dwIoBase)
  114. {
  115. unsigned long dwData;
  116. VNSvInPortD(dwIoBase + MAC_REG_IMR, &dwData);
  117. if (dwData != 0)
  118. return false;
  119. return true;
  120. }
  121. /*
  122. * Description:
  123. * Set 802.11 Short Retry Limit
  124. *
  125. * Parameters:
  126. * In:
  127. * dwIoBase - Base Address for MAC
  128. * byRetryLimit- Retry Limit
  129. * Out:
  130. * none
  131. *
  132. * Return Value: none
  133. *
  134. */
  135. void MACvSetShortRetryLimit(void __iomem *dwIoBase, unsigned char byRetryLimit)
  136. {
  137. /* set SRT */
  138. VNSvOutPortB(dwIoBase + MAC_REG_SRT, byRetryLimit);
  139. }
  140. /*
  141. * Description:
  142. * Set 802.11 Long Retry Limit
  143. *
  144. * Parameters:
  145. * In:
  146. * dwIoBase - Base Address for MAC
  147. * byRetryLimit- Retry Limit
  148. * Out:
  149. * none
  150. *
  151. * Return Value: none
  152. *
  153. */
  154. void MACvSetLongRetryLimit(void __iomem *dwIoBase, unsigned char byRetryLimit)
  155. {
  156. /* set LRT */
  157. VNSvOutPortB(dwIoBase + MAC_REG_LRT, byRetryLimit);
  158. }
  159. /*
  160. * Description:
  161. * Set MAC Loopback mode
  162. *
  163. * Parameters:
  164. * In:
  165. * dwIoBase - Base Address for MAC
  166. * byLoopbackMode - Loopback Mode
  167. * Out:
  168. * none
  169. *
  170. * Return Value: none
  171. *
  172. */
  173. void MACvSetLoopbackMode(void __iomem *dwIoBase, unsigned char byLoopbackMode)
  174. {
  175. unsigned char byOrgValue;
  176. byLoopbackMode <<= 6;
  177. /* set TCR */
  178. VNSvInPortB(dwIoBase + MAC_REG_TEST, &byOrgValue);
  179. byOrgValue = byOrgValue & 0x3F;
  180. byOrgValue = byOrgValue | byLoopbackMode;
  181. VNSvOutPortB(dwIoBase + MAC_REG_TEST, byOrgValue);
  182. }
  183. /*
  184. * Description:
  185. * Save MAC registers to context buffer
  186. *
  187. * Parameters:
  188. * In:
  189. * dwIoBase - Base Address for MAC
  190. * Out:
  191. * pbyCxtBuf - Context buffer
  192. *
  193. * Return Value: none
  194. *
  195. */
  196. void MACvSaveContext(void __iomem *dwIoBase, unsigned char *pbyCxtBuf)
  197. {
  198. int ii;
  199. /* read page0 register */
  200. for (ii = 0; ii < MAC_MAX_CONTEXT_SIZE_PAGE0; ii++)
  201. VNSvInPortB((dwIoBase + ii), (pbyCxtBuf + ii));
  202. MACvSelectPage1(dwIoBase);
  203. /* read page1 register */
  204. for (ii = 0; ii < MAC_MAX_CONTEXT_SIZE_PAGE1; ii++)
  205. VNSvInPortB((dwIoBase + ii),
  206. (pbyCxtBuf + MAC_MAX_CONTEXT_SIZE_PAGE0 + ii));
  207. MACvSelectPage0(dwIoBase);
  208. }
  209. /*
  210. * Description:
  211. * Restore MAC registers from context buffer
  212. *
  213. * Parameters:
  214. * In:
  215. * dwIoBase - Base Address for MAC
  216. * pbyCxtBuf - Context buffer
  217. * Out:
  218. * none
  219. *
  220. * Return Value: none
  221. *
  222. */
  223. void MACvRestoreContext(void __iomem *dwIoBase, unsigned char *pbyCxtBuf)
  224. {
  225. int ii;
  226. MACvSelectPage1(dwIoBase);
  227. /* restore page1 */
  228. for (ii = 0; ii < MAC_MAX_CONTEXT_SIZE_PAGE1; ii++)
  229. VNSvOutPortB((dwIoBase + ii),
  230. *(pbyCxtBuf + MAC_MAX_CONTEXT_SIZE_PAGE0 + ii));
  231. MACvSelectPage0(dwIoBase);
  232. /* restore RCR,TCR,IMR... */
  233. for (ii = MAC_REG_RCR; ii < MAC_REG_ISR; ii++)
  234. VNSvOutPortB(dwIoBase + ii, *(pbyCxtBuf + ii));
  235. /* restore MAC Config. */
  236. for (ii = MAC_REG_LRT; ii < MAC_REG_PAGE1SEL; ii++)
  237. VNSvOutPortB(dwIoBase + ii, *(pbyCxtBuf + ii));
  238. VNSvOutPortB(dwIoBase + MAC_REG_CFG, *(pbyCxtBuf + MAC_REG_CFG));
  239. /* restore PS Config. */
  240. for (ii = MAC_REG_PSCFG; ii < MAC_REG_BBREGCTL; ii++)
  241. VNSvOutPortB(dwIoBase + ii, *(pbyCxtBuf + ii));
  242. /* restore CURR_RX_DESC_ADDR, CURR_TX_DESC_ADDR */
  243. VNSvOutPortD(dwIoBase + MAC_REG_TXDMAPTR0,
  244. *(unsigned long *)(pbyCxtBuf + MAC_REG_TXDMAPTR0));
  245. VNSvOutPortD(dwIoBase + MAC_REG_AC0DMAPTR,
  246. *(unsigned long *)(pbyCxtBuf + MAC_REG_AC0DMAPTR));
  247. VNSvOutPortD(dwIoBase + MAC_REG_BCNDMAPTR,
  248. *(unsigned long *)(pbyCxtBuf + MAC_REG_BCNDMAPTR));
  249. VNSvOutPortD(dwIoBase + MAC_REG_RXDMAPTR0,
  250. *(unsigned long *)(pbyCxtBuf + MAC_REG_RXDMAPTR0));
  251. VNSvOutPortD(dwIoBase + MAC_REG_RXDMAPTR1,
  252. *(unsigned long *)(pbyCxtBuf + MAC_REG_RXDMAPTR1));
  253. }
  254. /*
  255. * Description:
  256. * Software Reset MAC
  257. *
  258. * Parameters:
  259. * In:
  260. * dwIoBase - Base Address for MAC
  261. * Out:
  262. * none
  263. *
  264. * Return Value: true if Reset Success; otherwise false
  265. *
  266. */
  267. bool MACbSoftwareReset(void __iomem *dwIoBase)
  268. {
  269. unsigned char byData;
  270. unsigned short ww;
  271. /* turn on HOSTCR_SOFTRST, just write 0x01 to reset */
  272. VNSvOutPortB(dwIoBase + MAC_REG_HOSTCR, 0x01);
  273. for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
  274. VNSvInPortB(dwIoBase + MAC_REG_HOSTCR, &byData);
  275. if (!(byData & HOSTCR_SOFTRST))
  276. break;
  277. }
  278. if (ww == W_MAX_TIMEOUT)
  279. return false;
  280. return true;
  281. }
  282. /*
  283. * Description:
  284. * save some important register's value, then do reset, then restore register's value
  285. *
  286. * Parameters:
  287. * In:
  288. * dwIoBase - Base Address for MAC
  289. * Out:
  290. * none
  291. *
  292. * Return Value: true if success; otherwise false
  293. *
  294. */
  295. bool MACbSafeSoftwareReset(void __iomem *dwIoBase)
  296. {
  297. unsigned char abyTmpRegData[MAC_MAX_CONTEXT_SIZE_PAGE0+MAC_MAX_CONTEXT_SIZE_PAGE1];
  298. bool bRetVal;
  299. /* PATCH....
  300. * save some important register's value, then do
  301. * reset, then restore register's value
  302. */
  303. /* save MAC context */
  304. MACvSaveContext(dwIoBase, abyTmpRegData);
  305. /* do reset */
  306. bRetVal = MACbSoftwareReset(dwIoBase);
  307. /* restore MAC context, except CR0 */
  308. MACvRestoreContext(dwIoBase, abyTmpRegData);
  309. return bRetVal;
  310. }
  311. /*
  312. * Description:
  313. * Turn Off MAC Rx
  314. *
  315. * Parameters:
  316. * In:
  317. * dwIoBase - Base Address for MAC
  318. * Out:
  319. * none
  320. *
  321. * Return Value: true if success; otherwise false
  322. *
  323. */
  324. bool MACbSafeRxOff(void __iomem *dwIoBase)
  325. {
  326. unsigned short ww;
  327. unsigned long dwData;
  328. unsigned char byData;
  329. /* turn off wow temp for turn off Rx safely */
  330. /* Clear RX DMA0,1 */
  331. VNSvOutPortD(dwIoBase + MAC_REG_RXDMACTL0, DMACTL_CLRRUN);
  332. VNSvOutPortD(dwIoBase + MAC_REG_RXDMACTL1, DMACTL_CLRRUN);
  333. for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
  334. VNSvInPortD(dwIoBase + MAC_REG_RXDMACTL0, &dwData);
  335. if (!(dwData & DMACTL_RUN))
  336. break;
  337. }
  338. if (ww == W_MAX_TIMEOUT) {
  339. pr_debug(" DBG_PORT80(0x10)\n");
  340. return false;
  341. }
  342. for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
  343. VNSvInPortD(dwIoBase + MAC_REG_RXDMACTL1, &dwData);
  344. if (!(dwData & DMACTL_RUN))
  345. break;
  346. }
  347. if (ww == W_MAX_TIMEOUT) {
  348. pr_debug(" DBG_PORT80(0x11)\n");
  349. return false;
  350. }
  351. /* try to safe shutdown RX */
  352. MACvRegBitsOff(dwIoBase, MAC_REG_HOSTCR, HOSTCR_RXON);
  353. /* W_MAX_TIMEOUT is the timeout period */
  354. for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
  355. VNSvInPortB(dwIoBase + MAC_REG_HOSTCR, &byData);
  356. if (!(byData & HOSTCR_RXONST))
  357. break;
  358. }
  359. if (ww == W_MAX_TIMEOUT) {
  360. pr_debug(" DBG_PORT80(0x12)\n");
  361. return false;
  362. }
  363. return true;
  364. }
  365. /*
  366. * Description:
  367. * Turn Off MAC Tx
  368. *
  369. * Parameters:
  370. * In:
  371. * dwIoBase - Base Address for MAC
  372. * Out:
  373. * none
  374. *
  375. * Return Value: true if success; otherwise false
  376. *
  377. */
  378. bool MACbSafeTxOff(void __iomem *dwIoBase)
  379. {
  380. unsigned short ww;
  381. unsigned long dwData;
  382. unsigned char byData;
  383. /* Clear TX DMA */
  384. /* Tx0 */
  385. VNSvOutPortD(dwIoBase + MAC_REG_TXDMACTL0, DMACTL_CLRRUN);
  386. /* AC0 */
  387. VNSvOutPortD(dwIoBase + MAC_REG_AC0DMACTL, DMACTL_CLRRUN);
  388. for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
  389. VNSvInPortD(dwIoBase + MAC_REG_TXDMACTL0, &dwData);
  390. if (!(dwData & DMACTL_RUN))
  391. break;
  392. }
  393. if (ww == W_MAX_TIMEOUT) {
  394. pr_debug(" DBG_PORT80(0x20)\n");
  395. return false;
  396. }
  397. for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
  398. VNSvInPortD(dwIoBase + MAC_REG_AC0DMACTL, &dwData);
  399. if (!(dwData & DMACTL_RUN))
  400. break;
  401. }
  402. if (ww == W_MAX_TIMEOUT) {
  403. pr_debug(" DBG_PORT80(0x21)\n");
  404. return false;
  405. }
  406. /* try to safe shutdown TX */
  407. MACvRegBitsOff(dwIoBase, MAC_REG_HOSTCR, HOSTCR_TXON);
  408. /* W_MAX_TIMEOUT is the timeout period */
  409. for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
  410. VNSvInPortB(dwIoBase + MAC_REG_HOSTCR, &byData);
  411. if (!(byData & HOSTCR_TXONST))
  412. break;
  413. }
  414. if (ww == W_MAX_TIMEOUT) {
  415. pr_debug(" DBG_PORT80(0x24)\n");
  416. return false;
  417. }
  418. return true;
  419. }
  420. /*
  421. * Description:
  422. * Stop MAC function
  423. *
  424. * Parameters:
  425. * In:
  426. * dwIoBase - Base Address for MAC
  427. * Out:
  428. * none
  429. *
  430. * Return Value: true if success; otherwise false
  431. *
  432. */
  433. bool MACbSafeStop(void __iomem *dwIoBase)
  434. {
  435. MACvRegBitsOff(dwIoBase, MAC_REG_TCR, TCR_AUTOBCNTX);
  436. if (!MACbSafeRxOff(dwIoBase)) {
  437. pr_debug(" MACbSafeRxOff == false)\n");
  438. MACbSafeSoftwareReset(dwIoBase);
  439. return false;
  440. }
  441. if (!MACbSafeTxOff(dwIoBase)) {
  442. pr_debug(" MACbSafeTxOff == false)\n");
  443. MACbSafeSoftwareReset(dwIoBase);
  444. return false;
  445. }
  446. MACvRegBitsOff(dwIoBase, MAC_REG_HOSTCR, HOSTCR_MACEN);
  447. return true;
  448. }
  449. /*
  450. * Description:
  451. * Shut Down MAC
  452. *
  453. * Parameters:
  454. * In:
  455. * dwIoBase - Base Address for MAC
  456. * Out:
  457. * none
  458. *
  459. * Return Value: true if success; otherwise false
  460. *
  461. */
  462. bool MACbShutdown(void __iomem *dwIoBase)
  463. {
  464. /* disable MAC IMR */
  465. MACvIntDisable(dwIoBase);
  466. MACvSetLoopbackMode(dwIoBase, MAC_LB_INTERNAL);
  467. /* stop the adapter */
  468. if (!MACbSafeStop(dwIoBase)) {
  469. MACvSetLoopbackMode(dwIoBase, MAC_LB_NONE);
  470. return false;
  471. }
  472. MACvSetLoopbackMode(dwIoBase, MAC_LB_NONE);
  473. return true;
  474. }
  475. /*
  476. * Description:
  477. * Initialize MAC
  478. *
  479. * Parameters:
  480. * In:
  481. * dwIoBase - Base Address for MAC
  482. * Out:
  483. * none
  484. *
  485. * Return Value: none
  486. *
  487. */
  488. void MACvInitialize(void __iomem *dwIoBase)
  489. {
  490. /* clear sticky bits */
  491. MACvClearStckDS(dwIoBase);
  492. /* disable force PME-enable */
  493. VNSvOutPortB(dwIoBase + MAC_REG_PMC1, PME_OVR);
  494. /* only 3253 A */
  495. /* do reset */
  496. MACbSoftwareReset(dwIoBase);
  497. /* reset TSF counter */
  498. VNSvOutPortB(dwIoBase + MAC_REG_TFTCTL, TFTCTL_TSFCNTRST);
  499. /* enable TSF counter */
  500. VNSvOutPortB(dwIoBase + MAC_REG_TFTCTL, TFTCTL_TSFCNTREN);
  501. }
  502. /*
  503. * Description:
  504. * Set the chip with current rx descriptor address
  505. *
  506. * Parameters:
  507. * In:
  508. * dwIoBase - Base Address for MAC
  509. * dwCurrDescAddr - Descriptor Address
  510. * Out:
  511. * none
  512. *
  513. * Return Value: none
  514. *
  515. */
  516. void MACvSetCurrRx0DescAddr(void __iomem *dwIoBase, unsigned long dwCurrDescAddr)
  517. {
  518. unsigned short ww;
  519. unsigned char byData;
  520. unsigned char byOrgDMACtl;
  521. VNSvInPortB(dwIoBase + MAC_REG_RXDMACTL0, &byOrgDMACtl);
  522. if (byOrgDMACtl & DMACTL_RUN)
  523. VNSvOutPortB(dwIoBase + MAC_REG_RXDMACTL0+2, DMACTL_RUN);
  524. for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
  525. VNSvInPortB(dwIoBase + MAC_REG_RXDMACTL0, &byData);
  526. if (!(byData & DMACTL_RUN))
  527. break;
  528. }
  529. VNSvOutPortD(dwIoBase + MAC_REG_RXDMAPTR0, dwCurrDescAddr);
  530. if (byOrgDMACtl & DMACTL_RUN)
  531. VNSvOutPortB(dwIoBase + MAC_REG_RXDMACTL0, DMACTL_RUN);
  532. }
  533. /*
  534. * Description:
  535. * Set the chip with current rx descriptor address
  536. *
  537. * Parameters:
  538. * In:
  539. * dwIoBase - Base Address for MAC
  540. * dwCurrDescAddr - Descriptor Address
  541. * Out:
  542. * none
  543. *
  544. * Return Value: none
  545. *
  546. */
  547. void MACvSetCurrRx1DescAddr(void __iomem *dwIoBase, unsigned long dwCurrDescAddr)
  548. {
  549. unsigned short ww;
  550. unsigned char byData;
  551. unsigned char byOrgDMACtl;
  552. VNSvInPortB(dwIoBase + MAC_REG_RXDMACTL1, &byOrgDMACtl);
  553. if (byOrgDMACtl & DMACTL_RUN)
  554. VNSvOutPortB(dwIoBase + MAC_REG_RXDMACTL1+2, DMACTL_RUN);
  555. for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
  556. VNSvInPortB(dwIoBase + MAC_REG_RXDMACTL1, &byData);
  557. if (!(byData & DMACTL_RUN))
  558. break;
  559. }
  560. VNSvOutPortD(dwIoBase + MAC_REG_RXDMAPTR1, dwCurrDescAddr);
  561. if (byOrgDMACtl & DMACTL_RUN)
  562. VNSvOutPortB(dwIoBase + MAC_REG_RXDMACTL1, DMACTL_RUN);
  563. }
  564. /*
  565. * Description:
  566. * Set the chip with current tx0 descriptor address
  567. *
  568. * Parameters:
  569. * In:
  570. * dwIoBase - Base Address for MAC
  571. * dwCurrDescAddr - Descriptor Address
  572. * Out:
  573. * none
  574. *
  575. * Return Value: none
  576. *
  577. */
  578. void MACvSetCurrTx0DescAddrEx(void __iomem *dwIoBase,
  579. unsigned long dwCurrDescAddr)
  580. {
  581. unsigned short ww;
  582. unsigned char byData;
  583. unsigned char byOrgDMACtl;
  584. VNSvInPortB(dwIoBase + MAC_REG_TXDMACTL0, &byOrgDMACtl);
  585. if (byOrgDMACtl & DMACTL_RUN)
  586. VNSvOutPortB(dwIoBase + MAC_REG_TXDMACTL0+2, DMACTL_RUN);
  587. for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
  588. VNSvInPortB(dwIoBase + MAC_REG_TXDMACTL0, &byData);
  589. if (!(byData & DMACTL_RUN))
  590. break;
  591. }
  592. VNSvOutPortD(dwIoBase + MAC_REG_TXDMAPTR0, dwCurrDescAddr);
  593. if (byOrgDMACtl & DMACTL_RUN)
  594. VNSvOutPortB(dwIoBase + MAC_REG_TXDMACTL0, DMACTL_RUN);
  595. }
  596. /*
  597. * Description:
  598. * Set the chip with current AC0 descriptor address
  599. *
  600. * Parameters:
  601. * In:
  602. * dwIoBase - Base Address for MAC
  603. * dwCurrDescAddr - Descriptor Address
  604. * Out:
  605. * none
  606. *
  607. * Return Value: none
  608. *
  609. */
  610. /* TxDMA1 = AC0DMA */
  611. void MACvSetCurrAC0DescAddrEx(void __iomem *dwIoBase,
  612. unsigned long dwCurrDescAddr)
  613. {
  614. unsigned short ww;
  615. unsigned char byData;
  616. unsigned char byOrgDMACtl;
  617. VNSvInPortB(dwIoBase + MAC_REG_AC0DMACTL, &byOrgDMACtl);
  618. if (byOrgDMACtl & DMACTL_RUN)
  619. VNSvOutPortB(dwIoBase + MAC_REG_AC0DMACTL+2, DMACTL_RUN);
  620. for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
  621. VNSvInPortB(dwIoBase + MAC_REG_AC0DMACTL, &byData);
  622. if (!(byData & DMACTL_RUN))
  623. break;
  624. }
  625. if (ww == W_MAX_TIMEOUT)
  626. pr_debug(" DBG_PORT80(0x26)\n");
  627. VNSvOutPortD(dwIoBase + MAC_REG_AC0DMAPTR, dwCurrDescAddr);
  628. if (byOrgDMACtl & DMACTL_RUN)
  629. VNSvOutPortB(dwIoBase + MAC_REG_AC0DMACTL, DMACTL_RUN);
  630. }
  631. void MACvSetCurrTXDescAddr(int iTxType, void __iomem *dwIoBase,
  632. unsigned long dwCurrDescAddr)
  633. {
  634. if (iTxType == TYPE_AC0DMA)
  635. MACvSetCurrAC0DescAddrEx(dwIoBase, dwCurrDescAddr);
  636. else if (iTxType == TYPE_TXDMA0)
  637. MACvSetCurrTx0DescAddrEx(dwIoBase, dwCurrDescAddr);
  638. }
  639. /*
  640. * Description:
  641. * Micro Second Delay via MAC
  642. *
  643. * Parameters:
  644. * In:
  645. * dwIoBase - Base Address for MAC
  646. * uDelay - Delay time (timer resolution is 4 us)
  647. * Out:
  648. * none
  649. *
  650. * Return Value: none
  651. *
  652. */
  653. void MACvTimer0MicroSDelay(void __iomem *dwIoBase, unsigned int uDelay)
  654. {
  655. unsigned char byValue;
  656. unsigned int uu, ii;
  657. VNSvOutPortB(dwIoBase + MAC_REG_TMCTL0, 0);
  658. VNSvOutPortD(dwIoBase + MAC_REG_TMDATA0, uDelay);
  659. VNSvOutPortB(dwIoBase + MAC_REG_TMCTL0, (TMCTL_TMD | TMCTL_TE));
  660. for (ii = 0; ii < 66; ii++) { /* assume max PCI clock is 66Mhz */
  661. for (uu = 0; uu < uDelay; uu++) {
  662. VNSvInPortB(dwIoBase + MAC_REG_TMCTL0, &byValue);
  663. if ((byValue == 0) ||
  664. (byValue & TMCTL_TSUSP)) {
  665. VNSvOutPortB(dwIoBase + MAC_REG_TMCTL0, 0);
  666. return;
  667. }
  668. }
  669. }
  670. VNSvOutPortB(dwIoBase + MAC_REG_TMCTL0, 0);
  671. }
  672. /*
  673. * Description:
  674. * Micro Second One shot timer via MAC
  675. *
  676. * Parameters:
  677. * In:
  678. * dwIoBase - Base Address for MAC
  679. * uDelay - Delay time
  680. * Out:
  681. * none
  682. *
  683. * Return Value: none
  684. *
  685. */
  686. void MACvOneShotTimer1MicroSec(void __iomem *dwIoBase, unsigned int uDelayTime)
  687. {
  688. VNSvOutPortB(dwIoBase + MAC_REG_TMCTL1, 0);
  689. VNSvOutPortD(dwIoBase + MAC_REG_TMDATA1, uDelayTime);
  690. VNSvOutPortB(dwIoBase + MAC_REG_TMCTL1, (TMCTL_TMD | TMCTL_TE));
  691. }
  692. void MACvSetMISCFifo(void __iomem *dwIoBase, unsigned short wOffset,
  693. unsigned long dwData)
  694. {
  695. if (wOffset > 273)
  696. return;
  697. VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset);
  698. VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, dwData);
  699. VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
  700. }
  701. bool MACbPSWakeup(void __iomem *dwIoBase)
  702. {
  703. unsigned char byOrgValue;
  704. unsigned int ww;
  705. /* Read PSCTL */
  706. if (MACbIsRegBitsOff(dwIoBase, MAC_REG_PSCTL, PSCTL_PS))
  707. return true;
  708. /* Disable PS */
  709. MACvRegBitsOff(dwIoBase, MAC_REG_PSCTL, PSCTL_PSEN);
  710. /* Check if SyncFlushOK */
  711. for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
  712. VNSvInPortB(dwIoBase + MAC_REG_PSCTL, &byOrgValue);
  713. if (byOrgValue & PSCTL_WAKEDONE)
  714. break;
  715. }
  716. if (ww == W_MAX_TIMEOUT) {
  717. pr_debug(" DBG_PORT80(0x33)\n");
  718. return false;
  719. }
  720. return true;
  721. }
  722. /*
  723. * Description:
  724. * Set the Key by MISCFIFO
  725. *
  726. * Parameters:
  727. * In:
  728. * dwIoBase - Base Address for MAC
  729. *
  730. * Out:
  731. * none
  732. *
  733. * Return Value: none
  734. *
  735. */
  736. void MACvSetKeyEntry(void __iomem *dwIoBase, unsigned short wKeyCtl,
  737. unsigned int uEntryIdx, unsigned int uKeyIdx,
  738. unsigned char *pbyAddr, u32 *pdwKey,
  739. unsigned char byLocalID)
  740. {
  741. unsigned short wOffset;
  742. u32 dwData;
  743. int ii;
  744. if (byLocalID <= 1)
  745. return;
  746. pr_debug("MACvSetKeyEntry\n");
  747. wOffset = MISCFIFO_KEYETRY0;
  748. wOffset += (uEntryIdx * MISCFIFO_KEYENTRYSIZE);
  749. dwData = 0;
  750. dwData |= wKeyCtl;
  751. dwData <<= 16;
  752. dwData |= MAKEWORD(*(pbyAddr+4), *(pbyAddr+5));
  753. pr_debug("1. wOffset: %d, Data: %X, KeyCtl:%X\n",
  754. wOffset, dwData, wKeyCtl);
  755. VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset);
  756. VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, dwData);
  757. VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
  758. wOffset++;
  759. dwData = 0;
  760. dwData |= *(pbyAddr+3);
  761. dwData <<= 8;
  762. dwData |= *(pbyAddr+2);
  763. dwData <<= 8;
  764. dwData |= *(pbyAddr+1);
  765. dwData <<= 8;
  766. dwData |= *(pbyAddr+0);
  767. pr_debug("2. wOffset: %d, Data: %X\n", wOffset, dwData);
  768. VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset);
  769. VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, dwData);
  770. VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
  771. wOffset++;
  772. wOffset += (uKeyIdx * 4);
  773. for (ii = 0; ii < 4; ii++) {
  774. /* always push 128 bits */
  775. pr_debug("3.(%d) wOffset: %d, Data: %X\n",
  776. ii, wOffset+ii, *pdwKey);
  777. VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset+ii);
  778. VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, *pdwKey++);
  779. VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
  780. }
  781. }
  782. /*
  783. * Description:
  784. * Disable the Key Entry by MISCFIFO
  785. *
  786. * Parameters:
  787. * In:
  788. * dwIoBase - Base Address for MAC
  789. *
  790. * Out:
  791. * none
  792. *
  793. * Return Value: none
  794. *
  795. */
  796. void MACvDisableKeyEntry(void __iomem *dwIoBase, unsigned int uEntryIdx)
  797. {
  798. unsigned short wOffset;
  799. wOffset = MISCFIFO_KEYETRY0;
  800. wOffset += (uEntryIdx * MISCFIFO_KEYENTRYSIZE);
  801. VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset);
  802. VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, 0);
  803. VNSvOutPortW(dwIoBase + MAC_REG_MISCFFCTL, MISCFFCTL_WRITE);
  804. }