- // Device detection
- int driveid;
- for(driveid=0; driveid<CONFIG_MAX_ATA_DEVICES; driveid++) {
- u8 channel = driveid / 2;
- u8 slave = driveid % 2;
-
- u16 iobase1 = GET_EBDA(ata.channels[channel].iobase1);
- u16 iobase2 = GET_EBDA(ata.channels[channel].iobase2);
-
- // Disable interrupts
- outb(ATA_CB_DC_HD15 | ATA_CB_DC_NIEN, iobase2+ATA_CB_DC);
-
- // Look for device
- outb(slave ? ATA_CB_DH_DEV1 : ATA_CB_DH_DEV0, iobase1+ATA_CB_DH);
- msleep(50);
- outb(0x55, iobase1+ATA_CB_SC);
- outb(0xaa, iobase1+ATA_CB_SN);
- outb(0xaa, iobase1+ATA_CB_SC);
- outb(0x55, iobase1+ATA_CB_SN);
- outb(0x55, iobase1+ATA_CB_SC);
- outb(0xaa, iobase1+ATA_CB_SN);
-
- // If we found something
- u8 sc = inb(iobase1+ATA_CB_SC);
- u8 sn = inb(iobase1+ATA_CB_SN);
- dprintf(6, "ata_detect(1) drive=%d sc=%x sn=%x\n", driveid, sc, sn);
-
- if (sc != 0x55 || sn != 0xaa)
- continue;
-
- // reset the channel
- ata_reset(driveid);
-
- // check for ATA or ATAPI
- outb(slave ? ATA_CB_DH_DEV1 : ATA_CB_DH_DEV0, iobase1+ATA_CB_DH);
- msleep(50);
- sc = inb(iobase1+ATA_CB_SC);
- sn = inb(iobase1+ATA_CB_SN);
- dprintf(6, "ata_detect(2) drive=%d sc=%x sn=%x\n", driveid, sc, sn);
- if (sc!=0x01 || sn!=0x01) {
- init_drive_unknown(driveid);
- continue;
+ pci->have_driver = 1;
+ u16 bdf = pci->bdf;
+ u8 pciirq = pci_config_readb(bdf, PCI_INTERRUPT_LINE);
+ int master = 0;
+ if (CONFIG_ATA_DMA && prog_if & 0x80) {
+ // Check for bus-mastering.
+ u32 bar = pci_config_readl(bdf, PCI_BASE_ADDRESS_4);
+ if (bar & PCI_BASE_ADDRESS_SPACE_IO) {
+ master = bar & PCI_BASE_ADDRESS_IO_MASK;
+ pci_config_maskw(bdf, PCI_COMMAND, 0, PCI_COMMAND_MASTER);