--- trunk/reactos/drivers/storage/atapi/atapi.c 2005-01-01 11:57:53 UTC (rev 12698)
+++ trunk/reactos/drivers/storage/atapi/atapi.c 2005-01-01 12:19:21 UTC (rev 12699)
@@ -1,6 +1,6 @@
/*
* ReactOS kernel
- * Copyright (C) 2001, 2002, 2003, 2004 ReactOS Team
+ * Copyright (C) 2001, 2002, 2003, 2004, 2005 ReactOS Team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/* $Id: atapi.c,v 1.56 2004/11/18 08:32:32 gvg Exp $
+/* $Id$
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS ATAPI miniport driver
@@ -114,7 +114,8 @@
#define DEVICE_DWORD_IO 0x00000008
#define DEVICE_48BIT_ADDRESS 0x00000010
#define DEVICE_MEDIA_STATUS 0x00000020
-#define DEVICE_DMA_CMD 0x00000040
+#define DEVICE_DMA_CMD 0x00000040
+#define DEVICE_NO_FLUSH 0x00000080
typedef struct _UNIT_EXTENSION
@@ -125,7 +126,7 @@
PCI_SLOT_NUMBER LastSlotNumber;
#ifdef ENABLE_NATIVE_PCI
-typedef struct _PCI_NATIVE_CONTROLLER
+typedef struct _PCI_NATIVE_CONTROLLER
{
USHORT VendorID;
USHORT DeviceID;
@@ -1895,6 +1896,12 @@
/* get it from the ATAPI configuration word */
InquiryData->DeviceType = (DeviceParams->ConfigBits >> 8) & 0x1F;
DPRINT("Device class: %u\n", InquiryData->DeviceType);
+
+ /* Don't flush CD/DVD drives */
+ if (InquiryData->DeviceType == READ_ONLY_DIRECT_ACCESS_DEVICE)
+ {
+ DeviceExtension->DeviceFlags[Srb->TargetId] |= DEVICE_NO_FLUSH;
+ }
}
else
{
@@ -1931,7 +1938,7 @@
}
InquiryData->AdditionalLength = 31;
-
+
DPRINT("VendorId: '%.20s'\n", InquiryData->VendorId);
Srb->SrbStatus = SRB_STATUS_SUCCESS;
@@ -2224,6 +2231,18 @@
DPRINT("SCSIOP_SYNCRONIZE_CACHE: TargetId: %lu\n",
Srb->TargetId);
+ if (!(DeviceExtension->DeviceFlags[Srb->TargetId] & DEVICE_NO_FLUSH))
+ {
+ /*
+ * NOTE: Don't flush the cache for CD/DVD drives. Although
+ * the ATAPI-6 standard allows that, it has been experimentally
+ * proved that it can damage some broken LG drives. Afterall
+ * it doesn't make sense to flush cache on devices we don't
+ * write to.
+ */
+ return STATUS_SUCCESS;
+ }
+
/* Wait for BUSY to clear */
for (Retries = 0; Retries < IDE_MAX_BUSY_RETRIES; Retries++)
{