Changeset 987 for trunk/src


Ignore:
Timestamp:
Sep 20, 1999, 12:21:58 PM (26 years ago)
Author:
phaller
Message:

Add: WinASPI32 support via ASPIROUT$-device driver

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:04 phaller Exp $
     1# $Id: makefile,v 1.2 1999-09-20 10:18:58 phaller Exp $
    22
    33#
     
    2121TARGET = wnaspi32
    2222
    23 OBJS =  winaspi32.obj initterm.obj
     23OBJS =  odinaspi.obj winaspi32.obj initterm.obj
    2424
    2525all: $(TARGET).dll $(TARGET).lib
     
    3030              $(PDWIN32_LIB)/pmwinx.lib $(PDWIN32_LIB)/kernel32.lib \
    3131              $(PDWIN32_LIB)/odincrt.lib OS2386.LIB $(RTLLIB_O) \
    32               $(PDWIN32_LIB)/ole32.lib $(PDWIN32_LIB)/msvfw32.lib
     32              $(PDWIN32_LIB)/advapi32.lib
    3333        $(CP) $@ $(PDWIN32_BIN)
    3434
     
    4040
    4141initterm.obj:  initterm.cpp
    42 ainaspi32.obj: wnaspi32.cpp
    43 
     42ainaspi32.obj: wnaspi32.cpp odinaspi.h srbos2.h
     43odinaspi.obj:  odinaspi.cpp odinaspi.h srbos2.h
    4444clean:
    4545        $(RM) *.obj *.lib *.dll *~ *.map *.pch
  • trunk/src/wnaspi32/winaspi32.cpp

    r938 r987  
    1 #include <odin.h>
    2 
     1#include <os2win.h>
    32#include <stdlib.h>
    43#include <sys/types.h>
     
    98// #include <unistd.h>
    109
    11 #include "winbase.h"
    1210#include "aspi.h"
    1311#include "wnaspi32.h"
     12#include <winreg.h>
    1413#include "options.h"
    15 #include "heap.h"
    1614#include "debugtools.h"
    17 #include "ldt.h"
     15
     16#include "srbos2.h"
     17#include "odinaspi.h"
    1818//#include "callback.h"
    1919
     
    326326#endif
    327327
     328// OS/2 ODIN implemetation code
     329#ifdef _ODIN_H_
     330
     331static void
     332ASPI_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
     391static void
     392ASPI_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
     409static void
     410ASPI_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
     424static WORD
     425ASPI_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
    328542
    329543/*******************************************************************
     
    337551 *    LOBYTE of LOWORD: # of host adapters.
    338552 */
     553#ifdef _ODIN_H_
    339554DWORD WINAPI GetASPI32SupportInfo()
    340555{
    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
     644DWORD WINAPI GetASPI32SupportInfo()
     645{
     646  return ((SS_COMP << 8) | 1); /* FIXME: get # of host adapters installed */
     647}
     648#endif
    344649
    345650/***********************************************************************
     
    374679  return SS_INVALID_SRB;
    375680#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
    377809#endif
    378810}
     
    386818{
    387819#ifdef linux
    388         return (DWORD)1;
     820  return (DWORD)1;
    389821#else
    390         return (DWORD)0;
     822  #ifdef _ODIN_H_
     823    return (DWORD)1;
     824  #else
     825    return (DWORD)0;
     826  #endif
    391827#endif
    392828}
Note: See TracChangeset for help on using the changeset viewer.