346{
350 ULONG VendorID = deviceExtension->
DevID & 0xffff;
366
369
371
375 }
376
377
378 BaseIoAddressBM = pciData->u.type0.BaseAddresses[4] & ~0x07;
380 ConfigInfo->MaximumTransferLength =
DEV_BSIZE*256;
382
385
389 } else {
390unknown_dev:
393
398 }
400 }
404
407 }
410 }
412 }
413
425
430
432
433
439
443
444
445
446
453 };
454
472
482 };
483
490 };
491
493
494 switch(VendorID) {
495
497
498
499
500
506 }
507 goto for_ugly_chips;
508
511
518 break;
519 }
521
522
526
527
528
532 }
538 }
539 goto for_ugly_chips;
540
541 default:
542
543
544 break;
545
546#if 0
548
550
551 switch(deviceExtension->
DevID) {
552
553
554 case 0xc6931080:
556 break;
557
558 case 0x000116ca:
560 break;
561
562
563
564
565 case 0x01021078:
567 break;
568
569 case 0x06401039:
570 case 0x06011039:
572
573
574
575 case 0x10001042:
576 case 0x10011042:
577
581
585 break;
586
587 case 0x81721283:
590 break;
591
592 default:
594 }
596#endif
597 }
598
600for_ugly_chips:
603 goto unknown_dev;
604
605 }
608
610
613 deviceExtension->
HwFlags = tmp32;
614
617 deviceExtension->
HwFlags |= tmp32;
618
623 }
624
627 if(tmp32 != 0xffffffff) {
630 }
631
635 }
636
637
638
639
640
643
644
646
647
648
649
650 switch(VendorID) {
656 ChipFlags &= ~UNIATA_AHCI;
657 deviceExtension->
HwFlags &= ~UNIATA_AHCI;
658 }
659 break;
660 default:
661#ifdef __REACTOS__
662
663
664
665
666#else
669 ChipFlags &= ~UNIATA_AHCI;
670 deviceExtension->
HwFlags &= ~UNIATA_AHCI;
671 }
672#endif
673 break;
674 }
675 }
676
678
683 }
684
685 } else
688 }
689
692 }
693
694 switch(VendorID) {
698 BaseIoAddress1 =
AtapiGetIoRange(HwDeviceExtension, ConfigInfo, pciData, SystemIoBusNumber,
699 0, 0, 0x10);
700 BaseIoAddress2 =
AtapiGetIoRange(HwDeviceExtension, ConfigInfo, pciData, SystemIoBusNumber,
701 1, 0, 0x10);
702 BaseIoAddressBM =
AtapiGetIoRange(HwDeviceExtension, ConfigInfo, pciData, SystemIoBusNumber,
705
707 chan = &deviceExtension->
chan[
c];
708
711 }
714
717 }
718
719
720
721
722
723
724
726 }
727 }
728 break;
732 BaseMemAddress =
AtapiGetIoRange(HwDeviceExtension, ConfigInfo, pciData, SystemIoBusNumber,
733 5, 0, ((ChipFlags &
NV4OFF) ? 0x400 : 0) + 0x40*2);
735 if(!BaseMemAddress) {
737 }
738 if((*ConfigInfo->AccessRanges)[5].RangeInMemory) {
741 }
744 chan = &deviceExtension->
chan[
c];
745
749
751 }
752 }
753 break;
755
756 if(ChipType !=
PRMIO) {
757 break;
758 }
759 if(!pciData) {
760 break;
761 }
763
764
765 BaseMemAddress =
AtapiGetIoRange(HwDeviceExtension, ConfigInfo, pciData, SystemIoBusNumber,
766 4, 0, 0x4000);
768 if(!BaseMemAddress) {
770 }
771 if((*ConfigInfo->AccessRanges)[4].RangeInMemory) {
774 }
776
777
778 BaseMemAddress =
AtapiGetIoRange(HwDeviceExtension, ConfigInfo, pciData, SystemIoBusNumber,
779 3, 0, 0xd0000);
781 if(!BaseMemAddress) {
783 }
784 if((*ConfigInfo->AccessRanges)[3].RangeInMemory) {
787 }
789
792
795 ((reg48 & 0x02) ? 1 : 0) +
796 2;
798 }
799
801
802
804
805 chan = &deviceExtension->
chan[
c];
806
809
812 }
814
816
820
821 if((ChipFlags &
PRSATA) ||
822 ((ChipFlags &
PRCMBO) &&
c<2)) {
824
828
830 } else {
833 }
834 }
835 break;
836
843 chan = &deviceExtension->
chan[0];
845 }
846 break;
847 }
848
850
852 }
854 break;
855 }
856 if(!pciData) {
857 break;
858 }
859
862 } else {
864 }
865
867
868 BaseMemAddress =
AtapiGetIoRange(HwDeviceExtension, ConfigInfo, pciData, SystemIoBusNumber,
869 5, 0, 0x800);
871 if(!BaseMemAddress) {
873 }
874 if((*ConfigInfo->AccessRanges)[5].RangeInMemory) {
877 }
879
883
884 chan = &deviceExtension->
chan[
c];
885
889 }
892
898 }
899
901
903 } else
908
910 }
911 }
912 break; }
913
915
917 break;
918 }
919 if(!pciData) {
920 break;
921 }
922
924
926 BaseMemAddress =
AtapiGetIoRange(HwDeviceExtension, ConfigInfo, pciData, SystemIoBusNumber,
927 5, 0, 0x400);
929 if(!BaseMemAddress) {
931 }
932 if((*ConfigInfo->AccessRanges)[5].RangeInMemory) {
935 }
937
940
941 chan = &deviceExtension->
chan[
c];
944 }
947
951
955
957 }
958 break; }
959
961
963
966
967 break;
968 }
969
978
979
981 } else {
984
986 };
987
998
1002 if(SiSSouthAdapters[
i].nDeviceId == 0x1182 ||
1003 SiSSouthAdapters[
i].nDeviceId == 0x1183) {
1006 }
1007 }
1008 } else {
1009
1013 } else {
1014
1016 }
1017 }
1018 }
1019
1022
1025
1026 BaseMemAddress =
AtapiGetIoRange(HwDeviceExtension, ConfigInfo, pciData, SystemIoBusNumber,
1027 5, 0, 0x400);
1029 if(BaseMemAddress) {
1030 if((*ConfigInfo->AccessRanges)[5].RangeInMemory) {
1033 }
1035
1037 ULONG offs =
c << (SIS_182 ? 5 : 6);
1038
1039 chan = &deviceExtension->
chan[
c];
1043
1045 }
1046 }
1047 }
1048 }
1049
1050 break; }
1051
1053
1055
1056
1058 break;
1059 }
1061
1063 BaseMemAddress = 0;
1064
1066 case 0x3149:
1068 IoSize = 0x80;
1069 break;
1070 case 0x3249:
1072 IoSize = 0x40;
1073 break;
1074 }
1075 if(IoSize) {
1077 BaseMemAddress =
AtapiGetIoRange(HwDeviceExtension, ConfigInfo, pciData, SystemIoBusNumber,
1079 if(BaseMemAddress && (*ConfigInfo->AccessRanges)[5].RangeInMemory) {
1082 }
1084 }
1085 if(BaseMemAddress) {
1088
1089 ULONG BaseIoAddressBM_0;
1091
1093 BaseIoAddressBM_0 =
1094 AtapiGetIoRange(HwDeviceExtension, ConfigInfo, pciData, SystemIoBusNumber, 4, 0,
1098
1099 chan = &deviceExtension->
chan[
c];
1100
1102
1105 }
1108
1111 }
1112
1113 }
1114 }
1116 chan = &deviceExtension->
chan[
c];
1117 if((ChipFlags &
VIABAR) && (
c==2)) {
1118
1121 }
1122 break;
1123 }
1127
1129 }
1130
1131 }
1132 }
1133 break; }
1135
1137 break;
1138 }
1139
1140
1143
1145 BaseMemAddress =
AtapiGetIoRange(HwDeviceExtension, ConfigInfo, pciData, SystemIoBusNumber,
1146 0, 0, 0x0c00);
1147 if(!BaseMemAddress) {
1149 }
1150 if((*ConfigInfo->AccessRanges)[0].RangeInMemory) {
1153 }
1156
1158 ULONG offs = 0x200 +
c*0x200;
1159
1160 chan = &deviceExtension->
chan[
c];
1163 }
1164
1166
1170
1172
1176
1180
1182 }
1183
1184 break;
1185 }
1187
1189
1192
1196 if(tmp8 & 0xc0) {
1197
1198
1201 break;
1202 }
1204 deviceExtension->
HwFlags &= ~UNIATA_AHCI;
1205 }
1206 BaseIoAddressBM =
AtapiGetIoRange(HwDeviceExtension, ConfigInfo, pciData, SystemIoBusNumber,
1208 if(BaseIoAddressBM) {
1210
1211 if((*ConfigInfo->AccessRanges)[4].RangeInMemory) {
1214 }
1216
1219
1222
1223 if(tmp8 == 0xff) {
1225 break;
1226 }
1227 }
1233 }
1234 }
1235 deviceExtension->
HwFlags &= ~UNIATA_AHCI;
1236
1238
1239 if(OrigAHCI) {
1240
1242 BaseMemAddress = 0;
1243 } else
1244 if(deviceExtension->
DevID == 0x28288086 &&
1245 pciData->u.type0.SubVendorID == 0x106b) {
1246
1248 BaseMemAddress = 0;
1249 } else {
1250 BaseMemAddress =
AtapiGetIoRange(HwDeviceExtension, ConfigInfo, pciData, SystemIoBusNumber,
1251 5, 0, 0x10);
1252 if(BaseMemAddress && (*ConfigInfo->AccessRanges)[5].RangeInMemory) {
1255 }
1256 }
1258
1260 chan = &deviceExtension->
chan[
c];
1263 if(ChipFlags &
ICH5) {
1265 if ((tmp8 & 0x04) == 0) {
1267 } else if ((tmp8 & 0x02) == 0) {
1270
1271 }
1272 } else if ((tmp8 & 0x02) != 0) {
1275
1276 }
1277 }
1278 } else
1279 if(ChipFlags &
I6CH2) {
1282 } else {
1284 switch(tmp8 & 0x03) {
1285 case 2:
1287
1289 }
1290 break;
1291 case 1:
1293
1295 }
1296 break;
1297 }
1298 }
1299
1300 if(IsPata) {
1303 } else {
1304
1305 if(!(ChipFlags &
ICH7) && BaseMemAddress) {
1309 }
1310 if((ChipFlags &
ICH5) || BaseMemAddress) {
1311
1313
1315 deviceExtension->
HwFlags &= ~CHIPTYPE_MASK;
1316 deviceExtension->
HwFlags |= ChipType;
1317
1318 if(ChipFlags &
ICH7) {
1320 }
1324 }
1325 }
1326
1327 }
1328
1329
1330
1331 }
1332 break; }
1334
1335 if(deviceExtension->
DevID == 0x01021078) {
1336 ConfigInfo->AlignmentMask = 0x0f;
1338 }
1339 break;
1341
1343 if(tmp8 & 0x40) {
1344 KdPrint((
" Check JMicron AHCI\n"));
1348 } else {
1349 KdPrint((
" JMicron PATA/SATA\n"));
1350 }
1351 } else {
1352#if 0
1353
1356#endif
1357
1358 KdPrint((
" JMicron Combined\n"));
1359
1360 }
1361 break;
1362 }
1363
1365
1366}
BUSMASTER_CONTROLLER_INFORMATION_BASE const BusMasterAdapters[]
#define UNIATA_SIMPLEX_ONLY
#define NUM_BUSMASTER_ADAPTERS
struct _BUSMASTER_CONTROLLER_INFORMATION_BASE * PBUSMASTER_CONTROLLER_INFORMATION_BASE
__inline ULONG Ata_is_dev_listed(IN PBUSMASTER_CONTROLLER_INFORMATION_BASE BusMasterAdapters, ULONG VendorId, ULONG DeviceId, ULONG RevId, ULONG lim)
#define PCI_DEV_HW_SPEC_BM(idhi, idlo, rev, mode, name, flags)
#define Ata_is_ahci_dev(pciData)
#define BMLIST_TERMINATOR
VOID NTAPI ScsiPortFreeDeviceBase(IN PVOID HwDeviceExtension, IN PVOID MappedAddress)
#define SetPciConfig4(offs, op)
ULONG NTAPI AtapiFindListedDev(PBUSMASTER_CONTROLLER_INFORMATION_BASE BusMasterAdapters, ULONG lim, IN PVOID HwDeviceExtension, IN ULONG BusNumber, IN ULONG SlotNumber, OUT PCI_SLOT_NUMBER *_slotData)
#define IDX_SATA_SControl
ULONGIO_PTR NTAPI AtapiGetIoRange(IN PVOID HwDeviceExtension, IN PPORT_CONFIGURATION_INFORMATION ConfigInfo, IN PPCI_COMMON_CONFIG pciData, IN ULONG SystemIoBusNumber, IN ULONG rid, IN ULONG offset, IN ULONG length)
#define PCI_DEV_SUBCLASS_IDE
#define PCISLOTNUM_NOT_SPECIFIED
#define ScsiPortConvertPhysicalAddressToUlong(Address)
BOOLEAN NTAPI UniataAllocateLunExt(PHW_DEVICE_EXTENSION deviceExtension, ULONG NewNumberChannels)
VOID UniataInitIoRes(IN PHW_CHANNEL chan, IN ULONG idx, IN ULONG addr, IN BOOLEAN MemIo, IN BOOLEAN Proc)
VOID NTAPI AtapiSetupLunPtrs(IN PHW_CHANNEL chan, IN PHW_DEVICE_EXTENSION deviceExtension, IN ULONG c)
BOOLEAN NTAPI UniataChipDetectChannels(IN PVOID HwDeviceExtension, IN PPCI_COMMON_CONFIG pciData, IN ULONG DeviceNumber, IN PPORT_CONFIGURATION_INFORMATION ConfigInfo)
VOID UniataInitIoResEx(IN PIORES IoRes, IN ULONG addr, IN BOOLEAN MemIo, IN BOOLEAN Proc)
VOID NTAPI UniataInitSyncBaseIO(IN PHW_CHANNEL chan)
BOOLEAN NTAPI UniataAhciDetect(IN PVOID HwDeviceExtension, IN PPCI_COMMON_CONFIG pciData, IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo)
ULONG MaximumDmaTransferLength
ULONG DmaSegmentAlignmentMask
#define STATUS_UNSUCCESSFUL
#define ATA_MODE_NOT_SPEC
#define IDX_IO2_AltStatus
#define IDX_IO1_o_Feature
#define IDX_IO1_o_Command
#define IDX_IO2_o_Control