Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

740 lines
20 KiB

  1. /*
  2. ************************************************************************
  3. *
  4. * DONGLE.C
  5. *
  6. * Portions Copyright (C) 1996-2001 National Semiconductor Corp.
  7. * All rights reserved.
  8. * Copyright (C) 1996-2001 Microsoft Corporation. All Rights Reserved.
  9. *
  10. * Auto Dongle Setup
  11. *
  12. * Author: Kishor Padmanabhan
  13. *
  14. * This file has routines that implements Franco Iacobelli's vision
  15. * of dongle interface. Recommand reading this document before going
  16. * ahead.
  17. *
  18. *
  19. *************************************************************************
  20. */
  21. #include "newdong.h"
  22. #ifdef NDIS50_MINIPORT
  23. #include "nsc.h"
  24. #else
  25. extern void NSC_WriteBankReg(UINT ComPort, const iBank, int iRegNum, UCHAR iVal);
  26. extern UCHAR NSC_ReadBankReg(UINT ComPort,const iBank, int iRegNum);
  27. #endif
  28. //////////////////////////////////////////////////////////////////////////
  29. // //
  30. // Function prototypes //
  31. //////////////////////////////////////////////////////////////////////////
  32. //DongleParam *GetDongleCapabilities(UIR Com);
  33. //int SetDongleCapabilities(UIR Com);
  34. void delay(unsigned int period); // a delay loop
  35. // Called from SetDongleCapabilities
  36. int SetReqMode(const UIR * Com,DongleParam *Dingle);
  37. void SetHpDongle(PUCHAR UirPort,int Mode);
  38. void SetTemicDongle(PUCHAR UirPort,int Mode);
  39. void SetSharpDongle(PUCHAR UirPort,int Mode);
  40. void SetDellDongle(PUCHAR UirPort,int Mode);
  41. void SetHpMuxDongle(PUCHAR UirPort, int Mode);
  42. void SetIbmDongle (PUCHAR UirPort, int Mode);
  43. // Pauses for a specified number of microseconds.
  44. void Sleep( ULONG wait );
  45. //////////////////////////////////////////////////////////////////////////
  46. // //
  47. // Function: GetDongleCapabilities //
  48. // //
  49. // Description: //
  50. // //
  51. // This routine fill up the DongleParam structure interpreting the //
  52. // dongle oem's code and returns a pointer the structure. //
  53. // //
  54. // Input : UIR structure with XcvrNumber ,Com Port and IR mode //
  55. // offset //
  56. // OutPut : DongleParam Structure //
  57. // //
  58. //////////////////////////////////////////////////////////////////////////
  59. DongleParam *GetDongleCapabilities(PSYNC_DONGLE SyncDongle)
  60. {
  61. const UIR * Com=SyncDongle->Com;
  62. DongleParam *Dingle=SyncDongle->Dingle;
  63. UINT Signature;
  64. char TEMP1 ;
  65. // Check for validity of the Com port address
  66. if(Com->ComPort == 0) return(NULL);
  67. // Com->XcvrNum only has either 0 or 1
  68. // Check for validity of the Port Number address
  69. //if(Com->XcvrNum > 1) return(NULL);
  70. // Check for first time
  71. if(Dingle[Com->XcvrNum].WORD0.bits.DSVFLAG)
  72. return(&Dingle[Com->XcvrNum]);
  73. // Signature is a word long ID information
  74. // bit 15 = 1 -- Plug and Play
  75. // bit 0, 1, 2, 3 -- ID number for different Manufactures
  76. Signature = Com->Signature;
  77. Dingle[Com->XcvrNum].PlugPlay = 0;
  78. Dingle[Com->XcvrNum].WORD0.bits.GCERR = 0;
  79. if(GetBit(Com->Signature, 15)) //is dongle PnP ?
  80. {
  81. // Make the Pins IRSL1-2 as Inputs
  82. NSC_WriteBankReg(Com->ComPort, BANK7, 7, 0x00);
  83. NdisStallExecution(50); //Wait 50 us
  84. // Check whether Disconnect
  85. // ID/IRSL(2-1) as Input upon READ bit 0-3 return the logic
  86. // level of the pins(allowing external devices to identify
  87. // themselves.)
  88. if(((Signature = NSC_ReadBankReg(Com->ComPort, BANK7, 4) & 0x0f)) == 0x0f) {
  89. Dingle[Com->XcvrNum].WORD0.bits.GCERR = XCVR_DISCONNECT;
  90. Dingle[Com->XcvrNum].WORD0.bits.DSVFLAG = 0;
  91. return(&Dingle[Com->XcvrNum]);
  92. }
  93. Dingle[Com->XcvrNum].PlugPlay = 1;
  94. }
  95. // Dongle Identification
  96. switch(Signature & 0x1f) {
  97. case 0:
  98. case 1:
  99. #ifdef DPRINT
  100. DbgPrint(" Serial Adapter with diff. signaling");
  101. #endif
  102. return(NULL);
  103. break;
  104. case 6:
  105. #ifdef DPRINT
  106. DbgPrint(" Serial Adapter with single ended signaling");
  107. #endif
  108. return(NULL);
  109. break;
  110. case 7:
  111. #ifdef DPRINT
  112. DbgPrint(" Consumer-IR only");
  113. #endif
  114. return(NULL);
  115. break;
  116. case 2:
  117. case 3:
  118. case 5:
  119. case 0xa:
  120. #ifdef DPRINT
  121. DbgPrint(" Reserved");
  122. #endif
  123. return(NULL);
  124. break;
  125. case 4:
  126. #ifdef DPRINT
  127. DbgPrint(" Sharp RY5HD01 or RY5KD01 transceiver");
  128. #endif
  129. Dingle[Com->XcvrNum].WORD0.bits.DSVFLAG = 1;
  130. Dingle[Com->XcvrNum].WORD0.bits.TrcvrCode = SharpRY5HD01;
  131. Dingle[Com->XcvrNum].WORD4.Data = SharpRecovery;
  132. Dingle[Com->XcvrNum].WORD6.Data = SharpBofs;
  133. Dingle[Com->XcvrNum].WORD7.bits.FIR = TRUE;
  134. Dingle[Com->XcvrNum].WORD7.bits.MIR = TRUE;
  135. Dingle[Com->XcvrNum].WORD7.bits.SIR = TRUE;
  136. Dingle[Com->XcvrNum].WORD7.bits.Sharp_IR = TRUE;
  137. break;
  138. case 0x8:
  139. #ifdef DPRINT
  140. DbgPrint(" HP HSDL-2300/3600 transceiver");
  141. #endif
  142. Dingle[Com->XcvrNum].WORD0.bits.DSVFLAG = 1;
  143. Dingle[Com->XcvrNum].WORD0.bits.TrcvrCode = Hp2300;
  144. Dingle[Com->XcvrNum].WORD4.Data = HpRecovery;
  145. Dingle[Com->XcvrNum].WORD6.Data = HpBofs;
  146. Dingle[Com->XcvrNum].WORD7.bits.FIR = TRUE;
  147. Dingle[Com->XcvrNum].WORD7.bits.MIR = TRUE;
  148. Dingle[Com->XcvrNum].WORD7.bits.SIR = TRUE;
  149. Dingle[Com->XcvrNum].WORD7.bits.Sharp_IR = TRUE;
  150. break;
  151. case 0x9:
  152. #ifdef DPRINT
  153. DbgPrint(" Vishay TFDS6000, IBM31T1100, Siemens IRMS/T6400");
  154. #endif
  155. Dingle[Com->XcvrNum].WORD0.bits.DSVFLAG = 1;
  156. Dingle[Com->XcvrNum].WORD0.bits.TrcvrCode = Temic6000;
  157. Dingle[Com->XcvrNum].WORD4.Data = TemicRecovery;
  158. Dingle[Com->XcvrNum].WORD6.Data = TemicBofs;
  159. Dingle[Com->XcvrNum].WORD7.bits.FIR = TRUE;
  160. Dingle[Com->XcvrNum].WORD7.bits.MIR = TRUE;
  161. Dingle[Com->XcvrNum].WORD7.bits.SIR = TRUE;
  162. Dingle[Com->XcvrNum].WORD7.bits.Sharp_IR = TRUE;
  163. break;
  164. case 0x0B:
  165. #ifdef DPRINT
  166. DbgPrint(" Vishay TFDS6500");
  167. #endif
  168. Dingle[Com->XcvrNum].WORD0.bits.DSVFLAG = 1;
  169. Dingle[Com->XcvrNum].WORD0.bits.TrcvrCode = Temic6500;
  170. Dingle[Com->XcvrNum].WORD4.Data = TemicRecovery;
  171. Dingle[Com->XcvrNum].WORD6.Data = TemicBofs;
  172. Dingle[Com->XcvrNum].WORD7.bits.FIR = TRUE;
  173. Dingle[Com->XcvrNum].WORD7.bits.MIR = TRUE;
  174. Dingle[Com->XcvrNum].WORD7.bits.SIR = TRUE;
  175. Dingle[Com->XcvrNum].WORD7.bits.Sharp_IR = TRUE;
  176. break;
  177. case 0xc:
  178. case 0xd:
  179. #ifdef DPRINT
  180. DbgPrint(" HP HSDL-1100/2100 or TI TSLM1100 or Sharp RY6FD11E/RY6FD1SE");
  181. #endif
  182. Dingle[Com->XcvrNum].WORD0.bits.DSVFLAG = 1;
  183. Dingle[Com->XcvrNum].WORD0.bits.TrcvrCode = Hp1100;
  184. Dingle[Com->XcvrNum].WORD4.Data = HpRecovery;
  185. Dingle[Com->XcvrNum].WORD6.Data = HpBofs;
  186. Dingle[Com->XcvrNum].WORD7.bits.FIR = TRUE;
  187. Dingle[Com->XcvrNum].WORD7.bits.MIR = TRUE;
  188. Dingle[Com->XcvrNum].WORD7.bits.SIR = TRUE;
  189. Dingle[Com->XcvrNum].WORD7.bits.Sharp_IR = TRUE;
  190. break;
  191. case 0xe:
  192. #ifdef DPRINT
  193. DbgPrint(" SIR Only");
  194. #endif
  195. Dingle[Com->XcvrNum].WORD0.bits.DSVFLAG = 1;
  196. Dingle[Com->XcvrNum].WORD0.bits.TrcvrCode = SirOnly;
  197. Dingle[Com->XcvrNum].WORD4.Data = TemicRecovery;
  198. Dingle[Com->XcvrNum].WORD6.Data = TemicBofs;
  199. Dingle[Com->XcvrNum].WORD7.bits.SIR = TRUE;
  200. break;
  201. case 0xf:
  202. #ifdef DPRINT
  203. DbgPrint(" No Dongle present");
  204. #endif
  205. return(NULL);
  206. break;
  207. case 0x10:
  208. #ifdef DPRINT
  209. DbgPrint("DELL Titanium with two TEMIC transceivers");
  210. #endif
  211. Dingle[Com->XcvrNum].WORD0.bits.DSVFLAG = 1;
  212. Dingle[Com->XcvrNum].WORD0.bits.TrcvrCode = Dell1997;
  213. Dingle[Com->XcvrNum].WORD4.Data = TemicRecovery;
  214. Dingle[Com->XcvrNum].WORD6.Data = TemicBofs;
  215. Dingle[Com->XcvrNum].WORD7.bits.FIR = TRUE;
  216. Dingle[Com->XcvrNum].WORD7.bits.MIR = TRUE;
  217. Dingle[Com->XcvrNum].WORD7.bits.SIR = TRUE;
  218. Dingle[Com->XcvrNum].WORD7.bits.Sharp_IR = TRUE;
  219. break;
  220. case 0x11:
  221. #ifdef DPRINT
  222. DbgPrint("IBM SouthernCross with two IBM transceivers");
  223. #endif
  224. Dingle[Com->XcvrNum].WORD0.bits.DSVFLAG = 1;
  225. Dingle[Com->XcvrNum].WORD0.bits.TrcvrCode = Ibm20H2987;
  226. Dingle[Com->XcvrNum].WORD4.Data = TemicRecovery;
  227. Dingle[Com->XcvrNum].WORD6.Data = TemicBofs;
  228. Dingle[Com->XcvrNum].WORD7.bits.FIR = TRUE;
  229. Dingle[Com->XcvrNum].WORD7.bits.MIR = TRUE;
  230. Dingle[Com->XcvrNum].WORD7.bits.SIR = TRUE;
  231. Dingle[Com->XcvrNum].WORD7.bits.Sharp_IR = TRUE;
  232. break;
  233. default:
  234. return(NULL);
  235. break;
  236. }
  237. // Everything O.K return the structure
  238. return(&Dingle[Com->XcvrNum]);
  239. }
  240. //////////////////////////////////////////////////////////////////////////
  241. // //
  242. // Function: SetDongleCapabilities //
  243. // //
  244. // Description: //
  245. // //
  246. // Input : UIR structure with XcvrNumber ,Com Port and IR mode offset //
  247. // Result : If successfull will set the dongle to the appropriate mode. //
  248. // Returns TRUE for success and error codes defined in dongle.h//
  249. // UNSUPPORTED 2 //
  250. // ERROR_GETCAPAB 7 //
  251. // //
  252. //////////////////////////////////////////////////////////////////////////
  253. int SetDongleCapabilities(PSYNC_DONGLE SyncDongle)
  254. {
  255. const UIR * Com=SyncDongle->Com;
  256. DongleParam *Dingle=SyncDongle->Dingle;
  257. DongleParam *Dongle;
  258. Dongle = GetDongleCapabilities(SyncDongle);
  259. // Check whether Dongle is NULL
  260. if(Dongle == NULL) {
  261. #ifdef DPRINT
  262. DbgPrint(" Returning ERROR");
  263. #endif
  264. return(ERROR_GETCAPAB);
  265. }
  266. if(Dingle[Com->XcvrNum].WORD0.bits.GCERR != 0)
  267. return(ERROR_GETCAPAB);
  268. return(SetReqMode(Com,Dingle));
  269. }
  270. //////////////////////////////////////////////////////////////////////////
  271. // //
  272. // Function: SetRegMode //
  273. // //
  274. // Description: //
  275. // //
  276. // Input : Structure Com with ComPort, ModeReq and XcvrNum set. //
  277. // OutPut : True if successfull //
  278. // UNIMPLEMENTED if so //
  279. // //
  280. // //
  281. //////////////////////////////////////////////////////////////////////////
  282. int SetReqMode(const UIR * Com,DongleParam *Dingle)
  283. {
  284. UINT trcode ;
  285. #ifdef DPRINT
  286. DbgPrint("ModeReq %d ",Com->ModeReq);
  287. #endif
  288. trcode = Dingle[Com->XcvrNum].WORD0.bits.TrcvrCode;
  289. if ((trcode == Hp1100) || (trcode == Dell1997))
  290. // Make the Pins IRSL1-2 as output
  291. NSC_WriteBankReg(Com->ComPort, BANK7, 7, 0x08);
  292. else
  293. // Make the Pins IRSL0-2 as output
  294. NSC_WriteBankReg(Com->ComPort, BANK7, 7, 0x28);
  295. NSC_WriteBankReg(Com->ComPort, BANK7, 4, 0x00); //set IRSL1,2 low
  296. if(Com->ModeReq > 3)
  297. return(UNSUPPORTED) ;
  298. switch(Com->ModeReq) {
  299. case 0x0: // Setup SIR mode
  300. if(!Dingle[Com->XcvrNum].WORD7.bits.SIR)
  301. return(UNSUPPORTED);
  302. NSC_WriteBankReg(Com->ComPort, BANK7, 4, 0);
  303. Dingle[Com->XcvrNum].WORD1.bits.CurSelMode = Com->ModeReq;
  304. Dingle[Com->XcvrNum].WORD0.bits.MVFLAG = 1;
  305. if(Dingle[Com->XcvrNum].WORD0.bits.TrcvrCode == SirOnly) {
  306. return(TRUE);
  307. }
  308. if(Dingle[Com->XcvrNum].WORD0.bits.TrcvrCode == Hp1100) {
  309. SetHpDongle(Com->ComPort, 1);
  310. return(TRUE);
  311. }
  312. if(Dingle[Com->XcvrNum].WORD0.bits.TrcvrCode == Hp2300)
  313. {
  314. SetHpMuxDongle(Com->ComPort,0);
  315. return(TRUE);
  316. }
  317. if(Dingle[Com->XcvrNum].WORD0.bits.TrcvrCode == Temic6000) {
  318. SetTemicDongle(Com->ComPort, 0);
  319. return(TRUE);
  320. }
  321. if(Dingle[Com->XcvrNum].WORD0.bits.TrcvrCode == Temic6500) {
  322. SetTemicDongle(Com->ComPort, 0);
  323. return(TRUE);
  324. }
  325. if(Dingle[Com->XcvrNum].WORD0.bits.TrcvrCode == SharpRY5HD01) {
  326. return(TRUE);
  327. }
  328. if(Dingle[Com->XcvrNum].WORD0.bits.TrcvrCode == Dell1997) {
  329. SetDellDongle(Com->ComPort, 0);
  330. return(TRUE);
  331. }
  332. if(Dingle[Com->XcvrNum].WORD0.bits.TrcvrCode == Ibm20H2987) {
  333. SetIbmDongle(Com->ComPort, 0);
  334. return(TRUE);
  335. }
  336. break;
  337. case 1: /* Setup MIR mode */
  338. if(!Dingle[Com->XcvrNum].WORD7.bits.MIR)
  339. return(UNSUPPORTED);
  340. // Set the current mode to the mode requested
  341. Dingle[Com->XcvrNum].WORD1.bits.CurSelMode = Com->ModeReq;
  342. Dingle[Com->XcvrNum].WORD0.bits.MVFLAG = 1;
  343. switch(Dingle[Com->XcvrNum].WORD0.bits.TrcvrCode) {
  344. case Hp1100:
  345. SetHpDongle(Com->ComPort, 1);
  346. return(TRUE);
  347. case Hp2300:
  348. SetHpMuxDongle(Com->ComPort,1);
  349. return(TRUE);
  350. case Temic6000:
  351. SetTemicDongle(Com->ComPort, 0);
  352. return(TRUE);
  353. case Temic6500:
  354. SetTemicDongle(Com->ComPort, 1);
  355. return(TRUE);
  356. case SharpRY5HD01:
  357. return(TRUE);
  358. case Dell1997:
  359. SetDellDongle(Com->ComPort, 1);
  360. return(TRUE);
  361. case Ibm20H2987:
  362. SetIbmDongle(Com->ComPort, 1);
  363. return(TRUE);
  364. }
  365. break;
  366. case 2: // Setup FIR mode
  367. if(!Dingle[Com->XcvrNum].WORD7.bits.FIR)
  368. return(UNSUPPORTED);
  369. // Set the current mode to the mode requested
  370. Dingle[Com->XcvrNum].WORD1.bits.CurSelMode = Com->ModeReq;
  371. Dingle[Com->XcvrNum].WORD0.bits.MVFLAG = 1;
  372. switch(Dingle[Com->XcvrNum].WORD0.bits.TrcvrCode) {
  373. case Hp1100:
  374. SetHpDongle(Com->ComPort, 1);
  375. return(TRUE);
  376. case Hp2300:
  377. SetHpMuxDongle(Com->ComPort,1);
  378. return(TRUE);
  379. case Temic6000:
  380. case Temic6500:
  381. SetTemicDongle(Com->ComPort, 1);
  382. return(TRUE);
  383. case SharpRY5HD01:
  384. return(TRUE);
  385. case Dell1997:
  386. SetDellDongle(Com->ComPort, 1);
  387. return(TRUE);
  388. case Ibm20H2987:
  389. SetIbmDongle(Com->ComPort, 1);
  390. return(TRUE);
  391. }
  392. break;
  393. case 3: // Setup Sharp-IR mode
  394. if(!Dingle[Com->XcvrNum].WORD7.bits.Sharp_IR)
  395. return(UNSUPPORTED);
  396. // Set the current mode to the mode requested
  397. Dingle[Com->XcvrNum].WORD1.bits.CurSelMode = Com->ModeReq;
  398. Dingle[Com->XcvrNum].WORD0.bits.MVFLAG = 1;
  399. switch(Dingle[Com->XcvrNum].WORD0.bits.TrcvrCode) {
  400. case Hp1100:
  401. SetHpDongle(Com->ComPort, 0);
  402. return(TRUE);
  403. case Hp2300:
  404. SetHpMuxDongle(Com->ComPort, 1);
  405. return(TRUE);
  406. case Temic6000:
  407. SetTemicDongle(Com->ComPort, 0);
  408. return(TRUE);
  409. case Temic6500:
  410. SetTemicDongle(Com->ComPort, 1);
  411. return(TRUE);
  412. case SharpRY5HD01:
  413. return(TRUE);
  414. case Dell1997:
  415. SetDellDongle(Com->ComPort, 1);
  416. return(TRUE);
  417. case Ibm20H2987:
  418. SetIbmDongle(Com->ComPort, 1);
  419. return(TRUE);
  420. }
  421. break;
  422. default:
  423. return(UNSUPPORTED);
  424. }
  425. return(UNSUPPORTED);
  426. }
  427. //////////////////////////////////////////////////////////////////////////
  428. // //
  429. // Function: SetHpMuxDongle //
  430. // //
  431. // Description: //
  432. // //
  433. // Input : Mode = 1 for FIR,MIR and SIR . //
  434. // Mode = 0 for SIR //
  435. // //
  436. //////////////////////////////////////////////////////////////////////////
  437. void SetHpMuxDongle(PUCHAR UirPort,int Mode)
  438. {
  439. if (Mode == 1)
  440. NSC_WriteBankReg(UirPort,BANK7,4,0x1); //select MIR or FIR
  441. }
  442. //////////////////////////////////////////////////////////////////////////
  443. // //
  444. // Function: SetHpDongle //
  445. // //
  446. // Description: //
  447. // //
  448. // Input : Mode = 1 for FIR,MIR and SIR . //
  449. // Mode = 0 for Sharp, CIR_OS //
  450. // //
  451. //////////////////////////////////////////////////////////////////////////
  452. void SetHpDongle(PUCHAR UirPort,int Mode)
  453. {
  454. UCHAR val;
  455. if(Mode) {
  456. // MIR , FIR and SIR Mode . And Oversampling Low speed
  457. // Bank 5/offset 4/Bit 4 (AUX_IRRX) = 0
  458. val = (UCHAR) (NSC_ReadBankReg(UirPort,BANK5,4) & 0xef);
  459. NSC_WriteBankReg(UirPort,BANK5,4,val);
  460. NSC_WriteBankReg(UirPort,BANK7,7,0x48);
  461. }
  462. else {
  463. // Sharp IR , Oversampling Med and hi speed cir
  464. val =(UCHAR) NSC_ReadBankReg(UirPort,BANK5,4) | 0x10;
  465. NSC_WriteBankReg(UirPort,BANK5,4,val);
  466. }
  467. }
  468. //////////////////////////////////////////////////////////////////////////
  469. // //
  470. // Function: Sleep //
  471. // //
  472. // Description: //
  473. // //
  474. // Pauses for a specified number of microseconds. //
  475. // //
  476. //////////////////////////////////////////////////////////////////////////
  477. void Sleep( ULONG usecToWait )
  478. {
  479. #ifdef NDIS50_MINIPORT
  480. do {
  481. UINT usec = (usecToWait > 8000) ? 8000 : usecToWait;
  482. NdisStallExecution(usec);
  483. usecToWait -= usec;
  484. } while (usecToWait > 0);
  485. #else
  486. clock_t goal;
  487. goal = usecToWait + clock();
  488. while( goal >= clock() ) ;
  489. #endif
  490. }
  491. //////////////////////////////////////////////////////////////////////////
  492. // //
  493. // Function: Delay //
  494. // //
  495. // Description: //
  496. // //
  497. // Simple delay loop. //
  498. // //
  499. //////////////////////////////////////////////////////////////////////////
  500. void delay(unsigned int usecToWait)
  501. {
  502. #ifdef NDIS50_MINIPORT
  503. do {
  504. UINT usec = (usecToWait > 8000) ? 8000 : usecToWait;
  505. NdisStallExecution(usec);
  506. usecToWait -= usec;
  507. } while (usecToWait > 0);
  508. #else
  509. while(usecToWait--);
  510. #endif
  511. }
  512. //////////////////////////////////////////////////////////////////////////
  513. // //
  514. // Function: SetTemicDongle //
  515. // Transceivers: Temic TFDS-6000/6500, IBM31T1100 //
  516. // //
  517. // Description: //
  518. // Set the IBM Transceiver mode //
  519. // Mode = 0 - SIR, MIR //
  520. // Mode = 1 - MIR, FIR, Sharp-IR //
  521. // Mode = 2 - Low Power Mode //
  522. // //
  523. //////////////////////////////////////////////////////////////////////////
  524. void SetTemicDongle(PUCHAR UirPort,int Mode)
  525. {
  526. switch( Mode ) {
  527. case 0:
  528. NSC_WriteBankReg(UirPort, BANK7, 4, 0x00);
  529. NdisStallExecution(10);
  530. // Trigger the Bandwidth line from high to low
  531. NSC_WriteBankReg(UirPort, BANK7, 4, 0x01);
  532. NdisStallExecution( 20 );
  533. NSC_WriteBankReg(UirPort,BANK7,4,0x00);
  534. NdisStallExecution( 1000 );
  535. break;
  536. case 1:
  537. NSC_WriteBankReg(UirPort, BANK7, 4, 0x01);
  538. NdisStallExecution( 20 );
  539. NSC_WriteBankReg(UirPort, BANK7, 4, 0x81);
  540. NdisStallExecution(10);
  541. NSC_WriteBankReg(UirPort, BANK7, 4, 0x80);
  542. NdisStallExecution( 1000 );
  543. break;
  544. case 2:
  545. NSC_WriteBankReg(UirPort, BANK7, 4, 0x1);
  546. break;
  547. default:
  548. break;
  549. }
  550. }
  551. //////////////////////////////////////////////////////////////////////////
  552. // //
  553. // Function: SetDellDongle //
  554. // //
  555. // Description: //
  556. // Set the Dell Transceiver mode //
  557. // Mode = 0 - SIR, MIR //
  558. // Mode = 1 - FIR //
  559. // Mode = 2 - Low Power Mode //
  560. // //
  561. //////////////////////////////////////////////////////////////////////////
  562. void SetDellDongle(PUCHAR UirPort,int Mode)
  563. {
  564. switch( Mode ) {
  565. case 0:
  566. NSC_WriteBankReg(UirPort,BANK7,4,0x02);
  567. NdisStallExecution( 20 );
  568. NSC_WriteBankReg(UirPort, BANK7, 4, 0x00);
  569. NdisStallExecution( 1000 );
  570. break;
  571. case 1:
  572. NSC_WriteBankReg(UirPort, BANK7, 4, 0x2);
  573. NdisStallExecution( 20 );
  574. NSC_WriteBankReg(UirPort, BANK7, 4, 0x82);
  575. NdisStallExecution( 10 );
  576. NSC_WriteBankReg(UirPort, BANK7, 4, 0x80);
  577. NdisStallExecution( 1000 );
  578. break;
  579. case 2:
  580. NSC_WriteBankReg(UirPort, BANK7, 4, 0x2);
  581. break;
  582. default:
  583. break;
  584. }
  585. }
  586. //////////////////////////////////////////////////////////////////////////
  587. // //
  588. // Function: SetIbmDongle //
  589. // Transceivers: two IBM31T1100 with IRSL0 selecting the mode for both //
  590. // transceivers. IRSL1 low selects front transceiver. //
  591. // IRSL2 low selects rear transceiver. //
  592. // Selection is thru the SouthernCross ASIC 0000020H2987 //
  593. // //
  594. // Description: //
  595. // Set the Ibm Transceiver mode //
  596. // Mode = 0 - SIR //
  597. // Mode = 1 - MIR, FIR, Sharp-IR //
  598. // Mode = 2 - Low Power Mode //
  599. // //
  600. //////////////////////////////////////////////////////////////////////////
  601. void SetIbmDongle (PUCHAR UirPort, int Mode)
  602. {
  603. switch( Mode ) {
  604. case 0:
  605. NSC_WriteBankReg(UirPort,BANK7,4,0x00);
  606. NdisStallExecution( 10 );
  607. NSC_WriteBankReg(UirPort,BANK7,4,0x01);
  608. NdisStallExecution( 20 );
  609. NSC_WriteBankReg(UirPort, BANK7, 4, 0x06);
  610. NdisStallExecution( 1000 );
  611. break;
  612. case 1:
  613. NSC_WriteBankReg(UirPort, BANK7, 4, 0x01);
  614. NdisStallExecution( 20 );
  615. NSC_WriteBankReg(UirPort, BANK7, 4, 0x81);
  616. NdisStallExecution( 10 );
  617. NSC_WriteBankReg(UirPort, BANK7, 4, 0x86);
  618. NdisStallExecution( 1000 );
  619. break;
  620. case 2:
  621. NSC_WriteBankReg(UirPort, BANK7, 4, 0x01);
  622. break;
  623. default:
  624. break;
  625. }
  626. }