Windows NT 4.0 source code leak
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.

777 lines
17 KiB

4 years ago
  1. /*
  2. * IDD_RUN.C - run (startup) and shutdown idd object
  3. */
  4. #include <ndis.h>
  5. #include <mytypes.h>
  6. #include <mydefs.h>
  7. #include <disp.h>
  8. #include <util.h>
  9. #include <idd.h>
  10. #include <res.h>
  11. /* a port descriptor */
  12. typedef struct
  13. {
  14. char *name; /* port name */
  15. INT must; /* mast map this port? */
  16. } PORT;
  17. /* port tables */
  18. static PORT api_rx_port_tbl[] =
  19. {
  20. { "b1_rx ", 1 },
  21. { "b2_rx ", 1 },
  22. { "uart_rx ", 0 },
  23. { "tdat ", 1 },
  24. { "Cm.0 ", 1 },
  25. { "Cm.1 ", 0 },
  26. { NULL }
  27. };
  28. static PORT api_tx_port_tbl[] =
  29. {
  30. { "b1_tx ", 1 },
  31. { "b2_tx ", 1 },
  32. { "uart_tx ", 0 },
  33. { "cmd ", 1 },
  34. { "Q931.0 ", 1 },
  35. { "Q931.1 ", 0 },
  36. { NULL }
  37. };
  38. /* partition queue table */
  39. static INT api_tx_partq_tbl[] =
  40. {
  41. 0, 1, 2, 3, 3, 3
  42. };
  43. /* local prototypes */
  44. INT api_setup(IDD* idd);
  45. INT api_map_ports(IDD* idd);
  46. INT api_bind_ports(IDD* idd);
  47. INT api_setup_partq(IDD* idd);
  48. INT api_alloc_partq(IDD* idd);
  49. #pragma NDIS_INIT_FUNCTION(idd_startup)
  50. /* startup (run) an idd object */
  51. INT
  52. idd_startup(VOID *idd_1)
  53. {
  54. IDD *idd = (IDD*)idd_1;
  55. INT ret;
  56. D_LOG(D_ENTRY, ("idd_startup: entry, idd: 0x%p", idd));
  57. /* lock idd */
  58. NdisAcquireSpinLock(&idd->lock);
  59. /* mark starting */
  60. idd->state = IDD_S_STARTUP;
  61. if (idd->btype != IDD_BT_DATAFIREU)
  62. while(!GetResourceSem (idd->res_mem));
  63. /* do the startup */
  64. if ( (ret = idd->LoadCode(idd)) != IDD_E_SUCC )
  65. {
  66. /* release idd */
  67. FreeResourceSem (idd->res_mem);
  68. NdisReleaseSpinLock(&idd->lock);
  69. D_LOG(D_EXIT, ("idd_startup: error exit, ret=0x%x", ret));
  70. return(ret);
  71. }
  72. /* initialize api level - talks to memory! */
  73. ret = api_setup(idd);
  74. /* change state */
  75. idd->state = IDD_S_RUN;
  76. if (idd->btype != IDD_BT_DATAFIREU)
  77. FreeResourceSem (idd->res_mem);
  78. /* release idd */
  79. NdisReleaseSpinLock(&idd->lock);
  80. /* return result */
  81. D_LOG(D_EXIT, ("idd_startup: exit, ret=0x%x", ret));
  82. return(ret);
  83. }
  84. /* shutdown an idd object, not implemented yet */
  85. INT
  86. idd_shutdown(VOID *idd_1)
  87. {
  88. IDD *idd = (IDD*)idd_1;
  89. D_LOG(D_ENTRY, ("idd_shutdown: idd: 0x%p", idd));
  90. idd->state = IDD_S_SHUTDOWN;
  91. idd->ResetAdapter(idd);
  92. return(IDD_E_SUCC);
  93. }
  94. #pragma NDIS_INIT_FUNCTION(IdpLoadCode)
  95. /* load idp code in & run it */
  96. INT
  97. IdpLoadCode(IDD *idd)
  98. {
  99. ULONG CurrentTime = 0, TimeOut = 0;
  100. USHORT bank, page, n, NumberOfBanks;
  101. UCHAR *fbin_data;
  102. NDIS_STATUS stat;
  103. UCHAR status = IDP_S_PEND;
  104. NDIS_PHYSICAL_ADDRESS pa = NDIS_PHYSICAL_ADDRESS_CONST(0xffffffff, 0xffffffff);
  105. D_LOG(D_ENTRY, ("load_code: entry, idd=0x%p", idd));
  106. /* setup pointers into shared memory */
  107. idd->IdpStat = (USHORT*)(idd->vhw.vmem + IDP_STS_WINDOW);
  108. idd->IdpCmd = (IDP_CMD*)(idd->vhw.vmem + IDP_CMD_WINDOW);
  109. idd->IdpEnv = (UCHAR*)(idd->vhw.vmem + IDP_ENV_WINDOW);
  110. /* setup base memory address registers */
  111. idd->SetBasemem(idd, idd->phw.base_mem);
  112. /* while in reset, clear all idp banks/pages */
  113. for ( bank = 0 ; bank < 3 ; bank++ )
  114. {
  115. /* setup bank */
  116. idd->SetBank(idd, (UCHAR)bank, 0);
  117. /* loop on pages */
  118. for ( page = 0 ; page < 4 ; page++ )
  119. {
  120. /* setup page */
  121. idd->ChangePage (idd, (UCHAR)page);
  122. /* zero out (has to be a word fill!) */
  123. IdpMemset((UCHAR*)idd->vhw.vmem, 0, 0x4000);
  124. }
  125. }
  126. //free page
  127. idd->ChangePage (idd, (UCHAR)IDD_PAGE_NONE);
  128. /* set idp to code bank, keep in reset */
  129. idd->SetBank(idd, IDD_BANK_CODE, 0);
  130. /* map file data in */
  131. NdisMapFile(&stat, (PVOID*)&fbin_data, idd->phw.fbin);
  132. if ( stat != NDIS_STATUS_SUCCESS )
  133. {
  134. D_LOG(D_ALWAYS, ("load_code: file mapping failed!, stat: 0x%x", stat));
  135. return(IDD_E_FMAPERR);
  136. }
  137. // code to check for filelength greater than 64K
  138. if (idd->phw.fbin_len > 0x10000)
  139. NumberOfBanks = 2;
  140. else
  141. NumberOfBanks = 1;
  142. for (n = 0; n < NumberOfBanks; n++)
  143. {
  144. /* copy data in (must be a word operation) */
  145. for ( page = 0 ; page < 4 ; page++ )
  146. {
  147. idd->ChangePage(idd, (UCHAR)page);
  148. IdpMemcpy((UCHAR*)idd->vhw.vmem,
  149. (UCHAR*)(fbin_data + (page * 0x4000) + (n * 0x10000)), 0x4000);
  150. // DbgPrint ("Load: Src: 0x%p, Dst: 0x%p, Page: %d\n",
  151. // (fbin_data + (page*0x4000) + (n * 0x10000)), idd->vhw.vmem, page);
  152. }
  153. /* set idp to data bank, keep in reset */
  154. idd->SetBank(idd, IDD_BANK_DATA, 0);
  155. }
  156. /* map file data out */
  157. NdisUnmapFile(idd->phw.fbin);
  158. /* switch back to buffer bank */
  159. idd->ChangePage(idd, 0);
  160. idd->SetBank(idd, IDD_BANK_BUF, 0);
  161. /* add 'no_uart' definition */
  162. NdisMoveMemory(idd->DefinitionTable + idd->DefinitionTableLength,
  163. "no_uart\0any\0",
  164. 12);
  165. idd->DefinitionTableLength += 12;
  166. /* load initial environment */
  167. NdisMoveToMappedMemory((PVOID)idd->IdpEnv, (PVOID)idd->DefinitionTable, idd->DefinitionTableLength);
  168. /* install startup byte signal */
  169. NdisMoveToMappedMemory((PVOID)&idd->IdpCmd->status, (PVOID)&status, sizeof(UCHAR));
  170. /* start idp running, wait for 1 second to complete */
  171. idd->SetBank(idd, IDD_BANK_BUF, 1);
  172. while ( !TimeOut )
  173. {
  174. NdisMoveFromMappedMemory((PVOID)&status, (PVOID)&idd->IdpCmd->status, sizeof(UCHAR));
  175. if ( !status )
  176. break;
  177. //
  178. // stall for a 1 millisecond
  179. //
  180. NdisStallExecution(1000L);
  181. //
  182. // add 1 millisecond to timeout counter
  183. //
  184. CurrentTime += 1;
  185. //
  186. // if timeout counter is greater the 2 seconds we have a problem
  187. //
  188. if ( CurrentTime > 2000)
  189. TimeOut = 1;
  190. }
  191. if (TimeOut)
  192. {
  193. D_LOG(D_ALWAYS, ("load_code: idp didn't start!"));
  194. idd->state = IDD_S_SHUTDOWN;
  195. /* unset page, free memory window */
  196. idd->ChangePage(idd, IDD_PAGE_NONE);
  197. return(IDD_E_RUNERR);
  198. }
  199. /* unset page, free memory window */
  200. idd->ChangePage(idd, IDD_PAGE_NONE);
  201. /* if here, idp runs now! */
  202. D_LOG(D_EXIT, ("load_code: exit, idp running"));
  203. return(IDD_E_SUCC);
  204. }
  205. #pragma NDIS_INIT_FUNCTION(AdpLoadCode)
  206. /* load idp code in & run it */
  207. INT
  208. AdpLoadCode(IDD *idd)
  209. {
  210. UCHAR *Zero;
  211. UCHAR *fbin_data, status;
  212. NDIS_STATUS stat;
  213. ADP_BIN_HEADER *Header;
  214. ADP_BIN_BLOCK *Block, *FirstBlock;
  215. ULONG CurrentTime = 0, TimeOut = 0;
  216. USHORT BlockCount = 0;
  217. ULONG n;
  218. NDIS_PHYSICAL_ADDRESS HighestAcceptableMax = NDIS_PHYSICAL_ADDRESS_CONST(-1, -1);
  219. D_LOG(D_ENTRY, ("AdpLoadCode: entry, idd: 0x%p", idd));
  220. //
  221. // reset the adapter
  222. //
  223. AdpWriteControlBit(idd, ADP_RESET_BIT, 1);
  224. //
  225. // clear adapter memory
  226. //
  227. D_LOG(D_ENTRY, ("AdpLoadCode: Clear Memory"));
  228. NdisAllocateMemory((PVOID*)&Zero,
  229. 0xFFFF,
  230. 0,
  231. HighestAcceptableMax);
  232. NdisZeroMemory(Zero, 1024);
  233. for (n = 0; n < ADP_RAM_SIZE; n += 0xFFFF)
  234. AdpPutBuffer(idd, n, Zero, (USHORT)0xFFFF);
  235. NdisFreeMemory(Zero, 0xFFFF, 0);
  236. //
  237. // map file data into memory
  238. //
  239. NdisMapFile(&stat, (PVOID*)&fbin_data, idd->phw.fbin);
  240. if ( stat != NDIS_STATUS_SUCCESS )
  241. {
  242. D_LOG(D_ALWAYS, ("AdpLoadCode: file mapping failed!, stat: 0x%x", stat));
  243. return(IDD_E_FMAPERR);
  244. }
  245. //
  246. // Get bin file header
  247. //
  248. (UCHAR*)Header = fbin_data;
  249. if (Header->Format != ADP_BIN_FORMAT)
  250. return(IDD_E_FMAPERR);
  251. //
  252. // Check file size
  253. //
  254. if (Header->ImageSize > ADP_RAM_SIZE)
  255. return(IDD_E_FMAPERR);
  256. BlockCount = Header->BlockCount;
  257. (UCHAR*)FirstBlock = fbin_data + sizeof(ADP_BIN_HEADER);
  258. for (n = 0; n < BlockCount; n++)
  259. {
  260. Block = FirstBlock + n;
  261. AdpPutBuffer(idd, Block->Address, Block->Data, ADP_BIN_BLOCK_SIZE);
  262. }
  263. //
  264. // unmap file data
  265. //
  266. NdisUnmapFile(idd->phw.fbin);
  267. //
  268. // add initial enviornment
  269. //
  270. /* add 'no_uart' definition */
  271. NdisMoveMemory(idd->DefinitionTable + idd->DefinitionTableLength, "no_uart\0any\0", 12);
  272. idd->DefinitionTableLength += 12;
  273. D_LOG(D_ENTRY, ("AdpLoadCode: Add Enviornment"));
  274. AdpPutBuffer(idd, ADP_ENV_WINDOW, idd->DefinitionTable, idd->DefinitionTableLength);
  275. //
  276. // write startup byte
  277. //
  278. AdpWriteCommandStatus(idd, ADP_S_PEND);
  279. //
  280. // release processor from reset
  281. //
  282. AdpWriteControlBit(idd, ADP_RESET_BIT, 0);
  283. while ( !TimeOut )
  284. {
  285. status = AdpReadCommandStatus(idd);
  286. if ( !status )
  287. break;
  288. //
  289. // stall for a 1 millisecond
  290. //
  291. NdisStallExecution(1000L);
  292. //
  293. // add 1 millisecond to timeout counter
  294. //
  295. CurrentTime += 1;
  296. //
  297. // if timeout counter is greater the 2 seconds we have a problem
  298. //
  299. if ( CurrentTime > 2000)
  300. TimeOut = 1;
  301. }
  302. if (TimeOut)
  303. {
  304. D_LOG(D_ALWAYS, ("AdpLodeCode: Adp didn't start!"));
  305. return(IDD_E_RUNERR);
  306. }
  307. /* if here, Adp runs now! */
  308. D_LOG(D_EXIT, ("AdpLoadCode: exit, Adp running"));
  309. return(IDD_E_SUCC);
  310. }
  311. #pragma NDIS_INIT_FUNCTION(api_setup)
  312. /* setup idp api related fields */
  313. INT
  314. api_setup(IDD *idd)
  315. {
  316. INT ret;
  317. D_LOG(D_ENTRY, ("api_setup: entry, idd: 0x%p", idd));
  318. /* map port names */
  319. if ( (ret = api_map_ports(idd)) != IDD_E_SUCC )
  320. return(ret);
  321. /* bind ports to status bits */
  322. if ( (ret = api_bind_ports(idd)) != IDD_E_SUCC )
  323. return(ret);
  324. /* setup partition queues */
  325. if ( (ret = api_setup_partq(idd)) != IDD_E_SUCC )
  326. return(ret);
  327. /* allocate initial buffers off partition queues */
  328. if ( (ret = api_alloc_partq(idd)) != IDD_E_SUCC )
  329. return(ret);
  330. D_LOG(D_EXIT, ("api_setup: exit, success"));
  331. return(IDD_E_SUCC);
  332. }
  333. #pragma NDIS_INIT_FUNCTION(api_map_ports)
  334. /* map port names to ids */
  335. INT
  336. api_map_ports(IDD *idd)
  337. {
  338. INT n;
  339. D_LOG(D_ENTRY, ("api_map_ports: entry, idd: 0x%p", idd));
  340. /* map rx ports */
  341. for ( n = 0 ; api_rx_port_tbl[n].name ; n++ )
  342. {
  343. idd->rx_port[n] = idd->ApiGetPort(idd, api_rx_port_tbl[n].name);
  344. D_LOG(D_ALWAYS, ("api_map_ports: RxPorts: PortName: %s, PortId: 0x%x", api_rx_port_tbl[n].name, idd->rx_port[n]));
  345. if ( !idd->rx_port[n] && api_rx_port_tbl[n].must )
  346. {
  347. D_LOG(D_ALWAYS, ("api_map_ports: failed to map rx port [%s]", \
  348. api_rx_port_tbl[n].name));
  349. return(IDD_E_PORTMAPERR);
  350. }
  351. }
  352. /* map tx ports */
  353. for ( n = 0 ; api_tx_port_tbl[n].name ; n++ )
  354. {
  355. idd->tx_port[n] = idd->ApiGetPort(idd, api_tx_port_tbl[n].name);
  356. D_LOG(D_ALWAYS, ("api_map_ports: TxPorts: PortName: %s, PortId: 0x%x", api_tx_port_tbl[n].name, idd->tx_port[n]));
  357. if ( !idd->tx_port[n] && api_tx_port_tbl[n].must )
  358. {
  359. D_LOG(D_ALWAYS, ("api_map_ports: failed to map tx port [%s]", \
  360. api_tx_port_tbl[n].name));
  361. return(IDD_E_PORTMAPERR);
  362. }
  363. }
  364. return(IDD_E_SUCC);
  365. }
  366. #pragma NDIS_INIT_FUNCTION(api_bind_ports)
  367. /* bind ports to status bits */
  368. INT
  369. api_bind_ports(IDD *idd)
  370. {
  371. INT n;
  372. D_LOG(D_ENTRY, ("api_bind_ports: entry, idd: 0x%p", idd));
  373. /* bind rx ports */
  374. for ( n = 0 ; api_rx_port_tbl[n].name; n++ )
  375. {
  376. if (idd->rx_port[n])
  377. if ( idd->ApiBindPort(idd, idd->rx_port[n], (USHORT)(1 << n)) < 0 )
  378. {
  379. D_LOG(D_ALWAYS, ("api_bind_ports: failed to bind status bit on port [%s]", \
  380. api_rx_port_tbl[n].name));
  381. return(IDD_E_PORTBINDERR);
  382. }
  383. }
  384. return(IDD_E_SUCC);
  385. }
  386. #pragma NDIS_INIT_FUNCTION(api_setup_partq)
  387. /* setup partition queues */
  388. INT
  389. api_setup_partq(IDD *idd)
  390. {
  391. INT n;
  392. D_LOG(D_ENTRY, ("api_setup_partq: entry, idd: 0x%p", idd));
  393. /* simply copy table */
  394. for ( n = 0 ; n < IDD_TX_PORTS ; n++ )
  395. idd->tx_partq[n] = api_tx_partq_tbl[n];
  396. return(IDD_E_SUCC);
  397. }
  398. #pragma NDIS_INIT_FUNCTION(api_alloc_partq)
  399. /* allocate initial buffers off partition queues */
  400. INT
  401. api_alloc_partq(IDD *idd)
  402. {
  403. INT n, part;
  404. D_LOG(D_ENTRY, ("api_alloc_partq: entry, idd: 0x%p", idd));
  405. /* scan using partq_tbl as a refrence. allocate only once per partq */
  406. for ( n = 0 ; n < IDD_TX_PORTS ; n++ )
  407. if ( !idd->tx_buf[part = api_tx_partq_tbl[n]] )
  408. {
  409. if ( !(idd->tx_buf[part] = idd->ApiAllocBuffer(idd, part)) )
  410. {
  411. D_LOG(D_ALWAYS, ("api_alloc_partq: failed to alloc initial buffer, part: %d", part));
  412. DbgPrint("api_alloc_partq: failed to alloc initial buffer, part: %d\n", part);
  413. return(IDD_E_PARTQINIT);
  414. }
  415. #if DBG
  416. ASSERT(!idd->BufferStuff[part].Buffer[0]);
  417. idd->BufferStuff[part].Buffer[0] = idd->tx_buf[part];
  418. idd->BufferStuff[part].Count++;
  419. idd->BufferStuff[part].Put++;
  420. idd->BufferStuff[part].Get = 0;
  421. ASSERT(idd->BufferStuff[part].Count < 32);
  422. #endif
  423. }
  424. return(IDD_E_SUCC);
  425. }
  426. #pragma NDIS_INIT_FUNCTION(IdpGetPort)
  427. /* get port id from a name */
  428. USHORT
  429. IdpGetPort(IDD *idd, CHAR name[8])
  430. {
  431. UCHAR status;
  432. USHORT port_id;
  433. D_LOG(D_ENTRY, ("IdpGetPort: entry, idd: 0x%p, name: [%s]", idd, name));
  434. idd->ChangePage(idd, 0);
  435. /* install target name & execute a map */
  436. NdisMoveToMappedMemory ((CHAR *)idd->IdpCmd->port_name, (CHAR *)name, 8);
  437. status = idd->Execute(idd, IDP_L_MAP);
  438. NdisMoveFromMappedMemory((PVOID)&port_id, (PVOID)&idd->IdpCmd->port_id, sizeof(USHORT));
  439. idd->ChangePage(idd, IDD_PAGE_NONE);
  440. D_LOG(D_EXIT, ("IdpGetPort: exit, port_id: 0x%x", port_id));
  441. return( (status == IDP_S_OK) ? port_id : 0);
  442. }
  443. #pragma NDIS_INIT_FUNCTION(AdpGetPort)
  444. /* get port id from a name */
  445. USHORT
  446. AdpGetPort(IDD *idd, CHAR name[8])
  447. {
  448. UCHAR status;
  449. D_LOG(D_ENTRY, ("AdpGetPort: entry, idd: 0x%p, name: [%s]", idd, name));
  450. //
  451. // clear command structure
  452. //
  453. NdisZeroMemory(&idd->AdpCmd, sizeof(ADP_CMD));
  454. //
  455. // put port name in command structure
  456. //
  457. NdisMoveMemory((PVOID)&idd->AdpCmd.port_name, name, 8);
  458. //
  459. // execute command
  460. //
  461. status = idd->Execute(idd, ADP_L_MAP);
  462. //
  463. // check return status
  464. //
  465. if (status != ADP_S_OK)
  466. return(0);
  467. D_LOG(D_ALWAYS, ("AdpGetPort: PortId: 0x%x", idd->AdpCmd.port_id));
  468. //
  469. // return port
  470. //
  471. return(idd->AdpCmd.port_id);
  472. }
  473. #pragma NDIS_INIT_FUNCTION(IdpBindPort)
  474. /* bind a port to a status bit */
  475. INT
  476. IdpBindPort(IDD *idd, USHORT port, USHORT bitpatt)
  477. {
  478. UCHAR status;
  479. D_LOG(D_ENTRY, ("IdpBindPort: entry, idd: 0x%p, port: 0x%x, bitpatt: 0x%x",
  480. idd, port, bitpatt));
  481. idd->ChangePage(idd, 0);
  482. /* fillup cmd & execute a bind */
  483. NdisMoveToMappedMemory((PVOID)&idd->IdpCmd->port_id, (PVOID)&port, sizeof(USHORT));
  484. NdisMoveToMappedMemory((PVOID)&idd->IdpCmd->port_bitpatt, (PVOID)&bitpatt, sizeof(USHORT));
  485. status = idd->Execute(idd, IDP_L_BIND);
  486. idd->ChangePage(idd, IDD_PAGE_NONE);
  487. return( (status == IDP_S_OK) ? 0 : -1 );
  488. }
  489. #pragma NDIS_INIT_FUNCTION(AdpBindPort)
  490. /* bind a port to a status bit */
  491. INT
  492. AdpBindPort(IDD *idd, USHORT port, USHORT bitpatt)
  493. {
  494. UCHAR status;
  495. D_LOG(D_ENTRY, ("AdpBindPort: entry, idd: 0x%p, port: 0x%x, bitpatt: 0x%x",
  496. idd, port, bitpatt));
  497. //
  498. // clear command structure
  499. //
  500. NdisZeroMemory(&idd->AdpCmd, sizeof(ADP_CMD));
  501. //
  502. // fill port id and status bit
  503. //
  504. idd->AdpCmd.port_id = port;
  505. idd->AdpCmd.port_bitpatt = bitpatt;
  506. //
  507. // execute command
  508. //
  509. status = idd->Execute(idd, ADP_L_BIND);
  510. D_LOG(D_ALWAYS, ("AdpBindPort: ExecuteStatus: 0x%x", status));
  511. if (status != ADP_S_OK)
  512. return(1);
  513. return(0);
  514. }
  515. #pragma NDIS_INIT_FUNCTION(IdpAllocBuf)
  516. /* allocate a buffer off a partition */
  517. ULONG
  518. IdpAllocBuf(IDD *idd, INT part)
  519. {
  520. UCHAR status;
  521. ULONG msg_bufptr;
  522. ULONG temp;
  523. D_LOG(D_ENTRY, ("IdpAllocBuf: entry, idd: 0x%p, part: %d", idd, part));
  524. idd->ChangePage(idd, 0);
  525. /* fillup & execute */
  526. temp = (ULONG)(part + 4);
  527. NdisMoveToMappedMemory ((PVOID)&idd->IdpCmd->msg_param, (PVOID)&temp, sizeof (ULONG));
  528. status = idd->Execute(idd, IDP_L_GET_WBUF);
  529. NdisMoveFromMappedMemory((PVOID)&msg_bufptr, (PVOID)&idd->IdpCmd->msg_bufptr, (ULONG)sizeof (ULONG));
  530. idd->ChangePage(idd, IDD_PAGE_NONE);
  531. return( (status == IDP_S_OK) ? msg_bufptr : 0 );
  532. }
  533. #pragma NDIS_INIT_FUNCTION(AdpAllocBuf)
  534. /* allocate a buffer off a partition */
  535. ULONG
  536. AdpAllocBuf(IDD *idd, INT part)
  537. {
  538. UCHAR status;
  539. D_LOG(D_ENTRY, ("AdpAllocBuf: entry, idd: 0x%p, part: %d", idd, part));
  540. //
  541. // clear command structure
  542. //
  543. NdisZeroMemory(&idd->AdpCmd, sizeof(ADP_CMD));
  544. //
  545. // fill port id and status bit
  546. //
  547. idd->AdpCmd.msg_param = (UCHAR)part + 4;
  548. //
  549. // execute command
  550. //
  551. status = idd->Execute(idd, ADP_L_GET_WBUF);
  552. D_LOG(D_ALWAYS, ("AdpAllocBuf: status: 0x%x, BufPtr: 0x%x", status, idd->AdpCmd.msg_bufptr));
  553. return ((status == ADP_S_OK) ? (ULONG)idd->AdpCmd.msg_bufptr : 0);
  554. }
  555. /* reset idp board */
  556. INT
  557. IdpResetBoard(IDD *idd)
  558. {
  559. USHORT bank, page;
  560. D_LOG(D_ENTRY, ("reset_board: entry, idd: 0x%p", idd));
  561. /* while in reset, clear all idp banks/pages */
  562. for ( bank = 0 ; bank < 3 ; bank++ )
  563. {
  564. /* setup bank */
  565. idd->SetBank(idd, (UCHAR)bank, 0);
  566. /* loop on pages */
  567. for ( page = 0 ; page < 4 ; page++ )
  568. {
  569. /* setup page */
  570. idd->ChangePage (idd, (UCHAR)page);
  571. /* zero out (has to be a word fill!) */
  572. IdpMemset((UCHAR*)idd->vhw.vmem, 0, 0x4000);
  573. }
  574. }
  575. idd->SetBank(idd, IDD_BANK_CODE, 0);
  576. //free page
  577. idd->ChangePage (idd, (UCHAR)IDD_PAGE_NONE);
  578. return(IDD_E_SUCC);
  579. }
  580. /* reset idp board */
  581. INT
  582. AdpResetBoard(IDD *idd)
  583. {
  584. //
  585. // reset the adapter
  586. //
  587. AdpWriteControlBit(idd, ADP_RESET_BIT, 1);
  588. return(IDD_E_SUCC);
  589. }