xref: /netbsd-src/sys/dev/pci/pciide.c (revision dc306354b0b29af51801a7632f1e95265a68cd81)
1 /*	$NetBSD: pciide.c,v 1.29 1998/12/16 13:21:26 bouyer Exp $	*/
2 
3 /*
4  * Copyright (c) 1996, 1998 Christopher G. Demetriou.  All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  * 3. All advertising materials mentioning features or use of this software
15  *    must display the following acknowledgement:
16  *      This product includes software developed by Christopher G. Demetriou
17  *	for the NetBSD Project.
18  * 4. The name of the author may not be used to endorse or promote products
19  *    derived from this software without specific prior written permission
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 /*
34  * PCI IDE controller driver.
35  *
36  * Author: Christopher G. Demetriou, March 2, 1998 (derived from NetBSD
37  * sys/dev/pci/ppb.c, revision 1.16).
38  *
39  * See "PCI IDE Controller Specification, Revision 1.0 3/4/94" and
40  * "Programming Interface for Bus Master IDE Controller, Revision 1.0
41  * 5/16/94" from the PCI SIG.
42  *
43  */
44 
45 #define WDCDEBUG
46 
47 #define DEBUG_DMA   0x01
48 #define DEBUG_XFERS  0x02
49 #define DEBUG_FUNCS  0x08
50 #define DEBUG_PROBE  0x10
51 #ifdef WDCDEBUG
52 int wdcdebug_pciide_mask = 0;
53 #define WDCDEBUG_PRINT(args, level) \
54 	if (wdcdebug_pciide_mask & (level)) printf args
55 #else
56 #define WDCDEBUG_PRINT(args, level)
57 #endif
58 #include <sys/param.h>
59 #include <sys/systm.h>
60 #include <sys/device.h>
61 #include <sys/malloc.h>
62 
63 #include <vm/vm.h>
64 #include <vm/vm_param.h>
65 #include <vm/vm_kern.h>
66 
67 #include <dev/pci/pcireg.h>
68 #include <dev/pci/pcivar.h>
69 #include <dev/pci/pcidevs.h>
70 #include <dev/pci/pciidereg.h>
71 #include <dev/pci/pciidevar.h>
72 #include <dev/pci/pciide_piix_reg.h>
73 #include <dev/pci/pciide_apollo_reg.h>
74 #include <dev/pci/pciide_cmd_reg.h>
75 #include <dev/pci/pciide_cy693_reg.h>
76 #include <dev/pci/pciide_sis_reg.h>
77 #include <dev/ata/atavar.h>
78 #include <dev/ic/wdcreg.h>
79 #include <dev/ic/wdcvar.h>
80 
81 /* inlines for reading/writing 8-bit PCI registers */
82 static __inline u_int8_t pciide_pci_read __P((pci_chipset_tag_t, pcitag_t,
83 		int));
84 static __inline u_int8_t
85 pciide_pci_read(pc, pa, reg)
86 	pci_chipset_tag_t pc;
87 	pcitag_t pa;
88 	int reg;
89 {
90 	return (
91 	    pci_conf_read(pc, pa, (reg & ~0x03)) >> ((reg & 0x03) * 8) & 0xff);
92 }
93 
94 
95 static __inline void pciide_pci_write __P((pci_chipset_tag_t, pcitag_t,
96 		int, u_int8_t));
97 static __inline void
98 pciide_pci_write(pc, pa, reg, val)
99 	pci_chipset_tag_t pc;
100 	pcitag_t pa;
101 	int reg;
102 	u_int8_t val;
103 {
104 	pcireg_t pcival;
105 
106 	pcival = pci_conf_read(pc, pa, (reg & ~0x03));
107 	pcival &= ~(0xff << ((reg & 0x03) * 8));
108 	pcival |= (val << ((reg & 0x03) * 8));
109 	pci_conf_write(pc, pa, (reg & ~0x03), pcival);
110 }
111 
112 struct pciide_softc {
113 	struct wdc_softc	sc_wdcdev;	/* common wdc definitions */
114 	pci_chipset_tag_t	sc_pc;		/* PCI registers info */
115 	pcitag_t		sc_tag;
116 	void			*sc_pci_ih;	/* PCI interrupt handle */
117 	int			sc_dma_ok;	/* bus-master DMA info */
118 	bus_space_tag_t		sc_dma_iot;
119 	bus_space_handle_t	sc_dma_ioh;
120 	bus_dma_tag_t		sc_dmat;
121 	/* Chip description */
122 	const struct pciide_product_desc *sc_pp;
123 	/* common definitions */
124 	struct channel_softc *wdc_chanarray[PCIIDE_NUM_CHANNELS];
125 	/* internal bookkeeping */
126 	struct pciide_channel {			/* per-channel data */
127 		struct channel_softc wdc_channel; /* generic part */
128 		char		*name;
129 		int		hw_ok;		/* hardware mapped & OK? */
130 		int		compat;		/* is it compat? */
131 		void		*ih;		/* compat or pci handle */
132 		/* DMA tables and DMA map for xfer, for each drive */
133 		struct pciide_dma_maps {
134 			bus_dmamap_t    dmamap_table;
135 			struct idedma_table *dma_table;
136 			bus_dmamap_t    dmamap_xfer;
137 		} dma_maps[2];
138 	} pciide_channels[PCIIDE_NUM_CHANNELS];
139 };
140 
141 void default_setup_cap __P((struct pciide_softc*));
142 void default_setup_chip __P((struct pciide_softc*));
143 void default_channel_map __P((struct pci_attach_args *,
144 		struct pciide_channel *));
145 
146 void piix_setup_cap __P((struct pciide_softc*));
147 void piix_setup_chip __P((struct pciide_softc*));
148 void piix_setup_channel __P((struct channel_softc*));
149 void piix3_4_setup_chip __P((struct pciide_softc*));
150 void piix3_4_setup_channel __P((struct channel_softc*));
151 void piix_channel_map __P((struct pci_attach_args *, struct pciide_channel *));
152 static u_int32_t piix_setup_idetim_timings __P((u_int8_t, u_int8_t, u_int8_t));
153 static u_int32_t piix_setup_idetim_drvs __P((struct ata_drive_datas*));
154 static u_int32_t piix_setup_sidetim_timings __P((u_int8_t, u_int8_t, u_int8_t));
155 
156 void apollo_setup_cap __P((struct pciide_softc*));
157 void apollo_setup_chip __P((struct pciide_softc*));
158 void apollo_setup_channel __P((struct channel_softc*));
159 void apollo_channel_map __P((struct pci_attach_args *,
160 		struct pciide_channel *));
161 
162 void cmd0643_6_setup_cap __P((struct pciide_softc*));
163 void cmd0643_6_setup_chip __P((struct pciide_softc*));
164 void cmd0643_6_setup_channel __P((struct channel_softc*));
165 void cmd_channel_map __P((struct pci_attach_args *, struct pciide_channel *));
166 
167 void cy693_setup_cap __P((struct pciide_softc*));
168 void cy693_setup_chip __P((struct pciide_softc*));
169 void cy693_setup_channel __P((struct channel_softc*));
170 void cy693_channel_map __P((struct pci_attach_args *, struct pciide_channel *));
171 
172 void sis_setup_cap __P((struct pciide_softc*));
173 void sis_setup_chip __P((struct pciide_softc*));
174 void sis_setup_channel __P((struct channel_softc*));
175 void sis_channel_map __P((struct pci_attach_args *, struct pciide_channel *));
176 
177 void pciide_channel_dma_setup __P((struct pciide_channel *));
178 int  pciide_dma_table_setup __P((struct pciide_softc*, int, int));
179 int  pciide_dma_init __P((void*, int, int, void *, size_t, int));
180 void pciide_dma_start __P((void*, int, int, int));
181 int  pciide_dma_finish __P((void*, int, int, int));
182 void pciide_print_modes __P((struct pciide_channel *));
183 
184 struct pciide_product_desc {
185     u_int32_t ide_product;
186     int ide_flags;
187     int ide_num_channels;
188     const char *ide_name;
189     /* init controller's capabilities for drives probe */
190     void (*setup_cap) __P((struct pciide_softc*));
191     /* init controller after drives probe */
192     void (*setup_chip) __P((struct pciide_softc*));
193     /* map channel if possible/necessary */
194     void (*channel_map) __P((struct pci_attach_args *,
195 		struct pciide_channel *));
196 };
197 
198 /* Flags for ide_flags */
199 #define CMD_PCI064x_IOEN 0x01 /* CMD-style PCI_COMMAND_IO_ENABLE */
200 #define ONE_QUEUE         0x02 /* device need serialised access */
201 
202 /* Default product description for devices not known from this controller */
203 const struct pciide_product_desc default_product_desc = {
204     0,
205     0,
206     PCIIDE_NUM_CHANNELS,
207     "Generic PCI IDE controller",
208     default_setup_cap,
209     default_setup_chip,
210     default_channel_map
211 };
212 
213 
214 const struct pciide_product_desc pciide_intel_products[] =  {
215     { PCI_PRODUCT_INTEL_82092AA,
216       0,
217       PCIIDE_NUM_CHANNELS,
218       "Intel 82092AA IDE controller",
219       default_setup_cap,
220       default_setup_chip,
221       default_channel_map
222     },
223     { PCI_PRODUCT_INTEL_82371FB_IDE,
224       0,
225       PCIIDE_NUM_CHANNELS,
226       "Intel 82371FB IDE controller (PIIX)",
227       piix_setup_cap,
228       piix_setup_chip,
229       piix_channel_map
230     },
231     { PCI_PRODUCT_INTEL_82371SB_IDE,
232       0,
233       PCIIDE_NUM_CHANNELS,
234       "Intel 82371SB IDE Interface (PIIX3)",
235       piix_setup_cap,
236       piix3_4_setup_chip,
237       piix_channel_map
238     },
239     { PCI_PRODUCT_INTEL_82371AB_IDE,
240       0,
241       PCIIDE_NUM_CHANNELS,
242       "Intel 82371AB IDE controller (PIIX4)",
243       piix_setup_cap,
244       piix3_4_setup_chip,
245       piix_channel_map
246     },
247     { 0,
248       0,
249       0,
250       NULL,
251     }
252 };
253 const struct pciide_product_desc pciide_cmd_products[] =  {
254     { PCI_PRODUCT_CMDTECH_640,
255       ONE_QUEUE | CMD_PCI064x_IOEN,
256       PCIIDE_NUM_CHANNELS,
257       "CMD Technology PCI0640",
258       default_setup_cap,
259       default_setup_chip,
260       cmd_channel_map
261     },
262     { PCI_PRODUCT_CMDTECH_643,
263       ONE_QUEUE | CMD_PCI064x_IOEN,
264       PCIIDE_NUM_CHANNELS,
265       "CMD Technology PCI0643",
266       cmd0643_6_setup_cap,
267       cmd0643_6_setup_chip,
268       cmd_channel_map
269     },
270     { PCI_PRODUCT_CMDTECH_646,
271       ONE_QUEUE | CMD_PCI064x_IOEN,
272       PCIIDE_NUM_CHANNELS,
273       "CMD Technology PCI0646",
274       cmd0643_6_setup_cap,
275       cmd0643_6_setup_chip,
276       cmd_channel_map
277     },
278     { 0,
279       0,
280       0,
281       NULL,
282     }
283 };
284 
285 const struct pciide_product_desc pciide_via_products[] =  {
286     { PCI_PRODUCT_VIATECH_VT82C586_IDE,
287       0,
288       PCIIDE_NUM_CHANNELS,
289       "VIA Technologies VT82C586 (Apollo VP) IDE Controller",
290       apollo_setup_cap,
291       apollo_setup_chip,
292       apollo_channel_map
293      },
294     { PCI_PRODUCT_VIATECH_VT82C586A_IDE,
295       0,
296       PCIIDE_NUM_CHANNELS,
297       "VIA Technologies VT82C586A IDE Controller",
298       apollo_setup_cap,
299       apollo_setup_chip,
300       apollo_channel_map
301     },
302     { 0,
303       0,
304       0,
305       NULL,
306     }
307 };
308 
309 const struct pciide_product_desc pciide_cypress_products[] =  {
310     { PCI_PRODUCT_CONTAQ_82C693,
311       0,
312       1,
313       "Contaq Microsystems CY82C693 IDE Controller",
314       cy693_setup_cap,
315       cy693_setup_chip,
316       cy693_channel_map
317     },
318     { 0,
319       0,
320       0,
321       NULL,
322     }
323 };
324 
325 const struct pciide_product_desc pciide_sis_products[] =  {
326     { PCI_PRODUCT_SIS_5597_IDE,
327       0,
328       PCIIDE_NUM_CHANNELS,
329       "Silicon Integrated System 5597/5598 IDE controller",
330       sis_setup_cap,
331       sis_setup_chip,
332       sis_channel_map
333     },
334     { 0,
335       0,
336       0,
337       NULL,
338     }
339 };
340 
341 struct pciide_vendor_desc {
342     u_int32_t ide_vendor;
343     const struct pciide_product_desc *ide_products;
344 };
345 
346 const struct pciide_vendor_desc pciide_vendors[] = {
347     { PCI_VENDOR_INTEL, pciide_intel_products },
348     { PCI_VENDOR_CMDTECH, pciide_cmd_products },
349     { PCI_VENDOR_VIATECH, pciide_via_products },
350     { PCI_VENDOR_CONTAQ, pciide_cypress_products },
351     { PCI_VENDOR_SIS, pciide_sis_products },
352     { 0, NULL }
353 };
354 
355 
356 #define	PCIIDE_CHANNEL_NAME(chan)	((chan) == 0 ? "primary" : "secondary")
357 
358 /* options passed via the 'flags' config keyword */
359 #define PCIIDE_OPTIONS_DMA	0x01
360 
361 int	pciide_match __P((struct device *, struct cfdata *, void *));
362 void	pciide_attach __P((struct device *, struct device *, void *));
363 
364 struct cfattach pciide_ca = {
365 	sizeof(struct pciide_softc), pciide_match, pciide_attach
366 };
367 
368 int	pciide_mapregs_compat __P(( struct pci_attach_args *,
369 	    struct pciide_channel *, int, bus_size_t *, bus_size_t*));
370 int	pciide_mapregs_native __P((struct pci_attach_args *,
371 	    struct pciide_channel *, bus_size_t *, bus_size_t *));
372 void	pciide_mapchan __P((struct pci_attach_args *,
373 	    struct pciide_channel *, int, bus_size_t *, bus_size_t *));
374 int	pciiide_chan_candisable __P((struct pciide_channel *));
375 void	pciide_map_compat_intr __P(( struct pci_attach_args *,
376 	    struct pciide_channel *, int, int));
377 int	pciide_print __P((void *, const char *pnp));
378 int	pciide_compat_intr __P((void *));
379 int	pciide_pci_intr __P((void *));
380 const struct pciide_product_desc* pciide_lookup_product __P((u_int32_t));
381 
382 const struct pciide_product_desc*
383 pciide_lookup_product(id)
384     u_int32_t id;
385 {
386     const struct pciide_product_desc *pp;
387     const struct pciide_vendor_desc *vp;
388 
389     for (vp = pciide_vendors; vp->ide_products != NULL; vp++)
390 	if (PCI_VENDOR(id) == vp->ide_vendor)
391 	    break;
392 
393     if ((pp = vp->ide_products) == NULL)
394 	return NULL;
395 
396     for (; pp->ide_name != NULL; pp++)
397 	if (PCI_PRODUCT(id) == pp->ide_product)
398 	    break;
399 
400     if (pp->ide_name == NULL)
401 	return NULL;
402     return pp;
403 }
404 
405 int
406 pciide_match(parent, match, aux)
407 	struct device *parent;
408 	struct cfdata *match;
409 	void *aux;
410 {
411 	struct pci_attach_args *pa = aux;
412 
413 	/*
414 	 * Check the ID register to see that it's a PCI IDE controller.
415 	 * If it is, we assume that we can deal with it; it _should_
416 	 * work in a standardized way...
417 	 */
418 	if (PCI_CLASS(pa->pa_class) == PCI_CLASS_MASS_STORAGE &&
419 	    PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_MASS_STORAGE_IDE) {
420 		return (1);
421 	}
422 
423 	return (0);
424 }
425 
426 void
427 pciide_attach(parent, self, aux)
428 	struct device *parent, *self;
429 	void *aux;
430 {
431 	struct pci_attach_args *pa = aux;
432 	pci_chipset_tag_t pc = pa->pa_pc;
433 	pcitag_t tag = pa->pa_tag;
434 	struct pciide_softc *sc = (struct pciide_softc *)self;
435 	struct pciide_channel *cp;
436 	pcireg_t class, interface, csr;
437 	char devinfo[256];
438 	int i;
439 
440         sc->sc_pp = pciide_lookup_product(pa->pa_id);
441 	if (sc->sc_pp == NULL) {
442 		sc->sc_pp = &default_product_desc;
443 		pci_devinfo(pa->pa_id, pa->pa_class, 0, devinfo);
444 		printf(": %s (rev. 0x%02x)\n", devinfo,
445 		    PCI_REVISION(pa->pa_class));
446 	} else {
447 		printf(": %s\n", sc->sc_pp->ide_name);
448 	}
449 
450 	if ((pa->pa_flags & PCI_FLAGS_IO_ENABLED) == 0) {
451 		csr = pci_conf_read(pc, tag, PCI_COMMAND_STATUS_REG);
452 		/*
453 		 * For a CMD PCI064x, the use of PCI_COMMAND_IO_ENABLE
454 		 * and base adresses registers can be disabled at
455 		 * hardware level. In this case, the device is wired
456 		 * in compat mode and its first channel is always enabled,
457 		 * but we can't rely on PCI_COMMAND_IO_ENABLE.
458 		 * In fact, it seems that the first channel of the CMD PCI0640
459 		 * can't be disabled.
460 		 */
461 #ifndef PCIIDE_CMD064x_DISABLE
462 		if ((sc->sc_pp->ide_flags & CMD_PCI064x_IOEN) == 0) {
463 #else
464 		if (1) {
465 #endif
466 			printf("%s: device disabled (at %s)\n",
467 		 	   sc->sc_wdcdev.sc_dev.dv_xname,
468 		  	  (csr & PCI_COMMAND_IO_ENABLE) == 0 ?
469 			  "device" : "bridge");
470 			return;
471 		}
472 	}
473 
474 	sc->sc_pc = pa->pa_pc;
475 	sc->sc_tag = pa->pa_tag;
476 
477 	class = pci_conf_read(pc, tag, PCI_CLASS_REG);
478 	interface = PCI_INTERFACE(class);
479 
480 	/*
481 	 * Map DMA registers, if DMA is supported.
482 	 *
483 	 * Note that sc_dma_ok is the right variable to test to see if
484 	 * DMA can be done.  If the interface doesn't support DMA,
485 	 * sc_dma_ok will never be non-zero.  If the DMA regs couldn't
486 	 * be mapped, it'll be zero.  I.e., sc_dma_ok will only be
487 	 * non-zero if the interface supports DMA and the registers
488 	 * could be mapped.
489 	 *
490 	 * XXX Note that despite the fact that the Bus Master IDE specs
491 	 * XXX say that "The bus master IDE functoin uses 16 bytes of IO
492 	 * XXX space," some controllers (at least the United
493 	 * XXX Microelectronics UM8886BF) place it in memory space.
494 	 * XXX eventually, we should probably read the register and check
495 	 * XXX which type it is.  Either that or 'quirk' certain devices.
496 	 */
497 	if (interface & PCIIDE_INTERFACE_BUS_MASTER_DMA) {
498 		printf("%s: bus-master DMA support present",
499 		    sc->sc_wdcdev.sc_dev.dv_xname);
500 		if (sc->sc_pp == &default_product_desc &&
501 		    (sc->sc_wdcdev.sc_dev.dv_cfdata->cf_flags &
502 		    PCIIDE_OPTIONS_DMA) == 0) {
503 			printf(", but unused (no driver support)");
504 			sc->sc_dma_ok = 0;
505 		} else {
506 			sc->sc_dma_ok = (pci_mapreg_map(pa,
507 			    PCIIDE_REG_BUS_MASTER_DMA, PCI_MAPREG_TYPE_IO, 0,
508 			    &sc->sc_dma_iot, &sc->sc_dma_ioh, NULL, NULL) == 0);
509 			sc->sc_dmat = pa->pa_dmat;
510 			if (sc->sc_dma_ok == 0) {
511 				printf(", but unused (couldn't map registers)");
512 			} else {
513 				if (sc->sc_pp == &default_product_desc)
514 					printf(", used without full driver "
515 					    "support");
516 				sc->sc_wdcdev.dma_arg = sc;
517 				sc->sc_wdcdev.dma_init = pciide_dma_init;
518 				sc->sc_wdcdev.dma_start = pciide_dma_start;
519 				sc->sc_wdcdev.dma_finish = pciide_dma_finish;
520 			}
521 		}
522 	} else {
523 		printf("%s: pciide0: hardware does not support DMA",
524 		    sc->sc_wdcdev.sc_dev.dv_xname);
525 	}
526 	printf("\n");
527 	sc->sc_pp->setup_cap(sc);
528 	sc->sc_wdcdev.channels = sc->wdc_chanarray;
529 	sc->sc_wdcdev.nchannels = sc->sc_pp->ide_num_channels;;
530 	sc->sc_wdcdev.cap |= WDC_CAPABILITY_DATA16;
531 
532 	for (i = 0; i < sc->sc_wdcdev.nchannels; i++) {
533 		cp = &sc->pciide_channels[i];
534 		sc->wdc_chanarray[i] = &cp->wdc_channel;
535 
536 		cp->name = PCIIDE_CHANNEL_NAME(i);
537 
538 		cp->wdc_channel.channel = i;
539 		cp->wdc_channel.wdc = &sc->sc_wdcdev;
540 		if (i > 0 && (sc->sc_pp->ide_flags & ONE_QUEUE)) {
541 		    cp->wdc_channel.ch_queue =
542 			sc->pciide_channels[0].wdc_channel.ch_queue;
543 		} else {
544 		    cp->wdc_channel.ch_queue =
545 		        malloc(sizeof(struct channel_queue), M_DEVBUF,
546 			M_NOWAIT);
547 		}
548 		if (cp->wdc_channel.ch_queue == NULL) {
549 		    printf("%s %s channel: "
550 			"can't allocate memory for command queue",
551 			sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
552 			continue;
553 		}
554 		printf("%s: %s channel %s to %s mode\n",
555 		    sc->sc_wdcdev.sc_dev.dv_xname, cp->name,
556 		    (interface & PCIIDE_INTERFACE_SETTABLE(i)) ?
557 		      "configured" : "wired",
558 		    (interface & PCIIDE_INTERFACE_PCI(i)) ? "native-PCI" :
559 		      "compatibility");
560 
561 		/*
562 		 * sc->sc_pp->channel_map() will also call wdcattach.
563 		 * Eventually the channel will be  disabled if there's no
564 		 * drive present. sc->hw_ok will be updated accordingly.
565 		 */
566 		sc->sc_pp->channel_map(pa, cp);
567 
568 	}
569 	/* Now that all drives are know, setup DMA, etc ...*/
570 	sc->sc_pp->setup_chip(sc);
571 	if (sc->sc_dma_ok) {
572 		csr = pci_conf_read(pc, tag, PCI_COMMAND_STATUS_REG);
573 		csr |= PCI_COMMAND_MASTER_ENABLE;
574 		pci_conf_write(pc, tag, PCI_COMMAND_STATUS_REG, csr);
575 	}
576 	WDCDEBUG_PRINT(("pciide: command/status register=%x\n",
577 	    pci_conf_read(pc, tag, PCI_COMMAND_STATUS_REG)), DEBUG_PROBE);
578 }
579 
580 int
581 pciide_mapregs_compat(pa, cp, compatchan, cmdsizep, ctlsizep)
582 	struct pci_attach_args *pa;
583 	struct pciide_channel *cp;
584 	int compatchan;
585 	bus_size_t *cmdsizep, *ctlsizep;
586 {
587 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
588 	struct channel_softc *wdc_cp = &cp->wdc_channel;
589 	int rv = 1;
590 
591 	cp->compat = 1;
592 	*cmdsizep = PCIIDE_COMPAT_CMD_SIZE;
593 	*ctlsizep = PCIIDE_COMPAT_CTL_SIZE;
594 
595 	wdc_cp->cmd_iot = pa->pa_iot;
596 	if (bus_space_map(wdc_cp->cmd_iot, PCIIDE_COMPAT_CMD_BASE(compatchan),
597 	    PCIIDE_COMPAT_CMD_SIZE, 0, &wdc_cp->cmd_ioh) != 0) {
598 		printf("%s: couldn't map %s channel cmd regs\n",
599 		    sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
600 		rv = 0;
601 	}
602 
603 	wdc_cp->ctl_iot = pa->pa_iot;
604 	if (bus_space_map(wdc_cp->ctl_iot, PCIIDE_COMPAT_CTL_BASE(compatchan),
605 	    PCIIDE_COMPAT_CTL_SIZE, 0, &wdc_cp->ctl_ioh) != 0) {
606 		printf("%s: couldn't map %s channel ctl regs\n",
607 		    sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
608 		bus_space_unmap(wdc_cp->cmd_iot, wdc_cp->cmd_ioh,
609 		    PCIIDE_COMPAT_CMD_SIZE);
610 		rv = 0;
611 	}
612 
613 	return (rv);
614 }
615 
616 int
617 pciide_mapregs_native(pa, cp, cmdsizep, ctlsizep)
618 	struct pci_attach_args * pa;
619 	struct pciide_channel *cp;
620 	bus_size_t *cmdsizep, *ctlsizep;
621 {
622 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
623 	struct channel_softc *wdc_cp = &cp->wdc_channel;
624 	const char *intrstr;
625 	pci_intr_handle_t intrhandle;
626 
627 	cp->compat = 0;
628 
629 	if (sc->sc_pci_ih == NULL) {
630 		if (pci_intr_map(pa->pa_pc, pa->pa_intrtag, pa->pa_intrpin,
631 		    pa->pa_intrline, &intrhandle) != 0) {
632 			printf("%s: couldn't map native-PCI interrupt\n",
633 			    sc->sc_wdcdev.sc_dev.dv_xname);
634 			return 0;
635 		}
636 		intrstr = pci_intr_string(pa->pa_pc, intrhandle);
637 		sc->sc_pci_ih = pci_intr_establish(pa->pa_pc,
638 		    intrhandle, IPL_BIO, pciide_pci_intr, sc);
639 		if (sc->sc_pci_ih != NULL) {
640 			printf("%s: using %s for native-PCI interrupt\n",
641 			    sc->sc_wdcdev.sc_dev.dv_xname,
642 			    intrstr ? intrstr : "unknown interrupt");
643 		} else {
644 			printf("%s: couldn't establish native-PCI interrupt",
645 			    sc->sc_wdcdev.sc_dev.dv_xname);
646 			if (intrstr != NULL)
647 				printf(" at %s", intrstr);
648 			printf("\n");
649 			return 0;
650 		}
651 	}
652 	cp->ih = sc->sc_pci_ih;
653 	if (pci_mapreg_map(pa, PCIIDE_REG_CMD_BASE(wdc_cp->channel),
654 	    PCI_MAPREG_TYPE_IO, 0,
655 	    &wdc_cp->cmd_iot, &wdc_cp->cmd_ioh, NULL, cmdsizep) != 0) {
656 		printf("%s: couldn't map %s channel cmd regs\n",
657 		    sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
658 		return 0;
659 	}
660 
661 	if (pci_mapreg_map(pa, PCIIDE_REG_CTL_BASE(wdc_cp->channel),
662 	    PCI_MAPREG_TYPE_IO, 0,
663 	    &wdc_cp->ctl_iot, &wdc_cp->ctl_ioh, NULL, ctlsizep) != 0) {
664 		printf("%s: couldn't map %s channel ctl regs\n",
665 		    sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
666 		bus_space_unmap(wdc_cp->cmd_iot, wdc_cp->cmd_ioh, *cmdsizep);
667 		return 0;
668 	}
669 	return (1);
670 }
671 
672 int
673 pciide_compat_intr(arg)
674 	void *arg;
675 {
676 	struct pciide_channel *cp = arg;
677 
678 #ifdef DIAGNOSTIC
679 	/* should only be called for a compat channel */
680 	if (cp->compat == 0)
681 		panic("pciide compat intr called for non-compat chan %p\n", cp);
682 #endif
683 	return (wdcintr(&cp->wdc_channel));
684 }
685 
686 int
687 pciide_pci_intr(arg)
688 	void *arg;
689 {
690 	struct pciide_softc *sc = arg;
691 	struct pciide_channel *cp;
692 	struct channel_softc *wdc_cp;
693 	int i, rv, crv;
694 
695 	rv = 0;
696 	for (i = 0; i < sc->sc_wdcdev.nchannels; i++) {
697 		cp = &sc->pciide_channels[i];
698 		wdc_cp = &cp->wdc_channel;
699 
700 		/* If a compat channel skip. */
701 		if (cp->compat)
702 			continue;
703 		/* if this channel not waiting for intr, skip */
704 		if ((wdc_cp->ch_flags & WDCF_IRQ_WAIT) == 0)
705 			continue;
706 
707 		crv = wdcintr(wdc_cp);
708 		if (crv == 0)
709 			;		/* leave rv alone */
710 		else if (crv == 1)
711 			rv = 1;		/* claim the intr */
712 		else if (rv == 0)	/* crv should be -1 in this case */
713 			rv = crv;	/* if we've done no better, take it */
714 	}
715 	return (rv);
716 }
717 
718 void
719 pciide_channel_dma_setup(cp)
720 	struct pciide_channel *cp;
721 {
722 	int drive;
723 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
724 	struct ata_drive_datas *drvp;
725 
726 	for (drive = 0; drive < 2; drive++) {
727 		drvp = &cp->wdc_channel.ch_drive[drive];
728 		/* If no drive, skip */
729 		if ((drvp->drive_flags & DRIVE) == 0)
730 			continue;
731 		/* setup DMA if needed */
732 		if (((drvp->drive_flags & DRIVE_DMA) == 0 &&
733 		    (drvp->drive_flags & DRIVE_UDMA) == 0) ||
734 		    sc->sc_dma_ok == 0) {
735 			drvp->drive_flags &= ~(DRIVE_DMA | DRIVE_UDMA);
736 			continue;
737 		}
738 		if (pciide_dma_table_setup(sc, cp->wdc_channel.channel, drive)
739 		    != 0) {
740 			/* Abort DMA setup */
741 			drvp->drive_flags &= ~(DRIVE_DMA | DRIVE_UDMA);
742 			continue;
743 		}
744 	}
745 }
746 
747 int
748 pciide_dma_table_setup(sc, channel, drive)
749 	struct pciide_softc *sc;
750 	int channel, drive;
751 {
752 	bus_dma_segment_t seg;
753 	int error, rseg;
754 	const bus_size_t dma_table_size =
755 	    sizeof(struct idedma_table) * NIDEDMA_TABLES;
756 	struct pciide_dma_maps *dma_maps =
757 	    &sc->pciide_channels[channel].dma_maps[drive];
758 
759 	/* If table was already allocated, just return */
760 	if (dma_maps->dma_table)
761 		return 0;
762 
763 	/* Allocate memory for the DMA tables and map it */
764 	if ((error = bus_dmamem_alloc(sc->sc_dmat, dma_table_size,
765 	    IDEDMA_TBL_ALIGN, IDEDMA_TBL_ALIGN, &seg, 1, &rseg,
766 	    BUS_DMA_NOWAIT)) != 0) {
767 		printf("%s:%d: unable to allocate table DMA for "
768 		    "drive %d, error=%d\n", sc->sc_wdcdev.sc_dev.dv_xname,
769 		    channel, drive, error);
770 		return error;
771 	}
772 	if ((error = bus_dmamem_map(sc->sc_dmat, &seg, rseg,
773 	    dma_table_size,
774 	    (caddr_t *)&dma_maps->dma_table,
775 	    BUS_DMA_NOWAIT|BUS_DMA_COHERENT)) != 0) {
776 		printf("%s:%d: unable to map table DMA for"
777 		    "drive %d, error=%d\n", sc->sc_wdcdev.sc_dev.dv_xname,
778 		    channel, drive, error);
779 		return error;
780 	}
781 	WDCDEBUG_PRINT(("pciide_dma_table_setup: table at %p len %ld, "
782 	    "phy 0x%lx\n", dma_maps->dma_table, dma_table_size,
783 	    seg.ds_addr), DEBUG_PROBE);
784 
785 	/* Create and load table DMA map for this disk */
786 	if ((error = bus_dmamap_create(sc->sc_dmat, dma_table_size,
787 	    1, dma_table_size, IDEDMA_TBL_ALIGN, BUS_DMA_NOWAIT,
788 	    &dma_maps->dmamap_table)) != 0) {
789 		printf("%s:%d: unable to create table DMA map for "
790 		    "drive %d, error=%d\n", sc->sc_wdcdev.sc_dev.dv_xname,
791 		    channel, drive, error);
792 		return error;
793 	}
794 	if ((error = bus_dmamap_load(sc->sc_dmat,
795 	    dma_maps->dmamap_table,
796 	    dma_maps->dma_table,
797 	    dma_table_size, NULL, BUS_DMA_NOWAIT)) != 0) {
798 		printf("%s:%d: unable to load table DMA map for "
799 		    "drive %d, error=%d\n", sc->sc_wdcdev.sc_dev.dv_xname,
800 		    channel, drive, error);
801 		return error;
802 	}
803 	WDCDEBUG_PRINT(("pciide_dma_table_setup: phy addr of table 0x%lx\n",
804 	    dma_maps->dmamap_table->dm_segs[0].ds_addr), DEBUG_PROBE);
805 	/* Create a xfer DMA map for this drive */
806 	if ((error = bus_dmamap_create(sc->sc_dmat, IDEDMA_BYTE_COUNT_MAX,
807 	    NIDEDMA_TABLES, IDEDMA_BYTE_COUNT_MAX, IDEDMA_BYTE_COUNT_ALIGN,
808 	    BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW,
809 	    &dma_maps->dmamap_xfer)) != 0) {
810 		printf("%s:%d: unable to create xfer DMA map for "
811 		    "drive %d, error=%d\n", sc->sc_wdcdev.sc_dev.dv_xname,
812 		    channel, drive, error);
813 		return error;
814 	}
815 	return 0;
816 }
817 
818 int
819 pciide_dma_init(v, channel, drive, databuf, datalen, flags)
820 	void *v;
821 	int channel, drive;
822 	void *databuf;
823 	size_t datalen;
824 	int flags;
825 {
826 	struct pciide_softc *sc = v;
827 	int error, seg;
828 	struct pciide_dma_maps *dma_maps =
829 	    &sc->pciide_channels[channel].dma_maps[drive];
830 
831 	error = bus_dmamap_load(sc->sc_dmat,
832 	    dma_maps->dmamap_xfer,
833 	    databuf, datalen, NULL, BUS_DMA_NOWAIT);
834 	if (error) {
835 		printf("%s:%d: unable to load xfer DMA map for"
836 		    "drive %d, error=%d\n", sc->sc_wdcdev.sc_dev.dv_xname,
837 		    channel, drive, error);
838 		return error;
839 	}
840 
841 	bus_dmamap_sync(sc->sc_dmat, dma_maps->dmamap_xfer, 0,
842 	    dma_maps->dmamap_xfer->dm_mapsize,
843 	    (flags & WDC_DMA_READ) ?
844 	    BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE);
845 
846 	for (seg = 0; seg < dma_maps->dmamap_xfer->dm_nsegs; seg++) {
847 #ifdef DIAGNOSTIC
848 		/* A segment must not cross a 64k boundary */
849 		{
850 		u_long phys = dma_maps->dmamap_xfer->dm_segs[seg].ds_addr;
851 		u_long len = dma_maps->dmamap_xfer->dm_segs[seg].ds_len;
852 		if ((phys & ~IDEDMA_BYTE_COUNT_MASK) !=
853 		    ((phys + len - 1) & ~IDEDMA_BYTE_COUNT_MASK)) {
854 			printf("pciide_dma: segment %d physical addr 0x%lx"
855 			    " len 0x%lx not properly aligned\n",
856 			    seg, phys, len);
857 			panic("pciide_dma: buf align");
858 		}
859 		}
860 #endif
861 		dma_maps->dma_table[seg].base_addr =
862 		    dma_maps->dmamap_xfer->dm_segs[seg].ds_addr;
863 		dma_maps->dma_table[seg].byte_count =
864 		    dma_maps->dmamap_xfer->dm_segs[seg].ds_len &
865 		    IDEDMA_BYTE_COUNT_MASK;
866 		WDCDEBUG_PRINT(("\t seg %d len %d addr 0x%x\n",
867 		   seg, dma_maps->dma_table[seg].byte_count,
868 		   dma_maps->dma_table[seg].base_addr), DEBUG_DMA);
869 
870 	}
871 	dma_maps->dma_table[dma_maps->dmamap_xfer->dm_nsegs -1].byte_count |=
872 		IDEDMA_BYTE_COUNT_EOT;
873 
874 	bus_dmamap_sync(sc->sc_dmat, dma_maps->dmamap_table, 0,
875 	    dma_maps->dmamap_table->dm_mapsize,
876 	    BUS_DMASYNC_PREWRITE);
877 
878 	/* Maps are ready. Start DMA function */
879 #ifdef DIAGNOSTIC
880 	if (dma_maps->dmamap_table->dm_segs[0].ds_addr & ~IDEDMA_TBL_MASK) {
881 		printf("pciide_dma_init: addr 0x%lx not properly aligned\n",
882 		    dma_maps->dmamap_table->dm_segs[0].ds_addr);
883 		panic("pciide_dma_init: table align");
884 	}
885 #endif
886 
887 	/* Clear status bits */
888 	bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
889 	    IDEDMA_CTL + IDEDMA_SCH_OFFSET * channel,
890 	    bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh,
891 		IDEDMA_CTL + IDEDMA_SCH_OFFSET * channel));
892 	/* Write table addr */
893 	bus_space_write_4(sc->sc_dma_iot, sc->sc_dma_ioh,
894 	    IDEDMA_TBL + IDEDMA_SCH_OFFSET * channel,
895 	    dma_maps->dmamap_table->dm_segs[0].ds_addr);
896 	/* set read/write */
897 	bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
898 	    IDEDMA_CMD + IDEDMA_SCH_OFFSET * channel,
899 	    (flags & WDC_DMA_READ) ? IDEDMA_CMD_WRITE: 0);
900 	return 0;
901 }
902 
903 void
904 pciide_dma_start(v, channel, drive, flags)
905 	void *v;
906 	int channel, drive, flags;
907 {
908 	struct pciide_softc *sc = v;
909 
910 	WDCDEBUG_PRINT(("pciide_dma_start\n"),DEBUG_XFERS);
911 	bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
912 	    IDEDMA_CMD + IDEDMA_SCH_OFFSET * channel,
913 	    bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh,
914 		IDEDMA_CMD + IDEDMA_SCH_OFFSET * channel) | IDEDMA_CMD_START);
915 }
916 
917 int
918 pciide_dma_finish(v, channel, drive, flags)
919 	void *v;
920 	int channel, drive;
921 	int flags;
922 {
923 	struct pciide_softc *sc = v;
924 	u_int8_t status;
925 	struct pciide_dma_maps *dma_maps =
926 	    &sc->pciide_channels[channel].dma_maps[drive];
927 
928 	/* Unload the map of the data buffer */
929 	bus_dmamap_sync(sc->sc_dmat, dma_maps->dmamap_xfer, 0,
930 	    dma_maps->dmamap_xfer->dm_mapsize,
931 	    (flags & WDC_DMA_READ) ?
932 	    BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE);
933 	bus_dmamap_unload(sc->sc_dmat, dma_maps->dmamap_xfer);
934 
935 	status = bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh,
936 	    IDEDMA_CTL + IDEDMA_SCH_OFFSET * channel);
937 	WDCDEBUG_PRINT(("pciide_dma_finish: status 0x%x\n", status),
938 	    DEBUG_XFERS);
939 
940 	/* stop DMA channel */
941 	bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
942 	    IDEDMA_CMD + IDEDMA_SCH_OFFSET * channel,
943 	    bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh,
944 		IDEDMA_CMD + IDEDMA_SCH_OFFSET * channel) & ~IDEDMA_CMD_START);
945 
946 	/* Clear status bits */
947 	bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
948 	    IDEDMA_CTL + IDEDMA_SCH_OFFSET * channel,
949 	    status);
950 
951 	if ((status & IDEDMA_CTL_ERR) != 0) {
952 		printf("%s:%d:%d: Bus-Master DMA error: status=0x%x\n",
953 		    sc->sc_wdcdev.sc_dev.dv_xname, channel, drive, status);
954 		return -1;
955 	}
956 
957 	if ((flags & WDC_DMA_POLL) == 0 && (status & IDEDMA_CTL_INTR) == 0) {
958 		printf("%s:%d:%d: Bus-Master DMA error: missing interrupt, "
959 		    "status=0x%x\n", sc->sc_wdcdev.sc_dev.dv_xname, channel,
960 		    drive, status);
961 		return -1;
962 	}
963 
964 	if ((status & IDEDMA_CTL_ACT) != 0) {
965 		/* data underrun, may be a valid condition for ATAPI */
966 		return 1;
967 	}
968 	return 0;
969 }
970 
971 /* some common code used by several chip channel_map */
972 void
973 pciide_mapchan(pa, cp, interface, cmdsizep, ctlsizep)
974 	struct pci_attach_args *pa;
975 	int interface;
976 	struct pciide_channel *cp;
977 	bus_size_t *cmdsizep, *ctlsizep;
978 {
979 	struct channel_softc *wdc_cp = &cp->wdc_channel;
980 
981 	if (interface & PCIIDE_INTERFACE_PCI(wdc_cp->channel))
982 		cp->hw_ok = pciide_mapregs_native(pa, cp, cmdsizep, ctlsizep);
983 	else
984 		cp->hw_ok = pciide_mapregs_compat(pa, cp,
985 		    wdc_cp->channel, cmdsizep, ctlsizep);
986 	if (cp->hw_ok == 0)
987 		return;
988 	wdc_cp->data32iot = wdc_cp->cmd_iot;
989 	wdc_cp->data32ioh = wdc_cp->cmd_ioh;
990 	wdcattach(wdc_cp);
991 }
992 
993 /*
994  * Generic code to call to know if a channel can be disabled. Return 1
995  * if channel can be disabled, 0 if not
996  */
997 int
998 pciiide_chan_candisable(cp)
999 	struct pciide_channel *cp;
1000 {
1001 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
1002 	struct channel_softc *wdc_cp = &cp->wdc_channel;
1003 
1004 	if ((wdc_cp->ch_drive[0].drive_flags & DRIVE) == 0 &&
1005 	    (wdc_cp->ch_drive[1].drive_flags & DRIVE) == 0) {
1006 		printf("%s: disabling %s channel (no drives)\n",
1007 		    sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
1008 		cp->hw_ok = 0;
1009 		return 1;
1010 	}
1011 	return 0;
1012 }
1013 
1014 /*
1015  * generic code to map the compat intr if hw_ok=1 and it is a compat channel.
1016  * Set hw_ok=0 on failure
1017  */
1018 void
1019 pciide_map_compat_intr(pa, cp, compatchan, interface)
1020 	struct pci_attach_args *pa;
1021 	struct pciide_channel *cp;
1022 	int compatchan, interface;
1023 {
1024 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
1025 	struct channel_softc *wdc_cp = &cp->wdc_channel;
1026 
1027 	if (cp->hw_ok == 0)
1028 		return;
1029 	if ((interface & PCIIDE_INTERFACE_PCI(wdc_cp->channel)) != 0)
1030 		return;
1031 
1032 	cp->ih = pciide_machdep_compat_intr_establish(&sc->sc_wdcdev.sc_dev,
1033 	    pa, compatchan, pciide_compat_intr, cp);
1034 	if (cp->ih == NULL) {
1035 		printf("%s: no compatibility interrupt for use by %s "
1036 		    "channel\n", sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
1037 		cp->hw_ok = 0;
1038 	}
1039 }
1040 
1041 void
1042 pciide_print_modes(cp)
1043 	struct pciide_channel *cp;
1044 {
1045 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
1046 	int drive;
1047 	struct channel_softc *chp;
1048 	struct ata_drive_datas *drvp;
1049 
1050 	chp = &cp->wdc_channel;
1051 	for (drive = 0; drive < 2; drive++) {
1052 		drvp = &chp->ch_drive[drive];
1053 		if ((drvp->drive_flags & DRIVE) == 0)
1054 			continue;
1055 		printf("%s(%s:%d:%d): using PIO mode %d",
1056 		    drvp->drv_softc->dv_xname,
1057 		    sc->sc_wdcdev.sc_dev.dv_xname,
1058 		    chp->channel, drive, drvp->PIO_mode);
1059 		if (drvp->drive_flags & DRIVE_DMA)
1060 			printf(", DMA mode %d", drvp->DMA_mode);
1061 		if (drvp->drive_flags & DRIVE_UDMA)
1062 			printf(", Ultra-DMA mode %d", drvp->UDMA_mode);
1063 		if (drvp->drive_flags & (DRIVE_DMA | DRIVE_UDMA))
1064 			printf(" (using DMA data transfers)");
1065 		printf("\n");
1066 	}
1067 }
1068 
1069 void
1070 default_setup_cap(sc)
1071 	struct pciide_softc *sc;
1072 {
1073 	if (sc->sc_dma_ok)
1074 		sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA;
1075 	sc->sc_wdcdev.PIO_cap = 0;
1076 	sc->sc_wdcdev.DMA_cap = 0;
1077 }
1078 
1079 void
1080 default_setup_chip(sc)
1081 	struct pciide_softc *sc;
1082 {
1083 	int channel, drive, idedma_ctl;
1084 	struct channel_softc *chp;
1085 	struct ata_drive_datas *drvp;
1086 
1087 	if (sc->sc_dma_ok == 0)
1088 		return; /* nothing to do */
1089 
1090 	/* Allocate DMA maps */
1091 	for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
1092 		idedma_ctl = 0;
1093 		chp = &sc->pciide_channels[channel].wdc_channel;
1094 		for (drive = 0; drive < 2; drive++) {
1095 			drvp = &chp->ch_drive[drive];
1096 			/* If no drive, skip */
1097 			if ((drvp->drive_flags & DRIVE) == 0)
1098 				continue;
1099 			if ((drvp->drive_flags & DRIVE_DMA) == 0)
1100 				continue;
1101 			if (pciide_dma_table_setup(sc, channel, drive) != 0) {
1102 				/* Abort DMA setup */
1103 				printf("%s:%d:%d: can't allocate DMA maps, "
1104 				    "using PIO transfers\n",
1105 				    sc->sc_wdcdev.sc_dev.dv_xname,
1106 				    channel, drive);
1107 				drvp->drive_flags &= ~DRIVE_DMA;
1108 			}
1109 			printf("%s:%d:%d: using DMA data tranferts\n",
1110 			    sc->sc_wdcdev.sc_dev.dv_xname,
1111 			    channel, drive);
1112 			idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
1113 		}
1114 		if (idedma_ctl != 0) {
1115 			/* Add software bits in status register */
1116 			bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
1117 			    IDEDMA_CTL + (IDEDMA_SCH_OFFSET * channel),
1118 			    idedma_ctl);
1119 		}
1120 	}
1121 
1122 }
1123 
1124 void
1125 default_channel_map(pa, cp)
1126 	struct pci_attach_args *pa;
1127 	struct pciide_channel *cp;
1128 {
1129 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
1130 	bus_size_t cmdsize, ctlsize;
1131 	pcireg_t csr;
1132 	const char *failreason = NULL;
1133 	struct channel_softc *wdc_cp = &cp->wdc_channel;
1134 	int interface =
1135 	    PCI_INTERFACE(pci_conf_read(sc->sc_pc, sc->sc_tag, PCI_CLASS_REG));
1136 
1137 	if (interface & PCIIDE_INTERFACE_PCI(wdc_cp->channel))
1138 		cp->hw_ok = pciide_mapregs_native(pa, cp, &cmdsize, &ctlsize);
1139 	else
1140 		cp->hw_ok = pciide_mapregs_compat(pa, cp, wdc_cp->channel,
1141 		    &cmdsize, &ctlsize);
1142 	if (cp->hw_ok == 0)
1143 		return;
1144 
1145 	/*
1146 	 * Check to see if something appears to be there.
1147 	 */
1148 	if (!wdcprobe(wdc_cp)) {
1149 		failreason = "not responding; disabled or no drives?";
1150 		goto out;
1151 	}
1152 
1153 	/*
1154 	 * Now, make sure it's actually attributable to this PCI IDE
1155 	 * channel by trying to access the channel again while the
1156 	 * PCI IDE controller's I/O space is disabled.  (If the
1157 	 * channel no longer appears to be there, it belongs to
1158 	 * this controller.)  YUCK!
1159 	 */
1160 	csr = pci_conf_read(sc->sc_pc, sc->sc_tag, PCI_COMMAND_STATUS_REG);
1161 	pci_conf_write(sc->sc_pc, sc->sc_tag, PCI_COMMAND_STATUS_REG,
1162 	    csr & ~PCI_COMMAND_IO_ENABLE);
1163 	if (wdcprobe(wdc_cp))
1164 		failreason = "other hardware responding at addresses";
1165 	pci_conf_write(sc->sc_pc, sc->sc_tag, PCI_COMMAND_STATUS_REG, csr);
1166 
1167 out:
1168 	if (failreason) {
1169 		printf("%s: %s channel ignored (%s)\n",
1170 		    sc->sc_wdcdev.sc_dev.dv_xname, cp->name,
1171 		    failreason);
1172 		cp->hw_ok = 0;
1173 		bus_space_unmap(wdc_cp->cmd_iot, wdc_cp->cmd_ioh, cmdsize);
1174 		bus_space_unmap(wdc_cp->ctl_iot, wdc_cp->ctl_ioh, ctlsize);
1175 	}
1176 	pciide_map_compat_intr(pa, cp, wdc_cp->channel, interface);
1177 	if (cp->hw_ok) {
1178 		wdc_cp->data32iot = wdc_cp->cmd_iot;
1179 		wdc_cp->data32ioh = wdc_cp->cmd_ioh;
1180 		wdcattach(wdc_cp);
1181 	}
1182 }
1183 
1184 void
1185 piix_setup_cap(sc)
1186 	struct pciide_softc *sc;
1187 {
1188 	if (sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82371AB_IDE)
1189 		sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA;
1190 	sc->sc_wdcdev.cap |= WDC_CAPABILITY_DATA32 | WDC_CAPABILITY_MODE |
1191 	    WDC_CAPABILITY_DMA;
1192 	sc->sc_wdcdev.PIO_cap = 4;
1193 	sc->sc_wdcdev.DMA_cap = 2;
1194 	sc->sc_wdcdev.UDMA_cap = 2;
1195 	if (sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82371SB_IDE ||
1196 	    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82371AB_IDE)
1197 		sc->sc_wdcdev.set_modes = piix3_4_setup_channel;
1198 	else
1199 		sc->sc_wdcdev.set_modes = piix_setup_channel;
1200 }
1201 
1202 void
1203 piix_setup_chip(sc)
1204 	struct pciide_softc *sc;
1205 {
1206 	u_int8_t channel;
1207 
1208 
1209 	WDCDEBUG_PRINT(("piix_setup_chip: old idetim=0x%x\n",
1210 	    pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_IDETIM)), DEBUG_PROBE);
1211 
1212 	for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
1213 		piix_setup_channel(&sc->pciide_channels[channel].wdc_channel);
1214 	}
1215 	WDCDEBUG_PRINT(("piix_setup_chip: idetim=0x%x\n",
1216 	    pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_IDETIM)), DEBUG_PROBE);
1217 }
1218 
1219 void
1220 piix_setup_channel(chp)
1221 	struct channel_softc *chp;
1222 {
1223 	u_int8_t mode[2], drive;
1224 	u_int32_t oidetim, idetim, idedma_ctl;
1225 	struct pciide_channel *cp = (struct pciide_channel*)chp;
1226 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
1227 	struct ata_drive_datas *drvp = cp->wdc_channel.ch_drive;
1228 
1229 	oidetim = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_IDETIM);
1230 	idetim = PIIX_IDETIM_CLEAR(oidetim, 0xffff, chp->channel);
1231 	idedma_ctl = 0;
1232 
1233 	/* set up new idetim: Enable IDE registers decode */
1234 	idetim = PIIX_IDETIM_SET(idetim, PIIX_IDETIM_IDE,
1235 	    chp->channel);
1236 
1237 	/* setup DMA */
1238 	pciide_channel_dma_setup(cp);
1239 
1240 	/*
1241 	 * Here we have to mess up with drives mode: PIIX can't have
1242 	 * different timings for master and slave drives.
1243 	 * We need to find the best combination.
1244 	 */
1245 
1246 	/* If both drives supports DMA, take the lower mode */
1247 	if ((drvp[0].drive_flags & DRIVE_DMA) &&
1248 	    (drvp[1].drive_flags & DRIVE_DMA)) {
1249 		mode[0] = mode[1] =
1250 		    min(drvp[0].DMA_mode, drvp[1].DMA_mode);
1251 		    drvp[0].DMA_mode = mode[0];
1252 		goto ok;
1253 	}
1254 	/*
1255 	 * If only one drive supports DMA, use its mode, and
1256 	 * put the other one in PIO mode 0 if mode not compatible
1257 	 */
1258 	if (drvp[0].drive_flags & DRIVE_DMA) {
1259 		mode[0] = drvp[0].DMA_mode;
1260 		mode[1] = drvp[1].PIO_mode;
1261 		if (piix_isp_pio[mode[1]] != piix_isp_dma[mode[0]] ||
1262 		    piix_rtc_pio[mode[1]] != piix_rtc_dma[mode[0]])
1263 			mode[1] = 0;
1264 		goto ok;
1265 	}
1266 	if (drvp[1].drive_flags & DRIVE_DMA) {
1267 		mode[1] = drvp[1].DMA_mode;
1268 		mode[0] = drvp[0].PIO_mode;
1269 		if (piix_isp_pio[mode[0]] != piix_isp_dma[mode[1]] ||
1270 		    piix_rtc_pio[mode[0]] != piix_rtc_dma[mode[1]])
1271 			mode[0] = 0;
1272 		goto ok;
1273 	}
1274 	/*
1275 	 * If both drives are not DMA, takes the lower mode, unless
1276 	 * one of them is PIO mode < 2
1277 	 */
1278 	if (drvp[0].PIO_mode < 2) {
1279 		mode[0] = 0;
1280 		mode[1] = drvp[1].PIO_mode;
1281 	} else if (drvp[1].PIO_mode < 2) {
1282 		mode[1] = 0;
1283 		mode[0] = drvp[0].PIO_mode;
1284 	} else {
1285 		mode[0] = mode[1] =
1286 		    min(drvp[1].PIO_mode, drvp[0].PIO_mode);
1287 	}
1288 ok:	/* The modes are setup */
1289 	for (drive = 0; drive < 2; drive++) {
1290 		if (drvp[drive].drive_flags & DRIVE_DMA) {
1291 			drvp[drive].DMA_mode = mode[drive];
1292 			idetim |= piix_setup_idetim_timings(
1293 			    mode[drive], 1, chp->channel);
1294 			goto end;
1295 		} else
1296 			drvp[drive].PIO_mode = mode[drive];
1297 	}
1298 	/* If we are there, none of the drives are DMA */
1299 	if (mode[0] >= 2)
1300 		idetim |= piix_setup_idetim_timings(
1301 		    mode[0], 0, chp->channel);
1302 	else
1303 		idetim |= piix_setup_idetim_timings(
1304 		    mode[1], 0, chp->channel);
1305 end:	/*
1306 	 * timing mode is now set up in the controller. Enable
1307 	 * it per-drive
1308 	 */
1309 	for (drive = 0; drive < 2; drive++) {
1310 		/* If no drive, skip */
1311 		if ((drvp[drive].drive_flags & DRIVE) == 0)
1312 			continue;
1313 		idetim |= piix_setup_idetim_drvs(&drvp[drive]);
1314 		if (drvp[drive].drive_flags & DRIVE_DMA)
1315 			idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
1316 	}
1317 	if (idedma_ctl != 0) {
1318 		/* Add software bits in status register */
1319 		bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
1320 		    IDEDMA_CTL + (IDEDMA_SCH_OFFSET * chp->channel),
1321 		    idedma_ctl);
1322 	}
1323 	pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_IDETIM, idetim);
1324 	pciide_print_modes(cp);
1325 }
1326 
1327 void
1328 piix3_4_setup_chip(sc)
1329 	struct pciide_softc *sc;
1330 {
1331 	int channel;
1332 
1333 	WDCDEBUG_PRINT(("piix3_4_setup_chip: old idetim=0x%x, sidetim=0x%x",
1334 	    pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_IDETIM),
1335 	    pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_SIDETIM)), DEBUG_PROBE);
1336 	if (sc->sc_wdcdev.cap & WDC_CAPABILITY_UDMA) {
1337 		WDCDEBUG_PRINT((", udamreg 0x%x",
1338 		    pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_UDMAREG)),
1339 		    DEBUG_PROBE);
1340 	}
1341 	WDCDEBUG_PRINT(("\n"), DEBUG_PROBE);
1342 
1343 	for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
1344 		piix3_4_setup_channel(
1345 		    &sc->pciide_channels[channel].wdc_channel);
1346 	}
1347 
1348 	WDCDEBUG_PRINT(("piix3_4_setup_chip: idetim=0x%x, sidetim=0x%x",
1349 	    pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_IDETIM),
1350 	    pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_SIDETIM)), DEBUG_PROBE);
1351 	if (sc->sc_wdcdev.cap & WDC_CAPABILITY_UDMA) {
1352 		WDCDEBUG_PRINT((", udmareg=0x%x",
1353 		pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_UDMAREG)),
1354 		DEBUG_PROBE);
1355 	}
1356 	WDCDEBUG_PRINT(("\n"), DEBUG_PROBE);
1357 }
1358 
1359 void
1360 piix3_4_setup_channel(chp)
1361 	struct channel_softc *chp;
1362 {
1363 	struct ata_drive_datas *drvp;
1364 	u_int32_t oidetim, idetim, sidetim, udmareg, idedma_ctl;
1365 	struct pciide_channel *cp = (struct pciide_channel*)chp;
1366 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
1367 	int drive;
1368 
1369 	oidetim = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_IDETIM);
1370 	sidetim = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_SIDETIM);
1371 	udmareg = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_UDMAREG);
1372 	idetim = PIIX_IDETIM_CLEAR(oidetim, 0xffff, chp->channel);
1373 	sidetim &= ~(PIIX_SIDETIM_ISP_MASK(chp->channel) |
1374 	    PIIX_SIDETIM_RTC_MASK(chp->channel));
1375 
1376 	idedma_ctl = 0;
1377 	/* If channel disabled, no need to go further */
1378 	if ((PIIX_IDETIM_READ(oidetim, chp->channel) & PIIX_IDETIM_IDE) == 0)
1379 		return;
1380 	/* set up new idetim: Enable IDE registers decode */
1381 	idetim = PIIX_IDETIM_SET(idetim, PIIX_IDETIM_IDE, chp->channel);
1382 
1383 	/* setup DMA if needed */
1384 	pciide_channel_dma_setup(cp);
1385 
1386 	for (drive = 0; drive < 2; drive++) {
1387 		udmareg &= ~(PIIX_UDMACTL_DRV_EN(chp->channel, drive) |
1388 		    PIIX_UDMATIM_SET(0x3, chp->channel, drive));
1389 		drvp = &chp->ch_drive[drive];
1390 		/* If no drive, skip */
1391 		if ((drvp->drive_flags & DRIVE) == 0)
1392 			continue;
1393 		if (((drvp->drive_flags & DRIVE_DMA) == 0 &&
1394 		    (drvp->drive_flags & DRIVE_UDMA) == 0))
1395 			goto pio;
1396 
1397 		if ((chp->wdc->cap & WDC_CAPABILITY_UDMA) &&
1398 		    (drvp->drive_flags & DRIVE_UDMA)) {
1399 			/* use Ultra/DMA */
1400 			drvp->drive_flags &= ~DRIVE_DMA;
1401 			udmareg |= PIIX_UDMACTL_DRV_EN(
1402 			    chp->channel, drive);
1403 			udmareg |= PIIX_UDMATIM_SET(
1404 			    piix4_sct_udma[drvp->UDMA_mode],
1405 			    chp->channel, drive);
1406 		} else {
1407 			/* use Multiword DMA */
1408 			drvp->drive_flags &= ~DRIVE_UDMA;
1409 			if (drive == 0) {
1410 				idetim |= piix_setup_idetim_timings(
1411 				    drvp->DMA_mode, 1, chp->channel);
1412 			} else {
1413 				sidetim |= piix_setup_sidetim_timings(
1414 					drvp->DMA_mode, 1, chp->channel);
1415 				idetim =PIIX_IDETIM_SET(idetim,
1416 				    PIIX_IDETIM_SITRE, chp->channel);
1417 			}
1418 		}
1419 		idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
1420 
1421 pio:		/* use PIO mode */
1422 		idetim |= piix_setup_idetim_drvs(drvp);
1423 		if (drive == 0) {
1424 			idetim |= piix_setup_idetim_timings(
1425 			    drvp->PIO_mode, 0, chp->channel);
1426 		} else {
1427 			sidetim |= piix_setup_sidetim_timings(
1428 				drvp->PIO_mode, 0, chp->channel);
1429 			idetim =PIIX_IDETIM_SET(idetim,
1430 			    PIIX_IDETIM_SITRE, chp->channel);
1431 		}
1432 	}
1433 	if (idedma_ctl != 0) {
1434 		/* Add software bits in status register */
1435 		bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
1436 		    IDEDMA_CTL + (IDEDMA_SCH_OFFSET * chp->channel),
1437 		    idedma_ctl);
1438 	}
1439 	pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_IDETIM, idetim);
1440 	pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_SIDETIM, sidetim);
1441 	pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_UDMAREG, udmareg);
1442 	pciide_print_modes(cp);
1443 }
1444 
1445 
1446 /* setup ISP and RTC fields, based on mode */
1447 static u_int32_t
1448 piix_setup_idetim_timings(mode, dma, channel)
1449 	u_int8_t mode;
1450 	u_int8_t dma;
1451 	u_int8_t channel;
1452 {
1453 
1454 	if (dma)
1455 		return PIIX_IDETIM_SET(0,
1456 		    PIIX_IDETIM_ISP_SET(piix_isp_dma[mode]) |
1457 		    PIIX_IDETIM_RTC_SET(piix_rtc_dma[mode]),
1458 		    channel);
1459 	else
1460 		return PIIX_IDETIM_SET(0,
1461 		    PIIX_IDETIM_ISP_SET(piix_isp_pio[mode]) |
1462 		    PIIX_IDETIM_RTC_SET(piix_rtc_pio[mode]),
1463 		    channel);
1464 }
1465 
1466 /* setup DTE, PPE, IE and TIME field based on PIO mode */
1467 static u_int32_t
1468 piix_setup_idetim_drvs(drvp)
1469 	struct ata_drive_datas *drvp;
1470 {
1471 	u_int32_t ret = 0;
1472 	struct channel_softc *chp = drvp->chnl_softc;
1473 	u_int8_t channel = chp->channel;
1474 	u_int8_t drive = drvp->drive;
1475 
1476 	/*
1477 	 * If drive is using UDMA, timings setups are independant
1478 	 * So just check DMA and PIO here.
1479 	 */
1480 	if (drvp->drive_flags & DRIVE_DMA) {
1481 		/* if mode = DMA mode 0, use compatible timings */
1482 		if ((drvp->drive_flags & DRIVE_DMA) &&
1483 		    drvp->DMA_mode == 0) {
1484 			drvp->PIO_mode = 0;
1485 			return ret;
1486 		}
1487 		ret = PIIX_IDETIM_SET(ret, PIIX_IDETIM_TIME(drive), channel);
1488 		/*
1489 		 * PIO and DMA timings are the same, use fast timings for PIO
1490 		 * too, else use compat timings.
1491 		 */
1492 		if ((piix_isp_pio[drvp->PIO_mode] !=
1493 		    piix_isp_dma[drvp->DMA_mode]) ||
1494 		    (piix_rtc_pio[drvp->PIO_mode] !=
1495 		    piix_rtc_dma[drvp->DMA_mode]))
1496 			drvp->PIO_mode = 0;
1497 		/* if PIO mode <= 2, use compat timings for PIO */
1498 		if (drvp->PIO_mode <= 2) {
1499 			ret = PIIX_IDETIM_SET(ret, PIIX_IDETIM_DTE(drive),
1500 			    channel);
1501 			return ret;
1502 		}
1503 	}
1504 
1505 	/*
1506 	 * Now setup PIO modes. If mode < 2, use compat timings.
1507 	 * Else enable fast timings. Enable IORDY and prefetch/post
1508 	 * if PIO mode >= 3.
1509 	 */
1510 
1511 	if (drvp->PIO_mode < 2)
1512 		return ret;
1513 
1514 	ret = PIIX_IDETIM_SET(ret, PIIX_IDETIM_TIME(drive), channel);
1515 	if (drvp->PIO_mode >= 3) {
1516 		ret = PIIX_IDETIM_SET(ret, PIIX_IDETIM_IE(drive), channel);
1517 		ret = PIIX_IDETIM_SET(ret, PIIX_IDETIM_PPE(drive), channel);
1518 	}
1519 	return ret;
1520 }
1521 
1522 /* setup values in SIDETIM registers, based on mode */
1523 static u_int32_t
1524 piix_setup_sidetim_timings(mode, dma, channel)
1525 	u_int8_t mode;
1526 	u_int8_t dma;
1527 	u_int8_t channel;
1528 {
1529 	if (dma)
1530 		return PIIX_SIDETIM_ISP_SET(piix_isp_dma[mode], channel) |
1531 		    PIIX_SIDETIM_RTC_SET(piix_rtc_dma[mode], channel);
1532 	else
1533 		return PIIX_SIDETIM_ISP_SET(piix_isp_pio[mode], channel) |
1534 		    PIIX_SIDETIM_RTC_SET(piix_rtc_pio[mode], channel);
1535 }
1536 
1537 void
1538 piix_channel_map(pa, cp)
1539 	struct pci_attach_args *pa;
1540 	struct pciide_channel *cp;
1541 {
1542 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
1543 	bus_size_t cmdsize, ctlsize;
1544 	struct channel_softc *wdc_cp = &cp->wdc_channel;
1545 	u_int32_t idetim = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_IDETIM);
1546 
1547 	if ((PIIX_IDETIM_READ(idetim, wdc_cp->channel) &
1548 	    PIIX_IDETIM_IDE) == 0) {
1549 		printf("%s: %s channel ignored (disabled)\n",
1550 		    sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
1551 		return;
1552 	}
1553 
1554 	/* PIIX are compat-only pciide devices */
1555 	pciide_mapchan(pa, cp, 0, &cmdsize, &ctlsize);
1556 	if (cp->hw_ok == 0)
1557 		return;
1558 	if (pciiide_chan_candisable(cp)) {
1559 		idetim = PIIX_IDETIM_CLEAR(idetim, PIIX_IDETIM_IDE,
1560 					   wdc_cp->channel);
1561 		pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_IDETIM, idetim);
1562 	}
1563 	pciide_map_compat_intr(pa, cp, wdc_cp->channel, 0);
1564 }
1565 
1566 void
1567 apollo_setup_cap(sc)
1568 	struct pciide_softc *sc;
1569 {
1570 	if (sc->sc_pp->ide_product == PCI_PRODUCT_VIATECH_VT82C586A_IDE)
1571 		sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA;
1572 	sc->sc_wdcdev.cap |= WDC_CAPABILITY_DATA32 | WDC_CAPABILITY_MODE |
1573 	    WDC_CAPABILITY_DMA;
1574 	sc->sc_wdcdev.PIO_cap = 4;
1575 	sc->sc_wdcdev.DMA_cap = 2;
1576 	sc->sc_wdcdev.UDMA_cap = 2;
1577 	sc->sc_wdcdev.set_modes = apollo_setup_channel;
1578 
1579 }
1580 
1581 void
1582 apollo_setup_chip(sc)
1583 	struct pciide_softc *sc;
1584 {
1585 	int channel;
1586 
1587 	WDCDEBUG_PRINT(("apollo_setup_chip: old APO_IDECONF=0x%x, "
1588 	    "APO_CTLMISC=0x%x, APO_DATATIM=0x%x, APO_UDMA=0x%x\n",
1589 	    pci_conf_read(sc->sc_pc, sc->sc_tag, APO_IDECONF),
1590 	    pci_conf_read(sc->sc_pc, sc->sc_tag, APO_CTLMISC),
1591 	    pci_conf_read(sc->sc_pc, sc->sc_tag, APO_DATATIM),
1592 	    pci_conf_read(sc->sc_pc, sc->sc_tag, APO_UDMA)),
1593 	    DEBUG_PROBE);
1594 
1595 	for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
1596 		apollo_setup_channel(&sc->pciide_channels[channel].wdc_channel);
1597 	}
1598 	WDCDEBUG_PRINT(("apollo_setup_chip: APO_DATATIM=0x%x, APO_UDMA=0x%x\n",
1599 	    pci_conf_read(sc->sc_pc, sc->sc_tag, APO_DATATIM),
1600 	    pci_conf_read(sc->sc_pc, sc->sc_tag, APO_UDMA)), DEBUG_PROBE);
1601 }
1602 
1603 void
1604 apollo_setup_channel(chp)
1605 	struct channel_softc *chp;
1606 {
1607 	u_int32_t udmatim_reg, datatim_reg;
1608 	u_int8_t idedma_ctl;
1609 	int mode, drive;
1610 	struct ata_drive_datas *drvp;
1611 	struct pciide_channel *cp = (struct pciide_channel*)chp;
1612 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
1613 
1614 	idedma_ctl = 0;
1615 	datatim_reg = pci_conf_read(sc->sc_pc, sc->sc_tag, APO_DATATIM);
1616 	udmatim_reg = pci_conf_read(sc->sc_pc, sc->sc_tag, APO_UDMA);
1617 	datatim_reg &= ~APO_DATATIM_MASK(chp->channel);
1618 	udmatim_reg &= ~AP0_UDMA_MASK(chp->channel);
1619 
1620 	/* setup DMA if needed */
1621 	pciide_channel_dma_setup(cp);
1622 
1623 	for (drive = 0; drive < 2; drive++) {
1624 		drvp = &chp->ch_drive[drive];
1625 		/* If no drive, skip */
1626 		if ((drvp->drive_flags & DRIVE) == 0)
1627 			continue;
1628 		/* add timing values, setup DMA if needed */
1629 		if (((drvp->drive_flags & DRIVE_DMA) == 0 &&
1630 		    (drvp->drive_flags & DRIVE_UDMA) == 0)) {
1631 			mode = drvp->PIO_mode;
1632 			goto pio;
1633 		}
1634 		if ((chp->wdc->cap & WDC_CAPABILITY_UDMA) &&
1635 		    (drvp->drive_flags & DRIVE_UDMA)) {
1636 			/* use Ultra/DMA */
1637 			drvp->drive_flags &= ~DRIVE_DMA;
1638 			udmatim_reg |= APO_UDMA_EN(chp->channel, drive) |
1639 			    APO_UDMA_EN_MTH(chp->channel, drive) |
1640 			    APO_UDMA_TIME(chp->channel, drive,
1641 				apollo_udma_tim[drvp->UDMA_mode]);
1642 			/* can use PIO timings, MW DMA unused */
1643 			mode = drvp->PIO_mode;
1644 		} else {
1645 			/* use Multiword DMA */
1646 			drvp->drive_flags &= ~DRIVE_UDMA;
1647 			/* mode = min(pio, dma+2) */
1648 			if (drvp->PIO_mode <= (drvp->DMA_mode +2))
1649 				mode = drvp->PIO_mode;
1650 			else
1651 				mode = drvp->DMA_mode;
1652 		}
1653 		idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
1654 
1655 pio:		/* setup PIO mode */
1656 		datatim_reg |=
1657 		    APO_DATATIM_PULSE(chp->channel, drive,
1658 			apollo_pio_set[mode]) |
1659 		    APO_DATATIM_RECOV(chp->channel, drive,
1660 			apollo_pio_rec[mode]);
1661 		drvp->PIO_mode = mode;
1662 		drvp->DMA_mode = mode - 2;
1663 	}
1664 	if (idedma_ctl != 0) {
1665 		/* Add software bits in status register */
1666 		bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
1667 		    IDEDMA_CTL + (IDEDMA_SCH_OFFSET * chp->channel),
1668 		    idedma_ctl);
1669 	}
1670 	pciide_print_modes(cp);
1671 	pci_conf_write(sc->sc_pc, sc->sc_tag, APO_DATATIM, datatim_reg);
1672 	pci_conf_write(sc->sc_pc, sc->sc_tag, APO_UDMA, udmatim_reg);
1673 }
1674 
1675 void
1676 apollo_channel_map(pa, cp)
1677 	struct pci_attach_args *pa;
1678 	struct pciide_channel *cp;
1679 {
1680 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
1681 	bus_size_t cmdsize, ctlsize;
1682 	struct channel_softc *wdc_cp = &cp->wdc_channel;
1683 	u_int32_t ideconf = pci_conf_read(sc->sc_pc, sc->sc_tag, APO_IDECONF);
1684 	int interface =
1685 	    PCI_INTERFACE(pci_conf_read(sc->sc_pc, sc->sc_tag, PCI_CLASS_REG));
1686 
1687 	if ((ideconf & APO_IDECONF_EN(wdc_cp->channel)) == 0) {
1688 		printf("%s: %s channel ignored (disabled)\n",
1689 		    sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
1690 		return;
1691 	}
1692 
1693 	pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize);
1694 	if (cp->hw_ok == 0)
1695 		return;
1696 	if (pciiide_chan_candisable(cp)) {
1697 		ideconf &= ~APO_IDECONF_EN(wdc_cp->channel);
1698 		pci_conf_write(sc->sc_pc, sc->sc_tag, APO_IDECONF, ideconf);
1699 	}
1700 	pciide_map_compat_intr(pa, cp, wdc_cp->channel, interface);
1701 }
1702 
1703 void
1704 cmd_channel_map(pa, cp)
1705 	struct pci_attach_args *pa;
1706 	struct pciide_channel *cp;
1707 {
1708 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
1709 	bus_size_t cmdsize, ctlsize;
1710 	struct channel_softc *wdc_cp = &cp->wdc_channel;
1711 	u_int8_t ctrl = pciide_pci_read(sc->sc_pc, sc->sc_tag, CMD_CTRL);
1712 	int interface =
1713 	    PCI_INTERFACE(pci_conf_read(sc->sc_pc, sc->sc_tag, PCI_CLASS_REG));
1714 
1715 	/*
1716 	 * with a CMD PCI64x, if we get here, the first channel is enabled:
1717 	 * there's no way to disable the first channel without disabling
1718 	 * the whole device
1719 	 */
1720 	if (wdc_cp->channel != 0 && (ctrl & CMD_CTRL_2PORT) == 0) {
1721 		printf("%s: %s channel ignored (disabled)\n",
1722 		    sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
1723 		return;
1724 	}
1725 
1726 	pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize);
1727 	if (cp->hw_ok == 0)
1728 		return;
1729 	if (wdc_cp->channel == 1) {
1730 		if (pciiide_chan_candisable(cp)) {
1731 			ctrl &= ~CMD_CTRL_2PORT;
1732 			pciide_pci_write(pa->pa_pc, pa->pa_tag,
1733 			    CMD_CTRL, ctrl);
1734 		}
1735 	}
1736 	pciide_map_compat_intr(pa, cp, wdc_cp->channel, interface);
1737 }
1738 
1739 void
1740 cmd0643_6_setup_cap(sc)
1741 	struct pciide_softc *sc;
1742 {
1743 	sc->sc_wdcdev.cap |= WDC_CAPABILITY_DATA32 | WDC_CAPABILITY_MODE |
1744 	    WDC_CAPABILITY_DMA;
1745 	sc->sc_wdcdev.PIO_cap = 4;
1746 	sc->sc_wdcdev.DMA_cap = 2;
1747 	sc->sc_wdcdev.set_modes = cmd0643_6_setup_channel;
1748 }
1749 
1750 void
1751 cmd0643_6_setup_chip(sc)
1752 	struct pciide_softc *sc;
1753 {
1754 	int channel;
1755 
1756 	WDCDEBUG_PRINT(("cmd0643_6_setup_chip: old timings reg 0x%x 0x%x\n",
1757 		pci_conf_read(sc->sc_pc, sc->sc_tag, 0x54),
1758 		pci_conf_read(sc->sc_pc, sc->sc_tag, 0x58)),
1759 		DEBUG_PROBE);
1760 	for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
1761 		cmd0643_6_setup_channel(
1762 		    &sc->pciide_channels[channel].wdc_channel);
1763 	}
1764 	/* configure for DMA read multiple */
1765 	pciide_pci_write(sc->sc_pc, sc->sc_tag, CMD_DMA_MODE, CMD_DMA_MULTIPLE);
1766 	WDCDEBUG_PRINT(("cmd0643_6_setup_chip: timings reg now 0x%x 0x%x\n",
1767 	    pci_conf_read(sc->sc_pc, sc->sc_tag, 0x54),
1768 	    pci_conf_read(sc->sc_pc, sc->sc_tag, 0x58)),
1769 	    DEBUG_PROBE);
1770 }
1771 
1772 void
1773 cmd0643_6_setup_channel(chp)
1774 	struct channel_softc *chp;
1775 {
1776 	struct ata_drive_datas *drvp;
1777 	u_int8_t tim;
1778 	u_int32_t idedma_ctl;
1779 	int drive;
1780 	struct pciide_channel *cp = (struct pciide_channel*)chp;
1781 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
1782 
1783 	idedma_ctl = 0;
1784 	/* setup DMA if needed */
1785 	pciide_channel_dma_setup(cp);
1786 
1787 	for (drive = 0; drive < 2; drive++) {
1788 		drvp = &chp->ch_drive[drive];
1789 		/* If no drive, skip */
1790 		if ((drvp->drive_flags & DRIVE) == 0)
1791 			continue;
1792 		/* add timing values, setup DMA if needed */
1793 		tim = cmd0643_6_data_tim_pio[drvp->PIO_mode];
1794 		if (drvp->drive_flags & DRIVE_DMA) {
1795 			/*
1796 			 * use Multiword DMA.
1797 			 * Timings will be used for both PIO and DMA, so adjust
1798 			 * DMA mode if needed
1799 			 */
1800 			if (drvp->PIO_mode >= 3 &&
1801 			    (drvp->DMA_mode + 2) > drvp->PIO_mode) {
1802 				drvp->DMA_mode = drvp->PIO_mode - 2;
1803 			}
1804 			tim = cmd0643_6_data_tim_dma[drvp->DMA_mode];
1805 			idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
1806 		}
1807 		pciide_pci_write(sc->sc_pc, sc->sc_tag,
1808 		    CMD_DATA_TIM(chp->channel, drive), tim);
1809 	}
1810 	if (idedma_ctl != 0) {
1811 		/* Add software bits in status register */
1812 		bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
1813 		    IDEDMA_CTL + (IDEDMA_SCH_OFFSET * chp->channel),
1814 		    idedma_ctl);
1815 	}
1816 	pciide_print_modes(cp);
1817 }
1818 
1819 void
1820 cy693_setup_cap(sc)
1821 	struct pciide_softc *sc;
1822 {
1823 	sc->sc_wdcdev.cap |= WDC_CAPABILITY_DATA32 | WDC_CAPABILITY_MODE |
1824 	    WDC_CAPABILITY_DMA;
1825 	sc->sc_wdcdev.PIO_cap = 4;
1826 	sc->sc_wdcdev.DMA_cap = 2;
1827 	sc->sc_wdcdev.set_modes = cy693_setup_channel;
1828 }
1829 
1830 void
1831 cy693_setup_chip(sc)
1832 	struct pciide_softc *sc;
1833 {
1834 	WDCDEBUG_PRINT(("cy693_setup_chip: old timings reg 0x%x\n",
1835 		pci_conf_read(sc->sc_pc, sc->sc_tag, CY_CMD_CTRL)),
1836 		DEBUG_PROBE);
1837 	cy693_setup_channel(&sc->pciide_channels[0].wdc_channel);
1838 	WDCDEBUG_PRINT(("cy693_setup_chip: new timings reg 0x%x\n",
1839 	    pci_conf_read(sc->sc_pc, sc->sc_tag, CY_CMD_CTRL)), DEBUG_PROBE);
1840 }
1841 
1842 void
1843 cy693_setup_channel(chp)
1844 	struct channel_softc *chp;
1845 {
1846 	struct ata_drive_datas *drvp;
1847 	int drive;
1848 	u_int32_t cy_cmd_ctrl;
1849 	u_int32_t idedma_ctl;
1850 	struct pciide_channel *cp = (struct pciide_channel*)chp;
1851 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
1852 
1853 	cy_cmd_ctrl = idedma_ctl = 0;
1854 
1855 	/* setup DMA if needed */
1856 	pciide_channel_dma_setup(cp);
1857 
1858 	for (drive = 0; drive < 2; drive++) {
1859 		drvp = &chp->ch_drive[drive];
1860 		/* If no drive, skip */
1861 		if ((drvp->drive_flags & DRIVE) == 0)
1862 			continue;
1863 		/* add timing values, setup DMA if needed */
1864 		if (drvp->drive_flags & DRIVE_DMA) {
1865 			idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
1866 			/*
1867 			 * use Multiword DMA
1868 			 * Timings will be used for both PIO and DMA, so adjust
1869 			 * DMA mode if needed
1870 			 */
1871 			if (drvp->PIO_mode > (drvp->DMA_mode + 2))
1872 				drvp->PIO_mode = drvp->DMA_mode + 2;
1873 			if (drvp->DMA_mode == 0)
1874 				drvp->PIO_mode = 0;
1875 		}
1876 		cy_cmd_ctrl |= (cy_pio_pulse[drvp->PIO_mode] <<
1877 		    CY_CMD_CTRL_IOW_PULSE_OFF(drive));
1878 		cy_cmd_ctrl |= (cy_pio_rec[drvp->PIO_mode] <<
1879 		    CY_CMD_CTRL_IOW_REC_OFF(drive));
1880 	}
1881 	pci_conf_write(sc->sc_pc, sc->sc_tag, CY_CMD_CTRL, cy_cmd_ctrl);
1882 	pciide_print_modes(cp);
1883 	if (idedma_ctl != 0) {
1884 		/* Add software bits in status register */
1885 		bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
1886 		    IDEDMA_CTL, idedma_ctl);
1887 	}
1888 }
1889 
1890 void
1891 cy693_channel_map(pa, cp)
1892 	struct pci_attach_args *pa;
1893 	struct pciide_channel *cp;
1894 {
1895 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
1896 	bus_size_t cmdsize, ctlsize;
1897 	struct channel_softc *wdc_cp = &cp->wdc_channel;
1898 	int interface =
1899 	    PCI_INTERFACE(pci_conf_read(sc->sc_pc, sc->sc_tag, PCI_CLASS_REG));
1900 	int compatchan;
1901 
1902 #ifdef DIAGNOSTIC
1903 	if (wdc_cp->channel != 0)
1904 		panic("cy693_channel_map: channel %d", wdc_cp->channel);
1905 #endif
1906 
1907 	/*
1908 	 * this chip has 2 PCI IDE functions, one for primary and one for
1909 	 * secondary. So we need to call pciide_mapregs_compat() with
1910 	 * the real channel
1911 	 */
1912 	if (pa->pa_function == 1) {
1913 		compatchan = 0;
1914 	} else if (pa->pa_function == 2) {
1915 		compatchan = 1;
1916 	} else {
1917 		printf("%s: unexpected PCI function %d\n",
1918 		    sc->sc_wdcdev.sc_dev.dv_xname, pa->pa_function);
1919 		cp->hw_ok = 0;
1920 		return;
1921 	}
1922 
1923 	/* Only one channel for this chip; if we are here it's enabled */
1924 	if (interface & PCIIDE_INTERFACE_PCI(0))
1925 		cp->hw_ok = pciide_mapregs_native(pa, cp, &cmdsize, &ctlsize);
1926 	else
1927 		cp->hw_ok = pciide_mapregs_compat(pa, cp, compatchan,
1928 		    &cmdsize, &ctlsize);
1929 	if (cp->hw_ok == 0)
1930 		return;
1931 	wdc_cp->data32iot = wdc_cp->cmd_iot;
1932 	wdc_cp->data32ioh = wdc_cp->cmd_ioh;
1933 	wdcattach(wdc_cp);
1934 	if (pciiide_chan_candisable(cp)) {
1935 		pci_conf_write(sc->sc_pc, sc->sc_tag,
1936 		    PCI_COMMAND_STATUS_REG, 0);
1937 	}
1938 	pciide_map_compat_intr(pa, cp, compatchan, interface);
1939 }
1940 
1941 void
1942 sis_setup_cap(sc)
1943 	struct pciide_softc *sc;
1944 {
1945 	sc->sc_wdcdev.cap |= WDC_CAPABILITY_DATA32 | WDC_CAPABILITY_MODE |
1946 	    WDC_CAPABILITY_DMA | WDC_CAPABILITY_UDMA;
1947 	sc->sc_wdcdev.PIO_cap = 4;
1948 	sc->sc_wdcdev.DMA_cap = 2;
1949 	sc->sc_wdcdev.UDMA_cap = 2;
1950 	sc->sc_wdcdev.set_modes = sis_setup_channel;
1951 }
1952 
1953 void
1954 sis_setup_chip(sc)
1955 	struct pciide_softc *sc;
1956 {
1957 	int channel;
1958 
1959 	for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
1960 		sis_setup_channel(&sc->pciide_channels[channel].wdc_channel);
1961 	}
1962 	pciide_pci_write(sc->sc_pc, sc->sc_tag, SIS_MISC,
1963 	    pciide_pci_read(sc->sc_pc, sc->sc_tag, SIS_MISC) |
1964 	    SIS_MISC_TIM_SEL | SIS_MISC_FIFO_SIZE);
1965 }
1966 
1967 void
1968 sis_setup_channel(chp)
1969 	struct channel_softc *chp;
1970 {
1971 	struct ata_drive_datas *drvp;
1972 	int drive;
1973 	u_int32_t sis_tim;
1974 	u_int32_t idedma_ctl;
1975 	struct pciide_channel *cp = (struct pciide_channel*)chp;
1976 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
1977 
1978 	WDCDEBUG_PRINT(("sis_setup_chip: old timings reg for "
1979 	    "channel %d 0x%x\n", chp->channel,
1980 	    pci_conf_read(sc->sc_pc, sc->sc_tag, SIS_TIM(chp->channel))),
1981 	    DEBUG_PROBE);
1982 	sis_tim = 0;
1983 	idedma_ctl = 0;
1984 	/* setup DMA if needed */
1985 	pciide_channel_dma_setup(cp);
1986 
1987 	for (drive = 0; drive < 2; drive++) {
1988 		drvp = &chp->ch_drive[drive];
1989 		/* If no drive, skip */
1990 		if ((drvp->drive_flags & DRIVE) == 0)
1991 			continue;
1992 		/* add timing values, setup DMA if needed */
1993 		if ((drvp->drive_flags & DRIVE_DMA) == 0 &&
1994 		    (drvp->drive_flags & DRIVE_UDMA) == 0)
1995 			goto pio;
1996 
1997 		if (drvp->drive_flags & DRIVE_UDMA) {
1998 			/* use Ultra/DMA */
1999 			drvp->drive_flags &= ~DRIVE_DMA;
2000 			sis_tim |= sis_udma_tim[drvp->UDMA_mode] <<
2001 			    SIS_TIM_UDMA_TIME_OFF(drive);
2002 			sis_tim |= SIS_TIM_UDMA_EN(drive);
2003 		} else {
2004 			/*
2005 			 * use Multiword DMA
2006 			 * Timings will be used for both PIO and DMA,
2007 			 * so adjust DMA mode if needed
2008 			 */
2009 			if (drvp->PIO_mode > (drvp->DMA_mode + 2))
2010 				drvp->PIO_mode = drvp->DMA_mode + 2;
2011 			if (drvp->DMA_mode == 0)
2012 				drvp->PIO_mode = 0;
2013 		}
2014 		idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
2015 pio:		sis_tim |= sis_pio_act[drvp->PIO_mode] <<
2016 		    SIS_TIM_ACT_OFF(drive);
2017 		sis_tim |= sis_pio_rec[drvp->PIO_mode] <<
2018 		    SIS_TIM_REC_OFF(drive);
2019 	}
2020 	WDCDEBUG_PRINT(("sis_setup_chip: new timings reg for "
2021 	    "channel %d 0x%x\n", chp->channel, sis_tim), DEBUG_PROBE);
2022 	pci_conf_write(sc->sc_pc, sc->sc_tag, SIS_TIM(chp->channel), sis_tim);
2023 	if (idedma_ctl != 0) {
2024 		/* Add software bits in status register */
2025 		bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
2026 		    IDEDMA_CTL, idedma_ctl);
2027 	}
2028 	pciide_print_modes(cp);
2029 }
2030 
2031 void
2032 sis_channel_map(pa, cp)
2033 	struct pci_attach_args *pa;
2034 	struct pciide_channel *cp;
2035 {
2036 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
2037 	bus_size_t cmdsize, ctlsize;
2038 	struct channel_softc *wdc_cp = &cp->wdc_channel;
2039 	u_int8_t sis_ctr0 = pciide_pci_read(sc->sc_pc, sc->sc_tag, SIS_CTRL0);
2040 	int interface =
2041 	    PCI_INTERFACE(pci_conf_read(sc->sc_pc, sc->sc_tag, PCI_CLASS_REG));
2042 
2043 	if ((wdc_cp->channel == 0 && (sis_ctr0 & SIS_CTRL0_CHAN0_EN) == 0) ||
2044 	    (wdc_cp->channel == 1 && (sis_ctr0 & SIS_CTRL0_CHAN1_EN) == 0)) {
2045 		printf("%s: %s channel ignored (disabled)\n",
2046 		    sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
2047 		return;
2048 	}
2049 
2050 	pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize);
2051 	if (cp->hw_ok == 0)
2052 		return;
2053 	if (pciiide_chan_candisable(cp)) {
2054 		if (wdc_cp->channel == 0)
2055 			sis_ctr0 &= ~SIS_CTRL0_CHAN0_EN;
2056 		else
2057 			sis_ctr0 &= ~SIS_CTRL0_CHAN1_EN;
2058 		pciide_pci_write(sc->sc_pc, sc->sc_tag, SIS_CTRL0, sis_ctr0);
2059 	}
2060 	pciide_map_compat_intr(pa, cp, wdc_cp->channel, interface);
2061 }
2062