Home | History | Annotate | Line # | Download | only in dev
sc_wrap.c revision 1.2
      1  1.1   tsubai /*
      2  1.1   tsubai   This driver is slow!  Need to rewrite.
      3  1.1   tsubai */
      4  1.1   tsubai 
      5  1.1   tsubai #include <sys/types.h>
      6  1.1   tsubai #include <sys/param.h>
      7  1.1   tsubai #include <sys/systm.h>
      8  1.1   tsubai #include <sys/kernel.h>
      9  1.1   tsubai #include <sys/device.h>
     10  1.1   tsubai #include <sys/proc.h>
     11  1.1   tsubai #include <sys/buf.h>
     12  1.1   tsubai #include <sys/malloc.h>
     13  1.1   tsubai 
     14  1.1   tsubai #include <dev/scsipi/scsi_all.h>
     15  1.1   tsubai #include <dev/scsipi/scsipi_all.h>
     16  1.1   tsubai #include <dev/scsipi/scsiconf.h>
     17  1.1   tsubai #include <dev/scsipi/scsi_message.h>
     18  1.1   tsubai 
     19  1.2  thorpej #include <newsmips/dev/scsireg.h>
     20  1.2  thorpej #include <newsmips/dev/scsic.h>
     21  1.2  thorpej #include <newsmips/dev/dmac_0448.h>
     22  1.2  thorpej #include <newsmips/dev/screg_1185.h>
     23  1.1   tsubai 
     24  1.1   tsubai #include <machine/locore.h>
     25  1.1   tsubai #include <machine/adrsmap.h>
     26  1.1   tsubai #include <machine/autoconf.h>
     27  1.1   tsubai #include <machine/machConst.h>
     28  1.1   tsubai 
     29  1.1   tsubai extern int cold;
     30  1.1   tsubai 
     31  1.1   tsubai /* XXX shared data area with scsi_1185.c */
     32  1.1   tsubai struct sc_data sc_data[8];
     33  1.1   tsubai 
     34  1.1   tsubai static int sc_disconnect = IDT_DISCON;
     35  1.1   tsubai 
     36  1.1   tsubai struct sc_scb {
     37  1.1   tsubai 	TAILQ_ENTRY(sc_scb) chain;
     38  1.1   tsubai 	struct scsipi_xfer *xs;
     39  1.1   tsubai 	int flags;
     40  1.1   tsubai };
     41  1.1   tsubai 
     42  1.1   tsubai struct sc_softc {
     43  1.1   tsubai 	struct device sc_dev;
     44  1.1   tsubai 	struct scsipi_link sc_link;
     45  1.1   tsubai 
     46  1.1   tsubai 	TAILQ_HEAD(scb_list, sc_scb) ready_list, free_list;
     47  1.1   tsubai 	struct sc_scb sc_scb[3*8];
     48  1.1   tsubai 
     49  1.1   tsubai 	struct scsi scsi_xxx[8];
     50  1.1   tsubai 	int inuse[8];
     51  1.1   tsubai 	struct sc_map sc_map[8];
     52  1.1   tsubai };
     53  1.1   tsubai 
     54  1.1   tsubai 
     55  1.1   tsubai static int cxd1185_match __P((struct device *, struct cfdata *, void *));
     56  1.1   tsubai static void cxd1185_attach __P((struct device *, struct device *, void *));
     57  1.1   tsubai 
     58  1.1   tsubai struct cfattach sc_ca = {
     59  1.1   tsubai 	sizeof(struct sc_softc), cxd1185_match, cxd1185_attach
     60  1.1   tsubai };
     61  1.1   tsubai 
     62  1.1   tsubai extern struct cfdriver sc_cd;
     63  1.1   tsubai 
     64  1.1   tsubai void cxd1185_init __P((struct sc_softc *));
     65  1.1   tsubai static void free_scb __P((struct sc_softc *, struct sc_scb *, int));
     66  1.1   tsubai static struct sc_scb *get_scb __P((struct sc_softc *, int));
     67  1.1   tsubai static int sc_scsi_cmd __P((struct scsipi_xfer *));
     68  1.1   tsubai static int sc_poll __P((int, int));
     69  1.1   tsubai static void sc_sched __P((struct sc_softc *));
     70  1.1   tsubai static void sc_go __P((int, struct scsi *, int));
     71  1.1   tsubai void sc_done __P((struct scsi *));
     72  1.1   tsubai int sc_intr __P((struct sc_softc *));
     73  1.1   tsubai static void cxd1185_timeout __P((void *));
     74  1.1   tsubai 
     75  1.1   tsubai extern sc_send __P((int, int, struct scsi *));
     76  1.1   tsubai extern int scintr __P((void));
     77  1.1   tsubai extern void scsi_hardreset __P((void));
     78  1.1   tsubai extern int sc_busy __P((int));
     79  1.1   tsubai extern vm_offset_t kvtophys __P((vm_offset_t));
     80  1.1   tsubai 
     81  1.1   tsubai struct scsipi_adapter cxd1185_switch = {
     82  1.1   tsubai 	sc_scsi_cmd,
     83  1.1   tsubai 	minphys,
     84  1.1   tsubai 	NULL,
     85  1.1   tsubai 	NULL
     86  1.1   tsubai };
     87  1.1   tsubai 
     88  1.1   tsubai struct scsipi_device cxd1185_dev = {
     89  1.1   tsubai 	NULL,
     90  1.1   tsubai 	NULL,
     91  1.1   tsubai 	NULL,
     92  1.1   tsubai 	NULL
     93  1.1   tsubai };
     94  1.1   tsubai 
     95  1.1   tsubai int
     96  1.1   tsubai cxd1185_match(parent, cf, aux)
     97  1.1   tsubai 	struct device *parent;
     98  1.1   tsubai 	struct cfdata *cf;
     99  1.1   tsubai 	void *aux;
    100  1.1   tsubai {
    101  1.1   tsubai 	struct confargs *ca = aux;
    102  1.1   tsubai 
    103  1.1   tsubai 	if (strcmp(ca->ca_name, "sc"))
    104  1.1   tsubai 		return 0;
    105  1.1   tsubai 
    106  1.1   tsubai 	return 1;
    107  1.1   tsubai }
    108  1.1   tsubai 
    109  1.1   tsubai void
    110  1.1   tsubai cxd1185_attach(parent, self, aux)
    111  1.1   tsubai 	struct device *parent, *self;
    112  1.1   tsubai 	void *aux;
    113  1.1   tsubai {
    114  1.1   tsubai 	struct sc_softc *sc = (void *)self;
    115  1.1   tsubai 	struct sc_scb *scb;
    116  1.1   tsubai 	int i;
    117  1.1   tsubai 	extern int scsi_1185AQ;
    118  1.1   tsubai 
    119  1.1   tsubai 	if (sc_idenr & 0x08)
    120  1.1   tsubai 		scsi_1185AQ = 1;
    121  1.1   tsubai 
    122  1.1   tsubai 	sc->sc_link.scsipi_scsi.channel = SCSI_CHANNEL_ONLY_ONE;
    123  1.1   tsubai 	sc->sc_link.adapter_softc = sc;
    124  1.1   tsubai 	sc->sc_link.scsipi_scsi.adapter_target = 7;
    125  1.1   tsubai 	sc->sc_link.adapter = &cxd1185_switch;
    126  1.1   tsubai 	sc->sc_link.device = &cxd1185_dev;
    127  1.1   tsubai 	sc->sc_link.openings = 2;
    128  1.1   tsubai 	sc->sc_link.scsipi_scsi.max_target = 7;
    129  1.1   tsubai 	sc->sc_link.type = BUS_SCSI;
    130  1.1   tsubai 
    131  1.1   tsubai 	TAILQ_INIT(&sc->ready_list);
    132  1.1   tsubai 	TAILQ_INIT(&sc->free_list);
    133  1.1   tsubai 
    134  1.1   tsubai 	scb = sc->sc_scb;
    135  1.1   tsubai 	for (i = 0; i < 24; i++) {	/* XXX 24 */
    136  1.1   tsubai 		TAILQ_INSERT_TAIL(&sc->free_list, scb, chain);
    137  1.1   tsubai 		scb++;
    138  1.1   tsubai 	}
    139  1.1   tsubai 
    140  1.1   tsubai 	cxd1185_init(sc);
    141  1.1   tsubai 	DELAY(100000);
    142  1.1   tsubai 
    143  1.1   tsubai 	printf("\n");
    144  1.1   tsubai 	config_found(&sc->sc_dev, &sc->sc_link, scsiprint);
    145  1.1   tsubai }
    146  1.1   tsubai 
    147  1.1   tsubai void
    148  1.1   tsubai cxd1185_init(sc)
    149  1.1   tsubai 	struct sc_softc *sc;
    150  1.1   tsubai {
    151  1.1   tsubai 	int i;
    152  1.1   tsubai 
    153  1.1   tsubai 	for (i = 0; i < 8; i++)
    154  1.1   tsubai 		sc->inuse[i] = 0;
    155  1.1   tsubai 
    156  1.1   tsubai 	scsi_hardreset();
    157  1.1   tsubai }
    158  1.1   tsubai 
    159  1.1   tsubai void
    160  1.1   tsubai free_scb(sc, scb, flags)
    161  1.1   tsubai 	struct sc_softc *sc;
    162  1.1   tsubai 	struct sc_scb *scb;
    163  1.1   tsubai 	int flags;
    164  1.1   tsubai {
    165  1.1   tsubai 	int s;
    166  1.1   tsubai 
    167  1.1   tsubai 	s = splbio();
    168  1.1   tsubai 
    169  1.1   tsubai 	TAILQ_INSERT_HEAD(&sc->free_list, scb, chain);
    170  1.1   tsubai 
    171  1.1   tsubai 	/*
    172  1.1   tsubai 	 * If there were none, wake anybody waiting for one to come free,
    173  1.1   tsubai 	 * starting with queued entries.
    174  1.1   tsubai 	 */
    175  1.1   tsubai 	if (scb->chain.tqe_next == 0)
    176  1.1   tsubai 		wakeup(&sc->free_list);
    177  1.1   tsubai 
    178  1.1   tsubai 	splx(s);
    179  1.1   tsubai }
    180  1.1   tsubai 
    181  1.1   tsubai struct sc_scb *
    182  1.1   tsubai get_scb(sc, flags)
    183  1.1   tsubai 	struct sc_softc *sc;
    184  1.1   tsubai 	int flags;
    185  1.1   tsubai {
    186  1.1   tsubai 	int s;
    187  1.1   tsubai 	struct sc_scb *scb;
    188  1.1   tsubai 
    189  1.1   tsubai 	s = splbio();
    190  1.1   tsubai 
    191  1.1   tsubai 	while ((scb = sc->free_list.tqh_first) == NULL &&
    192  1.1   tsubai 		(flags & SCSI_NOSLEEP) == 0)
    193  1.1   tsubai 		tsleep(&sc->free_list, PRIBIO, "sc_scb", 0);
    194  1.1   tsubai 	if (scb) {
    195  1.1   tsubai 		TAILQ_REMOVE(&sc->free_list, scb, chain);
    196  1.1   tsubai 	}
    197  1.1   tsubai 
    198  1.1   tsubai 	splx(s);
    199  1.1   tsubai 	return scb;
    200  1.1   tsubai }
    201  1.1   tsubai 
    202  1.1   tsubai int
    203  1.1   tsubai sc_scsi_cmd(xs)
    204  1.1   tsubai 	struct scsipi_xfer *xs;
    205  1.1   tsubai {
    206  1.1   tsubai 	struct scsipi_link *sc_link = xs->sc_link;
    207  1.1   tsubai 	struct sc_softc *sc = sc_link->adapter_softc;
    208  1.1   tsubai 	struct sc_scb *scb;
    209  1.1   tsubai 	int flags, s;
    210  1.1   tsubai 	int intr;
    211  1.1   tsubai 	struct sc_data *scdp;
    212  1.1   tsubai 
    213  1.1   tsubai 	flags = xs->flags;
    214  1.1   tsubai 	if ((scb = get_scb(sc, flags)) == NULL)
    215  1.1   tsubai 		return TRY_AGAIN_LATER;
    216  1.1   tsubai 
    217  1.1   tsubai 	scb->xs = xs;
    218  1.1   tsubai 
    219  1.1   tsubai 	s = splbio();
    220  1.1   tsubai 
    221  1.1   tsubai 	TAILQ_INSERT_TAIL(&sc->ready_list, scb, chain);
    222  1.1   tsubai 	sc_sched(sc);
    223  1.1   tsubai 	splx(s);
    224  1.1   tsubai 
    225  1.1   tsubai 	if ((flags & SCSI_POLL) == 0)
    226  1.1   tsubai 		return SUCCESSFULLY_QUEUED;
    227  1.1   tsubai 
    228  1.1   tsubai 	intr = sc_link->scsipi_scsi.target;
    229  1.1   tsubai 
    230  1.1   tsubai 	if (sc_poll(intr, xs->timeout)) {
    231  1.1   tsubai 		printf("sc: timeout (retry)\n");
    232  1.1   tsubai 		if (sc_poll(intr, xs->timeout)) {
    233  1.1   tsubai 			printf("sc: timeout\n");
    234  1.1   tsubai 			return COMPLETE;
    235  1.1   tsubai 		}
    236  1.1   tsubai 	}
    237  1.1   tsubai 
    238  1.1   tsubai 	scdp = &sc_data[intr];
    239  1.1   tsubai 
    240  1.1   tsubai 	/* if (DATAIN_PHASE_FINISHED) */
    241  1.1   tsubai 	MachFlushDCache((vm_offset_t)scdp->scd_scaddr, sizeof (struct scsi));
    242  1.1   tsubai 	if (MACH_IS_USPACE(scdp->scd_vaddr))
    243  1.1   tsubai 		panic("sc_scsi_cmd: user address is not supported");
    244  1.1   tsubai 	else if (MACH_IS_CACHED(scdp->scd_vaddr))
    245  1.1   tsubai 		MachFlushDCache(scdp->scd_vaddr, scdp->scd_count);
    246  1.1   tsubai 	else if (MACH_IS_MAPPED(scdp->scd_vaddr))
    247  1.1   tsubai 		MachFlushCache(); /* Flush all caches */
    248  1.1   tsubai 
    249  1.1   tsubai 	return COMPLETE;
    250  1.1   tsubai }
    251  1.1   tsubai 
    252  1.1   tsubai /*
    253  1.1   tsubai  * Used when interrupt driven I/O isn't allowed, e.g. during boot.
    254  1.1   tsubai  */
    255  1.1   tsubai int
    256  1.1   tsubai sc_poll(intr, count)
    257  1.1   tsubai 	int intr, count;
    258  1.1   tsubai {
    259  1.1   tsubai 	volatile u_char *int_stat = (void *)INTST1;
    260  1.1   tsubai 	volatile u_char *int_clear = (void *)INTCLR1;
    261  1.1   tsubai 
    262  1.1   tsubai 	while (sc_busy(intr)) {
    263  1.1   tsubai 		if (*int_stat & INTST1_DMA) {
    264  1.1   tsubai 		    *int_clear = INTST1_DMA;
    265  1.1   tsubai 		    if (dmac_gstat & CH_INT(CH_SCSI)) {
    266  1.1   tsubai 			if (dmac_gstat & CH_MRQ(CH_SCSI)) {
    267  1.1   tsubai 			    DELAY(50);
    268  1.1   tsubai 			    if (dmac_gstat & CH_MRQ(CH_SCSI))
    269  1.1   tsubai 				printf("dma_poll\n");
    270  1.1   tsubai 			}
    271  1.1   tsubai 			DELAY(10);
    272  1.1   tsubai 			scintr();
    273  1.1   tsubai 		    }
    274  1.1   tsubai 		}
    275  1.1   tsubai 		DELAY(1000);
    276  1.1   tsubai 		count--;
    277  1.1   tsubai 		if (count <= 0)
    278  1.1   tsubai 			return 1;
    279  1.1   tsubai 	}
    280  1.1   tsubai 	return 0;
    281  1.1   tsubai }
    282  1.1   tsubai 
    283  1.1   tsubai void
    284  1.1   tsubai sc_sched(sc)
    285  1.1   tsubai 	struct sc_softc *sc;
    286  1.1   tsubai {
    287  1.1   tsubai 	struct scsipi_xfer *xs;
    288  1.1   tsubai 	struct scsipi_link *sc_link;
    289  1.1   tsubai 	struct scsi *sc_param;
    290  1.1   tsubai 	int ie = 0;
    291  1.1   tsubai 	int flags;
    292  1.1   tsubai 	int chan, lun;
    293  1.1   tsubai 	struct sc_scb *scb, *nextscb;
    294  1.1   tsubai 
    295  1.1   tsubai 	scb = sc->ready_list.tqh_first;
    296  1.1   tsubai start:
    297  1.1   tsubai 
    298  1.1   tsubai 	if (scb == NULL)
    299  1.1   tsubai 		return;
    300  1.1   tsubai 
    301  1.1   tsubai 	xs = scb->xs;
    302  1.1   tsubai 	sc_link = xs->sc_link;
    303  1.1   tsubai 	chan = sc_link->scsipi_scsi.target;
    304  1.1   tsubai 	flags = xs->flags;
    305  1.1   tsubai 
    306  1.1   tsubai 	if (cold)
    307  1.1   tsubai 		flags |= SCSI_POLL;
    308  1.1   tsubai 
    309  1.1   tsubai 	if (sc->inuse[chan]) {
    310  1.1   tsubai 		scb = scb->chain.tqe_next;
    311  1.1   tsubai 		goto start;
    312  1.1   tsubai 	}
    313  1.1   tsubai 	sc->inuse[chan] = 1;
    314  1.1   tsubai 
    315  1.1   tsubai 	if (flags & SCSI_RESET)
    316  1.1   tsubai 		printf("SCSI RESET\n");
    317  1.1   tsubai 
    318  1.1   tsubai 	sc_param = &sc->scsi_xxx[chan];
    319  1.1   tsubai 
    320  1.1   tsubai 	bzero(sc_param, sizeof(struct scsi));
    321  1.1   tsubai 	lun = sc_link->scsipi_scsi.lun;
    322  1.1   tsubai 	sc_param->sc_xs = xs;
    323  1.1   tsubai 	sc_param->sc_identify = MSG_IDENT | sc_disconnect | (lun & IDT_DRMASK);
    324  1.1   tsubai 	sc_param->sc_bytesec = DEV_BSIZE;
    325  1.1   tsubai 	sc_param->sc_lun = lun;
    326  1.1   tsubai 
    327  1.1   tsubai 	sc_param->sc_cpoint = xs->data;
    328  1.1   tsubai 	sc_param->sc_ctrnscnt = xs->datalen;
    329  1.1   tsubai 
    330  1.1   tsubai 	bcopy(xs->cmd, &sc_param->sc_opcode, xs->cmdlen);
    331  1.1   tsubai 
    332  1.1   tsubai 	/* make va->pa mapping table for dma */
    333  1.1   tsubai 	if (xs->datalen > 0) {
    334  1.1   tsubai 		int pages, offset;
    335  1.1   tsubai 		int i, pn;
    336  1.1   tsubai 		u_int va;
    337  1.1   tsubai 
    338  1.1   tsubai 		bzero(&sc->sc_map[chan], sizeof(struct sc_map));
    339  1.1   tsubai 
    340  1.1   tsubai 		va = (u_int)xs->data;
    341  1.1   tsubai 
    342  1.1   tsubai 		offset = va & PGOFSET;
    343  1.1   tsubai 		pages = (offset + xs->datalen + NBPG -1 ) >> PGSHIFT;
    344  1.1   tsubai 		if (pages >= NSCMAP)
    345  1.1   tsubai 			panic("sc_map: Too many pages");
    346  1.1   tsubai 
    347  1.1   tsubai 		for (i = 0; i < pages; i++) {
    348  1.1   tsubai 			pn = kvtophys((vm_offset_t)va) >> PGSHIFT;
    349  1.1   tsubai 			sc->sc_map[chan].mp_addr[i] = pn;
    350  1.1   tsubai 			va += NBPG;
    351  1.1   tsubai 		}
    352  1.1   tsubai 
    353  1.1   tsubai 		sc->sc_map[chan].mp_offset = offset;
    354  1.1   tsubai 		sc->sc_map[chan].mp_pages = pages;
    355  1.1   tsubai 		sc_param->sc_map = &sc->sc_map[chan];
    356  1.1   tsubai 	}
    357  1.1   tsubai 
    358  1.1   tsubai 	if (flags & SCSI_POLL)
    359  1.1   tsubai 		ie &= ~SCSI_INTEN;
    360  1.1   tsubai 	else
    361  1.1   tsubai 		ie |= SCSI_INTEN;
    362  1.1   tsubai 
    363  1.1   tsubai 	timeout(cxd1185_timeout, scb, hz * 10);
    364  1.1   tsubai 
    365  1.1   tsubai 	sc_go(chan, sc_param, ie);
    366  1.1   tsubai 
    367  1.1   tsubai 	untimeout(cxd1185_timeout, scb);
    368  1.1   tsubai 
    369  1.1   tsubai 	nextscb = scb->chain.tqe_next;
    370  1.1   tsubai 
    371  1.1   tsubai 	TAILQ_REMOVE(&sc->ready_list, scb, chain);
    372  1.1   tsubai 	free_scb(sc, scb, flags);
    373  1.1   tsubai 
    374  1.1   tsubai 	scb = nextscb;
    375  1.1   tsubai 
    376  1.1   tsubai 	goto start;
    377  1.1   tsubai }
    378  1.1   tsubai 
    379  1.1   tsubai 
    380  1.1   tsubai void
    381  1.1   tsubai sc_go(chan, sc_param, ie)
    382  1.1   tsubai 	int chan;
    383  1.1   tsubai 	struct scsi *sc_param;
    384  1.1   tsubai 	int ie;
    385  1.1   tsubai {
    386  1.1   tsubai 	register struct sc_data *scdp;
    387  1.1   tsubai 
    388  1.1   tsubai 	scdp = &sc_data[chan];
    389  1.1   tsubai 
    390  1.1   tsubai 	if (sc_param->sc_cpoint)
    391  1.1   tsubai 		scdp->scd_vaddr = (vm_offset_t)sc_param->sc_cpoint;
    392  1.1   tsubai 	else
    393  1.1   tsubai 		scdp->scd_vaddr = (vm_offset_t)sc_param->sc_param;
    394  1.1   tsubai 	scdp->scd_scaddr = sc_param;
    395  1.1   tsubai 	scdp->scd_count = sc_param->sc_ctrnscnt;
    396  1.1   tsubai 	sc_param->sc_cpoint = (u_char *)ipc_phys(scdp->scd_vaddr);
    397  1.1   tsubai 
    398  1.1   tsubai 	sc_send(chan, ie, sc_param);
    399  1.1   tsubai }
    400  1.1   tsubai 
    401  1.1   tsubai /*static*/ void scop_rsense();
    402  1.1   tsubai 
    403  1.1   tsubai void
    404  1.1   tsubai sc_done(sc_param)
    405  1.1   tsubai 	struct scsi *sc_param;
    406  1.1   tsubai {
    407  1.1   tsubai 	struct scsipi_xfer *xs = sc_param->sc_xs;
    408  1.1   tsubai 	struct scsipi_link *sc_link = xs->sc_link;
    409  1.1   tsubai 	struct sc_softc *sc = sc_link->adapter_softc;
    410  1.1   tsubai 
    411  1.1   tsubai 	xs->flags |= ITSDONE;
    412  1.1   tsubai 	xs->resid = 0;
    413  1.1   tsubai 	xs->status = 0;
    414  1.1   tsubai 
    415  1.1   tsubai 	if (sc_param->sc_istatus != INST_EP) {
    416  1.1   tsubai 		if (! cold)
    417  1.1   tsubai 			printf("SC(i): [istatus=0x%x, tstatus=0x%x]\n",
    418  1.1   tsubai 				sc_param->sc_istatus, sc_param->sc_tstatus);
    419  1.1   tsubai 		xs->error = XS_DRIVER_STUFFUP;
    420  1.1   tsubai 	}
    421  1.1   tsubai 
    422  1.1   tsubai 	switch (sc_param->sc_tstatus) {
    423  1.1   tsubai 
    424  1.1   tsubai 	case TGST_GOOD:
    425  1.1   tsubai 		break;
    426  1.1   tsubai 
    427  1.1   tsubai 	case TGST_CC:
    428  1.1   tsubai 		break;		/* XXX */
    429  1.1   tsubai #if 0
    430  1.1   tsubai 		chan = sc_link->scsipi_scsi.target;
    431  1.1   tsubai 		lun = sc_link->scsipi_scsi.lun;
    432  1.1   tsubai 		scop_rsense(chan, sc_param, lun, SCSI_INTDIS, 18, 0);
    433  1.1   tsubai 		if (sc_param->sc_tstatus != TGST_GOOD) {
    434  1.1   tsubai 			printf("SC(t2): [istatus=0x%x, tstatus=0x%x]\n",
    435  1.1   tsubai 				sc_param->sc_istatus, sc_param->sc_tstatus);
    436  1.1   tsubai 		}
    437  1.1   tsubai #endif
    438  1.1   tsubai 
    439  1.1   tsubai 	default:
    440  1.1   tsubai 		printf("SC(t): [istatus=0x%x, tstatus=0x%x]\n",
    441  1.1   tsubai 			sc_param->sc_istatus, sc_param->sc_tstatus);
    442  1.1   tsubai 		break;
    443  1.1   tsubai 	}
    444  1.1   tsubai 
    445  1.1   tsubai 	scsipi_done(xs);
    446  1.1   tsubai 	sc->inuse[sc_link->scsipi_scsi.target] = 0;
    447  1.1   tsubai 
    448  1.1   tsubai 	sc_sched(sc);
    449  1.1   tsubai }
    450  1.1   tsubai 
    451  1.1   tsubai int
    452  1.1   tsubai sc_intr(sc)
    453  1.1   tsubai 	struct sc_softc *sc;
    454  1.1   tsubai {
    455  1.1   tsubai 	return scintr();
    456  1.1   tsubai }
    457  1.1   tsubai 
    458  1.1   tsubai 
    459  1.1   tsubai /*
    460  1.1   tsubai  * SCOP_RSENSE request
    461  1.1   tsubai  */
    462  1.1   tsubai void
    463  1.1   tsubai scop_rsense(intr, sc_param, lun, ie, count, param)
    464  1.1   tsubai 	register int intr;
    465  1.1   tsubai 	register struct scsi *sc_param;
    466  1.1   tsubai 	register int lun;
    467  1.1   tsubai 	register int ie;
    468  1.1   tsubai 	register int count;
    469  1.1   tsubai 	register caddr_t param;
    470  1.1   tsubai {
    471  1.1   tsubai 	bzero(sc_param, sizeof(struct scsi));
    472  1.1   tsubai 	sc_param->sc_identify = MSG_IDENT | sc_disconnect | (lun & IDT_DRMASK);
    473  1.1   tsubai 	sc_param->sc_bytesec = DEV_BSIZE;
    474  1.1   tsubai 	sc_param->sc_lun = lun;
    475  1.1   tsubai 
    476  1.1   tsubai 	sc_param->sc_cpoint = (u_char *)param;
    477  1.1   tsubai 	sc_param->sc_ctrnscnt = count;
    478  1.1   tsubai 
    479  1.1   tsubai 	/* sc_cdb */
    480  1.1   tsubai 	sc_param->sc_opcode = SCOP_RSENSE;
    481  1.1   tsubai 	sc_param->sc_count = count;
    482  1.1   tsubai 
    483  1.1   tsubai 	sc_go(intr, sc_param, ie);
    484  1.1   tsubai }
    485  1.1   tsubai 
    486  1.1   tsubai void
    487  1.1   tsubai cxd1185_timeout(arg)
    488  1.1   tsubai 	void *arg;
    489  1.1   tsubai {
    490  1.1   tsubai 	struct sc_scb *scb = arg;
    491  1.1   tsubai 	struct scsipi_xfer *xs = scb->xs;
    492  1.1   tsubai 	struct scsipi_link *sc_link = xs->sc_link;
    493  1.1   tsubai 	int chan;
    494  1.1   tsubai 
    495  1.1   tsubai 	chan = sc_link->scsipi_scsi.target;
    496  1.1   tsubai 
    497  1.1   tsubai 	printf("sc: timeout ch=%d\n", chan);
    498  1.1   tsubai 
    499  1.1   tsubai 	/* XXX abort transfer and ... */
    500  1.1   tsubai }
    501