* Sync to 0.44b4.
CORE-6563

svn path=/trunk/; revision=57525
This commit is contained in:
Amine Khaldi 2012-10-09 21:02:00 +00:00
parent 6dacc020db
commit a0d3578e63
8 changed files with 146 additions and 25 deletions

View file

@ -623,6 +623,9 @@ typedef struct _IDE_AHCI_PORT_REGISTERS {
#define IDX_AHCI_P_TFD (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, TFD)) #define IDX_AHCI_P_TFD (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, TFD))
#define IDX_AHCI_P_SIG (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, SIG)) #define IDX_AHCI_P_SIG (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, SIG))
#define IDX_AHCI_P_CMD (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, CMD)) #define IDX_AHCI_P_CMD (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, CMD))
#define IDX_AHCI_P_SStatus (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, SStatus))
#define IDX_AHCI_P_SControl (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, SControl))
#define IDX_AHCI_P_SError (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, SError))
#define IDX_AHCI_P_ACT (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, SACT)) #define IDX_AHCI_P_ACT (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, SACT))
#define IDX_AHCI_P_SNTF (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, SNTF)) #define IDX_AHCI_P_SNTF (FIELD_OFFSET(IDE_AHCI_PORT_REGISTERS, SNTF))

View file

@ -6976,11 +6976,16 @@ GetLba2:
} }
// check if DMA read/write // check if DMA read/write
if(deviceExtension->HwFlags & UNIATA_SATA) { if(deviceExtension->HwFlags & UNIATA_AHCI) {
KdPrint2((PRINT_PREFIX "AtapiSendCommand: force use dma (ahci)\n")); KdPrint2((PRINT_PREFIX "AtapiSendCommand: force use dma (ahci)\n"));
use_dma = TRUE; use_dma = TRUE;
goto setup_dma; goto setup_dma;
} else } else
/* if((deviceExtension->HwFlags & UNIATA_SATA) && (LunExt->OrigTransferMode >= ATA_DMA)) {
KdPrint2((PRINT_PREFIX "AtapiSendCommand: force use dma (sata)\n"));
use_dma = TRUE;
goto setup_dma;
} else*/
if(Srb->Cdb[0] == SCSIOP_REQUEST_SENSE) { if(Srb->Cdb[0] == SCSIOP_REQUEST_SENSE) {
KdPrint2((PRINT_PREFIX "AtapiSendCommand: SCSIOP_REQUEST_SENSE, no DMA setup\n")); KdPrint2((PRINT_PREFIX "AtapiSendCommand: SCSIOP_REQUEST_SENSE, no DMA setup\n"));
} else } else
@ -7434,6 +7439,28 @@ make_reset:
LunExt->IdentifyData.AtapiCmdSize ? 8 : 6, LunExt->IdentifyData.AtapiCmdSize ? 8 : 6,
0); 0);
GetStatus(chan, statusByte);
KdPrint3((PRINT_PREFIX "AtapiSendCommand: cmd status (%#x)\n", statusByte));
if(statusByte & IDE_STATUS_ERROR) {
GetBaseStatus(chan, statusByte);
KdPrint3((PRINT_PREFIX "AtapiSendCommand: Error on cmd: (%#x)\n", statusByte));
// Read the error reg. to clear it and fail this request.
AtaReq->ReqState = REQ_STATE_TRANSFER_COMPLETE;
return MapError(deviceExtension, Srb);
}
/* if(statusByte & IDE_STATUS_DSC) {
KdPrint3((PRINT_PREFIX "AtapiSendCommand: DSC on cmd: (%#x)\n", statusByte));
// Read the error reg. to clear it and fail this request.
statusByte = AtapiReadPort1(chan, IDX_IO1_i_Error);
KdPrint3((PRINT_PREFIX "AtapiSendCommand: Err on cmd: (%#x)\n", statusByte));
if(statusByte >> 4) {
GetBaseStatus(chan, statusByte);
AtaReq->ReqState = REQ_STATE_TRANSFER_COMPLETE;
return MapError(deviceExtension, Srb);
}
}
*/
if(chan->ChannelCtrlFlags & CTRFLAGS_DMA_OPERATION) { if(chan->ChannelCtrlFlags & CTRFLAGS_DMA_OPERATION) {
AtapiDmaStart(HwDeviceExtension, DeviceNumber, lChannel, Srb); AtapiDmaStart(HwDeviceExtension, DeviceNumber, lChannel, Srb);
} }
@ -7642,7 +7669,7 @@ default_no_prep:
// Fill in vendor identification fields. // Fill in vendor identification fields.
for (i = 0; i < 24; i += 2) { for (i = 0; i < 24; i += 2) {
MOV_DW_SWP(inquiryData->VendorId[i], ((PUCHAR)identifyData->ModelNumber)[i]); MOV_DW_SWP(inquiryData->DeviceIdentificationString[i], ((PUCHAR)identifyData->ModelNumber)[i]);
} }
/* /*
// Initialize unused portion of product id. // Initialize unused portion of product id.
@ -10732,6 +10759,8 @@ HalDisplayString (
PUCHAR String PUCHAR String
); );
#define DEBUG_MSG_BUFFER_SIZE 512
extern "C" extern "C"
VOID VOID
_cdecl _cdecl
@ -10741,18 +10770,24 @@ _PrintNtConsole(
) )
{ {
int len; int len;
UCHAR dbg_print_tmp_buff[512]; UCHAR dbg_print_tmp_buff[DEBUG_MSG_BUFFER_SIZE];
// UNICODE_STRING msgBuff; // UNICODE_STRING msgBuff;
va_list ap; va_list ap;
va_start(ap, DebugMessage); va_start(ap, DebugMessage);
len = _vsnprintf((PCHAR)&dbg_print_tmp_buff[0], 511, DebugMessage, ap); len = _vsnprintf((PCHAR)&dbg_print_tmp_buff[0], DEBUG_MSG_BUFFER_SIZE-1, DebugMessage, ap);
dbg_print_tmp_buff[511] = 0; dbg_print_tmp_buff[DEBUG_MSG_BUFFER_SIZE-1] = 0;
KdPrint(((PCHAR)&(dbg_print_tmp_buff[0]))); //DbgPrint(((PCHAR)&(dbg_print_tmp_buff[0]))); // already done in KdPrint macro
HalDisplayString(dbg_print_tmp_buff); HalDisplayString(dbg_print_tmp_buff);
#ifdef _DEBUG
if(g_LogToDisplay > 1) {
AtapiStallExecution(g_LogToDisplay*1000);
}
#endif // _DEBUG
va_end(ap); va_end(ap);
} // end PrintNtConsole() } // end PrintNtConsole()

View file

@ -1012,7 +1012,7 @@ AtapiDmaInit(
/****************/ /****************/
KdPrint2((PRINT_PREFIX "SATA Generic\n")); KdPrint2((PRINT_PREFIX "SATA Generic\n"));
if((udmamode >= 5) || (ChipFlags & UNIATA_AHCI) || (chan->MaxTransferMode >= ATA_SA150)) { if((udmamode >= 5) || (ChipFlags & UNIATA_AHCI) || ((udmamode >= 0) && (chan->MaxTransferMode >= ATA_SA150))) {
/* some drives report UDMA6, some UDMA5 */ /* some drives report UDMA6, some UDMA5 */
/* ATAPI may not have SataCapabilities set in IDENTIFY DATA */ /* ATAPI may not have SataCapabilities set in IDENTIFY DATA */
if(ata_is_sata(&(LunExt->IdentifyData))) { if(ata_is_sata(&(LunExt->IdentifyData))) {

View file

@ -1085,7 +1085,7 @@ for_ugly_chips:
KdPrint2((PRINT_PREFIX "PATA part\n")); KdPrint2((PRINT_PREFIX "PATA part\n"));
} else { } else {
if(/*(ChipFlags & ICH5) &&*/ BaseMemAddress) { if(!(ChipFlags & ICH7) && BaseMemAddress) {
KdPrint2((PRINT_PREFIX "BaseMemAddress[5] -> indexed\n")); KdPrint2((PRINT_PREFIX "BaseMemAddress[5] -> indexed\n"));
chan->RegTranslation[IDX_INDEXED_ADDR].Addr = BaseMemAddress + 0; chan->RegTranslation[IDX_INDEXED_ADDR].Addr = BaseMemAddress + 0;
chan->RegTranslation[IDX_INDEXED_ADDR].MemIo = MemIo; chan->RegTranslation[IDX_INDEXED_ADDR].MemIo = MemIo;
@ -1094,17 +1094,20 @@ for_ugly_chips:
} }
if((ChipFlags & ICH5) || BaseMemAddress) { if((ChipFlags & ICH5) || BaseMemAddress) {
KdPrint2((PRINT_PREFIX "io indexed\n")); KdPrint2((PRINT_PREFIX "io proc()\n"));
// Rather interesting way of register access... // Rather interesting way of register access...
ChipType = INTEL_IDX; ChipType = INTEL_IDX;
deviceExtension->HwFlags &= ~CHIPTYPE_MASK; deviceExtension->HwFlags &= ~CHIPTYPE_MASK;
deviceExtension->HwFlags |= ChipType; deviceExtension->HwFlags |= ChipType;
chan->RegTranslation[IDX_SATA_SStatus].Addr = 0x200*c + 0; if(ChipFlags & ICH7) {
KdPrint2((PRINT_PREFIX "ICH7 way\n"));
}
chan->RegTranslation[IDX_SATA_SStatus].Addr = 0x200*c + 0; // this is fake non-zero value
chan->RegTranslation[IDX_SATA_SStatus].Proc = 1; chan->RegTranslation[IDX_SATA_SStatus].Proc = 1;
chan->RegTranslation[IDX_SATA_SError].Addr = 0x200*c + 2; chan->RegTranslation[IDX_SATA_SError].Addr = 0x200*c + 2; // this is fake non-zero value
chan->RegTranslation[IDX_SATA_SError].Proc = 1; chan->RegTranslation[IDX_SATA_SError].Proc = 1;
chan->RegTranslation[IDX_SATA_SControl].Addr = 0x200*c + 1; chan->RegTranslation[IDX_SATA_SControl].Addr = 0x200*c + 1; // this is fake non-zero value
chan->RegTranslation[IDX_SATA_SControl].Proc = 1; chan->RegTranslation[IDX_SATA_SControl].Proc = 1;
} }
} }
@ -1835,7 +1838,7 @@ AtapiChipInit(
ChangePciConfig4(0x94, (a | (1 << 9))); ChangePciConfig4(0x94, (a | (1 << 9)));
/* Set Ports Implemented register bits. */ /* Set Ports Implemented register bits. */
AtapiWritePortEx4(NULL, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressSATA_0), 0x0c, AtapiWritePortEx4(NULL, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressSATA_0), 0x0c,
AtapiReadPortEx4(NULL, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressSATA_0), 0x0c) | 0xff); AtapiReadPortEx4(NULL, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressSATA_0), 0x0c) | 0x0f);
} }
/* enable PCI interrupt */ /* enable PCI interrupt */
ChangePciConfig2(offsetof(PCI_COMMON_CONFIG, Command), (a & ~0x0400)); ChangePciConfig2(offsetof(PCI_COMMON_CONFIG, Command), (a & ~0x0400));
@ -1883,24 +1886,29 @@ AtapiChipInit(
KdPrint2((PRINT_PREFIX "other Intel\n")); KdPrint2((PRINT_PREFIX "other Intel\n"));
switch(tmp8 & 0x03) { switch(tmp8 & 0x03) {
case 0: case 0:
KdPrint2((PRINT_PREFIX "0 -> %d/%d\n", 0+c, 2+c));
chan->lun[0]->SATA_lun_map = 0+c; chan->lun[0]->SATA_lun_map = 0+c;
chan->lun[1]->SATA_lun_map = 2+c; chan->lun[1]->SATA_lun_map = 2+c;
break; break;
case 2: case 2:
if(c==0) { if(c==0) {
KdPrint2((PRINT_PREFIX "2 -> %d/%d\n", 0, 2));
chan->lun[0]->SATA_lun_map = 0; chan->lun[0]->SATA_lun_map = 0;
chan->lun[1]->SATA_lun_map = 2; chan->lun[1]->SATA_lun_map = 2;
} else { } else {
// PATA // PATA
KdPrint2((PRINT_PREFIX "PATA\n"));
IsPata = TRUE; IsPata = TRUE;
} }
break; break;
case 1: case 1:
if(c==1) { if(c==1) {
KdPrint2((PRINT_PREFIX "2 -> %d/%d\n", 1, 3));
chan->lun[0]->SATA_lun_map = 1; chan->lun[0]->SATA_lun_map = 1;
chan->lun[1]->SATA_lun_map = 3; chan->lun[1]->SATA_lun_map = 3;
} else { } else {
// PATA // PATA
KdPrint2((PRINT_PREFIX "PATA\n"));
IsPata = TRUE; IsPata = TRUE;
} }
break; break;

View file

@ -93,11 +93,15 @@ UniataEnableIoPCI(
{ {
ULONG i; ULONG i;
ULONG busDataRead; ULONG busDataRead;
USHORT CmdOrig;
// Enable Busmastering, IO-space and Mem-space // Enable Busmastering, IO-space and Mem-space
// Note: write to CONFIG *may* cause controller to interrupt (not handled yet)
// even if no bits are updated. Was observed on ICH7
KdPrint2((PRINT_PREFIX "Enabling Mem/Io spaces and busmastering...\n")); KdPrint2((PRINT_PREFIX "Enabling Mem/Io spaces and busmastering...\n"));
KdPrint2((PRINT_PREFIX "Initial pciData.Command = %#x\n", pciData->Command)); KdPrint2((PRINT_PREFIX "Initial pciData.Command = %#x\n", pciData->Command));
for(i=0; i<3; i++) { for(i=0; i<3; i++) {
CmdOrig = pciData->Command;
switch(i) { switch(i) {
case 0: case 0:
KdPrint2((PRINT_PREFIX "PCI_ENABLE_IO_SPACE\n")); KdPrint2((PRINT_PREFIX "PCI_ENABLE_IO_SPACE\n"));
@ -112,17 +116,20 @@ UniataEnableIoPCI(
pciData->Command |= PCI_ENABLE_BUS_MASTER; pciData->Command |= PCI_ENABLE_BUS_MASTER;
break; break;
} }
if(CmdOrig == pciData->Command) {
continue;
}
HalSetBusDataByOffset( PCIConfiguration, busNumber, slotNumber, HalSetBusDataByOffset( PCIConfiguration, busNumber, slotNumber,
&(pciData->Command), &(pciData->Command),
offsetof(PCI_COMMON_CONFIG, Command), offsetof(PCI_COMMON_CONFIG, Command),
sizeof(pciData->Command)); sizeof(pciData->Command));
KdPrint2((PRINT_PREFIX "InterruptLine = %#x\n", pciData->u.type0.InterruptLine));
// reread config space // reread config space
busDataRead = HalGetBusData(PCIConfiguration, busNumber, slotNumber, busDataRead = HalGetBusData(PCIConfiguration, busNumber, slotNumber,
pciData, PCI_COMMON_HDR_LENGTH); pciData, PCI_COMMON_HDR_LENGTH);
KdPrint2((PRINT_PREFIX "New pciData.Command = %#x\n", pciData->Command)); KdPrint2((PRINT_PREFIX "New pciData.Command = %#x\n", pciData->Command));
} }
KdPrint2((PRINT_PREFIX "InterruptLine = %#x\n", pciData->u.type0.InterruptLine));
KdPrint2((PRINT_PREFIX "Final pciData.Command = %#x\n", pciData->Command)); KdPrint2((PRINT_PREFIX "Final pciData.Command = %#x\n", pciData->Command));
return pciData->Command; return pciData->Command;
} // end UniataEnableIoPCI() } // end UniataEnableIoPCI()
@ -1635,7 +1642,7 @@ UniataFindBusMasterController(
AtapiStallExecution(10); AtapiStallExecution(10);
GetBaseStatus(chan, statusByte); GetBaseStatus(chan, statusByte);
skip_find_dev = FALSE; skip_find_dev = FALSE;
if(!(deviceExtension->HwFlags & UNIATA_NO_SLAVE)) { if(!(deviceExtension->HwFlags & UNIATA_NO_SLAVE) && (deviceExtension->NumberLuns > 1)) {
if ((statusByte & 0xf8) == 0xf8 || if ((statusByte & 0xf8) == 0xf8 ||
(statusByte == 0xa5)) { (statusByte == 0xa5)) {
// Check slave. // Check slave.
@ -1668,6 +1675,32 @@ UniataFindBusMasterController(
} }
//#ifdef UNIATA_INIT_ON_PROBE //#ifdef UNIATA_INIT_ON_PROBE
// } // }
#else //UNIATA_INIT_ON_PROBE
KdPrint2((PRINT_PREFIX "clean IDE intr 0\n"));
SelectDrive(chan, 0);
AtapiStallExecution(10);
GetBaseStatus(chan, statusByte);
if(!(deviceExtension->HwFlags & UNIATA_NO_SLAVE) && (deviceExtension->NumberLuns > 1)) {
KdPrint2((PRINT_PREFIX "clean IDE intr 1\n"));
SelectDrive(chan, 1);
AtapiStallExecution(1);
GetBaseStatus(chan, statusByte);
SelectDrive(chan, 0);
}
statusByte = GetDmaStatus(deviceExtension, c);
KdPrint2((PRINT_PREFIX " DMA status %#x\n", statusByte));
if(statusByte & BM_STATUS_INTR) {
// bullshit, we have DMA interrupt, but had never initiate DMA operation
KdPrint2((PRINT_PREFIX " clear unexpected DMA intr\n"));
AtapiDmaDone(deviceExtension, 0, c, NULL);
GetBaseStatus(chan, statusByte);
}
#endif //UNIATA_INIT_ON_PROBE #endif //UNIATA_INIT_ON_PROBE
} }
found = TRUE; found = TRUE;

View file

@ -302,6 +302,24 @@ UniataSataReadPort4(
SetPciConfig4(0xa0, offs); SetPciConfig4(0xa0, offs);
GetPciConfig4(0xa4, offs); GetPciConfig4(0xa4, offs);
return offs; return offs;
} else
if(deviceExtension->HwFlags & ICH7) {
offs = 0x100+chan->lun[p]->SATA_lun_map*0x80;
KdPrint3((PRINT_PREFIX " ICH7 way, offs %#x\n", offs));
switch(io_port_ndx) {
case IDX_SATA_SStatus:
offs += IDX_AHCI_P_SStatus;
break;
case IDX_SATA_SError:
offs += IDX_AHCI_P_SError;
break;
case IDX_SATA_SControl:
offs += IDX_AHCI_P_SControl;
break;
default:
return -1;
}
return AtapiReadPortEx4(NULL, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressSATA_0), offs);
} else { } else {
offs = ((deviceExtension->Channel+chan->lChannel)*2+p) * 0x100; offs = ((deviceExtension->Channel+chan->lChannel)*2+p) * 0x100;
KdPrint3((PRINT_PREFIX " def way, offs %#x\n", offs)); KdPrint3((PRINT_PREFIX " def way, offs %#x\n", offs));
@ -372,6 +390,25 @@ UniataSataWritePort4(
SetPciConfig4(0xa0, offs); SetPciConfig4(0xa0, offs);
SetPciConfig4(0xa4, data); SetPciConfig4(0xa4, data);
return; return;
} else
if(deviceExtension->HwFlags & ICH7) {
offs = 0x100+chan->lun[p]->SATA_lun_map*0x80;
KdPrint3((PRINT_PREFIX " ICH7 way, offs %#x\n", offs));
switch(io_port_ndx) {
case IDX_SATA_SStatus:
offs += IDX_AHCI_P_SStatus;
break;
case IDX_SATA_SError:
offs += IDX_AHCI_P_SError;
break;
case IDX_SATA_SControl:
offs += IDX_AHCI_P_SControl;
break;
default:
return;
}
AtapiWritePortEx4(NULL, (ULONGIO_PTR)(&deviceExtension->BaseIoAddressSATA_0), offs, data);
return;
} else { } else {
offs = ((deviceExtension->Channel+chan->lChannel)*2+p) * 0x100; offs = ((deviceExtension->Channel+chan->lChannel)*2+p) * 0x100;
KdPrint3((PRINT_PREFIX " def way, offs %#x\n", offs)); KdPrint3((PRINT_PREFIX " def way, offs %#x\n", offs));

View file

@ -1100,9 +1100,14 @@ typedef struct _INQUIRYDATA {
UCHAR Wide16Bit : 1; UCHAR Wide16Bit : 1;
UCHAR Wide32Bit : 1; UCHAR Wide32Bit : 1;
UCHAR RelativeAddressing : 1; UCHAR RelativeAddressing : 1;
union {
UCHAR DeviceIdentificationString[28];
struct {
UCHAR VendorId[8]; UCHAR VendorId[8];
UCHAR ProductId[16]; UCHAR ProductId[16];
UCHAR ProductRevisionLevel[4]; UCHAR ProductRevisionLevel[4];
};
};
UCHAR VendorSpecific[20]; UCHAR VendorSpecific[20];
UCHAR Reserved3[40]; UCHAR Reserved3[40];
} INQUIRYDATA, *PINQUIRYDATA; } INQUIRYDATA, *PINQUIRYDATA;

View file

@ -1,10 +1,10 @@
#define UNIATA_VER_STR "43f5" #define UNIATA_VER_STR "44b1"
#define UNIATA_VER_DOT 0.43.6.5 #define UNIATA_VER_DOT 0.44.2.1
#define UNIATA_VER_MJ 0 #define UNIATA_VER_MJ 0
#define UNIATA_VER_MN 43 #define UNIATA_VER_MN 44
#define UNIATA_VER_SUB_MJ 6 #define UNIATA_VER_SUB_MJ 2
#define UNIATA_VER_SUB_MN 5 #define UNIATA_VER_SUB_MN 1
#define UNIATA_VER_DOT_COMMA 0,43,6,5 #define UNIATA_VER_DOT_COMMA 0,44,2,1
#define UNIATA_VER_DOT_STR "0.43.6.5" #define UNIATA_VER_DOT_STR "0.44.2.1"
#define UNIATA_VER_YEAR 2012 #define UNIATA_VER_YEAR 2012
#define UNIATA_VER_YEAR_STR "2012" #define UNIATA_VER_YEAR_STR "2012"