home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / cdrom.zip / DDK / BASE / SRC / DEV / DASD / CDROM / ATAPI / atapiorb.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-04-10  |  11.5 KB  |  315 lines

  1. /**************************************************************************
  2.  *
  3.  * SOURCE FILE NAME =     ATAPIORB.C
  4.  *
  5.  * DESCRIPTIVE NAME =     ATAPI IORB Interface to State Machine
  6.  *
  7.  *
  8.  * Copyright : COPYRIGHT IBM CORPORATION, 1991, 1992
  9.  *             LICENSED MATERIAL - PROGRAM PROPERTY OF IBM
  10.  *             REFER TO COPYRIGHT INSTRUCTION FORM#G120-2083
  11.  *             RESTRICTED MATERIALS OF IBM
  12.  *             IBM CONFIDENTIAL
  13.  *
  14.  * VERSION = 1.0
  15.  *
  16.  * DATE
  17.  *
  18.  * DESCRIPTION :
  19.  *
  20.  * Purpose:
  21.  *
  22.  *
  23.  *
  24.  *
  25.  *
  26.  * CHANGE ACTIVITY =
  27.  *   DATE      FLAG        APAR   CHANGE DESCRIPTION
  28.  *   --------  ----------  -----  --------------------------------------
  29.  *  10/12/94   @V102677           Correct queueing of chained IORBs
  30.  *  11/30/95   @V132280           Added HWRESOURCE to fix Suspend/Resume.
  31.  *  04/05/96   @V151168           Merged warm dock/swap code.
  32.  *  05/24/96   @V155162           Thinkpad docking/swapping IDE update.
  33.  ****************************************************************************/
  34.  
  35. #define INCL_NOBASEAPI
  36. #define INCL_NOPMAPI
  37. #include "os2.h"
  38. #include "dos.h"
  39. #include "dskinit.h"
  40.  
  41. #include "iorb.h"
  42. #include "addcalls.h"
  43. #include "dhcalls.h"
  44. #include "apmcalls.h"                                               /*@V151168*/
  45.  
  46. #define INCL_INITRP_ONLY
  47. #include "reqpkt.h"
  48.  
  49. #include "scsi.h"
  50. #include "cdbscsi.h"
  51.  
  52. #include "atapicon.h"
  53. #include "atapireg.h"
  54. #include "atapityp.h"
  55. #include "atapiext.h"
  56. #include "atapipro.h"
  57.  
  58.  
  59. VOID FAR _loadds ATAPIADDEntry( PIORBH pNewIORB )
  60. {
  61.    PIORBH    pNewsTailIORB;  /* The tail of the iorb chain for pNewIORB *//*@V102677*/
  62.    NPACB     npACB;
  63.    NPUCB     npUCB;
  64.  
  65.    /*┌─────────────────────────────────┐
  66.      │ Queue IORBs which don't address │
  67.      │ a specific unit to ACB 0 Unit 0 │
  68.      └─────────────────────────────────┘ */
  69.  
  70.    if (pNewIORB->CommandCode == IOCC_CONFIGURATION)
  71.       pNewIORB->UnitHandle = (USHORT) (npUCB = ACBPtrs[0].npACB->npUCB);
  72.  
  73.    else
  74.       npUCB = (NPUCB) pNewIORB->UnitHandle;
  75.  
  76.    /*                                                                 @V155162
  77.    ** If the HW is not present, reject commands that require HW.      @V155162
  78.    */                                                               /*@V155162*/
  79.    if( (pNewIORB->CommandCode != IOCC_UNIT_CONTROL) &&              /*@V155162*/
  80.        (npUCB->Flags & UCBF_NOTPRESENT) )                           /*@V155162*/
  81.    {                                                                /*@V155162*/
  82.       if( (pNewIORB->CommandCode == IOCC_ADAPTER_PASSTHRU) &&       /*@V155162*/
  83.           (pNewIORB->CommandModifier ==  IOCM_EXECUTE_CDB) )        /*@V155162*/
  84.       {                                                             /*@V155162*/
  85.          if( ((PIORB_ADAPTER_PASSTHRU)pNewIORB)->pControllerCmd[0]  /*@V155162*/
  86.              == 0 )                                                 /*@V155162*/
  87.          {    // Test Unit Ready Request                            /*@V155162*/
  88.             if( npUCB->Flags & UCBF_MEDIACHANGED )                  /*@V155162*/
  89.             {                                                       /*@V155162*/
  90.                npUCB->Flags &= ~UCBF_MEDIACHANGED;                  /*@V155162*/
  91.                pNewIORB->Status = IORB_ERROR | IORB_DONE;           /*@V155162*/
  92.                pNewIORB->ErrorCode = IOERR_MEDIA_CHANGED;           /*@V155162*/
  93.             }                                                       /*@V155162*/
  94.             else                                                    /*@V155162*/
  95.             {                                                       /*@V155162*/
  96.                pNewIORB->Status = IORB_DONE;                        /*@V155162*/
  97.             }                                                       /*@V155162*/
  98.          }                                                          /*@V155162*/
  99.          else                                                       /*@V155162*/
  100.          {                                                          /*@V155162*/
  101.             pNewIORB->Status    = IORB_DONE | IORB_ERROR;           /*@V155162*/
  102.             pNewIORB->ErrorCode = IOERR_UNIT_NOT_READY;             /*@V155162*/
  103.          }                                                          /*@V155162*/
  104.       }                                                             /*@V155162*/
  105.       else                                                          /*@V155162*/
  106.       {                                                             /*@V155162*/
  107.          pNewIORB->Status    = IORB_DONE | IORB_ERROR;              /*@V155162*/
  108.          pNewIORB->ErrorCode = IOERR_UNIT_NOT_READY;                /*@V155162*/
  109.       }                                                             /*@V155162*/
  110.                                                                     /*@V155162*/
  111.       if ( pNewIORB->RequestControl & IORB_ASYNC_POST )             /*@V155162*/
  112.       {                                                             /*@V155162*/
  113.          (*pNewIORB->NotifyAddress)(pNewIORB);                      /*@V155162*/
  114.       }                                                             /*@V155162*/
  115.                                                                     /*@V155162*/
  116.       return;                                                       /*@V155162*/
  117.    }                                                                /*@V155162*/
  118.  
  119.    npACB = npUCB->npACB;
  120.  
  121.    if ( Valid_CDB_Length_Check(pNewIORB, npACB) )
  122.    {
  123.       pNewIORB->Status    = IORB_DONE | IORB_ERROR;
  124.       pNewIORB->ErrorCode = IOERR_CMD_NOT_SUPPORTED;
  125.  
  126.       if ( pNewIORB->RequestControl & IORB_ASYNC_POST )
  127.       {
  128.          (*pNewIORB->NotifyAddress)(pNewIORB);
  129.       }
  130.       return;
  131.    }
  132.  
  133.    DISABLE
  134.  
  135.    /*┌──────────────────────────────┐
  136.      │ Put new IORB on end of Queue │
  137.      └──────────────────────────────┘*/
  138.    if (!npACB->pHeadIORB)
  139.       npACB->pHeadIORB = pNewIORB;
  140.    else
  141.       npACB->pFootIORB->pNxtIORB = pNewIORB;
  142.  
  143.  
  144.    /*┌───────────────────────────┐*/                               /*@V102677*/
  145.    /*│Find end of chained request│*/                               /*@V102677*/
  146.    /*└───────────────────────────┘*/                               /*@V102677*/
  147.    for ( pNewsTailIORB = pNewIORB;                                 /*@V102677*/
  148.          pNewsTailIORB->RequestControl & IORB_CHAIN;               /*@V102677*/
  149.          pNewsTailIORB = pNewsTailIORB->pNxtIORB                   /*@V102677*/
  150.        )                                                           /*@V102677*/
  151.      ;                                                             /*@V102677*/
  152.                                                                    /*@V102677*/
  153.    /*┌─────────────────────────────────────────┐*/                 /*@V102677*/
  154.    /*│ Point the foot of the IORB Queue to the │*/                 /*@V102677*/
  155.    /*│ tail of the new IORB chain.             │*/                 /*@V102677*/
  156.    /*└─────────────────────────────────────────┘*/                 /*@V102677*/
  157.    npACB->pFootIORB = pNewsTailIORB;                               /*@V102677*/
  158.                                                                    /*@V102677*/
  159.    /*┌────────────────────────────────────┐*/                      /*@V102677*/
  160.    /*│Make sure pNxtIORB for the for the  │*/                      /*@V102677*/
  161.    /*│Last IORB on our Q is clear.        │*/                      /*@V102677*/
  162.    /*└────────────────────────────────────┘*/                      /*@V102677*/
  163.    npACB->pFootIORB->pNxtIORB = 0;                                 /*@V102677*/
  164.  
  165.    if ( !(npACB->OSMFlags & ACBOF_SM_ACTIVE))
  166.    {
  167.       npACB->OSMFlags |= ACBOF_SM_ACTIVE;
  168.  
  169.       NextIORB(npACB);
  170.  
  171.       npACB->OSMState = ACBOS_START_IORB;
  172.       npACB->IORBStatus = 0;
  173.       npACB->IORBError = 0;
  174.       npACB->cResetRequests = 0;
  175.       npACB->npCmdIO = &npACB->ExternalCmd;
  176.  
  177.       if (  ( npACB->ResourceFlags & ACBRF_SHARED ) &&
  178.            !( npACB->ResourceFlags & ACBRF_CURR_OWNER ) &&
  179.            !( pNewIORB->CommandCode == IOCC_CONFIGURATION ) &&
  180.            !( pNewIORB->CommandCode == IOCC_UNIT_CONTROL )  &&      /*@V132280*/
  181.            !( pNewIORB->CommandCode == IOCC_RESOURCE ) )            /*@V132280*/
  182.       {
  183.  
  184.          npACB->OSMState = ACBOS_SUSPEND_COMPLETE;
  185.  
  186.          ENABLE
  187.  
  188.          SuspendOtherAdd( npACB );
  189.       }
  190.       else
  191.       {
  192.          ENABLE
  193.          StartOSM( npACB );
  194.       }
  195.    }
  196.    ENABLE
  197. }
  198.  
  199. USHORT NEAR Valid_CDB_Length_Check( PIORBH pIORB, NPACB npACB )
  200. {
  201.    USHORT                 rc = FALSE;
  202.    PIORB_ADAPTER_PASSTHRU pAP_IORB;
  203.  
  204.    pAP_IORB = (PIORB_ADAPTER_PASSTHRU) pIORB;
  205.  
  206.    if (( pIORB->CommandCode     == IOCC_ADAPTER_PASSTHRU ) &&
  207.        ( pIORB->CommandModifier == IOCM_EXECUTE_CDB ))
  208.    {
  209.       if ( pAP_IORB->ControllerCmdLen == npACB->npUCB->CmdPacketLength )
  210.       {
  211.          rc = TRUE;
  212.       }
  213.    }
  214.    else
  215.       rc = TRUE;
  216.  
  217.    return(!rc);
  218. }
  219.  
  220.  
  221. /***************************************************************************
  222. *
  223. * FUNCTION NAME = x2BCD
  224. *
  225. * DESCRIPTION   = Convert binary byte to BCD byte ( 2 digits )
  226. *
  227. *                 PSEUDOCODE:
  228. *                     return ( (n / 10 << 4) | (n % 10) );
  229. *
  230. * INPUT         = binary byte
  231. *
  232. * OUTPUT        =
  233. *
  234. * RETURN-NORMAL = al = BCD
  235. *
  236. * RETURN-ERROR  = none
  237. *
  238. **************************************************************************/
  239.  
  240. UCHAR NEAR x2BCD ( UCHAR Data )
  241. {
  242.    _asm {
  243.            mov     al, Data
  244.            xor     ah, ah
  245.            mov     cl, 10
  246.            div     cl
  247.            xchg    ah, al
  248.            shl     ah, 4
  249.            or      al, ah
  250.            mov     Data, al
  251.         }
  252.  
  253.    return( Data );
  254. }
  255.  
  256. VOID NEAR Convert_17B_to_ATAPI( ULONG pPhysData )
  257. {
  258.    struct translatetable
  259.    {
  260.       ULONG OldValue;
  261.       ULONG NewValue;
  262.    };
  263.  
  264.    PBYTE  pData;
  265.    USHORT ModeFlag;
  266.    ULONG  Capabilities_17B = *pData+4;
  267.    PBYTE  pCaps            =  pData+4;
  268.    UCHAR  i, tsize;
  269.  
  270.    static struct translatetable table[] =
  271.    {
  272.       { CP_AUDIO_PLAY ,                 CP_AUDIO_PLAY },
  273.       { REV_17B_CP_MODE2_FORM1,         CP_MODE2_FORM1 },
  274.       { REV_17B_CP_MODE2_FORM2,         CP_MODE2_FORM2 },
  275.       { REV_17B_CP_READ_CDDA,           CP_CDDA },
  276.       { REV_17B_CP_PHOTO_CD,            CP_MULTISESSION },
  277.       { REV_17B_CP_EJECT,               CP_EJECT },
  278.       { REV_17B_CP_LOCK,                CP_LOCK },
  279.       { REV_17B_CP_UPC,                 CP_UPC },
  280.       { REV_17B_CP_ISRC,                CP_ISRC },
  281.       { REV_17B_CP_INDEPENDENT_VOL_LEV, CP_INDEPENDENT_VOLUME_LEVELS },
  282.       { REV_17B_CP_SEPARATE_CH_MUTE,    CP_SEPARATE_CHANNEL_MUTE },
  283.       { REV_17B_CP_TRAY_LOADER,         CP_TRAY_LOADER },
  284.       { REV_17B_CP_POPUP_LOADER,        CP_POPUP_LOADER },
  285.       { REV_17B_CP_RESERVED_LOADER,     CP_RESERVED_LOADER },
  286.       { REV_17B_CP_PREVENT_JUMPER,      CP_PREVENT_JUMPER },
  287.       { REV_17B_CP_LOCK_STATE,          CP_LOCK_STATE },
  288.       { REV_17B_CP_CDDA_ACCURATE,       CP_CDDA_ACCURATE },
  289.       { REV_17B_CP_C2_POINTERS,         CP_C2_POINTERS }
  290.    };
  291.  
  292.    tsize = sizeof(table) / sizeof(struct translatetable);
  293.  
  294.    if ( DevHelp_PhysToVirt( (ULONG)   pPhysData,
  295.                              (USHORT)  1,
  296.                              (PVOID)   &pData,
  297.                              (PUSHORT) &ModeFlag  ) )
  298.    {
  299.       _asm { int 3 }
  300.    }
  301.  
  302.    Capabilities_17B = *pData+4;
  303.    pCaps            =  pData+4;
  304.  
  305.    *pCaps = 0;
  306.  
  307.    for (i=0; i < tsize; i++ )
  308.    {
  309.       if ( Capabilities_17B & table[i].OldValue )
  310.       {
  311.          *pCaps |= table[i].NewValue;
  312.       }
  313.    }
  314. }
  315.