+BOOLEAN
+UniataChipDetectChannels(
+ IN PVOID HwDeviceExtension,
+ IN PPCI_COMMON_CONFIG pciData, // optional
+ IN ULONG DeviceNumber,
+ IN PPORT_CONFIGURATION_INFORMATION ConfigInfo
+ )
+{
+ PHW_DEVICE_EXTENSION deviceExtension = (PHW_DEVICE_EXTENSION)HwDeviceExtension;
+ ULONG slotNumber = deviceExtension->slotNumber;
+ ULONG SystemIoBusNumber = deviceExtension->SystemIoBusNumber;
+ ULONG VendorID = deviceExtension->DevID & 0xffff;
+ ULONG DeviceID = (deviceExtension->DevID >> 16) & 0xffff;
+ ULONG RevID = deviceExtension->RevID;
+ ULONG ChipType = deviceExtension->HwFlags & CHIPTYPE_MASK;
+ ULONG ChipFlags= deviceExtension->HwFlags & CHIPFLAG_MASK;
+
+ KdPrint2((PRINT_PREFIX "UniataChipDetectChannels:\n" ));
+ switch(VendorID) {
+ case ATA_ACER_LABS_ID:
+ switch(deviceExtension->DevID) {
+ case 0x528710b9:
+ case 0x528810b9:
+ deviceExtension->NumberChannels = 4;
+ KdPrint2((PRINT_PREFIX "Acer 4 chan\n"));
+ }
+ break;
+ case ATA_PROMISE_ID:
+
+ if(ChipType != PRMIO) {
+ break;
+ }
+ deviceExtension->NumberChannels = 4;
+ KdPrint2((PRINT_PREFIX "Promise 4 chan\n"));
+ break;
+ case ATA_MARVELL_ID:
+ KdPrint2((PRINT_PREFIX "Marvell\n"));
+ switch(deviceExtension->DevID) {
+ case 0x610111ab:
+ /* 88SX6101 only have 1 PATA channel */
+ if(BMList[deviceExtension->DevIndex].channel) {
+ KdPrint2((PRINT_PREFIX "88SX6101 has no 2nd PATA chan\n"));
+ return FALSE;
+ }
+ deviceExtension->NumberChannels = 1;
+ KdPrint2((PRINT_PREFIX "88SX6101 PATA 1 chan\n"));
+ break;
+ }
+ break;
+ case ATA_ATI_ID:
+ KdPrint2((PRINT_PREFIX "ATI\n"));
+ switch(deviceExtension->DevID) {
+ case 0x438c1002:
+ case 0x439c1002:
+ /* IXP600 & IXP700 only have 1 PATA channel */
+ if(BMList[deviceExtension->DevIndex].channel) {
+ KdPrint2((PRINT_PREFIX "New ATI no 2nd PATA chan\n"));
+ return FALSE;
+ }
+ deviceExtension->NumberChannels = 1;
+ KdPrint2((PRINT_PREFIX "New ATI PATA 1 chan\n"));
+ break;
+ }
+ case ATA_SILICON_IMAGE_ID:
+
+ if(ChipFlags & SIIBUG) {
+ }
+ if(ChipType != SIIMIO) {
+ break;
+ }
+ if(!pciData) {
+ break;
+ }
+
+ if(VendorID == ATA_SILICON_IMAGE_ID) {
+ KdPrint2((PRINT_PREFIX "New SII\n"));
+ } else {
+ KdPrint2((PRINT_PREFIX "ATI SATA\n"));
+ }
+ if(deviceExtension->HwFlags & SII4CH) {
+ deviceExtension->NumberChannels = 4;
+ KdPrint2((PRINT_PREFIX "4 chan\n"));
+ }
+ break;
+ case ATA_VIA_ID:
+ if((deviceExtension->DevID == 0x32491106) &&
+ ScsiPortConvertPhysicalAddressToUlong((*ConfigInfo->AccessRanges)[5].RangeStart)) {
+ deviceExtension->NumberChannels = 3;
+ KdPrint2((PRINT_PREFIX "VIA 3 chan\n"));
+ }
+ break;
+ } // end switch(VendorID)
+ return TRUE;
+
+} // end UniataChipDetectChannels()
+