Changeset 14848


Ignore:
Timestamp:
Sep 18, 2000, 9:27:10 PM (25 years ago)
Author:
sandervl
Message:

save & restore fs when calling ack function

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified tags/trunk/src/wnaspi32/winaspi32.cpp

    r14833 r14848  
    1 /* $Id: winaspi32.cpp,v 1.9 2000-09-15 13:25:50 sandervl Exp $ */
     1/* $Id: winaspi32.cpp,v 1.10 2000-09-18 19:27:10 sandervl Exp $ */
    22/*
    33 * WNASPI routines
     
    128128
    129129
    130 static WORD ASPI_ExecScsiCmd( scsiObj *aspi, SRB_ExecSCSICmd *lpPRB)
     130static WORD ASPI_ExecScsiCmd( scsiObj *aspi, SRB_ExecSCSICmd *lpPRB, USHORT sel)
    131131{
    132132  int   status;
    133133  int   error_code = 0;
    134134  LONG rc;
     135
     136  /* FIXME: hackmode */
     137#define MAKE_TARGET_TO_HOST(lpPRB) \
     138        if (!TARGET_TO_HOST(lpPRB)) { \
     139            WARN("program was not sending target_to_host for cmd %x (flags=%x),correcting.\n",lpPRB->CDBByte[0],lpPRB->SRB_Flags); \
     140            lpPRB->SRB_Flags |= 8; \
     141        }
     142#define MAKE_HOST_TO_TARGET(lpPRB) \
     143        if (!HOST_TO_TARGET(lpPRB)) { \
     144            WARN("program was not sending host_to_target for cmd %x (flags=%x),correcting.\n",lpPRB->CDBByte[0],lpPRB->SRB_Flags); \
     145            lpPRB->SRB_Flags |= 0x10; \
     146        }
     147  switch (lpPRB->CDBByte[0]) {
     148  case 0x12: /* INQUIRY */
     149  case 0x5a: /* MODE_SENSE_10 */
     150  case 0xa4: /* REPORT_KEY (DVD) MMC-2 */
     151  case 0xad: /* READ DVD STRUCTURE MMC-2 */
     152        MAKE_TARGET_TO_HOST(lpPRB)
     153        break;
     154  case 0xa3: /* SEND KEY (DVD) MMC-2 */
     155        MAKE_HOST_TO_TARGET(lpPRB)
     156        break;
     157  default:
     158        if ((((lpPRB->SRB_Flags & 0x18) == 0x00) ||
     159             ((lpPRB->SRB_Flags & 0x18) == 0x18)
     160            ) && lpPRB->SRB_BufLen
     161        ) {
     162            FIXME("command 0x%02x, no data transfer specified, but buflen is %ld!!!\n",lpPRB->CDBByte[0],lpPRB->SRB_BufLen);
     163        }
     164        break;
     165  }
    135166
    136167  ASPI_DebugPrintCmd(lpPRB);
     
    209240                  lpPRB->SRB_BufLen);
    210241#ifdef DEBUG_BUFFER
    211       char *cdb = (char *)lpPRB->SRB_BufPointer;
    212       dprintfNoEOL(("Read SRB buffer["));
    213       for (int i = 0; i < lpPRB->SRB_BufLen; i++) {
    214           if (i != 0) dprintfNoEOL((",0x%02x", *cdb++));
    215           else        dprintfNoEOL(("0x%02x", *cdb++));
    216       }
    217       dprintfNoEOL(("]\n"));
     242          char *cdb = (char *)lpPRB->SRB_BufPointer;
     243          dprintfNoEOL(("Read SRB buffer["));
     244          for (int i = 0; i < lpPRB->SRB_BufLen; i++) {
     245             if (i != 0) dprintfNoEOL((",0x%02x", *cdb++));
     246             else        dprintfNoEOL(("0x%02x", *cdb++));
     247          }
     248          dprintfNoEOL(("]\n"));
    218249#endif
    219 
    220250        }
    221251      }
     
    231261      }
    232262
     263#if 0
     264      /* FIXME: Should this be != 0 maybe? */
     265      if(aspi->SRBlock.u.cmd.target_status == 2 ) {
     266        aspi->SRBlock.status = SS_ERR;
     267        switch (lpPRB->CDBByte[0]) {
     268                case 0xa4: /* REPORT_KEY (DVD) MMC-2 */
     269                case 0xa3: /* SEND KEY (DVD) MMC-2 */
     270                        aspi->SRBlock.status              = SS_COMP;
     271                        aspi->SRBlock.u.cmd.target_status = 0;
     272                        FIXME("Program wants to do DVD Region switching, but fails (non compliant DVD drive). Ignoring....\n");
     273                        break;
     274        }
     275      }
     276#endif
    233277      /* now do posting */
    234 
    235278      if (lpPRB->SRB_PostProc)
    236279      {
    237         if (ASPI_POSTING(lpPRB))
     280        if(ASPI_POSTING(lpPRB))
    238281        {
    239282          dprintf(("Post Routine (%lx) called\n", (DWORD) lpPRB->SRB_PostProc));
     283          //SvL: Restore win32 FS selector
     284          SetFS(sel);
    240285          (*lpPRB->SRB_PostProc)();
     286          RestoreOS2FS();
    241287        }
    242288        else
     
    248294      }
    249295    }
    250     lpPRB->SRB_Status = aspi->SRBlock.status;
    251     lpPRB->SRB_HaStat = aspi->SRBlock.u.cmd.ha_status;
    252     lpPRB->SRB_TargStat = aspi->SRBlock.u.cmd.target_status;
    253296  }
    254297  else
    255298    lpPRB->SRB_Status = SS_ERR;
    256299
     300  //SvL: Shouldn't this be set before posting?
     301  lpPRB->SRB_Status = aspi->SRBlock.status;
     302  lpPRB->SRB_HaStat = aspi->SRBlock.u.cmd.ha_status;
     303  lpPRB->SRB_TargStat = aspi->SRBlock.u.cmd.target_status;
    257304
    258305  ASPI_DebugPrintResult(lpPRB);
     
    341388 *             SendASPI32Command32 (WNASPI32.1)
    342389 */
    343 DWORD SendASPICommand(LPSRB lpSRB)
     390DWORD SendASPICommand(LPSRB lpSRB, USHORT sel)
    344391{
    345392    DWORD dwRC;
     
    391438
    392439          case SC_EXEC_SCSI_CMD:
    393             dwRC = ASPI_ExecScsiCmd( aspi,
    394                                      &lpSRB->cmd);
     440            dwRC = ASPI_ExecScsiCmd( aspi, &lpSRB->cmd, sel);
    395441            break;
    396442
     
    434480 USHORT sel = RestoreOS2FS();
    435481
    436     yyrc = SendASPICommand(lpSRB);
     482    yyrc = SendASPICommand(lpSRB, sel);
    437483    SetFS(sel);
    438484
Note: See TracChangeset for help on using the changeset viewer.