Lines Matching +full:udma +full:- +full:c
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 1998 - 2008 Søren Schmidt <sos@FreeBSD.org>
48 #include <dev/ata/ata-all.h>
49 #include <dev/ata/ata-pci.h>
92 if (!(ctlr->chip = ata_match_chip(dev, ids))) in ata_ali_probe()
96 ctlr->chipinit = ata_ali_chipinit; in ata_ali_probe()
97 ctlr->chipdeinit = ata_ali_chipdeinit; in ata_ali_probe()
111 switch (ctlr->chip->cfg2) { in ata_ali_chipinit()
113 ctlr->channels = ctlr->chip->cfg1; in ata_ali_chipinit()
114 ctlr->ch_attach = ata_ali_sata_ch_attach; in ata_ali_chipinit()
115 ctlr->ch_detach = ata_pci_ch_detach; in ata_ali_chipinit()
116 ctlr->setmode = ata_sata_setmode; in ata_ali_chipinit()
117 ctlr->getrev = ata_sata_getrev; in ata_ali_chipinit()
123 res->bars[i] = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &rid, in ata_ali_chipinit()
125 if (res->bars[i] == NULL) { in ata_ali_chipinit()
127 for (i--; i >=0; i--) in ata_ali_chipinit()
129 PCIR_BAR(i), res->bars[i]); in ata_ali_chipinit()
134 ctlr->chipset_data = res; in ata_ali_chipinit()
141 /* enable cable detection and UDMA support on revisions < 0xc7 */ in ata_ali_chipinit()
142 if (ctlr->chip->chiprev < 0xc7) in ata_ali_chipinit()
146 /* enable ATAPI UDMA mode (even if we are going to do PIO) */ in ata_ali_chipinit()
148 (ctlr->chip->chiprev >= 0xc7 ? 0x03 : 0x01), 1); in ata_ali_chipinit()
151 if (ctlr->chip->chiprev <= 0xc4) in ata_ali_chipinit()
155 ctlr->ch_attach = ata_ali_ch_attach; in ata_ali_chipinit()
156 ctlr->ch_detach = ata_pci_ch_detach; in ata_ali_chipinit()
157 ctlr->reset = ata_ali_reset; in ata_ali_chipinit()
158 ctlr->setmode = ata_ali_setmode; in ata_ali_chipinit()
162 /* deactivate the ATAPI FIFO and enable ATAPI UDMA */ in ata_ali_chipinit()
164 ctlr->setmode = ata_ali_setmode; in ata_ali_chipinit()
177 if (ctlr->chip->cfg2 == ALI_SATA) { in ata_ali_chipdeinit()
178 res = ctlr->chipset_data; in ata_ali_chipdeinit()
180 if (res->bars[i] != NULL) { in ata_ali_chipdeinit()
182 PCIR_BAR(i), res->bars[i]); in ata_ali_chipdeinit()
186 ctlr->chipset_data = NULL; in ata_ali_chipdeinit()
201 if (ctlr->chip->cfg2 & ALI_NEW && ctlr->chip->chiprev < 0xc7) in ata_ali_ch_attach()
202 ch->flags |= ATA_CHECKS_CABLE; in ata_ali_ch_attach()
204 if (ctlr->chip->chiprev <= 0xc4) { in ata_ali_ch_attach()
205 ch->flags |= ATA_NO_48BIT_DMA; in ata_ali_ch_attach()
206 if (ch->dma.max_iosize > 256 * 512) in ata_ali_ch_attach()
207 ch->dma.max_iosize = 256 * 512; in ata_ali_ch_attach()
209 if (ctlr->chip->cfg2 & ALI_NEW) in ata_ali_ch_attach()
210 ch->flags |= ATA_NO_ATAPI_DMA; in ata_ali_ch_attach()
223 int unit01 = (ch->unit & 1), unit10 = (ch->unit & 2); in ata_ali_sata_ch_attach()
226 res = ctlr->chipset_data; in ata_ali_sata_ch_attach()
228 io = res->bars[2]; in ata_ali_sata_ch_attach()
229 ctlio = res->bars[3]; in ata_ali_sata_ch_attach()
231 io = res->bars[0]; in ata_ali_sata_ch_attach()
232 ctlio = res->bars[1]; in ata_ali_sata_ch_attach()
236 ch->r_io[i].res = io; in ata_ali_sata_ch_attach()
237 ch->r_io[i].offset = i + (unit10 ? 8 : 0); in ata_ali_sata_ch_attach()
239 ch->r_io[ATA_CONTROL].res = ctlio; in ata_ali_sata_ch_attach()
240 ch->r_io[ATA_CONTROL].offset = 2 + (unit10 ? 4 : 0); in ata_ali_sata_ch_attach()
241 ch->r_io[ATA_IDX_ADDR].res = io; in ata_ali_sata_ch_attach()
243 if (ctlr->r_res1) { in ata_ali_sata_ch_attach()
245 ch->r_io[i].res = ctlr->r_res1; in ata_ali_sata_ch_attach()
246 ch->r_io[i].offset = (i - ATA_BMCMD_PORT)+(ch->unit * ATA_BMIOSIZE); in ata_ali_sata_ch_attach()
249 ch->flags |= ATA_NO_SLAVE; in ata_ali_sata_ch_attach()
250 ch->flags |= ATA_SATA; in ata_ali_sata_ch_attach()
268 * workaround for datacorruption bug found on at least SUN Blade-100 in ata_ali_reset()
272 if (ctlr->chip->chiprev == 0xc3 || ctlr->chip->chiprev == 0xc2) { in ata_ali_reset()
278 ~(0x04 << ch->unit), 1); in ata_ali_reset()
281 (0x04 << ch->unit), 1); in ata_ali_reset()
296 int devno = (ch->unit << 1) + target; in ata_ali_setmode()
301 static const uint8_t udma[] = {0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x0f, in ata_ali_setmode() local
305 mode = min(mode, ctlr->chip->max_dma); in ata_ali_setmode()
307 if (ctlr->chip->cfg2 & ALI_NEW && ctlr->chip->chiprev < 0xc7) { in ata_ali_setmode()
309 pci_read_config(parent, 0x4a, 1) & (1 << ch->unit)) { in ata_ali_setmode()
314 if (ctlr->chip->cfg2 & ALI_OLD) { in ata_ali_setmode()
316 ch->flags |= ATA_ATAPI_DMA_RO; in ata_ali_setmode()
317 if (ch->devices & ATA_ATAPI_MASTER && in ata_ali_setmode()
318 ch->devices & ATA_ATAPI_SLAVE) { in ata_ali_setmode()
325 /* Set UDMA mode */ in ata_ali_setmode()
329 word54 |= (((udma[mode&ATA_MODE_MASK]<<16)|0x05)<<(devno<<2)); in ata_ali_setmode()
338 pci_write_config(parent, 0x58 + (ch->unit << 2), in ata_ali_setmode()