ReactOS 0.4.16-dev-2633-g8dc9e50
dev_error.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS ATA Port Driver
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: Device I/O error handling
5 * COPYRIGHT: Copyright 2026 Dmitry Borisov <di.sean@protonmail.com>
6 */
7
8/* INCLUDES *******************************************************************/
9
10#include "atapi.h"
11
12/* FUNCTIONS ******************************************************************/
13
14static
18{
19 return ((Request->Flags & REQUEST_FLAG_PACKET_COMMAND) &&
20 !(Request->Srb->SrbFlags & SRB_FLAGS_DISABLE_AUTOSENSE) &&
21 (Request->Srb->SenseInfoBuffer != NULL) &&
22 (Request->Srb->SenseInfoBufferLength != 0));
23}
24
25static
30{
31 /* NOTE: The ERROR bit and the SENSE DATA AVAILABLE bit may both be set to one */
32 return ((DevExt->Device.DeviceFlags & DEVICE_SENSE_DATA_REPORTING) &&
33 (Request->Output.Status & IDE_STATUS_INDEX) &&
34 !(Request->Srb->SrbFlags & SRB_FLAGS_DISABLE_AUTOSENSE) &&
35 (Request->Srb->SenseInfoBuffer != NULL) &&
36 (Request->Srb->SenseInfoBufferLength != 0));
37}
38
39static
44{
45 return (!(Request->Flags & REQUEST_FLAG_PACKET_COMMAND) &&
46 !(Request->Srb->SrbFlags & SRB_FLAGS_DISABLE_AUTOSENSE) &&
47 (Request->Srb->SenseInfoBuffer != NULL) &&
48 (Request->Srb->SenseInfoBufferLength != 0));
49}
50
51static
56{
57 // TODO: Check also for SATA SErr or AHCI interrupt status bits
58 return (Request->Output.Error & IDE_ERROR_CRC_ERROR) &&
59 (Request->Flags & REQUEST_FLAG_DMA);
60}
61
62static
63VOID
65 _In_ PATAPORT_PORT_DATA PortData,
67{
68 PATA_DEVICE_REQUEST Request = &PortData->Worker.InternalRequest;
69 PATA_DEVICE_REQUEST FailedRequest = PortData->Worker.FailedRequest;
70 PSCSI_REQUEST_BLOCK Srb = FailedRequest->Srb;
71 PSENSE_DATA SenseData;
73
74 if (IS_ATAPI(&DevExt->Device))
75 {
76 Success = (Request->SrbStatus == SRB_STATUS_SUCCESS) ||
77 (Request->SrbStatus == SRB_STATUS_DATA_OVERRUN);
78 }
79 else
80 {
81 Success = (Request->SrbStatus == SRB_STATUS_SUCCESS) &&
83 (Request->TaskFile.HighLba != 0);
84 }
85
86 if (!Success)
87 {
88 ERR("Request sense failed\n");
89
90 if (IS_ATAPI(&DevExt->Device))
91 {
94 }
95 else
96 {
97 /* Request sense failed, translate the original ATA device error */
98 FailedRequest->SrbStatus = AtaReqSetFixedAtaSenseData(FailedRequest);
99 }
100
101 return;
102 }
103
104 SenseData = Srb->SenseInfoBuffer;
105
106 if (IS_ATAPI(&DevExt->Device))
107 {
108 /* Copy the sense data from the local buffer */
110 DevExt->Device.LocalBuffer,
112
115 }
116 else
117 {
118 SCSI_SENSE_CODE SenseCode;
119
120 /* Copy the sense code from the task file registers */
121 SenseCode.SrbStatus = SRB_STATUS_ERROR;
122 SenseCode.SenseKey = Request->TaskFile.HighLba;
123 SenseCode.AdditionalSenseCode = Request->TaskFile.MidLba;
124 SenseCode.AdditionalSenseCodeQualifier = Request->TaskFile.LowLba;
125 FailedRequest->SrbStatus = AtaReqSetFixedSenseData(Srb, SenseCode);
126 }
127
128 if (RTL_CONTAINS_FIELD(SenseData,
131 {
132 /* INFO("0x%02X: SK 0x%02X, ASC 0x%02X, ASCQ 0x%02X\n", */
133 /* Srb->Cdb[0], */
134 /* SenseData->SenseKey, */
135 /* SenseData->AdditionalSenseCode, */
136 /* SenseData->AdditionalSenseCodeQualifier); */
137 }
138}
139
140static
143 _In_ PATAPORT_PORT_DATA PortData,
145{
146 PATA_DEVICE_REQUEST Request = &PortData->Worker.InternalRequest;
147 PATA_DEVICE_REQUEST FailedRequest = PortData->Worker.FailedRequest;
149 PCDB Cdb;
150
151 ASSERT_REQUEST(FailedRequest);
152 ASSERT(FailedRequest->Srb->SenseInfoBufferLength > 0);
153
157 Request->TimeOut = 3;
158 Request->DataTransferLength = FailedRequest->Srb->SenseInfoBufferLength;
159
160 Cdb = (PCDB)Request->Cdb;
161 Cdb->CDB6INQUIRY.OperationCode = SCSIOP_REQUEST_SENSE;
162 Cdb->CDB6INQUIRY.LogicalUnitNumber = 0;
163 Cdb->CDB6INQUIRY.Reserved1 = 0;
164 Cdb->CDB6INQUIRY.PageCode = 0;
165 Cdb->CDB6INQUIRY.IReserved = 0;
166 Cdb->CDB6INQUIRY.AllocationLength = (UCHAR)Request->DataTransferLength;
167 Cdb->CDB6INQUIRY.Control = 0;
168
169 Status = AtaPortSendRequest(PortData, DevExt);
170
171 AtaDeviceHandleRequestSense(PortData, DevExt);
172 return Status;
173}
174
175static
178 _In_ PATAPORT_PORT_DATA PortData,
180{
181 PATA_DEVICE_REQUEST Request = &PortData->Worker.InternalRequest;
183
185 Request->TimeOut = 3;
186
187 RtlZeroMemory(&Request->TaskFile, sizeof(Request->TaskFile));
189
190 Status = AtaPortSendRequest(PortData, DevExt);
191
192 AtaDeviceHandleRequestSense(PortData, DevExt);
193 return Status;
194}
195
196static
199 _In_ PATAPORT_PORT_DATA PortData,
201{
202 PATA_DEVICE_REQUEST Request = &PortData->Worker.InternalRequest;
203
206 0,
207 1);
209 Request->TimeOut = 3;
210
211 return AtaPortSendRequest(PortData, DevExt);
212}
213
214static
215VOID
217 _In_ GP_LOG_NCQ_COMMAND_ERROR* __restrict LogPage,
219{
220 PATA_TASKFILE TaskFile = &Request->Output;
221
222 TaskFile->SectorCount = LogPage->Count7_0;
223 TaskFile->LowLba = LogPage->LBA7_0;
224 TaskFile->MidLba = LogPage->LBA15_8;
225 TaskFile->HighLba = LogPage->LBA23_16;
226 TaskFile->DriveSelect = LogPage->Device;
227
228 if (Request->Flags & REQUEST_FLAG_LBA48)
229 {
230 TaskFile->FeatureEx = 0; // Reserved
231 TaskFile->SectorCountEx = LogPage->Count15_8;
232 TaskFile->LowLbaEx = LogPage->LBA31_24;
233 TaskFile->MidLbaEx = LogPage->LBA39_32;
234 TaskFile->HighLbaEx = LogPage->LBA47_40;
235 }
236}
237
238static
239VOID
242 _In_ ATA_ERROR_LOG_VALUE ErrorValue)
243{
244 PATAPORT_CHANNEL_EXTENSION ChanExt = DevExt->Common.FdoExt;
245 ULONG ErrorCode, FinalStatus;
246 PIO_ERROR_LOG_PACKET LogEntry;
247 UCHAR Size;
248
250 LogEntry = IoAllocateErrorLogEntry(ChanExt->Common.Self, Size);
251 if (!LogEntry)
252 return;
253
254 switch (ErrorValue)
255 {
258 FinalStatus = STATUS_IO_TIMEOUT;
259 break;
262 FinalStatus = STATUS_IO_DEVICE_ERROR;
263 break;
264
265 default:
267 FinalStatus = STATUS_IO_DEVICE_ERROR;
268 break;
269 }
270
271 RtlZeroMemory(LogEntry, Size);
272 LogEntry->FinalStatus = FinalStatus;
273 LogEntry->ErrorCode = ErrorCode;
274 LogEntry->MajorFunctionCode = IRP_MJ_SCSI;
275 LogEntry->UniqueErrorValue = ErrorValue;
276
277 IoWriteErrorLogEntry(LogEntry);
278}
279
280static
281VOID
283 _In_ PATAPORT_PORT_DATA PortData,
285{
286 ULONG Mode, AllowedModesMask;
287
288 /* Already in PIO mode */
289 if (!_BitScanReverse(&Mode, DevExt->TransferModeSelectedBitmap & ~PIO_ALL))
290 return;
291
292 /* Clear the current mode and the upper bits */
293 AllowedModesMask = ((1 << Mode) - 1);
294
295 if ((DevExt->TransferModeSupportedBitmap & UDMA_ALL) && !(AllowedModesMask & UDMA_ALL))
296 {
297 /*
298 * It makes no sense to disable DMA for AHCI hard drives
299 * because that would otherwise cause READ/WRITE commands to fail.
300 */
301 if ((PortData->PortFlags & PORT_FLAG_PIO_VIA_DMA) && !IS_ATAPI(&DevExt->Device))
302 return;
303
304 /* From UDMA to PIO (intentionally skip MWDMA and SWDMA) */
305 AllowedModesMask &= PIO_ALL;
306 }
307 else if (((DevExt->TransferModeSupportedBitmap & MWDMA_ALL) &&
308 !(AllowedModesMask & MWDMA_ALL)) ||
309 ((DevExt->TransferModeSupportedBitmap & SWDMA_ALL) &&
310 !(AllowedModesMask & SWDMA_ALL)))
311 {
312 /* From MWDMA to PIO (intentionally skip SWDMA) or from SWDMA to PIO */
313 AllowedModesMask &= PIO_ALL;
314 }
315
316 /* We are about to disable DMA, log the change */
317 if ((DevExt->TransferModeSupportedBitmap & ~PIO_ALL) && !(AllowedModesMask & ~PIO_ALL))
318 {
319 WARN("Too many DMA failures, disabling DMA for '%s'\n", DevExt->FriendlyName);
320
322 }
323
324 WARN("Downgrading DMA speed from %lu for '%s'\n", Mode, DevExt->FriendlyName);
325
326 DevExt->TransferModeAllowedMask &= AllowedModesMask;
327
328 /* Program the new timings */
329 _InterlockedOr(&PortData->Worker.EventsPending, ACTION_PORT_TIMING | ACTION_DEVICE_CONFIG);
330 _InterlockedOr(&DevExt->Worker.EventsPending, ACTION_DEVICE_CONFIG);
331
332 /* Request a QBR to ensure that storprop.dll updates its data from the registry */
333 PortData->Worker.Flags |= WORKER_FLAG_NEED_RESCAN;
334}
335
336static
337VOID
339 _In_ PATAPORT_PORT_DATA PortData,
342 _In_ ATA_ERROR_LOG_VALUE ErrorValue)
343{
344 LARGE_INTEGER CurrentTime, TimeDifferenceMs;
345
346 WARN("DMA error %lu on '%s'\n", ErrorValue, DevExt->FriendlyName);
347
348 /* We silently ignore device errors caused by PASSTHROUGH commands came from user mode */
350 return;
351
352 KeQuerySystemTime(&CurrentTime);
353 TimeDifferenceMs.QuadPart = (CurrentTime.QuadPart - DevExt->LastDmaErrorTime.QuadPart) / 10000;
354 DevExt->LastDmaErrorTime.QuadPart = CurrentTime.QuadPart;
355
356 AtaDeviceLogEvent(DevExt, ErrorValue);
357
358 /* Ignore all occasional DMA errors we encounter */
359 if (TimeDifferenceMs.QuadPart >= (10LL * 60000LL)) // 10 min
360 return;
361
362 /* DMA timeouts and DMA CRC errors usually indicate a bad connection (a bad cable) */
363
364 /* Try to disable NCQ */
365 if (DevExt->Device.DeviceFlags & DEVICE_NCQ)
366 {
367 DevExt->Device.DeviceFlags &= ~DEVICE_NCQ;
368
369 ERR("NCQ disabled for '%s'\n", DevExt->FriendlyName);
371 return;
372 }
373
374 /* Try to reduce the interface speed */
375 if (PortData->DowngradeInterfaceSpeed(PortData->ChannelContext))
376 {
377 WARN("Downgrading interface for '%s'\n", DevExt->FriendlyName);
379 return;
380 }
381
382 /* Try to reduce the transfer speed */
383 AtaDeviceDowngradeTransferSpeed(PortData, DevExt);
384}
385
386static
387VOID
389 _In_ PATAPORT_PORT_DATA PortData)
390{
391 PATA_DEVICE_REQUEST Request = PortData->Worker.FailedRequest;
392 UCHAR SrbStatus;
393 SIZE_T RetryCount;
395
397 ASSERT(Request != &PortData->Worker.InternalRequest);
398
399 SrbStatus = SRB_STATUS(Request->SrbStatus);
400
402 RetryCount++;
404 SRB_SET_FLAGS(Request->Srb, RetryCount);
405
406 if (RetryCount > 3)
407 {
408 ASSERT(SrbStatus != SRB_STATUS_BUSY);
409 }
410 else
411 {
412 /*
413 * We usually do not want to retry a request, because the upper class driver
414 * is intended to effectively analyze errors and sense data.
415 */
416 switch (SrbStatus)
417 {
420 {
421 /* DMA timeout, attempt to retry in PIO mode */
422 if (!(PortData->PortFlags & PORT_FLAG_PIO_VIA_DMA))
423 {
425 }
426
427 SrbStatus = SRB_STATUS_BUSY;
428 break;
429 }
430
432 {
433 SrbStatus = SRB_STATUS_BUSY;
434 break;
435 }
436
437 default:
438 {
439 /* Retry paging I/O operations only */
440 if (Request->Irp->Flags & (IRP_SYNCHRONOUS_PAGING_IO | IRP_PAGING_IO))
441 SrbStatus = SRB_STATUS_BUSY;
442 break;
443 }
444 }
445 }
446
447 SrbStatus |= Request->SrbStatus & (SRB_STATUS_AUTOSENSE_VALID | SRB_STATUS_QUEUE_FROZEN);
448 Request->SrbStatus = SrbStatus;
449
450 if (SRB_STATUS(SrbStatus) == SRB_STATUS_BUSY)
451 return;
452
453 ASSERT(SRB_STATUS(SrbStatus) != SRB_STATUS_SUCCESS);
454
455 /* Fail the command with an error */
456 Request->InternalState = REQUEST_STATE_FREEZE_QUEUE;
457
458 OldIrql = KeAcquireInterruptSpinLock(PortData->InterruptObject);
459
460 ASSERT(PortData->Worker.PausedSlotsBitmap & (1 << Request->Slot));
461 PortData->Worker.PausedSlotsBitmap &= ~(1 << Request->Slot);
462
463 KeReleaseInterruptSpinLock(PortData->InterruptObject, OldIrql);
464}
465
466static
469 _In_ PATAPORT_PORT_DATA PortData,
471{
472 PATA_DEVICE_REQUEST FailedRequest;
475 ULONG i;
476 UCHAR Crc;
477
480 return Status;
481 /* We failed at retrieving the log page */
482 if (!NT_SUCCESS(Status))
483 {
484 ERR("READ LOG EXT failure\n");
485 goto Failure;
486 }
487
488 LogPage = DevExt->Device.LocalBuffer;
489
490 /* It's not ours */
491 if (LogPage->NonQueuedCmd)
492 {
493 ERR("Unexpected NQ bit in the log page 0x10 structure\n");
494 goto Failure;
495 }
496
497 /* Verify the checksum */
498 Crc = 0;
499 for (i = 0; i < IDE_GP_LOG_SECTOR_SIZE; ++i)
500 {
501 Crc += ((PUCHAR)LogPage)[i];
502 }
503 if (Crc != 0)
504 {
505 ERR("CRC error in the log page 0x10 structure\n");
506 goto Failure;
507 }
508
509 /* Find the failed queued command */
510 if (!(PortData->Worker.PausedSlotsBitmap & (1 << LogPage->NcqTag)))
511 {
512 ERR("Failed command %08lx not found in %08lx\n",
513 1 << LogPage->NcqTag, PortData->Worker.PausedSlotsBitmap);
514 goto Failure;
515 }
516
517 FailedRequest = PortData->Slots[LogPage->NcqTag];
518 ASSERT_REQUEST(FailedRequest);
519 PortData->Worker.FailedRequest = FailedRequest;
520
521 /* Fail the command with an error */
522 FailedRequest->SrbStatus = SRB_STATUS_ERROR;
523 FailedRequest->Output.Status = LogPage->Status;
524 FailedRequest->Output.Error = LogPage->Error;
525 if (FailedRequest->Flags & REQUEST_FLAG_SAVE_TASK_FILE)
526 {
527 AtaDeviceSaveLogPageTaskFile(LogPage, FailedRequest);
528 }
529
530 if ((LogPage->SenseKey != 0) && AtaDevHasNcqAutosense(&DevExt->IdentifyDeviceData))
531 {
532 SCSI_SENSE_CODE SenseCode;
533
534 /* Set the sense data returned by the device */
535 SenseCode.SrbStatus = FailedRequest->SrbStatus;
536 SenseCode.SenseKey = LogPage->SenseKey;
537 SenseCode.AdditionalSenseCode = LogPage->ASC;
538 SenseCode.AdditionalSenseCodeQualifier = LogPage->ASCQ;
539 FailedRequest->SrbStatus = AtaReqSetFixedSenseData(FailedRequest->Srb, SenseCode);
540
541 /* Set the "Final LBA in Error" field */
542 AtaReqSetLbaInformation(FailedRequest->Srb,
543 ((ULONG64)(((PUCHAR)LogPage)[17]) << 0) |
544 ((ULONG64)(((PUCHAR)LogPage)[18]) << 8) |
545 ((ULONG64)(((PUCHAR)LogPage)[19]) << 16) |
546 ((ULONG64)(((PUCHAR)LogPage)[20]) << 24) |
547 ((ULONG64)(((PUCHAR)LogPage)[21]) << 32) |
548 ((ULONG64)(((PUCHAR)LogPage)[22]) << 48));
549 }
550 else if (AtaDeviceRequestSenseNeededExt(DevExt, FailedRequest))
551 {
552 /* Get sense data */
553 Status = AtaDeviceSendRequestSenseExt(PortData, DevExt);
555 return Status;
556 }
557 else
558 {
559 FailedRequest->SrbStatus = AtaReqSetFixedAtaSenseData(FailedRequest);
560 }
561
563 return STATUS_SUCCESS;
564
565Failure:
566 /* A port reset is required to abort all outstanding queued commands */
567 _InterlockedOr(&PortData->Worker.EventsPending, ACTION_PORT_RESET);
568 return STATUS_SUCCESS;
569}
570
571static
574 _In_ PATAPORT_PORT_DATA PortData,
576{
577 PATA_DEVICE_REQUEST Request = PortData->Worker.FailedRequest;
579
580 switch (Request->SrbStatus)
581 {
582 /* Unexpected channel/device state */
585 {
586 if (Request->Flags & REQUEST_FLAG_DMA)
587 {
588 ATA_ERROR_LOG_VALUE ErrorValue;
589
590 if (Request->SrbStatus == SRB_STATUS_TIMEOUT)
591 ErrorValue = EVENT_CODE_TIMEOUT;
592 else
593 ErrorValue = EVENT_CODE_BAD_STATE;
594 AtaDeviceAnalyzeDmaError(PortData, DevExt, Request, ErrorValue);
595 }
596 break;
597 }
598
599 /* General errors */
600 case SRB_STATUS_ERROR:
601 {
602 if (AtaDeviceIsDmaCrcError(DevExt, Request))
603 {
605 break;
606 }
607
608 /* Send the recovery command to figure out why the current command failed */
610 {
611 /* Handle failed ATAPI commands */
612 Status = AtaDeviceSendRequestSense(PortData, DevExt);
613 break;
614 }
615 else if (AtaDeviceRequestSenseNeededExt(DevExt, Request))
616 {
617 /* Handle failed non-queued commands */
618 Status = AtaDeviceSendRequestSenseExt(PortData, DevExt);
619 break;
620 }
621 else if (AtaDeviceFixedErrorNeeded(DevExt, Request))
622 {
624 }
625
626 /* Recovery command is not required, just complete the request with an error */
628 }
629
630 default:
631 break;
632 }
633
635 return Status;
636
638 return STATUS_SUCCESS;
639}
640
643 _In_ PATAPORT_PORT_DATA PortData,
645{
646 PATA_DEVICE_REQUEST FailedRequest = PortData->Worker.FailedRequest;
648
649 ASSERT_REQUEST(FailedRequest);
650
651 if (FailedRequest->Flags & REQUEST_FLAG_NCQ)
652 Status = AtaDeviceNcqRecovery(PortData, DevExt);
653 else
654 Status = AtaDeviceGenericRecovery(PortData, DevExt);
655
656 return Status;
657}
unsigned char BOOLEAN
Definition: actypes.h:127
#define IDE_GP_LOG_SECTOR_SIZE
Definition: ata.h:731
#define IDE_ERROR_CRC_ERROR
Definition: ata.h:638
#define IDE_GP_LOG_NCQ_COMMAND_ERROR_ADDRESS
Definition: ata.h:729
#define REQUEST_FLAG_NCQ
Definition: ata_shared.h:284
#define REQUEST_FLAG_HAS_LOCAL_BUFFER
Definition: ata_shared.h:327
#define REQUEST_FLAG_DATA_IN
Definition: ata_shared.h:287
#define REQUEST_FLAG_PASSTHROUGH
Definition: ata_shared.h:348
#define REQUEST_FLAG_SAVE_TASK_FILE
Definition: ata_shared.h:309
#define REQUEST_FLAG_DMA
Definition: ata_shared.h:278
#define REQUEST_FLAG_HAS_TASK_FILE
Definition: ata_shared.h:312
#define REQUEST_STATE_FREEZE_QUEUE
Definition: ata_shared.h:273
#define UDMA_ALL
Definition: ata_user.h:31
#define MWDMA_ALL
Definition: ata_user.h:27
#define SWDMA_ALL
Definition: ata_user.h:23
#define PIO_ALL
Definition: ata_user.h:19
#define IDE_COMMAND_REQUEST_SENSE_DATA_EXT
Definition: atapi.h:226
#define ASSERT_REQUEST(Request)
Definition: atapi.h:326
#define PORT_FLAG_PIO_VIA_DMA
Definition: atapi.h:337
#define SRB_FLAG_PIO_RETRY
Definition: atapi.h:230
#define SRB_GET_FLAGS(Srb)
Definition: atapi.h:238
UCHAR AtaReqSetFixedSenseData(_In_ PSCSI_REQUEST_BLOCK Srb, _In_ SCSI_SENSE_CODE SenseCode)
Definition: scsi.c:411
VOID AtaReqSetLbaInformation(_In_ PSCSI_REQUEST_BLOCK Srb, _In_ ULONG64 Lba)
Definition: scsi.c:442
@ ACTION_DEVICE_CONFIG
Definition: atapi.h:248
@ ACTION_PORT_TIMING
Definition: atapi.h:247
@ ACTION_PORT_RESET
Definition: atapi.h:243
VOID AtaReqBuildReadLogTaskFile(_In_ PATA_DEVICE_REQUEST Request, _In_ UCHAR LogAddress, _In_ UCHAR PageNumber, _In_ USHORT LogPageCount)
Definition: satl.c:399
#define DEVICE_NCQ
Definition: atapi.h:86
#define WORKER_FLAG_NEED_RESCAN
Definition: atapi.h:279
#define DEVICE_SENSE_DATA_REPORTING
Definition: atapi.h:88
#define SRB_CLEAR_FLAGS(Srb, Flags)
Definition: atapi.h:235
UCHAR AtaReqSetFixedAtaSenseData(_In_ PATA_DEVICE_REQUEST Request)
Definition: satl.c:248
@ EVENT_CODE_CRC_ERROR
Definition: atapi.h:263
@ EVENT_CODE_BAD_STATE
Definition: atapi.h:264
@ EVENT_CODE_TIMEOUT
Definition: atapi.h:265
@ EVENT_CODE_NCQ_DISABLE
Definition: atapi.h:268
@ EVENT_CODE_DOWNSHIFT
Definition: atapi.h:266
@ EVENT_CODE_DMA_DISABLE
Definition: atapi.h:267
NTSTATUS AtaPortSendRequest(_In_ PATAPORT_PORT_DATA PortData, _In_ PATAPORT_DEVICE_EXTENSION DevExt)
Definition: portstate.c:831
#define SRB_SET_FLAGS(Srb, Flags)
Definition: atapi.h:232
enum _ATA_ERROR_LOG_VALUE ATA_ERROR_LOG_VALUE
#define ATA_LOCAL_BUFFER_SIZE
Definition: atapi.h:205
#define IS_ATAPI(Device)
Definition: atapi.h:176
#define SRB_FLAG_RETRY_COUNT_MASK
Definition: atapi.h:228
#define IDE_STATUS_INDEX
Definition: atapi.h:126
LONG NTSTATUS
Definition: precomp.h:26
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
_In_ PSCSI_REQUEST_BLOCK Srb
Definition: cdrom.h:989
#define SCSISTAT_CHECK_CONDITION
Definition: cdrw_hw.h:1079
#define SCSIOP_REQUEST_SENSE
Definition: cdrw_hw.h:870
#define SCSISTAT_GOOD
Definition: cdrw_hw.h:1078
union _CDB * PCDB
static VOID AtaDeviceCompleteFailedRequest(_In_ PATAPORT_PORT_DATA PortData)
Definition: dev_error.c:388
static BOOLEAN AtaDeviceIsDmaCrcError(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PATA_DEVICE_REQUEST Request)
Definition: dev_error.c:53
static BOOLEAN AtaDeviceRequestSenseNeeded(_In_ PATA_DEVICE_REQUEST Request)
Definition: dev_error.c:16
static NTSTATUS AtaDeviceSendReadNcqCommandErrorLog(_In_ PATAPORT_PORT_DATA PortData, _In_ PATAPORT_DEVICE_EXTENSION DevExt)
Definition: dev_error.c:198
static NTSTATUS AtaDeviceSendRequestSense(_In_ PATAPORT_PORT_DATA PortData, _In_ PATAPORT_DEVICE_EXTENSION DevExt)
Definition: dev_error.c:142
static BOOLEAN AtaDeviceFixedErrorNeeded(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PATA_DEVICE_REQUEST Request)
Definition: dev_error.c:41
NTSTATUS AtaPortDeviceProcessError(_In_ PATAPORT_PORT_DATA PortData, _In_ PATAPORT_DEVICE_EXTENSION DevExt)
Definition: dev_error.c:642
static VOID AtaDeviceSaveLogPageTaskFile(_In_ GP_LOG_NCQ_COMMAND_ERROR *__restrict LogPage, _Inout_ ATA_DEVICE_REQUEST *__restrict Request)
Definition: dev_error.c:216
static NTSTATUS AtaDeviceNcqRecovery(_In_ PATAPORT_PORT_DATA PortData, _In_ PATAPORT_DEVICE_EXTENSION DevExt)
Definition: dev_error.c:468
static NTSTATUS AtaDeviceSendRequestSenseExt(_In_ PATAPORT_PORT_DATA PortData, _In_ PATAPORT_DEVICE_EXTENSION DevExt)
Definition: dev_error.c:177
static BOOLEAN AtaDeviceRequestSenseNeededExt(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PATA_DEVICE_REQUEST Request)
Definition: dev_error.c:27
static VOID AtaDeviceAnalyzeDmaError(_In_ PATAPORT_PORT_DATA PortData, _In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ PATA_DEVICE_REQUEST Request, _In_ ATA_ERROR_LOG_VALUE ErrorValue)
Definition: dev_error.c:338
static NTSTATUS AtaDeviceGenericRecovery(_In_ PATAPORT_PORT_DATA PortData, _In_ PATAPORT_DEVICE_EXTENSION DevExt)
Definition: dev_error.c:573
static VOID AtaDeviceHandleRequestSense(_In_ PATAPORT_PORT_DATA PortData, _In_ PATAPORT_DEVICE_EXTENSION DevExt)
Definition: dev_error.c:64
static VOID AtaDeviceDowngradeTransferSpeed(_In_ PATAPORT_PORT_DATA PortData, _In_ PATAPORT_DEVICE_EXTENSION DevExt)
Definition: dev_error.c:282
static VOID AtaDeviceLogEvent(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ ATA_ERROR_LOG_VALUE ErrorValue)
Definition: dev_error.c:240
#define NULL
Definition: types.h:112
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define SRB_STATUS_BUS_RESET
Definition: srb.h:353
#define SRB_STATUS_DATA_OVERRUN
Definition: srb.h:357
#define SRB_STATUS_TIMEOUT
Definition: srb.h:349
#define SRB_STATUS_AUTOSENSE_VALID
Definition: srb.h:387
#define SRB_FLAGS_DISABLE_AUTOSENSE
Definition: srb.h:399
#define SRB_STATUS_ERROR
Definition: srb.h:344
#define SRB_STATUS(Status)
Definition: srb.h:389
#define SRB_STATUS_BUSY
Definition: srb.h:345
#define SRB_STATUS_REQUEST_SENSE_FAILED
Definition: srb.h:355
#define SRB_STATUS_QUEUE_FROZEN
Definition: srb.h:386
#define SRB_STATUS_SUCCESS
Definition: srb.h:341
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define KeQuerySystemTime(t)
Definition: env_spec_w32.h:570
@ Success
Definition: eventcreate.c:712
Status
Definition: gdiplustypes.h:25
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
_In_ ULONG Mode
Definition: hubbusif.h:303
#define REQUEST_FLAG_LBA48
Definition: hwidep.h:167
#define REQUEST_FLAG_PACKET_COMMAND
Definition: hwidep.h:169
FORCEINLINE BOOLEAN AtaDevHasNcqAutosense(_In_ PIDENTIFY_DEVICE_DATA IdentifyData)
#define ASSERT(a)
Definition: mode.c:44
unsigned __int64 ULONG64
Definition: imports.h:198
#define min(a, b)
Definition: monoChain.cc:55
_In_ NDIS_ERROR_CODE ErrorCode
Definition: ndis.h:4436
#define _Inout_
Definition: no_sal2.h:162
#define _In_
Definition: no_sal2.h:158
#define RTL_CONTAINS_FIELD(Struct, Size, Field)
Definition: ntbasedef.h:687
#define IO_ERR_CONTROLLER_ERROR
Definition: ntiologc.h:38
#define IO_ERR_PARITY
Definition: ntiologc.h:32
#define IO_ERR_TIMEOUT
Definition: ntiologc.h:36
VOID NTAPI IoWriteErrorLogEntry(IN PVOID ElEntry)
Definition: error.c:628
PVOID NTAPI IoAllocateErrorLogEntry(IN PVOID IoObject, IN UCHAR EntrySize)
Definition: error.c:528
KIRQL NTAPI KeAcquireInterruptSpinLock(IN PKINTERRUPT Interrupt)
Definition: spinlock.c:154
VOID NTAPI KeReleaseInterruptSpinLock(IN PKINTERRUPT Interrupt, IN KIRQL OldIrql)
Definition: spinlock.c:171
#define STATUS_ADAPTER_HARDWARE_ERROR
Definition: ntstatus.h:524
#define __fallthrough
Definition: sal_old.h:314
_In_opt_ WDFREQUEST _In_ ULONG _In_ BOOLEAN _In_ PCDB Cdb
Definition: scratch.h:159
_In_ UCHAR _Out_opt_ PUCHAR _Out_opt_ PUCHAR _Out_opt_ PUCHAR AdditionalSenseCodeQualifier
Definition: scsi.h:3794
unsigned char _BitScanReverse(unsigned long *_Index, unsigned long _Mask)
Definition: intrin_arm.h:180
long _InterlockedOr(_Interlocked_operand_ long volatile *_Value, long _Mask)
#define STATUS_SUCCESS
Definition: shellext.h:65
ATAPORT_COMMON_EXTENSION Common
Definition: atapi.h:440
PDEVICE_OBJECT Self
Definition: atapi.h:432
ATA_TASKFILE Output
ATA normal/error outputs.
Definition: ata_shared.h:255
PSCSI_REQUEST_BLOCK Srb
Definition: ata_shared.h:228
UCHAR SectorCountEx
Definition: ata_shared.h:200
UCHAR SectorCount
Definition: hwidep.h:151
UCHAR MidLba
LBA bits 8-15.
Definition: hwidep.h:153
UCHAR LowLbaEx
LBA bits 24-31.
Definition: ata_shared.h:195
UCHAR HighLba
LBA bits 16-23.
Definition: hwidep.h:154
UCHAR FeatureEx
Definition: ata_shared.h:198
UCHAR HighLbaEx
LBA bits 40-47.
Definition: ata_shared.h:197
UCHAR DriveSelect
Definition: hwidep.h:146
UCHAR LowLba
LBA bits 0-7.
Definition: hwidep.h:152
UCHAR MidLbaEx
LBA bits 32-39.
Definition: ata_shared.h:196
NTSTATUS ErrorCode
Definition: iotypes.h:2007
NTSTATUS FinalStatus
Definition: iotypes.h:2009
UCHAR SenseInfoBufferLength
Definition: srb.h:259
PVOID SenseInfoBuffer
Definition: srb.h:264
UCHAR ScsiStatus
Definition: srb.h:252
unsigned char UCHAR
Definition: typedefs.h:53
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
unsigned char * PUCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_IO_DEVICE_ERROR
Definition: udferr_usr.h:179
#define STATUS_IO_TIMEOUT
Definition: udferr_usr.h:163
Definition: cdrw_hw.h:28
struct _CDB::_CDB6INQUIRY CDB6INQUIRY
LONGLONG QuadPart
Definition: typedefs.h:114
UCHAR SenseKey
Definition: scsiex.h:17
UCHAR AdditionalSenseCodeQualifier
Definition: scsiex.h:19
UCHAR SrbStatus
Definition: scsiex.h:16
UCHAR AdditionalSenseCode
Definition: scsiex.h:18
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
_In_ WDFREQUEST Request
Definition: wdfdevice.h:547
#define IRP_MJ_SCSI
#define IRP_PAGING_IO
#define IRP_SYNCHRONOUS_PAGING_IO
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:778