Home | History | Annotate | Line # | Download | only in podulebus
cosc.c revision 1.11.2.1
      1  1.11.2.1    skrll /*	$NetBSD: cosc.c,v 1.11.2.1 2004/08/03 10:30:55 skrll Exp $	*/
      2       1.1  reinoud 
      3       1.1  reinoud /*
      4       1.1  reinoud  * Copyright (c) 1996 Mark Brinicombe
      5       1.1  reinoud  * All rights reserved.
      6       1.1  reinoud  *
      7       1.1  reinoud  * Redistribution and use in source and binary forms, with or without
      8       1.1  reinoud  * modification, are permitted provided that the following conditions
      9       1.1  reinoud  * are met:
     10       1.1  reinoud  * 1. Redistributions of source code must retain the above copyright
     11       1.1  reinoud  *    notice, this list of conditions and the following disclaimer.
     12       1.1  reinoud  * 2. Redistributions in binary form must reproduce the above copyright
     13       1.1  reinoud  *    notice, this list of conditions and the following disclaimer in the
     14       1.1  reinoud  *    documentation and/or other materials provided with the distribution.
     15       1.1  reinoud  * 3. All advertising materials mentioning features or use of this software
     16       1.1  reinoud  *    must display the following acknowledgement:
     17       1.1  reinoud  *	This product includes software developed by Mark Brinicombe
     18       1.1  reinoud  *      for the NetBSD Project.
     19       1.1  reinoud  * 4. Neither the name of the University nor the names of its contributors
     20       1.1  reinoud  *    may be used to endorse or promote products derived from this software
     21       1.1  reinoud  *    without specific prior written permission.
     22       1.1  reinoud  *
     23       1.1  reinoud  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     24       1.1  reinoud  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     25       1.1  reinoud  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     26       1.1  reinoud  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     27       1.1  reinoud  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     28       1.1  reinoud  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     29       1.1  reinoud  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     30       1.1  reinoud  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     31       1.1  reinoud  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     32       1.1  reinoud  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     33       1.1  reinoud  *
     34       1.1  reinoud  *	from: asc.c,v 1.8 1996/06/12 20:46:58 mark Exp
     35       1.1  reinoud  */
     36       1.1  reinoud 
     37       1.1  reinoud /*
     38       1.1  reinoud  * Driver for the MCS Connect 32 SCSI 2 card with AM53C94 SCSI controller.
     39       1.1  reinoud  *
     40       1.1  reinoud  * Thanks to Mike <mcsmike (at) knipp.de> at MCS for loaning a card.
     41       1.1  reinoud  * Thanks to Andreas Gandor <andi (at) knipp.de> for some technical information
     42       1.1  reinoud  */
     43       1.1  reinoud 
     44  1.11.2.1    skrll #include <sys/cdefs.h>
     45  1.11.2.1    skrll __KERNEL_RCSID(0, "$NetBSD: cosc.c,v 1.11.2.1 2004/08/03 10:30:55 skrll Exp $");
     46  1.11.2.1    skrll 
     47       1.1  reinoud #include <sys/param.h>
     48       1.1  reinoud #include <sys/systm.h>
     49       1.1  reinoud #include <sys/kernel.h>
     50       1.1  reinoud #include <sys/device.h>
     51      1.11  thorpej 
     52      1.11  thorpej #include <uvm/uvm_extern.h>
     53      1.11  thorpej 
     54       1.1  reinoud #include <dev/scsipi/scsi_all.h>
     55       1.1  reinoud #include <dev/scsipi/scsipi_all.h>
     56       1.1  reinoud #include <dev/scsipi/scsiconf.h>
     57       1.1  reinoud #include <machine/bootconfig.h>
     58       1.1  reinoud #include <machine/io.h>
     59       1.3  thorpej #include <machine/intr.h>
     60       1.2  thorpej #include <arm/arm32/katelib.h>
     61       1.1  reinoud #include <acorn32/podulebus/podulebus.h>
     62       1.1  reinoud #include <acorn32/podulebus/escreg.h>
     63       1.1  reinoud #include <acorn32/podulebus/escvar.h>
     64       1.1  reinoud #include <acorn32/podulebus/coscreg.h>
     65       1.1  reinoud #include <acorn32/podulebus/coscvar.h>
     66       1.1  reinoud #include <dev/podulebus/podules.h>
     67       1.1  reinoud 
     68      1.10      chs void coscattach(struct device *, struct device *, void *);
     69      1.10      chs int coscmatch(struct device *, struct cfdata *, void *);
     70       1.1  reinoud 
     71       1.8  thorpej CFATTACH_DECL(cosc, sizeof(struct cosc_softc),
     72       1.9  thorpej     coscmatch, coscattach, NULL, NULL);
     73       1.1  reinoud 
     74      1.10      chs int cosc_intr(void *);
     75      1.10      chs int cosc_setup_dma(struct esc_softc *, void *, int, int);
     76      1.10      chs int cosc_build_dma_chain(struct esc_softc *, struct esc_dma_chain *, void *,
     77      1.10      chs 			 int);
     78      1.10      chs int cosc_need_bump(struct esc_softc *, void *, int);
     79      1.10      chs void cosc_led(struct esc_softc *, int);
     80      1.10      chs void cosc_set_dma_adr(struct esc_softc *, void *);
     81      1.10      chs void cosc_set_dma_tc(struct esc_softc *, unsigned int);
     82      1.10      chs void cosc_set_dma_mode(struct esc_softc *, int);
     83       1.1  reinoud 
     84       1.1  reinoud #if COSC_POLL > 0
     85       1.1  reinoud int cosc_poll = 1;
     86       1.1  reinoud #endif
     87       1.1  reinoud 
     88       1.1  reinoud int
     89       1.1  reinoud coscmatch(pdp, cf, auxp)
     90       1.1  reinoud 	struct device *pdp;
     91       1.1  reinoud 	struct cfdata *cf;
     92       1.1  reinoud 	void *auxp;
     93       1.1  reinoud {
     94       1.1  reinoud 	struct podule_attach_args *pa = (struct podule_attach_args *)auxp;
     95       1.1  reinoud 
     96       1.1  reinoud 	/* Look for the card */
     97       1.1  reinoud 
     98       1.4    bjh21 	if (pa->pa_product == PODULE_CONNECT32)
     99       1.1  reinoud 		return(1);
    100       1.1  reinoud 
    101       1.1  reinoud 	/* Old versions of the ROM on this card could have the wrong ID */
    102       1.1  reinoud 
    103       1.4    bjh21 	if (pa ->pa_product == PODULE_ACORN_SCSI &&
    104       1.4    bjh21 	    strncmp(pa->pa_podule->description, "MCS", 3) == 0)
    105       1.4    bjh21 		return(1);
    106       1.4    bjh21 	return(0);
    107       1.1  reinoud }
    108       1.1  reinoud 
    109       1.1  reinoud static int dummy[6];
    110       1.1  reinoud 
    111       1.1  reinoud void
    112       1.1  reinoud coscattach(pdp, dp, auxp)
    113       1.1  reinoud 	struct device *pdp, *dp;
    114       1.1  reinoud 	void *auxp;
    115       1.1  reinoud {
    116       1.1  reinoud 	struct cosc_softc *sc = (struct cosc_softc *)dp;
    117       1.1  reinoud 	struct podule_attach_args *pa;
    118       1.1  reinoud 	cosc_regmap_p	   rp = &sc->sc_regmap;
    119       1.1  reinoud 	vu_char		  *esc;
    120       1.1  reinoud 
    121       1.1  reinoud 	pa = (struct podule_attach_args *)auxp;
    122       1.1  reinoud 
    123       1.1  reinoud 	if (pa->pa_podule_number == -1)
    124       1.1  reinoud 		panic("Podule has disappeared !");
    125       1.1  reinoud 
    126       1.1  reinoud 	sc->sc_podule_number = pa->pa_podule_number;
    127       1.1  reinoud 	sc->sc_podule = pa->pa_podule;
    128       1.1  reinoud 	podules[sc->sc_podule_number].attached = 1;
    129       1.1  reinoud 
    130       1.1  reinoud 	printf(":");
    131       1.1  reinoud 
    132       1.1  reinoud 	if (pa->pa_podule->manufacturer == MANUFACTURER_ACORN
    133       1.1  reinoud 	    && pa->pa_podule->product == PODULE_ACORN_SCSI)
    134       1.1  reinoud 		printf(" Faulty expansion card identity\n");
    135       1.1  reinoud 
    136       1.1  reinoud 	sc->sc_iobase = (vu_char *)sc->sc_podule->fast_base;
    137       1.1  reinoud 
    138       1.1  reinoud 	/* Select page zero (so we can see the config info) */
    139       1.1  reinoud 
    140       1.1  reinoud 	sc->sc_iobase[COSC_PAGE_REGISTER] = 0;
    141       1.1  reinoud 
    142       1.1  reinoud 	rp->chipreset = (vu_char *)&dummy[0];
    143       1.1  reinoud 	rp->inten = (vu_char *)&dummy[1];
    144       1.1  reinoud 	rp->status = (vu_char *)&dummy[2];
    145       1.1  reinoud 	rp->term = &sc->sc_iobase[COSC_TERMINATION_CONTROL];
    146       1.1  reinoud 	rp->led = (vu_char *)&dummy[4];
    147       1.1  reinoud 	esc = &sc->sc_iobase[COSC_ESCOFFSET_BASE];
    148       1.1  reinoud 
    149       1.1  reinoud 	rp->esc.esc_tc_low	= &esc[COSC_ESCOFFSET_TCL];
    150       1.1  reinoud 	rp->esc.esc_tc_mid	= &esc[COSC_ESCOFFSET_TCM];
    151       1.1  reinoud 	rp->esc.esc_fifo	= &esc[COSC_ESCOFFSET_FIFO];
    152       1.1  reinoud 	rp->esc.esc_command	= &esc[COSC_ESCOFFSET_COMMAND];
    153       1.1  reinoud 	rp->esc.esc_dest_id	= &esc[COSC_ESCOFFSET_DESTID];
    154       1.1  reinoud 	rp->esc.esc_timeout	= &esc[COSC_ESCOFFSET_TIMEOUT];
    155       1.1  reinoud 	rp->esc.esc_syncper	= &esc[COSC_ESCOFFSET_PERIOD];
    156       1.1  reinoud 	rp->esc.esc_syncoff	= &esc[COSC_ESCOFFSET_OFFSET];
    157       1.1  reinoud 	rp->esc.esc_config1	= &esc[COSC_ESCOFFSET_CONFIG1];
    158       1.1  reinoud 	rp->esc.esc_clkconv	= &esc[COSC_ESCOFFSET_CLOCKCONV];
    159       1.1  reinoud 	rp->esc.esc_test	= &esc[COSC_ESCOFFSET_TEST];
    160       1.1  reinoud 	rp->esc.esc_config2	= &esc[COSC_ESCOFFSET_CONFIG2];
    161       1.1  reinoud 	rp->esc.esc_config3	= &esc[COSC_ESCOFFSET_CONFIG3];
    162       1.1  reinoud 	rp->esc.esc_config4	= &esc[COSC_ESCOFFSET_CONFIG4];
    163       1.1  reinoud 	rp->esc.esc_tc_high	= &esc[COSC_ESCOFFSET_TCH];
    164       1.1  reinoud 	rp->esc.esc_fifo_bot	= &esc[COSC_ESCOFFSET_FIFOBOTTOM];
    165       1.1  reinoud 
    166       1.1  reinoud 	*rp->esc.esc_command = ESC_CMD_RESET_CHIP;
    167       1.1  reinoud 	delay(1000);
    168       1.1  reinoud 	*rp->esc.esc_command = ESC_CMD_NOP;
    169       1.1  reinoud 
    170       1.1  reinoud 	/* See if we recognise the controller */
    171       1.1  reinoud 
    172       1.1  reinoud 	switch (*rp->esc.esc_tc_high) {
    173       1.1  reinoud 		case 0x12:
    174       1.1  reinoud 			printf(" AM53CF94");
    175       1.1  reinoud 			break;
    176       1.1  reinoud 		default:
    177       1.1  reinoud 			printf(" Unknown controller (%02x)", *rp->esc.esc_tc_high);
    178       1.1  reinoud 			break;
    179       1.1  reinoud 	}
    180       1.1  reinoud 
    181       1.1  reinoud 	/* Set termination power */
    182       1.1  reinoud 
    183       1.1  reinoud 	if (sc->sc_iobase[COSC_CONFIG_TERMINATION] & COSC_CONFIG_TERMINATION_ON) {
    184       1.1  reinoud 		printf(" termpwr on");
    185       1.1  reinoud 		sc->sc_iobase[COSC_TERMINATION_CONTROL] = COSC_TERMINATION_ON;
    186       1.1  reinoud 	} else {
    187       1.1  reinoud 		printf(" termpwr off");
    188       1.1  reinoud 		sc->sc_iobase[COSC_TERMINATION_CONTROL] = COSC_TERMINATION_OFF;
    189       1.1  reinoud 	}
    190       1.1  reinoud 
    191       1.1  reinoud 	/* Don't know what this is for */
    192       1.1  reinoud 
    193       1.1  reinoud 	{
    194       1.1  reinoud 		int byte;
    195       1.1  reinoud 		int loop;
    196       1.1  reinoud 
    197       1.1  reinoud 		byte = sc->sc_iobase[COSC_REGISTER_01];
    198       1.1  reinoud 		byte = 0;
    199       1.1  reinoud 		for (loop = 0; loop < 8; ++loop) {
    200       1.1  reinoud 			if (sc->sc_iobase[COSC_REGISTER_00] & 0x01)
    201       1.1  reinoud 				byte |= (1 << loop);
    202       1.1  reinoud 		}
    203       1.1  reinoud 		printf(" byte=%02x", byte);
    204       1.1  reinoud 	}
    205       1.1  reinoud 
    206       1.1  reinoud 	/*
    207       1.1  reinoud 	 * Control register 4 is an AMD special (not on FAS216)
    208       1.1  reinoud 	 *
    209       1.1  reinoud 	 * The powerdown and glitch eater facilities could be useful
    210       1.1  reinoud 	 * Use the podule configuration for this register
    211       1.1  reinoud 	 */
    212       1.1  reinoud 
    213       1.1  reinoud 	sc->sc_softc.sc_config4 = sc->sc_iobase[COSC_CONFIG_CONTROL_REG4];
    214       1.1  reinoud 
    215       1.1  reinoud 	sc->sc_softc.sc_esc	= (esc_regmap_p)rp;
    216       1.1  reinoud /*	sc->sc_softc.sc_spec	= &sc->sc_specific;*/
    217       1.1  reinoud 
    218       1.1  reinoud 	sc->sc_softc.sc_led	= cosc_led;
    219       1.1  reinoud 	sc->sc_softc.sc_setup_dma	= cosc_setup_dma;
    220       1.1  reinoud 	sc->sc_softc.sc_build_dma_chain = cosc_build_dma_chain;
    221       1.1  reinoud 	sc->sc_softc.sc_need_bump	= cosc_need_bump;
    222       1.1  reinoud 
    223       1.1  reinoud 	sc->sc_softc.sc_clock_freq   = 40;   /* Connect32 runs at 40MHz */
    224       1.1  reinoud 	sc->sc_softc.sc_timeout      = 250;  /* Set default timeout to 250ms */
    225       1.1  reinoud 	sc->sc_softc.sc_config_flags = ESC_NO_DMA;
    226       1.1  reinoud 	sc->sc_softc.sc_host_id      = sc->sc_iobase[COSC_CONFIG_CONTROL_REG1] & ESC_DEST_ID_MASK;
    227       1.1  reinoud 
    228       1.1  reinoud 	printf(" hostid=%d", sc->sc_softc.sc_host_id);
    229       1.1  reinoud 
    230       1.1  reinoud #if COSC_POLL > 0
    231       1.1  reinoud         if (boot_args)
    232       1.1  reinoud 		get_bootconf_option(boot_args, "coscpoll",
    233       1.1  reinoud 		    BOOTOPT_TYPE_BOOLEAN, &cosc_poll);
    234       1.1  reinoud 
    235       1.5    bjh21 	if (cosc_poll) {
    236       1.1  reinoud 		printf(" polling");
    237       1.5    bjh21 		sc->sc_softc.sc_adapter.adapt_flags |= SCSIPI_ADAPT_POLL_ONLY;
    238       1.5    bjh21 	}
    239       1.1  reinoud #endif
    240       1.1  reinoud 
    241      1.11  thorpej 	sc->sc_softc.sc_bump_sz = PAGE_SIZE;
    242       1.1  reinoud 	sc->sc_softc.sc_bump_pa = 0x0;
    243       1.1  reinoud 
    244       1.1  reinoud 	escinitialize((struct esc_softc *)sc);
    245       1.1  reinoud 
    246       1.1  reinoud 	sc->sc_softc.sc_adapter.adapt_dev = &sc->sc_softc.sc_dev;
    247       1.1  reinoud 	sc->sc_softc.sc_adapter.adapt_nchannels = 1;
    248       1.1  reinoud 	sc->sc_softc.sc_adapter.adapt_openings = 7;
    249       1.1  reinoud 	sc->sc_softc.sc_adapter.adapt_max_periph = 1;
    250       1.1  reinoud 	sc->sc_softc.sc_adapter.adapt_ioctl = NULL;
    251       1.1  reinoud 	sc->sc_softc.sc_adapter.adapt_minphys = esc_minphys;
    252       1.5    bjh21 	sc->sc_softc.sc_adapter.adapt_request = esc_scsi_request;
    253       1.1  reinoud 
    254       1.1  reinoud 	sc->sc_softc.sc_channel.chan_adapter = &sc->sc_softc.sc_adapter;
    255       1.1  reinoud 	sc->sc_softc.sc_channel.chan_bustype = &scsi_bustype;
    256       1.1  reinoud 	sc->sc_softc.sc_channel.chan_channel = 0;
    257       1.1  reinoud 	sc->sc_softc.sc_channel.chan_ntargets = 8;
    258       1.1  reinoud 	sc->sc_softc.sc_channel.chan_nluns = 8;
    259       1.1  reinoud 	sc->sc_softc.sc_channel.chan_id = sc->sc_softc.sc_host_id;
    260       1.1  reinoud 
    261       1.1  reinoud 	/* initialise the card */
    262       1.1  reinoud #if 0
    263       1.1  reinoud 	*rp->inten = (COSC_POLL?0:1);
    264       1.1  reinoud 	*rp->led = 0;
    265       1.1  reinoud #endif
    266       1.1  reinoud 
    267       1.1  reinoud 	sc->sc_softc.sc_ih.ih_func = cosc_intr;
    268       1.1  reinoud 	sc->sc_softc.sc_ih.ih_arg  = &sc->sc_softc;
    269       1.1  reinoud 	sc->sc_softc.sc_ih.ih_level = IPL_BIO;
    270       1.1  reinoud 	sc->sc_softc.sc_ih.ih_name = "scsi: cosc";
    271       1.1  reinoud 	sc->sc_softc.sc_ih.ih_maskaddr = sc->sc_podule->irq_addr;
    272       1.1  reinoud 	sc->sc_softc.sc_ih.ih_maskbits = sc->sc_podule->irq_mask;
    273       1.1  reinoud 
    274       1.1  reinoud #if COSC_POLL > 0
    275       1.1  reinoud 	if (!cosc_poll)
    276       1.1  reinoud #endif
    277       1.1  reinoud 	{
    278       1.1  reinoud 		evcnt_attach_dynamic(&sc->sc_intrcnt, EVCNT_TYPE_INTR, NULL,
    279       1.1  reinoud 		    dp->dv_xname, "intr");
    280       1.1  reinoud 		sc->sc_ih = podulebus_irq_establish(pa->pa_ih, IPL_BIO,
    281       1.1  reinoud 		    cosc_intr, sc, &sc->sc_intrcnt);
    282       1.1  reinoud 		if (sc->sc_ih == NULL)
    283       1.6   provos 			panic("%s: Cannot install IRQ handler",
    284       1.1  reinoud 			    dp->dv_xname);
    285       1.1  reinoud 	}
    286       1.1  reinoud 
    287       1.1  reinoud 	printf("\n");
    288       1.1  reinoud 
    289       1.1  reinoud 	/* attach all scsi units on us */
    290       1.1  reinoud 	config_found(dp, &sc->sc_softc.sc_channel, scsiprint);
    291       1.1  reinoud }
    292       1.1  reinoud 
    293       1.1  reinoud 
    294       1.1  reinoud /* Turn on/off led */
    295       1.1  reinoud 
    296       1.1  reinoud void
    297       1.1  reinoud cosc_led(sc, mode)
    298       1.1  reinoud 	struct esc_softc *sc;
    299       1.1  reinoud 	int		  mode;
    300       1.1  reinoud {
    301       1.1  reinoud 	cosc_regmap_p		rp;
    302       1.1  reinoud 
    303       1.1  reinoud 	rp = (cosc_regmap_p)sc->sc_esc;
    304       1.1  reinoud 
    305       1.1  reinoud 	if (mode) {
    306       1.1  reinoud 		sc->sc_led_status++;
    307       1.1  reinoud 	} else {
    308       1.1  reinoud 		if (sc->sc_led_status)
    309       1.1  reinoud 			sc->sc_led_status--;
    310       1.1  reinoud 	}
    311       1.1  reinoud /*	*rp->led = (sc->sc_led_status?1:0);*/
    312       1.1  reinoud }
    313       1.1  reinoud 
    314       1.1  reinoud 
    315       1.1  reinoud int
    316       1.1  reinoud cosc_intr(arg)
    317       1.1  reinoud 	void *arg;
    318       1.1  reinoud {
    319       1.1  reinoud 	struct esc_softc *dev = arg;
    320       1.1  reinoud 	cosc_regmap_p	      rp;
    321       1.1  reinoud 	int		      quickints;
    322       1.1  reinoud 
    323       1.1  reinoud 	rp = (cosc_regmap_p)dev->sc_esc;
    324       1.1  reinoud 
    325       1.1  reinoud 	printf("cosc_intr:%08x %02x\n", (u_int)rp->esc.esc_status, *rp->esc.esc_status);
    326       1.1  reinoud 
    327       1.1  reinoud 	if (*rp->esc.esc_status & ESC_STAT_INTERRUPT_PENDING) {
    328       1.1  reinoud 		quickints = 16;
    329       1.1  reinoud 		do {
    330       1.1  reinoud 			dev->sc_status = *rp->esc.esc_status;
    331       1.1  reinoud 			dev->sc_interrupt = *rp->esc.esc_interrupt;
    332       1.1  reinoud 
    333       1.1  reinoud 			if (dev->sc_interrupt & ESC_INT_RESELECTED) {
    334       1.1  reinoud 				dev->sc_resel[0] = *rp->esc.esc_fifo;
    335       1.1  reinoud 				dev->sc_resel[1] = *rp->esc.esc_fifo;
    336       1.1  reinoud 			}
    337       1.1  reinoud 
    338       1.1  reinoud 			escintr(dev);
    339       1.1  reinoud 
    340       1.1  reinoud 		} while((*rp->esc.esc_status & ESC_STAT_INTERRUPT_PENDING)
    341       1.1  reinoud 			&& --quickints);
    342       1.1  reinoud 	}
    343       1.1  reinoud 
    344       1.1  reinoud 	return(0);	/* Pass interrupt on down the chain */
    345       1.1  reinoud }
    346       1.1  reinoud 
    347       1.1  reinoud 
    348       1.1  reinoud /* Load transfer address into dma register */
    349       1.1  reinoud 
    350       1.1  reinoud void
    351       1.1  reinoud cosc_set_dma_adr(sc, ptr)
    352       1.1  reinoud 	struct esc_softc *sc;
    353       1.1  reinoud 	void		 *ptr;
    354       1.1  reinoud {
    355       1.1  reinoud 	printf("cosc_set_dma_adr(sc = 0x%08x, ptr = 0x%08x)\n", (u_int)sc, (u_int)ptr);
    356       1.1  reinoud 	return;
    357       1.1  reinoud }
    358       1.1  reinoud 
    359       1.1  reinoud 
    360       1.1  reinoud /* Set DMA transfer counter */
    361       1.1  reinoud 
    362       1.1  reinoud void
    363       1.1  reinoud cosc_set_dma_tc(sc, len)
    364       1.1  reinoud 	struct esc_softc *sc;
    365       1.1  reinoud 	unsigned int	  len;
    366       1.1  reinoud {
    367       1.1  reinoud 	printf("cosc_set_dma_tc(sc, len = 0x%08x)", len);
    368       1.1  reinoud 
    369       1.1  reinoud 	/* Set the transfer size on the SCSI controller */
    370       1.1  reinoud 
    371       1.1  reinoud 	*sc->sc_esc->esc_tc_low  = len; len >>= 8;
    372       1.1  reinoud 	*sc->sc_esc->esc_tc_mid  = len; len >>= 8;
    373       1.1  reinoud 	*sc->sc_esc->esc_tc_high = len;
    374       1.1  reinoud }
    375       1.1  reinoud 
    376       1.1  reinoud 
    377       1.1  reinoud /* Set DMA mode */
    378       1.1  reinoud 
    379       1.1  reinoud void
    380       1.1  reinoud cosc_set_dma_mode(sc, mode)
    381       1.1  reinoud 	struct esc_softc *sc;
    382       1.1  reinoud 	int		  mode;
    383       1.1  reinoud {
    384       1.1  reinoud 	printf("cosc_set_dma_mode(sc, mode = %d)", mode);
    385       1.1  reinoud }
    386       1.1  reinoud 
    387       1.1  reinoud 
    388       1.1  reinoud /* Initialize DMA for transfer */
    389       1.1  reinoud 
    390       1.1  reinoud int
    391       1.1  reinoud cosc_setup_dma(sc, ptr, len, mode)
    392       1.1  reinoud 	struct esc_softc *sc;
    393       1.1  reinoud 	void		 *ptr;
    394       1.1  reinoud 	int		  len;
    395       1.1  reinoud 	int		  mode;
    396       1.1  reinoud {
    397       1.1  reinoud /*	printf("cosc_setup_dma(sc, ptr = 0x%08x, len = 0x%08x, mode = 0x%08x)\n", (u_int)ptr, len, mode);*/
    398       1.1  reinoud 	return(0);
    399       1.1  reinoud 
    400       1.1  reinoud }
    401       1.1  reinoud 
    402       1.1  reinoud 
    403       1.1  reinoud /* Check if address and len is ok for DMA transfer */
    404       1.1  reinoud 
    405       1.1  reinoud int
    406       1.1  reinoud cosc_need_bump(sc, ptr, len)
    407       1.1  reinoud 	struct esc_softc *sc;
    408       1.1  reinoud 	void		 *ptr;
    409       1.1  reinoud 	int		  len;
    410       1.1  reinoud {
    411       1.1  reinoud 	int	p;
    412       1.1  reinoud 
    413       1.1  reinoud 	p = (int)ptr & 0x03;
    414       1.1  reinoud 
    415       1.1  reinoud 	if (p) {
    416       1.1  reinoud 		p = 4-p;
    417       1.1  reinoud 
    418       1.1  reinoud 		if (len < 256)
    419       1.1  reinoud 			p = len;
    420       1.1  reinoud 	}
    421       1.1  reinoud 
    422       1.1  reinoud 	return(p);
    423       1.1  reinoud }
    424       1.1  reinoud 
    425       1.1  reinoud 
    426       1.1  reinoud /* Interrupt driven routines */
    427       1.1  reinoud 
    428       1.1  reinoud int
    429       1.1  reinoud cosc_build_dma_chain(sc, chain, p, l)
    430       1.1  reinoud 	struct esc_softc	*sc;
    431       1.1  reinoud 	struct esc_dma_chain	*chain;
    432       1.1  reinoud 	void			*p;
    433       1.1  reinoud 	int			 l;
    434       1.1  reinoud {
    435       1.1  reinoud 	printf("cosc_build_dma_chain()\n");
    436       1.1  reinoud 	return(0);
    437       1.1  reinoud }
    438