Author: akhaldi
Date: Mon Aug 13 16:25:08 2012
New Revision: 57072
URL:
http://svn.reactos.org/svn/reactos?rev=57072&view=rev
Log:
[UNIATA] [ATACTL]
* Sync to 0.43a1.
See issue #7237 for more details.
Modified:
trunk/reactos/base/applications/atactl/atactl.cpp
trunk/reactos/drivers/storage/ide/uniata/atapi.h
trunk/reactos/drivers/storage/ide/uniata/bm_devs.h
trunk/reactos/drivers/storage/ide/uniata/bsmaster.h
trunk/reactos/drivers/storage/ide/uniata/id_ata.cpp
trunk/reactos/drivers/storage/ide/uniata/id_dma.cpp
trunk/reactos/drivers/storage/ide/uniata/id_init.cpp
trunk/reactos/drivers/storage/ide/uniata/id_sata.cpp
trunk/reactos/drivers/storage/ide/uniata/uata_ctl.h
Modified: trunk/reactos/base/applications/atactl/atactl.cpp
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/atactl/a…
==============================================================================
--- trunk/reactos/base/applications/atactl/atactl.cpp [iso-8859-1] (original)
+++ trunk/reactos/base/applications/atactl/atactl.cpp [iso-8859-1] Mon Aug 13 16:25:08
2012
@@ -37,6 +37,7 @@
int g_adapter_info = 0;
char* g_bb_list = NULL;
int gRadix = 16;
+PADAPTERINFO g_AdapterInfo = NULL;
void print_help() {
printf("Usage:\n"
@@ -262,6 +263,14 @@
AtaCtl->addr.Length = sizeof(AtaCtl->addr);
}
+ if(outBufferLength) {
+ if(addr) {
+ memset(&AtaCtl->RawData, 0, outBufferLength);
+ } else {
+ memset(&AtaCtl->addr, 0, outBufferLength);
+ }
+ }
+
if(inBuffer && inBufferLength) {
if(addr) {
memcpy(&AtaCtl->RawData, inBuffer, inBufferLength);
@@ -298,80 +307,17 @@
IO_SCSI_CAPABILITIES g_capabilities;
UCHAR g_inquiry_buffer[2048];
-int
-ata_is_sata(
- PIDENTIFY_DATA ident
- )
-{
- return (ident->SataEnable && ident->SataEnable != 0xffff);
-}
-
-int
-ata_cur_mode_from_ident(
- PIDENTIFY_DATA ident
- )
-{
- if(ata_is_sata(ident)) {
- return ATA_SA150-1;
- }
-
- if (ident->UdmaModesValid) {
- if (ident->UltraDMAActive & 0x40)
- return ATA_UDMA0+6;
- if (ident->UltraDMAActive & 0x20)
- return ATA_UDMA0+5;
- if (ident->UltraDMAActive & 0x10)
- return ATA_UDMA0+4;
- if (ident->UltraDMAActive & 0x08)
- return ATA_UDMA0+3;
- if (ident->UltraDMAActive & 0x04)
- return ATA_UDMA0+2;
- if (ident->UltraDMAActive & 0x02)
- return ATA_UDMA0+1;
- if (ident->UltraDMAActive & 0x01)
- return ATA_UDMA0+0;
- }
-
- if (ident->MultiWordDMAActive & 0x04)
- return ATA_WDMA0+2;
- if (ident->MultiWordDMAActive & 0x02)
- return ATA_WDMA0+1;
- if (ident->MultiWordDMAActive & 0x01)
- return ATA_WDMA0+0;
-
- if (ident->SingleWordDMAActive & 0x04)
- return ATA_SDMA0+2;
- if (ident->SingleWordDMAActive & 0x02)
- return ATA_SDMA0+1;
- if (ident->SingleWordDMAActive & 0x01)
- return ATA_SDMA0+0;
-
- if (ident->PioTimingsValid) {
- if (ident->AdvancedPIOModes & AdvancedPIOModes_5)
- return ATA_PIO0+5;
- if (ident->AdvancedPIOModes & AdvancedPIOModes_4)
- return ATA_PIO0+4;
- if (ident->AdvancedPIOModes & AdvancedPIOModes_3)
- return ATA_PIO0+3;
- }
- if (ident->PioCycleTimingMode == 2)
- return ATA_PIO0+2;
- if (ident->PioCycleTimingMode == 1)
- return ATA_PIO0+1;
- if (ident->PioCycleTimingMode == 0)
- return ATA_PIO0+0;
-
- return ATA_PIO;
-} // end ata_cur_mode_from_ident()
-
void
ata_mode_to_str(
char* str,
int mode
)
{
- if(mode == ATA_SA150-1) {
- sprintf(str, "SATA");
+ if(mode > ATA_SA600) {
+ sprintf(str, "SATA-600+");
+ } else
+ if(mode >= ATA_SA600) {
+ sprintf(str, "SATA-600");
} else
if(mode >= ATA_SA300) {
sprintf(str, "SATA-300");
@@ -413,6 +359,12 @@
int mode;
int len;
+ if(!_stricmp(str, "SATA600"))
+ return ATA_SA600;
+ if(!_stricmp(str, "SATA300"))
+ return ATA_SA300;
+ if(!_stricmp(str, "SATA150"))
+ return ATA_SA150;
if(!_stricmp(str, "SATA"))
return ATA_SA150;
@@ -620,10 +572,34 @@
return FALSE;
}
+ // Note: adapterInfo->NumberOfBuses is 1 greater than
g_AdapterInfo->NumberChannels
+ // because of virtual communication port
adapterInfo = (PSCSI_ADAPTER_BUS_INFO)g_inquiry_buffer;
- for (i = 0; i < adapterInfo->NumberOfBuses; i++) {
+ for (i = 0; i+1 < adapterInfo->NumberOfBuses; i++) {
inquiryData = (PSCSI_INQUIRY_DATA) (g_inquiry_buffer +
adapterInfo->BusData[i].InquiryDataOffset);
+
+ if(g_extended && g_AdapterInfo &&
g_AdapterInfo->ChanHeaderLengthValid &&
+ g_AdapterInfo->NumberChannels < i) {
+ PCHANINFO ChanInfo;
+
+ ChanInfo = (PCHANINFO)
+ (((PCHAR)g_AdapterInfo)+
+ sizeof(ADAPTERINFO)+
+ g_AdapterInfo->ChanHeaderLength*i);
+
+ io_mode = ChanInfo->MaxTransferMode;
+ if(io_mode != -1) {
+ ata_mode_to_str(mode_str, io_mode);
+ } else {
+ mode_str[0] = 0;
+ }
+ printf(" b%u [%s]\n",
+ i,
+ mode_str
+ );
+ }
+
while (adapterInfo->BusData[i].InquiryDataOffset) {
/*
if(dev_id/adapterInfo->BusData[i].NumberOfLogicalUnits ==
@@ -641,7 +617,7 @@
if(l_dev_id == dev_id || dev_id == -1) {
- if(!memcmp(&inquiryData->InquiryData[8],
UNIATA_COMM_PORT_VENDOR_STR, 24)) {
+ if(!memcmp(&(inquiryData->InquiryData[8]),
UNIATA_COMM_PORT_VENDOR_STR, 24)) {
// skip communication port
goto next_dev;
}
@@ -651,7 +627,7 @@
if(inquiryData->Lun) {
sprintf(lun_str, ":l%d", inquiryData->Lun);
} else {
- sprintf(lun_str, " ", inquiryData->Lun);
+ sprintf(lun_str, " ");
}
@@ -665,14 +641,17 @@
addr.PathId = inquiryData->PathId;
addr.TargetId = inquiryData->TargetId;
addr.Lun = inquiryData->Lun;
- status = ata_send_ioctl(h, &addr, "-UNIATA-",
+ status = ata_send_ioctl(h, &addr, (PCHAR)"-UNIATA-",
IOCTL_SCSI_MINIPORT_UNIATA_GET_MODE,
NULL, 0,
&IoMode, sizeof(IoMode),
&returned);
if(status) {
//io_mode = min(IoMode.CurrentMode, IoMode.MaxMode);
- io_mode =
min(max(IoMode.CurrentMode,IoMode.OrigMode),IoMode.MaxMode);
+ io_mode = IoMode.PhyMode;
+ if(!io_mode) {
+ io_mode =
min(max(IoMode.CurrentMode,IoMode.OrigMode),IoMode.MaxMode);
+ }
} else {
io_mode = -1;
}
@@ -684,7 +663,7 @@
// probably, we shall change this in future to support SATA splitters
pin.bDriveNumber = inquiryData->PathId*2+inquiryData->TargetId;
- status = ata_send_ioctl(h, NULL, "SCSIDISK",
+ status = ata_send_ioctl(h, NULL, (PCHAR)"SCSIDISK",
IOCTL_SCSI_MINIPORT_IDENTIFY,
&pin, sizeof(pin),
buff, sizeof(buff),
@@ -698,7 +677,7 @@
// probably, we shall change this in future to support SATA
splitters
pin.bDriveNumber =
inquiryData->PathId*2+inquiryData->TargetId;
- status = ata_send_ioctl(h, NULL, "SCSIDISK",
+ status = ata_send_ioctl(h, NULL, (PCHAR)"SCSIDISK",
IOCTL_SCSI_MINIPORT_IDENTIFY,
&pin, sizeof(pin),
buff, sizeof(buff),
@@ -708,7 +687,7 @@
if(status) {
if(!g_extended) {
- printf(" b%d:d%d%s %24.24s %4.4s ",
+ printf(" b%u:d%d%s %24.24s %4.4s ",
i,
inquiryData->TargetId,
lun_str,
@@ -717,7 +696,7 @@
(g_extended ? (PUCHAR)"" :
&inquiryData->InquiryData[8+24])
);
} else {
- printf(" b%d:d%d%s ",
+ printf(" b%u:d%d%s ",
i,
inquiryData->TargetId,
lun_str
@@ -806,27 +785,27 @@
if(BlockMode_valid) {
if(ident->MaximumBlockTransfer) {
- printf(" Multi-block mode: %d block%s\n",
ident->MaximumBlockTransfer, ident->MaximumBlockTransfer == 1 ? "" :
"s");
+ printf(" Multi-block mode: %u block%s\n",
ident->MaximumBlockTransfer, ident->MaximumBlockTransfer == 1 ? "" :
"s");
} else {
printf(" Multi-block mode: N/A\n");
}
}
if(print_geom) {
- printf(" C/H/S: %d/%d/%d \n",
chs[0], chs[1], chs[2]);
- printf(" LBA: %d \n", max_lba);
+ printf(" C/H/S: %u/%u/%u \n",
chs[0], chs[1], chs[2]);
+ printf(" LBA: %I64u \n",
max_lba);
if(max_lba < 2) {
- printf(" Size: %d kb\n",
max_lba/2);
+ printf(" Size: %u kb\n",
max_lba/2);
} else
if(max_lba < 2*1024*1024) {
- printf(" Size: %d Mb\n",
max_lba/2048);
+ printf(" Size: %u Mb\n",
max_lba/2048);
} else
if(max_lba < (ULONG)2*1024*1024*1024) {
- printf(" Size: %d.%d (%d)
Gb\n", (ULONG)(max_lba/2048/1024),
+ printf(" Size: %u.%u (%u)
Gb\n", (ULONG)(max_lba/2048/1024),
(ULONG)(((max_lba/2048)%1024)/10),
(ULONG)(max_lba*512/1000/1000/1000)
);
} else {
- printf(" Size: %d.%d (%d)
Tb\n", (ULONG)(max_lba/2048/1024/1024),
+ printf(" Size: %u.%u (%u)
Tb\n", (ULONG)(max_lba/2048/1024/1024),
(ULONG)((max_lba/2048/1024)%1024)/10,
(ULONG)(max_lba*512/1000/1000/1000)
);
@@ -868,11 +847,13 @@
{
char dev_name[64];
HANDLE h;
- ADAPTERINFO AdapterInfo;
+ PADAPTERINFO AdapterInfo;
ULONG status;
ULONG returned;
SCSI_ADDRESS addr;
PCI_SLOT_NUMBER slotData;
+ char mode_str[12];
+ ULONG len;
sprintf(dev_name, "\\\\.\\Scsi%d:", bus_id);
h = ata_open_dev(dev_name);
@@ -880,35 +861,52 @@
return FALSE;
addr.PortNumber = bus_id;
- memset(&AdapterInfo, 0, sizeof(AdapterInfo));
-
- status = ata_send_ioctl(h, &addr, "-UNIATA-",
+ len = sizeof(ADAPTERINFO)+sizeof(CHANINFO)*AHCI_MAX_PORT;
+ if(!g_AdapterInfo) {
+ AdapterInfo = (PADAPTERINFO)GlobalAlloc(GMEM_FIXED, len);
+ if(!AdapterInfo) {
+ return FALSE;
+ }
+ } else {
+ AdapterInfo = g_AdapterInfo;
+ }
+ memset(AdapterInfo, 0, len);
+
+ status = ata_send_ioctl(h, &addr, (PCHAR)"-UNIATA-",
IOCTL_SCSI_MINIPORT_UNIATA_ADAPTER_INFO,
- &AdapterInfo, sizeof(AdapterInfo),
- &AdapterInfo, sizeof(AdapterInfo),
+ AdapterInfo, len,
+ AdapterInfo, len,
&returned);
- printf("Scsi%d: %s\n", bus_id, status ? "[UniATA]" :
"");
+ if(status) {
+ ata_mode_to_str(mode_str, AdapterInfo->MaxTransferMode);
+ }
+ printf("Scsi%d: %s %s\n", bus_id, status ? "[UniATA]" :
"", status ? mode_str : "");
if(print_info) {
if(!status) {
printf("Can't get adapter info\n");
} else {
- if(AdapterInfo.AdapterInterfaceType == PCIBus) {
- slotData.u.AsULONG = AdapterInfo.slotNumber;
- printf(" PCI Bus/Dev/Func: %d/%d/%d%s\n",
- AdapterInfo.SystemIoBusNumber, slotData.u.bits.DeviceNumber,
slotData.u.bits.FunctionNumber,
- AdapterInfo.AdapterInterfaceType ==
AdapterInfo.OrigAdapterInterfaceType ? "" : " (ISA-Bridged)");
- printf(" VendorId/DevId/Rev: %#04x/%#04x/%#02x\n",
AdapterInfo.DevID >> 16, AdapterInfo.DevID & 0xffff, AdapterInfo.RevID);
- if(AdapterInfo.DeviceName[0]) {
- printf(" Name: %s\n",
AdapterInfo.DeviceName);
+ if(AdapterInfo->AdapterInterfaceType == PCIBus) {
+ slotData.u.AsULONG = AdapterInfo->slotNumber;
+ printf(" PCI Bus/Dev/Func: %u/%u/%u%s\n",
+ AdapterInfo->SystemIoBusNumber, slotData.u.bits.DeviceNumber,
slotData.u.bits.FunctionNumber,
+ AdapterInfo->AdapterInterfaceType ==
AdapterInfo->OrigAdapterInterfaceType ? "" : " (ISA-Bridged)");
+ printf(" VendorId/DevId/Rev: %#04x/%#04x/%#02x\n",
+ (USHORT)(AdapterInfo->DevID >> 16),
+ (USHORT)(AdapterInfo->DevID & 0xffff),
+ (UCHAR)(AdapterInfo->RevID));
+ if(AdapterInfo->DeviceName[0]) {
+ printf(" Name: %s\n",
AdapterInfo->DeviceName);
}
} else
- if(AdapterInfo.AdapterInterfaceType == Isa) {
+ if(AdapterInfo->AdapterInterfaceType == Isa) {
printf(" ISA Bus\n");
}
- printf(" IRQ: %d\n", AdapterInfo.BusInterruptLevel);
+ printf(" IRQ: %d\n", AdapterInfo->BusInterruptLevel);
}
}
ata_close_dev(h);
+ //GlobalFree(AdapterInfo);
+ g_AdapterInfo = AdapterInfo;
return status ? TRUE : FALSE;
} // end ata_adapter_info()
@@ -996,7 +994,7 @@
// IoMode.ApplyImmediately = TRUE;
IoMode.OrigMode = mode;
- status = ata_send_ioctl(h, &addr, "-UNIATA-",
+ status = ata_send_ioctl(h, &addr, (PCHAR)"-UNIATA-",
IOCTL_SCSI_MINIPORT_UNIATA_SET_MAX_MODE,
&IoMode, sizeof(IoMode),
NULL, 0,
@@ -1094,7 +1092,7 @@
if(lock) {
printf("ATTENTION: you have %d seconds to disconnect cable\n", lock);
}
- status = ata_send_ioctl(h, &addr, "-UNIATA-",
+ status = ata_send_ioctl(h, &addr, (PCHAR)"-UNIATA-",
IOCTL_SCSI_MINIPORT_UNIATA_DELETE_DEVICE,
&to, sizeof(to),
NULL, 0,
@@ -1144,7 +1142,7 @@
if(lock) {
printf("You have %d seconds to connect device.\n", lock);
}
- status = ata_send_ioctl(h, &addr, "-UNIATA-",
+ status = ata_send_ioctl(h, &addr, (PCHAR)"-UNIATA-",
IOCTL_SCSI_MINIPORT_UNIATA_FIND_DEVICES,
&to, sizeof(to),
NULL, 0,
@@ -1233,12 +1231,12 @@
print_help();
return FALSE;
}
- if((dev_id >> 16) & 0xff == 0xff) {
+ if(((dev_id >> 16) & 0xff) == 0xff) {
printf("\nERROR: Target device bus number (channel) must be specified with
b:<bus id>\n\n");
print_help();
return FALSE;
}
- if((dev_id >> 8) & 0xff == 0xff) {
+ if(((dev_id >> 8) & 0xff) == 0xff) {
printf("\nERROR: Target device ID must be specified with d:<device
id>\n\n");
print_help();
return FALSE;
@@ -1289,7 +1287,7 @@
addr.TargetId = (UCHAR)(dev_id >> 8);
addr.Lun = (UCHAR)(dev_id);
- status = ata_send_ioctl(h, &addr, "-UNIATA-",
+ status = ata_send_ioctl(h, &addr, (PCHAR)"-UNIATA-",
IOCTL_SCSI_MINIPORT_UNIATA_RESETBB,
NULL, 0,
NULL, 0,
@@ -1355,7 +1353,7 @@
}
k = k0;
if(radix == 10) {
- b = sscanf(BB_Msg+k, "%I64d\t%I64d", &tmp_bb_lba,
&tmp_bb_len);
+ b = sscanf(BB_Msg+k, "%I64u\t%I64u", &tmp_bb_lba,
&tmp_bb_len);
} else {
b = sscanf(BB_Msg+k, "%I64x\t%I64x", &tmp_bb_lba,
&tmp_bb_len);
}
@@ -1464,7 +1462,7 @@
while(len >= sizeof(LONGLONG)*2) {
tmp_bb_lba = ((LONGLONG*)bblist)[i*2+0];
tmp_bb_len = ((LONGLONG*)bblist)[i*2+1] - tmp_bb_lba;
- b = sprintf(BB_Msg, "%I64x\t%I64x\n", tmp_bb_lba, tmp_bb_len);
+ b = sprintf(BB_Msg, "%I64u\t%I64u\n", tmp_bb_lba, tmp_bb_len);
WriteFile(hf, BB_Msg, b, &returned, NULL);
i++;
len -= sizeof(LONGLONG)*2;
@@ -1511,7 +1509,7 @@
int persistent_hide=0;
printf("Console ATA control utility for Windows NT3.51/NT4/2000/XP/2003\n"
- "Version 0." UNIATA_VER_STR ", Copyright (c) Alexander A.
Telyatnikov, 2003-2008\n"
+ "Version 0." UNIATA_VER_STR ", Copyright (c) Alexander A.
Telyatnikov, 2003-2012\n"
"Home site:
http://alter.org.ua\n")uot;);
for(i=1; i<argc; i++) {
@@ -1633,7 +1631,7 @@
j = strlen(argv[i])-1;
break;
case 'd' :
- if(cmd && cmd != CMD_ATA_FIND && cmd != CMD_ATA_HIDE) {
+ if(cmd && (cmd != CMD_ATA_FIND) && (cmd != CMD_ATA_HIDE))
{
print_help();
}
i++;
@@ -1680,12 +1678,12 @@
d_dev = 127;
l_dev = 127;
} else
- if(d_dev == -1 && b_dev != -1) {
+ if((d_dev == -1) && (b_dev != -1)) {
d_dev = 127;
l_dev = 127;
}
- if(d_dev != -1 && b_dev != -1) {
+ if((d_dev != -1) && (b_dev != -1)) {
dev_id = (b_dev << 16) | (d_dev << 8) | l_dev;
}
if(cmd == CMD_ATA_LIST) {
Modified: trunk/reactos/drivers/storage/ide/uniata/atapi.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/ide/uniata…
==============================================================================
--- trunk/reactos/drivers/storage/ide/uniata/atapi.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/storage/ide/uniata/atapi.h [iso-8859-1] Mon Aug 13 16:25:08
2012
@@ -295,6 +295,44 @@
UCHAR MediumType;
UCHAR Reserved[5];
}MODE_PARAMETER_HEADER_10, *PMODE_PARAMETER_HEADER_10;
+
+//
+// values for TransferMode
+//
+#define ATA_PIO 0x00
+#define ATA_PIO_NRDY 0x01
+
+#define ATA_PIO0 0x08
+#define ATA_PIO1 0x09
+#define ATA_PIO2 0x0a
+#define ATA_PIO3 0x0b
+#define ATA_PIO4 0x0c
+#define ATA_PIO5 0x0d
+
+#define ATA_DMA 0x10
+#define ATA_SDMA 0x10
+#define ATA_SDMA0 0x10
+#define ATA_SDMA1 0x11
+#define ATA_SDMA2 0x12
+
+#define ATA_WDMA 0x20
+#define ATA_WDMA0 0x20
+#define ATA_WDMA1 0x21
+#define ATA_WDMA2 0x22
+
+#define ATA_UDMA 0x40
+#define ATA_UDMA0 0x40 // ATA-16
+#define ATA_UDMA1 0x41 // ATA-25
+#define ATA_UDMA2 0x42 // ATA-33
+#define ATA_UDMA3 0x43 // ATA-44
+#define ATA_UDMA4 0x44 // ATA-66
+#define ATA_UDMA5 0x45 // ATA-100
+#define ATA_UDMA6 0x46 // ATA-133
+//#define ATA_UDMA7 0x47 // ATA-166
+
+#define ATA_SA150 0x47 /*0x80*/
+#define ATA_SA300 0x48 /*0x81*/
+#define ATA_SA600 0x49 /*0x82*/
//
// IDE command definitions
@@ -767,6 +805,8 @@
USHORT HwResCableId : 1;
USHORT HwResValid : 2;
+#define IDENTIFY_CABLE_ID_VALID 0x01
+
USHORT CurrentAcoustic : 8; // 94
USHORT VendorAcoustic : 8;
@@ -1489,6 +1529,83 @@
#endif //USER_MODE
+__inline
+BOOLEAN
+ata_is_sata(
+ PIDENTIFY_DATA ident
+ )
+{
+ return (ident->SataCapabilities && ident->SataCapabilities != 0xffff);
+} // end ata_is_sata()
+
+__inline
+LONG
+ata_cur_mode_from_ident(
+ PIDENTIFY_DATA ident
+ )
+{
+ if(ata_is_sata(ident)) {
+ if(ident->SataCapabilities & ATA_SATA_GEN3) {
+ return ATA_SA600;
+ } else
+ if(ident->SataCapabilities & ATA_SATA_GEN2) {
+ return ATA_SA300;
+ } else
+ if(ident->SataCapabilities & ATA_SATA_GEN1) {
+ return ATA_SA150;
+ }
+ return ATA_SA150;
+ }
+
+ if (ident->UdmaModesValid) {
+ if (ident->UltraDMAActive & 0x40)
+ return ATA_UDMA0+6;
+ if (ident->UltraDMAActive & 0x20)
+ return ATA_UDMA0+5;
+ if (ident->UltraDMAActive & 0x10)
+ return ATA_UDMA0+4;
+ if (ident->UltraDMAActive & 0x08)
+ return ATA_UDMA0+3;
+ if (ident->UltraDMAActive & 0x04)
+ return ATA_UDMA0+2;
+ if (ident->UltraDMAActive & 0x02)
+ return ATA_UDMA0+1;
+ if (ident->UltraDMAActive & 0x01)
+ return ATA_UDMA0+0;
+ }
+
+ if (ident->MultiWordDMAActive & 0x04)
+ return ATA_WDMA0+2;
+ if (ident->MultiWordDMAActive & 0x02)
+ return ATA_WDMA0+1;
+ if (ident->MultiWordDMAActive & 0x01)
+ return ATA_WDMA0+0;
+
+ if (ident->SingleWordDMAActive & 0x04)
+ return ATA_SDMA0+2;
+ if (ident->SingleWordDMAActive & 0x02)
+ return ATA_SDMA0+1;
+ if (ident->SingleWordDMAActive & 0x01)
+ return ATA_SDMA0+0;
+
+ if (ident->PioTimingsValid) {
+ if (ident->AdvancedPIOModes & AdvancedPIOModes_5)
+ return ATA_PIO0+5;
+ if (ident->AdvancedPIOModes & AdvancedPIOModes_4)
+ return ATA_PIO0+4;
+ if (ident->AdvancedPIOModes & AdvancedPIOModes_3)
+ return ATA_PIO0+3;
+ }
+ if (ident->PioCycleTimingMode == 2)
+ return ATA_PIO0+2;
+ if (ident->PioCycleTimingMode == 1)
+ return ATA_PIO0+1;
+ if (ident->PioCycleTimingMode == 0)
+ return ATA_PIO0+0;
+
+ return ATA_PIO;
+} // end ata_cur_mode_from_ident()
+
#pragma pack(pop)
#endif // __GLOBAL_H__
Modified: trunk/reactos/drivers/storage/ide/uniata/bm_devs.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/ide/uniata…
==============================================================================
--- trunk/reactos/drivers/storage/ide/uniata/bm_devs.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/storage/ide/uniata/bm_devs.h [iso-8859-1] Mon Aug 13 16:25:08
2012
@@ -40,44 +40,6 @@
#define IDE_MAX_LUN (AHCI_MAX_PORT*IDE_MAX_LUN_PER_CHAN)
#define MAX_QUEUE_STAT 8
-
-//
-// values for TransferMode
-//
-#define ATA_PIO 0x00
-#define ATA_PIO_NRDY 0x01
-
-#define ATA_PIO0 0x08
-#define ATA_PIO1 0x09
-#define ATA_PIO2 0x0a
-#define ATA_PIO3 0x0b
-#define ATA_PIO4 0x0c
-#define ATA_PIO5 0x0d
-
-#define ATA_DMA 0x10
-#define ATA_SDMA 0x10
-#define ATA_SDMA0 0x10
-#define ATA_SDMA1 0x11
-#define ATA_SDMA2 0x12
-
-#define ATA_WDMA 0x20
-#define ATA_WDMA0 0x20
-#define ATA_WDMA1 0x21
-#define ATA_WDMA2 0x22
-
-#define ATA_UDMA 0x40
-#define ATA_UDMA0 0x40 // ATA-16
-#define ATA_UDMA1 0x41 // ATA-25
-#define ATA_UDMA2 0x42 // ATA-33
-#define ATA_UDMA3 0x43 // ATA-44
-#define ATA_UDMA4 0x44 // ATA-66
-#define ATA_UDMA5 0x45 // ATA-100
-#define ATA_UDMA6 0x46 // ATA-133
-//#define ATA_UDMA7 0x47 // ATA-166
-
-#define ATA_SA150 0x47 /*0x80*/
-#define ATA_SA300 0x48 /*0x81*/
-#define ATA_SA600 0x49 /*0x82*/
// define PIO timings in nanoseconds
#define PIO0_TIMING 600
Modified: trunk/reactos/drivers/storage/ide/uniata/bsmaster.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/ide/uniata…
==============================================================================
--- trunk/reactos/drivers/storage/ide/uniata/bsmaster.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/storage/ide/uniata/bsmaster.h [iso-8859-1] Mon Aug 13 16:25:08
2012
@@ -1085,13 +1085,14 @@
ULONG DiscsPresent; // Indicates number of platters on changer-ish
devices.
BOOLEAN DWordIO; // Indicates use of 32-bit PIO
UCHAR ReturningMediaStatus;
+ UCHAR MaximumBlockXfer;
+ UCHAR Padding0[1]; // padding
UCHAR TransferMode; // current transfer mode
UCHAR LimitedTransferMode; // user-defined or IDE cable limitation
UCHAR OrigTransferMode; // transfer mode, returned by device IDENTIFY
(can be changed via IOCTL)
-
- UCHAR MaximumBlockXfer;
- UCHAR Padding0[2]; // padding
+ UCHAR PhyTransferMode; // phy transfer mode (actual bus transfer mode
for PATA DMA and SATA)
+
ULONG ErrorCount; // Count of errors. Used to turn off features.
// ATA_QUEUE cmd_queue;
LONGLONG ReadCmdCost;
Modified: trunk/reactos/drivers/storage/ide/uniata/id_ata.cpp
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/ide/uniata…
==============================================================================
--- trunk/reactos/drivers/storage/ide/uniata/id_ata.cpp [iso-8859-1] (original)
+++ trunk/reactos/drivers/storage/ide/uniata/id_ata.cpp [iso-8859-1] Mon Aug 13 16:25:08
2012
@@ -717,6 +717,14 @@
} else {
AtapiStallExecution(500);
AtapiWritePort1(chan, IDX_IO1_o_Command, IDE_COMMAND_ATAPI_RESET);
+ AtapiStallExecution(30);
+
+ // Wait for BUSY assertion, in some cases delay may occure
+ while (!(AtapiReadPort1(chan, IDX_IO1_i_Status) & IDE_STATUS_BUSY)
&&
+ i--)
+ {
+ AtapiStallExecution(30);
+ }
// ReactOS modification: Already stop looping when we know that the drive has
finished resetting.
// Not all controllers clear the IDE_STATUS_BUSY flag (e.g. not the VMware one),
so ensure that
@@ -1066,6 +1074,24 @@
return IOMODE_NOT_SPECIFIED;
} // end AtaUmode()
+LONG
+NTAPI
+AtaSAmode(PIDENTIFY_DATA2 ident) {
+ if(!ident->SataCapabilities ||
+ ident->SataCapabilities == 0xffff) {
+ return IOMODE_NOT_SPECIFIED;
+ }
+ if(ident->SataCapabilities & ATA_SATA_GEN3) {
+ return ATA_SA600;
+ } else
+ if(ident->SataCapabilities & ATA_SATA_GEN2) {
+ return ATA_SA300;
+ } else
+ if(ident->SataCapabilities & ATA_SATA_GEN1) {
+ return ATA_SA150;
+ }
+ return IOMODE_NOT_SPECIFIED;
+} // end AtaSAmode()
#ifndef UNIATA_CORE
@@ -1580,6 +1606,12 @@
KdPrint2((PRINT_PREFIX "SATA support: %x, CAPs %#x\n",
deviceExtension->FullIdentifyData.SataSupport,
deviceExtension->FullIdentifyData.SataCapabilities));
+
+ LunExt->LimitedTransferMode =
+ LunExt->OrigTransferMode =
+ (UCHAR)ata_cur_mode_from_ident(&(deviceExtension->FullIdentifyData));
+
+ KdPrint2((PRINT_PREFIX "OrigTransferMode: %x\n",
LunExt->OrigTransferMode));
// Check out a few capabilities / limitations of the device.
if (deviceExtension->FullIdentifyData.RemovableStatus & 1) {
@@ -3001,7 +3033,7 @@
}
PreferedMode = LunExt->opt_MaxTransferMode;
- if(PreferedMode == 0xffffffff) {
+ if((PreferedMode == 0xffffffff) || (PreferedMode > chan->MaxTransferMode))
{
KdPrint2((PRINT_PREFIX "MaxTransferMode (overriden): %#x\n",
chan->MaxTransferMode));
PreferedMode = chan->MaxTransferMode;
}
@@ -3012,14 +3044,12 @@
}
KdPrint2((PRINT_PREFIX " try mode %#x\n", PreferedMode));
- LunExt->OrigTransferMode =
LunExt->LimitedTransferMode =
LunExt->TransferMode =
(CHAR)PreferedMode;
AtapiDmaInit__(deviceExtension, LunExt);
- LunExt->OrigTransferMode =
LunExt->LimitedTransferMode =
LunExt->TransferMode;
KdPrint2((PRINT_PREFIX "Using %#x mode\n", LunExt->TransferMode));
@@ -5033,11 +5063,10 @@
} else {
AtaReq->WordsLeft -= AtaReq->WordsTransfered;
}
- if(AtaReq->WordsLeft) {
+ if(AtaReq->WordsLeft && (status == SRB_STATUS_SUCCESS)) {
status = SRB_STATUS_DATA_OVERRUN;
- } else {
- status = SRB_STATUS_SUCCESS;
- }
+ }
+ status = SRB_STATUS_SUCCESS;
chan->ChannelCtrlFlags &= ~CTRFLAGS_DMA_OPERATION;
goto CompleteRequest;
} else
@@ -5106,11 +5135,13 @@
"IdeIntr: DMA tmp INTR %#x vs %#x\n",
AtaReq->WordsLeft, wordCount));
if(AtaReq->WordsLeft > wordCount) {
AtaReq->WordsLeft -= wordCount;
+ AtaReq->WordsTransfered += wordCount;
AtaReq->ReqState = REQ_STATE_ATAPI_EXPECTING_DATA_INTR;
goto ReturnEnableIntr;
}
dma_status = AtapiDmaDone(HwDeviceExtension, DEVNUM_NOT_SPECIFIED,
lChannel, NULL/*srb*/);
}
+ AtaReq->WordsTransfered = AtaReq->WordsLeft;
AtaReq->WordsLeft = 0;
status = SRB_STATUS_SUCCESS;
chan->ChannelCtrlFlags &= ~CTRFLAGS_DMA_OPERATION;
@@ -5152,6 +5183,7 @@
// Advance data buffer pointer and bytes left.
AtaReq->DataBuffer += wordCount;
AtaReq->WordsLeft -= wordCount;
+ AtaReq->WordsTransfered += wordCount;
if (atapiDev) {
AtaReq->ReqState = REQ_STATE_ATAPI_EXPECTING_DATA_INTR;
@@ -5205,12 +5237,14 @@
"IdeIntr: DMA tmp INTR %#x vs %#x\n",
AtaReq->WordsLeft, wordCount));
if(AtaReq->WordsLeft > wordCount) {
AtaReq->WordsLeft -= wordCount;
+ AtaReq->WordsTransfered += wordCount;
AtaReq->ReqState = REQ_STATE_ATAPI_EXPECTING_DATA_INTR;
goto ReturnEnableIntr;
}
dma_status = AtapiDmaDone(HwDeviceExtension, DEVNUM_NOT_SPECIFIED,
lChannel, NULL/*srb*/);
}
//ASSERT(AtaReq->WordsLeft == wordCount);
+ AtaReq->WordsTransfered = AtaReq->WordsLeft;
AtaReq->WordsLeft = 0;
status = SRB_STATUS_SUCCESS;
chan->ChannelCtrlFlags &= ~CTRFLAGS_DMA_OPERATION;
@@ -5281,6 +5315,7 @@
// Advance data buffer pointer and bytes left.
AtaReq->DataBuffer += wordCount;
AtaReq->WordsLeft -= wordCount;
+ AtaReq->WordsTransfered += wordCount;
// Check for read command complete.
if (AtaReq->WordsLeft == 0) {
@@ -5358,13 +5393,14 @@
// Command complete.
if(DmaTransfer) {
KdPrint2((PRINT_PREFIX "AtapiInterrupt: CompleteRequest, was
DmaTransfer\n"));
+ AtaReq->WordsTransfered = AtaReq->WordsLeft;
AtaReq->WordsLeft = 0;
}
- if (AtaReq->WordsLeft) {
- status = SRB_STATUS_DATA_OVERRUN;
- } else {
+ //if (AtaReq->WordsLeft) {
+ // status = SRB_STATUS_DATA_OVERRUN;
+ //} else {
status = SRB_STATUS_SUCCESS;
- }
+ //}
#ifdef UNIATA_DUMP_ATAPI
if(srb &&
@@ -5419,6 +5455,12 @@
KdPrint2((PRINT_PREFIX "AtapiInterrupt: CompleteRequest, srbstatus
%x\n", status));
// Check and see if we are processing our secret (mechanism status/request sense)
srb
+
+ if(AtaReq->WordsLeft && (status == SRB_STATUS_SUCCESS)) {
+ KdPrint2((PRINT_PREFIX "WordsLeft %#x -> SRB_STATUS_SUCCESS\n",
AtaReq->WordsLeft));
+ status = SRB_STATUS_DATA_OVERRUN;
+ }
+
if (AtaReq->OriginalSrb) {
ULONG srbStatus;
@@ -5691,10 +5733,10 @@
}
}
if(status == SRB_STATUS_SUCCESS) {
- if(!(deviceExtension->HwFlags & UNIATA_AHCI)) {
- // This should be set in UniataAhciEndTransaction() for AHCI
- AtaReq->WordsTransfered += AtaReq->bcount * DEV_BSIZE/2;
- }
+ //if(!(deviceExtension->HwFlags & UNIATA_AHCI) &&
!atapiDev) {
+ // // This should be set in UniataAhciEndTransaction() for AHCI
+ // AtaReq->WordsTransfered += AtaReq->bcount * DEV_BSIZE/2;
+ //}
if(!atapiDev &&
AtaReq->WordsTransfered*2 < AtaReq->TransferLength) {
KdPrint2((PRINT_PREFIX "AtapiInterrupt: more I/O required (%x of
%x bytes) -> reenqueue\n",
@@ -6788,7 +6830,6 @@
// check if DMA read/write
if(deviceExtension->HwFlags & UNIATA_SATA) {
- // DEBUG !!!! for TEST ONLY
KdPrint2((PRINT_PREFIX "AtapiSendCommand: force use dma
(ahci)\n"));
use_dma = TRUE;
goto setup_dma;
@@ -8809,8 +8850,16 @@
//ULONG ldev = GET_LDEV2(AtaCtl->addr.PathId,
AtaCtl->addr.TargetId, 0);
ULONG DeviceNumber = AtaCtl->addr.TargetId;
BOOLEAN bad_ldev;
- ULONG i;
+ ULONG i, pos;
+
+ pos = FIELD_OFFSET(UNIATA_CTL, RawData);
//chan = &(deviceExtension->chan[lChannel]);
+ if(len < pos) {
+ KdPrint2((PRINT_PREFIX "AtapiStartIo: AtaCtl Buffer too small:
%#x < %#x\n", len,
+ FIELD_OFFSET(UNIATA_CTL, RawData) ));
+ status = SRB_STATUS_DATA_OVERRUN;
+ break;
+ }
if(AtaCtl->addr.Lun ||
AtaCtl->addr.TargetId >= deviceExtension->NumberLuns ||
@@ -8875,6 +8924,12 @@
}
goto uata_ctl_queue;
case IOCTL_SCSI_MINIPORT_UNIATA_SET_MAX_MODE:
+ if(len < pos+sizeof(AtaCtl->SetMode)) {
+ KdPrint2((PRINT_PREFIX "AtapiStartIo: AtaCtl Buffer too
small: %#x < %#x\n", len,
+ pos+sizeof(AtaCtl->SetMode) ));
+ status = SRB_STATUS_DATA_OVERRUN;
+ goto complete_req;
+ }
if(!AtaCtl->SetMode.ApplyImmediately) {
break;
}
@@ -8905,6 +8960,12 @@
KdPrint2((PRINT_PREFIX "AtapiStartIo: rescan bus\n"));
+ if(len < pos+sizeof(AtaCtl->FindDelDev)) {
+ KdPrint2((PRINT_PREFIX "AtapiStartIo: AtaCtl Buffer too
small: %#x < %#x\n", len,
+ pos+sizeof(AtaCtl->FindDelDev) ));
+ status = SRB_STATUS_DATA_OVERRUN;
+ goto complete_req;
+ }
if(AtaCtl->FindDelDev.Flags & UNIATA_ADD_FLAGS_UNHIDE) {
KdPrint2((PRINT_PREFIX "AtapiStartIo: unhide from further
detection\n"));
if(AtaCtl->addr.TargetId != 0xff) {
@@ -8929,10 +8990,17 @@
KdPrint2((PRINT_PREFIX "AtapiStartIo: remove %#x:%#x\n",
AtaCtl->addr.PathId, AtaCtl->addr.TargetId));
+ if(len < pos+sizeof(AtaCtl->FindDelDev)) {
+ KdPrint2((PRINT_PREFIX "AtapiStartIo: AtaCtl Buffer too
small: %#x < %#x\n", len,
+ pos+sizeof(AtaCtl->FindDelDev) ));
+ status = SRB_STATUS_DATA_OVERRUN;
+ goto complete_req;
+ }
LunExt->DeviceFlags = 0;
if(AtaCtl->FindDelDev.Flags & UNIATA_REMOVE_FLAGS_HIDE) {
KdPrint2((PRINT_PREFIX "AtapiStartIo: hide from further
detection\n"));
- LunExt->DeviceFlags |= DFLAGS_HIDDEN;
+ //LunExt->DeviceFlags |= DFLAGS_HIDDEN;
+ UniataForgetDevice(LunExt);
}
for(i=0; i<AtaCtl->FindDelDev.WaitForPhysicalLink &&
i<30; i++) {
@@ -8946,6 +9014,12 @@
KdPrint2((PRINT_PREFIX "AtapiStartIo: Set transfer
mode\n"));
+ if(len < pos+sizeof(AtaCtl->SetMode)) {
+ KdPrint2((PRINT_PREFIX "AtapiStartIo: AtaCtl Buffer too
small: %#x < %#x\n", len,
+ pos+sizeof(AtaCtl->SetMode) ));
+ status = SRB_STATUS_DATA_OVERRUN;
+ goto complete_req;
+ }
if(AtaCtl->SetMode.OrigMode != IOMODE_NOT_SPECIFIED) {
LunExt->OrigTransferMode =
(UCHAR)(AtaCtl->SetMode.OrigMode);
}
@@ -8973,9 +9047,16 @@
KdPrint2((PRINT_PREFIX "AtapiStartIo: Get transfer
mode\n"));
+ if(len < pos+sizeof(AtaCtl->GetMode)) {
+ KdPrint2((PRINT_PREFIX "AtapiStartIo: AtaCtl Buffer too
small: %#x < %#x\n", len,
+ pos+sizeof(AtaCtl->GetMode) ));
+ status = SRB_STATUS_DATA_OVERRUN;
+ goto complete_req;
+ }
AtaCtl->GetMode.OrigMode = LunExt->OrigTransferMode;
AtaCtl->GetMode.MaxMode = LunExt->LimitedTransferMode;
AtaCtl->GetMode.CurrentMode = LunExt->TransferMode;
+ AtaCtl->GetMode.PhyMode = LunExt->PhyTransferMode;
status = SRB_STATUS_SUCCESS;
break;
@@ -8984,6 +9065,12 @@
KdPrint2((PRINT_PREFIX "AtapiStartIo: Get version\n"));
+ if(len < pos+sizeof(AtaCtl->Version)) {
+ KdPrint2((PRINT_PREFIX "AtapiStartIo: AtaCtl Buffer too
small: %#x < %#x\n", len,
+ pos+sizeof(AtaCtl->Version) ));
+ status = SRB_STATUS_DATA_OVERRUN;
+ goto complete_req;
+ }
AtaCtl->Version.Length = sizeof(GETDRVVERSION);
AtaCtl->Version.VersionMj = UNIATA_VER_MJ;
AtaCtl->Version.VersionMn = UNIATA_VER_MN;
@@ -8997,14 +9084,13 @@
KdPrint2((PRINT_PREFIX "AtapiStartIo: Get adapter
info\n"));
- AtaCtl->AdapterInfo.HeaderLength = FIELD_OFFSET(ADAPTERINFO,
Chan);
-
- if(len < AtaCtl->AdapterInfo.HeaderLength +
sizeof(AtaCtl->AdapterInfo.Chan)) {
- KdPrint2((PRINT_PREFIX "AtapiStartIo: Buffer too small: %#x
< %#x\n", len,
- AtaCtl->AdapterInfo.HeaderLength +
sizeof(AtaCtl->AdapterInfo.Chan)));
+ if(len < pos+sizeof(AtaCtl->AdapterInfo)) {
+ KdPrint2((PRINT_PREFIX "AtapiStartIo: AtaCtl Buffer too
small: %#x < %#x\n", len,
+ pos+sizeof(AtaCtl->AdapterInfo) ));
status = SRB_STATUS_DATA_OVERRUN;
- break;
+ goto complete_req;
}
+ AtaCtl->AdapterInfo.HeaderLength = sizeof(ADAPTERINFO);
AtaCtl->AdapterInfo.DevID = deviceExtension->DevID;
AtaCtl->AdapterInfo.RevID = deviceExtension->RevID;
@@ -9031,8 +9117,35 @@
}
AtaCtl->AdapterInfo.ChanInfoValid = FALSE;
AtaCtl->AdapterInfo.LunInfoValid = FALSE;
-
- RtlZeroMemory(&AtaCtl->AdapterInfo.Chan,
sizeof(AtaCtl->AdapterInfo.Chan));
+ AtaCtl->AdapterInfo.ChanHeaderLengthValid = TRUE;
+
+ pos += AtaCtl->AdapterInfo.HeaderLength;
+
+ // zero tail
+ RtlZeroMemory(((PCHAR)AtaCtl)+pos,
+ len-pos);
+
+ if(len >=
pos+AtaCtl->AdapterInfo.NumberChannels*sizeof(CHANINFO)) {
+ PCHANINFO ChanInfo = (PCHANINFO)( ((PCHAR)AtaCtl)+pos );
+ PHW_CHANNEL cur_chan;
+ KdPrint2((PRINT_PREFIX "AtapiStartIo: Fill channel
info\n"));
+ for(i=0;i<AtaCtl->AdapterInfo.NumberChannels;i++) {
+ KdPrint2((PRINT_PREFIX "chan[%d] %x\n", i,
cur_chan));
+ cur_chan = &(deviceExtension->chan[i]);
+ ChanInfo->MaxTransferMode = cur_chan->MaxTransferMode;
+ ChanInfo->ChannelCtrlFlags =
cur_chan->ChannelCtrlFlags;
+ RtlCopyMemory(&(ChanInfo->QueueStat),
&(cur_chan->QueueStat), sizeof(ChanInfo->QueueStat));
+ ChanInfo->ReorderCount =
cur_chan->ReorderCount;
+ ChanInfo->IntersectCount =
cur_chan->IntersectCount;
+ ChanInfo->TryReorderCount =
cur_chan->TryReorderCount;
+ ChanInfo->TryReorderHeadCount =
cur_chan->TryReorderHeadCount;
+ ChanInfo->TryReorderTailCount =
cur_chan->TryReorderTailCount;
+ //ChanInfo->opt_MaxTransferMode =
cur_chan->opt_MaxTransferMode;
+ ChanInfo++;
+ }
+ AtaCtl->AdapterInfo.ChanInfoValid = TRUE;
+ AtaCtl->AdapterInfo.ChanHeaderLength = sizeof(*ChanInfo);
+ }
status = SRB_STATUS_SUCCESS;
break;
Modified: trunk/reactos/drivers/storage/ide/uniata/id_dma.cpp
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/ide/uniata…
==============================================================================
--- trunk/reactos/drivers/storage/ide/uniata/id_dma.cpp [iso-8859-1] (original)
+++ trunk/reactos/drivers/storage/ide/uniata/id_dma.cpp [iso-8859-1] Mon Aug 13 16:25:08
2012
@@ -879,9 +879,23 @@
KdPrint3((PRINT_PREFIX " assume that drive doesn't support mode
swithing using PIO%d\n", apiomode));
mode = ATA_PIO0 + apiomode;
}
- //if(mode <= ATA_UDMA6) {
- LunExt->TransferMode = (UCHAR)mode;
- //}
+ // SATA sets actual transfer rate in LunExt on init.
+ // There is no run-time SATA rate adjustment yet.
+ // On the other hand, we may turn SATA device in PIO mode
+ LunExt->TransferMode = (UCHAR)mode;
+ if(deviceExtension->HwFlags & UNIATA_SATA) {
+ if(mode < ATA_SA150) {
+ LunExt->PhyTransferMode = max(LunExt->PhyTransferMode,
LunExt->TransferMode);
+ } else {
+ LunExt->PhyTransferMode = LunExt->TransferMode;
+ }
+ } else {
+ if(LunExt->DeviceFlags & DFLAGS_ATAPI_DEVICE) {
+ LunExt->PhyTransferMode = max(LunExt->LimitedTransferMode,
LunExt->TransferMode);
+ } else {
+ LunExt->PhyTransferMode = LunExt->TransferMode;
+ }
+ }
return TRUE;
} // end AtaSetTransferMode()
@@ -999,8 +1013,7 @@
if((udmamode >= 5) || (ChipFlags & UNIATA_AHCI) ||
chan->MaxTransferMode >= ATA_SA150) {
/* some drives report UDMA6, some UDMA5 */
/* ATAPI may not have SataCapabilities set in IDENTIFY DATA */
- if(LunExt->IdentifyData.SataCapabilities != 0x0000 &&
- LunExt->IdentifyData.SataCapabilities != 0xffff) {
+ if(ata_is_sata(&(LunExt->IdentifyData))) {
//udmamode = min(udmamode, 6);
KdPrint2((PRINT_PREFIX "LunExt->LimitedTransferMode %x,
LunExt->OrigTransferMode %x\n",
LunExt->LimitedTransferMode, LunExt->OrigTransferMode));
@@ -1011,7 +1024,7 @@
} else {
KdPrint2((PRINT_PREFIX "SATA -> PATA adapter ?\n"));
- if (udmamode > 2 && !LunExt->IdentifyData.HwResCableId) {
+ if (udmamode > 2 && (!LunExt->IdentifyData.HwResCableId ||
(LunExt->IdentifyData.HwResValid != IDENTIFY_CABLE_ID_VALID) )) {
KdPrint2((PRINT_PREFIX "AtapiDmaInit: DMA limited to UDMA33,
non-ATA66 compliant cable\n"));
udmamode = 2;
apiomode = min( apiomode, (CHAR)(LunExt->LimitedTransferMode -
ATA_PIO0));
@@ -1041,9 +1054,8 @@
goto try_generic_dma;
}
- if(udmamode > 2 && !LunExt->IdentifyData.HwResCableId) {
- if(LunExt->IdentifyData.SataCapabilities != 0x0000 &&
- LunExt->IdentifyData.SataCapabilities != 0xffff) {
+ if(udmamode > 2 && (!LunExt->IdentifyData.HwResCableId ||
(LunExt->IdentifyData.HwResValid != IDENTIFY_CABLE_ID_VALID)) ) {
+ if(ata_is_sata(&(LunExt->IdentifyData))) {
KdPrint2((PRINT_PREFIX "AtapiDmaInit: SATA beyond adapter or Controller
compat mode\n"));
} else {
KdPrint2((PRINT_PREFIX "AtapiDmaInit: DMA limited to UDMA33, non-ATA66
compliant cable\n"));
Modified: trunk/reactos/drivers/storage/ide/uniata/id_init.cpp
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/ide/uniata…
==============================================================================
--- trunk/reactos/drivers/storage/ide/uniata/id_init.cpp [iso-8859-1] (original)
+++ trunk/reactos/drivers/storage/ide/uniata/id_init.cpp [iso-8859-1] Mon Aug 13 16:25:08
2012
@@ -1350,10 +1350,11 @@
GetPciConfig1(0x5a, res);
res = res & (channel ? 0x01 : 0x02);
SetPciConfig1(reg, val);
+ KdPrint2((PRINT_PREFIX "hpt_cable80(%d) = %d\n", channel, !res));
return !res;
} // end hpt_cable80()
-
+/*
ULONG
NTAPI
via_cable80(
@@ -1398,9 +1399,11 @@
res |= TRUE; //(1 << (1 - (i >> 4)));
}
}
+ KdPrint2((PRINT_PREFIX "via_cable80(%d) = %d\n", channel, res));
return res;
} // end via_cable80()
+*/
BOOLEAN
NTAPI
@@ -1426,9 +1429,11 @@
GetPciConfig1(pci_reg, tmp8);
if(!(tmp8 & (1 << (channel << bit_offs)))) {
chan->MaxTransferMode = min(deviceExtension->MaxTransferMode, ATA_UDMA2);
+ KdPrint2((PRINT_PREFIX "generic_cable80(%d, %#x, %d) = 0\n", channel,
pci_reg, bit_offs));
return FALSE;
}
+ KdPrint2((PRINT_PREFIX "generic_cable80(%d, %#x, %d) = 1\n", channel,
pci_reg, bit_offs));
return TRUE;
} // end generic_cable80()
@@ -1599,7 +1604,7 @@
AtapiChipInit(
IN PVOID HwDeviceExtension,
IN ULONG DeviceNumber,
- IN ULONG channel // physical channel
+ IN ULONG channel // logical channel
)
{
PHW_DEVICE_EXTENSION deviceExtension = (PHW_DEVICE_EXTENSION)HwDeviceExtension;
@@ -1628,10 +1633,12 @@
c = CHAN_NOT_SPECIFIED;
break;
default:
- c = channel - deviceExtension->Channel; // logical channel (for Compatible
Mode controllers)
- }
-
- KdPrint2((PRINT_PREFIX "AtapiChipInit: dev %#x, ph chan %d\n",
DeviceNumber, channel ));
+ //c = channel - deviceExtension->Channel; // logical channel (for Compatible
Mode controllers)
+ c = channel;
+ channel += deviceExtension->Channel;
+ }
+
+ KdPrint2((PRINT_PREFIX "AtapiChipInit: dev %#x, ph chan %d, c %d\n",
DeviceNumber, channel, c));
KdPrint2((PRINT_PREFIX "HwFlags: %#x\n", deviceExtension->HwFlags));
KdPrint2((PRINT_PREFIX "VendorID/DeviceID/Rev %#x/%#x/%#x\n", VendorID,
DeviceID, RevID));
@@ -2236,11 +2243,12 @@
UniataSataWritePort4(chan, IDX_SATA_SError, 0xffffffff, 0);
break;
}
-
+/*
// check 80-pin cable
if(!via_cable80(deviceExtension, channel)) {
chan->MaxTransferMode = min(deviceExtension->MaxTransferMode,
ATA_UDMA2);
}
+*/
}
break;
Modified: trunk/reactos/drivers/storage/ide/uniata/id_sata.cpp
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/ide/uniata…
==============================================================================
--- trunk/reactos/drivers/storage/ide/uniata/id_sata.cpp [iso-8859-1] (original)
+++ trunk/reactos/drivers/storage/ide/uniata/id_sata.cpp [iso-8859-1] Mon Aug 13 16:25:08
2012
@@ -68,7 +68,14 @@
if(SStatus.SPD == SStatus_SPD_Gen1 ||
SStatus.SPD == SStatus_SPD_Gen2 ||
SStatus.SPD == SStatus_SPD_Gen3) {
+ // SATA sets actual transfer rate in LunExt on init.
+ // There is no run-time SATA rate adjustment yet.
+ // On the other hand, we may turn SATA device in PIO mode
+ // TODO: make separate states for interface speed and transfer mode (DMA vs
PIO)
+ chan->lun[0]->LimitedTransferMode =
+ chan->lun[0]->PhyTransferMode =
chan->lun[0]->TransferMode = ATA_SA150 + (UCHAR)(SStatus.SPD - 1);
+
KdPrint2((PRINT_PREFIX "SATA TransferMode %#x\n",
chan->lun[0]->TransferMode));
if(chan->MaxTransferMode < chan->lun[0]->TransferMode) {
KdPrint2((PRINT_PREFIX "SATA upd chan TransferMode\n"));
Modified: trunk/reactos/drivers/storage/ide/uniata/uata_ctl.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/ide/uniata…
==============================================================================
--- trunk/reactos/drivers/storage/ide/uniata/uata_ctl.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/storage/ide/uniata/uata_ctl.h [iso-8859-1] Mon Aug 13 16:25:08
2012
@@ -85,7 +85,7 @@
ULONG MaxMode;
ULONG OrigMode;
ULONG CurrentMode;
- ULONG Reserved;
+ ULONG PhyMode; // since v0.42i6
} GETTRANSFERMODE, *PGETTRANSFERMODE;
typedef struct _GETDRVVERSION {
@@ -100,14 +100,13 @@
typedef struct _CHANINFO {
ULONG MaxTransferMode; // may differ from Controller's value due to
40-pin cable
ULONG ChannelCtrlFlags;
-//#ifdef QUEUE_STATISTICS
LONGLONG QueueStat[MAX_QUEUE_STAT];
LONGLONG ReorderCount;
LONGLONG IntersectCount;
LONGLONG TryReorderCount;
LONGLONG TryReorderHeadCount;
LONGLONG TryReorderTailCount; /* in-order requests */
-//#endif //QUEUE_STATISTICS
+// ULONG opt_MaxTransferMode; // user-specified
} CHANINFO, *PCHANINFO;
typedef struct _ADAPTERINFO {
@@ -143,13 +142,15 @@
ULONG NumberChannels;
BOOLEAN ChanInfoValid;
- UCHAR NumberLuns;
+ UCHAR NumberLuns; // per channel
BOOLEAN LunInfoValid;
- CHAR Reserved;
+ BOOLEAN ChanHeaderLengthValid; // since v0.42i8
ULONG AdapterInterfaceType;
-
- CHANINFO Chan[AHCI_MAX_PORT];
+ ULONG ChanHeaderLength;
+ ULONG LunHeaderLength;
+
+ //CHANINFO Chan[0];
} ADAPTERINFO, *PADAPTERINFO;
@@ -216,7 +217,9 @@
#endif //ATA_FLAGS_DRDY_REQUIRED
-#pragma pack(1)
+#pragma pack(pop)
+
+#pragma pack(push, 1)
typedef struct _IDEREGS_EX {
UCHAR bFeaturesReg; // Used for specifying SMART
"commands".
UCHAR bSectorCountReg; // IDE sector count register
@@ -263,11 +266,15 @@
ULONG ItemCount;
UNIATA_REG_IO r[1];
} UNIATA_REG_IO_HDR, *PUNIATA_REG_IO_HDR;
-#pragma pack()
+
+#pragma pack(pop)
+
+#pragma pack(push, 1)
typedef struct _UNIATA_CTL {
SRB_IO_CONTROL hdr;
SCSI_ADDRESS addr;
+ ULONG Reserved;
union {
UCHAR RawData[1];
ADDREMOVEDEV FindDelDev;