160727d8bSWarner Losh /*-
271e3c308SPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause
371e3c308SPedro F. Giffuni *
4321fd460SPeter Grehan * Copyright 2004 by Peter Grehan. All rights reserved.
5321fd460SPeter Grehan *
6321fd460SPeter Grehan * Redistribution and use in source and binary forms, with or without
7321fd460SPeter Grehan * modification, are permitted provided that the following conditions
8321fd460SPeter Grehan * are met:
9321fd460SPeter Grehan * 1. Redistributions of source code must retain the above copyright
10321fd460SPeter Grehan * notice, this list of conditions and the following disclaimer.
11321fd460SPeter Grehan * 2. Redistributions in binary form must reproduce the above copyright
12321fd460SPeter Grehan * notice, this list of conditions and the following disclaimer in the
13321fd460SPeter Grehan * documentation and/or other materials provided with the distribution.
14321fd460SPeter Grehan * 3. The name of the author may not be used to endorse or promote products
15321fd460SPeter Grehan * derived from this software without specific prior written permission.
16321fd460SPeter Grehan *
17321fd460SPeter Grehan * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18321fd460SPeter Grehan * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19321fd460SPeter Grehan * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20321fd460SPeter Grehan * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21321fd460SPeter Grehan * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
22321fd460SPeter Grehan * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23321fd460SPeter Grehan * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24321fd460SPeter Grehan * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
25321fd460SPeter Grehan * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26321fd460SPeter Grehan * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27321fd460SPeter Grehan * SUCH DAMAGE.
28321fd460SPeter Grehan *
29321fd460SPeter Grehan */
30321fd460SPeter Grehan #include <sys/cdefs.h>
31321fd460SPeter Grehan /*
32321fd460SPeter Grehan * Mac 'Kauai' PCI ATA controller
33321fd460SPeter Grehan */
34321fd460SPeter Grehan #include <sys/param.h>
35321fd460SPeter Grehan #include <sys/systm.h>
36321fd460SPeter Grehan #include <sys/kernel.h>
37321fd460SPeter Grehan #include <sys/module.h>
38321fd460SPeter Grehan #include <sys/bus.h>
39321fd460SPeter Grehan #include <sys/malloc.h>
40321fd460SPeter Grehan #include <sys/sema.h>
41321fd460SPeter Grehan #include <sys/taskqueue.h>
42321fd460SPeter Grehan #include <vm/uma.h>
43321fd460SPeter Grehan #include <machine/stdarg.h>
44321fd460SPeter Grehan #include <machine/resource.h>
45321fd460SPeter Grehan #include <machine/bus.h>
46321fd460SPeter Grehan #include <sys/rman.h>
47321fd460SPeter Grehan #include <sys/ata.h>
48321fd460SPeter Grehan #include <dev/ata/ata-all.h>
4998cbfce5SPeter Grehan #include <ata_if.h>
50321fd460SPeter Grehan
51321fd460SPeter Grehan #include <dev/ofw/openfirm.h>
5251d163d3SNathan Whitehorn #include <dev/ofw/ofw_bus.h>
53b7382e09SNathan Whitehorn #include <machine/intr_machdep.h>
54321fd460SPeter Grehan
55321fd460SPeter Grehan #include <dev/pci/pcivar.h>
56321fd460SPeter Grehan #include <dev/pci/pcireg.h>
57321fd460SPeter Grehan
58b7382e09SNathan Whitehorn #include "ata_dbdma.h"
59b7382e09SNathan Whitehorn
60321fd460SPeter Grehan #define ATA_KAUAI_REGOFFSET 0x2000
61b7382e09SNathan Whitehorn #define ATA_KAUAI_DBDMAOFFSET 0x1000
6280bd99beSPeter Grehan
6380bd99beSPeter Grehan /*
6480bd99beSPeter Grehan * Offset to alt-control register from base
6580bd99beSPeter Grehan */
6680bd99beSPeter Grehan #define ATA_KAUAI_ALTOFFSET (ATA_KAUAI_REGOFFSET + 0x160)
6780bd99beSPeter Grehan
6880bd99beSPeter Grehan /*
6980bd99beSPeter Grehan * Define the gap between registers
7080bd99beSPeter Grehan */
7180bd99beSPeter Grehan #define ATA_KAUAI_REGGAP 16
72321fd460SPeter Grehan
73321fd460SPeter Grehan /*
74b7382e09SNathan Whitehorn * PIO and DMA access registers
75b7382e09SNathan Whitehorn */
76b7382e09SNathan Whitehorn #define PIO_CONFIG_REG (ATA_KAUAI_REGOFFSET + 0x200)
77b7382e09SNathan Whitehorn #define UDMA_CONFIG_REG (ATA_KAUAI_REGOFFSET + 0x210)
78b7382e09SNathan Whitehorn #define DMA_IRQ_REG (ATA_KAUAI_REGOFFSET + 0x300)
79b7382e09SNathan Whitehorn
80b7382e09SNathan Whitehorn #define USE_DBDMA_IRQ 0
81b7382e09SNathan Whitehorn
82b7382e09SNathan Whitehorn /*
83321fd460SPeter Grehan * Define the kauai pci bus attachment.
84321fd460SPeter Grehan */
85321fd460SPeter Grehan static int ata_kauai_probe(device_t dev);
86b7382e09SNathan Whitehorn static int ata_kauai_attach(device_t dev);
87066f913aSAlexander Motin static int ata_kauai_setmode(device_t dev, int target, int mode);
88b7382e09SNathan Whitehorn static int ata_kauai_begin_transaction(struct ata_request *request);
89321fd460SPeter Grehan
90321fd460SPeter Grehan static device_method_t ata_kauai_methods[] = {
91321fd460SPeter Grehan /* Device interface */
92321fd460SPeter Grehan DEVMETHOD(device_probe, ata_kauai_probe),
93b7382e09SNathan Whitehorn DEVMETHOD(device_attach, ata_kauai_attach),
94321fd460SPeter Grehan DEVMETHOD(device_detach, bus_generic_detach),
95321fd460SPeter Grehan DEVMETHOD(device_shutdown, bus_generic_shutdown),
96321fd460SPeter Grehan DEVMETHOD(device_suspend, bus_generic_suspend),
97321fd460SPeter Grehan DEVMETHOD(device_resume, bus_generic_resume),
98321fd460SPeter Grehan
9998cbfce5SPeter Grehan /* ATA interface */
10098cbfce5SPeter Grehan DEVMETHOD(ata_setmode, ata_kauai_setmode),
101d2ce15bdSMarius Strobl DEVMETHOD_END
102321fd460SPeter Grehan };
103321fd460SPeter Grehan
104b7382e09SNathan Whitehorn struct ata_kauai_softc {
105b7382e09SNathan Whitehorn struct ata_dbdma_channel sc_ch;
106b7382e09SNathan Whitehorn
107b7382e09SNathan Whitehorn struct resource *sc_memr;
108b7382e09SNathan Whitehorn
109b7382e09SNathan Whitehorn int shasta;
110b7382e09SNathan Whitehorn
111b7382e09SNathan Whitehorn uint32_t udmaconf[2];
112b7382e09SNathan Whitehorn uint32_t wdmaconf[2];
113b7382e09SNathan Whitehorn uint32_t pioconf[2];
114b7382e09SNathan Whitehorn };
115b7382e09SNathan Whitehorn
116321fd460SPeter Grehan static driver_t ata_kauai_driver = {
117321fd460SPeter Grehan "ata",
118321fd460SPeter Grehan ata_kauai_methods,
119b7382e09SNathan Whitehorn sizeof(struct ata_kauai_softc),
120321fd460SPeter Grehan };
121321fd460SPeter Grehan
122*d5a7306cSJohn Baldwin DRIVER_MODULE(ata, pci, ata_kauai_driver, NULL, NULL);
12305a016a3SPeter Grehan MODULE_DEPEND(ata, ata, 1, 1, 1);
124321fd460SPeter Grehan
125321fd460SPeter Grehan /*
126321fd460SPeter Grehan * PCI ID search table
127321fd460SPeter Grehan */
128d2ce15bdSMarius Strobl static const struct kauai_pci_dev {
129321fd460SPeter Grehan u_int32_t kpd_devid;
130d2ce15bdSMarius Strobl const char *kpd_desc;
131321fd460SPeter Grehan } kauai_pci_devlist[] = {
132321fd460SPeter Grehan { 0x0033106b, "Uninorth2 Kauai ATA Controller" },
133321fd460SPeter Grehan { 0x003b106b, "Intrepid Kauai ATA Controller" },
134321fd460SPeter Grehan { 0x0043106b, "K2 Kauai ATA Controller" },
135b7382e09SNathan Whitehorn { 0x0050106b, "Shasta Kauai ATA Controller" },
136a4fcb5ecSJulian Elischer { 0x0069106b, "Intrepid-2 Kauai ATA Controller" },
137321fd460SPeter Grehan { 0, NULL }
138321fd460SPeter Grehan };
139321fd460SPeter Grehan
140b7382e09SNathan Whitehorn /*
141b7382e09SNathan Whitehorn * IDE transfer timings
142b7382e09SNathan Whitehorn */
143b7382e09SNathan Whitehorn #define KAUAI_PIO_MASK 0xff000fff
144b7382e09SNathan Whitehorn #define KAUAI_DMA_MASK 0x00fff000
145b7382e09SNathan Whitehorn #define KAUAI_UDMA_MASK 0x0000ffff
146b7382e09SNathan Whitehorn
147b7382e09SNathan Whitehorn static const u_int pio_timing_kauai[] = {
148b7382e09SNathan Whitehorn 0x08000a92, /* PIO0 */
149b7382e09SNathan Whitehorn 0x0800060f, /* PIO1 */
150b7382e09SNathan Whitehorn 0x0800038b, /* PIO2 */
151b7382e09SNathan Whitehorn 0x05000249, /* PIO3 */
152b7382e09SNathan Whitehorn 0x04000148 /* PIO4 */
153b7382e09SNathan Whitehorn };
154d2ce15bdSMarius Strobl
155b7382e09SNathan Whitehorn static const u_int pio_timing_shasta[] = {
156b7382e09SNathan Whitehorn 0x0a000c97, /* PIO0 */
157b7382e09SNathan Whitehorn 0x07000712, /* PIO1 */
158b7382e09SNathan Whitehorn 0x040003cd, /* PIO2 */
159b7382e09SNathan Whitehorn 0x0400028b, /* PIO3 */
160b7382e09SNathan Whitehorn 0x0400010a /* PIO4 */
161b7382e09SNathan Whitehorn };
162b7382e09SNathan Whitehorn
163b7382e09SNathan Whitehorn static const u_int dma_timing_kauai[] = {
164b7382e09SNathan Whitehorn 0x00618000, /* WDMA0 */
165b7382e09SNathan Whitehorn 0x00209000, /* WDMA1 */
166b7382e09SNathan Whitehorn 0x00148000 /* WDMA2 */
167b7382e09SNathan Whitehorn };
168d2ce15bdSMarius Strobl
169b7382e09SNathan Whitehorn static const u_int dma_timing_shasta[] = {
170b7382e09SNathan Whitehorn 0x00820800, /* WDMA0 */
171b7382e09SNathan Whitehorn 0x0028b000, /* WDMA1 */
172b7382e09SNathan Whitehorn 0x001ca000 /* WDMA2 */
173b7382e09SNathan Whitehorn };
174b7382e09SNathan Whitehorn
175b7382e09SNathan Whitehorn static const u_int udma_timing_kauai[] = {
176b7382e09SNathan Whitehorn 0x000070c1, /* UDMA0 */
177b7382e09SNathan Whitehorn 0x00005d81, /* UDMA1 */
178b7382e09SNathan Whitehorn 0x00004a61, /* UDMA2 */
179b7382e09SNathan Whitehorn 0x00003a51, /* UDMA3 */
180b7382e09SNathan Whitehorn 0x00002a31, /* UDMA4 */
181b7382e09SNathan Whitehorn 0x00002921 /* UDMA5 */
182b7382e09SNathan Whitehorn };
183d2ce15bdSMarius Strobl
184b7382e09SNathan Whitehorn static const u_int udma_timing_shasta[] = {
185b7382e09SNathan Whitehorn 0x00035901, /* UDMA0 */
186b7382e09SNathan Whitehorn 0x000348b1, /* UDMA1 */
187b7382e09SNathan Whitehorn 0x00033881, /* UDMA2 */
188b7382e09SNathan Whitehorn 0x00033861, /* UDMA3 */
189b7382e09SNathan Whitehorn 0x00033841, /* UDMA4 */
190b7382e09SNathan Whitehorn 0x00033031, /* UDMA5 */
191b7382e09SNathan Whitehorn 0x00033021 /* UDMA6 */
192b7382e09SNathan Whitehorn };
193b7382e09SNathan Whitehorn
194321fd460SPeter Grehan static int
ata_kauai_probe(device_t dev)195321fd460SPeter Grehan ata_kauai_probe(device_t dev)
196321fd460SPeter Grehan {
197321fd460SPeter Grehan u_int32_t devid;
198965205ebSAndreas Tobler int i, found;
199321fd460SPeter Grehan
200321fd460SPeter Grehan found = 0;
201321fd460SPeter Grehan devid = pci_get_devid(dev);
202321fd460SPeter Grehan for (i = 0; kauai_pci_devlist[i].kpd_desc != NULL; i++) {
203321fd460SPeter Grehan if (devid == kauai_pci_devlist[i].kpd_devid) {
204321fd460SPeter Grehan found = 1;
205321fd460SPeter Grehan device_set_desc(dev, kauai_pci_devlist[i].kpd_desc);
206321fd460SPeter Grehan }
207321fd460SPeter Grehan }
208321fd460SPeter Grehan
209321fd460SPeter Grehan if (!found)
210321fd460SPeter Grehan return (ENXIO);
211321fd460SPeter Grehan
212965205ebSAndreas Tobler return (ata_probe(dev));
213965205ebSAndreas Tobler }
214965205ebSAndreas Tobler
215965205ebSAndreas Tobler #if USE_DBDMA_IRQ
216965205ebSAndreas Tobler static int
ata_kauai_dma_interrupt(struct ata_kauai_softc * sc)217965205ebSAndreas Tobler ata_kauai_dma_interrupt(struct ata_kauai_softc *sc)
218965205ebSAndreas Tobler {
219965205ebSAndreas Tobler /* Clear the DMA interrupt bits */
220965205ebSAndreas Tobler
221965205ebSAndreas Tobler bus_write_4(sc->sc_memr, DMA_IRQ_REG, 0x80000000);
222965205ebSAndreas Tobler
223965205ebSAndreas Tobler return ata_interrupt(sc);
224965205ebSAndreas Tobler }
225965205ebSAndreas Tobler #endif
226965205ebSAndreas Tobler
227965205ebSAndreas Tobler static int
ata_kauai_attach(device_t dev)228965205ebSAndreas Tobler ata_kauai_attach(device_t dev)
229965205ebSAndreas Tobler {
230965205ebSAndreas Tobler struct ata_kauai_softc *sc = device_get_softc(dev);
231965205ebSAndreas Tobler struct ata_channel *ch;
232d5472cd4SJohn Baldwin const char *compatstring;
233965205ebSAndreas Tobler int i, rid;
234965205ebSAndreas Tobler #if USE_DBDMA_IRQ
235965205ebSAndreas Tobler int dbdma_irq_rid = 1;
236965205ebSAndreas Tobler struct resource *dbdma_irq;
237965205ebSAndreas Tobler void *cookie;
238965205ebSAndreas Tobler #endif
239965205ebSAndreas Tobler
240d5472cd4SJohn Baldwin compatstring = ofw_bus_get_compat(dev);
241d5472cd4SJohn Baldwin if (compatstring != NULL && strcmp(compatstring,"shasta-ata") == 0)
242d5472cd4SJohn Baldwin sc->shasta = 1;
243d5472cd4SJohn Baldwin
244d5472cd4SJohn Baldwin /* Pre-K2 controllers apparently need this hack */
245d5472cd4SJohn Baldwin if (!sc->shasta &&
246d5472cd4SJohn Baldwin (compatstring == NULL || strcmp(compatstring, "K2-UATA") != 0))
247d5472cd4SJohn Baldwin bus_set_resource(dev, SYS_RES_IRQ, 0, 39, 1);
248d5472cd4SJohn Baldwin
249965205ebSAndreas Tobler ch = &sc->sc_ch.sc_ch;
250965205ebSAndreas Tobler
25180bd99beSPeter Grehan rid = PCIR_BARS;
252b7382e09SNathan Whitehorn sc->sc_memr = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
253b7382e09SNathan Whitehorn RF_ACTIVE);
254b7382e09SNathan Whitehorn if (sc->sc_memr == NULL) {
255321fd460SPeter Grehan device_printf(dev, "could not allocate memory\n");
256321fd460SPeter Grehan return (ENXIO);
257321fd460SPeter Grehan }
258321fd460SPeter Grehan
259321fd460SPeter Grehan /*
260321fd460SPeter Grehan * Set up the resource vectors
261321fd460SPeter Grehan */
2625a276744SPeter Grehan for (i = ATA_DATA; i <= ATA_COMMAND; i++) {
263b7382e09SNathan Whitehorn ch->r_io[i].res = sc->sc_memr;
26480bd99beSPeter Grehan ch->r_io[i].offset = i*ATA_KAUAI_REGGAP + ATA_KAUAI_REGOFFSET;
265321fd460SPeter Grehan }
266b7382e09SNathan Whitehorn ch->r_io[ATA_CONTROL].res = sc->sc_memr;
267a378bbabSPeter Grehan ch->r_io[ATA_CONTROL].offset = ATA_KAUAI_ALTOFFSET;
2686ac8f17eSPeter Grehan ata_default_registers(dev);
269321fd460SPeter Grehan
270321fd460SPeter Grehan ch->unit = 0;
271edaccfc8SPeter Grehan ch->flags |= ATA_USE_16BIT;
272a0a3479cSNathan Whitehorn
273a0a3479cSNathan Whitehorn /* XXX: ATAPI DMA is unreliable. We should find out why. */
274a0a3479cSNathan Whitehorn ch->flags |= ATA_NO_ATAPI_DMA;
2756ac8f17eSPeter Grehan ata_generic_hw(dev);
276321fd460SPeter Grehan
277b7382e09SNathan Whitehorn pci_enable_busmaster(dev);
278b7382e09SNathan Whitehorn
279b7382e09SNathan Whitehorn /* Init DMA engine */
280b7382e09SNathan Whitehorn
281b7382e09SNathan Whitehorn sc->sc_ch.dbdma_rid = 1;
282b7382e09SNathan Whitehorn sc->sc_ch.dbdma_regs = sc->sc_memr;
283b7382e09SNathan Whitehorn sc->sc_ch.dbdma_offset = ATA_KAUAI_DBDMAOFFSET;
284b7382e09SNathan Whitehorn
285b7382e09SNathan Whitehorn ata_dbdma_dmainit(dev);
286b7382e09SNathan Whitehorn
287b7382e09SNathan Whitehorn #if USE_DBDMA_IRQ
288b7382e09SNathan Whitehorn /* Bind to DBDMA interrupt as well */
289b7382e09SNathan Whitehorn if ((dbdma_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ,
290b7382e09SNathan Whitehorn &dbdma_irq_rid, RF_SHAREABLE | RF_ACTIVE)) != NULL) {
291b7382e09SNathan Whitehorn bus_setup_intr(dev, dbdma_irq, ATA_INTR_FLAGS, NULL,
292b7382e09SNathan Whitehorn (driver_intr_t *)ata_kauai_dma_interrupt, sc,&cookie);
293b7382e09SNathan Whitehorn }
294b7382e09SNathan Whitehorn #endif
295b7382e09SNathan Whitehorn
296b7382e09SNathan Whitehorn /* Set up initial mode */
297e8657200SNathan Whitehorn sc->pioconf[0] = sc->pioconf[1] =
298e8657200SNathan Whitehorn bus_read_4(sc->sc_memr, PIO_CONFIG_REG) & 0x0f000fff;
299b7382e09SNathan Whitehorn
300b7382e09SNathan Whitehorn sc->udmaconf[0] = sc->udmaconf[1] = 0;
301b7382e09SNathan Whitehorn sc->wdmaconf[0] = sc->wdmaconf[1] = 0;
302b7382e09SNathan Whitehorn
303b7382e09SNathan Whitehorn /* Magic FCR value from Apple */
304b7382e09SNathan Whitehorn bus_write_4(sc->sc_memr, 0, 0x00000007);
305b7382e09SNathan Whitehorn
306b7382e09SNathan Whitehorn /* Set begin_transaction */
307b7382e09SNathan Whitehorn sc->sc_ch.sc_ch.hw.begin_transaction = ata_kauai_begin_transaction;
308b7382e09SNathan Whitehorn
309b7382e09SNathan Whitehorn return ata_attach(dev);
310b7382e09SNathan Whitehorn }
311b7382e09SNathan Whitehorn
312066f913aSAlexander Motin static int
ata_kauai_setmode(device_t dev,int target,int mode)313066f913aSAlexander Motin ata_kauai_setmode(device_t dev, int target, int mode)
31498cbfce5SPeter Grehan {
315066f913aSAlexander Motin struct ata_kauai_softc *sc = device_get_softc(dev);
31698cbfce5SPeter Grehan
317066f913aSAlexander Motin mode = min(mode,sc->shasta ? ATA_UDMA6 : ATA_UDMA5);
318b7382e09SNathan Whitehorn
319b7382e09SNathan Whitehorn if (sc->shasta) {
320b7382e09SNathan Whitehorn switch (mode & ATA_DMA_MASK) {
321b7382e09SNathan Whitehorn case ATA_UDMA0:
322066f913aSAlexander Motin sc->udmaconf[target]
323b7382e09SNathan Whitehorn = udma_timing_shasta[mode & ATA_MODE_MASK];
324b7382e09SNathan Whitehorn break;
325b7382e09SNathan Whitehorn case ATA_WDMA0:
326066f913aSAlexander Motin sc->udmaconf[target] = 0;
327066f913aSAlexander Motin sc->wdmaconf[target]
328b7382e09SNathan Whitehorn = dma_timing_shasta[mode & ATA_MODE_MASK];
329b7382e09SNathan Whitehorn break;
330b7382e09SNathan Whitehorn default:
331066f913aSAlexander Motin sc->pioconf[target]
332b7382e09SNathan Whitehorn = pio_timing_shasta[(mode & ATA_MODE_MASK) -
333b7382e09SNathan Whitehorn ATA_PIO0];
334b7382e09SNathan Whitehorn break;
33598cbfce5SPeter Grehan }
336b7382e09SNathan Whitehorn } else {
337b7382e09SNathan Whitehorn switch (mode & ATA_DMA_MASK) {
338b7382e09SNathan Whitehorn case ATA_UDMA0:
339066f913aSAlexander Motin sc->udmaconf[target]
340b7382e09SNathan Whitehorn = udma_timing_kauai[mode & ATA_MODE_MASK];
341b7382e09SNathan Whitehorn break;
342b7382e09SNathan Whitehorn case ATA_WDMA0:
343066f913aSAlexander Motin sc->udmaconf[target] = 0;
344066f913aSAlexander Motin sc->wdmaconf[target]
345b7382e09SNathan Whitehorn = dma_timing_kauai[mode & ATA_MODE_MASK];
346b7382e09SNathan Whitehorn break;
347b7382e09SNathan Whitehorn default:
348066f913aSAlexander Motin sc->pioconf[target]
349b7382e09SNathan Whitehorn = pio_timing_kauai[(mode & ATA_MODE_MASK)
350b7382e09SNathan Whitehorn - ATA_PIO0];
351b7382e09SNathan Whitehorn break;
352b7382e09SNathan Whitehorn }
353b7382e09SNathan Whitehorn }
354066f913aSAlexander Motin
355066f913aSAlexander Motin return (mode);
356b7382e09SNathan Whitehorn }
357b7382e09SNathan Whitehorn
358b7382e09SNathan Whitehorn static int
ata_kauai_begin_transaction(struct ata_request * request)359b7382e09SNathan Whitehorn ata_kauai_begin_transaction(struct ata_request *request)
360b7382e09SNathan Whitehorn {
361b7382e09SNathan Whitehorn struct ata_kauai_softc *sc = device_get_softc(request->parent);
362b7382e09SNathan Whitehorn
363066f913aSAlexander Motin bus_write_4(sc->sc_memr, UDMA_CONFIG_REG, sc->udmaconf[request->unit]);
364b7382e09SNathan Whitehorn bus_write_4(sc->sc_memr, PIO_CONFIG_REG,
365066f913aSAlexander Motin sc->wdmaconf[request->unit] | sc->pioconf[request->unit]);
366b7382e09SNathan Whitehorn
367b7382e09SNathan Whitehorn return ata_begin_transaction(request);
368b7382e09SNathan Whitehorn }
369