+__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()
+