- Timestamp:
- Sep 20, 1999, 12:21:58 PM (26 years ago)
- Location:
- trunk/src/wnaspi32
- Files:
-
- 3 added
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/wnaspi32/makefile
r938 r987 1 # $Id: makefile,v 1. 1 1999-09-15 11:25:04phaller Exp $1 # $Id: makefile,v 1.2 1999-09-20 10:18:58 phaller Exp $ 2 2 3 3 # … … 21 21 TARGET = wnaspi32 22 22 23 OBJS = winaspi32.obj initterm.obj23 OBJS = odinaspi.obj winaspi32.obj initterm.obj 24 24 25 25 all: $(TARGET).dll $(TARGET).lib … … 30 30 $(PDWIN32_LIB)/pmwinx.lib $(PDWIN32_LIB)/kernel32.lib \ 31 31 $(PDWIN32_LIB)/odincrt.lib OS2386.LIB $(RTLLIB_O) \ 32 $(PDWIN32_LIB)/ ole32.lib $(PDWIN32_LIB)/msvfw32.lib32 $(PDWIN32_LIB)/advapi32.lib 33 33 $(CP) $@ $(PDWIN32_BIN) 34 34 … … 40 40 41 41 initterm.obj: initterm.cpp 42 ainaspi32.obj: wnaspi32.cpp 43 42 ainaspi32.obj: wnaspi32.cpp odinaspi.h srbos2.h 43 odinaspi.obj: odinaspi.cpp odinaspi.h srbos2.h 44 44 clean: 45 45 $(RM) *.obj *.lib *.dll *~ *.map *.pch -
trunk/src/wnaspi32/winaspi32.cpp
r938 r987 1 #include <odin.h> 2 1 #include <os2win.h> 3 2 #include <stdlib.h> 4 3 #include <sys/types.h> … … 9 8 // #include <unistd.h> 10 9 11 #include "winbase.h"12 10 #include "aspi.h" 13 11 #include "wnaspi32.h" 12 #include <winreg.h> 14 13 #include "options.h" 15 #include "heap.h"16 14 #include "debugtools.h" 17 #include "ldt.h" 15 16 #include "srbos2.h" 17 #include "odinaspi.h" 18 18 //#include "callback.h" 19 19 … … 326 326 #endif 327 327 328 // OS/2 ODIN implemetation code 329 #ifdef _ODIN_H_ 330 331 static void 332 ASPI_DebugPrintCmd(SRB_ExecSCSICmd *prb) 333 { 334 BYTE cmd; 335 int i; 336 BYTE *cdb; 337 338 switch (prb->CDBByte[0]) { 339 case CMD_INQUIRY: 340 TRACE("{\n"); 341 TRACE("\tEVPD: %d\n", prb->CDBByte[1] & 1); 342 TRACE("\tLUN: %d\n", (prb->CDBByte[1] & 0xc) >> 1); 343 TRACE("\tPAGE CODE: %d\n", prb->CDBByte[2]); 344 TRACE("\tALLOCATION LENGTH: %d\n", prb->CDBByte[4]); 345 TRACE("\tCONTROL: %d\n", prb->CDBByte[5]); 346 TRACE("}\n"); 347 break; 348 case CMD_SCAN_SCAN: 349 TRACE("Transfer Length: %d\n", prb->CDBByte[4]); 350 break; 351 } 352 353 TRACE("Host Adapter: %d\n", prb->SRB_HaId); 354 TRACE("Flags: %d\n", prb->SRB_Flags); 355 if (TARGET_TO_HOST(prb)) { 356 TRACE("\tData transfer: Target to host. Length checked.\n"); 357 } 358 else if (HOST_TO_TARGET(prb)) { 359 TRACE("\tData transfer: Host to target. Length checked.\n"); 360 } 361 else if (NO_DATA_TRANSFERED(prb)) { 362 TRACE("\tData transfer: none\n"); 363 } 364 else { 365 WARN("\tTransfer by scsi cmd. Length not checked.\n"); 366 } 367 368 TRACE("\tResidual byte length reporting %s\n", prb->SRB_Flags & 0x4 ? "enabled" : "disabled"); 369 TRACE("\tLinking %s\n", prb->SRB_Flags & 0x2 ? "enabled" : "disabled"); 370 TRACE("\tPosting %s\n", prb->SRB_Flags & 0x1 ? "enabled" : "disabled"); 371 TRACE("Target: %d\n", prb->SRB_Target); 372 TRACE("Lun: %d\n", prb->SRB_Lun); 373 TRACE("BufLen: %ld\n", prb->SRB_BufLen); 374 TRACE("SenseLen: %d\n", prb->SRB_SenseLen); 375 TRACE("BufPtr: %p\n", prb->SRB_BufPointer); 376 TRACE("CDB Length: %d\n", prb->SRB_CDBLen); 377 TRACE("POST Proc: %lx\n", (DWORD) prb->SRB_PostProc); 378 cdb = &prb->CDBByte[0]; 379 cmd = prb->CDBByte[0]; 380 if (TRACE_ON(aspi)) 381 { 382 DPRINTF("CDB buffer["); 383 for (i = 0; i < prb->SRB_CDBLen; i++) { 384 if (i != 0) DPRINTF(","); 385 DPRINTF("%02x", *cdb++); 386 } 387 DPRINTF("]\n"); 388 } 389 } 390 391 static void 392 ASPI_PrintSenseArea(SRB_ExecSCSICmd *prb) 393 { 394 int i; 395 BYTE *cdb; 396 397 if (TRACE_ON(aspi)) 398 { 399 cdb = &prb->CDBByte[0]; 400 DPRINTF("SenseArea["); 401 for (i = 0; i < prb->SRB_SenseLen; i++) { 402 if (i) DPRINTF(","); 403 DPRINTF("%02x", *cdb++); 404 } 405 DPRINTF("]\n"); 406 } 407 } 408 409 static void 410 ASPI_DebugPrintResult(SRB_ExecSCSICmd *prb) 411 { 412 413 switch (prb->CDBByte[0]) { 414 case CMD_INQUIRY: 415 TRACE("Vendor: '%s'\n", prb->SRB_BufPointer + INQUIRY_VENDOR); 416 break; 417 case CMD_TEST_UNIT_READY: 418 ASPI_PrintSenseArea(prb); 419 break; 420 } 421 } 422 423 424 static WORD 425 ASPI_ExecScsiCmd( PODINASPIDATA pData, 426 SRB_ExecSCSICmd *lpPRB) 427 { 428 int status; 429 int error_code = 0; 430 SRBOS2 SRBlock; 431 LONG rc; 432 433 ASPI_DebugPrintCmd(lpPRB); 434 435 lpPRB->SRB_Status = SS_PENDING; 436 437 if (!lpPRB->SRB_CDBLen) 438 { 439 WARN("Failed: lpPRB->SRB_CDBLen = 0.\n"); 440 lpPRB->SRB_Status = SS_ERR; 441 return SS_ERR; 442 } 443 444 if(MaxCDBStatus<lpPRB->SRB_CDBLen) 445 { 446 WARN("Failed: lpPRB->SRB_CDBLen > 64.\n"); 447 lpPRB->SRB_Status = SS_ERR; 448 return SS_ERR; 449 } 450 451 if(lpPRB->SRB_BufLen>65536) // Check Max 64k!! 452 { 453 WARN("Failed: lpPRB->SRB_BufLen > 65536.\n"); 454 lpPRB->SRB_Status = SS_BUFFER_TO_BIG; 455 return SS_BUFFER_TO_BIG; 456 } 457 458 // copy up to LUN SRBOS2 has no WORD for padding like in WINE 459 memcpy( &SRBlock, 460 lpPRB, 461 6* sizeof(BYTE) + sizeof(DWORD)); 462 SRBlock.flags |= SRB_Post; 463 SRBlock.u.cmd.sense_len = 32; // length of sense buffer 464 SRBlock.u.cmd.data_ptr = NULL; // pointer to data buffer 465 SRBlock.u.cmd.link_ptr = NULL; // pointer to next SRB 466 SRBlock.u.cmd.cdb_len = lpPRB->SRB_CDBLen; // SCSI command length 467 memcpy( &SRBlock.u.cmd.cdb_st[0], 468 &lpPRB->CDBByte[0], 469 lpPRB->SRB_CDBLen); 470 471 if (HOST_TO_TARGET(lpPRB)) 472 { 473 // Write: Copy all Data to Communication Buffer 474 if (lpPRB->SRB_BufLen) 475 { 476 memcpy( pData->pvBuffer, 477 lpPRB->SRB_BufPointer, 478 lpPRB->SRB_BufLen); 479 } 480 } 481 482 rc = lSendSRBlock( pData->hfDriver, 483 &SRBlock, 484 &SRBlock); 485 486 if(!rc) 487 { 488 if( fWaitPost(pData->hevPost)) 489 { 490 if (TARGET_TO_HOST(lpPRB)) 491 { 492 // Was Read : Copy all Data from Communication Buffer 493 if (lpPRB->SRB_BufLen) 494 { 495 memcpy( lpPRB->SRB_BufPointer, 496 pData->pvBuffer, 497 lpPRB->SRB_BufLen); 498 } 499 } 500 501 if (lpPRB->SRB_SenseLen) 502 { 503 int sense_len = lpPRB->SRB_SenseLen; 504 if (lpPRB->SRB_SenseLen > 32) 505 sense_len = 32; 506 memcpy( SENSE_BUFFER(lpPRB), 507 &SRBlock.u.cmd.cdb_st[SRBlock.u.cmd.cdb_len], 508 sense_len); 509 } 510 511 /* now do posting */ 512 513 if (lpPRB->SRB_PostProc) 514 { 515 if (ASPI_POSTING(lpPRB)) 516 { 517 TRACE("Post Routine (%lx) called\n", (DWORD) lpPRB->SRB_PostProc); 518 (*lpPRB->SRB_PostProc)(); 519 } 520 else 521 if (lpPRB->SRB_Flags & SRB_EVENT_NOTIFY) 522 { 523 TRACE("Setting event %04x\n", (HANDLE)lpPRB->SRB_PostProc); 524 SetEvent((HANDLE)lpPRB->SRB_PostProc); /* FIXME: correct ? */ 525 } 526 } 527 } 528 lpPRB->SRB_Status = SRBlock.status; 529 lpPRB->SRB_HaStat = SRBlock.u.cmd.ha_status; 530 lpPRB->SRB_TargStat = SRBlock.u.cmd.target_status; 531 } 532 else 533 lpPRB->SRB_Status = SS_ERR; 534 535 536 ASPI_DebugPrintResult(lpPRB); 537 538 return lpPRB->SRB_Status; 539 540 } 541 #endif 328 542 329 543 /******************************************************************* … … 337 551 * LOBYTE of LOWORD: # of host adapters. 338 552 */ 553 #ifdef _ODIN_H_ 339 554 DWORD WINAPI GetASPI32SupportInfo() 340 555 { 341 return ((SS_COMP << 8) | 1); /* FIXME: get # of host adapters installed */ 342 } 343 556 LONG rc; 557 ODINASPIDATA aspi; 558 ULONG hmtxDriver; 559 BYTE bNumDrv; 560 HKEY hkeyDrvInfo; 561 DWORD dwType; 562 DWORD dwData; 563 DWORD dwSize; 564 SRBOS2 SRBlock; 565 ULONG ulParam, ulReturn; 566 BYTE brc; 567 568 bNumDrv = 0; 569 570 if( fGainDrvAccess( FALSE, &hmtxDriver) ) // Do nonblocking call for info 571 { 572 brc = bOpenASPI(&aspi); 573 if(SS_COMP==brc ) 574 { 575 SRBlock.cmd=SRB_Inquiry; // host adapter inquiry 576 SRBlock.ha_num=0; // host adapter number 577 SRBlock.flags=0; // no flags set 578 579 rc = lSendSRBlock( aspi.hfDriver, 580 &SRBlock, 581 &SRBlock); 582 583 if (!rc) 584 { 585 bNumDrv = SRBlock.u.inq.num_ha; 586 587 rc = RegOpenKeyA ( HKEY_LOCAL_MACHINE, 588 "Software\\ODIN\\ASPIROUT", 589 &hkeyDrvInfo); 590 if(ERROR_SUCCESS==rc) 591 { 592 dwData = bNumDrv; 593 RegSetValueExA( hkeyDrvInfo, 594 "NumAdapers", 595 NULL, 596 REG_DWORD, 597 (LPBYTE)&dwData, 598 sizeof(DWORD)); 599 RegCloseKey( hkeyDrvInfo); 600 } 601 } 602 603 fCloseASPI(&aspi); 604 } 605 else 606 brc = SS_FAILED_INIT; 607 608 fReleaseDrvAccess( hmtxDriver); 609 } 610 else 611 { 612 // Driver is used by other process/thread 613 // so try get value form registry 614 615 brc = SS_FAILED_INIT; 616 rc = RegOpenKeyA ( HKEY_LOCAL_MACHINE, 617 "Software\\ODIN\\ASPIROUT", 618 &hkeyDrvInfo); 619 620 if(ERROR_SUCCESS!=rc) 621 return ((SS_FAILED_INIT << 8) | bNumDrv); 622 623 dwSize = sizeof(DWORD); 624 rc = RegQueryValueExA( hkeyDrvInfo, 625 "NumAdapers", 626 NULL, 627 &dwType, 628 (BYTE*)&dwData, 629 &dwSize); 630 631 RegCloseKey( hkeyDrvInfo); 632 633 if( (ERROR_SUCCESS==rc) && 634 (REG_DWORD != dwType) ) 635 { 636 bNumDrv = 0xFF & dwData; 637 brc = SS_COMP; 638 } 639 } 640 641 return ((brc << 8) | bNumDrv); /* FIXME: get # of host adapters installed */ 642 } 643 #else 644 DWORD WINAPI GetASPI32SupportInfo() 645 { 646 return ((SS_COMP << 8) | 1); /* FIXME: get # of host adapters installed */ 647 } 648 #endif 344 649 345 650 /*********************************************************************** … … 374 679 return SS_INVALID_SRB; 375 680 #else 376 return SS_INVALID_SRB; 681 #ifdef _ODIN_H_ 682 683 SRBOS2 SRBlock; 684 DWORD dwRC; 685 ULONG ulParam, ulReturn; 686 BYTE bRC; 687 ODINASPIDATA aspi; 688 ULONG hmtxDriver; 689 LONG rc; 690 691 if(NULL==lpSRB) 692 return SS_INVALID_SRB; // Not sure what to return here but that is an error 693 694 // test first for a valid command 695 if( (SC_HA_INQUIRY!=lpSRB->common.SRB_Cmd) && 696 (SC_GET_DEV_TYPE!=lpSRB->common.SRB_Cmd) && 697 (SC_EXEC_SCSI_CMD!=lpSRB->common.SRB_Cmd) && 698 (SC_ABORT_SRB!=lpSRB->common.SRB_Cmd) && 699 (SC_RESET_DEV!=lpSRB->common.SRB_Cmd) ) 700 return SS_INVALID_SRB; // shoud be invalid command 701 702 dwRC = SS_ERR; 703 704 if( fGainDrvAccess( TRUE, &hmtxDriver) ) // Block if a SRB is pending 705 { 706 bRC = bOpenASPI( &aspi); 707 if(SS_COMP==bRC) 708 { 709 switch (lpSRB->common.SRB_Cmd) 710 { 711 case SC_HA_INQUIRY: 712 SRBlock.cmd=SRB_Inquiry; // host adapter inquiry 713 SRBlock.ha_num=lpSRB->inquiry.SRB_HaId; // host adapter number 714 SRBlock.flags=0; // no flags set 715 716 rc = lSendSRBlock( aspi.hfDriver, 717 &SRBlock, 718 &SRBlock); 719 if (!rc) 720 { 721 memcpy( lpSRB, 722 &SRBlock, 723 sizeof(SRB_HaInquiry) ); 724 dwRC = SRBlock.status; 725 } 726 break; 727 case SC_GET_DEV_TYPE: 728 memcpy( &SRBlock, 729 lpSRB, 730 sizeof(SRB_GDEVBlock)); 731 SRBlock.flags = 0; 732 733 rc = lSendSRBlock( aspi.hfDriver, 734 &SRBlock, 735 &SRBlock); 736 737 if (!rc) 738 { 739 memcpy( lpSRB, 740 &SRBlock, 741 sizeof(SRB_GDEVBlock) ); 742 lpSRB->devtype.SRB_Rsvd1 = 0x00; 743 dwRC = SRBlock.status; 744 } 745 746 break; 747 case SC_EXEC_SCSI_CMD: 748 dwRC = ASPI_ExecScsiCmd( &aspi, 749 &lpSRB->cmd); 750 break; 751 case SC_ABORT_SRB: 752 dwRC = SS_INVALID_SRB; // We don't do async ASPI so no way to abort 753 break; 754 case SC_RESET_DEV: 755 memset( &SRBlock, 756 0, 757 sizeof(SRBOS2) ); 758 SRBlock.cmd = lpSRB->reset.SRB_Cmd; /* ASPI command code = SC_RESET_DEV */ 759 SRBlock.status = lpSRB->reset.SRB_Status; /* ASPI command status byte */ 760 SRBlock.ha_num = lpSRB->reset.SRB_HaId; /* ASPI host adapter number */ 761 SRBlock.flags = SRB_Post; 762 SRBlock.u.res.target = lpSRB->reset.SRB_Target; /* Target's SCSI ID */ 763 SRBlock.u.res.lun = lpSRB->reset.SRB_Lun; /* Target's LUN number */ 764 765 rc = lSendSRBlock( aspi.hfDriver, 766 &SRBlock, 767 &SRBlock); 768 769 if (!rc) 770 { 771 fWaitPost( aspi.hevPost ); 772 lpSRB->reset.SRB_Status = SRBlock.status; 773 lpSRB->reset.SRB_Flags = SRBlock.flags; 774 lpSRB->reset.SRB_Hdr_Rsvd = 0; 775 memset( lpSRB->reset.SRB_Rsvd1, 776 0, 777 12 ); 778 lpSRB->reset.SRB_HaStat = SRBlock.u.res.ha_status; /* Host Adapter Status */ 779 lpSRB->reset.SRB_TargStat = SRBlock.u.res.target_status; /* Target Status */ 780 lpSRB->reset.SRB_PostProc = NULL; /* Post routine */ 781 lpSRB->reset.SRB_Rsvd2 = NULL; /* Reserved */ 782 memset( lpSRB->reset.SRB_Rsvd3, 783 0, 784 32); /* Reserved */ 785 dwRC = SRBlock.status; 786 } 787 break; 788 } // end switch (lpSRB->common.SRB_Cmd) 789 790 fCloseASPI(&aspi); 791 } 792 else 793 { 794 dwRC = bRC; 795 } 796 797 fReleaseDrvAccess( hmtxDriver); 798 } 799 else 800 { 801 dwRC = SS_NO_ASPI; 802 } 803 804 return dwRC; 805 806 #else 807 return SS_INVALID_SRB; 808 #endif 377 809 #endif 378 810 } … … 386 818 { 387 819 #ifdef linux 388 820 return (DWORD)1; 389 821 #else 390 return (DWORD)0; 822 #ifdef _ODIN_H_ 823 return (DWORD)1; 824 #else 825 return (DWORD)0; 826 #endif 391 827 #endif 392 828 }
Note:
See TracChangeset
for help on using the changeset viewer.