⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xt.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
/* * Standalone driver for Xylogics 472 Tape Controller * * @(#)xt.c 1.1 92/07/30 Copyright (c) 1985 by Sun Microsystems, Inc. */#ifndef XTBOOT#ifndef lintstatic	char sccsid[] = "@(#)xt.c 1.1 92/07/30 Copyr 1985 Sun Micro";#endif	lint#endif	XTBOOT#include <mon/cpu.addrs.h>#include <stand/saio.h>#include <sundev/xycreg.h>#include <sundev/xtreg.h>#define NXTADDR	2unsigned long xtaddrs[] = { 0xEE60, 0xEE68 };#define MAXXTREC	(20*1024)	/* max size tape rec allowed */struct xtdma {	struct xtiopb	xtiopb;	char 		xtblock[MAXXTREC];};/* Define resources needed by this driver */struct devinfo xtinfo = {	sizeof(struct xydevice), sizeof (struct xtdma), 0,	NXTADDR, xtaddrs, MAP_MBIO,	MAXXTREC,};int	xtstrategy(), xtopen(), xtclose();extern int	nullsys(), ttboot();struct boottab xtdriver = {	"xt",	nullsys, ttboot, xtopen, xtclose, xtstrategy,	"xt: Xylogics 472 tape",	&xtinfo,};xtopen(sip)	register struct saioreq *sip;{	register skip;	register struct xydevice *xyaddr;	xyaddr = (struct xydevice *) sip->si_devaddr;	/* Verify that xt is really present */	if (peekc((char *)&xyaddr->xy_csr) == -1)		return (-1);	skip = xyaddr->xy_resupd;	/* controller reset */	xtcmd(sip, XT_SEEK, XT_REW);	skip = sip->si_boff;	while (skip--) {		sip->si_cc = 0;		xtcmd(sip, XT_SEEK, XT_FILE);	}	return (0);}/*ARGSUSED*/xtclose(sip)	struct saioreq *sip;{	/*xtcmd(sip, XT_SEEK, XT_REW);*/}xtstrategy(sip, rw)	struct saioreq *sip;	int rw;{	int func = (rw == WRITE) ? XT_WRITE : XT_READ;	return xtcmd(sip, func, 0);}xtcmd(sip, func, subfunc)	register struct saioreq *sip;{	register struct xtiopb *xt = &((struct xtdma *)sip->si_dmaaddr)->xtiopb;	register struct xydevice *xyaddr = (struct xydevice *)sip->si_devaddr;	char *xtbuf = ((struct xtdma *)sip->si_dmaaddr)->xtblock;	int err, t;	/* If user buffer in DVMA space, use it instead of ours */	if (sip->si_ma >= DVMA_BASE) 		xtbuf = sip->si_ma;	bzero((char *)xt, sizeof (struct xtiopb));	xt->xt_reloc = 1;	xt->xt_autoup = 1;	xt->xt_cmd = func;	xt->xt_subfunc = subfunc;	xt->xt_unit = sip->si_unit & 3;	xt->xt_throttle = 5;	/* If destination buffer is in DVMA space, use it directly */	switch (func) {	case XT_READ:		xt->xt_cnt = sip->si_cc;		xt->xt_swab = 1;		xt->xt_retry = 1;		break;	case XT_WRITE:		if (sip->si_ma < DVMA_BASE)			bcopy((char *)sip->si_ma, xtbuf, xt->xt_cnt);		xt->xt_cnt = sip->si_cc;		xt->xt_swab = 1;		xt->xt_retry = 1;		break;	default:		xt->xt_cnt = 1;		break;	}	xt->xt_bufoff = XYOFF(xtbuf);	xt->xt_bufrel = XYREL(xyaddr, xtbuf);	t = XYREL(xyaddr, (char *)xt);	xyaddr->xy_iopbrel[0] = t >> 8;	xyaddr->xy_iopbrel[1] = t;	xyaddr->xy_iopboff[0] = ((int)xt) >> 8;	xyaddr->xy_iopboff[1] = (int)xt;	xyaddr->xy_csr = XY_GO;	do {   		DELAY(30);    } while (xyaddr->xy_csr & XY_BUSY);	err = xt->xt_errno;	if ( err != XTE_DLATE && err != XTE_NOERROR && err != XTE_SHORTREC && 		err != XTE_LONGREC) {		if (err == XTE_EOF || err == XTE_EOT)			return (0);		/* Note: controller does retries for us */		printf("xt: hard err %x\n", err);		return (-1);	}	/* If user buffer not in DVMA space, copy data to it */	if (func == XT_READ  &&  sip->si_ma < DVMA_BASE)		bcopy(xtbuf, (char *)sip->si_ma, xt->xt_acnt);	return (xt->xt_acnt);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -