Changeset 3541 for trunk/src/wnaspi32/winaspi32.cpp
- Timestamp:
- May 15, 2000, 9:02:21 PM (25 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/wnaspi32/winaspi32.cpp
r987 r3541 14 14 #include "debugtools.h" 15 15 16 #include "srbos2.h" 17 #include "odinaspi.h" 16 //#include "srbos2.h" 17 //#include "odinaspi.h" 18 #include "aspilib.h" 18 19 //#include "callback.h" 19 20 20 21 DEFAULT_DEBUG_CHANNEL(aspi) 21 22 23 /* FIXME!24 * 1) Residual byte length reporting not handled25 * 2) Make this code re-entrant for multithreading26 * 3) Only linux supported so far27 */28 29 #ifdef linux30 31 static ASPI_DEVICE_INFO *ASPI_open_devices = NULL;32 33 static int34 ASPI_OpenDevice(SRB_ExecSCSICmd *prb)35 {36 int fd;37 char idstr[20];38 char device_str[50];39 ASPI_DEVICE_INFO *curr;40 41 /* search list of devices to see if we've opened it already.42 * There is not an explicit open/close in ASPI land, so hopefully43 * keeping a device open won't be a problem.44 */45 46 for (curr = ASPI_open_devices; curr; curr = curr->next) {47 if (curr->hostId == prb->SRB_HaId &&48 curr->target == prb->SRB_Target &&49 curr->lun == prb->SRB_Lun) {50 return curr->fd;51 }52 }53 54 /* device wasn't cached, go ahead and open it */55 sprintf(idstr, "scsi c%1dt%1dd%1d", prb->SRB_HaId, prb->SRB_Target, prb->SRB_Lun);56 57 if (!PROFILE_GetWineIniString(idstr, "Device", "", device_str, sizeof(device_str))) {58 TRACE("Trying to open unlisted scsi device %s\n", idstr);59 return -1;60 }61 62 TRACE("Opening device %s=%s\n", idstr, device_str);63 64 fd = open(device_str, O_RDWR);65 if (fd == -1) {66 int save_error = errno;67 #ifdef HAVE_STRERROR68 ERR("Error opening device %s, error '%s'\n", device_str, strerror(save_error));69 #else70 ERR("Error opening device %s, error %d\n", device_str, save_error);71 #endif72 return -1;73 }74 75 /* device is now open */76 curr = HeapAlloc( SystemHeap, 0, sizeof(ASPI_DEVICE_INFO) );77 curr->fd = fd;78 curr->hostId = prb->SRB_HaId;79 curr->target = prb->SRB_Target;80 curr->lun = prb->SRB_Lun;81 82 /* insert new record at beginning of open device list */83 curr->next = ASPI_open_devices;84 ASPI_open_devices = curr;85 return fd;86 }87 88 22 89 23 static void … … 179 113 } 180 114 115 181 116 static WORD 182 ASPI_ExecScsiCmd( SRB_ExecSCSICmd *lpPRB)183 { 184 struct sg_header *sg_hd, *sg_reply_hdr; 117 ASPI_ExecScsiCmd( scsiObj *aspi, 118 SRB_ExecSCSICmd *lpPRB) 119 { 185 120 int status; 186 int in_len, out_len;187 121 int error_code = 0; 188 int fd;122 LONG rc; 189 123 190 124 ASPI_DebugPrintCmd(lpPRB); 191 125 192 fd = ASPI_OpenDevice(lpPRB);193 if (fd == -1) {194 ERR("Failed: could not open device c%01dt%01dd%01d. Device permissions !?\n",195 lpPRB->SRB_HaId,lpPRB->SRB_Target,lpPRB->SRB_Lun);196 lpPRB->SRB_Status = SS_NO_DEVICE;197 return SS_NO_DEVICE;198 }199 200 sg_hd = NULL;201 sg_reply_hdr = NULL;202 203 126 lpPRB->SRB_Status = SS_PENDING; 204 127 205 if (!lpPRB->SRB_CDBLen) { 128 if (!lpPRB->SRB_CDBLen) 129 { 206 130 WARN("Failed: lpPRB->SRB_CDBLen = 0.\n"); 207 131 lpPRB->SRB_Status = SS_ERR; … … 209 133 } 210 134 211 /* build up sg_header + scsi cmd */212 if (HOST_TO_TARGET(lpPRB)) {213 /* send header, command, and then data */214 in_len = SCSI_OFF + lpPRB->SRB_CDBLen + lpPRB->SRB_BufLen;215 sg_hd = (struct sg_header *) malloc(in_len);216 memset(sg_hd, 0, SCSI_OFF);217 memcpy(sg_hd + 1, &lpPRB->CDBByte[0], lpPRB->SRB_CDBLen);218 if (lpPRB->SRB_BufLen) {219 memcpy(((BYTE *) sg_hd) + SCSI_OFF + lpPRB->SRB_CDBLen, lpPRB->SRB_BufPointer, lpPRB->SRB_BufLen);220 }221 }222 else {223 /* send header and command - no data */224 in_len = SCSI_OFF + lpPRB->SRB_CDBLen;225 sg_hd = (struct sg_header *) malloc(in_len);226 memset(sg_hd, 0, SCSI_OFF);227 memcpy(sg_hd + 1, &lpPRB->CDBByte[0], lpPRB->SRB_CDBLen);228 }229 230 if (TARGET_TO_HOST(lpPRB)) {231 out_len = SCSI_OFF + lpPRB->SRB_BufLen;232 sg_reply_hdr = (struct sg_header *) malloc(out_len);233 memset(sg_reply_hdr, 0, SCSI_OFF);234 sg_hd->reply_len = out_len;235 }236 else {237 out_len = SCSI_OFF;238 sg_reply_hdr = (struct sg_header *) malloc(out_len);239 memset(sg_reply_hdr, 0, SCSI_OFF);240 sg_hd->reply_len = out_len;241 }242 243 status = write(fd, sg_hd, in_len);244 if (status < 0 || status != in_len) {245 int save_error = errno;246 247 WARN("Not enough bytes written to scsi device bytes=%d .. %d\n", in_len, status);248 if (status < 0) {249 if (save_error == ENOMEM) {250 MESSAGE("ASPI: Linux generic scsi driver\n You probably need to re-compile your kernel with a larger SG_BIG_BUFF value (sg.h)\n Suggest 130560\n");251 }252 #ifdef HAVE_STRERROR253 WARN("error:= '%s'\n", strerror(save_error));254 #else255 WARN("error:= %d\n", save_error);256 #endif257 }258 goto error_exit;259 }260 261 status = read(fd, sg_reply_hdr, out_len);262 if (status < 0 || status != out_len) {263 WARN("not enough bytes read from scsi device%d\n", status);264 goto error_exit;265 }266 267 if (sg_reply_hdr->result != 0) {268 error_code = sg_reply_hdr->result;269 WARN("reply header error (%d)\n", sg_reply_hdr->result);270 goto error_exit;271 }272 273 if (TARGET_TO_HOST(lpPRB) && lpPRB->SRB_BufLen) {274 memcpy(lpPRB->SRB_BufPointer, sg_reply_hdr + 1, lpPRB->SRB_BufLen);275 }276 277 /* copy in sense buffer to amount that is available in client */278 if (lpPRB->SRB_SenseLen) {279 int sense_len = lpPRB->SRB_SenseLen;280 if (lpPRB->SRB_SenseLen > 16)281 sense_len = 16;282 memcpy(SENSE_BUFFER(lpPRB), &sg_reply_hdr->sense_buffer[0], sense_len);283 }284 285 286 lpPRB->SRB_Status = SS_COMP;287 lpPRB->SRB_HaStat = HASTAT_OK;288 lpPRB->SRB_TargStat = STATUS_GOOD;289 290 /* now do posting */291 292 if (lpPRB->SRB_PostProc) {293 if (ASPI_POSTING(lpPRB)) {294 TRACE("Post Routine (%lx) called\n", (DWORD) lpPRB->SRB_PostProc);295 (*lpPRB->SRB_PostProc)(lpPRB);296 }297 else298 if (lpPRB->SRB_Flags & SRB_EVENT_NOTIFY) {299 TRACE("Setting event %04x\n", (HANDLE)lpPRB->SRB_PostProc);300 SetEvent((HANDLE)lpPRB->SRB_PostProc); /* FIXME: correct ? */301 }302 }303 free(sg_reply_hdr);304 free(sg_hd);305 ASPI_DebugPrintResult(lpPRB);306 return SS_COMP;307 308 error_exit:309 if (error_code == EBUSY) {310 lpPRB->SRB_Status = SS_ASPI_IS_BUSY;311 TRACE("Device busy\n");312 }313 else {314 WARN("Failed\n");315 lpPRB->SRB_Status = SS_ERR;316 }317 318 /* I'm not sure exactly error codes work here319 * We probably should set lpPRB->SRB_TargStat, SRB_HaStat ?320 */321 WARN("error_exit\n");322 free(sg_reply_hdr);323 free(sg_hd);324 return lpPRB->SRB_Status;325 }326 #endif327 328 // OS/2 ODIN implemetation code329 #ifdef _ODIN_H_330 331 static void332 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 void392 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 void410 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 WORD425 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 135 if(MaxCDBStatus<lpPRB->SRB_CDBLen) 445 136 { … … 457 148 458 149 // copy up to LUN SRBOS2 has no WORD for padding like in WINE 459 memcpy( & SRBlock,150 memcpy( &aspi->SRBlock, 460 151 lpPRB, 461 152 6* sizeof(BYTE) + sizeof(DWORD)); 462 SRBlock.flags |= SRB_Post;463 SRBlock.u.cmd.sense_len = 32; // length of sense buffer464 SRBlock.u.cmd.data_ptr = NULL; // pointer to data buffer465 SRBlock.u.cmd.link_ptr = NULL; // pointer to next SRB466 SRBlock.u.cmd.cdb_len = lpPRB->SRB_CDBLen; // SCSI command length467 memcpy( & SRBlock.u.cmd.cdb_st[0],153 aspi->SRBlock.flags |= SRB_Post; 154 aspi->SRBlock.u.cmd.sense_len = 32; // length of sense buffer 155 aspi->SRBlock.u.cmd.data_ptr = NULL; // pointer to data buffer 156 aspi->SRBlock.u.cmd.link_ptr = NULL; // pointer to next SRB 157 aspi->SRBlock.u.cmd.cdb_len = lpPRB->SRB_CDBLen; // SCSI command length 158 memcpy( &aspi->SRBlock.u.cmd.cdb_st[0], 468 159 &lpPRB->CDBByte[0], 469 160 lpPRB->SRB_CDBLen); … … 474 165 if (lpPRB->SRB_BufLen) 475 166 { 476 memcpy( pData->pvBuffer,167 memcpy( aspi->buffer, 477 168 lpPRB->SRB_BufPointer, 478 169 lpPRB->SRB_BufLen); … … 480 171 } 481 172 482 rc = lSendSRBlock( pData->hfDriver, 483 &SRBlock, 484 &SRBlock); 173 rc = aspi->SendSRBlock(); 485 174 486 175 if(!rc) 487 176 { 488 if( fWaitPost(pData->hevPost))177 if( aspi->waitPost()) 489 178 { 490 179 if (TARGET_TO_HOST(lpPRB)) … … 494 183 { 495 184 memcpy( lpPRB->SRB_BufPointer, 496 pData->pvBuffer,185 aspi->buffer, 497 186 lpPRB->SRB_BufLen); 498 187 } … … 505 194 sense_len = 32; 506 195 memcpy( SENSE_BUFFER(lpPRB), 507 & SRBlock.u.cmd.cdb_st[SRBlock.u.cmd.cdb_len],196 &aspi->SRBlock.u.cmd.cdb_st[aspi->SRBlock.u.cmd.cdb_len], 508 197 sense_len); 509 198 } … … 526 215 } 527 216 } 528 lpPRB->SRB_Status = SRBlock.status;529 lpPRB->SRB_HaStat = SRBlock.u.cmd.ha_status;530 lpPRB->SRB_TargStat = SRBlock.u.cmd.target_status;217 lpPRB->SRB_Status = aspi->SRBlock.status; 218 lpPRB->SRB_HaStat = aspi->SRBlock.u.cmd.ha_status; 219 lpPRB->SRB_TargStat = aspi->SRBlock.u.cmd.target_status; 531 220 } 532 221 else … … 539 228 540 229 } 541 #endif542 230 543 231 /******************************************************************* … … 551 239 * LOBYTE of LOWORD: # of host adapters. 552 240 */ 553 #ifdef _ODIN_H_554 241 DWORD WINAPI GetASPI32SupportInfo() 555 242 { 556 243 LONG rc; 557 ODINASPIDATAaspi;244 scsiObj *aspi; 558 245 ULONG hmtxDriver; 559 246 BYTE bNumDrv; … … 562 249 DWORD dwData; 563 250 DWORD dwSize; 564 SRBOS2 SRBlock;565 251 ULONG ulParam, ulReturn; 566 252 BYTE brc; … … 568 254 bNumDrv = 0; 569 255 256 aspi= new scsiObj(); 257 570 258 if( fGainDrvAccess( FALSE, &hmtxDriver) ) // Do nonblocking call for info 571 259 { 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 260 261 if(aspi->init(65535)==TRUE) 262 { 263 264 bNumDrv = aspi->getNumHosts(); 265 brc = SS_COMP; 587 266 rc = RegOpenKeyA ( HKEY_LOCAL_MACHINE, 588 267 "Software\\ODIN\\ASPIROUT", … … 599 278 RegCloseKey( hkeyDrvInfo); 600 279 } 601 } 602 603 fCloseASPI(&aspi);280 281 aspi->close(); 282 delete aspi; 604 283 } 605 284 else … … 641 320 return ((brc << 8) | bNumDrv); /* FIXME: get # of host adapters installed */ 642 321 } 643 #else644 DWORD WINAPI GetASPI32SupportInfo()645 {646 return ((SS_COMP << 8) | 1); /* FIXME: get # of host adapters installed */647 }648 #endif649 322 650 323 /*********************************************************************** … … 653 326 DWORD __cdecl SendASPI32Command(LPSRB lpSRB) 654 327 { 655 #ifdef linux656 switch (lpSRB->common.SRB_Cmd) {657 case SC_HA_INQUIRY:658 lpSRB->inquiry.SRB_Status = SS_COMP; /* completed successfully */659 lpSRB->inquiry.HA_Count = 1; /* not always */660 lpSRB->inquiry.HA_SCSI_ID = 7; /* not always ID 7 */661 strcat(lpSRB->inquiry.HA_ManagerId, "ASPI for WIN32"); /* max 15 chars, don't change */662 strcat(lpSRB->inquiry.HA_Identifier, "Wine host"); /* FIXME: return host adapter name */663 memset(lpSRB->inquiry.HA_Unique, 0, 16); /* default HA_Unique content */664 lpSRB->inquiry.HA_Unique[6] = 0x02; /* Maximum Transfer Length (128K, Byte> 4-7) */665 FIXME("ASPI: Partially implemented SC_HA_INQUIRY for adapter %d.\n", lpSRB->inquiry.SRB_HaId);666 return SS_COMP;667 case SC_GET_DEV_TYPE:668 FIXME("Not implemented SC_GET_DEV_TYPE\n");669 break;670 case SC_EXEC_SCSI_CMD:671 return ASPI_ExecScsiCmd(&lpSRB->cmd);672 break;673 case SC_RESET_DEV:674 FIXME("Not implemented SC_RESET_DEV\n");675 break;676 default:677 WARN("Unknown command %d\n", lpSRB->common.SRB_Cmd);678 }679 return SS_INVALID_SRB;680 #else681 #ifdef _ODIN_H_682 683 SRBOS2 SRBlock;684 328 DWORD dwRC; 685 329 ULONG ulParam, ulReturn; 686 330 BYTE bRC; 687 ODINASPIDATAaspi;331 scsiObj *aspi; 688 332 ULONG hmtxDriver; 689 333 LONG rc; … … 691 335 if(NULL==lpSRB) 692 336 return SS_INVALID_SRB; // Not sure what to return here but that is an error 337 338 aspi = new scsiObj(); 693 339 694 340 // test first for a valid command … … 704 350 if( fGainDrvAccess( TRUE, &hmtxDriver) ) // Block if a SRB is pending 705 351 { 706 bRC = bOpenASPI( &aspi); 707 if(SS_COMP==bRC) 352 if(aspi->init(65535)==TRUE) 708 353 { 709 354 switch (lpSRB->common.SRB_Cmd) 710 355 { 711 356 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); 357 aspi->SRBlock.cmd=SRB_Inquiry; // host adapter inquiry 358 aspi->SRBlock.ha_num=lpSRB->inquiry.SRB_HaId; // host adapter number 359 aspi->SRBlock.flags=0; // no flags set 360 rc = aspi->SendSRBlock(); 361 719 362 if (!rc) 720 363 { 721 364 memcpy( lpSRB, 722 & SRBlock,365 &aspi->SRBlock, 723 366 sizeof(SRB_HaInquiry) ); 724 dwRC = SRBlock.status;367 dwRC = aspi->SRBlock.status; 725 368 } 726 369 break; 370 727 371 case SC_GET_DEV_TYPE: 728 memcpy( & SRBlock,372 memcpy( &aspi->SRBlock, 729 373 lpSRB, 730 374 sizeof(SRB_GDEVBlock)); 731 SRBlock.flags = 0; 732 733 rc = lSendSRBlock( aspi.hfDriver, 734 &SRBlock, 735 &SRBlock); 375 aspi->SRBlock.flags = 0; 376 377 rc = aspi->SendSRBlock(); 736 378 737 379 if (!rc) 738 380 { 739 381 memcpy( lpSRB, 740 & SRBlock,382 &aspi->SRBlock, 741 383 sizeof(SRB_GDEVBlock) ); 384 742 385 lpSRB->devtype.SRB_Rsvd1 = 0x00; 743 dwRC = SRBlock.status;386 dwRC = aspi->SRBlock.status; 744 387 } 745 388 746 389 break; 747 390 case SC_EXEC_SCSI_CMD: 748 dwRC = ASPI_ExecScsiCmd( &aspi,391 dwRC = ASPI_ExecScsiCmd( aspi, 749 392 &lpSRB->cmd); 750 393 break; 394 751 395 case SC_ABORT_SRB: 752 396 dwRC = SS_INVALID_SRB; // We don't do async ASPI so no way to abort 753 397 break; 398 754 399 case SC_RESET_DEV: 755 memset( & SRBlock,400 memset( &aspi->SRBlock, 756 401 0, 757 402 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); 403 aspi->SRBlock.cmd = lpSRB->reset.SRB_Cmd; /* ASPI command code = SC_RESET_DEV */ 404 aspi->SRBlock.status = lpSRB->reset.SRB_Status; /* ASPI command status byte */ 405 aspi->SRBlock.ha_num = lpSRB->reset.SRB_HaId; /* ASPI host adapter number */ 406 aspi->SRBlock.flags = SRB_Post; 407 aspi->SRBlock.u.res.target = lpSRB->reset.SRB_Target; /* Target's SCSI ID */ 408 aspi->SRBlock.u.res.lun = lpSRB->reset.SRB_Lun; /* Target's LUN number */ 409 410 rc = aspi->SendSRBlock(); 768 411 769 412 if (!rc) 770 413 { 771 fWaitPost( aspi.hevPost);772 lpSRB->reset.SRB_Status = SRBlock.status;773 lpSRB->reset.SRB_Flags = SRBlock.flags;414 aspi->waitPost(); 415 lpSRB->reset.SRB_Status = aspi->SRBlock.status; 416 lpSRB->reset.SRB_Flags = aspi->SRBlock.flags; 774 417 lpSRB->reset.SRB_Hdr_Rsvd = 0; 775 418 memset( lpSRB->reset.SRB_Rsvd1, 776 419 0, 777 420 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 */421 lpSRB->reset.SRB_HaStat = aspi->SRBlock.u.res.ha_status; /* Host Adapter Status */ 422 lpSRB->reset.SRB_TargStat = aspi->SRBlock.u.res.target_status; /* Target Status */ 780 423 lpSRB->reset.SRB_PostProc = NULL; /* Post routine */ 781 424 lpSRB->reset.SRB_Rsvd2 = NULL; /* Reserved */ … … 783 426 0, 784 427 32); /* Reserved */ 785 dwRC = SRBlock.status;428 dwRC = aspi->SRBlock.status; 786 429 } 787 430 break; 788 431 } // end switch (lpSRB->common.SRB_Cmd) 789 432 790 fCloseASPI(&aspi); 433 aspi->close(); 434 delete aspi; 791 435 } 792 436 else … … 803 447 804 448 return dwRC; 805 806 #else807 return SS_INVALID_SRB;808 #endif809 #endif810 449 } 811 450 … … 814 453 * GetASPI32DLLVersion32 (WNASPI32.3) 815 454 */ 816 817 455 DWORD WINAPI GetASPI32DLLVersion() 818 456 { 819 #ifdef linux820 457 return (DWORD)1; 821 #else 822 #ifdef _ODIN_H_ 823 return (DWORD)1; 824 #else 825 return (DWORD)0; 826 #endif 827 #endif 828 } 829 458 } 459
Note:
See TracChangeset
for help on using the changeset viewer.