static int ata_via_new_setmode(device_t dev, int target, int mode) { device_t parent = device_get_parent(dev); struct ata_pci_controller *ctlr = device_get_softc(parent); struct ata_channel *ch = device_get_softc(dev); if ((ctlr->chip->cfg2 & VIABAR) && (ch->unit > 1)) { int piomode; static const uint8_t pio_timings[] = { 0xa8, 0x65, 0x65, 0x32, 0x20 }; static const uint8_t dma_timings[] = { 0xee, 0xe8, 0xe6, 0xe4, 0xe2, 0xe1, 0xe0 }; /* This chip can't do WDMA. */ if (mode >= ATA_WDMA0 && mode < ATA_UDMA0) mode = ATA_PIO4; if (mode >= ATA_UDMA0) { pci_write_config(parent, 0xb3, dma_timings[mode & ATA_MODE_MASK], 1); piomode = ATA_PIO4; } else piomode = mode; pci_write_config(parent, 0xab, pio_timings[ata_mode2idx(piomode)], 1); } else mode = ata_sata_setmode(dev, target, mode); return (mode); }
/* **************************************************************** * Inicializa o DMA para os Controladores SATA * **************************************************************** */ void ata_stub_sata_setmode (PCIDATA *pci, ATA_DEVICE *adp, int mode) { ata_sata_setmode (pci, adp, mode); } /* end ata_stub_sata_setmode */