436{
437 UCHAR SrbStatus, InterruptReason;
439
440 InterruptReason =
ATA_READ(ChanData->Regs.InterruptReason, ChanData, MRES_TF);
443
444
445
446
447
448
450 {
451#if DBG
454 WARN(
"Not fully compliant ATAPI device %02x %02x\n", IdeStatus, InterruptReason);
455#endif
457
458 InterruptReason =
ATA_READ(ChanData->Regs.InterruptReason, ChanData, MRES_TF);
461 }
462
463 switch (InterruptReason)
464 {
466 {
468 {
469 WARN(
"Invalid interrupt reason %02x %02x, flags %08lx\n",
470 InterruptReason,
471 IdeStatus,
472 ChanData->CommandFlags);
473
475 break;
476 }
477 ChanData->CommandFlags &= ~CMD_FLAG_AWAIT_CDB;
478
480
481
483 {
486 }
487
489 break;
490 }
491
493 {
495 {
496 WARN(
"Invalid interrupt reason %02x %02x, flags %08lx\n",
497 InterruptReason,
498 IdeStatus,
499 ChanData->CommandFlags);
500
502 break;
503 }
504
507
510 break;
511 }
512
514 {
516 {
517 WARN(
"Invalid interrupt reason %02x %02x, flags %08lx\n",
518 InterruptReason,
519 IdeStatus,
520 ChanData->CommandFlags);
521
523 break;
524 }
525
528
531 break;
532 }
533
535 {
536
538 {
539 WARN(
"Invalid interrupt reason %02x %02x, flags %08lx\n",
540 InterruptReason,
541 IdeStatus,
542 ChanData->CommandFlags);
543
545 break;
546 }
548 }
550 {
552 {
554 }
555 else if (ChanData->BytesToTransfer != 0)
556 {
557
558 ASSERT(
Request->DataTransferLength >= ChanData->BytesToTransfer);
559 Request->DataTransferLength -= ChanData->BytesToTransfer;
560
562 }
563 else
564 {
566 }
567 break;
568 }
569
570 default:
571 {
572 WARN(
"Invalid interrupt reason %02x %02x, flags %08lx\n",
573 InterruptReason,
574 IdeStatus,
575 ChanData->CommandFlags);
576
578 break;
579 }
580 }
581
582 return SrbStatus;
583}
#define IDE_STATUS_DEVICE_FAULT
#define DEVICE_IS_NEC_CDR260
static BOOLEAN WarningsGiven[5]
#define SRB_STATUS_BUS_RESET
#define SRB_STATUS_PENDING
#define ATAPI_INT_REASON_STATUS_NEC
#define ATA_TIME_DRQ_ASSERT
150 us
#define ATAPI_INT_REASON_IO
#define ATAPI_INT_REASON_COD
#define ATAPI_INT_REASON_STATUS
#define ATAPI_INT_REASON_MASK
#define ATAPI_INT_REASON_AWAIT_CDB
#define ATAPI_INT_REASON_DATA_IN
#define ATAPI_INT_REASON_DATA_OUT
#define CMD_FLAG_DATA_OUT
static VOID PataPioDataOut(_In_ PCHANNEL_DATA_PATA ChanData, _In_ ULONG ByteCount)
static VOID PataPioDataIn(_In_ PCHANNEL_DATA_PATA ChanData, _In_ ULONG ByteCount)
static VOID PataSendCdb(_In_ PCHANNEL_DATA_PATA ChanData, _In_ PATA_DEVICE_REQUEST Request)