Home | History | Annotate | Line # | Download | only in podulebus
cosc.c revision 1.16.6.1
      1  1.16.6.1   jruoho /*	$NetBSD: cosc.c,v 1.16.6.1 2011/06/06 09:04:40 jruoho 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.12    lukem 
     44      1.12    lukem #include <sys/cdefs.h>
     45  1.16.6.1   jruoho __KERNEL_RCSID(0, "$NetBSD: cosc.c,v 1.16.6.1 2011/06/06 09:04:40 jruoho Exp $");
     46       1.1  reinoud 
     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.16.6.1   jruoho void coscattach(device_t, device_t, void *);
     69  1.16.6.1   jruoho int coscmatch(device_t, cfdata_t, 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.16.6.1   jruoho coscmatch(device_t parent, cfdata_t cf, void *aux)
     90       1.1  reinoud {
     91  1.16.6.1   jruoho 	struct podule_attach_args *pa = aux;
     92       1.1  reinoud 
     93       1.1  reinoud 	/* Look for the card */
     94       1.1  reinoud 
     95       1.4    bjh21 	if (pa->pa_product == PODULE_CONNECT32)
     96       1.1  reinoud 		return(1);
     97       1.1  reinoud 
     98       1.1  reinoud 	/* Old versions of the ROM on this card could have the wrong ID */
     99       1.1  reinoud 
    100       1.4    bjh21 	if (pa ->pa_product == PODULE_ACORN_SCSI &&
    101       1.4    bjh21 	    strncmp(pa->pa_podule->description, "MCS", 3) == 0)
    102       1.4    bjh21 		return(1);
    103       1.4    bjh21 	return(0);
    104       1.1  reinoud }
    105       1.1  reinoud 
    106       1.1  reinoud static int dummy[6];
    107       1.1  reinoud 
    108       1.1  reinoud void
    109  1.16.6.1   jruoho coscattach(device_t parent, device_t self, void *aux)
    110       1.1  reinoud {
    111  1.16.6.1   jruoho 	struct cosc_softc *sc = device_private(self);
    112  1.16.6.1   jruoho 	struct podule_attach_args *pa = aux;
    113       1.1  reinoud 	cosc_regmap_p	   rp = &sc->sc_regmap;
    114       1.1  reinoud 	vu_char		  *esc;
    115       1.1  reinoud 
    116       1.1  reinoud 	if (pa->pa_podule_number == -1)
    117       1.1  reinoud 		panic("Podule has disappeared !");
    118       1.1  reinoud 
    119       1.1  reinoud 	sc->sc_podule_number = pa->pa_podule_number;
    120       1.1  reinoud 	sc->sc_podule = pa->pa_podule;
    121       1.1  reinoud 	podules[sc->sc_podule_number].attached = 1;
    122       1.1  reinoud 
    123       1.1  reinoud 	printf(":");
    124       1.1  reinoud 
    125       1.1  reinoud 	if (pa->pa_podule->manufacturer == MANUFACTURER_ACORN
    126       1.1  reinoud 	    && pa->pa_podule->product == PODULE_ACORN_SCSI)
    127       1.1  reinoud 		printf(" Faulty expansion card identity\n");
    128       1.1  reinoud 
    129       1.1  reinoud 	sc->sc_iobase = (vu_char *)sc->sc_podule->fast_base;
    130       1.1  reinoud 
    131       1.1  reinoud 	/* Select page zero (so we can see the config info) */
    132       1.1  reinoud 
    133       1.1  reinoud 	sc->sc_iobase[COSC_PAGE_REGISTER] = 0;
    134       1.1  reinoud 
    135       1.1  reinoud 	rp->chipreset = (vu_char *)&dummy[0];
    136       1.1  reinoud 	rp->inten = (vu_char *)&dummy[1];
    137       1.1  reinoud 	rp->status = (vu_char *)&dummy[2];
    138       1.1  reinoud 	rp->term = &sc->sc_iobase[COSC_TERMINATION_CONTROL];
    139       1.1  reinoud 	rp->led = (vu_char *)&dummy[4];
    140       1.1  reinoud 	esc = &sc->sc_iobase[COSC_ESCOFFSET_BASE];
    141       1.1  reinoud 
    142       1.1  reinoud 	rp->esc.esc_tc_low	= &esc[COSC_ESCOFFSET_TCL];
    143       1.1  reinoud 	rp->esc.esc_tc_mid	= &esc[COSC_ESCOFFSET_TCM];
    144       1.1  reinoud 	rp->esc.esc_fifo	= &esc[COSC_ESCOFFSET_FIFO];
    145       1.1  reinoud 	rp->esc.esc_command	= &esc[COSC_ESCOFFSET_COMMAND];
    146       1.1  reinoud 	rp->esc.esc_dest_id	= &esc[COSC_ESCOFFSET_DESTID];
    147       1.1  reinoud 	rp->esc.esc_timeout	= &esc[COSC_ESCOFFSET_TIMEOUT];
    148       1.1  reinoud 	rp->esc.esc_syncper	= &esc[COSC_ESCOFFSET_PERIOD];
    149       1.1  reinoud 	rp->esc.esc_syncoff	= &esc[COSC_ESCOFFSET_OFFSET];
    150       1.1  reinoud 	rp->esc.esc_config1	= &esc[COSC_ESCOFFSET_CONFIG1];
    151       1.1  reinoud 	rp->esc.esc_clkconv	= &esc[COSC_ESCOFFSET_CLOCKCONV];
    152       1.1  reinoud 	rp->esc.esc_test	= &esc[COSC_ESCOFFSET_TEST];
    153       1.1  reinoud 	rp->esc.esc_config2	= &esc[COSC_ESCOFFSET_CONFIG2];
    154       1.1  reinoud 	rp->esc.esc_config3	= &esc[COSC_ESCOFFSET_CONFIG3];
    155       1.1  reinoud 	rp->esc.esc_config4	= &esc[COSC_ESCOFFSET_CONFIG4];
    156       1.1  reinoud 	rp->esc.esc_tc_high	= &esc[COSC_ESCOFFSET_TCH];
    157       1.1  reinoud 	rp->esc.esc_fifo_bot	= &esc[COSC_ESCOFFSET_FIFOBOTTOM];
    158       1.1  reinoud 
    159       1.1  reinoud 	*rp->esc.esc_command = ESC_CMD_RESET_CHIP;
    160       1.1  reinoud 	delay(1000);
    161       1.1  reinoud 	*rp->esc.esc_command = ESC_CMD_NOP;
    162       1.1  reinoud 
    163       1.1  reinoud 	/* See if we recognise the controller */
    164       1.1  reinoud 
    165       1.1  reinoud 	switch (*rp->esc.esc_tc_high) {
    166       1.1  reinoud 		case 0x12:
    167       1.1  reinoud 			printf(" AM53CF94");
    168       1.1  reinoud 			break;
    169       1.1  reinoud 		default:
    170       1.1  reinoud 			printf(" Unknown controller (%02x)", *rp->esc.esc_tc_high);
    171       1.1  reinoud 			break;
    172       1.1  reinoud 	}
    173       1.1  reinoud 
    174       1.1  reinoud 	/* Set termination power */
    175       1.1  reinoud 
    176       1.1  reinoud 	if (sc->sc_iobase[COSC_CONFIG_TERMINATION] & COSC_CONFIG_TERMINATION_ON) {
    177       1.1  reinoud 		printf(" termpwr on");
    178       1.1  reinoud 		sc->sc_iobase[COSC_TERMINATION_CONTROL] = COSC_TERMINATION_ON;
    179       1.1  reinoud 	} else {
    180       1.1  reinoud 		printf(" termpwr off");
    181       1.1  reinoud 		sc->sc_iobase[COSC_TERMINATION_CONTROL] = COSC_TERMINATION_OFF;
    182       1.1  reinoud 	}
    183       1.1  reinoud 
    184       1.1  reinoud 	/* Don't know what this is for */
    185       1.1  reinoud 
    186       1.1  reinoud 	{
    187       1.1  reinoud 		int byte;
    188       1.1  reinoud 		int loop;
    189       1.1  reinoud 
    190       1.1  reinoud 		byte = sc->sc_iobase[COSC_REGISTER_01];
    191       1.1  reinoud 		byte = 0;
    192       1.1  reinoud 		for (loop = 0; loop < 8; ++loop) {
    193       1.1  reinoud 			if (sc->sc_iobase[COSC_REGISTER_00] & 0x01)
    194       1.1  reinoud 				byte |= (1 << loop);
    195       1.1  reinoud 		}
    196       1.1  reinoud 		printf(" byte=%02x", byte);
    197       1.1  reinoud 	}
    198       1.1  reinoud 
    199       1.1  reinoud 	/*
    200       1.1  reinoud 	 * Control register 4 is an AMD special (not on FAS216)
    201       1.1  reinoud 	 *
    202       1.1  reinoud 	 * The powerdown and glitch eater facilities could be useful
    203       1.1  reinoud 	 * Use the podule configuration for this register
    204       1.1  reinoud 	 */
    205       1.1  reinoud 
    206       1.1  reinoud 	sc->sc_softc.sc_config4 = sc->sc_iobase[COSC_CONFIG_CONTROL_REG4];
    207       1.1  reinoud 
    208       1.1  reinoud 	sc->sc_softc.sc_esc	= (esc_regmap_p)rp;
    209       1.1  reinoud /*	sc->sc_softc.sc_spec	= &sc->sc_specific;*/
    210       1.1  reinoud 
    211       1.1  reinoud 	sc->sc_softc.sc_led	= cosc_led;
    212       1.1  reinoud 	sc->sc_softc.sc_setup_dma	= cosc_setup_dma;
    213       1.1  reinoud 	sc->sc_softc.sc_build_dma_chain = cosc_build_dma_chain;
    214       1.1  reinoud 	sc->sc_softc.sc_need_bump	= cosc_need_bump;
    215       1.1  reinoud 
    216       1.1  reinoud 	sc->sc_softc.sc_clock_freq   = 40;   /* Connect32 runs at 40MHz */
    217       1.1  reinoud 	sc->sc_softc.sc_timeout      = 250;  /* Set default timeout to 250ms */
    218       1.1  reinoud 	sc->sc_softc.sc_config_flags = ESC_NO_DMA;
    219       1.1  reinoud 	sc->sc_softc.sc_host_id      = sc->sc_iobase[COSC_CONFIG_CONTROL_REG1] & ESC_DEST_ID_MASK;
    220       1.1  reinoud 
    221       1.1  reinoud 	printf(" hostid=%d", sc->sc_softc.sc_host_id);
    222       1.1  reinoud 
    223       1.1  reinoud #if COSC_POLL > 0
    224       1.1  reinoud         if (boot_args)
    225       1.1  reinoud 		get_bootconf_option(boot_args, "coscpoll",
    226       1.1  reinoud 		    BOOTOPT_TYPE_BOOLEAN, &cosc_poll);
    227       1.1  reinoud 
    228       1.5    bjh21 	if (cosc_poll) {
    229       1.1  reinoud 		printf(" polling");
    230       1.5    bjh21 		sc->sc_softc.sc_adapter.adapt_flags |= SCSIPI_ADAPT_POLL_ONLY;
    231       1.5    bjh21 	}
    232       1.1  reinoud #endif
    233       1.1  reinoud 
    234      1.11  thorpej 	sc->sc_softc.sc_bump_sz = PAGE_SIZE;
    235       1.1  reinoud 	sc->sc_softc.sc_bump_pa = 0x0;
    236       1.1  reinoud 
    237  1.16.6.1   jruoho 	escinitialize(&sc->sc_softc);
    238       1.1  reinoud 
    239       1.1  reinoud 	sc->sc_softc.sc_adapter.adapt_dev = &sc->sc_softc.sc_dev;
    240       1.1  reinoud 	sc->sc_softc.sc_adapter.adapt_nchannels = 1;
    241       1.1  reinoud 	sc->sc_softc.sc_adapter.adapt_openings = 7;
    242       1.1  reinoud 	sc->sc_softc.sc_adapter.adapt_max_periph = 1;
    243       1.1  reinoud 	sc->sc_softc.sc_adapter.adapt_ioctl = NULL;
    244       1.1  reinoud 	sc->sc_softc.sc_adapter.adapt_minphys = esc_minphys;
    245       1.5    bjh21 	sc->sc_softc.sc_adapter.adapt_request = esc_scsi_request;
    246       1.1  reinoud 
    247       1.1  reinoud 	sc->sc_softc.sc_channel.chan_adapter = &sc->sc_softc.sc_adapter;
    248       1.1  reinoud 	sc->sc_softc.sc_channel.chan_bustype = &scsi_bustype;
    249       1.1  reinoud 	sc->sc_softc.sc_channel.chan_channel = 0;
    250       1.1  reinoud 	sc->sc_softc.sc_channel.chan_ntargets = 8;
    251       1.1  reinoud 	sc->sc_softc.sc_channel.chan_nluns = 8;
    252       1.1  reinoud 	sc->sc_softc.sc_channel.chan_id = sc->sc_softc.sc_host_id;
    253       1.1  reinoud 
    254       1.1  reinoud 	/* initialise the card */
    255       1.1  reinoud #if 0
    256       1.1  reinoud 	*rp->inten = (COSC_POLL?0:1);
    257       1.1  reinoud 	*rp->led = 0;
    258       1.1  reinoud #endif
    259       1.1  reinoud 
    260       1.1  reinoud 	sc->sc_softc.sc_ih.ih_func = cosc_intr;
    261       1.1  reinoud 	sc->sc_softc.sc_ih.ih_arg  = &sc->sc_softc;
    262       1.1  reinoud 	sc->sc_softc.sc_ih.ih_level = IPL_BIO;
    263       1.1  reinoud 	sc->sc_softc.sc_ih.ih_name = "scsi: cosc";
    264       1.1  reinoud 	sc->sc_softc.sc_ih.ih_maskaddr = sc->sc_podule->irq_addr;
    265       1.1  reinoud 	sc->sc_softc.sc_ih.ih_maskbits = sc->sc_podule->irq_mask;
    266       1.1  reinoud 
    267       1.1  reinoud #if COSC_POLL > 0
    268       1.1  reinoud 	if (!cosc_poll)
    269       1.1  reinoud #endif
    270       1.1  reinoud 	{
    271       1.1  reinoud 		evcnt_attach_dynamic(&sc->sc_intrcnt, EVCNT_TYPE_INTR, NULL,
    272  1.16.6.1   jruoho 		    device_xname(self), "intr");
    273       1.1  reinoud 		sc->sc_ih = podulebus_irq_establish(pa->pa_ih, IPL_BIO,
    274       1.1  reinoud 		    cosc_intr, sc, &sc->sc_intrcnt);
    275       1.1  reinoud 		if (sc->sc_ih == NULL)
    276       1.6   provos 			panic("%s: Cannot install IRQ handler",
    277  1.16.6.1   jruoho 			    device_xname(self));
    278       1.1  reinoud 	}
    279       1.1  reinoud 
    280       1.1  reinoud 	printf("\n");
    281       1.1  reinoud 
    282       1.1  reinoud 	/* attach all scsi units on us */
    283  1.16.6.1   jruoho 	config_found(self, &sc->sc_softc.sc_channel, scsiprint);
    284       1.1  reinoud }
    285       1.1  reinoud 
    286       1.1  reinoud 
    287       1.1  reinoud /* Turn on/off led */
    288       1.1  reinoud 
    289       1.1  reinoud void
    290      1.14      dsl cosc_led(struct esc_softc *sc, int mode)
    291       1.1  reinoud {
    292       1.1  reinoud 	cosc_regmap_p		rp;
    293       1.1  reinoud 
    294       1.1  reinoud 	rp = (cosc_regmap_p)sc->sc_esc;
    295       1.1  reinoud 
    296       1.1  reinoud 	if (mode) {
    297       1.1  reinoud 		sc->sc_led_status++;
    298       1.1  reinoud 	} else {
    299       1.1  reinoud 		if (sc->sc_led_status)
    300       1.1  reinoud 			sc->sc_led_status--;
    301       1.1  reinoud 	}
    302       1.1  reinoud /*	*rp->led = (sc->sc_led_status?1:0);*/
    303       1.1  reinoud }
    304       1.1  reinoud 
    305       1.1  reinoud 
    306       1.1  reinoud int
    307      1.14      dsl cosc_intr(void *arg)
    308       1.1  reinoud {
    309       1.1  reinoud 	struct esc_softc *dev = arg;
    310       1.1  reinoud 	cosc_regmap_p	      rp;
    311       1.1  reinoud 	int		      quickints;
    312       1.1  reinoud 
    313       1.1  reinoud 	rp = (cosc_regmap_p)dev->sc_esc;
    314       1.1  reinoud 
    315       1.1  reinoud 	printf("cosc_intr:%08x %02x\n", (u_int)rp->esc.esc_status, *rp->esc.esc_status);
    316       1.1  reinoud 
    317       1.1  reinoud 	if (*rp->esc.esc_status & ESC_STAT_INTERRUPT_PENDING) {
    318       1.1  reinoud 		quickints = 16;
    319       1.1  reinoud 		do {
    320       1.1  reinoud 			dev->sc_status = *rp->esc.esc_status;
    321       1.1  reinoud 			dev->sc_interrupt = *rp->esc.esc_interrupt;
    322       1.1  reinoud 
    323       1.1  reinoud 			if (dev->sc_interrupt & ESC_INT_RESELECTED) {
    324       1.1  reinoud 				dev->sc_resel[0] = *rp->esc.esc_fifo;
    325       1.1  reinoud 				dev->sc_resel[1] = *rp->esc.esc_fifo;
    326       1.1  reinoud 			}
    327       1.1  reinoud 
    328       1.1  reinoud 			escintr(dev);
    329       1.1  reinoud 
    330       1.1  reinoud 		} while((*rp->esc.esc_status & ESC_STAT_INTERRUPT_PENDING)
    331       1.1  reinoud 			&& --quickints);
    332       1.1  reinoud 	}
    333       1.1  reinoud 
    334       1.1  reinoud 	return(0);	/* Pass interrupt on down the chain */
    335       1.1  reinoud }
    336       1.1  reinoud 
    337       1.1  reinoud 
    338       1.1  reinoud /* Load transfer address into dma register */
    339       1.1  reinoud 
    340       1.1  reinoud void
    341      1.14      dsl cosc_set_dma_adr(struct esc_softc *sc, void *ptr)
    342       1.1  reinoud {
    343       1.1  reinoud 	printf("cosc_set_dma_adr(sc = 0x%08x, ptr = 0x%08x)\n", (u_int)sc, (u_int)ptr);
    344       1.1  reinoud 	return;
    345       1.1  reinoud }
    346       1.1  reinoud 
    347       1.1  reinoud 
    348       1.1  reinoud /* Set DMA transfer counter */
    349       1.1  reinoud 
    350       1.1  reinoud void
    351      1.14      dsl cosc_set_dma_tc(struct esc_softc *sc, unsigned int len)
    352       1.1  reinoud {
    353       1.1  reinoud 	printf("cosc_set_dma_tc(sc, len = 0x%08x)", len);
    354       1.1  reinoud 
    355       1.1  reinoud 	/* Set the transfer size on the SCSI controller */
    356       1.1  reinoud 
    357       1.1  reinoud 	*sc->sc_esc->esc_tc_low  = len; len >>= 8;
    358       1.1  reinoud 	*sc->sc_esc->esc_tc_mid  = len; len >>= 8;
    359       1.1  reinoud 	*sc->sc_esc->esc_tc_high = len;
    360       1.1  reinoud }
    361       1.1  reinoud 
    362       1.1  reinoud 
    363       1.1  reinoud /* Set DMA mode */
    364       1.1  reinoud 
    365       1.1  reinoud void
    366      1.14      dsl cosc_set_dma_mode(struct esc_softc *sc, int mode)
    367       1.1  reinoud {
    368       1.1  reinoud 	printf("cosc_set_dma_mode(sc, mode = %d)", mode);
    369       1.1  reinoud }
    370       1.1  reinoud 
    371       1.1  reinoud 
    372       1.1  reinoud /* Initialize DMA for transfer */
    373       1.1  reinoud 
    374       1.1  reinoud int
    375      1.14      dsl cosc_setup_dma(struct esc_softc *sc, void *ptr, int len, int mode)
    376       1.1  reinoud {
    377       1.1  reinoud /*	printf("cosc_setup_dma(sc, ptr = 0x%08x, len = 0x%08x, mode = 0x%08x)\n", (u_int)ptr, len, mode);*/
    378       1.1  reinoud 	return(0);
    379       1.1  reinoud 
    380       1.1  reinoud }
    381       1.1  reinoud 
    382       1.1  reinoud 
    383       1.1  reinoud /* Check if address and len is ok for DMA transfer */
    384       1.1  reinoud 
    385       1.1  reinoud int
    386      1.14      dsl cosc_need_bump(struct esc_softc *sc, void *ptr, int len)
    387       1.1  reinoud {
    388       1.1  reinoud 	int	p;
    389       1.1  reinoud 
    390       1.1  reinoud 	p = (int)ptr & 0x03;
    391       1.1  reinoud 
    392       1.1  reinoud 	if (p) {
    393       1.1  reinoud 		p = 4-p;
    394       1.1  reinoud 
    395       1.1  reinoud 		if (len < 256)
    396       1.1  reinoud 			p = len;
    397       1.1  reinoud 	}
    398       1.1  reinoud 
    399       1.1  reinoud 	return(p);
    400       1.1  reinoud }
    401       1.1  reinoud 
    402       1.1  reinoud 
    403       1.1  reinoud /* Interrupt driven routines */
    404       1.1  reinoud 
    405       1.1  reinoud int
    406      1.14      dsl cosc_build_dma_chain(struct esc_softc *sc, struct esc_dma_chain *chain, void *p, int l)
    407       1.1  reinoud {
    408       1.1  reinoud 	printf("cosc_build_dma_chain()\n");
    409       1.1  reinoud 	return(0);
    410       1.1  reinoud }
    411